123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- if (!dojo._hasResource["dijit.form.InlineEditBox"]) { // _hasResource checks
- // added by build. Do
- // not use _hasResource
- // directly in your
- // code.
- dojo._hasResource["dijit.form.InlineEditBox"] = true;
- dojo.provide("dijit.form.InlineEditBox");
- dojo.require("dojo.i18n");
- dojo.require("dijit.form._FormWidget");
- dojo.require("dijit._Container");
- dojo.require("dijit.form.Button");
- dojo.requireLocalization("dijit", "common", null,
- "ko,zh,ja,zh-tw,ru,it,hu,fr,pt,ROOT,pl,es,de,cs");
- dojo
- .deprecated(
- "dijit.form.InlineEditBox is deprecated, use dijit.InlineEditBox instead",
- "", "1.1");
- dojo.declare("dijit.form.InlineEditBox", [dijit.form._FormWidget,
- dijit._Container],
- // summary
- // Wrapper widget to a text edit widget.
- // The text is displayed on the page using normal user-styling.
- // When clicked, the text is hidden, and the edit widget is
- // visible, allowing the text to be updated. Optionally,
- // Save and Cancel button are displayed below the edit widget.
- // When Save is clicked, the text is pulled from the edit
- // widget and redisplayed and the edit widget is again hidden.
- // Currently all textboxes that inherit from dijit.form.TextBox
- // are supported edit widgets.
- // An edit widget must support the following API to be used:
- // String getDisplayedValue() OR String getValue()
- // void setDisplayedValue(String) OR void setValue(String)
- // void focus()
- // It must also be able to initialize with style="display:none;"
- // set.
- {
- templateString : "<span\n\t><fieldset dojoAttachPoint=\"editNode\" style=\"display:none;\" waiRole=\"presentation\"\n\t\t><div dojoAttachPoint=\"containerNode\" dojoAttachEvent=\"onkeypress:_onEditWidgetKeyPress\"></div\n\t\t><div dojoAttachPoint=\"buttonContainer\"\n\t\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\">${buttonSave}</button\n\t\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t\t></div\n\t></fieldset\n\t><span tabIndex=\"0\" dojoAttachPoint=\"textNode,focusNode\" waiRole=\"button\" style=\"display:none;\"\n\t\tdojoAttachEvent=\"onkeypress:_onKeyPress,onclick:_onClick,onmouseout:_onMouseOut,onmouseover:_onMouseOver,onfocus:_onMouseOver,onblur:_onMouseOut\"\n\t></span\n></span>\n",
- // editing: Boolean
- // Is the node currently in edit mode?
- editing : false,
- // autoSave: Boolean
- // Changing the value automatically saves it, don't have to push
- // save button
- autoSave : true,
- // buttonSave: String
- // Save button label
- buttonSave : "",
- // buttonCancel: String
- // Cancel button label
- buttonCancel : "",
- // renderAsHtml: Boolean
- // should text render as HTML(true) or plain text(false)
- renderAsHtml : false,
- widgetsInTemplate : true,
- // _display: String
- // srcNodeRef display style
- _display : "",
- startup : function() {
- // look for the input widget as a child of the containerNode
- if (!this._started) {
- if (this.editWidget) {
- this.containerNode
- .appendChild(this.editWidget.domNode);
- } else {
- this.editWidget = this.getChildren()[0];
- }
- // #3209: copy the style from the source
- // don't copy ALL properties though, just the
- // necessary/applicable ones
- var srcStyle = dojo.getComputedStyle(this.domNode);
- dojo.forEach(["fontWeight", "fontFamily", "fontSize",
- "fontStyle"], function(prop) {
- this.editWidget.focusNode.style[prop] = srcStyle[prop];
- }, this);
- this._setEditValue = dojo.hitch(this.editWidget,
- this.editWidget.setDisplayedValue
- || this.editWidget.setValue);
- this._getEditValue = dojo.hitch(this.editWidget,
- this.editWidget.getDisplayedValue
- || this.editWidget.getValue);
- this._setEditFocus = dojo.hitch(this.editWidget,
- this.editWidget.focus);
- this._isEditValid = dojo.hitch(this.editWidget,
- this.editWidget.isValid || function() {
- return true;
- });
- this.editWidget.onChange = dojo
- .hitch(this, "_onChange");
- if (!this.autoSave) { // take over the setValue method
- // so we can know when the value
- // changes
- this._oldSetValue = this.editWidget.setValue;
- var _this = this;
- this.editWidget.setValue = dojo.hitch(this,
- function(value) {
- _this._oldSetValue.apply(
- _this.editWidget, arguments);
- _this._onEditWidgetKeyPress(null); // check
- // the
- // Save
- // button
- });
- }
- this._showText();
- this._started = true;
- }
- },
- postMixInProperties : function() {
- this._srcTag = this.srcNodeRef.tagName;
- this._srcStyle = dojo.getComputedStyle(this.srcNodeRef);
- // getComputedStyle is not good until after onLoad is called
- var srcNodeStyle = this.srcNodeRef.style;
- this._display = "";
- if (srcNodeStyle && srcNodeStyle.display) {
- this._display = srcNodeStyle.display;
- } else {
- switch (this.srcNodeRef.tagName.toLowerCase()) {
- case 'span' :
- case 'input' :
- case 'img' :
- case 'button' :
- this._display = 'inline';
- break;
- default :
- this._display = 'block';
- break;
- }
- }
- this.inherited('postMixInProperties', arguments);
- this.messages = dojo.i18n.getLocalization("dijit",
- "common", this.lang);
- dojo.forEach(["buttonSave", "buttonCancel"],
- function(prop) {
- if (!this[prop]) {
- this[prop] = this.messages[prop];
- }
- }, this);
- },
- postCreate : function() {
- // don't call setValue yet since the editing widget is not
- // setup
- if (this.autoSave) {
- dojo.style(this.buttonContainer, "display", "none");
- }
- },
- _onKeyPress : function(e) {
- // summary: handle keypress when edit box is not open
- if (this.disabled || e.altKey || e.ctrlKey) {
- return;
- }
- if (e.charCode == dojo.keys.SPACE
- || e.keyCode == dojo.keys.ENTER) {
- dojo.stopEvent(e);
- this._onClick(e);
- }
- },
- _onMouseOver : function() {
- if (!this.editing) {
- var classname = this.disabled
- ? "dijitDisabledClickableRegion"
- : "dijitClickableRegion";
- dojo.addClass(this.textNode, classname);
- }
- },
- _onMouseOut : function() {
- if (!this.editing) {
- var classStr = this.disabled
- ? "dijitDisabledClickableRegion"
- : "dijitClickableRegion";
- dojo.removeClass(this.textNode, classStr);
- }
- },
- _onClick : function(e) {
- // summary
- // When user clicks the text, then start editing.
- // Hide the text and display the form instead.
- if (this.editing || this.disabled) {
- return;
- }
- this._onMouseOut();
- this.editing = true;
- // show the edit form and hide the read only version of the
- // text
- this._setEditValue(this._isEmpty ? '' : (this.renderAsHtml
- ? this.textNode.innerHTML
- : this.textNode.innerHTML.replace(/\s*\r?\n\s*/g,
- "").replace(/<br\/?>/gi, "\n").replace(
- />/g, ">").replace(/</g, "<")
- .replace(/&/g, "&")));
- this._initialText = this._getEditValue();
- this._visualize();
- // Before changing the focus, give the browser time to
- // render.
- setTimeout(dojo.hitch(this, function() {
- this._setEditFocus();
- this.saveButton.setDisabled(true);
- }), 1);
- },
- _visualize : function() {
- dojo.style(this.editNode, "display", this.editing
- ? this._display
- : "none");
- // #3749: try to set focus now to fix missing caret
- // #3997: call right after this.containerNode appears
- if (this.editing) {
- this._setEditFocus();
- }
- dojo.style(this.textNode, "display", this.editing
- ? "none"
- : this._display);
- },
- _showText : function() {
- var value = "" + this._getEditValue(); // "" is to make
- // sure its a string
- dijit.form.InlineEditBox.superclass.setValue.call(this,
- value);
- // whitespace is really hard to click so show a ?
- // TODO: show user defined message in gray
- if (/^\s*$/.test(value)) {
- value = "?";
- this._isEmpty = true;
- } else {
- this._isEmpty = false;
- }
- if (this.renderAsHtml) {
- this.textNode.innerHTML = value;
- } else {
- this.textNode.innerHTML = "";
- if (value.split) {
- var _this = this;
- var isFirst = true;
- dojo.forEach(value.split("\n"), function(line) {
- if (isFirst) {
- isFirst = false;
- } else {
- _this.textNode.appendChild(document
- .createElement("BR")); // preserve
- // line
- // breaks
- }
- _this.textNode.appendChild(document
- .createTextNode(line)); // use
- // text
- // nodes
- // so
- // that
- // imbedded
- // tags
- // can
- // be
- // edited
- });
- } else {
- this.textNode.appendChild(document
- .createTextNode(value));
- }
- }
- this._visualize();
- },
- save : function(e) {
- // summary: Callback when user presses "Save" button or it's
- // simulated.
- // e is passed in if click on save button or user presses
- // Enter. It's not
- // passed in when called by _onBlur.
- if (typeof e == "object") {
- dojo.stopEvent(e);
- }
- if (!this.enableSave()) {
- return;
- }
- this.editing = false;
- this._showText();
- // If save button pressed on non-autoSave widget or Enter
- // pressed on autoSave
- // widget, restore focus to the inline text.
- if (e) {
- dijit.focus(this.focusNode);
- }
- if (this._lastValue != this._lastValueReported) {
- this.onChange(this._lastValue); // tell the world that
- // we have changed
- }
- },
- cancel : function(e) {
- // summary: Callback when user presses "Cancel" button or
- // it's simulated.
- // e is passed in if click on cancel button or user presses
- // Esc. It's not
- // passed in when called by _onBlur.
- if (e) {
- dojo.stopEvent(e);
- }
- this.editing = false;
- this._visualize();
- // If cancel button pressed on non-autoSave widget or Esc
- // pressed on autoSave
- // widget, restore focus to the inline text.
- if (e) {
- dijit.focus(this.focusNode);
- }
- },
- setValue : function(/* String */value) {
- // sets the text without informing the server
- this._setEditValue(value);
- this.editing = false;
- this._showText();
- },
- _onEditWidgetKeyPress : function(e) {
- // summary:
- // Callback when keypress in the edit box (see template).
- // For autoSave widgets, if Esc/Enter, call cancel/save.
- // For non-autoSave widgets, enable save button if the text
- // value is
- // different than the original value.
- if (!this.editing) {
- return;
- }
- if (this.autoSave) {
- // If Enter/Esc pressed, treat as save/cancel.
- if (e.keyCode == dojo.keys.ESCAPE) {
- this.cancel(e);
- } else if (e.keyCode == dojo.keys.ENTER) {
- this.save(e);
- }
- } else {
- var _this = this;
- // Delay before calling _getEditValue.
- // The delay gives the browser a chance to update the
- // textarea.
- setTimeout(function() {
- _this.saveButton
- .setDisabled(_this._getEditValue() == _this._initialText);
- }, 100);
- }
- },
- _onBlur : function() {
- // summary:
- // Called by the focus manager in focus.js when focus moves
- // outside of the
- // InlineEditBox widget (or it's descendants).
- if (this.autoSave && this.editing) {
- if (this._getEditValue() == this._initialText) {
- this.cancel();
- } else {
- this.save();
- }
- }
- },
- enableSave : function() {
- // summary: User replacable function returning a Boolean to
- // indicate
- // if the Save button should be enabled or not - usually due
- // to invalid conditions
- return this._isEditValid();
- },
- _onChange : function() {
- // summary:
- // This is called when the underlying widget fires an
- // onChange event,
- // which means that the user has finished entering the value
- if (!this.editing) {
- this._showText(); // asynchronous update made famous
- // by ComboBox/FilteringSelect
- } else if (this.autoSave) {
- this.save(1);
- } else {
- // #3752
- // if the keypress does not bubble up to the div,
- // (iframe in TextArea blocks it for example)
- // make sure the save button gets enabled
- this.saveButton
- .setDisabled((this._getEditValue() == this._initialText)
- || !this.enableSave());
- }
- },
- setDisabled : function(/* Boolean */disabled) {
- this.saveButton.setDisabled(disabled);
- this.cancelButton.setDisabled(disabled);
- this.textNode.disabled = disabled;
- this.editWidget.setDisabled(disabled);
- this.inherited('setDisabled', arguments);
- }
- });
- }
|