diff options
author | Andrew Dolgov <[email protected]> | 2012-08-14 18:59:10 +0400 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2012-08-14 18:59:18 +0400 |
commit | 1354d17270961fff662d40f90521223f8fd0d73b (patch) | |
tree | e9266be71587e47c800303446e968a6d3565e2cf /lib/dijit/form | |
parent | d04f8c826f5283765f52cf6b98b42a1ed8f2d6bc (diff) |
update dojo to 1.7.3
Diffstat (limited to 'lib/dijit/form')
303 files changed, 9270 insertions, 7016 deletions
diff --git a/lib/dijit/form/Button.js b/lib/dijit/form/Button.js index 77846776f..a0db441a4 100644 --- a/lib/dijit/form/Button.js +++ b/lib/dijit/form/Button.js @@ -1,360 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.Button"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Button"] = true; -dojo.provide("dijit.form.Button"); -dojo.require("dijit.form._FormWidget"); -dojo.require("dijit._Container"); -dojo.require("dijit._HasDropDown"); - - -dojo.declare("dijit.form.Button", - dijit.form._FormWidget, - { - // summary: - // Basically the same thing as a normal HTML button, but with special styling. - // description: - // Buttons can display a label, an icon, or both. - // A label should always be specified (through innerHTML) or the label - // attribute. It can be hidden via showLabel=false. - // example: - // | <button dojoType="dijit.form.Button" onClick="...">Hello world</button> - // - // example: - // | var button1 = new dijit.form.Button({label: "hello world", onClick: foo}); - // | dojo.body().appendChild(button1.domNode); - - // label: HTML String - // Text to display in button. - // If the label is hidden (showLabel=false) then and no title has - // been specified, then label is also set as title attribute of icon. - label: "", - - // showLabel: Boolean - // Set this to true to hide the label text and display only the icon. - // (If showLabel=false then iconClass must be specified.) - // Especially useful for toolbars. - // If showLabel=true, the label will become the title (a.k.a. tooltip/hint) of the icon. - // - // The exception case is for computers in high-contrast mode, where the label - // will still be displayed, since the icon doesn't appear. - showLabel: true, - - // iconClass: String - // Class to apply to DOMNode in button to make it display an icon - iconClass: "", - - // type: String - // Defines the type of button. "button", "submit", or "reset". - type: "button", - - baseClass: "dijitButton", - - templateString: dojo.cache("dijit.form", "templates/Button.html", "<span class=\"dijit dijitReset dijitInline\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">●</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdojoAttachPoint=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"), - - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - value: "valueNode" - }), - - _onClick: function(/*Event*/ e){ - // summary: - // Internal function to handle click actions - if(this.disabled){ - return false; - } - this._clicked(); // widget click actions - return this.onClick(e); // user click actions - }, - - _onButtonClick: function(/*Event*/ e){ - // summary: - // Handler when the user activates the button portion. - if(this._onClick(e) === false){ // returning nothing is same as true - e.preventDefault(); // needed for checkbox - }else if(this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a nonform widget needs to be signalled - for(var node=this.domNode; node.parentNode/*#5935*/; node=node.parentNode){ - var widget=dijit.byNode(node); - if(widget && typeof widget._onSubmit == "function"){ - widget._onSubmit(e); - break; - } - } - }else if(this.valueNode){ - this.valueNode.click(); - e.preventDefault(); // cancel BUTTON click and continue with hidden INPUT click - } - }, - - buildRendering: function(){ - this.inherited(arguments); - dojo.setSelectable(this.focusNode, false); - }, - - _fillContent: function(/*DomNode*/ source){ - // Overrides _Templated._fillContent(). - // If button label is specified as srcNodeRef.innerHTML rather than - // this.params.label, handle it here. - // TODO: remove the method in 2.0, parser will do it all for me - if(source && (!this.params || !("label" in this.params))){ - this.set('label', source.innerHTML); - } - }, - - _setShowLabelAttr: function(val){ - if(this.containerNode){ - dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val); - } - this._set("showLabel", val); - }, - - onClick: function(/*Event*/ e){ - // summary: - // Callback for when button is clicked. - // If type="submit", return true to perform submit, or false to cancel it. - // type: - // callback - return true; // Boolean - }, - - _clicked: function(/*Event*/ e){ - // summary: - // Internal overridable function for when the button is clicked - }, - - setLabel: function(/*String*/ content){ - // summary: - // Deprecated. Use set('label', ...) instead. - dojo.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0"); - this.set("label", content); - }, - - _setLabelAttr: function(/*String*/ content){ - // summary: - // Hook for set('label', ...) to work. - // description: - // Set the label (text) of the button; takes an HTML string. - this._set("label", content); - this.containerNode.innerHTML = content; - if(this.showLabel == false && !this.params.title){ - this.titleNode.title = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || ''); - } - }, - - _setIconClassAttr: function(/*String*/ val){ - // Custom method so that icon node is hidden when not in use, to avoid excess padding/margin - // appearing around it (even if it's a 0x0 sized <img> node) - - var oldVal = this.iconClass || "dijitNoIcon", - newVal = val || "dijitNoIcon"; - dojo.replaceClass(this.iconNode, newVal, oldVal); - this._set("iconClass", val); - } -}); - - -dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, dijit._HasDropDown], { - // summary: - // A button with a drop down - // - // example: - // | <button dojoType="dijit.form.DropDownButton" label="Hello world"> - // | <div dojotype="dijit.Menu">...</div> - // | </button> - // - // example: - // | var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) }); - // | dojo.body().appendChild(button1); - // - - baseClass : "dijitDropDownButton", - - templateString: dojo.cache("dijit.form", "templates/DropDownButton.html", "<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\" dojoAttachPoint=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdojoAttachPoint=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdojoAttachPoint=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">▼</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"), - - _fillContent: function(){ - // Overrides Button._fillContent(). - // - // My inner HTML contains both the button contents and a drop down widget, like - // <DropDownButton> <span>push me</span> <Menu> ... </Menu> </DropDownButton> - // The first node is assumed to be the button content. The widget is the popup. - - if(this.srcNodeRef){ // programatically created buttons might not define srcNodeRef - //FIXME: figure out how to filter out the widget and use all remaining nodes as button - // content, not just nodes[0] - var nodes = dojo.query("*", this.srcNodeRef); - dijit.form.DropDownButton.superclass._fillContent.call(this, nodes[0]); - - // save pointer to srcNode so we can grab the drop down widget after it's instantiated - this.dropDownContainer = this.srcNodeRef; - } - }, - - startup: function(){ - if(this._started){ return; } - - // the child widget from srcNodeRef is the dropdown widget. Insert it in the page DOM, - // make it invisible, and store a reference to pass to the popup code. - if(!this.dropDown && this.dropDownContainer){ - var dropDownNode = dojo.query("[widgetId]", this.dropDownContainer)[0]; - this.dropDown = dijit.byNode(dropDownNode); - delete this.dropDownContainer; - } - if(this.dropDown){ - dijit.popup.hide(this.dropDown); - } - - this.inherited(arguments); - }, - - isLoaded: function(){ - // Returns whether or not we are loaded - if our dropdown has an href, - // then we want to check that. - var dropDown = this.dropDown; - return (!!dropDown && (!dropDown.href || dropDown.isLoaded)); - }, - - loadDropDown: function(){ - // Loads our dropdown - var dropDown = this.dropDown; - if(!dropDown){ return; } - if(!this.isLoaded()){ - var handler = dojo.connect(dropDown, "onLoad", this, function(){ - dojo.disconnect(handler); - this.openDropDown(); - }); - dropDown.refresh(); - }else{ - this.openDropDown(); - } - }, - - isFocusable: function(){ - // Overridden so that focus is handled by the _HasDropDown mixin, not by - // the _FormWidget mixin. - return this.inherited(arguments) && !this._mouseDown; - } -}); - -dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, { - // summary: - // A combination button and drop-down button. - // Users can click one side to "press" the button, or click an arrow - // icon to display the drop down. - // - // example: - // | <button dojoType="dijit.form.ComboButton" onClick="..."> - // | <span>Hello world</span> - // | <div dojoType="dijit.Menu">...</div> - // | </button> - // - // example: - // | var button1 = new dijit.form.ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"}); - // | dojo.body().appendChild(button1.domNode); - // - - templateString: dojo.cache("dijit.form", "templates/ComboButton.html", "<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" dojoAttachPoint=\"buttonNode\" dojoAttachEvent=\"ondijitclick:_onButtonClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdojoAttachPoint=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdojoAttachEvent=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" dojoAttachPoint=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"), - - attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), { - id: "", - tabIndex: ["focusNode", "titleNode"], - title: "titleNode" - }), - - // optionsTitle: String - // Text that describes the options menu (accessibility) - optionsTitle: "", - - baseClass: "dijitComboButton", - - // Set classes like dijitButtonContentsHover or dijitArrowButtonActive depending on - // mouse action over specified node - cssStateNodes: { - "buttonNode": "dijitButtonNode", - "titleNode": "dijitButtonContents", - "_popupStateNode": "dijitDownArrowButton" - }, - - _focusedNode: null, - - _onButtonKeyPress: function(/*Event*/ evt){ - // summary: - // Handler for right arrow key when focus is on left part of button - if(evt.charOrCode == dojo.keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){ - dijit.focus(this._popupStateNode); - dojo.stopEvent(evt); - } - }, - - _onArrowKeyPress: function(/*Event*/ evt){ - // summary: - // Handler for left arrow key when focus is on right part of button - if(evt.charOrCode == dojo.keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){ - dijit.focus(this.titleNode); - dojo.stopEvent(evt); - } - }, - - focus: function(/*String*/ position){ - // summary: - // Focuses this widget to according to position, if specified, - // otherwise on arrow node - // position: - // "start" or "end" - if(!this.disabled){ - dijit.focus(position == "start" ? this.titleNode : this._popupStateNode); - } - } -}); - -dojo.declare("dijit.form.ToggleButton", dijit.form.Button, { - // summary: - // A button that can be in two states (checked or not). - // Can be base class for things like tabs or checkbox or radio buttons - - baseClass: "dijitToggleButton", - - // checked: Boolean - // Corresponds to the native HTML <input> element's attribute. - // In markup, specified as "checked='checked'" or just "checked". - // True if the button is depressed, or the checkbox is checked, - // or the radio button is selected, etc. - checked: false, - - attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), { - checked:"focusNode" - }), - - _clicked: function(/*Event*/ evt){ - this.set('checked', !this.checked); - }, - - _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){ - this._set("checked", value); - dojo.attr(this.focusNode || this.domNode, "checked", value); - dijit.setWaiState(this.focusNode || this.domNode, "pressed", value); - this._handleOnChange(value, priorityChange); - }, - - setChecked: function(/*Boolean*/ checked){ - // summary: - // Deprecated. Use set('checked', true/false) instead. - dojo.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0"); - this.set('checked', checked); - }, - - reset: function(){ - // summary: - // Reset the widget's value to what it was at initialization time - - this._hasBeenBlurred = false; - - // set checked state to original setting - this.set('checked', this.params.checked || false); - } -}); - -} +//>>built +require({cache:{"url:dijit/form/templates/Button.html":"<span class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" role=\"presentation\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">●</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\"\n\t\ttabIndex=\"-1\" role=\"presentation\" data-dojo-attach-point=\"valueNode\"\n/></span>\n"}});define("dijit/form/Button",["require","dojo/_base/declare","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/ready","./_FormWidget","./_ButtonMixin","dojo/text!./templates/Button.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){if(!_4.isAsync){_6(0,function(){var _a=["dijit/form/DropDownButton","dijit/form/ComboButton","dijit/form/ToggleButton"];_1(_a);});}return _2("dijit.form.Button",[_7,_8],{showLabel:true,iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitButton",templateString:_9,_setValueAttr:"valueNode",_onClick:function(e){var ok=this.inherited(arguments);if(ok){if(this.valueNode){this.valueNode.click();e.preventDefault();}}return ok;},_fillContent:function(_b){if(_b&&(!this.params||!("label" in this.params))){var _c=_5.trim(_b.innerHTML);if(_c){this.label=_c;}}},_setShowLabelAttr:function(_d){if(this.containerNode){_3.toggle(this.containerNode,"dijitDisplayNone",!_d);}this._set("showLabel",_d);},setLabel:function(_e){_4.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_e);},_setLabelAttr:function(_f){this.inherited(arguments);if(!this.showLabel&&!("title" in this.params)){this.titleNode.title=_5.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});});
\ No newline at end of file diff --git a/lib/dijit/form/Button.js.uncompressed.js b/lib/dijit/form/Button.js.uncompressed.js new file mode 100644 index 000000000..6236c81c3 --- /dev/null +++ b/lib/dijit/form/Button.js.uncompressed.js @@ -0,0 +1,126 @@ +require({cache:{ +'url:dijit/form/templates/Button.html':"<span class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" role=\"presentation\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">●</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\"\n\t\ttabIndex=\"-1\" role=\"presentation\" data-dojo-attach-point=\"valueNode\"\n/></span>\n"}}); +define("dijit/form/Button", [ + "require", + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.toggle + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/lang", // lang.trim + "dojo/ready", + "./_FormWidget", + "./_ButtonMixin", + "dojo/text!./templates/Button.html" +], function(require, declare, domClass, kernel, lang, ready, _FormWidget, _ButtonMixin, template){ + +/*===== + var _FormWidget = dijit.form._FormWidget; + var _ButtonMixin = dijit.form._ButtonMixin; +=====*/ + +// module: +// dijit/form/Button +// summary: +// Button widget + +// Back compat w/1.6, remove for 2.0 +if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/form/DropDownButton", "dijit/form/ComboButton", "dijit/form/ToggleButton"]; + require(requires); // use indirection so modules not rolled into a build + }); +} + +return declare("dijit.form.Button", [_FormWidget, _ButtonMixin], { + // summary: + // Basically the same thing as a normal HTML button, but with special styling. + // description: + // Buttons can display a label, an icon, or both. + // A label should always be specified (through innerHTML) or the label + // attribute. It can be hidden via showLabel=false. + // example: + // | <button data-dojo-type="dijit.form.Button" onClick="...">Hello world</button> + // + // example: + // | var button1 = new dijit.form.Button({label: "hello world", onClick: foo}); + // | dojo.body().appendChild(button1.domNode); + + // showLabel: Boolean + // Set this to true to hide the label text and display only the icon. + // (If showLabel=false then iconClass must be specified.) + // Especially useful for toolbars. + // If showLabel=true, the label will become the title (a.k.a. tooltip/hint) of the icon. + // + // The exception case is for computers in high-contrast mode, where the label + // will still be displayed, since the icon doesn't appear. + showLabel: true, + + // iconClass: String + // Class to apply to DOMNode in button to make it display an icon + iconClass: "dijitNoIcon", + _setIconClassAttr: { node: "iconNode", type: "class" }, + + baseClass: "dijitButton", + + templateString: template, + + // Map widget attributes to DOMNode attributes. + _setValueAttr: "valueNode", + + _onClick: function(/*Event*/ e){ + // summary: + // Internal function to handle click actions + var ok = this.inherited(arguments); + if(ok){ + if(this.valueNode){ + this.valueNode.click(); + e.preventDefault(); // cancel BUTTON click and continue with hidden INPUT click + // leave ok = true so that subclasses can do what they need to do + } + } + return ok; + }, + + _fillContent: function(/*DomNode*/ source){ + // Overrides _Templated._fillContent(). + // If button label is specified as srcNodeRef.innerHTML rather than + // this.params.label, handle it here. + // TODO: remove the method in 2.0, parser will do it all for me + if(source && (!this.params || !("label" in this.params))){ + var sourceLabel = lang.trim(source.innerHTML); + if(sourceLabel){ + this.label = sourceLabel; // _applyAttributes will be called after buildRendering completes to update the DOM + } + } + }, + + _setShowLabelAttr: function(val){ + if(this.containerNode){ + domClass.toggle(this.containerNode, "dijitDisplayNone", !val); + } + this._set("showLabel", val); + }, + + setLabel: function(/*String*/ content){ + // summary: + // Deprecated. Use set('label', ...) instead. + kernel.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0"); + this.set("label", content); + }, + + _setLabelAttr: function(/*String*/ content){ + // summary: + // Hook for set('label', ...) to work. + // description: + // Set the label (text) of the button; takes an HTML string. + // If the label is hidden (showLabel=false) then and no title has + // been specified, then label is also set as title attribute of icon. + this.inherited(arguments); + if(!this.showLabel && !("title" in this.params)){ + this.titleNode.title = lang.trim(this.containerNode.innerText || this.containerNode.textContent || ''); + } + } +}); + + +}); + diff --git a/lib/dijit/form/CheckBox.js b/lib/dijit/form/CheckBox.js index 939f6e8bb..1d0bcceaf 100644 --- a/lib/dijit/form/CheckBox.js +++ b/lib/dijit/form/CheckBox.js @@ -1,204 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.CheckBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.CheckBox"] = true; -dojo.provide("dijit.form.CheckBox"); -dojo.require("dijit.form.ToggleButton"); - - -dojo.declare( - "dijit.form.CheckBox", - dijit.form.ToggleButton, - { - // summary: - // Same as an HTML checkbox, but with fancy styling. - // - // description: - // User interacts with real html inputs. - // On onclick (which occurs by mouse click, space-bar, or - // using the arrow keys to switch the selected radio button), - // we update the state of the checkbox/radio. - // - // There are two modes: - // 1. High contrast mode - // 2. Normal mode - // - // In case 1, the regular html inputs are shown and used by the user. - // In case 2, the regular html inputs are invisible but still used by - // the user. They are turned quasi-invisible and overlay the background-image. - - templateString: dojo.cache("dijit.form", "templates/CheckBox.html", "<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onclick:_onClick\"\n/></div>\n"), - - baseClass: "dijitCheckBox", - - // type: [private] String - // type attribute on <input> node. - // Overrides `dijit.form.Button.type`. Users should not change this value. - type: "checkbox", - - // value: String - // As an initialization parameter, equivalent to value field on normal checkbox - // (if checked, the value is passed as the value when form is submitted). - // - // However, get('value') will return either the string or false depending on - // whether or not the checkbox is checked. - // - // set('value', string) will check the checkbox and change the value to the - // specified string - // - // set('value', boolean) will change the checked state. - value: "on", - - // readOnly: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "readOnly". - // Similar to disabled except readOnly form values are submitted. - readOnly: false, - - // the attributeMap should inherit from dijit.form._FormWidget.prototype.attributeMap - // instead of ToggleButton as the icon mapping has no meaning for a CheckBox - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - readOnly: "focusNode" - }), - - _setReadOnlyAttr: function(/*Boolean*/ value){ - this._set("readOnly", value); - dojo.attr(this.focusNode, 'readOnly', value); - dijit.setWaiState(this.focusNode, "readonly", value); - }, - - _setValueAttr: function(/*String|Boolean*/ newValue, /*Boolean*/ priorityChange){ - // summary: - // Handler for value= attribute to constructor, and also calls to - // set('value', val). - // description: - // During initialization, just saves as attribute to the <input type=checkbox>. - // - // After initialization, - // when passed a boolean, controls whether or not the CheckBox is checked. - // If passed a string, changes the value attribute of the CheckBox (the one - // specified as "value" when the CheckBox was constructed (ex: <input - // dojoType="dijit.CheckBox" value="chicken">) - if(typeof newValue == "string"){ - this._set("value", newValue); - dojo.attr(this.focusNode, 'value', newValue); - newValue = true; - } - if(this._created){ - this.set('checked', newValue, priorityChange); - } - }, - _getValueAttr: function(){ - // summary: - // Hook so get('value') works. - // description: - // If the CheckBox is checked, returns the value attribute. - // Otherwise returns false. - return (this.checked ? this.value : false); - }, - - // Override dijit.form.Button._setLabelAttr() since we don't even have a containerNode. - // Normally users won't try to set label, except when CheckBox or RadioButton is the child of a dojox.layout.TabContainer - _setLabelAttr: undefined, - - postMixInProperties: function(){ - if(this.value == ""){ - this.value = "on"; - } - - // Need to set initial checked state as part of template, so that form submit works. - // dojo.attr(node, "checked", bool) doesn't work on IEuntil node has been attached - // to <body>, see #8666 - this.checkedAttrSetting = this.checked ? "checked" : ""; - - this.inherited(arguments); - }, - - _fillContent: function(/*DomNode*/ source){ - // Override Button::_fillContent() since it doesn't make sense for CheckBox, - // since CheckBox doesn't even have a container - }, - - reset: function(){ - // Override ToggleButton.reset() - - this._hasBeenBlurred = false; - - this.set('checked', this.params.checked || false); - - // Handle unlikely event that the <input type=checkbox> value attribute has changed - this._set("value", this.params.value || "on"); - dojo.attr(this.focusNode, 'value', this.value); - }, - - _onFocus: function(){ - if(this.id){ - dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel"); - } - this.inherited(arguments); - }, - - _onBlur: function(){ - if(this.id){ - dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel"); - } - this.inherited(arguments); - }, - - _onClick: function(/*Event*/ e){ - // summary: - // Internal function to handle click actions - need to check - // readOnly, since button no longer does that check. - if(this.readOnly){ - dojo.stopEvent(e); - return false; - } - return this.inherited(arguments); - } - } -); - -dojo.declare( - "dijit.form.RadioButton", - dijit.form.CheckBox, - { - // summary: - // Same as an HTML radio, but with fancy styling. - - type: "radio", - baseClass: "dijitRadio", - - _setCheckedAttr: function(/*Boolean*/ value){ - // If I am being checked then have to deselect currently checked radio button - this.inherited(arguments); - if(!this._created){ return; } - if(value){ - var _this = this; - // search for radio buttons with the same name that need to be unchecked - dojo.query("INPUT[type=radio]", this.focusNode.form || dojo.doc).forEach( // can't use name= since dojo.query doesn't support [] in the name - function(inputNode){ - if(inputNode.name == _this.name && inputNode != _this.focusNode && inputNode.form == _this.focusNode.form){ - var widget = dijit.getEnclosingWidget(inputNode); - if(widget && widget.checked){ - widget.set('checked', false); - } - } - } - ); - } - }, - - _clicked: function(/*Event*/ e){ - if(!this.checked){ - this.set('checked', true); - } - } - } -); - -} +//>>built +require({cache:{"url:dijit/form/templates/CheckBox.html":"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n"}});define("dijit/form/CheckBox",["require","dojo/_base/declare","dojo/dom-attr","dojo/_base/kernel","dojo/query","dojo/ready","./ToggleButton","./_CheckBoxMixin","dojo/text!./templates/CheckBox.html","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){if(!_4.isAsync){_6(0,function(){var _a=["dijit/form/RadioButton"];_1(_a);});}return _2("dijit.form.CheckBox",[_7,_8],{templateString:_9,baseClass:"dijitCheckBox",_setValueAttr:function(_b,_c){if(typeof _b=="string"){this._set("value",_b);_3.set(this.focusNode,"value",_b);_b=true;}if(this._created){this.set("checked",_b,_c);}},_getValueAttr:function(){return (this.checked?this.value:false);},_setIconClassAttr:null,postMixInProperties:function(){this.inherited(arguments);this.checkedAttrSetting=this.checked?"checked":"";},_fillContent:function(){},_onFocus:function(){if(this.id){_5("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}this.inherited(arguments);},_onBlur:function(){if(this.id){_5("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/CheckBox.js.uncompressed.js b/lib/dijit/form/CheckBox.js.uncompressed.js new file mode 100644 index 000000000..4663e1e69 --- /dev/null +++ b/lib/dijit/form/CheckBox.js.uncompressed.js @@ -0,0 +1,120 @@ +require({cache:{ +'url:dijit/form/templates/CheckBox.html':"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n"}}); +define("dijit/form/CheckBox", [ + "require", + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/_base/kernel", + "dojo/query", // query + "dojo/ready", + "./ToggleButton", + "./_CheckBoxMixin", + "dojo/text!./templates/CheckBox.html", + "dojo/NodeList-dom" // NodeList.addClass/removeClass +], function(require, declare, domAttr, kernel, query, ready, ToggleButton, _CheckBoxMixin, template){ + +/*===== + var ToggleButton = dijit.form.ToggleButton; + var _CheckBoxMixin = dijit.form._CheckBoxMixin; +=====*/ + + // module: + // dijit/form/CheckBox + // summary: + // Checkbox widget + + // Back compat w/1.6, remove for 2.0 + if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/form/RadioButton"]; + require(requires); // use indirection so modules not rolled into a build + }); + } + + return declare("dijit.form.CheckBox", [ToggleButton, _CheckBoxMixin], { + // summary: + // Same as an HTML checkbox, but with fancy styling. + // + // description: + // User interacts with real html inputs. + // On onclick (which occurs by mouse click, space-bar, or + // using the arrow keys to switch the selected radio button), + // we update the state of the checkbox/radio. + // + // There are two modes: + // 1. High contrast mode + // 2. Normal mode + // + // In case 1, the regular html inputs are shown and used by the user. + // In case 2, the regular html inputs are invisible but still used by + // the user. They are turned quasi-invisible and overlay the background-image. + + templateString: template, + + baseClass: "dijitCheckBox", + + _setValueAttr: function(/*String|Boolean*/ newValue, /*Boolean*/ priorityChange){ + // summary: + // Handler for value= attribute to constructor, and also calls to + // set('value', val). + // description: + // During initialization, just saves as attribute to the <input type=checkbox>. + // + // After initialization, + // when passed a boolean, controls whether or not the CheckBox is checked. + // If passed a string, changes the value attribute of the CheckBox (the one + // specified as "value" when the CheckBox was constructed (ex: <input + // data-dojo-type="dijit.CheckBox" value="chicken">) + // widget.set('value', string) will check the checkbox and change the value to the + // specified string + // widget.set('value', boolean) will change the checked state. + if(typeof newValue == "string"){ + this._set("value", newValue); + domAttr.set(this.focusNode, 'value', newValue); + newValue = true; + } + if(this._created){ + this.set('checked', newValue, priorityChange); + } + }, + _getValueAttr: function(){ + // summary: + // Hook so get('value') works. + // description: + // If the CheckBox is checked, returns the value attribute. + // Otherwise returns false. + return (this.checked ? this.value : false); + }, + + // Override behavior from Button, since we don't have an iconNode + _setIconClassAttr: null, + + postMixInProperties: function(){ + this.inherited(arguments); + + // Need to set initial checked state as part of template, so that form submit works. + // domAttr.set(node, "checked", bool) doesn't work on IE until node has been attached + // to <body>, see #8666 + this.checkedAttrSetting = this.checked ? "checked" : ""; + }, + + _fillContent: function(){ + // Override Button::_fillContent() since it doesn't make sense for CheckBox, + // since CheckBox doesn't even have a container + }, + + _onFocus: function(){ + if(this.id){ + query("label[for='"+this.id+"']").addClass("dijitFocusedLabel"); + } + this.inherited(arguments); + }, + + _onBlur: function(){ + if(this.id){ + query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel"); + } + this.inherited(arguments); + } + }); +}); diff --git a/lib/dijit/form/ComboBox.js b/lib/dijit/form/ComboBox.js index aecc5c4fc..2c46468c2 100644 --- a/lib/dijit/form/ComboBox.js +++ b/lib/dijit/form/ComboBox.js @@ -1,1231 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.ComboBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ComboBox"] = true; -dojo.provide("dijit.form.ComboBox"); -dojo.require("dojo.window"); -dojo.require("dojo.regexp"); -dojo.require("dojo.data.util.simpleFetch"); -dojo.require("dojo.data.util.filter"); -dojo.require("dijit._CssStateMixin"); -dojo.require("dijit.form._FormWidget"); -dojo.require("dijit.form.ValidationTextBox"); -dojo.require("dijit._HasDropDown"); -dojo.requireLocalization("dijit.form", "ComboBox", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw"); - - -dojo.declare( - "dijit.form.ComboBoxMixin", - dijit._HasDropDown, - { - // summary: - // Implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect` - // description: - // All widgets that mix in dijit.form.ComboBoxMixin must extend `dijit.form._FormValueWidget`. - // tags: - // protected - - // item: Object - // This is the item returned by the dojo.data.store implementation that - // provides the data for this ComboBox, it's the currently selected item. - item: null, - - // pageSize: Integer - // Argument to data provider. - // Specifies number of search results per page (before hitting "next" button) - pageSize: Infinity, - - // store: [const] Object - // Reference to data provider object used by this ComboBox - store: null, - - // fetchProperties: Object - // Mixin to the dojo.data store's fetch. - // For example, to set the sort order of the ComboBox menu, pass: - // | { sort: [{attribute:"name",descending: true}] } - // To override the default queryOptions so that deep=false, do: - // | { queryOptions: {ignoreCase: true, deep: false} } - fetchProperties:{}, - - // query: Object - // A query that can be passed to 'store' to initially filter the items, - // before doing further filtering based on `searchAttr` and the key. - // Any reference to the `searchAttr` is ignored. - query: {}, - - // autoComplete: Boolean - // If user types in a partial string, and then tab out of the `<input>` box, - // automatically copy the first entry displayed in the drop down list to - // the `<input>` field - autoComplete: true, - - // highlightMatch: String - // One of: "first", "all" or "none". - // - // If the ComboBox/FilteringSelect opens with the search results and the searched - // string can be found, it will be highlighted. If set to "all" - // then will probably want to change `queryExpr` parameter to '*${0}*' - // - // Highlighting is only performed when `labelType` is "text", so as to not - // interfere with any HTML markup an HTML label might contain. - highlightMatch: "first", - - // searchDelay: Integer - // Delay in milliseconds between when user types something and we start - // searching based on that value - searchDelay: 100, - - // searchAttr: String - // Search for items in the data store where this attribute (in the item) - // matches what the user typed - searchAttr: "name", - - // labelAttr: String? - // The entries in the drop down list come from this attribute in the - // dojo.data items. - // If not specified, the searchAttr attribute is used instead. - labelAttr: "", - - // labelType: String - // Specifies how to interpret the labelAttr in the data store items. - // Can be "html" or "text". - labelType: "text", - - // queryExpr: String - // This specifies what query ComboBox/FilteringSelect sends to the data store, - // based on what the user has typed. Changing this expression will modify - // whether the drop down shows only exact matches, a "starting with" match, - // etc. Use it in conjunction with highlightMatch. - // dojo.data query expression pattern. - // `${0}` will be substituted for the user text. - // `*` is used for wildcards. - // `${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is" - queryExpr: "${0}*", - - // ignoreCase: Boolean - // Set true if the ComboBox/FilteringSelect should ignore case when matching possible items - ignoreCase: true, - - // hasDownArrow: Boolean - // Set this textbox to have a down arrow button, to display the drop down list. - // Defaults to true. - hasDownArrow: true, - - templateString: dojo.cache("dijit.form", "templates/DropDownBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"), - - baseClass: "dijitTextBox dijitComboBox", - - // dropDownClass: [protected extension] String - // Name of the dropdown widget class used to select a date/time. - // Subclasses should specify this. - dropDownClass: "dijit.form._ComboBoxMenu", - - // Set classes like dijitDownArrowButtonHover depending on - // mouse action over button node - cssStateNodes: { - "_buttonNode": "dijitDownArrowButton" - }, - - // Flags to _HasDropDown to limit height of drop down to make it fit in viewport - maxHeight: -1, - - // For backwards compatibility let onClick events propagate, even clicks on the down arrow button - _stopClickEvents: false, - - _getCaretPos: function(/*DomNode*/ element){ - // khtml 3.5.2 has selection* methods as does webkit nightlies from 2005-06-22 - var pos = 0; - if(typeof(element.selectionStart) == "number"){ - // FIXME: this is totally borked on Moz < 1.3. Any recourse? - pos = element.selectionStart; - }else if(dojo.isIE){ - // in the case of a mouse click in a popup being handled, - // then the dojo.doc.selection is not the textarea, but the popup - // var r = dojo.doc.selection.createRange(); - // hack to get IE 6 to play nice. What a POS browser. - var tr = dojo.doc.selection.createRange().duplicate(); - var ntr = element.createTextRange(); - tr.move("character",0); - ntr.move("character",0); - try{ - // If control doesn't have focus, you get an exception. - // Seems to happen on reverse-tab, but can also happen on tab (seems to be a race condition - only happens sometimes). - // There appears to be no workaround for this - googled for quite a while. - ntr.setEndPoint("EndToEnd", tr); - pos = String(ntr.text).replace(/\r/g,"").length; - }catch(e){ - // If focus has shifted, 0 is fine for caret pos. - } - } - return pos; - }, - - _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){ - location = parseInt(location); - dijit.selectInputText(element, location, location); - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - // Additional code to set disabled state of ComboBox node. - // Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr(). - this.inherited(arguments); - dijit.setWaiState(this.domNode, "disabled", value); - }, - - _abortQuery: function(){ - // stop in-progress query - if(this.searchTimer){ - clearTimeout(this.searchTimer); - this.searchTimer = null; - } - if(this._fetchHandle){ - if(this._fetchHandle.abort){ this._fetchHandle.abort(); } - this._fetchHandle = null; - } - }, - - _onInput: function(/*Event*/ evt){ - // summary: - // Handles paste events - if(!this.searchTimer && (evt.type == 'paste'/*IE|WebKit*/ || evt.type == 'input'/*Firefox*/) && this._lastInput != this.textbox.value){ - this.searchTimer = setTimeout(dojo.hitch(this, function(){ - this._onKey({charOrCode: 229}); // fake IME key to cause a search - }), 100); // long delay that will probably be preempted by keyboard input - } - this.inherited(arguments); - }, - - _onKey: function(/*Event*/ evt){ - // summary: - // Handles keyboard events - - var key = evt.charOrCode; - - // except for cutting/pasting case - ctrl + x/v - if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == dojo.keys.SHIFT){ - return; // throw out weird key combinations and spurious events - } - - var doSearch = false; - var pw = this.dropDown; - var dk = dojo.keys; - var highlighted = null; - this._prev_key_backspace = false; - this._abortQuery(); - - // _HasDropDown will do some of the work: - // 1. when drop down is not yet shown: - // - if user presses the down arrow key, call loadDropDown() - // 2. when drop down is already displayed: - // - on ESC key, call closeDropDown() - // - otherwise, call dropDown.handleKey() to process the keystroke - this.inherited(arguments); - - if(this._opened){ - highlighted = pw.getHighlightedOption(); - } - switch(key){ - case dk.PAGE_DOWN: - case dk.DOWN_ARROW: - case dk.PAGE_UP: - case dk.UP_ARROW: - // Keystroke caused ComboBox_menu to move to a different item. - // Copy new item to <input> box. - if(this._opened){ - this._announceOption(highlighted); - } - dojo.stopEvent(evt); - break; - - case dk.ENTER: - // prevent submitting form if user presses enter. Also - // prevent accepting the value if either Next or Previous - // are selected - if(highlighted){ - // only stop event on prev/next - if(highlighted == pw.nextButton){ - this._nextSearch(1); - dojo.stopEvent(evt); - break; - }else if(highlighted == pw.previousButton){ - this._nextSearch(-1); - dojo.stopEvent(evt); - break; - } - }else{ - // Update 'value' (ex: KY) according to currently displayed text - this._setBlurValue(); // set value if needed - this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting - } - // default case: - // if enter pressed while drop down is open, or for FilteringSelect, - // if we are in the middle of a query to convert a directly typed in value to an item, - // prevent submit, but allow event to bubble - if(this._opened || this._fetchHandle){ - evt.preventDefault(); - } - // fall through - - case dk.TAB: - var newvalue = this.get('displayedValue'); - // if the user had More Choices selected fall into the - // _onBlur handler - if(pw && ( - newvalue == pw._messages["previousMessage"] || - newvalue == pw._messages["nextMessage"]) - ){ - break; - } - if(highlighted){ - this._selectOption(); - } - if(this._opened){ - this._lastQuery = null; // in case results come back later - this.closeDropDown(); - } - break; - - case ' ': - if(highlighted){ - // user is effectively clicking a choice in the drop down menu - dojo.stopEvent(evt); - this._selectOption(); - this.closeDropDown(); - }else{ - // user typed a space into the input box, treat as normal character - doSearch = true; - } - break; - - case dk.DELETE: - case dk.BACKSPACE: - this._prev_key_backspace = true; - doSearch = true; - break; - - default: - // Non char keys (F1-F12 etc..) shouldn't open list. - // Ascii characters and IME input (Chinese, Japanese etc.) should. - //IME input produces keycode == 229. - doSearch = typeof key == 'string' || key == 229; - } - if(doSearch){ - // need to wait a tad before start search so that the event - // bubbles through DOM and we have value visible - this.item = undefined; // undefined means item needs to be set - this.searchTimer = setTimeout(dojo.hitch(this, "_startSearchFromInput"),1); - } - }, - - _autoCompleteText: function(/*String*/ text){ - // summary: - // Fill in the textbox with the first item from the drop down - // list, and highlight the characters that were - // auto-completed. For example, if user typed "CA" and the - // drop down list appeared, the textbox would be changed to - // "California" and "ifornia" would be highlighted. - - var fn = this.focusNode; - - // IE7: clear selection so next highlight works all the time - dijit.selectInputText(fn, fn.value.length); - // does text autoComplete the value in the textbox? - var caseFilter = this.ignoreCase? 'toLowerCase' : 'substr'; - if(text[caseFilter](0).indexOf(this.focusNode.value[caseFilter](0)) == 0){ - var cpos = this._getCaretPos(fn); - // only try to extend if we added the last character at the end of the input - if((cpos+1) > fn.value.length){ - // only add to input node as we would overwrite Capitalisation of chars - // actually, that is ok - fn.value = text;//.substr(cpos); - // visually highlight the autocompleted characters - dijit.selectInputText(fn, cpos); - } - }else{ - // text does not autoComplete; replace the whole value and highlight - fn.value = text; - dijit.selectInputText(fn); - } - }, - - _openResultList: function(/*Object*/ results, /*Object*/ dataObject){ - // summary: - // Callback when a search completes. - // description: - // 1. generates drop-down list and calls _showResultList() to display it - // 2. if this result list is from user pressing "more choices"/"previous choices" - // then tell screen reader to announce new option - this._fetchHandle = null; - if( this.disabled || - this.readOnly || - (dataObject.query[this.searchAttr] != this._lastQuery) - ){ - return; - } - var wasSelected = this.dropDown._highlighted_option && dojo.hasClass(this.dropDown._highlighted_option, "dijitMenuItemSelected"); - this.dropDown.clearResultList(); - if(!results.length && !this._maxOptions){ // if no results and not just the previous choices button - this.closeDropDown(); - return; - } - - // Fill in the textbox with the first item from the drop down list, - // and highlight the characters that were auto-completed. For - // example, if user typed "CA" and the drop down list appeared, the - // textbox would be changed to "California" and "ifornia" would be - // highlighted. - - dataObject._maxOptions = this._maxOptions; - var nodes = this.dropDown.createOptions( - results, - dataObject, - dojo.hitch(this, "_getMenuLabelFromItem") - ); - - // show our list (only if we have content, else nothing) - this._showResultList(); - - // #4091: - // tell the screen reader that the paging callback finished by - // shouting the next choice - if(dataObject.direction){ - if(1 == dataObject.direction){ - this.dropDown.highlightFirstOption(); - }else if(-1 == dataObject.direction){ - this.dropDown.highlightLastOption(); - } - if(wasSelected){ - this._announceOption(this.dropDown.getHighlightedOption()); - } - }else if(this.autoComplete && !this._prev_key_backspace - // when the user clicks the arrow button to show the full list, - // startSearch looks for "*". - // it does not make sense to autocomplete - // if they are just previewing the options available. - && !/^[*]+$/.test(dataObject.query[this.searchAttr])){ - this._announceOption(nodes[1]); // 1st real item - } - }, - - _showResultList: function(){ - // summary: - // Display the drop down if not already displayed, or if it is displayed, then - // reposition it if necessary (reposition may be necessary if drop down's height changed). - - this.closeDropDown(true); - - // hide the tooltip - this.displayMessage(""); - - this.openDropDown(); - - dijit.setWaiState(this.domNode, "expanded", "true"); - }, - - loadDropDown: function(/*Function*/ callback){ - // Overrides _HasDropDown.loadDropDown(). - // This is called when user has pressed button icon or pressed the down arrow key - // to open the drop down. - - this._startSearchAll(); - }, - - isLoaded: function(){ - // signal to _HasDropDown that it needs to call loadDropDown() to load the - // drop down asynchronously before displaying it - return false; - }, - - closeDropDown: function(){ - // Overrides _HasDropDown.closeDropDown(). Closes the drop down (assuming that it's open). - // This method is the callback when the user types ESC or clicking - // the button icon while the drop down is open. It's also called by other code. - this._abortQuery(); - if(this._opened){ - this.inherited(arguments); - dijit.setWaiState(this.domNode, "expanded", "false"); - dijit.removeWaiState(this.focusNode,"activedescendant"); - } - }, - - _setBlurValue: function(){ - // if the user clicks away from the textbox OR tabs away, set the - // value to the textbox value - // #4617: - // if value is now more choices or previous choices, revert - // the value - var newvalue = this.get('displayedValue'); - var pw = this.dropDown; - if(pw && ( - newvalue == pw._messages["previousMessage"] || - newvalue == pw._messages["nextMessage"] - ) - ){ - this._setValueAttr(this._lastValueReported, true); - }else if(typeof this.item == "undefined"){ - // Update 'value' (ex: KY) according to currently displayed text - this.item = null; - this.set('displayedValue', newvalue); - }else{ - if(this.value != this._lastValueReported){ - dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); - } - this._refreshState(); - } - }, - - _onBlur: function(){ - // summary: - // Called magically when focus has shifted away from this widget and it's drop down - this.closeDropDown(); - this.inherited(arguments); - }, - - _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ - // summary: - // Set the displayed valued in the input box, and the hidden value - // that gets submitted, based on a dojo.data store item. - // description: - // Users shouldn't call this function; they should be calling - // set('item', value) - // tags: - // private - if(!displayedValue){ - displayedValue = this.store.getValue(item, this.searchAttr); - } - var value = this._getValueField() != this.searchAttr? this.store.getIdentity(item) : displayedValue; - this._set("item", item); - dijit.form.ComboBox.superclass._setValueAttr.call(this, value, priorityChange, displayedValue); - }, - - _announceOption: function(/*Node*/ node){ - // summary: - // a11y code that puts the highlighted option in the textbox. - // This way screen readers will know what is happening in the - // menu. - - if(!node){ - return; - } - // pull the text value from the item attached to the DOM node - var newValue; - if(node == this.dropDown.nextButton || - node == this.dropDown.previousButton){ - newValue = node.innerHTML; - this.item = undefined; - this.value = ''; - }else{ - newValue = this.store.getValue(node.item, this.searchAttr).toString(); - this.set('item', node.item, false, newValue); - } - // get the text that the user manually entered (cut off autocompleted text) - this.focusNode.value = this.focusNode.value.substring(0, this._lastInput.length); - // set up ARIA activedescendant - dijit.setWaiState(this.focusNode, "activedescendant", dojo.attr(node, "id")); - // autocomplete the rest of the option to announce change - this._autoCompleteText(newValue); - }, - - _selectOption: function(/*Event*/ evt){ - // summary: - // Menu callback function, called when an item in the menu is selected. - if(evt){ - this._announceOption(evt.target); - } - this.closeDropDown(); - this._setCaretPos(this.focusNode, this.focusNode.value.length); - dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); // set this.value and fire onChange - }, - - _startSearchAll: function(){ - this._startSearch(''); - }, - - _startSearchFromInput: function(){ - this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1")); - }, - - _getQueryString: function(/*String*/ text){ - return dojo.string.substitute(this.queryExpr, [text]); - }, - - _startSearch: function(/*String*/ key){ - // summary: - // Starts a search for elements matching key (key=="" means to return all items), - // and calls _openResultList() when the search completes, to display the results. - if(!this.dropDown){ - var popupId = this.id + "_popup", - dropDownConstructor = dojo.getObject(this.dropDownClass, false); - this.dropDown = new dropDownConstructor({ - onChange: dojo.hitch(this, this._selectOption), - id: popupId, - dir: this.dir - }); - dijit.removeWaiState(this.focusNode,"activedescendant"); - dijit.setWaiState(this.textbox,"owns",popupId); // associate popup with textbox - } - // create a new query to prevent accidentally querying for a hidden - // value from FilteringSelect's keyField - var query = dojo.clone(this.query); // #5970 - this._lastInput = key; // Store exactly what was entered by the user. - this._lastQuery = query[this.searchAttr] = this._getQueryString(key); - // #5970: set _lastQuery, *then* start the timeout - // otherwise, if the user types and the last query returns before the timeout, - // _lastQuery won't be set and their input gets rewritten - this.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){ - this.searchTimer = null; - var fetch = { - queryOptions: { - ignoreCase: this.ignoreCase, - deep: true - }, - query: query, - onBegin: dojo.hitch(this, "_setMaxOptions"), - onComplete: dojo.hitch(this, "_openResultList"), - onError: function(errText){ - _this._fetchHandle = null; - console.error('dijit.form.ComboBox: ' + errText); - _this.closeDropDown(); - }, - start: 0, - count: this.pageSize - }; - dojo.mixin(fetch, _this.fetchProperties); - this._fetchHandle = _this.store.fetch(fetch); - - var nextSearch = function(dataObject, direction){ - dataObject.start += dataObject.count*direction; - // #4091: - // tell callback the direction of the paging so the screen - // reader knows which menu option to shout - dataObject.direction = direction; - this._fetchHandle = this.store.fetch(dataObject); - this.focus(); - }; - this._nextSearch = this.dropDown.onPage = dojo.hitch(this, nextSearch, this._fetchHandle); - }, query, this), this.searchDelay); - }, - - _setMaxOptions: function(size, request){ - this._maxOptions = size; - }, - - _getValueField: function(){ - // summary: - // Helper for postMixInProperties() to set this.value based on data inlined into the markup. - // Returns the attribute name in the item (in dijit.form._ComboBoxDataStore) to use as the value. - return this.searchAttr; - }, - - //////////// INITIALIZATION METHODS /////////////////////////////////////// - - constructor: function(){ - this.query={}; - this.fetchProperties={}; - }, - - postMixInProperties: function(){ - if(!this.store){ - var srcNodeRef = this.srcNodeRef; - - // if user didn't specify store, then assume there are option tags - this.store = new dijit.form._ComboBoxDataStore(srcNodeRef); - - // if there is no value set and there is an option list, set - // the value to the first value to be consistent with native - // Select - - // Firefox and Safari set value - // IE6 and Opera set selectedIndex, which is automatically set - // by the selected attribute of an option tag - // IE6 does not set value, Opera sets value = selectedIndex - if(!("value" in this.params)){ - var item = (this.item = this.store.fetchSelectedItem()); - if(item){ - var valueField = this._getValueField(); - this.value = this.store.getValue(item, valueField); - } - } - } - - this.inherited(arguments); - }, - - postCreate: function(){ - // summary: - // Subclasses must call this method from their postCreate() methods - // tags: - // protected - - // find any associated label element and add to ComboBox node. - var label=dojo.query('label[for="'+this.id+'"]'); - if(label.length){ - label[0].id = (this.id+"_label"); - dijit.setWaiState(this.domNode, "labelledby", label[0].id); - - } - this.inherited(arguments); - }, - - _setHasDownArrowAttr: function(val){ - this.hasDownArrow = val; - this._buttonNode.style.display = val ? "" : "none"; - }, - - _getMenuLabelFromItem: function(/*Item*/ item){ - var label = this.labelFunc(item, this.store), - labelType = this.labelType; - // If labelType is not "text" we don't want to screw any markup ot whatever. - if(this.highlightMatch != "none" && this.labelType == "text" && this._lastInput){ - label = this.doHighlight(label, this._escapeHtml(this._lastInput)); - labelType = "html"; - } - return {html: labelType == "html", label: label}; - }, - - doHighlight: function(/*String*/ label, /*String*/ find){ - // summary: - // Highlights the string entered by the user in the menu. By default this - // highlights the first occurrence found. Override this method - // to implement your custom highlighting. - // tags: - // protected - - var - // Add (g)lobal modifier when this.highlightMatch == "all" and (i)gnorecase when this.ignoreCase == true - modifiers = (this.ignoreCase ? "i" : "") + (this.highlightMatch == "all" ? "g" : ""), - i = this.queryExpr.indexOf("${0}"); - find = dojo.regexp.escapeString(find); // escape regexp special chars - return this._escapeHtml(label).replace( - // prepend ^ when this.queryExpr == "${0}*" and append $ when this.queryExpr == "*${0}" - new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers), - '<span class="dijitComboBoxHighlightMatch">$1</span>' - ); // returns String, (almost) valid HTML (entities encoded) - }, - - _escapeHtml: function(/*String*/ str){ - // TODO Should become dojo.html.entities(), when exists use instead - // summary: - // Adds escape sequences for special characters in XML: &<>"' - str = String(str).replace(/&/gm, "&").replace(/</gm, "<") - .replace(/>/gm, ">").replace(/"/gm, """); - return str; // string - }, - - reset: function(){ - // Overrides the _FormWidget.reset(). - // Additionally reset the .item (to clean up). - this.item = null; - this.inherited(arguments); - }, - - labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){ - // summary: - // Computes the label to display based on the dojo.data store item. - // returns: - // The label that the ComboBox should display - // tags: - // private - - // Use toString() because XMLStore returns an XMLItem whereas this - // method is expected to return a String (#9354) - return store.getValue(item, this.labelAttr || this.searchAttr).toString(); // String - } - } -); - -dojo.declare( - "dijit.form._ComboBoxMenu", - [dijit._Widget, dijit._Templated, dijit._CssStateMixin], - { - // summary: - // Focus-less menu for internal use in `dijit.form.ComboBox` - // tags: - // private - - templateString: "<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' style='overflow: \"auto\"; overflow-x: \"hidden\";'>" - +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' role='option'></li>" - +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' role='option'></li>" - +"</ul>", - - // _messages: Object - // Holds "next" and "previous" text for paging buttons on drop down - _messages: null, - - baseClass: "dijitComboBoxMenu", - - postMixInProperties: function(){ - this.inherited(arguments); - this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // fill in template with i18n messages - this.previousButton.innerHTML = this._messages["previousMessage"]; - this.nextButton.innerHTML = this._messages["nextMessage"]; - }, - - _setValueAttr: function(/*Object*/ value){ - this.value = value; - this.onChange(value); - }, - - // stubs - onChange: function(/*Object*/ value){ - // summary: - // Notifies ComboBox/FilteringSelect that user clicked an option in the drop down menu. - // Probably should be called onSelect. - // tags: - // callback - }, - onPage: function(/*Number*/ direction){ - // summary: - // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page. - // tags: - // callback - }, - - onClose: function(){ - // summary: - // Callback from dijit.popup code to this widget, notifying it that it closed - // tags: - // private - this._blurOptionNode(); - }, - - _createOption: function(/*Object*/ item, labelFunc){ - // summary: - // Creates an option to appear on the popup menu subclassed by - // `dijit.form.FilteringSelect`. - - var menuitem = dojo.create("li", { - "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"), - role: "option" - }); - var labelObject = labelFunc(item); - if(labelObject.html){ - menuitem.innerHTML = labelObject.label; - }else{ - menuitem.appendChild( - dojo.doc.createTextNode(labelObject.label) - ); - } - // #3250: in blank options, assign a normal height - if(menuitem.innerHTML == ""){ - menuitem.innerHTML = " "; - } - menuitem.item=item; - return menuitem; - }, - - createOptions: function(results, dataObject, labelFunc){ - // summary: - // Fills in the items in the drop down list - // results: - // Array of dojo.data items - // dataObject: - // dojo.data store - // labelFunc: - // Function to produce a label in the drop down list from a dojo.data item - - //this._dataObject=dataObject; - //this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList); - // display "Previous . . ." button - this.previousButton.style.display = (dataObject.start == 0) ? "none" : ""; - dojo.attr(this.previousButton, "id", this.id + "_prev"); - // create options using _createOption function defined by parent - // ComboBox (or FilteringSelect) class - // #2309: - // iterate over cache nondestructively - dojo.forEach(results, function(item, i){ - var menuitem = this._createOption(item, labelFunc); - dojo.attr(menuitem, "id", this.id + i); - this.domNode.insertBefore(menuitem, this.nextButton); - }, this); - // display "Next . . ." button - var displayMore = false; - //Try to determine if we should show 'more'... - if(dataObject._maxOptions && dataObject._maxOptions != -1){ - if((dataObject.start + dataObject.count) < dataObject._maxOptions){ - displayMore = true; - }else if((dataObject.start + dataObject.count) > dataObject._maxOptions && dataObject.count == results.length){ - //Weird return from a datastore, where a start + count > maxOptions - // implies maxOptions isn't really valid and we have to go into faking it. - //And more or less assume more if count == results.length - displayMore = true; - } - }else if(dataObject.count == results.length){ - //Don't know the size, so we do the best we can based off count alone. - //So, if we have an exact match to count, assume more. - displayMore = true; - } - - this.nextButton.style.display = displayMore ? "" : "none"; - dojo.attr(this.nextButton,"id", this.id + "_next"); - return this.domNode.childNodes; - }, - - clearResultList: function(){ - // summary: - // Clears the entries in the drop down list, but of course keeps the previous and next buttons. - while(this.domNode.childNodes.length>2){ - this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]); - } - this._blurOptionNode(); - }, - - _onMouseDown: function(/*Event*/ evt){ - dojo.stopEvent(evt); - }, - - _onMouseUp: function(/*Event*/ evt){ - if(evt.target === this.domNode || !this._highlighted_option){ - // !this._highlighted_option check to prevent immediate selection when menu appears on top - // of <input>, see #9898. Note that _HasDropDown also has code to prevent this. - return; - }else if(evt.target == this.previousButton){ - this._blurOptionNode(); - this.onPage(-1); - }else if(evt.target == this.nextButton){ - this._blurOptionNode(); - this.onPage(1); - }else{ - var tgt = evt.target; - // while the clicked node is inside the div - while(!tgt.item){ - // recurse to the top - tgt = tgt.parentNode; - } - this._setValueAttr({ target: tgt }, true); - } - }, - - _onMouseOver: function(/*Event*/ evt){ - if(evt.target === this.domNode){ return; } - var tgt = evt.target; - if(!(tgt == this.previousButton || tgt == this.nextButton)){ - // while the clicked node is inside the div - while(!tgt.item){ - // recurse to the top - tgt = tgt.parentNode; - } - } - this._focusOptionNode(tgt); - }, - - _onMouseOut: function(/*Event*/ evt){ - if(evt.target === this.domNode){ return; } - this._blurOptionNode(); - }, - - _focusOptionNode: function(/*DomNode*/ node){ - // summary: - // Does the actual highlight. - if(this._highlighted_option != node){ - this._blurOptionNode(); - this._highlighted_option = node; - dojo.addClass(this._highlighted_option, "dijitMenuItemSelected"); - } - }, - - _blurOptionNode: function(){ - // summary: - // Removes highlight on highlighted option. - if(this._highlighted_option){ - dojo.removeClass(this._highlighted_option, "dijitMenuItemSelected"); - this._highlighted_option = null; - } - }, - - _highlightNextOption: function(){ - // summary: - // Highlight the item just below the current selection. - // If nothing selected, highlight first option. - - // because each press of a button clears the menu, - // the highlighted option sometimes becomes detached from the menu! - // test to see if the option has a parent to see if this is the case. - if(!this.getHighlightedOption()){ - var fc = this.domNode.firstChild; - this._focusOptionNode(fc.style.display == "none" ? fc.nextSibling : fc); - }else{ - var ns = this._highlighted_option.nextSibling; - if(ns && ns.style.display != "none"){ - this._focusOptionNode(ns); - }else{ - this.highlightFirstOption(); - } - } - // scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover - dojo.window.scrollIntoView(this._highlighted_option); - }, - - highlightFirstOption: function(){ - // summary: - // Highlight the first real item in the list (not Previous Choices). - var first = this.domNode.firstChild; - var second = first.nextSibling; - this._focusOptionNode(second.style.display == "none" ? first : second); // remotely possible that Previous Choices is the only thing in the list - dojo.window.scrollIntoView(this._highlighted_option); - }, - - highlightLastOption: function(){ - // summary: - // Highlight the last real item in the list (not More Choices). - this._focusOptionNode(this.domNode.lastChild.previousSibling); - dojo.window.scrollIntoView(this._highlighted_option); - }, - - _highlightPrevOption: function(){ - // summary: - // Highlight the item just above the current selection. - // If nothing selected, highlight last option (if - // you select Previous and try to keep scrolling up the list). - if(!this.getHighlightedOption()){ - var lc = this.domNode.lastChild; - this._focusOptionNode(lc.style.display == "none" ? lc.previousSibling : lc); - }else{ - var ps = this._highlighted_option.previousSibling; - if(ps && ps.style.display != "none"){ - this._focusOptionNode(ps); - }else{ - this.highlightLastOption(); - } - } - dojo.window.scrollIntoView(this._highlighted_option); - }, - - _page: function(/*Boolean*/ up){ - // summary: - // Handles page-up and page-down keypresses - - var scrollamount = 0; - var oldscroll = this.domNode.scrollTop; - var height = dojo.style(this.domNode, "height"); - // if no item is highlighted, highlight the first option - if(!this.getHighlightedOption()){ - this._highlightNextOption(); - } - while(scrollamount<height){ - if(up){ - // stop at option 1 - if(!this.getHighlightedOption().previousSibling || - this._highlighted_option.previousSibling.style.display == "none"){ - break; - } - this._highlightPrevOption(); - }else{ - // stop at last option - if(!this.getHighlightedOption().nextSibling || - this._highlighted_option.nextSibling.style.display == "none"){ - break; - } - this._highlightNextOption(); - } - // going backwards - var newscroll=this.domNode.scrollTop; - scrollamount+=(newscroll-oldscroll)*(up ? -1:1); - oldscroll=newscroll; - } - }, - - pageUp: function(){ - // summary: - // Handles pageup keypress. - // TODO: just call _page directly from handleKey(). - // tags: - // private - this._page(true); - }, - - pageDown: function(){ - // summary: - // Handles pagedown keypress. - // TODO: just call _page directly from handleKey(). - // tags: - // private - this._page(false); - }, - - getHighlightedOption: function(){ - // summary: - // Returns the highlighted option. - var ho = this._highlighted_option; - return (ho && ho.parentNode) ? ho : null; - }, - - handleKey: function(evt){ - // summary: - // Handle keystroke event forwarded from ComboBox, returning false if it's - // a keystroke I recognize and process, true otherwise. - switch(evt.charOrCode){ - case dojo.keys.DOWN_ARROW: - this._highlightNextOption(); - return false; - case dojo.keys.PAGE_DOWN: - this.pageDown(); - return false; - case dojo.keys.UP_ARROW: - this._highlightPrevOption(); - return false; - case dojo.keys.PAGE_UP: - this.pageUp(); - return false; - default: - return true; - } - } - } -); - -dojo.declare( - "dijit.form.ComboBox", - [dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin], - { - // summary: - // Auto-completing text box, and base class for dijit.form.FilteringSelect. - // - // description: - // The drop down box's values are populated from an class called - // a data provider, which returns a list of values based on the characters - // that the user has typed into the input box. - // If OPTION tags are used as the data provider via markup, - // then the OPTION tag's child text node is used as the widget value - // when selected. The OPTION tag's value attribute is ignored. - // To set the default value when using OPTION tags, specify the selected - // attribute on 1 of the child OPTION tags. - // - // Some of the options to the ComboBox are actually arguments to the data - // provider. - - _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the select. - this._set("item", null); // value not looked up in store - if(!value){ value = ''; } // null translates to blank - dijit.form.ValidationTextBox.prototype._setValueAttr.call(this, value, priorityChange, displayedValue); - } - } -); - -dojo.declare("dijit.form._ComboBoxDataStore", null, { - // summary: - // Inefficient but small data store specialized for inlined `dijit.form.ComboBox` data - // - // description: - // Provides a store for inlined data like: - // - // | <select> - // | <option value="AL">Alabama</option> - // | ... - // - // Actually. just implements the subset of dojo.data.Read/Notification - // needed for ComboBox and FilteringSelect to work. - // - // Note that an item is just a pointer to the <option> DomNode. - - constructor: function( /*DomNode*/ root){ - this.root = root; - if(root.tagName != "SELECT" && root.firstChild){ - root = dojo.query("select", root); - if(root.length > 0){ // SELECT is a child of srcNodeRef - root = root[0]; - }else{ // no select, so create 1 to parent the option tags to define selectedIndex - this.root.innerHTML = "<SELECT>"+this.root.innerHTML+"</SELECT>"; - root = this.root.firstChild; - } - this.root = root; - } - dojo.query("> option", root).forEach(function(node){ - // TODO: this was added in #3858 but unclear why/if it's needed; doesn't seem to be. - // If it is needed then can we just hide the select itself instead? - //node.style.display="none"; - node.innerHTML = dojo.trim(node.innerHTML); - }); - - }, - - getValue: function( /*item*/ item, - /*attribute-name-string*/ attribute, - /*value?*/ defaultValue){ - return (attribute == "value") ? item.value : (item.innerText || item.textContent || ''); - }, - - isItemLoaded: function(/*anything*/ something){ - return true; - }, - - getFeatures: function(){ - return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true}; - }, - - _fetchItems: function( /*Object*/ args, - /*Function*/ findCallback, - /*Function*/ errorCallback){ - // summary: - // See dojo.data.util.simpleFetch.fetch() - if(!args.query){ args.query = {}; } - if(!args.query.name){ args.query.name = ""; } - if(!args.queryOptions){ args.queryOptions = {}; } - var matcher = dojo.data.util.filter.patternToRegExp(args.query.name, args.queryOptions.ignoreCase), - items = dojo.query("> option", this.root).filter(function(option){ - return (option.innerText || option.textContent || '').match(matcher); - } ); - if(args.sort){ - items.sort(dojo.data.util.sorter.createSortFunction(args.sort, this)); - } - findCallback(items, args); - }, - - close: function(/*dojo.data.api.Request || args || null*/ request){ - return; - }, - - getLabel: function(/*item*/ item){ - return item.innerHTML; - }, - - getIdentity: function(/*item*/ item){ - return dojo.attr(item, "value"); - }, - - fetchItemByIdentity: function(/*Object*/ args){ - // summary: - // Given the identity of an item, this method returns the item that has - // that identity through the onItem callback. - // Refer to dojo.data.api.Identity.fetchItemByIdentity() for more details. - // - // description: - // Given arguments like: - // - // | {identity: "CA", onItem: function(item){...} - // - // Call `onItem()` with the DOM node `<option value="CA">California</option>` - var item = dojo.query("> option[value='" + args.identity + "']", this.root)[0]; - args.onItem(item); - }, - - fetchSelectedItem: function(){ - // summary: - // Get the option marked as selected, like `<option selected>`. - // Not part of dojo.data API. - var root = this.root, - si = root.selectedIndex; - return typeof si == "number" - ? dojo.query("> option:nth-child(" + (si != -1 ? si+1 : 1) + ")", root)[0] - : null; // dojo.data.Item - } -}); -//Mix in the simple fetch implementation to this class. -dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch); - -} +//>>built +define("dijit/form/ComboBox",["dojo/_base/declare","./ValidationTextBox","./ComboBoxMixin"],function(_1,_2,_3){return _1("dijit.form.ComboBox",[_2,_3],{});});
\ No newline at end of file diff --git a/lib/dijit/form/ComboBox.js.uncompressed.js b/lib/dijit/form/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..a72f24797 --- /dev/null +++ b/lib/dijit/form/ComboBox.js.uncompressed.js @@ -0,0 +1,34 @@ +define("dijit/form/ComboBox", [ + "dojo/_base/declare", // declare + "./ValidationTextBox", + "./ComboBoxMixin" +], function(declare, ValidationTextBox, ComboBoxMixin){ + +/*===== + var ValidationTextBox = dijit.form.ValidationTextBox; + var ComboBoxMixin = dijit.form.ComboBoxMixin; +=====*/ + + // module: + // dijit/form/ComboBox + // summary: + // Auto-completing text box + + return declare("dijit.form.ComboBox", [ValidationTextBox, ComboBoxMixin], { + // summary: + // Auto-completing text box + // + // description: + // The drop down box's values are populated from an class called + // a data provider, which returns a list of values based on the characters + // that the user has typed into the input box. + // If OPTION tags are used as the data provider via markup, + // then the OPTION tag's child text node is used as the widget value + // when selected. The OPTION tag's value attribute is ignored. + // To set the default value when using OPTION tags, specify the selected + // attribute on 1 of the child OPTION tags. + // + // Some of the options to the ComboBox are actually arguments to the data + // provider. + }); +}); diff --git a/lib/dijit/form/ComboBoxMixin.js b/lib/dijit/form/ComboBoxMixin.js new file mode 100644 index 000000000..99f0efa04 --- /dev/null +++ b/lib/dijit/form/ComboBoxMixin.js @@ -0,0 +1,2 @@ +//>>built +require({cache:{"url:dijit/form/templates/DropDownBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});define("dijit/form/ComboBoxMixin",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/kernel","dojo/_base/lang","dojo/store/util/QueryResults","./_AutoCompleterMixin","./_ComboBoxMenu","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.ComboBoxMixin",[_8,_6],{dropDownClass:_7,hasDownArrow:true,templateString:_9,baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},_setHasDownArrowAttr:function(_a){this._set("hasDownArrow",_a);this._buttonNode.style.display=_a?"":"none";},_showResultList:function(){this.displayMessage("");this.inherited(arguments);},_setStoreAttr:function(_b){if(!_b.get){_4.mixin(_b,{_oldAPI:true,get:function(id){var _c=new _2();this.fetchItemByIdentity({identity:id,onItem:function(_d){_c.resolve(_d);},onError:function(_e){_c.reject(_e);}});return _c.promise;},query:function(_f,_10){var _11=new _2(function(){_12.abort&&_12.abort();});var _12=this.fetch(_4.mixin({query:_f,onBegin:function(_13){_11.total=_13;},onComplete:function(_14){_11.resolve(_14);},onError:function(_15){_11.reject(_15);}},_10));return _5(_11);}});}this._set("store",_b);},postMixInProperties:function(){if(this.params.store){this._setStoreAttr(this.params.store);}this.inherited(arguments);if(!this.params.store){var _16=this.declaredClass;_4.mixin(this.store,{getValue:function(_17,_18){_3.deprecated(_16+".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly","","2.0");return _17[_18];},getLabel:function(_19){_3.deprecated(_16+".store.getLabel(item) is deprecated for builtin store. Use item.label directly","","2.0");return _19.name;},fetch:function(_1a){_3.deprecated(_16+".store.fetch() is deprecated for builtin store.","Use store.query()","2.0");var _1b=["dojo/data/ObjectStore"];require(_1b,_4.hitch(this,function(_1c){new _1c({objectStore:this}).fetch(_1a);}));}});}}});});
\ No newline at end of file diff --git a/lib/dijit/form/ComboBoxMixin.js.uncompressed.js b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js new file mode 100644 index 000000000..d49c7072e --- /dev/null +++ b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js @@ -0,0 +1,148 @@ +require({cache:{ +'url:dijit/form/templates/DropDownBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}}); +define("dijit/form/ComboBoxMixin", [ + "dojo/_base/declare", // declare + "dojo/_base/Deferred", + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/lang", // lang.mixin + "dojo/store/util/QueryResults", // dojo.store.util.QueryResults + "./_AutoCompleterMixin", + "./_ComboBoxMenu", + "../_HasDropDown", + "dojo/text!./templates/DropDownBox.html" +], function(declare, Deferred, kernel, lang, QueryResults, _AutoCompleterMixin, _ComboBoxMenu, _HasDropDown, template){ + +/*===== + var _AutoCompleterMixin = dijit.form._AutoCompleterMixin; + var _ComboBoxMenu = dijit.form._ComboBoxMenu; + var _HasDropDown = dijit._HasDropDown; +=====*/ + + // module: + // dijit/form/ComboBoxMixin + // summary: + // Provides main functionality of ComboBox widget + + return declare("dijit.form.ComboBoxMixin", [_HasDropDown, _AutoCompleterMixin], { + // summary: + // Provides main functionality of ComboBox widget + + // dropDownClass: [protected extension] Function String + // Dropdown widget class used to select a date/time. + // Subclasses should specify this. + dropDownClass: _ComboBoxMenu, + + // hasDownArrow: Boolean + // Set this textbox to have a down arrow button, to display the drop down list. + // Defaults to true. + hasDownArrow: true, + + templateString: template, + + baseClass: "dijitTextBox dijitComboBox", + + /*===== + // store: [const] dojo.store.api.Store || dojo.data.api.Read + // Reference to data provider object used by this ComboBox. + // + // Should be dojo.store.api.Store, but dojo.data.api.Read supported + // for backwards compatibility. + store: null, + =====*/ + + // Set classes like dijitDownArrowButtonHover depending on + // mouse action over button node + cssStateNodes: { + "_buttonNode": "dijitDownArrowButton" + }, + + _setHasDownArrowAttr: function(/*Boolean*/ val){ + this._set("hasDownArrow", val); + this._buttonNode.style.display = val ? "" : "none"; + }, + + _showResultList: function(){ + // hide the tooltip + this.displayMessage(""); + this.inherited(arguments); + }, + + _setStoreAttr: function(store){ + // For backwards-compatibility, accept dojo.data store in addition to dojo.store.store. Remove in 2.0. + if(!store.get){ + lang.mixin(store, { + _oldAPI: true, + get: function(id){ + // summary: + // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity. + // Like dojo.store.DataStore.get() except returns native item. + var deferred = new Deferred(); + this.fetchItemByIdentity({ + identity: id, + onItem: function(object){ + deferred.resolve(object); + }, + onError: function(error){ + deferred.reject(error); + } + }); + return deferred.promise; + }, + query: function(query, options){ + // summary: + // Queries the store for objects. Like dojo.store.DataStore.query() + // except returned Deferred contains array of native items. + var deferred = new Deferred(function(){ fetchHandle.abort && fetchHandle.abort(); }); + var fetchHandle = this.fetch(lang.mixin({ + query: query, + onBegin: function(count){ + deferred.total = count; + }, + onComplete: function(results){ + deferred.resolve(results); + }, + onError: function(error){ + deferred.reject(error); + } + }, options)); + return QueryResults(deferred); + } + }); + } + this._set("store", store); + }, + + postMixInProperties: function(){ + // Since _setValueAttr() depends on this.store, _setStoreAttr() needs to execute first. + // Unfortunately, without special code, it ends up executing second. + if(this.params.store){ + this._setStoreAttr(this.params.store); + } + + this.inherited(arguments); + + // User may try to access this.store.getValue() etc. in a custom labelFunc() function. + // It's not available with the new data store for handling inline <option> tags, so add it. + if(!this.params.store){ + var clazz = this.declaredClass; + lang.mixin(this.store, { + getValue: function(item, attr){ + kernel.deprecated(clazz + ".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly", "", "2.0"); + return item[attr]; + }, + getLabel: function(item){ + kernel.deprecated(clazz + ".store.getLabel(item) is deprecated for builtin store. Use item.label directly", "", "2.0"); + return item.name; + }, + fetch: function(args){ + kernel.deprecated(clazz + ".store.fetch() is deprecated for builtin store.", "Use store.query()", "2.0"); + var shim = ["dojo/data/ObjectStore"]; // indirection so it doesn't get rolled into a build + require(shim, lang.hitch(this, function(ObjectStore){ + new ObjectStore({objectStore: this}).fetch(args); + })); + } + }); + } + } + }); +}); diff --git a/lib/dijit/form/ComboButton.js b/lib/dijit/form/ComboButton.js index d311582ac..7fd288454 100644 --- a/lib/dijit/form/ComboButton.js +++ b/lib/dijit/form/ComboButton.js @@ -1,15 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.ComboButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ComboButton"] = true; -dojo.provide("dijit.form.ComboButton"); -dojo.require("dijit.form.Button"); - - - -} +//>>built +require({cache:{"url:dijit/form/templates/ComboButton.html":"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" data-dojo-attach-point=\"buttonNode\" data-dojo-attach-event=\"ondijitclick:_onClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" data-dojo-attach-point=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdata-dojo-attach-point=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdata-dojo-attach-event=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" data-dojo-attach-point=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"}});define("dijit/form/ComboButton",["dojo/_base/declare","dojo/_base/event","dojo/keys","../focus","./DropDownButton","dojo/text!./templates/ComboButton.html"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.form.ComboButton",_5,{templateString:_6,_setIdAttr:"",_setTabIndexAttr:["focusNode","titleNode"],_setTitleAttr:"titleNode",optionsTitle:"",baseClass:"dijitComboButton",cssStateNodes:{"buttonNode":"dijitButtonNode","titleNode":"dijitButtonContents","_popupStateNode":"dijitDownArrowButton"},_focusedNode:null,_onButtonKeyPress:function(_7){if(_7.charOrCode==_3[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){_4.focus(this._popupStateNode);_2.stop(_7);}},_onArrowKeyPress:function(_8){if(_8.charOrCode==_3[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){_4.focus(this.titleNode);_2.stop(_8);}},focus:function(_9){if(!this.disabled){_4.focus(_9=="start"?this.titleNode:this._popupStateNode);}}});});
\ No newline at end of file diff --git a/lib/dijit/form/ComboButton.js.uncompressed.js b/lib/dijit/form/ComboButton.js.uncompressed.js new file mode 100644 index 000000000..91d652288 --- /dev/null +++ b/lib/dijit/form/ComboButton.js.uncompressed.js @@ -0,0 +1,91 @@ +require({cache:{ +'url:dijit/form/templates/ComboButton.html':"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" data-dojo-attach-point=\"buttonNode\" data-dojo-attach-event=\"ondijitclick:_onClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" data-dojo-attach-point=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdata-dojo-attach-point=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdata-dojo-attach-event=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" data-dojo-attach-point=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"}}); +define("dijit/form/ComboButton", [ + "dojo/_base/declare", // declare + "dojo/_base/event", // event.stop + "dojo/keys", // keys + "../focus", // focus.focus() + "./DropDownButton", + "dojo/text!./templates/ComboButton.html" +], function(declare, event, keys, focus, DropDownButton, template){ + +/*===== + var DropDownButton = dijit.form.DropDownButton; +=====*/ + +// module: +// dijit/form/ComboButton +// summary: +// A combination button and drop-down button. + +return declare("dijit.form.ComboButton", DropDownButton, { + // summary: + // A combination button and drop-down button. + // Users can click one side to "press" the button, or click an arrow + // icon to display the drop down. + // + // example: + // | <button data-dojo-type="dijit.form.ComboButton" onClick="..."> + // | <span>Hello world</span> + // | <div data-dojo-type="dijit.Menu">...</div> + // | </button> + // + // example: + // | var button1 = new dijit.form.ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"}); + // | dojo.body().appendChild(button1.domNode); + // + + templateString: template, + + // Map widget attributes to DOMNode attributes. + _setIdAttr: "", // override _FormWidgetMixin which puts id on the focusNode + _setTabIndexAttr: ["focusNode", "titleNode"], + _setTitleAttr: "titleNode", + + // optionsTitle: String + // Text that describes the options menu (accessibility) + optionsTitle: "", + + baseClass: "dijitComboButton", + + // Set classes like dijitButtonContentsHover or dijitArrowButtonActive depending on + // mouse action over specified node + cssStateNodes: { + "buttonNode": "dijitButtonNode", + "titleNode": "dijitButtonContents", + "_popupStateNode": "dijitDownArrowButton" + }, + + _focusedNode: null, + + _onButtonKeyPress: function(/*Event*/ evt){ + // summary: + // Handler for right arrow key when focus is on left part of button + if(evt.charOrCode == keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){ + focus.focus(this._popupStateNode); + event.stop(evt); + } + }, + + _onArrowKeyPress: function(/*Event*/ evt){ + // summary: + // Handler for left arrow key when focus is on right part of button + if(evt.charOrCode == keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){ + focus.focus(this.titleNode); + event.stop(evt); + } + }, + + focus: function(/*String*/ position){ + // summary: + // Focuses this widget to according to position, if specified, + // otherwise on arrow node + // position: + // "start" or "end" + if(!this.disabled){ + focus.focus(position == "start" ? this.titleNode : this._popupStateNode); + } + } +}); + +}); diff --git a/lib/dijit/form/CurrencyTextBox.js b/lib/dijit/form/CurrencyTextBox.js index cd0d389a0..1eca54193 100644 --- a/lib/dijit/form/CurrencyTextBox.js +++ b/lib/dijit/form/CurrencyTextBox.js @@ -1,96 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.CurrencyTextBox"] = true; -dojo.provide("dijit.form.CurrencyTextBox"); -dojo.require("dojo.currency"); -dojo.require("dijit.form.NumberTextBox"); - - -/*===== -dojo.declare( - "dijit.form.CurrencyTextBox.__Constraints", - [dijit.form.NumberTextBox.__Constraints, dojo.currency.__FormatOptions, dojo.currency.__ParseOptions], { - // summary: - // Specifies both the rules on valid/invalid values (minimum, maximum, - // number of required decimal places), and also formatting options for - // displaying the value when the field is not focused (currency symbol, - // etc.) - // description: - // Follows the pattern of `dijit.form.NumberTextBox.constraints`. - // In general developers won't need to set this parameter - // example: - // To ensure that the user types in the cents (for example, 1.00 instead of just 1): - // | {fractional:true} -}); -=====*/ - -dojo.declare( - "dijit.form.CurrencyTextBox", - dijit.form.NumberTextBox, - { - // summary: - // A validating currency textbox - // description: - // CurrencyTextBox is similar to `dijit.form.NumberTextBox` but has a few - // extra features related to currency: - // - // 1. After specifying the currency type (american dollars, euros, etc.) it automatically - // sets parse/format options such as how many decimal places to show. - // 2. The currency mark (dollar sign, euro mark, etc.) is displayed when the field is blurred - // but erased during editing, so that the user can just enter a plain number. - - // currency: [const] String - // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD" - currency: "", - - /*===== - // constraints: dijit.form.CurrencyTextBox.__Constraints - // Despite the name, this parameter specifies both constraints on the input - // (including minimum/maximum allowed values) as well as - // formatting options. See `dijit.form.CurrencyTextBox.__Constraints` for details. - constraints: {}, - ======*/ - - baseClass: "dijitTextBox dijitCurrencyTextBox", - - // Override regExpGen ValidationTextBox.regExpGen().... we use a reg-ex generating function rather - // than a straight regexp to deal with locale (plus formatting options too?) - regExpGen: function(constraints){ - // if focused, accept either currency data or NumberTextBox format - return '(' + (this._focused? this.inherited(arguments, [ dojo.mixin({}, constraints, this.editOptions) ]) + '|' : '') - + dojo.currency.regexp(constraints) + ')'; - }, - - // Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45" - _formatter: dojo.currency.format, - - _parser: dojo.currency.parse, - - parse: function(/*String*/ value, /*Object*/ constraints){ - // summary: - // Parses string value as a Currency, according to the constraints object - // tags: - // protected extension - var v = this.inherited(arguments); - if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse - v = dojo.hitch(dojo.mixin({}, this, { _parser: dijit.form.NumberTextBox.prototype._parser }), "inherited")(arguments); - } - return v; - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - if(!constraints.currency && this.currency){ - constraints.currency = this.currency; - } - this.inherited(arguments, [ dojo.currency._mixInDefaults(dojo.mixin(constraints, { exponent: false })) ]); // get places - } - } -); - -} +//>>built +define("dijit/form/CurrencyTextBox",["dojo/currency","dojo/_base/declare","dojo/_base/lang","./NumberTextBox"],function(_1,_2,_3,_4){return _2("dijit.form.CurrencyTextBox",_4,{currency:"",baseClass:"dijitTextBox dijitCurrencyTextBox",regExpGen:function(_5){return "("+(this.focused?this.inherited(arguments,[_3.mixin({},_5,this.editOptions)])+"|":"")+_1.regexp(_5)+")";},_formatter:_1.format,_parser:_1.parse,parse:function(_6,_7){var v=this.inherited(arguments);if(isNaN(v)&&/\d+/.test(_6)){v=_3.hitch(_3.mixin({},this,{_parser:_4.prototype._parser}),"inherited")(arguments);}return v;},_setConstraintsAttr:function(_8){if(!_8.currency&&this.currency){_8.currency=this.currency;}this.inherited(arguments,[_1._mixInDefaults(_3.mixin(_8,{exponent:false}))]);}});});
\ No newline at end of file diff --git a/lib/dijit/form/CurrencyTextBox.js.uncompressed.js b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js new file mode 100644 index 000000000..9626cfd74 --- /dev/null +++ b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js @@ -0,0 +1,94 @@ +define("dijit/form/CurrencyTextBox", [ + "dojo/currency", // currency._mixInDefaults currency.format currency.parse currency.regexp + "dojo/_base/declare", // declare + "dojo/_base/lang", // lang.hitch + "./NumberTextBox" +], function(currency, declare, lang, NumberTextBox){ + +/*===== + var NumberTextBox = dijit.form.NumberTextBox; +=====*/ + + // module: + // dijit/form/CurrencyTextBox + // summary: + // A validating currency textbox + + + /*===== + declare( + "dijit.form.CurrencyTextBox.__Constraints", + [dijit.form.NumberTextBox.__Constraints, currency.__FormatOptions, currency.__ParseOptions], { + // summary: + // Specifies both the rules on valid/invalid values (minimum, maximum, + // number of required decimal places), and also formatting options for + // displaying the value when the field is not focused (currency symbol, + // etc.) + // description: + // Follows the pattern of `dijit.form.NumberTextBox.constraints`. + // In general developers won't need to set this parameter + // example: + // To ensure that the user types in the cents (for example, 1.00 instead of just 1): + // | {fractional:true} + }); + =====*/ + + return declare("dijit.form.CurrencyTextBox", NumberTextBox, { + // summary: + // A validating currency textbox + // description: + // CurrencyTextBox is similar to `dijit.form.NumberTextBox` but has a few + // extra features related to currency: + // + // 1. After specifying the currency type (american dollars, euros, etc.) it automatically + // sets parse/format options such as how many decimal places to show. + // 2. The currency mark (dollar sign, euro mark, etc.) is displayed when the field is blurred + // but erased during editing, so that the user can just enter a plain number. + + // currency: [const] String + // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD" + currency: "", + + /*===== + // constraints: dijit.form.CurrencyTextBox.__Constraints + // Despite the name, this parameter specifies both constraints on the input + // (including minimum/maximum allowed values) as well as + // formatting options. See `dijit.form.CurrencyTextBox.__Constraints` for details. + constraints: {}, + ======*/ + + baseClass: "dijitTextBox dijitCurrencyTextBox", + + // Override regExpGen ValidationTextBox.regExpGen().... we use a reg-ex generating function rather + // than a straight regexp to deal with locale (plus formatting options too?) + regExpGen: function(constraints){ + // if focused, accept either currency data or NumberTextBox format + return '(' + (this.focused ? this.inherited(arguments, [ lang.mixin({}, constraints, this.editOptions) ]) + '|' : '') + + currency.regexp(constraints) + ')'; + }, + + // Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45" + _formatter: currency.format, + + _parser: currency.parse, + + parse: function(/*String*/ value, /*Object*/ constraints){ + // summary: + // Parses string value as a Currency, according to the constraints object + // tags: + // protected extension + var v = this.inherited(arguments); + if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse + v = lang.hitch(lang.mixin({}, this, { _parser: NumberTextBox.prototype._parser }), "inherited")(arguments); + } + return v; + }, + + _setConstraintsAttr: function(/*Object*/ constraints){ + if(!constraints.currency && this.currency){ + constraints.currency = this.currency; + } + this.inherited(arguments, [ currency._mixInDefaults(lang.mixin(constraints, { exponent: false })) ]); // get places + } + }); +}); diff --git a/lib/dijit/form/DataList.js b/lib/dijit/form/DataList.js new file mode 100644 index 000000000..9b4d0e30e --- /dev/null +++ b/lib/dijit/form/DataList.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/DataList",["dojo/_base/declare","dojo/dom","dojo/_base/lang","dojo/query","dojo/store/Memory","../registry"],function(_1,_2,_3,_4,_5,_6){function _7(_8){return {id:_8.value,value:_8.value,name:_3.trim(_8.innerText||_8.textContent||"")};};return _1("dijit.form.DataList",_5,{constructor:function(_9,_a){this.domNode=_2.byId(_a);_3.mixin(this,_9);if(this.id){_6.add(this);}this.domNode.style.display="none";this.inherited(arguments,[{data:_4("option",this.domNode).map(_7)}]);},destroy:function(){_6.remove(this.id);},fetchSelectedItem:function(){var _b=_4("> option[selected]",this.domNode)[0]||_4("> option",this.domNode)[0];return _b&&_7(_b);}});});
\ No newline at end of file diff --git a/lib/dijit/form/DataList.js.uncompressed.js b/lib/dijit/form/DataList.js.uncompressed.js new file mode 100644 index 000000000..acfb5167c --- /dev/null +++ b/lib/dijit/form/DataList.js.uncompressed.js @@ -0,0 +1,63 @@ +define("dijit/form/DataList", [ + "dojo/_base/declare", // declare + "dojo/dom", // dom.byId + "dojo/_base/lang", // lang.trim + "dojo/query", // query + "dojo/store/Memory", // dojo.store.Memory + "../registry" // registry.add registry.remove +], function(declare, dom, lang, query, MemoryStore, registry){ + + // module: + // dijit/form/DataList + // summary: + // Inefficient but small data store specialized for inlined data via OPTION tags + + function toItem(/*DOMNode*/ option){ + // summary: + // Convert <option> node to hash + return { + id: option.value, + value: option.value, + name: lang.trim(option.innerText || option.textContent || '') + }; + } + + return declare("dijit.form.DataList", MemoryStore, { + // summary: + // Inefficient but small data store specialized for inlined data via OPTION tags + // + // description: + // Provides a store for inlined data like: + // + // | <datalist> + // | <option value="AL">Alabama</option> + // | ... + + constructor: function(/*Object?*/ params, /*DomNode|String*/ srcNodeRef){ + // store pointer to original DOM tree + this.domNode = dom.byId(srcNodeRef); + + lang.mixin(this, params); + if(this.id){ + registry.add(this); // add to registry so it can be easily found by id + } + this.domNode.style.display = "none"; + + this.inherited(arguments, [{ + data: query("option", this.domNode).map(toItem) + }]); + }, + + destroy: function(){ + registry.remove(this.id); + }, + + fetchSelectedItem: function(){ + // summary: + // Get the option marked as selected, like `<option selected>`. + // Not part of dojo.data API. + var option = query("> option[selected]", this.domNode)[0] || query("> option", this.domNode)[0]; + return option && toItem(option); + } + }); +}); diff --git a/lib/dijit/form/DateTextBox.js b/lib/dijit/form/DateTextBox.js index 3d929ae76..651fcd13a 100644 --- a/lib/dijit/form/DateTextBox.js +++ b/lib/dijit/form/DateTextBox.js @@ -1,40 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.DateTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.DateTextBox"] = true; -dojo.provide("dijit.form.DateTextBox"); -dojo.require("dijit.Calendar"); -dojo.require("dijit.form._DateTimeTextBox"); - - -dojo.declare( - "dijit.form.DateTextBox", - dijit.form._DateTimeTextBox, - { - // summary: - // A validating, serializable, range-bound date text box with a drop down calendar - // - // Example: - // | new dijit.form.DateTextBox({value: new Date(2009, 0, 20)}) - // - // Example: - // | <input dojotype='dijit.form.DateTextBox' value='2009-01-20'> - - baseClass: "dijitTextBox dijitComboBox dijitDateTextBox", - popupClass: "dijit.Calendar", - _selector: "date", - - // value: Date - // The value of this widget as a JavaScript Date object, with only year/month/day specified. - // If specified in markup, use the format specified in `dojo.date.stamp.fromISOString`. - // set("value", ...) accepts either a Date object or a string. - value: new Date("") // value.toString()="NaN" - } -); - -} +//>>built +define("dijit/form/DateTextBox",["dojo/_base/declare","../Calendar","./_DateTimeTextBox"],function(_1,_2,_3){return _1("dijit.form.DateTextBox",_3,{baseClass:"dijitTextBox dijitComboBox dijitDateTextBox",popupClass:_2,_selector:"date",value:new Date("")});});
\ No newline at end of file diff --git a/lib/dijit/form/DateTextBox.js.uncompressed.js b/lib/dijit/form/DateTextBox.js.uncompressed.js new file mode 100644 index 000000000..7257fb93a --- /dev/null +++ b/lib/dijit/form/DateTextBox.js.uncompressed.js @@ -0,0 +1,38 @@ +define("dijit/form/DateTextBox", [ + "dojo/_base/declare", // declare + "../Calendar", + "./_DateTimeTextBox" +], function(declare, Calendar, _DateTimeTextBox){ + +/*===== + var Calendar = dijit.Calendar; + var _DateTimeTextBox = dijit.form._DateTimeTextBox; +=====*/ + + // module: + // dijit/form/DateTextBox + // summary: + // A validating, serializable, range-bound date text box with a drop down calendar + + + return declare("dijit.form.DateTextBox", _DateTimeTextBox, { + // summary: + // A validating, serializable, range-bound date text box with a drop down calendar + // + // Example: + // | new dijit.form.DateTextBox({value: new Date(2009, 0, 20)}) + // + // Example: + // | <input data-dojo-type='dijit.form.DateTextBox' value='2009-01-20'> + + baseClass: "dijitTextBox dijitComboBox dijitDateTextBox", + popupClass: Calendar, + _selector: "date", + + // value: Date + // The value of this widget as a JavaScript Date object, with only year/month/day specified. + // If specified in markup, use the format specified in `stamp.fromISOString`. + // set("value", ...) accepts either a Date object or a string. + value: new Date("") // value.toString()="NaN" + }); +}); diff --git a/lib/dijit/form/DropDownButton.js b/lib/dijit/form/DropDownButton.js index 2489a4cdf..4d224ef08 100644 --- a/lib/dijit/form/DropDownButton.js +++ b/lib/dijit/form/DropDownButton.js @@ -1,15 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.DropDownButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.DropDownButton"] = true; -dojo.provide("dijit.form.DropDownButton"); -dojo.require("dijit.form.Button"); - - - -} +//>>built +require({cache:{"url:dijit/form/templates/DropDownButton.html":"<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" data-dojo-attach-point=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdata-dojo-attach-point=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">▼</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-point=\"valueNode\"\n/></span>\n"}});define("dijit/form/DropDownButton",["dojo/_base/declare","dojo/_base/lang","dojo/query","../registry","../popup","./Button","../_Container","../_HasDropDown","dojo/text!./templates/DropDownButton.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.DropDownButton",[_6,_7,_8],{baseClass:"dijitDropDownButton",templateString:_9,_fillContent:function(){if(this.srcNodeRef){var _a=_3("*",this.srcNodeRef);this.inherited(arguments,[_a[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _b=_3("[widgetId]",this.dropDownContainer)[0];this.dropDown=_4.byNode(_b);delete this.dropDownContainer;}if(this.dropDown){_5.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _c=this.dropDown;return (!!_c&&(!_c.href||_c.isLoaded));},loadDropDown:function(_d){var _e=this.dropDown;var _f=_e.on("load",_2.hitch(this,function(){_f.remove();_d();}));_e.refresh();},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});});
\ No newline at end of file diff --git a/lib/dijit/form/DropDownButton.js.uncompressed.js b/lib/dijit/form/DropDownButton.js.uncompressed.js new file mode 100644 index 000000000..b5c33b806 --- /dev/null +++ b/lib/dijit/form/DropDownButton.js.uncompressed.js @@ -0,0 +1,107 @@ +require({cache:{ +'url:dijit/form/templates/DropDownButton.html':"<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" data-dojo-attach-point=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdata-dojo-attach-point=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">▼</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-point=\"valueNode\"\n/></span>\n"}}); +define("dijit/form/DropDownButton", [ + "dojo/_base/declare", // declare + "dojo/_base/lang", // hitch + "dojo/query", // query + "../registry", // registry.byNode + "../popup", // dijit.popup2.hide + "./Button", + "../_Container", + "../_HasDropDown", + "dojo/text!./templates/DropDownButton.html" +], function(declare, lang, query, registry, popup, Button, _Container, _HasDropDown, template){ + +/*===== + Button = dijit.form.Button; + _Container = dijit._Container; + _HasDropDown = dijit._HasDropDown; +=====*/ + +// module: +// dijit/form/DropDownButton +// summary: +// A button with a drop down + + +return declare("dijit.form.DropDownButton", [Button, _Container, _HasDropDown], { + // summary: + // A button with a drop down + // + // example: + // | <button data-dojo-type="dijit.form.DropDownButton"> + // | Hello world + // | <div data-dojo-type="dijit.Menu">...</div> + // | </button> + // + // example: + // | var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) }); + // | win.body().appendChild(button1); + // + + baseClass : "dijitDropDownButton", + + templateString: template, + + _fillContent: function(){ + // Overrides Button._fillContent(). + // + // My inner HTML contains both the button contents and a drop down widget, like + // <DropDownButton> <span>push me</span> <Menu> ... </Menu> </DropDownButton> + // The first node is assumed to be the button content. The widget is the popup. + + if(this.srcNodeRef){ // programatically created buttons might not define srcNodeRef + //FIXME: figure out how to filter out the widget and use all remaining nodes as button + // content, not just nodes[0] + var nodes = query("*", this.srcNodeRef); + this.inherited(arguments, [nodes[0]]); + + // save pointer to srcNode so we can grab the drop down widget after it's instantiated + this.dropDownContainer = this.srcNodeRef; + } + }, + + startup: function(){ + if(this._started){ return; } + + // the child widget from srcNodeRef is the dropdown widget. Insert it in the page DOM, + // make it invisible, and store a reference to pass to the popup code. + if(!this.dropDown && this.dropDownContainer){ + var dropDownNode = query("[widgetId]", this.dropDownContainer)[0]; + this.dropDown = registry.byNode(dropDownNode); + delete this.dropDownContainer; + } + if(this.dropDown){ + popup.hide(this.dropDown); + } + + this.inherited(arguments); + }, + + isLoaded: function(){ + // Returns whether or not we are loaded - if our dropdown has an href, + // then we want to check that. + var dropDown = this.dropDown; + return (!!dropDown && (!dropDown.href || dropDown.isLoaded)); + }, + + loadDropDown: function(/*Function*/ callback){ + // Default implementation assumes that drop down already exists, + // but hasn't loaded it's data (ex: ContentPane w/href). + // App must override if the drop down is lazy-created. + var dropDown = this.dropDown; + var handler = dropDown.on("load", lang.hitch(this, function(){ + handler.remove(); + callback(); + })); + dropDown.refresh(); // tell it to load + }, + + isFocusable: function(){ + // Overridden so that focus is handled by the _HasDropDown mixin, not by + // the _FormWidget mixin. + return this.inherited(arguments) && !this._mouseDown; + } +}); + +}); diff --git a/lib/dijit/form/FilteringSelect.js b/lib/dijit/form/FilteringSelect.js index 81b44ff3b..5cffa0df8 100644 --- a/lib/dijit/form/FilteringSelect.js +++ b/lib/dijit/form/FilteringSelect.js @@ -1,227 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.FilteringSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.FilteringSelect"] = true; -dojo.provide("dijit.form.FilteringSelect"); -dojo.require("dijit.form.ComboBox"); - - -dojo.declare( - "dijit.form.FilteringSelect", - [dijit.form.MappedTextBox, dijit.form.ComboBoxMixin], - { - // summary: - // An enhanced version of the HTML SELECT tag, populated dynamically - // - // description: - // An enhanced version of the HTML SELECT tag, populated dynamically. It works - // very nicely with very large data sets because it can load and page data as needed. - // It also resembles ComboBox, but does not allow values outside of the provided ones. - // If OPTION tags are used as the data provider via markup, then the - // OPTION tag's child text node is used as the displayed value when selected - // while the OPTION tag's value attribute is used as the widget value on form submit. - // To set the default value when using OPTION tags, specify the selected - // attribute on 1 of the child OPTION tags. - // - // Similar features: - // - There is a drop down list of possible values. - // - You can only enter a value from the drop down list. (You can't - // enter an arbitrary value.) - // - The value submitted with the form is the hidden value (ex: CA), - // not the displayed value a.k.a. label (ex: California) - // - // Enhancements over plain HTML version: - // - If you type in some text then it will filter down the list of - // possible values in the drop down list. - // - List can be specified either as a static list or via a javascript - // function (that can get the list from a server) - - // required: Boolean - // True (default) if user is required to enter a value into this field. - required: true, - - _lastDisplayedValue: "", - - _isValidSubset: function(){ - return this._opened; - }, - - isValid: function(){ - // Overrides ValidationTextBox.isValid() - return this.item || (!this.required && this.get('displayedValue') == ""); // #5974 - }, - - _refreshState: function(){ - if(!this.searchTimer){ // state will be refreshed after results are returned - this.inherited(arguments); - } - }, - - _callbackSetLabel: function( - /*Array*/ result, - /*Object*/ dataObject, - /*Boolean?*/ priorityChange){ - // summary: - // Callback from dojo.data after lookup of user entered value finishes - - // setValue does a synchronous lookup, - // so it calls _callbackSetLabel directly, - // and so does not pass dataObject - // still need to test against _lastQuery in case it came too late - if((dataObject && dataObject.query[this.searchAttr] != this._lastQuery) || (!dataObject && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){ - return; - } - if(!result.length){ - //#3268: don't modify display value on bad input - //#3285: change CSS to indicate error - this.valueNode.value = ""; - dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange === undefined && !this._focused)); - this._set("item", null); - this.validate(this._focused); - }else{ - this.set('item', result[0], priorityChange); - } - }, - - _openResultList: function(/*Object*/ results, /*Object*/ dataObject){ - // Callback when a data store query completes. - // Overrides ComboBox._openResultList() - - // #3285: tap into search callback to see if user's query resembles a match - if(dataObject.query[this.searchAttr] != this._lastQuery){ - return; - } - dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments); - - if(this.item === undefined){ // item == undefined for keyboard search - // If the search returned no items that means that the user typed - // in something invalid (and they can't make it valid by typing more characters), - // so flag the FilteringSelect as being in an invalid state - this.validate(true); - } - }, - - _getValueAttr: function(){ - // summary: - // Hook for get('value') to work. - - // don't get the textbox value but rather the previously set hidden value. - // Use this.valueNode.value which isn't always set for other MappedTextBox widgets until blur - return this.valueNode.value; - }, - - _getValueField: function(){ - // Overrides ComboBox._getValueField() - return "value"; - }, - - _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the select. - // Also sets the label to the corresponding value by reverse lookup. - if(!this._onChangeActive){ priorityChange = null; } - this._lastQuery = value; - - if(value === null || value === ''){ - this._setDisplayedValueAttr('', priorityChange); - return; - } - - //#3347: fetchItemByIdentity if no keyAttr specified - var self = this; - this.store.fetchItemByIdentity({ - identity: value, - onItem: function(item){ - self._callbackSetLabel(item? [item] : [], undefined, priorityChange); - } - }); - }, - - _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ - // summary: - // Set the displayed valued in the input box, and the hidden value - // that gets submitted, based on a dojo.data store item. - // description: - // Users shouldn't call this function; they should be calling - // set('item', value) - // tags: - // private - this.inherited(arguments); - this.valueNode.value = this.value; - this._lastDisplayedValue = this.textbox.value; - }, - - _getDisplayQueryString: function(/*String*/ text){ - return text.replace(/([\\\*\?])/g, "\\$1"); - }, - - _setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('displayedValue', label) works. - // description: - // Sets textbox to display label. Also performs reverse lookup - // to set the hidden value. label should corresponding to item.searchAttr. - - if(label == null){ label = ''; } - - // This is called at initialization along with every custom setter. - // Usually (or always?) the call can be ignored. If it needs to be - // processed then at least make sure that the XHR request doesn't trigger an onChange() - // event, even if it returns after creation has finished - if(!this._created){ - if(!("displayedValue" in this.params)){ - return; - } - priorityChange = false; - } - - // Do a reverse lookup to map the specified displayedValue to the hidden value. - // Note that if there's a custom labelFunc() this code - if(this.store){ - this.closeDropDown(); - var query = dojo.clone(this.query); // #6196: populate query with user-specifics - // escape meta characters of dojo.data.util.filter.patternToRegExp(). - this._lastQuery = query[this.searchAttr] = this._getDisplayQueryString(label); - // If the label is not valid, the callback will never set it, - // so the last valid value will get the warning textbox. Set the - // textbox value now so that the impending warning will make - // sense to the user - this.textbox.value = label; - this._lastDisplayedValue = label; - this._set("displayedValue", label); // for watch("displayedValue") notification - var _this = this; - var fetch = { - query: query, - queryOptions: { - ignoreCase: this.ignoreCase, - deep: true - }, - onComplete: function(result, dataObject){ - _this._fetchHandle = null; - dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange); - }, - onError: function(errText){ - _this._fetchHandle = null; - console.error('dijit.form.FilteringSelect: ' + errText); - dojo.hitch(_this, "_callbackSetLabel")([], undefined, false); - } - }; - dojo.mixin(fetch, this.fetchProperties); - this._fetchHandle = this.store.fetch(fetch); - } - }, - - undo: function(){ - this.set('displayedValue', this._lastDisplayedValue); - } - } -); - -} +//>>built +define("dijit/form/FilteringSelect",["dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/_base/lang","./MappedTextBox","./ComboBoxMixin"],function(_1,_2,_3,_4,_5,_6){return _2("dijit.form.FilteringSelect",[_5,_6],{required:true,_lastDisplayedValue:"",_isValidSubset:function(){return this._opened;},isValid:function(){return !!this.item||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_7,_8,_9,_a){if((_8&&_8[this.searchAttr]!==this._lastQuery)||(!_8&&_7.length&&this.store.getIdentity(_7[0])!=this._lastQuery)){return;}if(!_7.length){this.set("value","",_a||(_a===undefined&&!this.focused),this.textbox.value,null);}else{this.set("item",_7[0],_a);}},_openResultList:function(_b,_c,_d){if(_c[this.searchAttr]!==this._lastQuery){return;}this.inherited(arguments);if(this.item===undefined){this.validate(true);}},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_e,_f,_10,_11){if(!this._onChangeActive){_f=null;}if(_11===undefined){if(_e===null||_e===""){_e="";if(!_4.isString(_10)){this._setDisplayedValueAttr(_10||"",_f);return;}}var _12=this;this._lastQuery=_e;_3.when(this.store.get(_e),function(_13){_12._callbackSetLabel(_13?[_13]:[],undefined,undefined,_f);});}else{this.valueNode.value=_e;this.inherited(arguments);}},_setItemAttr:function(_14,_15,_16){this.inherited(arguments);this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(_17){return _17.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_18,_19){if(_18==null){_18="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_19=false;}if(this.store){this.closeDropDown();var _1a=_4.clone(this.query);var qs=this._getDisplayQueryString(_18),q;if(this.store._oldAPI){q=qs;}else{q=_1.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_1a[this.searchAttr]=q;this.textbox.value=_18;this._lastDisplayedValue=_18;this._set("displayedValue",_18);var _1b=this;var _1c={ignoreCase:this.ignoreCase,deep:true};_4.mixin(_1c,this.fetchProperties);this._fetchHandle=this.store.query(_1a,_1c);_3.when(this._fetchHandle,function(_1d){_1b._fetchHandle=null;_1b._callbackSetLabel(_1d||[],_1a,_1c,_19);},function(err){_1b._fetchHandle=null;if(!_1b._cancelingQuery){console.error("dijit.form.FilteringSelect: "+err.toString());}});}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});});
\ No newline at end of file diff --git a/lib/dijit/form/FilteringSelect.js.uncompressed.js b/lib/dijit/form/FilteringSelect.js.uncompressed.js new file mode 100644 index 000000000..3a9121bf1 --- /dev/null +++ b/lib/dijit/form/FilteringSelect.js.uncompressed.js @@ -0,0 +1,240 @@ +define("dijit/form/FilteringSelect", [ + "dojo/data/util/filter", // filter.patternToRegExp + "dojo/_base/declare", // declare + "dojo/_base/Deferred", // Deferred.when + "dojo/_base/lang", // lang.mixin + "./MappedTextBox", + "./ComboBoxMixin" +], function(filter, declare, Deferred, lang, MappedTextBox, ComboBoxMixin){ + +/*===== + var MappedTextBox = dijit.form.MappedTextBox; + var ComboBoxMixin = dijit.form.ComboBoxMixin; +=====*/ + + // module: + // dijit/form/FilteringSelect + // summary: + // An enhanced version of the HTML SELECT tag, populated dynamically + + + return declare("dijit.form.FilteringSelect", [MappedTextBox, ComboBoxMixin], { + // summary: + // An enhanced version of the HTML SELECT tag, populated dynamically + // + // description: + // An enhanced version of the HTML SELECT tag, populated dynamically. It works + // very nicely with very large data sets because it can load and page data as needed. + // It also resembles ComboBox, but does not allow values outside of the provided ones. + // If OPTION tags are used as the data provider via markup, then the + // OPTION tag's child text node is used as the displayed value when selected + // while the OPTION tag's value attribute is used as the widget value on form submit. + // To set the default value when using OPTION tags, specify the selected + // attribute on 1 of the child OPTION tags. + // + // Similar features: + // - There is a drop down list of possible values. + // - You can only enter a value from the drop down list. (You can't + // enter an arbitrary value.) + // - The value submitted with the form is the hidden value (ex: CA), + // not the displayed value a.k.a. label (ex: California) + // + // Enhancements over plain HTML version: + // - If you type in some text then it will filter down the list of + // possible values in the drop down list. + // - List can be specified either as a static list or via a javascript + // function (that can get the list from a server) + + // required: Boolean + // True (default) if user is required to enter a value into this field. + required: true, + + _lastDisplayedValue: "", + + _isValidSubset: function(){ + return this._opened; + }, + + isValid: function(){ + // Overrides ValidationTextBox.isValid() + return !!this.item || (!this.required && this.get('displayedValue') == ""); // #5974 + }, + + _refreshState: function(){ + if(!this.searchTimer){ // state will be refreshed after results are returned + this.inherited(arguments); + } + }, + + _callbackSetLabel: function( + /*Array*/ result, + /*Object*/ query, + /*Object*/ options, + /*Boolean?*/ priorityChange){ + // summary: + // Callback from dojo.store after lookup of user entered value finishes + + // setValue does a synchronous lookup, + // so it calls _callbackSetLabel directly, + // and so does not pass dataObject + // still need to test against _lastQuery in case it came too late + if((query && query[this.searchAttr] !== this._lastQuery) || (!query && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){ + return; + } + if(!result.length){ + //#3268: don't modify display value on bad input + //#3285: change CSS to indicate error + this.set("value", '', priorityChange || (priorityChange === undefined && !this.focused), this.textbox.value, null); + }else{ + this.set('item', result[0], priorityChange); + } + }, + + _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){ + // Callback when a data store query completes. + // Overrides ComboBox._openResultList() + + // #3285: tap into search callback to see if user's query resembles a match + if(query[this.searchAttr] !== this._lastQuery){ + return; + } + this.inherited(arguments); + + if(this.item === undefined){ // item == undefined for keyboard search + // If the search returned no items that means that the user typed + // in something invalid (and they can't make it valid by typing more characters), + // so flag the FilteringSelect as being in an invalid state + this.validate(true); + } + }, + + _getValueAttr: function(){ + // summary: + // Hook for get('value') to work. + + // don't get the textbox value but rather the previously set hidden value. + // Use this.valueNode.value which isn't always set for other MappedTextBox widgets until blur + return this.valueNode.value; + }, + + _getValueField: function(){ + // Overrides ComboBox._getValueField() + return "value"; + }, + + _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){ + // summary: + // Hook so set('value', value) works. + // description: + // Sets the value of the select. + // Also sets the label to the corresponding value by reverse lookup. + if(!this._onChangeActive){ priorityChange = null; } + + if(item === undefined){ + if(value === null || value === ''){ + value = ''; + if(!lang.isString(displayedValue)){ + this._setDisplayedValueAttr(displayedValue||'', priorityChange); + return; + } + } + + var self = this; + this._lastQuery = value; + Deferred.when(this.store.get(value), function(item){ + self._callbackSetLabel(item? [item] : [], undefined, undefined, priorityChange); + }); + }else{ + this.valueNode.value = value; + this.inherited(arguments); + } + }, + + _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ + // summary: + // Set the displayed valued in the input box, and the hidden value + // that gets submitted, based on a dojo.data store item. + // description: + // Users shouldn't call this function; they should be calling + // set('item', value) + // tags: + // private + this.inherited(arguments); + this._lastDisplayedValue = this.textbox.value; + }, + + _getDisplayQueryString: function(/*String*/ text){ + return text.replace(/([\\\*\?])/g, "\\$1"); + }, + + _setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('displayedValue', label) works. + // description: + // Sets textbox to display label. Also performs reverse lookup + // to set the hidden value. label should corresponding to item.searchAttr. + + if(label == null){ label = ''; } + + // This is called at initialization along with every custom setter. + // Usually (or always?) the call can be ignored. If it needs to be + // processed then at least make sure that the XHR request doesn't trigger an onChange() + // event, even if it returns after creation has finished + if(!this._created){ + if(!("displayedValue" in this.params)){ + return; + } + priorityChange = false; + } + + // Do a reverse lookup to map the specified displayedValue to the hidden value. + // Note that if there's a custom labelFunc() this code + if(this.store){ + this.closeDropDown(); + var query = lang.clone(this.query); // #6196: populate query with user-specifics + + // Generate query + var qs = this._getDisplayQueryString(label), q; + if(this.store._oldAPI){ + // remove this branch for 2.0 + q = qs; + }else{ + // Query on searchAttr is a regex for benefit of dojo.store.Memory, + // but with a toString() method to help dojo.store.JsonRest. + // Search string like "Co*" converted to regex like /^Co.*$/i. + q = filter.patternToRegExp(qs, this.ignoreCase); + q.toString = function(){ return qs; }; + } + this._lastQuery = query[this.searchAttr] = q; + + // If the label is not valid, the callback will never set it, + // so the last valid value will get the warning textbox. Set the + // textbox value now so that the impending warning will make + // sense to the user + this.textbox.value = label; + this._lastDisplayedValue = label; + this._set("displayedValue", label); // for watch("displayedValue") notification + var _this = this; + var options = { + ignoreCase: this.ignoreCase, + deep: true + }; + lang.mixin(options, this.fetchProperties); + this._fetchHandle = this.store.query(query, options); + Deferred.when(this._fetchHandle, function(result){ + _this._fetchHandle = null; + _this._callbackSetLabel(result || [], query, options, priorityChange); + }, function(err){ + _this._fetchHandle = null; + if(!_this._cancelingQuery){ // don't treat canceled query as an error + console.error('dijit.form.FilteringSelect: ' + err.toString()); + } + }); + } + }, + + undo: function(){ + this.set('displayedValue', this._lastDisplayedValue); + } + }); +}); diff --git a/lib/dijit/form/Form.js b/lib/dijit/form/Form.js index 8eba470b9..e38a2ec8c 100644 --- a/lib/dijit/form/Form.js +++ b/lib/dijit/form/Form.js @@ -1,189 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Form"] = true; -dojo.provide("dijit.form.Form"); -dojo.require("dijit._Widget"); -dojo.require("dijit._Templated"); -dojo.require("dijit.form._FormMixin"); -dojo.require("dijit.layout._ContentPaneResizeMixin"); - - -dojo.declare( - "dijit.form.Form", - [dijit._Widget, dijit._Templated, dijit.form._FormMixin, dijit.layout._ContentPaneResizeMixin], - { - // summary: - // Widget corresponding to HTML form tag, for validation and serialization - // - // example: - // | <form dojoType="dijit.form.Form" id="myForm"> - // | Name: <input type="text" name="name" /> - // | </form> - // | myObj = {name: "John Doe"}; - // | dijit.byId('myForm').set('value', myObj); - // | - // | myObj=dijit.byId('myForm').get('value'); - - // HTML <FORM> attributes - - // name: String? - // Name of form for scripting. - name: "", - - // action: String? - // Server-side form handler. - action: "", - - // method: String? - // HTTP method used to submit the form, either "GET" or "POST". - method: "", - - // encType: String? - // Encoding type for the form, ex: application/x-www-form-urlencoded. - encType: "", - - // accept-charset: String? - // List of supported charsets. - "accept-charset": "", - - // accept: String? - // List of MIME types for file upload. - accept: "", - - // target: String? - // Target frame for the document to be opened in. - target: "", - - templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>", - - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - action: "", - method: "", - encType: "", - "accept-charset": "", - accept: "", - target: "" - }), - - postMixInProperties: function(){ - // Setup name=foo string to be referenced from the template (but only if a name has been specified) - // Unfortunately we can't use attributeMap to set the name due to IE limitations, see #8660 - this.nameAttrSetting = this.name ? ("name='" + this.name + "'") : ""; - this.inherited(arguments); - }, - - execute: function(/*Object*/ formContents){ - // summary: - // Deprecated: use submit() - // tags: - // deprecated - }, - - onExecute: function(){ - // summary: - // Deprecated: use onSubmit() - // tags: - // deprecated - }, - - _setEncTypeAttr: function(/*String*/ value){ - this.encType = value; - dojo.attr(this.domNode, "encType", value); - if(dojo.isIE){ this.domNode.encoding = value; } - }, - - postCreate: function(){ - // IE tries to hide encType - // TODO: remove in 2.0, no longer necessary with data-dojo-params - if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){ - var item = this.srcNodeRef.attributes.getNamedItem('encType'); - if(item && !item.specified && (typeof item.value == "string")){ - this.set('encType', item.value); - } - } - this.inherited(arguments); - }, - - reset: function(/*Event?*/ e){ - // summary: - // restores all widget values back to their init values, - // calls onReset() which can cancel the reset by returning false - - // create fake event so we can know if preventDefault() is called - var faux = { - returnValue: true, // the IE way - preventDefault: function(){ // not IE - this.returnValue = false; - }, - stopPropagation: function(){}, - currentTarget: e ? e.target : this.domNode, - target: e ? e.target : this.domNode - }; - // if return value is not exactly false, and haven't called preventDefault(), then reset - if(!(this.onReset(faux) === false) && faux.returnValue){ - this.inherited(arguments, []); - } - }, - - onReset: function(/*Event?*/ e){ - // summary: - // Callback when user resets the form. This method is intended - // to be over-ridden. When the `reset` method is called - // programmatically, the return value from `onReset` is used - // to compute whether or not resetting should proceed - // tags: - // callback - return true; // Boolean - }, - - _onReset: function(e){ - this.reset(e); - dojo.stopEvent(e); - return false; - }, - - _onSubmit: function(e){ - var fp = dijit.form.Form.prototype; - // TODO: remove this if statement beginning with 2.0 - if(this.execute != fp.execute || this.onExecute != fp.onExecute){ - dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0"); - this.onExecute(); - this.execute(this.getValues()); - } - if(this.onSubmit(e) === false){ // only exactly false stops submit - dojo.stopEvent(e); - } - }, - - onSubmit: function(/*Event?*/ e){ - // summary: - // Callback when user submits the form. - // description: - // This method is intended to be over-ridden, but by default it checks and - // returns the validity of form elements. When the `submit` - // method is called programmatically, the return value from - // `onSubmit` is used to compute whether or not submission - // should proceed - // tags: - // extension - - return this.isValid(); // Boolean - }, - - submit: function(){ - // summary: - // programmatically submit form if and only if the `onSubmit` returns true - if(!(this.onSubmit() === false)){ - this.containerNode.submit(); - } - } - } -); - -} +//>>built +define("dijit/form/Form",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/kernel","dojo/_base/sniff","../_Widget","../_TemplatedMixin","./_FormMixin","../layout/_ContentPaneResizeMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.Form",[_6,_7,_8,_9],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(){},onExecute:function(){},_setEncTypeAttr:function(_a){this.encType=_a;_2.set(this.domNode,"encType",_a);if(_5("ie")){this.domNode.encoding=_a;}},reset:function(e){var _b={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(_b)===false)&&_b.returnValue){this.inherited(arguments,[]);}},onReset:function(){return true;},_onReset:function(e){this.reset(e);_3.stop(e);return false;},_onSubmit:function(e){var fp=this.constructor.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){_4.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){_3.stop(e);}},onSubmit:function(){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});});
\ No newline at end of file diff --git a/lib/dijit/form/Form.js.uncompressed.js b/lib/dijit/form/Form.js.uncompressed.js new file mode 100644 index 000000000..75615e7ae --- /dev/null +++ b/lib/dijit/form/Form.js.uncompressed.js @@ -0,0 +1,172 @@ +define("dijit/form/Form", [ + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/_base/event", // event.stop + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/sniff", // has("ie") + "../_Widget", + "../_TemplatedMixin", + "./_FormMixin", + "../layout/_ContentPaneResizeMixin" +], function(declare, domAttr, event, kernel, has, _Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin){ + +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _FormMixin = dijit.form._FormMixin; + var _ContentPaneResizeMixin = dijit.layout._ContentPaneResizeMixin; +=====*/ + + // module: + // dijit/form/Form + // summary: + // Widget corresponding to HTML form tag, for validation and serialization + + + return declare("dijit.form.Form", [_Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin], { + // summary: + // Widget corresponding to HTML form tag, for validation and serialization + // + // example: + // | <form data-dojo-type="dijit.form.Form" id="myForm"> + // | Name: <input type="text" name="name" /> + // | </form> + // | myObj = {name: "John Doe"}; + // | dijit.byId('myForm').set('value', myObj); + // | + // | myObj=dijit.byId('myForm').get('value'); + + // HTML <FORM> attributes + + // name: String? + // Name of form for scripting. + name: "", + + // action: String? + // Server-side form handler. + action: "", + + // method: String? + // HTTP method used to submit the form, either "GET" or "POST". + method: "", + + // encType: String? + // Encoding type for the form, ex: application/x-www-form-urlencoded. + encType: "", + + // accept-charset: String? + // List of supported charsets. + "accept-charset": "", + + // accept: String? + // List of MIME types for file upload. + accept: "", + + // target: String? + // Target frame for the document to be opened in. + target: "", + + templateString: "<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>", + + postMixInProperties: function(){ + // Setup name=foo string to be referenced from the template (but only if a name has been specified) + // Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8660 + this.nameAttrSetting = this.name ? ("name='" + this.name + "'") : ""; + this.inherited(arguments); + }, + + execute: function(/*Object*/ /*===== formContents =====*/){ + // summary: + // Deprecated: use submit() + // tags: + // deprecated + }, + + onExecute: function(){ + // summary: + // Deprecated: use onSubmit() + // tags: + // deprecated + }, + + _setEncTypeAttr: function(/*String*/ value){ + this.encType = value; + domAttr.set(this.domNode, "encType", value); + if(has("ie")){ this.domNode.encoding = value; } + }, + + reset: function(/*Event?*/ e){ + // summary: + // restores all widget values back to their init values, + // calls onReset() which can cancel the reset by returning false + + // create fake event so we can know if preventDefault() is called + var faux = { + returnValue: true, // the IE way + preventDefault: function(){ // not IE + this.returnValue = false; + }, + stopPropagation: function(){}, + currentTarget: e ? e.target : this.domNode, + target: e ? e.target : this.domNode + }; + // if return value is not exactly false, and haven't called preventDefault(), then reset + if(!(this.onReset(faux) === false) && faux.returnValue){ + this.inherited(arguments, []); + } + }, + + onReset: function(/*Event?*/ /*===== e =====*/){ + // summary: + // Callback when user resets the form. This method is intended + // to be over-ridden. When the `reset` method is called + // programmatically, the return value from `onReset` is used + // to compute whether or not resetting should proceed + // tags: + // callback + return true; // Boolean + }, + + _onReset: function(e){ + this.reset(e); + event.stop(e); + return false; + }, + + _onSubmit: function(e){ + var fp = this.constructor.prototype; + // TODO: remove this if statement beginning with 2.0 + if(this.execute != fp.execute || this.onExecute != fp.onExecute){ + kernel.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0"); + this.onExecute(); + this.execute(this.getValues()); + } + if(this.onSubmit(e) === false){ // only exactly false stops submit + event.stop(e); + } + }, + + onSubmit: function(/*Event?*/ /*===== e =====*/){ + // summary: + // Callback when user submits the form. + // description: + // This method is intended to be over-ridden, but by default it checks and + // returns the validity of form elements. When the `submit` + // method is called programmatically, the return value from + // `onSubmit` is used to compute whether or not submission + // should proceed + // tags: + // extension + + return this.isValid(); // Boolean + }, + + submit: function(){ + // summary: + // programmatically submit form if and only if the `onSubmit` returns true + if(!(this.onSubmit() === false)){ + this.containerNode.submit(); + } + } + }); +}); diff --git a/lib/dijit/form/HorizontalRule.js b/lib/dijit/form/HorizontalRule.js index e81805e6e..85c5472af 100644 --- a/lib/dijit/form/HorizontalRule.js +++ b/lib/dijit/form/HorizontalRule.js @@ -1,74 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.HorizontalRule"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.HorizontalRule"] = true; -dojo.provide("dijit.form.HorizontalRule"); -dojo.require("dijit._Widget"); -dojo.require("dijit._Templated"); - - -dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated], -{ - // summary: - // Hash marks for `dijit.form.HorizontalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>', - - // count: Integer - // Number of hash marks to generate - count: 3, - - // container: String - // For HorizontalSlider, this is either "topDecoration" or "bottomDecoration", - // and indicates whether this rule goes above or below the slider. - container: "containerNode", - - // ruleStyle: String - // CSS style to apply to individual hash marks - ruleStyle: "", - - _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkH" style="left:', - _positionSuffix: '%;', - _suffix: '"></div>', - - _genHTML: function(pos, ndx){ - return this._positionPrefix + pos + this._positionSuffix + this.ruleStyle + this._suffix; - }, - - // _isHorizontal: [protected extension] Boolean - // VerticalRule will override this... - _isHorizontal: true, - - buildRendering: function(){ - this.inherited(arguments); - - var innerHTML; - if(this.count == 1){ - innerHTML = this._genHTML(50, 0); - }else{ - var i; - var interval = 100 / (this.count-1); - if(!this._isHorizontal || this.isLeftToRight()){ - innerHTML = this._genHTML(0, 0); - for(i=1; i < this.count-1; i++){ - innerHTML += this._genHTML(interval*i, i); - } - innerHTML += this._genHTML(100, this.count-1); - }else{ - innerHTML = this._genHTML(100, 0); - for(i=1; i < this.count-1; i++){ - innerHTML += this._genHTML(100-interval*i, i); - } - innerHTML += this._genHTML(0, this.count-1); - } - } - this.domNode.innerHTML = innerHTML; - } -}); - -} +//>>built +define("dijit/form/HorizontalRule",["dojo/_base/declare","../_Widget","../_TemplatedMixin"],function(_1,_2,_3){return _1("dijit.form.HorizontalRule",[_2,_3],{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",count:3,container:"containerNode",ruleStyle:"",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkH\" style=\"left:",_positionSuffix:"%;",_suffix:"\"></div>",_genHTML:function(_4){return this._positionPrefix+_4+this._positionSuffix+this.ruleStyle+this._suffix;},_isHorizontal:true,buildRendering:function(){this.inherited(arguments);var _5;if(this.count==1){_5=this._genHTML(50,0);}else{var i;var _6=100/(this.count-1);if(!this._isHorizontal||this.isLeftToRight()){_5=this._genHTML(0,0);for(i=1;i<this.count-1;i++){_5+=this._genHTML(_6*i,i);}_5+=this._genHTML(100,this.count-1);}else{_5=this._genHTML(100,0);for(i=1;i<this.count-1;i++){_5+=this._genHTML(100-_6*i,i);}_5+=this._genHTML(0,this.count-1);}}this.domNode.innerHTML=_5;}});});
\ No newline at end of file diff --git a/lib/dijit/form/HorizontalRule.js.uncompressed.js b/lib/dijit/form/HorizontalRule.js.uncompressed.js new file mode 100644 index 000000000..a05509e69 --- /dev/null +++ b/lib/dijit/form/HorizontalRule.js.uncompressed.js @@ -0,0 +1,76 @@ +define("dijit/form/HorizontalRule", [ + "dojo/_base/declare", // declare + "../_Widget", + "../_TemplatedMixin" +], function(declare, _Widget, _TemplatedMixin){ + +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; +=====*/ + +// module: +// dijit/form/HorizontalRule +// summary: +// Hash marks for `dijit.form.HorizontalSlider` + + +return declare("dijit.form.HorizontalRule", [_Widget, _TemplatedMixin], { + // summary: + // Hash marks for `dijit.form.HorizontalSlider` + + templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>', + + // count: Integer + // Number of hash marks to generate + count: 3, + + // container: String + // For HorizontalSlider, this is either "topDecoration" or "bottomDecoration", + // and indicates whether this rule goes above or below the slider. + container: "containerNode", + + // ruleStyle: String + // CSS style to apply to individual hash marks + ruleStyle: "", + + _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkH" style="left:', + _positionSuffix: '%;', + _suffix: '"></div>', + + _genHTML: function(pos){ + return this._positionPrefix + pos + this._positionSuffix + this.ruleStyle + this._suffix; + }, + + // _isHorizontal: [protected extension] Boolean + // VerticalRule will override this... + _isHorizontal: true, + + buildRendering: function(){ + this.inherited(arguments); + + var innerHTML; + if(this.count == 1){ + innerHTML = this._genHTML(50, 0); + }else{ + var i; + var interval = 100 / (this.count-1); + if(!this._isHorizontal || this.isLeftToRight()){ + innerHTML = this._genHTML(0, 0); + for(i=1; i < this.count-1; i++){ + innerHTML += this._genHTML(interval*i, i); + } + innerHTML += this._genHTML(100, this.count-1); + }else{ + innerHTML = this._genHTML(100, 0); + for(i=1; i < this.count-1; i++){ + innerHTML += this._genHTML(100-interval*i, i); + } + innerHTML += this._genHTML(0, this.count-1); + } + } + this.domNode.innerHTML = innerHTML; + } +}); + +}); diff --git a/lib/dijit/form/HorizontalRuleLabels.js b/lib/dijit/form/HorizontalRuleLabels.js index d923e8081..be95ba019 100644 --- a/lib/dijit/form/HorizontalRuleLabels.js +++ b/lib/dijit/form/HorizontalRuleLabels.js @@ -1,97 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.HorizontalRuleLabels"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.HorizontalRuleLabels"] = true; -dojo.provide("dijit.form.HorizontalRuleLabels"); -dojo.require("dijit.form.HorizontalRule"); - - -dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.HorizontalRule, -{ - // summary: - // Labels for `dijit.form.HorizontalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH"></div>', - - // labelStyle: String - // CSS style to apply to individual text labels - labelStyle: "", - - // labels: String[]? - // Array of text labels to render - evenly spaced from left-to-right or bottom-to-top. - // Alternately, minimum and maximum can be specified, to get numeric labels. - labels: [], - - // numericMargin: Integer - // Number of generated numeric labels that should be rendered as '' on the ends when labels[] are not specified - numericMargin: 0, - - // numericMinimum: Integer - // Leftmost label value for generated numeric labels when labels[] are not specified - minimum: 0, - - // numericMaximum: Integer - // Rightmost label value for generated numeric labels when labels[] are not specified - maximum: 1, - - // constraints: Object - // pattern, places, lang, et al (see dojo.number) for generated numeric labels when labels[] are not specified - constraints: {pattern:"#%"}, - - _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerH" style="left:', - _labelPrefix: '"><div class="dijitRuleLabel dijitRuleLabelH">', - _suffix: '</div></div>', - - _calcPosition: function(pos){ - // summary: - // Returns the value to be used in HTML for the label as part of the left: attribute - // tags: - // protected extension - return pos; - }, - - _genHTML: function(pos, ndx){ - return this._positionPrefix + this._calcPosition(pos) + this._positionSuffix + this.labelStyle + this._labelPrefix + this.labels[ndx] + this._suffix; - }, - - getLabels: function(){ - // summary: - // Overridable function to return array of labels to use for this slider. - // Can specify a getLabels() method instead of a labels[] array, or min/max attributes. - // tags: - // protected extension - - // if the labels array was not specified directly, then see if <li> children were - var labels = this.labels; - if(!labels.length){ - // for markup creation, labels are specified as child elements - labels = dojo.query("> li", this.srcNodeRef).map(function(node){ - return String(node.innerHTML); - }); - } - this.srcNodeRef.innerHTML = ''; - // if the labels were not specified directly and not as <li> children, then calculate numeric labels - if(!labels.length && this.count > 1){ - var start = this.minimum; - var inc = (this.maximum - start) / (this.count-1); - for(var i=0; i < this.count; i++){ - labels.push((i < this.numericMargin || i >= (this.count-this.numericMargin)) ? '' : dojo.number.format(start, this.constraints)); - start += inc; - } - } - return labels; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - this.labels = this.getLabels(); - this.count = this.labels.length; - } -}); - -} +//>>built +define("dijit/form/HorizontalRuleLabels",["dojo/_base/declare","dojo/number","dojo/query","./HorizontalRule"],function(_1,_2,_3,_4){return _1("dijit.form.HorizontalRuleLabels",_4,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH\"></div>",labelStyle:"",labels:[],numericMargin:0,minimum:0,maximum:1,constraints:{pattern:"#%"},_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerH\" style=\"left:",_labelPrefix:"\"><div class=\"dijitRuleLabel dijitRuleLabelH\">",_suffix:"</div></div>",_calcPosition:function(_5){return _5;},_genHTML:function(_6,_7){return this._positionPrefix+this._calcPosition(_6)+this._positionSuffix+this.labelStyle+this._labelPrefix+this.labels[_7]+this._suffix;},getLabels:function(){var _8=this.labels;if(!_8.length){_8=_3("> li",this.srcNodeRef).map(function(_9){return String(_9.innerHTML);});}this.srcNodeRef.innerHTML="";if(!_8.length&&this.count>1){var _a=this.minimum;var _b=(this.maximum-_a)/(this.count-1);for(var i=0;i<this.count;i++){_8.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":_2.format(_a,this.constraints));_a+=_b;}}return _8;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});});
\ No newline at end of file diff --git a/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js new file mode 100644 index 000000000..fd4799e24 --- /dev/null +++ b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js @@ -0,0 +1,99 @@ +define("dijit/form/HorizontalRuleLabels", [ + "dojo/_base/declare", // declare + "dojo/number", // number.format + "dojo/query", // query + "./HorizontalRule" +], function(declare, number, query, HorizontalRule){ + +/*===== + var HorizontalRule = dijit.form.HorizontalRule; +=====*/ + +// module: +// dijit/form/HorizontalRuleLabels +// summary: +// Labels for `dijit.form.HorizontalSlider` + +return declare("dijit.form.HorizontalRuleLabels", HorizontalRule, { + // summary: + // Labels for `dijit.form.HorizontalSlider` + + templateString: '<div class="dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH"></div>', + + // labelStyle: String + // CSS style to apply to individual text labels + labelStyle: "", + + // labels: String[]? + // Array of text labels to render - evenly spaced from left-to-right or bottom-to-top. + // Alternately, minimum and maximum can be specified, to get numeric labels. + labels: [], + + // numericMargin: Integer + // Number of generated numeric labels that should be rendered as '' on the ends when labels[] are not specified + numericMargin: 0, + + // numericMinimum: Integer + // Leftmost label value for generated numeric labels when labels[] are not specified + minimum: 0, + + // numericMaximum: Integer + // Rightmost label value for generated numeric labels when labels[] are not specified + maximum: 1, + + // constraints: Object + // pattern, places, lang, et al (see dojo.number) for generated numeric labels when labels[] are not specified + constraints: {pattern:"#%"}, + + _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerH" style="left:', + _labelPrefix: '"><div class="dijitRuleLabel dijitRuleLabelH">', + _suffix: '</div></div>', + + _calcPosition: function(pos){ + // summary: + // Returns the value to be used in HTML for the label as part of the left: attribute + // tags: + // protected extension + return pos; + }, + + _genHTML: function(pos, ndx){ + return this._positionPrefix + this._calcPosition(pos) + this._positionSuffix + this.labelStyle + this._labelPrefix + this.labels[ndx] + this._suffix; + }, + + getLabels: function(){ + // summary: + // Overridable function to return array of labels to use for this slider. + // Can specify a getLabels() method instead of a labels[] array, or min/max attributes. + // tags: + // protected extension + + // if the labels array was not specified directly, then see if <li> children were + var labels = this.labels; + if(!labels.length){ + // for markup creation, labels are specified as child elements + labels = query("> li", this.srcNodeRef).map(function(node){ + return String(node.innerHTML); + }); + } + this.srcNodeRef.innerHTML = ''; + // if the labels were not specified directly and not as <li> children, then calculate numeric labels + if(!labels.length && this.count > 1){ + var start = this.minimum; + var inc = (this.maximum - start) / (this.count-1); + for(var i=0; i < this.count; i++){ + labels.push((i < this.numericMargin || i >= (this.count-this.numericMargin)) ? '' : number.format(start, this.constraints)); + start += inc; + } + } + return labels; + }, + + postMixInProperties: function(){ + this.inherited(arguments); + this.labels = this.getLabels(); + this.count = this.labels.length; + } +}); + +}); diff --git a/lib/dijit/form/HorizontalSlider.js b/lib/dijit/form/HorizontalSlider.js index 93dc4a0c2..cc2563171 100644 --- a/lib/dijit/form/HorizontalSlider.js +++ b/lib/dijit/form/HorizontalSlider.js @@ -1,343 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.HorizontalSlider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.HorizontalSlider"] = true; -dojo.provide("dijit.form.HorizontalSlider"); -dojo.require("dijit.form._FormWidget"); -dojo.require("dijit._Container"); -dojo.require("dojo.dnd.move"); -dojo.require("dijit.form.Button"); -dojo.require("dojo.number"); - - -dojo.declare( - "dijit.form.HorizontalSlider", - [dijit.form._FormValueWidget, dijit._Container], -{ - // summary: - // A form widget that allows one to select a value with a horizontally draggable handle - - templateString: dojo.cache("dijit.form", "templates/HorizontalSlider.html", "<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" dojoAttachPoint=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" dojoAttachEvent=\"onmousedown:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onmousedown:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" dojoAttachEvent=\"onmousedown:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" dojoAttachEvent=\"onmousedown:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" dojoAttachEvent=\"onmousedown:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" dojoAttachPoint=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"), - - // Overrides FormValueWidget.value to indicate numeric value - value: 0, - - // showButtons: [const] Boolean - // Show increment/decrement buttons at the ends of the slider? - showButtons: true, - - // minimum:: [const] Integer - // The minimum value the slider can be set to. - minimum: 0, - - // maximum: [const] Integer - // The maximum value the slider can be set to. - maximum: 100, - - // discreteValues: Integer - // If specified, indicates that the slider handle has only 'discreteValues' possible positions, - // and that after dragging the handle, it will snap to the nearest possible position. - // Thus, the slider has only 'discreteValues' possible values. - // - // For example, if minimum=10, maxiumum=30, and discreteValues=3, then the slider handle has - // three possible positions, representing values 10, 20, or 30. - // - // If discreteValues is not specified or if it's value is higher than the number of pixels - // in the slider bar, then the slider handle can be moved freely, and the slider's value will be - // computed/reported based on pixel position (in this case it will likely be fractional, - // such as 123.456789). - discreteValues: Infinity, - - // pageIncrement: Integer - // If discreteValues is also specified, this indicates the amount of clicks (ie, snap positions) - // that the slider handle is moved via pageup/pagedown keys. - // If discreteValues is not specified, it indicates the number of pixels. - pageIncrement: 2, - - // clickSelect: Boolean - // If clicking the slider bar changes the value or not - clickSelect: true, - - // slideDuration: Number - // The time in ms to take to animate the slider handle from 0% to 100%, - // when clicking the slider bar to make the handle move. - slideDuration: dijit.defaultDuration, - - // Flag to _Templated (TODO: why is this here? I see no widgets in the template.) - widgetsInTemplate: true, - - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - id: "" - }), - - baseClass: "dijitSlider", - - // Apply CSS classes to up/down arrows and handle per mouse state - cssStateNodes: { - incrementButton: "dijitSliderIncrementButton", - decrementButton: "dijitSliderDecrementButton", - focusNode: "dijitSliderThumb" - }, - - _mousePixelCoord: "pageX", - _pixelCount: "w", - _startingPixelCoord: "x", - _startingPixelCount: "l", - _handleOffsetCoord: "left", - _progressPixelSize: "width", - - _onKeyUp: function(/*Event*/ e){ - if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; } - this._setValueAttr(this.value, true); - }, - - _onKeyPress: function(/*Event*/ e){ - if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; } - switch(e.charOrCode){ - case dojo.keys.HOME: - this._setValueAttr(this.minimum, false); - break; - case dojo.keys.END: - this._setValueAttr(this.maximum, false); - break; - // this._descending === false: if ascending vertical (min on top) - // (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical - case ((this._descending || this.isLeftToRight()) ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW): - case (this._descending === false ? dojo.keys.DOWN_ARROW : dojo.keys.UP_ARROW): - case (this._descending === false ? dojo.keys.PAGE_DOWN : dojo.keys.PAGE_UP): - this.increment(e); - break; - case ((this._descending || this.isLeftToRight()) ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW): - case (this._descending === false ? dojo.keys.UP_ARROW : dojo.keys.DOWN_ARROW): - case (this._descending === false ? dojo.keys.PAGE_UP : dojo.keys.PAGE_DOWN): - this.decrement(e); - break; - default: - return; - } - dojo.stopEvent(e); - }, - - _onHandleClick: function(e){ - if(this.disabled || this.readOnly){ return; } - if(!dojo.isIE){ - // make sure you get focus when dragging the handle - // (but don't do on IE because it causes a flicker on mouse up (due to blur then focus) - dijit.focus(this.sliderHandle); - } - dojo.stopEvent(e); - }, - - _isReversed: function(){ - // summary: - // Returns true if direction is from right to left - // tags: - // protected extension - return !this.isLeftToRight(); - }, - - _onBarClick: function(e){ - if(this.disabled || this.readOnly || !this.clickSelect){ return; } - dijit.focus(this.sliderHandle); - dojo.stopEvent(e); - var abspos = dojo.position(this.sliderBarContainer, true); - var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord]; - this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true); - this._movable.onMouseDown(e); - }, - - _setPixelValue: function(/*Number*/ pixelValue, /*Number*/ maxPixels, /*Boolean?*/ priorityChange){ - if(this.disabled || this.readOnly){ return; } - pixelValue = pixelValue < 0 ? 0 : maxPixels < pixelValue ? maxPixels : pixelValue; - var count = this.discreteValues; - if(count <= 1 || count == Infinity){ count = maxPixels; } - count--; - var pixelsPerValue = maxPixels / count; - var wholeIncrements = Math.round(pixelValue / pixelsPerValue); - this._setValueAttr((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, priorityChange); - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', value) works. - this._set("value", value); - this.valueNode.value = value; - dijit.setWaiState(this.focusNode, "valuenow", value); - this.inherited(arguments); - var percent = (value - this.minimum) / (this.maximum - this.minimum); - var progressBar = (this._descending === false) ? this.remainingBar : this.progressBar; - var remainingBar = (this._descending === false) ? this.progressBar : this.remainingBar; - if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){ - this._inProgressAnim.stop(true); - } - if(priorityChange && this.slideDuration > 0 && progressBar.style[this._progressPixelSize]){ - // animate the slider - var _this = this; - var props = {}; - var start = parseFloat(progressBar.style[this._progressPixelSize]); - var duration = this.slideDuration * (percent-start/100); - if(duration == 0){ return; } - if(duration < 0){ duration = 0 - duration; } - props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" }; - this._inProgressAnim = dojo.animateProperty({ node: progressBar, duration: duration, - onAnimate: function(v){ remainingBar.style[_this._progressPixelSize] = (100-parseFloat(v[_this._progressPixelSize])) + "%"; }, - onEnd: function(){ delete _this._inProgressAnim; }, - properties: props - }) - this._inProgressAnim.play(); - }else{ - progressBar.style[this._progressPixelSize] = (percent*100) + "%"; - remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%"; - } - }, - - _bumpValue: function(signedChange, /*Boolean?*/ priorityChange){ - if(this.disabled || this.readOnly){ return; } - var s = dojo.getComputedStyle(this.sliderBarContainer); - var c = dojo._getContentBox(this.sliderBarContainer, s); - var count = this.discreteValues; - if(count <= 1 || count == Infinity){ count = c[this._pixelCount]; } - count--; - var value = (this.value - this.minimum) * count / (this.maximum - this.minimum) + signedChange; - if(value < 0){ value = 0; } - if(value > count){ value = count; } - value = value * (this.maximum - this.minimum) / count + this.minimum; - this._setValueAttr(value, priorityChange); - }, - - _onClkBumper: function(val){ - if(this.disabled || this.readOnly || !this.clickSelect){ return; } - this._setValueAttr(val, true); - }, - - _onClkIncBumper: function(){ - this._onClkBumper(this._descending === false ? this.minimum : this.maximum); - }, - - _onClkDecBumper: function(){ - this._onClkBumper(this._descending === false ? this.maximum : this.minimum); - }, - - decrement: function(/*Event*/ e){ - // summary: - // Decrement slider - // tags: - // private - this._bumpValue(e.charOrCode == dojo.keys.PAGE_DOWN ? -this.pageIncrement : -1); - }, - - increment: function(/*Event*/ e){ - // summary: - // Increment slider - // tags: - // private - this._bumpValue(e.charOrCode == dojo.keys.PAGE_UP ? this.pageIncrement : 1); - }, - - _mouseWheeled: function(/*Event*/ evt){ - // summary: - // Event handler for mousewheel where supported - dojo.stopEvent(evt); - var janky = !dojo.isMozilla; - var scroll = evt[(janky ? "wheelDelta" : "detail")] * (janky ? 1 : -1); - this._bumpValue(scroll < 0 ? -1 : 1, true); // negative scroll acts like a decrement - }, - - startup: function(){ - if(this._started){ return; } - - dojo.forEach(this.getChildren(), function(child){ - if(this[child.container] != this.containerNode){ - this[child.container].appendChild(child.domNode); - } - }, this); - - this.inherited(arguments); - }, - - _typematicCallback: function(/*Number*/ count, /*Object*/ button, /*Event*/ e){ - if(count == -1){ - this._setValueAttr(this.value, true); - }else{ - this[(button == (this._descending? this.incrementButton : this.decrementButton)) ? "decrement" : "increment"](e); - } - }, - - buildRendering: function(){ - this.inherited(arguments); - if(this.showButtons){ - this.incrementButton.style.display=""; - this.decrementButton.style.display=""; - } - - // find any associated label element and add to slider focusnode. - var label = dojo.query('label[for="'+this.id+'"]'); - if(label.length){ - label[0].id = (this.id+"_label"); - dijit.setWaiState(this.focusNode, "labelledby", label[0].id); - } - - dijit.setWaiState(this.focusNode, "valuemin", this.minimum); - dijit.setWaiState(this.focusNode, "valuemax", this.maximum); - }, - - postCreate: function(){ - this.inherited(arguments); - - if(this.showButtons){ - this._connects.push(dijit.typematic.addMouseListener( - this.decrementButton, this, "_typematicCallback", 25, 500)); - this._connects.push(dijit.typematic.addMouseListener( - this.incrementButton, this, "_typematicCallback", 25, 500)); - } - this.connect(this.domNode, !dojo.isMozilla ? "onmousewheel" : "DOMMouseScroll", "_mouseWheeled"); - - // define a custom constructor for a SliderMover that points back to me - var mover = dojo.declare(dijit.form._SliderMover, { - widget: this - }); - this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover}); - - this._layoutHackIE7(); - }, - - destroy: function(){ - this._movable.destroy(); - if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){ - this._inProgressAnim.stop(true); - } - this._supportingWidgets = dijit.findWidgets(this.domNode); // tells destroy about pseudo-child widgets (ruler/labels) - this.inherited(arguments); - } -}); - -dojo.declare("dijit.form._SliderMover", - dojo.dnd.Mover, -{ - onMouseMove: function(e){ - var widget = this.widget; - var abspos = widget._abspos; - if(!abspos){ - abspos = widget._abspos = dojo.position(widget.sliderBarContainer, true); - widget._setPixelValue_ = dojo.hitch(widget, "_setPixelValue"); - widget._isReversed_ = widget._isReversed(); - } - var coordEvent = e.touches ? e.touches[0] : e, // if multitouch take first touch for coords - pixelValue = coordEvent[widget._mousePixelCoord] - abspos[widget._startingPixelCoord]; - widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false); - }, - - destroy: function(e){ - dojo.dnd.Mover.prototype.destroy.apply(this, arguments); - var widget = this.widget; - widget._abspos = null; - widget._setValueAttr(widget.value, true); - } -}); - -} +//>>built +require({cache:{"url:dijit/form/templates/HorizontalSlider.html":"<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" data-dojo-attach-event=\"press:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"}});define("dijit/form/HorizontalSlider",["dojo/_base/array","dojo/_base/declare","dojo/dnd/move","dojo/_base/event","dojo/_base/fx","dojo/dom-geometry","dojo/dom-style","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/dnd/Moveable","dojo/dnd/Mover","dojo/query","../registry","../focus","../typematic","./Button","./_FormValueWidget","../_Container","dojo/text!./templates/HorizontalSlider.html"],function(_1,_2,_3,_4,fx,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13){var _14=_2("dijit.form._SliderMover",_b,{onMouseMove:function(e){var _15=this.widget;var _16=_15._abspos;if(!_16){_16=_15._abspos=_5.position(_15.sliderBarContainer,true);_15._setPixelValue_=_8.hitch(_15,"_setPixelValue");_15._isReversed_=_15._isReversed();}var _17=e[_15._mousePixelCoord]-_16[_15._startingPixelCoord];_15._setPixelValue_(_15._isReversed_?(_16[_15._pixelCount]-_17):_17,_16[_15._pixelCount],false);},destroy:function(e){_b.prototype.destroy.apply(this,arguments);var _18=this.widget;_18._abspos=null;_18._setValueAttr(_18.value,true);}});var _19=_2("dijit.form.HorizontalSlider",[_11,_12],{templateString:_13,value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:_d.defaultDuration,_setIdAttr:"",baseClass:"dijitSlider",cssStateNodes:{incrementButton:"dijitSliderIncrementButton",decrementButton:"dijitSliderDecrementButton",focusNode:"dijitSliderThumb"},_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_handleOffsetCoord:"left",_progressPixelSize:"width",_onKeyUp:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}this._setValueAttr(this.value,true);},_onKeyPress:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}switch(e.charOrCode){case _7.HOME:this._setValueAttr(this.minimum,false);break;case _7.END:this._setValueAttr(this.maximum,false);break;case ((this._descending||this.isLeftToRight())?_7.RIGHT_ARROW:_7.LEFT_ARROW):case (this._descending===false?_7.DOWN_ARROW:_7.UP_ARROW):case (this._descending===false?_7.PAGE_DOWN:_7.PAGE_UP):this.increment(e);break;case ((this._descending||this.isLeftToRight())?_7.LEFT_ARROW:_7.RIGHT_ARROW):case (this._descending===false?_7.UP_ARROW:_7.DOWN_ARROW):case (this._descending===false?_7.PAGE_UP:_7.PAGE_DOWN):this.decrement(e);break;default:return;}_4.stop(e);},_onHandleClick:function(e){if(this.disabled||this.readOnly){return;}if(!_9("ie")){_e.focus(this.sliderHandle);}_4.stop(e);},_isReversed:function(){return !this.isLeftToRight();},_onBarClick:function(e){if(this.disabled||this.readOnly||!this.clickSelect){return;}_e.focus(this.sliderHandle);_4.stop(e);var _1a=_5.position(this.sliderBarContainer,true);var _1b=e[this._mousePixelCoord]-_1a[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_1a[this._pixelCount]-_1b):_1b,_1a[this._pixelCount],true);this._movable.onMouseDown(e);},_setPixelValue:function(_1c,_1d,_1e){if(this.disabled||this.readOnly){return;}var _1f=this.discreteValues;if(_1f<=1||_1f==Infinity){_1f=_1d;}_1f--;var _20=_1d/_1f;var _21=Math.round(_1c/_20);this._setValueAttr(Math.max(Math.min((this.maximum-this.minimum)*_21/_1f+this.minimum,this.maximum),this.minimum),_1e);},_setValueAttr:function(_22,_23){this._set("value",_22);this.valueNode.value=_22;this.focusNode.setAttribute("aria-valuenow",_22);this.inherited(arguments);var _24=(_22-this.minimum)/(this.maximum-this.minimum);var _25=(this._descending===false)?this.remainingBar:this.progressBar;var _26=(this._descending===false)?this.progressBar:this.remainingBar;if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}if(_23&&this.slideDuration>0&&_25.style[this._progressPixelSize]){var _27=this;var _28={};var _29=parseFloat(_25.style[this._progressPixelSize]);var _2a=this.slideDuration*(_24-_29/100);if(_2a==0){return;}if(_2a<0){_2a=0-_2a;}_28[this._progressPixelSize]={start:_29,end:_24*100,units:"%"};this._inProgressAnim=fx.animateProperty({node:_25,duration:_2a,onAnimate:function(v){_26.style[_27._progressPixelSize]=(100-parseFloat(v[_27._progressPixelSize]))+"%";},onEnd:function(){delete _27._inProgressAnim;},properties:_28});this._inProgressAnim.play();}else{_25.style[this._progressPixelSize]=(_24*100)+"%";_26.style[this._progressPixelSize]=((1-_24)*100)+"%";}},_bumpValue:function(_2b,_2c){if(this.disabled||this.readOnly){return;}var s=_6.getComputedStyle(this.sliderBarContainer);var c=_5.getContentBox(this.sliderBarContainer,s);var _2d=this.discreteValues;if(_2d<=1||_2d==Infinity){_2d=c[this._pixelCount];}_2d--;var _2e=(this.value-this.minimum)*_2d/(this.maximum-this.minimum)+_2b;if(_2e<0){_2e=0;}if(_2e>_2d){_2e=_2d;}_2e=_2e*(this.maximum-this.minimum)/_2d+this.minimum;this._setValueAttr(_2e,_2c);},_onClkBumper:function(val){if(this.disabled||this.readOnly||!this.clickSelect){return;}this._setValueAttr(val,true);},_onClkIncBumper:function(){this._onClkBumper(this._descending===false?this.minimum:this.maximum);},_onClkDecBumper:function(){this._onClkBumper(this._descending===false?this.maximum:this.minimum);},decrement:function(e){this._bumpValue(e.charOrCode==_7.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.charOrCode==_7.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){_4.stop(evt);var _2f=!_9("mozilla");var _30=evt[(_2f?"wheelDelta":"detail")]*(_2f?1:-1);this._bumpValue(_30<0?-1:1,true);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),function(_31){if(this[_31.container]!=this.containerNode){this[_31.container].appendChild(_31.domNode);}},this);this.inherited(arguments);},_typematicCallback:function(_32,_33,e){if(_32==-1){this._setValueAttr(this.value,true);}else{this[(_33==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);}},buildRendering:function(){this.inherited(arguments);if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";}var _34=_c("label[for=\""+this.id+"\"]");if(_34.length){_34[0].id=(this.id+"_label");this.focusNode.setAttribute("aria-labelledby",_34[0].id);}this.focusNode.setAttribute("aria-valuemin",this.minimum);this.focusNode.setAttribute("aria-valuemax",this.maximum);},postCreate:function(){this.inherited(arguments);if(this.showButtons){this._connects.push(_f.addMouseListener(this.decrementButton,this,"_typematicCallback",25,500));this._connects.push(_f.addMouseListener(this.incrementButton,this,"_typematicCallback",25,500));}this.connect(this.domNode,!_9("mozilla")?"onmousewheel":"DOMMouseScroll","_mouseWheeled");var _35=_2(_14,{widget:this});this._movable=new _a(this.sliderHandle,{mover:_35});this._layoutHackIE7();},destroy:function(){this._movable.destroy();if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}this._supportingWidgets=_d.findWidgets(this.domNode);this.inherited(arguments);}});_19._Mover=_14;return _19;});
\ No newline at end of file diff --git a/lib/dijit/form/HorizontalSlider.js.uncompressed.js b/lib/dijit/form/HorizontalSlider.js.uncompressed.js new file mode 100644 index 000000000..0c4031b37 --- /dev/null +++ b/lib/dijit/form/HorizontalSlider.js.uncompressed.js @@ -0,0 +1,359 @@ +require({cache:{ +'url:dijit/form/templates/HorizontalSlider.html':"<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" data-dojo-attach-event=\"press:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"}}); +define("dijit/form/HorizontalSlider", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dnd/move", + "dojo/_base/event", // event.stop + "dojo/_base/fx", // fx.animateProperty + "dojo/dom-geometry", // domGeometry.position + "dojo/dom-style", // domStyle.getComputedStyle + "dojo/keys", // keys.DOWN_ARROW keys.END keys.HOME keys.LEFT_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.RIGHT_ARROW keys.UP_ARROW + "dojo/_base/lang", // lang.hitch + "dojo/_base/sniff", // has("ie") has("mozilla") + "dojo/dnd/Moveable", // Moveable + "dojo/dnd/Mover", // Mover Mover.prototype.destroy.apply + "dojo/query", // query + "../registry", // registry.findWidgets + "../focus", // focus.focus() + "../typematic", + "./Button", + "./_FormValueWidget", + "../_Container", + "dojo/text!./templates/HorizontalSlider.html" +], function(array, declare, move, event, fx, domGeometry, domStyle, keys, lang, has, Moveable, Mover, query, + registry, focus, typematic, Button, _FormValueWidget, _Container, template){ + +/*===== + var Button = dijit.form.Button; + var _FormValueWidget = dijit.form._FormValueWidget; + var _Container = dijit._Container; +=====*/ + +// module: +// dijit/form/HorizontalSlider +// summary: +// A form widget that allows one to select a value with a horizontally draggable handle + + +var _SliderMover = declare("dijit.form._SliderMover", Mover, { + onMouseMove: function(e){ + var widget = this.widget; + var abspos = widget._abspos; + if(!abspos){ + abspos = widget._abspos = domGeometry.position(widget.sliderBarContainer, true); + widget._setPixelValue_ = lang.hitch(widget, "_setPixelValue"); + widget._isReversed_ = widget._isReversed(); + } + var pixelValue = e[widget._mousePixelCoord] - abspos[widget._startingPixelCoord]; + widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false); + }, + + destroy: function(e){ + Mover.prototype.destroy.apply(this, arguments); + var widget = this.widget; + widget._abspos = null; + widget._setValueAttr(widget.value, true); + } +}); + +var HorizontalSlider = declare("dijit.form.HorizontalSlider", [_FormValueWidget, _Container], { + // summary: + // A form widget that allows one to select a value with a horizontally draggable handle + + templateString: template, + + // Overrides FormValueWidget.value to indicate numeric value + value: 0, + + // showButtons: [const] Boolean + // Show increment/decrement buttons at the ends of the slider? + showButtons: true, + + // minimum:: [const] Integer + // The minimum value the slider can be set to. + minimum: 0, + + // maximum: [const] Integer + // The maximum value the slider can be set to. + maximum: 100, + + // discreteValues: Integer + // If specified, indicates that the slider handle has only 'discreteValues' possible positions, + // and that after dragging the handle, it will snap to the nearest possible position. + // Thus, the slider has only 'discreteValues' possible values. + // + // For example, if minimum=10, maxiumum=30, and discreteValues=3, then the slider handle has + // three possible positions, representing values 10, 20, or 30. + // + // If discreteValues is not specified or if it's value is higher than the number of pixels + // in the slider bar, then the slider handle can be moved freely, and the slider's value will be + // computed/reported based on pixel position (in this case it will likely be fractional, + // such as 123.456789). + discreteValues: Infinity, + + // pageIncrement: Integer + // If discreteValues is also specified, this indicates the amount of clicks (ie, snap positions) + // that the slider handle is moved via pageup/pagedown keys. + // If discreteValues is not specified, it indicates the number of pixels. + pageIncrement: 2, + + // clickSelect: Boolean + // If clicking the slider bar changes the value or not + clickSelect: true, + + // slideDuration: Number + // The time in ms to take to animate the slider handle from 0% to 100%, + // when clicking the slider bar to make the handle move. + slideDuration: registry.defaultDuration, + + // Map widget attributes to DOMNode attributes. + _setIdAttr: "", // Override _FormWidget which sends id to focusNode + + baseClass: "dijitSlider", + + // Apply CSS classes to up/down arrows and handle per mouse state + cssStateNodes: { + incrementButton: "dijitSliderIncrementButton", + decrementButton: "dijitSliderDecrementButton", + focusNode: "dijitSliderThumb" + }, + + _mousePixelCoord: "pageX", + _pixelCount: "w", + _startingPixelCoord: "x", + _handleOffsetCoord: "left", + _progressPixelSize: "width", + + _onKeyUp: function(/*Event*/ e){ + if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; } + this._setValueAttr(this.value, true); + }, + + _onKeyPress: function(/*Event*/ e){ + if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; } + switch(e.charOrCode){ + case keys.HOME: + this._setValueAttr(this.minimum, false); + break; + case keys.END: + this._setValueAttr(this.maximum, false); + break; + // this._descending === false: if ascending vertical (min on top) + // (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical + case ((this._descending || this.isLeftToRight()) ? keys.RIGHT_ARROW : keys.LEFT_ARROW): + case (this._descending === false ? keys.DOWN_ARROW : keys.UP_ARROW): + case (this._descending === false ? keys.PAGE_DOWN : keys.PAGE_UP): + this.increment(e); + break; + case ((this._descending || this.isLeftToRight()) ? keys.LEFT_ARROW : keys.RIGHT_ARROW): + case (this._descending === false ? keys.UP_ARROW : keys.DOWN_ARROW): + case (this._descending === false ? keys.PAGE_UP : keys.PAGE_DOWN): + this.decrement(e); + break; + default: + return; + } + event.stop(e); + }, + + _onHandleClick: function(e){ + if(this.disabled || this.readOnly){ return; } + if(!has("ie")){ + // make sure you get focus when dragging the handle + // (but don't do on IE because it causes a flicker on mouse up (due to blur then focus) + focus.focus(this.sliderHandle); + } + event.stop(e); + }, + + _isReversed: function(){ + // summary: + // Returns true if direction is from right to left + // tags: + // protected extension + return !this.isLeftToRight(); + }, + + _onBarClick: function(e){ + if(this.disabled || this.readOnly || !this.clickSelect){ return; } + focus.focus(this.sliderHandle); + event.stop(e); + var abspos = domGeometry.position(this.sliderBarContainer, true); + var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord]; + this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true); + this._movable.onMouseDown(e); + }, + + _setPixelValue: function(/*Number*/ pixelValue, /*Number*/ maxPixels, /*Boolean?*/ priorityChange){ + if(this.disabled || this.readOnly){ return; } + var count = this.discreteValues; + if(count <= 1 || count == Infinity){ count = maxPixels; } + count--; + var pixelsPerValue = maxPixels / count; + var wholeIncrements = Math.round(pixelValue / pixelsPerValue); + this._setValueAttr(Math.max(Math.min((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, this.maximum), this.minimum), priorityChange); + }, + + _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('value', value) works. + this._set("value", value); + this.valueNode.value = value; + this.focusNode.setAttribute("aria-valuenow", value); + this.inherited(arguments); + var percent = (value - this.minimum) / (this.maximum - this.minimum); + var progressBar = (this._descending === false) ? this.remainingBar : this.progressBar; + var remainingBar = (this._descending === false) ? this.progressBar : this.remainingBar; + if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){ + this._inProgressAnim.stop(true); + } + if(priorityChange && this.slideDuration > 0 && progressBar.style[this._progressPixelSize]){ + // animate the slider + var _this = this; + var props = {}; + var start = parseFloat(progressBar.style[this._progressPixelSize]); + var duration = this.slideDuration * (percent-start/100); + if(duration == 0){ return; } + if(duration < 0){ duration = 0 - duration; } + props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" }; + this._inProgressAnim = fx.animateProperty({ node: progressBar, duration: duration, + onAnimate: function(v){ + remainingBar.style[_this._progressPixelSize] = (100 - parseFloat(v[_this._progressPixelSize])) + "%"; + }, + onEnd: function(){ + delete _this._inProgressAnim; + }, + properties: props + }); + this._inProgressAnim.play(); + }else{ + progressBar.style[this._progressPixelSize] = (percent*100) + "%"; + remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%"; + } + }, + + _bumpValue: function(signedChange, /*Boolean?*/ priorityChange){ + if(this.disabled || this.readOnly){ return; } + var s = domStyle.getComputedStyle(this.sliderBarContainer); + var c = domGeometry.getContentBox(this.sliderBarContainer, s); + var count = this.discreteValues; + if(count <= 1 || count == Infinity){ count = c[this._pixelCount]; } + count--; + var value = (this.value - this.minimum) * count / (this.maximum - this.minimum) + signedChange; + if(value < 0){ value = 0; } + if(value > count){ value = count; } + value = value * (this.maximum - this.minimum) / count + this.minimum; + this._setValueAttr(value, priorityChange); + }, + + _onClkBumper: function(val){ + if(this.disabled || this.readOnly || !this.clickSelect){ return; } + this._setValueAttr(val, true); + }, + + _onClkIncBumper: function(){ + this._onClkBumper(this._descending === false ? this.minimum : this.maximum); + }, + + _onClkDecBumper: function(){ + this._onClkBumper(this._descending === false ? this.maximum : this.minimum); + }, + + decrement: function(/*Event*/ e){ + // summary: + // Decrement slider + // tags: + // private + this._bumpValue(e.charOrCode == keys.PAGE_DOWN ? -this.pageIncrement : -1); + }, + + increment: function(/*Event*/ e){ + // summary: + // Increment slider + // tags: + // private + this._bumpValue(e.charOrCode == keys.PAGE_UP ? this.pageIncrement : 1); + }, + + _mouseWheeled: function(/*Event*/ evt){ + // summary: + // Event handler for mousewheel where supported + event.stop(evt); + var janky = !has("mozilla"); + var scroll = evt[(janky ? "wheelDelta" : "detail")] * (janky ? 1 : -1); + this._bumpValue(scroll < 0 ? -1 : 1, true); // negative scroll acts like a decrement + }, + + startup: function(){ + if(this._started){ return; } + + array.forEach(this.getChildren(), function(child){ + if(this[child.container] != this.containerNode){ + this[child.container].appendChild(child.domNode); + } + }, this); + + this.inherited(arguments); + }, + + _typematicCallback: function(/*Number*/ count, /*Object*/ button, /*Event*/ e){ + if(count == -1){ + this._setValueAttr(this.value, true); + }else{ + this[(button == (this._descending? this.incrementButton : this.decrementButton)) ? "decrement" : "increment"](e); + } + }, + + buildRendering: function(){ + this.inherited(arguments); + if(this.showButtons){ + this.incrementButton.style.display=""; + this.decrementButton.style.display=""; + } + + // find any associated label element and add to slider focusnode. + var label = query('label[for="'+this.id+'"]'); + if(label.length){ + label[0].id = (this.id+"_label"); + this.focusNode.setAttribute("aria-labelledby", label[0].id); + } + + this.focusNode.setAttribute("aria-valuemin", this.minimum); + this.focusNode.setAttribute("aria-valuemax", this.maximum); + }, + + postCreate: function(){ + this.inherited(arguments); + + if(this.showButtons){ + this._connects.push(typematic.addMouseListener( + this.decrementButton, this, "_typematicCallback", 25, 500)); + this._connects.push(typematic.addMouseListener( + this.incrementButton, this, "_typematicCallback", 25, 500)); + } + this.connect(this.domNode, !has("mozilla") ? "onmousewheel" : "DOMMouseScroll", "_mouseWheeled"); + + // define a custom constructor for a SliderMover that points back to me + var mover = declare(_SliderMover, { + widget: this + }); + this._movable = new Moveable(this.sliderHandle, {mover: mover}); + + this._layoutHackIE7(); + }, + + destroy: function(){ + this._movable.destroy(); + if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){ + this._inProgressAnim.stop(true); + } + this._supportingWidgets = registry.findWidgets(this.domNode); // tells destroy about pseudo-child widgets (ruler/labels) + this.inherited(arguments); + } +}); + +HorizontalSlider._Mover = _SliderMover; // for monkey patching + +return HorizontalSlider; +}); diff --git a/lib/dijit/form/MappedTextBox.js b/lib/dijit/form/MappedTextBox.js index ebdaaf15b..ecd78995c 100644 --- a/lib/dijit/form/MappedTextBox.js +++ b/lib/dijit/form/MappedTextBox.js @@ -1,15 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.MappedTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.MappedTextBox"] = true; -dojo.provide("dijit.form.MappedTextBox"); -dojo.require("dijit.form.ValidationTextBox"); - - - -} +//>>built +define("dijit/form/MappedTextBox",["dojo/_base/declare","dojo/dom-construct","./ValidationTextBox"],function(_1,_2,_3){return _1("dijit.form.MappedTextBox",_3,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},_setNameAttr:null,serialize:function(_4){return _4.toString?_4.toString():"";},toString:function(){var _5=this.filter(this.get("value"));return _5!=null?(typeof _5=="string"?_5:this.serialize(_5,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=_2.place("<input type='hidden'"+(this.name?" name='"+this.name.replace(/'/g,""")+"'":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/MappedTextBox.js.uncompressed.js b/lib/dijit/form/MappedTextBox.js.uncompressed.js new file mode 100644 index 000000000..2f8f69d19 --- /dev/null +++ b/lib/dijit/form/MappedTextBox.js.uncompressed.js @@ -0,0 +1,89 @@ +define("dijit/form/MappedTextBox", [ + "dojo/_base/declare", // declare + "dojo/dom-construct", // domConstruct.place + "./ValidationTextBox" +], function(declare, domConstruct, ValidationTextBox){ + +/*===== + var ValidationTextBox = dijit.form.ValidationTextBox; +=====*/ + + // module: + // dijit/form/MappedTextBox + // summary: + // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have + // a visible formatted display value, and a serializable + // value in a hidden input field which is actually sent to the server. + + return declare("dijit.form.MappedTextBox", ValidationTextBox, { + // summary: + // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have + // a visible formatted display value, and a serializable + // value in a hidden input field which is actually sent to the server. + // description: + // The visible display may + // be locale-dependent and interactive. The value sent to the server is stored in a hidden + // input field which uses the `name` attribute declared by the original widget. That value sent + // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically + // locale-neutral. + // tags: + // protected + + postMixInProperties: function(){ + this.inherited(arguments); + + // we want the name attribute to go to the hidden <input>, not the displayed <input>, + // so override _FormWidget.postMixInProperties() setting of nameAttrSetting + this.nameAttrSetting = ""; + }, + + // Override default behavior to assign name to focusNode + _setNameAttr: null, + + serialize: function(val /*=====, options =====*/){ + // summary: + // Overridable function used to convert the get('value') result to a canonical + // (non-localized) string. For example, will print dates in ISO format, and + // numbers the same way as they are represented in javascript. + // val: anything + // options: Object? + // tags: + // protected extension + return val.toString ? val.toString() : ""; // String + }, + + toString: function(){ + // summary: + // Returns widget as a printable string using the widget's value + // tags: + // protected + var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized + return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String + }, + + validate: function(){ + // Overrides `dijit.form.TextBox.validate` + this.valueNode.value = this.toString(); + return this.inherited(arguments); + }, + + buildRendering: function(){ + // Overrides `dijit._TemplatedMixin.buildRendering` + + this.inherited(arguments); + + // Create a hidden <input> node with the serialized value used for submit + // (as opposed to the displayed value). + // Passing in name as markup rather than calling domConstruct.create() with an attrs argument + // to make query(input[name=...]) work on IE. (see #8660) + this.valueNode = domConstruct.place("<input type='hidden'" + (this.name ? " name='" + this.name.replace(/'/g, """) + "'" : "") + "/>", this.textbox, "after"); + }, + + reset: function(){ + // Overrides `dijit.form.ValidationTextBox.reset` to + // reset the hidden textbox value to '' + this.valueNode.value = ''; + this.inherited(arguments); + } + }); +}); diff --git a/lib/dijit/form/MultiSelect.js b/lib/dijit/form/MultiSelect.js index 12f3b40e7..da76fed00 100644 --- a/lib/dijit/form/MultiSelect.js +++ b/lib/dijit/form/MultiSelect.js @@ -1,119 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.MultiSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.MultiSelect"] = true; -dojo.provide("dijit.form.MultiSelect"); -dojo.require("dijit.form._FormWidget"); - - -dojo.declare("dijit.form.MultiSelect", dijit.form._FormValueWidget, { - // summary: - // Widget version of a <select multiple=true> element, - // for selecting multiple options. - - // size: Number - // Number of elements to display on a page - // NOTE: may be removed in version 2.0, since elements may have variable height; - // set the size via style="..." or CSS class names instead. - size: 7, - - templateString: "<select multiple='true' ${!nameAttrSetting} dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>", - - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - size: "focusNode" - }), - - reset: function(){ - // summary: - // Reset the widget's value to what it was at initialization time - - // TODO: once we inherit from FormValueWidget this won't be needed - this._hasBeenBlurred = false; - this._setValueAttr(this._resetValue, true); - }, - - addSelected: function(/*dijit.form.MultiSelect*/ select){ - // summary: - // Move the selected nodes of a passed Select widget - // instance to this Select widget. - // - // example: - // | // move all the selected values from "bar" to "foo" - // | dijit.byId("foo").addSelected(dijit.byId("bar")); - - select.getSelected().forEach(function(n){ - this.containerNode.appendChild(n); - // scroll to bottom to see item - // cannot use scrollIntoView since <option> tags don't support all attributes - // does not work on IE due to a bug where <select> always shows scrollTop = 0 - this.domNode.scrollTop = this.domNode.offsetHeight; // overshoot will be ignored - // scrolling the source select is trickier esp. on safari who forgets to change the scrollbar size - var oldscroll = select.domNode.scrollTop; - select.domNode.scrollTop = 0; - select.domNode.scrollTop = oldscroll; - },this); - }, - - getSelected: function(){ - // summary: - // Access the NodeList of the selected options directly - return dojo.query("option",this.containerNode).filter(function(n){ - return n.selected; // Boolean - }); // dojo.NodeList - }, - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works. - // description: - // Returns an array of the selected options' values. - return this.getSelected().map(function(n){ - return n.value; - }); - }, - - multiple: true, // for Form - - _setValueAttr: function(/*Array*/ values){ - // summary: - // Hook so set('value', values) works. - // description: - // Set the value(s) of this Select based on passed values - dojo.query("option",this.containerNode).forEach(function(n){ - n.selected = (dojo.indexOf(values,n.value) != -1); - }); - }, - - invertSelection: function(onChange){ - // summary: - // Invert the selection - // onChange: Boolean - // If null, onChange is not fired. - dojo.query("option",this.containerNode).forEach(function(n){ - n.selected = !n.selected; - }); - this._handleOnChange(this.get('value'), onChange == true); - }, - - _onChange: function(/*Event*/ e){ - this._handleOnChange(this.get('value'), true); - }, - - // for layout widgets: - resize: function(/*Object*/ size){ - if(size){ - dojo.marginBox(this.domNode, size); - } - }, - - postCreate: function(){ - this._onChange(); - } -}); - -} +//>>built +define("dijit/form/MultiSelect",["dojo/_base/array","dojo/_base/declare","dojo/dom-geometry","dojo/query","./_FormValueWidget"],function(_1,_2,_3,_4,_5){return _2("dijit.form.MultiSelect",_5,{size:7,templateString:"<select multiple='true' ${!nameAttrSetting} data-dojo-attach-point='containerNode,focusNode' data-dojo-attach-event='onchange: _onChange'></select>",addSelected:function(_6){_6.getSelected().forEach(function(n){this.containerNode.appendChild(n);this.domNode.scrollTop=this.domNode.offsetHeight;var _7=_6.domNode.scrollTop;_6.domNode.scrollTop=0;_6.domNode.scrollTop=_7;},this);this._set("value",this.get("value"));},getSelected:function(){return _4("option",this.containerNode).filter(function(n){return n.selected;});},_getValueAttr:function(){return _1.map(this.getSelected(),function(n){return n.value;});},multiple:true,_setValueAttr:function(_8,_9){_4("option",this.containerNode).forEach(function(n){n.selected=(_1.indexOf(_8,n.value)!=-1);});this.inherited(arguments);},invertSelection:function(_a){var _b=[];_4("option",this.containerNode).forEach(function(n){if(!n.selected){_b.push(n.value);}});this._setValueAttr(_b,!(_a===false||_a==null));},_onChange:function(){this._handleOnChange(this.get("value"),true);},resize:function(_c){if(_c){_3.setMarginBox(this.domNode,_c);}},postCreate:function(){this._set("value",this.get("value"));this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/MultiSelect.js.uncompressed.js b/lib/dijit/form/MultiSelect.js.uncompressed.js new file mode 100644 index 000000000..c47064641 --- /dev/null +++ b/lib/dijit/form/MultiSelect.js.uncompressed.js @@ -0,0 +1,118 @@ +define("dijit/form/MultiSelect", [ + "dojo/_base/array", // array.indexOf, array.map + "dojo/_base/declare", // declare + "dojo/dom-geometry", // domGeometry.setMarginBox + "dojo/query", // query + "./_FormValueWidget" +], function(array, declare, domGeometry, query, _FormValueWidget){ + +/*===== + var _FormValueWidget = dijit.form._FormValueWidget; +=====*/ + +// module: +// dijit/form/MultiSelect +// summary: +// Widget version of a <select multiple=true> element, +// for selecting multiple options. + +return declare("dijit.form.MultiSelect", _FormValueWidget, { + // summary: + // Widget version of a <select multiple=true> element, + // for selecting multiple options. + + // size: Number + // Number of elements to display on a page + // NOTE: may be removed in version 2.0, since elements may have variable height; + // set the size via style="..." or CSS class names instead. + size: 7, + + templateString: "<select multiple='true' ${!nameAttrSetting} data-dojo-attach-point='containerNode,focusNode' data-dojo-attach-event='onchange: _onChange'></select>", + + addSelected: function(/*dijit.form.MultiSelect*/ select){ + // summary: + // Move the selected nodes of a passed Select widget + // instance to this Select widget. + // + // example: + // | // move all the selected values from "bar" to "foo" + // | dijit.byId("foo").addSelected(dijit.byId("bar")); + + select.getSelected().forEach(function(n){ + this.containerNode.appendChild(n); + // scroll to bottom to see item + // cannot use scrollIntoView since <option> tags don't support all attributes + // does not work on IE due to a bug where <select> always shows scrollTop = 0 + this.domNode.scrollTop = this.domNode.offsetHeight; // overshoot will be ignored + // scrolling the source select is trickier esp. on safari who forgets to change the scrollbar size + var oldscroll = select.domNode.scrollTop; + select.domNode.scrollTop = 0; + select.domNode.scrollTop = oldscroll; + },this); + this._set('value', this.get('value')); + }, + + getSelected: function(){ + // summary: + // Access the NodeList of the selected options directly + return query("option",this.containerNode).filter(function(n){ + return n.selected; // Boolean + }); // dojo.NodeList + }, + + _getValueAttr: function(){ + // summary: + // Hook so get('value') works. + // description: + // Returns an array of the selected options' values. + + // Don't call getSelect.map() because it doesn't return a real array, + // and that messes up dojo.toJson() calls like in the Form.html test + return array.map(this.getSelected(), function(n){ + return n.value; + }); + }, + + multiple: true, // for Form + + _setValueAttr: function(/*Array*/ values, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('value', values) works. + // description: + // Set the value(s) of this Select based on passed values + query("option",this.containerNode).forEach(function(n){ + n.selected = (array.indexOf(values,n.value) != -1); + }); + this.inherited(arguments); + }, + + invertSelection: function(/*Boolean?*/ onChange){ + // summary: + // Invert the selection + // onChange: Boolean + // If false, onChange is not fired. + var val = []; + query("option",this.containerNode).forEach(function(n){ + if(!n.selected){ val.push(n.value); } + }); + this._setValueAttr(val, !(onChange === false || onChange == null)); + }, + + _onChange: function(/*Event*/){ + this._handleOnChange(this.get('value'), true); + }, + + // for layout widgets: + resize: function(/*Object*/ size){ + if(size){ + domGeometry.setMarginBox(this.domNode, size); + } + }, + + postCreate: function(){ + this._set('value', this.get('value')); + this.inherited(arguments); + } +}); + +}); diff --git a/lib/dijit/form/NumberSpinner.js b/lib/dijit/form/NumberSpinner.js index ba5a782f5..1f7dc1640 100644 --- a/lib/dijit/form/NumberSpinner.js +++ b/lib/dijit/form/NumberSpinner.js @@ -1,71 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.NumberSpinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.NumberSpinner"] = true; -dojo.provide("dijit.form.NumberSpinner"); -dojo.require("dijit.form._Spinner"); -dojo.require("dijit.form.NumberTextBox"); - - -dojo.declare("dijit.form.NumberSpinner", - [dijit.form._Spinner, dijit.form.NumberTextBoxMixin], - { - // summary: - // Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value - // - // description: - // A `dijit.form.NumberTextBox` extension to provide keyboard accessible value selection - // as well as icons for spinning direction. When using the keyboard, the typematic rules - // apply, meaning holding the key will gradually increase or decrease the value and - // accelerate. - // - // example: - // | new dijit.form.NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput"); - - adjust: function(/*Object*/ val, /*Number*/ delta){ - // summary: - // Change Number val by the given amount - // tags: - // protected - - var tc = this.constraints, - v = isNaN(val), - gotMax = !isNaN(tc.max), - gotMin = !isNaN(tc.min) - ; - if(v && delta != 0){ // blank or invalid value and they want to spin, so create defaults - val = (delta > 0) ? - gotMin ? tc.min : gotMax ? tc.max : 0 : - gotMax ? this.constraints.max : gotMin ? tc.min : 0 - ; - } - var newval = val + delta; - if(v || isNaN(newval)){ return val; } - if(gotMax && (newval > tc.max)){ - newval = tc.max; - } - if(gotMin && (newval < tc.min)){ - newval = tc.min; - } - return newval; - }, - - _onKeyPress: function(e){ - if((e.charOrCode == dojo.keys.HOME || e.charOrCode == dojo.keys.END) && !(e.ctrlKey || e.altKey || e.metaKey) - && typeof this.get('value') != 'undefined' /* gibberish, so HOME and END are default editing keys*/){ - var value = this.constraints[(e.charOrCode == dojo.keys.HOME ? "min" : "max")]; - if(typeof value == "number"){ - this._setValueAttr(value, false); - } - // eat home or end key whether we change the value or not - dojo.stopEvent(e); - } - } -}); - -} +//>>built +define("dijit/form/NumberSpinner",["dojo/_base/declare","dojo/_base/event","dojo/keys","./_Spinner","./NumberTextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.NumberSpinner",[_4,_5.Mixin],{adjust:function(_6,_7){var tc=this.constraints,v=isNaN(_6),_8=!isNaN(tc.max),_9=!isNaN(tc.min);if(v&&_7!=0){_6=(_7>0)?_9?tc.min:_8?tc.max:0:_8?this.constraints.max:_9?tc.min:0;}var _a=_6+_7;if(v||isNaN(_a)){return _6;}if(_8&&(_a>tc.max)){_a=tc.max;}if(_9&&(_a<tc.min)){_a=tc.min;}return _a;},_onKeyPress:function(e){if((e.charOrCode==_3.HOME||e.charOrCode==_3.END)&&!(e.ctrlKey||e.altKey||e.metaKey)&&typeof this.get("value")!="undefined"){var _b=this.constraints[(e.charOrCode==_3.HOME?"min":"max")];if(typeof _b=="number"){this._setValueAttr(_b,false);}_2.stop(e);}}});});
\ No newline at end of file diff --git a/lib/dijit/form/NumberSpinner.js.uncompressed.js b/lib/dijit/form/NumberSpinner.js.uncompressed.js new file mode 100644 index 000000000..e96848eeb --- /dev/null +++ b/lib/dijit/form/NumberSpinner.js.uncompressed.js @@ -0,0 +1,74 @@ +define("dijit/form/NumberSpinner", [ + "dojo/_base/declare", // declare + "dojo/_base/event", // event.stop + "dojo/keys", // keys.END keys.HOME + "./_Spinner", + "./NumberTextBox" +], function(declare, event, keys, _Spinner, NumberTextBox){ + +/*===== + var _Spinner = dijit.form._Spinner; + var NumberTextBox = dijit.form.NumberTextBox; +=====*/ + +// module: +// dijit/form/NumberSpinner +// summary: +// Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value + + +return declare("dijit.form.NumberSpinner", [_Spinner, NumberTextBox.Mixin], { + // summary: + // Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value + // + // description: + // A `dijit.form.NumberTextBox` extension to provide keyboard accessible value selection + // as well as icons for spinning direction. When using the keyboard, the typematic rules + // apply, meaning holding the key will gradually increase or decrease the value and + // accelerate. + // + // example: + // | new dijit.form.NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput"); + + adjust: function(/*Object*/ val, /*Number*/ delta){ + // summary: + // Change Number val by the given amount + // tags: + // protected + + var tc = this.constraints, + v = isNaN(val), + gotMax = !isNaN(tc.max), + gotMin = !isNaN(tc.min) + ; + if(v && delta != 0){ // blank or invalid value and they want to spin, so create defaults + val = (delta > 0) ? + gotMin ? tc.min : gotMax ? tc.max : 0 : + gotMax ? this.constraints.max : gotMin ? tc.min : 0 + ; + } + var newval = val + delta; + if(v || isNaN(newval)){ return val; } + if(gotMax && (newval > tc.max)){ + newval = tc.max; + } + if(gotMin && (newval < tc.min)){ + newval = tc.min; + } + return newval; + }, + + _onKeyPress: function(e){ + if((e.charOrCode == keys.HOME || e.charOrCode == keys.END) && !(e.ctrlKey || e.altKey || e.metaKey) + && typeof this.get('value') != 'undefined' /* gibberish, so HOME and END are default editing keys*/){ + var value = this.constraints[(e.charOrCode == keys.HOME ? "min" : "max")]; + if(typeof value == "number"){ + this._setValueAttr(value, false); + } + // eat home or end key whether we change the value or not + event.stop(e); + } + } +}); + +}); diff --git a/lib/dijit/form/NumberTextBox.js b/lib/dijit/form/NumberTextBox.js index 4d0d64f99..a7cdb8201 100644 --- a/lib/dijit/form/NumberTextBox.js +++ b/lib/dijit/form/NumberTextBox.js @@ -1,278 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.NumberTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.NumberTextBox"] = true; -dojo.provide("dijit.form.NumberTextBox"); -dojo.require("dijit.form.ValidationTextBox"); -dojo.require("dojo.number"); - - -/*===== -dojo.declare( - "dijit.form.NumberTextBox.__Constraints", - [dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.number.__ParseOptions], { - // summary: - // Specifies both the rules on valid/invalid values (minimum, maximum, - // number of required decimal places), and also formatting options for - // displaying the value when the field is not focused. - // example: - // Minimum/maximum: - // To specify a field between 0 and 120: - // | {min:0,max:120} - // To specify a field that must be an integer: - // | {fractional:false} - // To specify a field where 0 to 3 decimal places are allowed on input: - // | {places:'0,3'} -}); -=====*/ - -dojo.declare("dijit.form.NumberTextBoxMixin", - null, - { - // summary: - // A mixin for all number textboxes - // tags: - // protected - - // Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather - // than a straight regexp to deal with locale (plus formatting options too?) - regExpGen: dojo.number.regexp, - - /*===== - // constraints: dijit.form.NumberTextBox.__Constraints - // Despite the name, this parameter specifies both constraints on the input - // (including minimum/maximum allowed values) as well as - // formatting options like places (the number of digits to display after - // the decimal point). See `dijit.form.NumberTextBox.__Constraints` for details. - constraints: {}, - ======*/ - - // value: Number - // The value of this NumberTextBox as a Javascript Number (i.e., not a String). - // If the displayed value is blank, the value is NaN, and if the user types in - // an gibberish value (like "hello world"), the value is undefined - // (i.e. get('value') returns undefined). - // - // Symmetrically, set('value', NaN) will clear the displayed value, - // whereas set('value', undefined) will have no effect. - value: NaN, - - // editOptions: [protected] Object - // Properties to mix into constraints when the value is being edited. - // This is here because we edit the number in the format "12345", which is - // different than the display value (ex: "12,345") - editOptions: { pattern: '#.######' }, - - /*===== - _formatter: function(value, options){ - // summary: - // _formatter() is called by format(). It's the base routine for formatting a number, - // as a string, for example converting 12345 into "12,345". - // value: Number - // The number to be converted into a string. - // options: dojo.number.__FormatOptions? - // Formatting options - // tags: - // protected extension - - return "12345"; // String - }, - =====*/ - _formatter: dojo.number.format, - - _setConstraintsAttr: function(/*Object*/ constraints){ - var places = typeof constraints.places == "number"? constraints.places : 0; - if(places){ places++; } // decimal rounding errors take away another digit of precision - if(typeof constraints.max != "number"){ - constraints.max = 9 * Math.pow(10, 15-places); - } - if(typeof constraints.min != "number"){ - constraints.min = -9 * Math.pow(10, 15-places); - } - this.inherited(arguments, [ constraints ]); - if(this.focusNode && this.focusNode.value && !isNaN(this.value)){ - this.set('value', this.value); - } - }, - - _onFocus: function(){ - if(this.disabled){ return; } - var val = this.get('value'); - if(typeof val == "number" && !isNaN(val)){ - var formattedValue = this.format(val, this.constraints); - if(formattedValue !== undefined){ - this.textbox.value = formattedValue; - } - } - this.inherited(arguments); - }, - - format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){ - // summary: - // Formats the value as a Number, according to constraints. - // tags: - // protected - - var formattedValue = String(value); - if(typeof value != "number"){ return formattedValue; } - if(isNaN(value)){ return ""; } - // check for exponential notation that dojo.number.format chokes on - if(!("rangeCheck" in this && this.rangeCheck(value, constraints)) && constraints.exponent !== false && /\de[-+]?\d/i.test(formattedValue)){ - return formattedValue; - } - if(this.editOptions && this._focused){ - constraints = dojo.mixin({}, constraints, this.editOptions); - } - return this._formatter(value, constraints); - }, - - /*===== - _parser: function(value, constraints){ - // summary: - // Parses the string value as a Number, according to constraints. - // value: String - // String representing a number - // constraints: dojo.number.__ParseOptions - // Formatting options - // tags: - // protected - - return 123.45; // Number - }, - =====*/ - _parser: dojo.number.parse, - - parse: function(/*String*/ value, /*dojo.number.__FormatOptions*/ constraints){ - // summary: - // Replacable function to convert a formatted string to a number value - // tags: - // protected extension - - var v = this._parser(value, dojo.mixin({}, constraints, (this.editOptions && this._focused) ? this.editOptions : {})); - if(this.editOptions && this._focused && isNaN(v)){ - v = this._parser(value, constraints); // parse w/o editOptions: not technically needed but is nice for the user - } - return v; - }, - - _getDisplayedValueAttr: function(){ - var v = this.inherited(arguments); - return isNaN(v) ? this.textbox.value : v; - }, - - filter: function(/*Number*/ value){ - // summary: - // This is called with both the display value (string), and the actual value (a number). - // When called with the actual value it does corrections so that '' etc. are represented as NaN. - // Otherwise it dispatches to the superclass's filter() method. - // - // See `dijit.form.TextBox.filter` for more details. - return (value === null || value === '' || value === undefined) ? NaN : this.inherited(arguments); // set('value', null||''||undefined) should fire onChange(NaN) - }, - - serialize: function(/*Number*/ value, /*Object?*/ options){ - // summary: - // Convert value (a Number) into a canonical string (ie, how the number literal is written in javascript/java/C/etc.) - // tags: - // protected - return (typeof value != "number" || isNaN(value)) ? '' : this.inherited(arguments); - }, - - _setBlurValue: function(){ - var val = dojo.hitch(dojo.mixin({}, this, { _focused: true }), "get")('value'); // parse with editOptions - this._setValueAttr(val, true); - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Hook so set('value', ...) works. - if(value !== undefined && formattedValue === undefined){ - formattedValue = String(value); - if(typeof value == "number"){ - if(isNaN(value)){ formattedValue = '' } - // check for exponential notation that dojo.number.format chokes on - else if(("rangeCheck" in this && this.rangeCheck(value, this.constraints)) || this.constraints.exponent === false || !/\de[-+]?\d/i.test(formattedValue)){ - formattedValue = undefined; // lets format comnpute a real string value - } - }else if(!value){ // 0 processed in if branch above, ''|null|undefined flow thru here - formattedValue = ''; - value = NaN; - }else{ // non-numeric values - value = undefined; - } - } - this.inherited(arguments, [value, priorityChange, formattedValue]); - }, - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works. - // Returns Number, NaN for '', or undefined for unparsable text - var v = this.inherited(arguments); // returns Number for all values accepted by parse() or NaN for all other displayed values - - // If the displayed value of the textbox is gibberish (ex: "hello world"), this.inherited() above - // returns NaN; this if() branch converts the return value to undefined. - // Returning undefined prevents user text from being overwritten when doing _setValueAttr(_getValueAttr()). - // A blank displayed value is still returned as NaN. - if(isNaN(v) && this.textbox.value !== ''){ - if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value) && (new RegExp("^"+dojo.number._realNumberRegexp(dojo.mixin({}, this.constraints))+"$").test(this.textbox.value))){ // check for exponential notation that parse() rejected (erroneously?) - var n = Number(this.textbox.value); - return isNaN(n) ? undefined : n; // return exponential Number or undefined for random text (may not be possible to do with the above RegExp check) - }else{ - return undefined; // gibberish - } - }else{ - return v; // Number or NaN for '' - } - }, - - isValid: function(/*Boolean*/ isFocused){ - // Overrides dijit.form.RangeBoundTextBox.isValid to check that the editing-mode value is valid since - // it may not be formatted according to the regExp vaidation rules - if(!this._focused || this._isEmpty(this.textbox.value)){ - return this.inherited(arguments); - }else{ - var v = this.get('value'); - if(!isNaN(v) && this.rangeCheck(v, this.constraints)){ - if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value)){ // exponential, parse doesn't like it - return true; // valid exponential number in range - }else{ - return this.inherited(arguments); - } - }else{ - return false; - } - } - } - } -); - -dojo.declare("dijit.form.NumberTextBox", - [dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin], - { - // summary: - // A TextBox for entering numbers, with formatting and range checking - // description: - // NumberTextBox is a textbox for entering and displaying numbers, supporting - // the following main features: - // - // 1. Enforce minimum/maximum allowed values (as well as enforcing that the user types - // a number rather than a random string) - // 2. NLS support (altering roles of comma and dot as "thousands-separator" and "decimal-point" - // depending on locale). - // 3. Separate modes for editing the value and displaying it, specifically that - // the thousands separator character (typically comma) disappears when editing - // but reappears after the field is blurred. - // 4. Formatting and constraints regarding the number of places (digits after the decimal point) - // allowed on input, and number of places displayed when blurred (see `constraints` parameter). - - baseClass: "dijitTextBox dijitNumberTextBox" - } -); - -} +//>>built +define("dijit/form/NumberTextBox",["dojo/_base/declare","dojo/_base/lang","dojo/number","./RangeBoundTextBox"],function(_1,_2,_3,_4){var _5=_1("dijit.form.NumberTextBoxMixin",null,{regExpGen:_3.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:_3.format,postMixInProperties:function(){this.inherited(arguments);this._set("type","text");},_setConstraintsAttr:function(_6){var _7=typeof _6.places=="number"?_6.places:0;if(_7){_7++;}if(typeof _6.max!="number"){_6.max=9*Math.pow(10,15-_7);}if(typeof _6.min!="number"){_6.min=-9*Math.pow(10,15-_7);}this.inherited(arguments,[_6]);if(this.focusNode&&this.focusNode.value&&!isNaN(this.value)){this.set("value",this.value);}},_onFocus:function(){if(this.disabled){return;}var _8=this.get("value");if(typeof _8=="number"&&!isNaN(_8)){var _9=this.format(_8,this.constraints);if(_9!==undefined){this.textbox.value=_9;}}this.inherited(arguments);},format:function(_a,_b){var _c=String(_a);if(typeof _a!="number"){return _c;}if(isNaN(_a)){return "";}if(!("rangeCheck" in this&&this.rangeCheck(_a,_b))&&_b.exponent!==false&&/\de[-+]?\d/i.test(_c)){return _c;}if(this.editOptions&&this.focused){_b=_2.mixin({},_b,this.editOptions);}return this._formatter(_a,_b);},_parser:_3.parse,parse:function(_d,_e){var v=this._parser(_d,_2.mixin({},_e,(this.editOptions&&this.focused)?this.editOptions:{}));if(this.editOptions&&this.focused&&isNaN(v)){v=this._parser(_d,_e);}return v;},_getDisplayedValueAttr:function(){var v=this.inherited(arguments);return isNaN(v)?this.textbox.value:v;},filter:function(_f){return (_f===null||_f===""||_f===undefined)?NaN:this.inherited(arguments);},serialize:function(_10,_11){return (typeof _10!="number"||isNaN(_10))?"":this.inherited(arguments);},_setBlurValue:function(){var val=_2.hitch(_2.mixin({},this,{focused:true}),"get")("value");this._setValueAttr(val,true);},_setValueAttr:function(_12,_13,_14){if(_12!==undefined&&_14===undefined){_14=String(_12);if(typeof _12=="number"){if(isNaN(_12)){_14="";}else{if(("rangeCheck" in this&&this.rangeCheck(_12,this.constraints))||this.constraints.exponent===false||!/\de[-+]?\d/i.test(_14)){_14=undefined;}}}else{if(!_12){_14="";_12=NaN;}else{_12=undefined;}}}this.inherited(arguments,[_12,_13,_14]);},_getValueAttr:function(){var v=this.inherited(arguments);if(isNaN(v)&&this.textbox.value!==""){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)&&(new RegExp("^"+_3._realNumberRegexp(_2.mixin({},this.constraints))+"$").test(this.textbox.value))){var n=Number(this.textbox.value);return isNaN(n)?undefined:n;}else{return undefined;}}else{return v;}},isValid:function(_15){if(!this.focused||this._isEmpty(this.textbox.value)){return this.inherited(arguments);}else{var v=this.get("value");if(!isNaN(v)&&this.rangeCheck(v,this.constraints)){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)){return true;}else{return this.inherited(arguments);}}else{return false;}}}});var _16=_1("dijit.form.NumberTextBox",[_4,_5],{baseClass:"dijitTextBox dijitNumberTextBox"});_16.Mixin=_5;return _16;});
\ No newline at end of file diff --git a/lib/dijit/form/NumberTextBox.js.uncompressed.js b/lib/dijit/form/NumberTextBox.js.uncompressed.js new file mode 100644 index 000000000..a16cfbd55 --- /dev/null +++ b/lib/dijit/form/NumberTextBox.js.uncompressed.js @@ -0,0 +1,286 @@ +define("dijit/form/NumberTextBox", [ + "dojo/_base/declare", // declare + "dojo/_base/lang", // lang.hitch lang.mixin + "dojo/number", // number._realNumberRegexp number.format number.parse number.regexp + "./RangeBoundTextBox" +], function(declare, lang, number, RangeBoundTextBox){ + +/*===== + var RangeBoundTextBox = dijit.form.RangeBoundTextBox; +=====*/ + + // module: + // dijit/form/NumberTextBox + // summary: + // A TextBox for entering numbers, with formatting and range checking + + + /*===== + declare( + "dijit.form.NumberTextBox.__Constraints", + [dijit.form.RangeBoundTextBox.__Constraints, number.__FormatOptions, number.__ParseOptions], { + // summary: + // Specifies both the rules on valid/invalid values (minimum, maximum, + // number of required decimal places), and also formatting options for + // displaying the value when the field is not focused. + // example: + // Minimum/maximum: + // To specify a field between 0 and 120: + // | {min:0,max:120} + // To specify a field that must be an integer: + // | {fractional:false} + // To specify a field where 0 to 3 decimal places are allowed on input: + // | {places:'0,3'} + }); + =====*/ + + var NumberTextBoxMixin = declare("dijit.form.NumberTextBoxMixin", null, { + // summary: + // A mixin for all number textboxes + // tags: + // protected + + // Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather + // than a straight regexp to deal with locale (plus formatting options too?) + regExpGen: number.regexp, + + /*===== + // constraints: dijit.form.NumberTextBox.__Constraints + // Despite the name, this parameter specifies both constraints on the input + // (including minimum/maximum allowed values) as well as + // formatting options like places (the number of digits to display after + // the decimal point). See `dijit.form.NumberTextBox.__Constraints` for details. + constraints: {}, + ======*/ + + // value: Number + // The value of this NumberTextBox as a Javascript Number (i.e., not a String). + // If the displayed value is blank, the value is NaN, and if the user types in + // an gibberish value (like "hello world"), the value is undefined + // (i.e. get('value') returns undefined). + // + // Symmetrically, set('value', NaN) will clear the displayed value, + // whereas set('value', undefined) will have no effect. + value: NaN, + + // editOptions: [protected] Object + // Properties to mix into constraints when the value is being edited. + // This is here because we edit the number in the format "12345", which is + // different than the display value (ex: "12,345") + editOptions: { pattern: '#.######' }, + + /*===== + _formatter: function(value, options){ + // summary: + // _formatter() is called by format(). It's the base routine for formatting a number, + // as a string, for example converting 12345 into "12,345". + // value: Number + // The number to be converted into a string. + // options: dojo.number.__FormatOptions? + // Formatting options + // tags: + // protected extension + + return "12345"; // String + }, + =====*/ + _formatter: number.format, + + postMixInProperties: function(){ + this.inherited(arguments); + this._set("type", "text"); // in case type="number" was specified which messes up parse/format + }, + + _setConstraintsAttr: function(/*Object*/ constraints){ + var places = typeof constraints.places == "number"? constraints.places : 0; + if(places){ places++; } // decimal rounding errors take away another digit of precision + if(typeof constraints.max != "number"){ + constraints.max = 9 * Math.pow(10, 15-places); + } + if(typeof constraints.min != "number"){ + constraints.min = -9 * Math.pow(10, 15-places); + } + this.inherited(arguments, [ constraints ]); + if(this.focusNode && this.focusNode.value && !isNaN(this.value)){ + this.set('value', this.value); + } + }, + + _onFocus: function(){ + if(this.disabled){ return; } + var val = this.get('value'); + if(typeof val == "number" && !isNaN(val)){ + var formattedValue = this.format(val, this.constraints); + if(formattedValue !== undefined){ + this.textbox.value = formattedValue; + } + } + this.inherited(arguments); + }, + + format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){ + // summary: + // Formats the value as a Number, according to constraints. + // tags: + // protected + + var formattedValue = String(value); + if(typeof value != "number"){ return formattedValue; } + if(isNaN(value)){ return ""; } + // check for exponential notation that dojo.number.format chokes on + if(!("rangeCheck" in this && this.rangeCheck(value, constraints)) && constraints.exponent !== false && /\de[-+]?\d/i.test(formattedValue)){ + return formattedValue; + } + if(this.editOptions && this.focused){ + constraints = lang.mixin({}, constraints, this.editOptions); + } + return this._formatter(value, constraints); + }, + + /*===== + _parser: function(value, constraints){ + // summary: + // Parses the string value as a Number, according to constraints. + // value: String + // String representing a number + // constraints: dojo.number.__ParseOptions + // Formatting options + // tags: + // protected + + return 123.45; // Number + }, + =====*/ + _parser: number.parse, + + parse: function(/*String*/ value, /*number.__FormatOptions*/ constraints){ + // summary: + // Replaceable function to convert a formatted string to a number value + // tags: + // protected extension + + var v = this._parser(value, lang.mixin({}, constraints, (this.editOptions && this.focused) ? this.editOptions : {})); + if(this.editOptions && this.focused && isNaN(v)){ + v = this._parser(value, constraints); // parse w/o editOptions: not technically needed but is nice for the user + } + return v; + }, + + _getDisplayedValueAttr: function(){ + var v = this.inherited(arguments); + return isNaN(v) ? this.textbox.value : v; + }, + + filter: function(/*Number*/ value){ + // summary: + // This is called with both the display value (string), and the actual value (a number). + // When called with the actual value it does corrections so that '' etc. are represented as NaN. + // Otherwise it dispatches to the superclass's filter() method. + // + // See `dijit.form.TextBox.filter` for more details. + return (value === null || value === '' || value === undefined) ? NaN : this.inherited(arguments); // set('value', null||''||undefined) should fire onChange(NaN) + }, + + serialize: function(/*Number*/ value, /*Object?*/ options){ + // summary: + // Convert value (a Number) into a canonical string (ie, how the number literal is written in javascript/java/C/etc.) + // tags: + // protected + return (typeof value != "number" || isNaN(value)) ? '' : this.inherited(arguments); + }, + + _setBlurValue: function(){ + var val = lang.hitch(lang.mixin({}, this, { focused: true }), "get")('value'); // parse with editOptions + this._setValueAttr(val, true); + }, + + _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + // summary: + // Hook so set('value', ...) works. + if(value !== undefined && formattedValue === undefined){ + formattedValue = String(value); + if(typeof value == "number"){ + if(isNaN(value)){ formattedValue = '' } + // check for exponential notation that number.format chokes on + else if(("rangeCheck" in this && this.rangeCheck(value, this.constraints)) || this.constraints.exponent === false || !/\de[-+]?\d/i.test(formattedValue)){ + formattedValue = undefined; // lets format compute a real string value + } + }else if(!value){ // 0 processed in if branch above, ''|null|undefined flows through here + formattedValue = ''; + value = NaN; + }else{ // non-numeric values + value = undefined; + } + } + this.inherited(arguments, [value, priorityChange, formattedValue]); + }, + + _getValueAttr: function(){ + // summary: + // Hook so get('value') works. + // Returns Number, NaN for '', or undefined for unparseable text + var v = this.inherited(arguments); // returns Number for all values accepted by parse() or NaN for all other displayed values + + // If the displayed value of the textbox is gibberish (ex: "hello world"), this.inherited() above + // returns NaN; this if() branch converts the return value to undefined. + // Returning undefined prevents user text from being overwritten when doing _setValueAttr(_getValueAttr()). + // A blank displayed value is still returned as NaN. + if(isNaN(v) && this.textbox.value !== ''){ + if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value) && (new RegExp("^"+number._realNumberRegexp(lang.mixin({}, this.constraints))+"$").test(this.textbox.value))){ // check for exponential notation that parse() rejected (erroneously?) + var n = Number(this.textbox.value); + return isNaN(n) ? undefined : n; // return exponential Number or undefined for random text (may not be possible to do with the above RegExp check) + }else{ + return undefined; // gibberish + } + }else{ + return v; // Number or NaN for '' + } + }, + + isValid: function(/*Boolean*/ isFocused){ + // Overrides dijit.form.RangeBoundTextBox.isValid to check that the editing-mode value is valid since + // it may not be formatted according to the regExp validation rules + if(!this.focused || this._isEmpty(this.textbox.value)){ + return this.inherited(arguments); + }else{ + var v = this.get('value'); + if(!isNaN(v) && this.rangeCheck(v, this.constraints)){ + if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value)){ // exponential, parse doesn't like it + return true; // valid exponential number in range + }else{ + return this.inherited(arguments); + } + }else{ + return false; + } + } + } + }); +/*===== + NumberTextBoxMixin = dijit.form.NumberTextBoxMixin; +=====*/ + + var NumberTextBox = declare("dijit.form.NumberTextBox", [RangeBoundTextBox,NumberTextBoxMixin], { + // summary: + // A TextBox for entering numbers, with formatting and range checking + // description: + // NumberTextBox is a textbox for entering and displaying numbers, supporting + // the following main features: + // + // 1. Enforce minimum/maximum allowed values (as well as enforcing that the user types + // a number rather than a random string) + // 2. NLS support (altering roles of comma and dot as "thousands-separator" and "decimal-point" + // depending on locale). + // 3. Separate modes for editing the value and displaying it, specifically that + // the thousands separator character (typically comma) disappears when editing + // but reappears after the field is blurred. + // 4. Formatting and constraints regarding the number of places (digits after the decimal point) + // allowed on input, and number of places displayed when blurred (see `constraints` parameter). + + baseClass: "dijitTextBox dijitNumberTextBox" + }); + + NumberTextBox.Mixin = NumberTextBoxMixin; // for monkey patching + + return NumberTextBox; +}); diff --git a/lib/dijit/form/RadioButton.js b/lib/dijit/form/RadioButton.js index 295ec5ffd..af7fcaee1 100644 --- a/lib/dijit/form/RadioButton.js +++ b/lib/dijit/form/RadioButton.js @@ -1,16 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.RadioButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.RadioButton"] = true; -dojo.provide("dijit.form.RadioButton"); -dojo.require("dijit.form.CheckBox"); - - -// TODO: for 2.0, move the RadioButton code into this file - -} +//>>built +define("dijit/form/RadioButton",["dojo/_base/declare","./CheckBox","./_RadioButtonMixin"],function(_1,_2,_3){return _1("dijit.form.RadioButton",[_2,_3],{baseClass:"dijitRadio"});});
\ No newline at end of file diff --git a/lib/dijit/form/RadioButton.js.uncompressed.js b/lib/dijit/form/RadioButton.js.uncompressed.js new file mode 100644 index 000000000..2e1a67d26 --- /dev/null +++ b/lib/dijit/form/RadioButton.js.uncompressed.js @@ -0,0 +1,23 @@ +define("dijit/form/RadioButton", [ + "dojo/_base/declare", // declare + "./CheckBox", + "./_RadioButtonMixin" +], function(declare, CheckBox, _RadioButtonMixin){ + +/*===== + var CheckBox = dijit.form.CheckBox; + var _RadioButtonMixin = dijit.form._RadioButtonMixin; +=====*/ + + // module: + // dijit/form/RadioButton + // summary: + // Radio button widget + + return declare("dijit.form.RadioButton", [CheckBox, _RadioButtonMixin], { + // summary: + // Same as an HTML radio, but with fancy styling. + + baseClass: "dijitRadio" + }); +}); diff --git a/lib/dijit/form/RangeBoundTextBox.js b/lib/dijit/form/RangeBoundTextBox.js index 589967f25..fc57a034b 100644 --- a/lib/dijit/form/RangeBoundTextBox.js +++ b/lib/dijit/form/RangeBoundTextBox.js @@ -1,15 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.RangeBoundTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.RangeBoundTextBox"] = true; -dojo.provide("dijit.form.RangeBoundTextBox"); -dojo.require("dijit.form.ValidationTextBox"); - - - -} +//>>built +define("dijit/form/RangeBoundTextBox",["dojo/_base/declare","dojo/i18n","./MappedTextBox"],function(_1,_2,_3){return _1("dijit.form.RangeBoundTextBox",_3,{rangeMessage:"",rangeCheck:function(_4,_5){return ("min" in _5?(this.compare(_4,_5.min)>=0):true)&&("max" in _5?(this.compare(_4,_5.max)<=0):true);},isInRange:function(){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var _6=this.get("value");var _7=false;var _8=false;if("min" in this.constraints){var _9=this.constraints.min;_9=this.compare(_6,((typeof _9=="number")&&_9>=0&&_6!=0)?0:_9);_7=(typeof _9=="number")&&_9<0;}if("max" in this.constraints){var _a=this.constraints.max;_a=this.compare(_6,((typeof _a!="number")||_a>0)?_a:0);_8=(typeof _a=="number")&&_a>0;}return _7||_8;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_b){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_b));},getErrorMessage:function(_c){var v=this.get("value");if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_c)){return this.rangeMessage;}return this.inherited(arguments);},postMixInProperties:function(){this.inherited(arguments);if(!this.rangeMessage){this.messages=_2.getLocalization("dijit.form","validate",this.lang);this.rangeMessage=this.messages.rangeMessage;}},_setConstraintsAttr:function(_d){this.inherited(arguments);if(this.focusNode){if(this.constraints.min!==undefined){this.focusNode.setAttribute("aria-valuemin",this.constraints.min);}else{this.focusNode.removeAttribute("aria-valuemin");}if(this.constraints.max!==undefined){this.focusNode.setAttribute("aria-valuemax",this.constraints.max);}else{this.focusNode.removeAttribute("aria-valuemax");}}},_setValueAttr:function(_e,_f){this.focusNode.setAttribute("aria-valuenow",_e);this.inherited(arguments);},applyTextDir:function(){}});});
\ No newline at end of file diff --git a/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js new file mode 100644 index 000000000..6283f8b56 --- /dev/null +++ b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js @@ -0,0 +1,143 @@ +define("dijit/form/RangeBoundTextBox", [ + "dojo/_base/declare", // declare + "dojo/i18n", // i18n.getLocalization + "./MappedTextBox" +], function(declare, i18n, MappedTextBox){ + +/*===== + var MappedTextBox = dijit.form.MappedTextBox; +=====*/ + + // module: + // dijit/form/RangeBoundTextBox + // summary: + // Base class for textbox form widgets which defines a range of valid values. + + /*===== + dijit.form.RangeBoundTextBox.__Constraints = function(){ + // min: Number + // Minimum signed value. Default is -Infinity + // max: Number + // Maximum signed value. Default is +Infinity + this.min = min; + this.max = max; + } + =====*/ + + return declare("dijit.form.RangeBoundTextBox", MappedTextBox, { + // summary: + // Base class for textbox form widgets which defines a range of valid values. + + // rangeMessage: String + // The message to display if value is out-of-range + rangeMessage: "", + + /*===== + // constraints: dijit.form.RangeBoundTextBox.__Constraints + constraints: {}, + ======*/ + + rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){ + // summary: + // Overridable function used to validate the range of the numeric input value. + // tags: + // protected + return ("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) && + ("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean + }, + + isInRange: function(/*Boolean*/ /*===== isFocused =====*/){ + // summary: + // Tests if the value is in the min/max range specified in constraints + // tags: + // protected + return this.rangeCheck(this.get('value'), this.constraints); + }, + + _isDefinitelyOutOfRange: function(){ + // summary: + // Returns true if the value is out of range and will remain + // out of range even if the user types more characters + var val = this.get('value'); + var isTooLittle = false; + var isTooMuch = false; + if("min" in this.constraints){ + var min = this.constraints.min; + min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min); + isTooLittle = (typeof min == "number") && min < 0; + } + if("max" in this.constraints){ + var max = this.constraints.max; + max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0); + isTooMuch = (typeof max == "number") && max > 0; + } + return isTooLittle || isTooMuch; + }, + + _isValidSubset: function(){ + // summary: + // Overrides `dijit.form.ValidationTextBox._isValidSubset`. + // Returns true if the input is syntactically valid, and either within + // range or could be made in range by more typing. + return this.inherited(arguments) && !this._isDefinitelyOutOfRange(); + }, + + isValid: function(/*Boolean*/ isFocused){ + // Overrides dijit.form.ValidationTextBox.isValid to check that the value is also in range. + return this.inherited(arguments) && + ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean + }, + + getErrorMessage: function(/*Boolean*/ isFocused){ + // Overrides dijit.form.ValidationTextBox.getErrorMessage to print "out of range" message if appropriate + var v = this.get('value'); + if(v !== null && v !== '' && v !== undefined && (typeof v != "number" || !isNaN(v)) && !this.isInRange(isFocused)){ // don't check isInRange w/o a real value + return this.rangeMessage; // String + } + return this.inherited(arguments); + }, + + postMixInProperties: function(){ + this.inherited(arguments); + if(!this.rangeMessage){ + this.messages = i18n.getLocalization("dijit.form", "validate", this.lang); + this.rangeMessage = this.messages.rangeMessage; + } + }, + + _setConstraintsAttr: function(/*Object*/ constraints){ + this.inherited(arguments); + if(this.focusNode){ // not set when called from postMixInProperties + if(this.constraints.min !== undefined){ + this.focusNode.setAttribute("aria-valuemin", this.constraints.min); + }else{ + this.focusNode.removeAttribute("aria-valuemin"); + } + if(this.constraints.max !== undefined){ + this.focusNode.setAttribute("aria-valuemax", this.constraints.max); + }else{ + this.focusNode.removeAttribute("aria-valuemax"); + } + } + }, + + _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('value', ...) works. + + this.focusNode.setAttribute("aria-valuenow", value); + this.inherited(arguments); + }, + + applyTextDir: function(/*===== element, text =====*/){ + // summary: + // The function overridden in the _BidiSupport module, + // originally used for setting element.dir according to this.textDir. + // In this case does nothing. + // element: Object + // text: String + // tags: + // protected. + } + }); +}); diff --git a/lib/dijit/form/Select.js b/lib/dijit/form/Select.js index a681cdf89..8322b015e 100644 --- a/lib/dijit/form/Select.js +++ b/lib/dijit/form/Select.js @@ -1,305 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.Select"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Select"] = true; -dojo.provide("dijit.form.Select"); -dojo.require("dijit.form._FormSelectWidget"); -dojo.require("dijit._HasDropDown"); -dojo.require("dijit.Menu"); -dojo.require("dijit.Tooltip"); -dojo.requireLocalization("dijit.form", "validate", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw"); - - -dojo.declare("dijit.form._SelectMenu", dijit.Menu, { - // summary: - // An internally-used menu for dropdown that allows us a vertical scrollbar - buildRendering: function(){ - // summary: - // Stub in our own changes, so that our domNode is not a table - // otherwise, we won't respond correctly to heights/overflows - this.inherited(arguments); - var o = (this.menuTableNode = this.domNode); - var n = (this.domNode = dojo.create("div", {style: {overflowX: "hidden", overflowY: "scroll"}})); - if(o.parentNode){ - o.parentNode.replaceChild(n, o); - } - dojo.removeClass(o, "dijitMenuTable"); - n.className = o.className + " dijitSelectMenu"; - o.className = "dijitReset dijitMenuTable"; - dijit.setWaiRole(o,"listbox"); - dijit.setWaiRole(n,"presentation"); - n.appendChild(o); - }, - - postCreate: function(){ - // summary: - // stop mousemove from selecting text on IE to be consistent with other browsers - - this.inherited(arguments); - - this.connect(this.domNode, "onmousemove", dojo.stopEvent); - }, - - resize: function(/*Object*/ mb){ - // summary: - // Overridden so that we are able to handle resizing our - // internal widget. Note that this is not a "full" resize - // implementation - it only works correctly if you pass it a - // marginBox. - // - // mb: Object - // The margin box to set this dropdown to. - if(mb){ - dojo.marginBox(this.domNode, mb); - if("w" in mb){ - // We've explicitly set the wrapper <div>'s width, so set <table> width to match. - // 100% is safer than a pixel value because there may be a scroll bar with - // browser/OS specific width. - this.menuTableNode.style.width = "100%"; - } - } - } -}); - -dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropDown], { - // summary: - // This is a "styleable" select box - it is basically a DropDownButton which - // can take a <select> as its input. - - baseClass: "dijitSelect", - - templateString: dojo.cache("dijit.form", "templates/Select.html", "<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdojoAttachPoint=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" dojoAttachPoint=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} dojoAttachPoint=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t></tr></tbody\n></table>\n"), - - // attributeMap: Object - // Add in our style to be applied to the focus node - attributeMap: dojo.mixin(dojo.clone(dijit.form._FormSelectWidget.prototype.attributeMap),{style:"tableNode"}), - - // required: Boolean - // Can be true or false, default is false. - required: false, - - // state: String - // Shows current state (ie, validation result) of input (Normal, Warning, or Error) - state: "", - - // message: String - // Currently displayed error/prompt message - message: "", - - // tooltipPosition: String[] - // See description of dijit.Tooltip.defaultPosition for details on this parameter. - tooltipPosition: [], - - // emptyLabel: string - // What to display in an "empty" dropdown - emptyLabel: " ", - - // _isLoaded: Boolean - // Whether or not we have been loaded - _isLoaded: false, - - // _childrenLoaded: Boolean - // Whether or not our children have been loaded - _childrenLoaded: false, - - _fillContent: function(){ - // summary: - // Set the value to be the first, or the selected index - this.inherited(arguments); - // set value from selected option - if(this.options.length && !this.value && this.srcNodeRef){ - var si = this.srcNodeRef.selectedIndex || 0; // || 0 needed for when srcNodeRef is not a SELECT - this.value = this.options[si >= 0 ? si : 0].value; - } - // Create the dropDown widget - this.dropDown = new dijit.form._SelectMenu({id: this.id + "_menu"}); - dojo.addClass(this.dropDown.domNode, this.baseClass + "Menu"); - }, - - _getMenuItemForOption: function(/*dijit.form.__SelectOption*/ option){ - // summary: - // For the given option, return the menu item that should be - // used to display it. This can be overridden as needed - if(!option.value && !option.label){ - // We are a separator (no label set for it) - return new dijit.MenuSeparator(); - }else{ - // Just a regular menu option - var click = dojo.hitch(this, "_setValueAttr", option); - var item = new dijit.MenuItem({ - option: option, - label: option.label || this.emptyLabel, - onClick: click, - disabled: option.disabled || false - }); - dijit.setWaiRole(item.focusNode, "listitem"); - return item; - } - }, - - _addOptionItem: function(/*dijit.form.__SelectOption*/ option){ - // summary: - // For the given option, add an option to our dropdown. - // If the option doesn't have a value, then a separator is added - // in that place. - if(this.dropDown){ - this.dropDown.addChild(this._getMenuItemForOption(option)); - } - }, - - _getChildren: function(){ - if(!this.dropDown){ - return []; - } - return this.dropDown.getChildren(); - }, - - _loadChildren: function(/*Boolean*/ loadMenuItems){ - // summary: - // Resets the menu and the length attribute of the button - and - // ensures that the label is appropriately set. - // loadMenuItems: Boolean - // actually loads the child menu items - we only do this when we are - // populating for showing the dropdown. - - if(loadMenuItems === true){ - // this.inherited destroys this.dropDown's child widgets (MenuItems). - // Avoid this.dropDown (Menu widget) having a pointer to a destroyed widget (which will cause - // issues later in _setSelected). (see #10296) - if(this.dropDown){ - delete this.dropDown.focusedChild; - } - if(this.options.length){ - this.inherited(arguments); - }else{ - // Drop down menu is blank but add one blank entry just so something appears on the screen - // to let users know that they are no choices (mimicing native select behavior) - dojo.forEach(this._getChildren(), function(child){ child.destroyRecursive(); }); - var item = new dijit.MenuItem({label: " "}); - this.dropDown.addChild(item); - } - }else{ - this._updateSelection(); - } - - this._isLoaded = false; - this._childrenLoaded = true; - - if(!this._loadingStore){ - // Don't call this if we are loading - since we will handle it later - this._setValueAttr(this.value); - } - }, - - _setValueAttr: function(value){ - this.inherited(arguments); - dojo.attr(this.valueNode, "value", this.get("value")); - }, - - _setDisplay: function(/*String*/ newDisplay){ - // summary: - // sets the display for the given value (or values) - var lbl = newDisplay || this.emptyLabel; - this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' + lbl + '</span>'; - dijit.setWaiState(this.focusNode, "valuetext", lbl); - }, - - validate: function(/*Boolean*/ isFocused){ - // summary: - // Called by oninit, onblur, and onkeypress. - // description: - // Show missing or invalid messages if appropriate, and highlight textbox field. - // Used when a select is initially set to no value and the user is required to - // set the value. - - var isValid = this.isValid(isFocused); - this._set("state", isValid ? "" : "Error"); - dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true"); - var message = isValid ? "" : this._missingMsg; - if(this.message !== message){ - this._set("message", message); - dijit.hideTooltip(this.domNode); - if(message){ - dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); - } - } - return isValid; - }, - - isValid: function(/*Boolean*/ isFocused){ - // summary: - // Whether or not this is a valid value. The only way a Select - // can be invalid is when it's required but nothing is selected. - return (!this.required || this.value === 0 || !(/^\s*$/.test(this.value || ""))); // handle value is null or undefined - }, - - reset: function(){ - // summary: - // Overridden so that the state will be cleared. - this.inherited(arguments); - dijit.hideTooltip(this.domNode); - this._set("state", ""); - this._set("message", "") - }, - - postMixInProperties: function(){ - // summary: - // set the missing message - this.inherited(arguments); - this._missingMsg = dojo.i18n.getLocalization("dijit.form", "validate", - this.lang).missingMessage; - }, - - postCreate: function(){ - // summary: - // stop mousemove from selecting text on IE to be consistent with other browsers - - this.inherited(arguments); - - this.connect(this.domNode, "onmousemove", dojo.stopEvent); - }, - - _setStyleAttr: function(/*String||Object*/ value){ - this.inherited(arguments); - dojo.toggleClass(this.domNode, this.baseClass + "FixedWidth", !!this.tableNode.style.width); - }, - - isLoaded: function(){ - return this._isLoaded; - }, - - loadDropDown: function(/*Function*/ loadCallback){ - // summary: - // populates the menu - this._loadChildren(true); - this._isLoaded = true; - loadCallback(); - }, - - closeDropDown: function(){ - // overriding _HasDropDown.closeDropDown() - this.inherited(arguments); - - if(this.dropDown && this.dropDown.menuTableNode){ - // Erase possible width: 100% setting from _SelectMenu.resize(). - // Leaving it would interfere with the next openDropDown() call, which - // queries the natural size of the drop down. - this.dropDown.menuTableNode.style.width = ""; - } - }, - - uninitialize: function(preserveDom){ - if(this.dropDown && !this.dropDown._destroyed){ - this.dropDown.destroyRecursive(preserveDom); - delete this.dropDown; - } - this.inherited(arguments); - } -}); - -} +//>>built +require({cache:{"url:dijit/form/templates/Select.html":"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdata-dojo-attach-point=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t></tr></tbody\n></table>\n"}});define("dijit/form/Select",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/event","dojo/i18n","dojo/_base/lang","./_FormSelectWidget","../_HasDropDown","../Menu","../MenuItem","../MenuSeparator","../Tooltip","dojo/text!./templates/Select.html","dojo/i18n!./nls/validate"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit.form._SelectMenu",_c,{buildRendering:function(){this.inherited(arguments);var o=(this.menuTableNode=this.domNode);var n=(this.domNode=_5.create("div",{style:{overflowX:"hidden",overflowY:"scroll"}}));if(o.parentNode){o.parentNode.replaceChild(n,o);}_4.remove(o,"dijitMenuTable");n.className=o.className+" dijitSelectMenu";o.className="dijitReset dijitMenuTable";o.setAttribute("role","listbox");n.setAttribute("role","presentation");n.appendChild(o);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_7.stop);},resize:function(mb){if(mb){_6.setMarginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});var _12=_2("dijit.form.Select",[_a,_b],{baseClass:"dijitSelect",templateString:_10,required:false,state:"",message:"",tooltipPosition:[],emptyLabel:" ",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex||0;this.value=this.options[si>=0?si:0].value;}this.dropDown=new _11({id:this.id+"_menu"});_4.add(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_13){if(!_13.value&&!_13.label){return new _e();}else{var _14=_9.hitch(this,"_setValueAttr",_13);var _15=new _d({option:_13,label:_13.label||this.emptyLabel,onClick:_14,disabled:_13.disabled||false});_15.focusNode.setAttribute("role","listitem");return _15;}},_addOptionItem:function(_16){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_16));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_17){if(_17===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{_1.forEach(this._getChildren(),function(_18){_18.destroyRecursive();});var _19=new _d({label:" "});this.dropDown.addChild(_19);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_1a){this.inherited(arguments);_3.set(this.valueNode,"value",this.get("value"));this.validate(this.focused);},_setDisabledAttr:function(_1b){this.inherited(arguments);this.validate(this.focused);},_setRequiredAttr:function(_1c){this._set("required",_1c);this.focusNode.setAttribute("aria-required",_1c);this.validate(this.focused);},_setDisplay:function(_1d){var lbl=_1d||this.emptyLabel;this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+lbl+"</span>";this.focusNode.setAttribute("aria-valuetext",lbl);},validate:function(_1e){var _1f=this.disabled||this.isValid(_1e);this._set("state",_1f?"":"Incomplete");this.focusNode.setAttribute("aria-invalid",_1f?"false":"true");var _20=_1f?"":this._missingMsg;if(_20&&this.focused&&this._hasBeenBlurred){_f.show(_20,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_f.hide(this.domNode);}this._set("message",_20);return _1f;},isValid:function(){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);_f.hide(this.domNode);this.validate(this.focused);},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=_8.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_7.stop);},_setStyleAttr:function(_21){this.inherited(arguments);_4.toggle(this.domNode,this.baseClass+"FixedWidth",!!this.domNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_22){this._loadChildren(true);this._isLoaded=true;_22();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_23){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_23);delete this.dropDown;}this.inherited(arguments);},_onFocus:function(){this.validate(true);this.inherited(arguments);},_onBlur:function(){_f.hide(this.domNode);this.inherited(arguments);}});_12._Menu=_11;return _12;});
\ No newline at end of file diff --git a/lib/dijit/form/Select.js.uncompressed.js b/lib/dijit/form/Select.js.uncompressed.js new file mode 100644 index 000000000..86abb8349 --- /dev/null +++ b/lib/dijit/form/Select.js.uncompressed.js @@ -0,0 +1,347 @@ +require({cache:{ +'url:dijit/form/templates/Select.html':"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdata-dojo-attach-point=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t></tr></tbody\n></table>\n"}}); +define("dijit/form/Select", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/dom-class", // domClass.add domClass.remove domClass.toggle + "dojo/dom-construct", // domConstruct.create + "dojo/dom-geometry", // domGeometry.setMarginBox + "dojo/_base/event", // event.stop + "dojo/i18n", // i18n.getLocalization + "dojo/_base/lang", // lang.hitch + "./_FormSelectWidget", + "../_HasDropDown", + "../Menu", + "../MenuItem", + "../MenuSeparator", + "../Tooltip", + "dojo/text!./templates/Select.html", + "dojo/i18n!./nls/validate" +], function(array, declare, domAttr, domClass, domConstruct, domGeometry, event, i18n, lang, + _FormSelectWidget, _HasDropDown, Menu, MenuItem, MenuSeparator, Tooltip, template){ + +/*===== + var _FormSelectWidget = dijit.form._FormSelectWidget; + var _HasDropDown = dijit._HasDropDown; + var _FormSelectWidget = dijit._FormSelectWidget; + var Menu = dijit.Menu; + var MenuItem = dijit.MenuItem; + var MenuSeparator = dijit.MenuSeparator; + var Tooltip = dijit.Tooltip; +=====*/ + +// module: +// dijit/form/Select +// summary: +// This is a "styleable" select box - it is basically a DropDownButton which +// can take a <select> as its input. + + +var _SelectMenu = declare("dijit.form._SelectMenu", Menu, { + // summary: + // An internally-used menu for dropdown that allows us a vertical scrollbar + buildRendering: function(){ + // summary: + // Stub in our own changes, so that our domNode is not a table + // otherwise, we won't respond correctly to heights/overflows + this.inherited(arguments); + var o = (this.menuTableNode = this.domNode); + var n = (this.domNode = domConstruct.create("div", {style: {overflowX: "hidden", overflowY: "scroll"}})); + if(o.parentNode){ + o.parentNode.replaceChild(n, o); + } + domClass.remove(o, "dijitMenuTable"); + n.className = o.className + " dijitSelectMenu"; + o.className = "dijitReset dijitMenuTable"; + o.setAttribute("role", "listbox"); + n.setAttribute("role", "presentation"); + n.appendChild(o); + }, + + postCreate: function(){ + // summary: + // stop mousemove from selecting text on IE to be consistent with other browsers + + this.inherited(arguments); + + this.connect(this.domNode, "onmousemove", event.stop); + }, + + resize: function(/*Object*/ mb){ + // summary: + // Overridden so that we are able to handle resizing our + // internal widget. Note that this is not a "full" resize + // implementation - it only works correctly if you pass it a + // marginBox. + // + // mb: Object + // The margin box to set this dropdown to. + if(mb){ + domGeometry.setMarginBox(this.domNode, mb); + if("w" in mb){ + // We've explicitly set the wrapper <div>'s width, so set <table> width to match. + // 100% is safer than a pixel value because there may be a scroll bar with + // browser/OS specific width. + this.menuTableNode.style.width = "100%"; + } + } + } +}); + +var Select = declare("dijit.form.Select", [_FormSelectWidget, _HasDropDown], { + // summary: + // This is a "styleable" select box - it is basically a DropDownButton which + // can take a <select> as its input. + + baseClass: "dijitSelect", + + templateString: template, + + // required: Boolean + // Can be true or false, default is false. + required: false, + + // state: [readonly] String + // "Incomplete" if this select is required but unset (i.e. blank value), "" otherwise + state: "", + + // message: String + // Currently displayed error/prompt message + message: "", + + // tooltipPosition: String[] + // See description of dijit.Tooltip.defaultPosition for details on this parameter. + tooltipPosition: [], + + // emptyLabel: string + // What to display in an "empty" dropdown + emptyLabel: " ", // + + // _isLoaded: Boolean + // Whether or not we have been loaded + _isLoaded: false, + + // _childrenLoaded: Boolean + // Whether or not our children have been loaded + _childrenLoaded: false, + + _fillContent: function(){ + // summary: + // Set the value to be the first, or the selected index + this.inherited(arguments); + // set value from selected option + if(this.options.length && !this.value && this.srcNodeRef){ + var si = this.srcNodeRef.selectedIndex || 0; // || 0 needed for when srcNodeRef is not a SELECT + this.value = this.options[si >= 0 ? si : 0].value; + } + // Create the dropDown widget + this.dropDown = new _SelectMenu({id: this.id + "_menu"}); + domClass.add(this.dropDown.domNode, this.baseClass + "Menu"); + }, + + _getMenuItemForOption: function(/*dijit.form.__SelectOption*/ option){ + // summary: + // For the given option, return the menu item that should be + // used to display it. This can be overridden as needed + if(!option.value && !option.label){ + // We are a separator (no label set for it) + return new MenuSeparator(); + }else{ + // Just a regular menu option + var click = lang.hitch(this, "_setValueAttr", option); + var item = new MenuItem({ + option: option, + label: option.label || this.emptyLabel, + onClick: click, + disabled: option.disabled || false + }); + item.focusNode.setAttribute("role", "listitem"); + return item; + } + }, + + _addOptionItem: function(/*dijit.form.__SelectOption*/ option){ + // summary: + // For the given option, add an option to our dropdown. + // If the option doesn't have a value, then a separator is added + // in that place. + if(this.dropDown){ + this.dropDown.addChild(this._getMenuItemForOption(option)); + } + }, + + _getChildren: function(){ + if(!this.dropDown){ + return []; + } + return this.dropDown.getChildren(); + }, + + _loadChildren: function(/*Boolean*/ loadMenuItems){ + // summary: + // Resets the menu and the length attribute of the button - and + // ensures that the label is appropriately set. + // loadMenuItems: Boolean + // actually loads the child menu items - we only do this when we are + // populating for showing the dropdown. + + if(loadMenuItems === true){ + // this.inherited destroys this.dropDown's child widgets (MenuItems). + // Avoid this.dropDown (Menu widget) having a pointer to a destroyed widget (which will cause + // issues later in _setSelected). (see #10296) + if(this.dropDown){ + delete this.dropDown.focusedChild; + } + if(this.options.length){ + this.inherited(arguments); + }else{ + // Drop down menu is blank but add one blank entry just so something appears on the screen + // to let users know that they are no choices (mimicing native select behavior) + array.forEach(this._getChildren(), function(child){ child.destroyRecursive(); }); + var item = new MenuItem({label: " "}); + this.dropDown.addChild(item); + } + }else{ + this._updateSelection(); + } + + this._isLoaded = false; + this._childrenLoaded = true; + + if(!this._loadingStore){ + // Don't call this if we are loading - since we will handle it later + this._setValueAttr(this.value); + } + }, + + _setValueAttr: function(value){ + this.inherited(arguments); + domAttr.set(this.valueNode, "value", this.get("value")); + this.validate(this.focused); // to update this.state + }, + + _setDisabledAttr: function(/*Boolean*/ value){ + this.inherited(arguments); + this.validate(this.focused); // to update this.state + }, + + _setRequiredAttr: function(/*Boolean*/ value){ + this._set("required", value); + this.focusNode.setAttribute("aria-required", value); + this.validate(this.focused); // to update this.state + }, + + _setDisplay: function(/*String*/ newDisplay){ + // summary: + // sets the display for the given value (or values) + var lbl = newDisplay || this.emptyLabel; + this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' + lbl + '</span>'; + this.focusNode.setAttribute("aria-valuetext", lbl); + }, + + validate: function(/*Boolean*/ isFocused){ + // summary: + // Called by oninit, onblur, and onkeypress, and whenever required/disabled state changes + // description: + // Show missing or invalid messages if appropriate, and highlight textbox field. + // Used when a select is initially set to no value and the user is required to + // set the value. + + var isValid = this.disabled || this.isValid(isFocused); + this._set("state", isValid ? "" : "Incomplete"); + this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true"); + var message = isValid ? "" : this._missingMsg; + if(message && this.focused && this._hasBeenBlurred){ + Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); + }else{ + Tooltip.hide(this.domNode); + } + this._set("message", message); + return isValid; + }, + + isValid: function(/*Boolean*/ /*===== isFocused =====*/){ + // summary: + // Whether or not this is a valid value. The only way a Select + // can be invalid is when it's required but nothing is selected. + return (!this.required || this.value === 0 || !(/^\s*$/.test(this.value || ""))); // handle value is null or undefined + }, + + reset: function(){ + // summary: + // Overridden so that the state will be cleared. + this.inherited(arguments); + Tooltip.hide(this.domNode); + this.validate(this.focused); // to update this.state + }, + + postMixInProperties: function(){ + // summary: + // set the missing message + this.inherited(arguments); + this._missingMsg = i18n.getLocalization("dijit.form", "validate", + this.lang).missingMessage; + }, + + postCreate: function(){ + // summary: + // stop mousemove from selecting text on IE to be consistent with other browsers + + this.inherited(arguments); + + this.connect(this.domNode, "onmousemove", event.stop); + }, + + _setStyleAttr: function(/*String||Object*/ value){ + this.inherited(arguments); + domClass.toggle(this.domNode, this.baseClass + "FixedWidth", !!this.domNode.style.width); + }, + + isLoaded: function(){ + return this._isLoaded; + }, + + loadDropDown: function(/*Function*/ loadCallback){ + // summary: + // populates the menu + this._loadChildren(true); + this._isLoaded = true; + loadCallback(); + }, + + closeDropDown: function(){ + // overriding _HasDropDown.closeDropDown() + this.inherited(arguments); + + if(this.dropDown && this.dropDown.menuTableNode){ + // Erase possible width: 100% setting from _SelectMenu.resize(). + // Leaving it would interfere with the next openDropDown() call, which + // queries the natural size of the drop down. + this.dropDown.menuTableNode.style.width = ""; + } + }, + + uninitialize: function(preserveDom){ + if(this.dropDown && !this.dropDown._destroyed){ + this.dropDown.destroyRecursive(preserveDom); + delete this.dropDown; + } + this.inherited(arguments); + }, + + _onFocus: function(){ + this.validate(true); // show tooltip if second focus of required tooltip, but no selection + this.inherited(arguments); + }, + + _onBlur: function(){ + Tooltip.hide(this.domNode); + this.inherited(arguments); + } +}); + +Select._Menu = _SelectMenu; // for monkey patching + +return Select; +}); diff --git a/lib/dijit/form/SimpleTextarea.js b/lib/dijit/form/SimpleTextarea.js index 6ff823105..41c701937 100644 --- a/lib/dijit/form/SimpleTextarea.js +++ b/lib/dijit/form/SimpleTextarea.js @@ -1,103 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.SimpleTextarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.SimpleTextarea"] = true; -dojo.provide("dijit.form.SimpleTextarea"); -dojo.require("dijit.form.TextBox"); - - -dojo.declare("dijit.form.SimpleTextarea", - dijit.form.TextBox, - { - // summary: - // A simple textarea that degrades, and responds to - // minimal LayoutContainer usage, and works with dijit.form.Form. - // Doesn't automatically size according to input, like Textarea. - // - // example: - // | <textarea dojoType="dijit.form.SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea> - // - // example: - // | new dijit.form.SimpleTextarea({ rows:20, cols:30 }, "foo"); - - baseClass: "dijitTextBox dijitTextArea", - - attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, { - rows:"textbox", cols: "textbox" - }), - - // rows: Number - // The number of rows of text. - rows: "3", - - // rows: Number - // The number of characters per line. - cols: "20", - - templateString: "<textarea ${!nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>", - - postMixInProperties: function(){ - // Copy value from srcNodeRef, unless user specified a value explicitly (or there is no srcNodeRef) - // TODO: parser will handle this in 2.0 - if(!this.value && this.srcNodeRef){ - this.value = this.srcNodeRef.value; - } - this.inherited(arguments); - }, - - buildRendering: function(){ - this.inherited(arguments); - if(dojo.isIE && this.cols){ // attribute selectors is not supported in IE6 - dojo.addClass(this.textbox, "dijitTextAreaCols"); - } - }, - - filter: function(/*String*/ value){ - // Override TextBox.filter to deal with newlines... specifically (IIRC) this is for IE which writes newlines - // as \r\n instead of just \n - if(value){ - value = value.replace(/\r/g,""); - } - return this.inherited(arguments); - }, - - _previousValue: "", - _onInput: function(/*Event?*/ e){ - // Override TextBox._onInput() to enforce maxLength restriction - if(this.maxLength){ - var maxLength = parseInt(this.maxLength); - var value = this.textbox.value.replace(/\r/g,''); - var overflow = value.length - maxLength; - if(overflow > 0){ - if(e){ dojo.stopEvent(e); } - var textarea = this.textbox; - if(textarea.selectionStart){ - var pos = textarea.selectionStart; - var cr = 0; - if(dojo.isOpera){ - cr = (this.textbox.value.substring(0,pos).match(/\r/g) || []).length; - } - this.textbox.value = value.substring(0,pos-overflow-cr)+value.substring(pos-cr); - textarea.setSelectionRange(pos-overflow, pos-overflow); - }else if(dojo.doc.selection){ //IE - textarea.focus(); - var range = dojo.doc.selection.createRange(); - // delete overflow characters - range.moveStart("character", -overflow); - range.text = ''; - // show cursor - range.select(); - } - } - this._previousValue = this.textbox.value; - } - this.inherited(arguments); - } -}); - -} +//>>built +define("dijit/form/SimpleTextarea",["dojo/_base/declare","dojo/dom-class","dojo/_base/sniff","dojo/_base/window","./TextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.SimpleTextarea",_5,{baseClass:"dijitTextBox dijitTextArea",rows:"3",cols:"20",templateString:"<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){if(!this.value&&this.srcNodeRef){this.value=this.srcNodeRef.value;}this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);if(_3("ie")&&this.cols){_2.add(this.textbox,"dijitTextAreaCols");}},filter:function(_6){if(_6){_6=_6.replace(/\r/g,"");}return this.inherited(arguments);},_onInput:function(e){if(this.maxLength){var _7=parseInt(this.maxLength);var _8=this.textbox.value.replace(/\r/g,"");var _9=_8.length-_7;if(_9>0){var _a=this.textbox;if(_a.selectionStart){var _b=_a.selectionStart;var cr=0;if(_3("opera")){cr=(this.textbox.value.substring(0,_b).match(/\r/g)||[]).length;}this.textbox.value=_8.substring(0,_b-_9-cr)+_8.substring(_b-cr);_a.setSelectionRange(_b-_9,_b-_9);}else{if(_4.doc.selection){_a.focus();var _c=_4.doc.selection.createRange();_c.moveStart("character",-_9);_c.text="";_c.select();}}}}this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/SimpleTextarea.js.uncompressed.js b/lib/dijit/form/SimpleTextarea.js.uncompressed.js new file mode 100644 index 000000000..f665857bc --- /dev/null +++ b/lib/dijit/form/SimpleTextarea.js.uncompressed.js @@ -0,0 +1,100 @@ +define("dijit/form/SimpleTextarea", [ + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.add + "dojo/_base/sniff", // has("ie") has("opera") + "dojo/_base/window", // win.doc.selection win.doc.selection.createRange + "./TextBox" +], function(declare, domClass, has, win, TextBox){ + +/*===== + var TextBox = dijit.form.TextBox; +=====*/ + +// module: +// dijit/form/SimpleTextarea +// summary: +// A simple textarea that degrades, and responds to +// minimal LayoutContainer usage, and works with dijit.form.Form. +// Doesn't automatically size according to input, like Textarea. + +return declare("dijit.form.SimpleTextarea", TextBox, { + // summary: + // A simple textarea that degrades, and responds to + // minimal LayoutContainer usage, and works with dijit.form.Form. + // Doesn't automatically size according to input, like Textarea. + // + // example: + // | <textarea data-dojo-type="dijit.form.SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea> + // + // example: + // | new dijit.form.SimpleTextarea({ rows:20, cols:30 }, "foo"); + + baseClass: "dijitTextBox dijitTextArea", + + // rows: Number + // The number of rows of text. + rows: "3", + + // rows: Number + // The number of characters per line. + cols: "20", + + templateString: "<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>", + + postMixInProperties: function(){ + // Copy value from srcNodeRef, unless user specified a value explicitly (or there is no srcNodeRef) + // TODO: parser will handle this in 2.0 + if(!this.value && this.srcNodeRef){ + this.value = this.srcNodeRef.value; + } + this.inherited(arguments); + }, + + buildRendering: function(){ + this.inherited(arguments); + if(has("ie") && this.cols){ // attribute selectors is not supported in IE6 + domClass.add(this.textbox, "dijitTextAreaCols"); + } + }, + + filter: function(/*String*/ value){ + // Override TextBox.filter to deal with newlines... specifically (IIRC) this is for IE which writes newlines + // as \r\n instead of just \n + if(value){ + value = value.replace(/\r/g,""); + } + return this.inherited(arguments); + }, + + _onInput: function(/*Event?*/ e){ + // Override TextBox._onInput() to enforce maxLength restriction + if(this.maxLength){ + var maxLength = parseInt(this.maxLength); + var value = this.textbox.value.replace(/\r/g,''); + var overflow = value.length - maxLength; + if(overflow > 0){ + var textarea = this.textbox; + if(textarea.selectionStart){ + var pos = textarea.selectionStart; + var cr = 0; + if(has("opera")){ + cr = (this.textbox.value.substring(0,pos).match(/\r/g) || []).length; + } + this.textbox.value = value.substring(0,pos-overflow-cr)+value.substring(pos-cr); + textarea.setSelectionRange(pos-overflow, pos-overflow); + }else if(win.doc.selection){ //IE + textarea.focus(); + var range = win.doc.selection.createRange(); + // delete overflow characters + range.moveStart("character", -overflow); + range.text = ''; + // show cursor + range.select(); + } + } + } + this.inherited(arguments); + } +}); + +}); diff --git a/lib/dijit/form/Slider.js b/lib/dijit/form/Slider.js index 80d4cfa98..37ae2789a 100644 --- a/lib/dijit/form/Slider.js +++ b/lib/dijit/form/Slider.js @@ -1,23 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.Slider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Slider"] = true; -dojo.provide("dijit.form.Slider"); -dojo.require("dijit.form.HorizontalSlider"); -dojo.require("dijit.form.VerticalSlider"); -dojo.require("dijit.form.HorizontalRule"); -dojo.require("dijit.form.VerticalRule"); -dojo.require("dijit.form.HorizontalRuleLabels"); -dojo.require("dijit.form.VerticalRuleLabels"); - - -dojo.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself", "", "2.0"); - -// For back-compat, remove for 2.0 - -} +//>>built +define("dijit/form/Slider",["dojo/_base/kernel","./HorizontalSlider","./VerticalSlider","./HorizontalRule","./VerticalRule","./HorizontalRuleLabels","./VerticalRuleLabels"],function(_1){_1.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself","","2.0");});
\ No newline at end of file diff --git a/lib/dijit/form/Slider.js.uncompressed.js b/lib/dijit/form/Slider.js.uncompressed.js new file mode 100644 index 000000000..2e3c05b84 --- /dev/null +++ b/lib/dijit/form/Slider.js.uncompressed.js @@ -0,0 +1,18 @@ +define("dijit/form/Slider", [ + "dojo/_base/kernel", // kernel.deprecated + "./HorizontalSlider", + "./VerticalSlider", + "./HorizontalRule", + "./VerticalRule", + "./HorizontalRuleLabels", + "./VerticalRuleLabels" +], function(kernel){ + + // module: + // dijit/form/Slider + // summary: + // Rollup of all the the Slider related widgets + // For back-compat, remove for 2.0 + + kernel.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself", "", "2.0"); +}); diff --git a/lib/dijit/form/TextBox.js b/lib/dijit/form/TextBox.js index 38a9c09d4..54d5b1de3 100644 --- a/lib/dijit/form/TextBox.js +++ b/lib/dijit/form/TextBox.js @@ -1,427 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.TextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.TextBox"] = true; -dojo.provide("dijit.form.TextBox"); -dojo.require("dijit.form._FormWidget"); - - -dojo.declare( - "dijit.form.TextBox", - dijit.form._FormValueWidget, - { - // summary: - // A base class for textbox form inputs - - // trim: Boolean - // Removes leading and trailing whitespace if true. Default is false. - trim: false, - - // uppercase: Boolean - // Converts all characters to uppercase if true. Default is false. - uppercase: false, - - // lowercase: Boolean - // Converts all characters to lowercase if true. Default is false. - lowercase: false, - - // propercase: Boolean - // Converts the first character of each word to uppercase if true. - propercase: false, - - // maxLength: String - // HTML INPUT tag maxLength declaration. - maxLength: "", - - // selectOnClick: [const] Boolean - // If true, all text will be selected when focused with mouse - selectOnClick: false, - - // placeHolder: String - // Defines a hint to help users fill out the input field (as defined in HTML 5). - // This should only contain plain text (no html markup). - placeHolder: "", - - templateString: dojo.cache("dijit.form", "templates/TextBox.html", "<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"), - _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" dojoAttachPoint="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />', - - _buttonInputDisabled: dojo.isIE ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events - - baseClass: "dijitTextBox", - - attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, { - maxLength: "focusNode" - }), - - postMixInProperties: function(){ - var type = this.type.toLowerCase(); - if(this.templateString && this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == dijit.form.TextBox.prototype.templateString)){ - this.templateString = this._singleNodeTemplate; - } - this.inherited(arguments); - }, - - _setPlaceHolderAttr: function(v){ - this._set("placeHolder", v); - if(!this._phspan){ - this._attachPoints.push('_phspan'); - /* dijitInputField class gives placeHolder same padding as the input field - * parent node already has dijitInputField class but it doesn't affect this <span> - * since it's position: absolute. - */ - this._phspan = dojo.create('span',{className:'dijitPlaceHolder dijitInputField'},this.textbox,'after'); - } - this._phspan.innerHTML=""; - this._phspan.appendChild(document.createTextNode(v)); - - this._updatePlaceHolder(); - }, - - _updatePlaceHolder: function(){ - if(this._phspan){ - this._phspan.style.display=(this.placeHolder&&!this._focused&&!this.textbox.value)?"":"none"; - } - }, - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works as we like. - // description: - // For `dijit.form.TextBox` this basically returns the value of the <input>. - // - // For `dijit.form.MappedTextBox` subclasses, which have both - // a "displayed value" and a separate "submit value", - // This treats the "displayed value" as the master value, computing the - // submit value from it via this.parse(). - return this.parse(this.get('displayedValue'), this.constraints); - }, - - _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Hook so set('value', ...) works. - // - // description: - // Sets the value of the widget to "value" which can be of - // any type as determined by the widget. - // - // value: - // The visual element value is also set to a corresponding, - // but not necessarily the same, value. - // - // formattedValue: - // If specified, used to set the visual element value, - // otherwise a computed visual value is used. - // - // priorityChange: - // If true, an onChange event is fired immediately instead of - // waiting for the next blur event. - - var filteredValue; - if(value !== undefined){ - // TODO: this is calling filter() on both the display value and the actual value. - // I added a comment to the filter() definition about this, but it should be changed. - filteredValue = this.filter(value); - if(typeof formattedValue != "string"){ - if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){ - formattedValue = this.filter(this.format(filteredValue, this.constraints)); - }else{ formattedValue = ''; } - } - } - if(formattedValue != null && formattedValue != undefined && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ - this.textbox.value = formattedValue; - this._set("displayedValue", this.get("displayedValue")); - } - - this._updatePlaceHolder(); - - this.inherited(arguments, [filteredValue, priorityChange]); - }, - - // displayedValue: String - // For subclasses like ComboBox where the displayed value - // (ex: Kentucky) and the serialized value (ex: KY) are different, - // this represents the displayed value. - // - // Setting 'displayedValue' through set('displayedValue', ...) - // updates 'value', and vice-versa. Otherwise 'value' is updated - // from 'displayedValue' periodically, like onBlur etc. - // - // TODO: move declaration to MappedTextBox? - // Problem is that ComboBox references displayedValue, - // for benefit of FilteringSelect. - displayedValue: "", - - getDisplayedValue: function(){ - // summary: - // Deprecated. Use get('displayedValue') instead. - // tags: - // deprecated - dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.", "", "2.0"); - return this.get('displayedValue'); - }, - - _getDisplayedValueAttr: function(){ - // summary: - // Hook so get('displayedValue') works. - // description: - // Returns the displayed value (what the user sees on the screen), - // after filtering (ie, trimming spaces etc.). - // - // For some subclasses of TextBox (like ComboBox), the displayed value - // is different from the serialized value that's actually - // sent to the server (see dijit.form.ValidationTextBox.serialize) - - // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need - // this method - // TODO: this isn't really the displayed value when the user is typing - return this.filter(this.textbox.value); - }, - - setDisplayedValue: function(/*String*/ value){ - // summary: - // Deprecated. Use set('displayedValue', ...) instead. - // tags: - // deprecated - dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.", "", "2.0"); - this.set('displayedValue', value); - }, - - _setDisplayedValueAttr: function(/*String*/ value){ - // summary: - // Hook so set('displayedValue', ...) works. - // description: - // Sets the value of the visual element to the string "value". - // The widget value is also set to a corresponding, - // but not necessarily the same, value. - - if(value === null || value === undefined){ value = '' } - else if(typeof value != "string"){ value = String(value) } - - this.textbox.value = value; - - // sets the serialized value to something corresponding to specified displayedValue - // (if possible), and also updates the textbox.value, for example converting "123" - // to "123.00" - this._setValueAttr(this.get('value'), undefined); - - this._set("displayedValue", this.get('displayedValue')); - }, - - format: function(/*String*/ value, /*Object*/ constraints){ - // summary: - // Replacable function to convert a value to a properly formatted string. - // tags: - // protected extension - return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value)); - }, - - parse: function(/*String*/ value, /*Object*/ constraints){ - // summary: - // Replacable function to convert a formatted string to a value - // tags: - // protected extension - - return value; // String - }, - - _refreshState: function(){ - // summary: - // After the user types some characters, etc., this method is - // called to check the field for validity etc. The base method - // in `dijit.form.TextBox` does nothing, but subclasses override. - // tags: - // protected - }, - - _onInput: function(e){ - if(e && e.type && /key/i.test(e.type) && e.keyCode){ - switch(e.keyCode){ - case dojo.keys.SHIFT: - case dojo.keys.ALT: - case dojo.keys.CTRL: - case dojo.keys.TAB: - return; - } - } - if(this.intermediateChanges){ - var _this = this; - // the setTimeout allows the key to post to the widget input box - setTimeout(function(){ _this._handleOnChange(_this.get('value'), false); }, 0); - } - this._refreshState(); - - // In case someone is watch()'ing for changes to displayedValue - this._set("displayedValue", this.get("displayedValue")); - }, - - postCreate: function(){ - if(dojo.isIE){ // IE INPUT tag fontFamily has to be set directly using STYLE - // the setTimeout gives IE a chance to render the TextBox and to deal with font inheritance - setTimeout(dojo.hitch(this, function(){ - var s = dojo.getComputedStyle(this.domNode); - if(s){ - var ff = s.fontFamily; - if(ff){ - var inputs = this.domNode.getElementsByTagName("INPUT"); - if(inputs){ - for(var i=0; i < inputs.length; i++){ - inputs[i].style.fontFamily = ff; - } - } - } - } - }), 0); - } - - // setting the value here is needed since value="" in the template causes "undefined" - // and setting in the DOM (instead of the JS object) helps with form reset actions - this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same - - this.inherited(arguments); - - if(dojo.isMoz || dojo.isOpera){ - this.connect(this.textbox, "oninput", "_onInput"); - }else{ - this.connect(this.textbox, "onkeydown", "_onInput"); - this.connect(this.textbox, "onkeyup", "_onInput"); - this.connect(this.textbox, "onpaste", "_onInput"); - this.connect(this.textbox, "oncut", "_onInput"); - } - }, - - _blankValue: '', // if the textbox is blank, what value should be reported - filter: function(val){ - // summary: - // Auto-corrections (such as trimming) that are applied to textbox - // value on blur or form submit. - // description: - // For MappedTextBox subclasses, this is called twice - // - once with the display value - // - once the value as set/returned by set('value', ...) - // and get('value'), ex: a Number for NumberTextBox. - // - // In the latter case it does corrections like converting null to NaN. In - // the former case the NumberTextBox.filter() method calls this.inherited() - // to execute standard trimming code in TextBox.filter(). - // - // TODO: break this into two methods in 2.0 - // - // tags: - // protected extension - if(val === null){ return this._blankValue; } - if(typeof val != "string"){ return val; } - if(this.trim){ - val = dojo.trim(val); - } - if(this.uppercase){ - val = val.toUpperCase(); - } - if(this.lowercase){ - val = val.toLowerCase(); - } - if(this.propercase){ - val = val.replace(/[^\s]+/g, function(word){ - return word.substring(0,1).toUpperCase() + word.substring(1); - }); - } - return val; - }, - - _setBlurValue: function(){ - this._setValueAttr(this.get('value'), true); - }, - - _onBlur: function(e){ - if(this.disabled){ return; } - this._setBlurValue(); - this.inherited(arguments); - - if(this._selectOnClickHandle){ - this.disconnect(this._selectOnClickHandle); - } - if(this.selectOnClick && dojo.isMoz){ - this.textbox.selectionStart = this.textbox.selectionEnd = undefined; // clear selection so that the next mouse click doesn't reselect - } - - this._updatePlaceHolder(); - }, - - _onFocus: function(/*String*/ by){ - if(this.disabled || this.readOnly){ return; } - - // Select all text on focus via click if nothing already selected. - // Since mouse-up will clear the selection need to defer selection until after mouse-up. - // Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event. - if(this.selectOnClick && by == "mouse"){ - this._selectOnClickHandle = this.connect(this.domNode, "onmouseup", function(){ - // Only select all text on first click; otherwise users would have no way to clear - // the selection. - this.disconnect(this._selectOnClickHandle); - - // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up) - // and if not, then select all the text - var textIsNotSelected; - if(dojo.isIE){ - var range = dojo.doc.selection.createRange(); - var parent = range.parentElement(); - textIsNotSelected = parent == this.textbox && range.text.length == 0; - }else{ - textIsNotSelected = this.textbox.selectionStart == this.textbox.selectionEnd; - } - if(textIsNotSelected){ - dijit.selectInputText(this.textbox); - } - }); - } - - this._updatePlaceHolder(); - - // call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport - // (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip - this.inherited(arguments); - - this._refreshState(); - }, - - reset: function(){ - // Overrides dijit._FormWidget.reset(). - // Additionally resets the displayed textbox value to '' - this.textbox.value = ''; - this.inherited(arguments); - } - } -); - -dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ - // summary: - // Select text in the input element argument, from start (default 0), to stop (default end). - - // TODO: use functions in _editor/selection.js? - var _window = dojo.global; - var _document = dojo.doc; - element = dojo.byId(element); - if(isNaN(start)){ start = 0; } - if(isNaN(stop)){ stop = element.value ? element.value.length : 0; } - dijit.focus(element); - if(_document["selection"] && dojo.body()["createTextRange"]){ // IE - if(element.createTextRange){ - var r = element.createTextRange(); - r.collapse(true); - r.moveStart("character", -99999); // move to 0 - r.moveStart("character", start); // delta from 0 is the correct position - r.moveEnd("character", stop-start); - r.select(); - } - }else if(_window["getSelection"]){ - if(element.setSelectionRange){ - element.setSelectionRange(start, stop); - } - } -}; - -} +//>>built +require({cache:{"url:dijit/form/templates/TextBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});define("dijit/form/TextBox",["dojo/_base/declare","dojo/dom-construct","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","./_FormValueWidget","./_TextBoxMixin","dojo/text!./templates/TextBox.html",".."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){var _c=_1([_8,_9],{templateString:_a,_singleNodeTemplate:"<input class=\"dijit dijitReset dijitLeft dijitInputField\" data-dojo-attach-point=\"textbox,focusNode\" autocomplete=\"off\" type=\"${type}\" ${!nameAttrSetting} />",_buttonInputDisabled:_6("ie")?"disabled":"",baseClass:"dijitTextBox",postMixInProperties:function(){var _d=this.type.toLowerCase();if(this.templateString&&this.templateString.toLowerCase()=="input"||((_d=="hidden"||_d=="file")&&this.templateString==this.constructor.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},_onInput:function(e){this.inherited(arguments);if(this.intermediateChanges){var _e=this;setTimeout(function(){_e._handleOnChange(_e.get("value"),false);},0);}},_setPlaceHolderAttr:function(v){this._set("placeHolder",v);if(!this._phspan){this._attachPoints.push("_phspan");this._phspan=_2.create("span",{className:"dijitPlaceHolder dijitInputField"},this.textbox,"after");}this._phspan.innerHTML="";this._phspan.appendChild(document.createTextNode(v));this._updatePlaceHolder();},_updatePlaceHolder:function(){if(this._phspan){this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none";}},_setValueAttr:function(_f,_10,_11){this.inherited(arguments);this._updatePlaceHolder();},getDisplayedValue:function(){_4.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.","","2.0");return this.get("displayedValue");},setDisplayedValue:function(_12){_4.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_12);},_onBlur:function(e){if(this.disabled){return;}this.inherited(arguments);this._updatePlaceHolder();},_onFocus:function(by){if(this.disabled||this.readOnly){return;}this.inherited(arguments);this._updatePlaceHolder();}});if(_6("ie")){_c=_1(_c,{declaredClass:"dijit.form.TextBox",_isTextSelected:function(){var _13=_7.doc.selection.createRange();var _14=_13.parentElement();return _14==this.textbox&&_13.text.length==0;},postCreate:function(){this.inherited(arguments);setTimeout(_5.hitch(this,function(){try{var s=_3.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _15=this.domNode.getElementsByTagName("INPUT");if(_15){for(var i=0;i<_15.length;i++){_15[i].style.fontFamily=ff;}}}}}catch(e){}}),0);}});_b._setSelectionRange=_9._setSelectionRange=function(_16,_17,_18){if(_16.createTextRange){var r=_16.createTextRange();r.collapse(true);r.moveStart("character",-99999);r.moveStart("character",_17);r.moveEnd("character",_18-_17);r.select();}};}else{if(_6("mozilla")){_c=_1(_c,{declaredClass:"dijit.form.TextBox",_onBlur:function(e){this.inherited(arguments);if(this.selectOnClick){this.textbox.selectionStart=this.textbox.selectionEnd=undefined;}}});}else{_c.prototype.declaredClass="dijit.form.TextBox";}}_5.setObject("dijit.form.TextBox",_c);return _c;});
\ No newline at end of file diff --git a/lib/dijit/form/TextBox.js.uncompressed.js b/lib/dijit/form/TextBox.js.uncompressed.js new file mode 100644 index 000000000..f8f908d8d --- /dev/null +++ b/lib/dijit/form/TextBox.js.uncompressed.js @@ -0,0 +1,175 @@ +require({cache:{ +'url:dijit/form/templates/TextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}}); +define("dijit/form/TextBox", [ + "dojo/_base/declare", // declare + "dojo/dom-construct", // domConstruct.create + "dojo/dom-style", // domStyle.getComputedStyle + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/lang", // lang.hitch + "dojo/_base/sniff", // has("ie") has("mozilla") + "dojo/_base/window", // win.doc.selection.createRange + "./_FormValueWidget", + "./_TextBoxMixin", + "dojo/text!./templates/TextBox.html", + ".." // to export dijit._setSelectionRange, remove in 2.0 +], function(declare, domConstruct, domStyle, kernel, lang, has, win, + _FormValueWidget, _TextBoxMixin, template, dijit){ + +/*===== + var _FormValueWidget = dijit.form._FormValueWidget; + var _TextBoxMixin = dijit.form._TextBoxMixin; +=====*/ + + // module: + // dijit/form/TextBox + // summary: + // A base class for textbox form inputs + + var TextBox = declare(/*====="dijit.form.TextBox", =====*/ [_FormValueWidget, _TextBoxMixin], { + // summary: + // A base class for textbox form inputs + + templateString: template, + _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" data-dojo-attach-point="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />', + + _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events + + baseClass: "dijitTextBox", + + postMixInProperties: function(){ + var type = this.type.toLowerCase(); + if(this.templateString && this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == this.constructor.prototype.templateString)){ + this.templateString = this._singleNodeTemplate; + } + this.inherited(arguments); + }, + + _onInput: function(e){ + this.inherited(arguments); + if(this.intermediateChanges){ // _TextBoxMixin uses onInput + var _this = this; + // the setTimeout allows the key to post to the widget input box + setTimeout(function(){ _this._handleOnChange(_this.get('value'), false); }, 0); + } + }, + + _setPlaceHolderAttr: function(v){ + this._set("placeHolder", v); + if(!this._phspan){ + this._attachPoints.push('_phspan'); + // dijitInputField class gives placeHolder same padding as the input field + // parent node already has dijitInputField class but it doesn't affect this <span> + // since it's position: absolute. + this._phspan = domConstruct.create('span',{className:'dijitPlaceHolder dijitInputField'},this.textbox,'after'); + } + this._phspan.innerHTML=""; + this._phspan.appendChild(document.createTextNode(v)); + this._updatePlaceHolder(); + }, + + _updatePlaceHolder: function(){ + if(this._phspan){ + this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none"; + } + }, + + _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + this.inherited(arguments); + this._updatePlaceHolder(); + }, + + getDisplayedValue: function(){ + // summary: + // Deprecated. Use get('displayedValue') instead. + // tags: + // deprecated + kernel.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.", "", "2.0"); + return this.get('displayedValue'); + }, + + setDisplayedValue: function(/*String*/ value){ + // summary: + // Deprecated. Use set('displayedValue', ...) instead. + // tags: + // deprecated + kernel.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.", "", "2.0"); + this.set('displayedValue', value); + }, + + _onBlur: function(e){ + if(this.disabled){ return; } + this.inherited(arguments); + this._updatePlaceHolder(); + }, + + _onFocus: function(/*String*/ by){ + if(this.disabled || this.readOnly){ return; } + this.inherited(arguments); + this._updatePlaceHolder(); + } + }); + + if(has("ie")){ + TextBox = declare(/*===== "dijit.form.TextBox.IEMixin", =====*/ TextBox, { + declaredClass: "dijit.form.TextBox", // for user code referencing declaredClass + + _isTextSelected: function(){ + var range = win.doc.selection.createRange(); + var parent = range.parentElement(); + return parent == this.textbox && range.text.length == 0; + }, + + postCreate: function(){ + this.inherited(arguments); + // IE INPUT tag fontFamily has to be set directly using STYLE + // the setTimeout gives IE a chance to render the TextBox and to deal with font inheritance + setTimeout(lang.hitch(this, function(){ + try{ + var s = domStyle.getComputedStyle(this.domNode); // can throw an exception if widget is immediately destroyed + if(s){ + var ff = s.fontFamily; + if(ff){ + var inputs = this.domNode.getElementsByTagName("INPUT"); + if(inputs){ + for(var i=0; i < inputs.length; i++){ + inputs[i].style.fontFamily = ff; + } + } + } + } + }catch(e){/*when used in a Dialog, and this is called before the dialog is + shown, s.fontFamily would trigger "Invalid Argument" error.*/} + }), 0); + } + }); + + // Overrides definition of _setSelectionRange from _TextBoxMixin (TODO: move to _TextBoxMixin.js?) + dijit._setSelectionRange = _TextBoxMixin._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ + if(element.createTextRange){ + var r = element.createTextRange(); + r.collapse(true); + r.moveStart("character", -99999); // move to 0 + r.moveStart("character", start); // delta from 0 is the correct position + r.moveEnd("character", stop-start); + r.select(); + } + } + }else if(has("mozilla")){ + TextBox = declare(/*===== "dijit.form.TextBox.MozMixin", =====*/TextBox, { + declaredClass: "dijit.form.TextBox", // for user code referencing declaredClass + + _onBlur: function(e){ + this.inherited(arguments); + if(this.selectOnClick){ + // clear selection so that the next mouse click doesn't reselect + this.textbox.selectionStart = this.textbox.selectionEnd = undefined; + } + } + }); + }else{ + TextBox.prototype.declaredClass = "dijit.form.TextBox"; + } + lang.setObject("dijit.form.TextBox", TextBox); // don't do direct assignment, it confuses API doc parser + + return TextBox; +}); diff --git a/lib/dijit/form/Textarea.js b/lib/dijit/form/Textarea.js index cc1ec917e..648a89ec7 100644 --- a/lib/dijit/form/Textarea.js +++ b/lib/dijit/form/Textarea.js @@ -1,167 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.Textarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Textarea"] = true; -dojo.provide("dijit.form.Textarea"); -dojo.require("dijit.form.SimpleTextarea"); - - -dojo.declare( - "dijit.form.Textarea", - dijit.form.SimpleTextarea, - { - // summary: - // A textarea widget that adjusts it's height according to the amount of data. - // - // description: - // A textarea that dynamically expands/contracts (changing it's height) as - // the user types, to display all the text without requiring a scroll bar. - // - // Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes. - // Rows is not supported since this widget adjusts the height. - // - // example: - // | <textarea dojoType="dijit.form.TextArea">...</textarea> - - - // TODO: for 2.0, rename this to ExpandingTextArea, and rename SimpleTextarea to Textarea - - baseClass: "dijitTextBox dijitTextArea dijitExpandingTextArea", - - // Override SimpleTextArea.cols to default to width:100%, for backward compatibility - cols: "", - - _previousNewlines: 0, - _strictMode: (dojo.doc.compatMode != 'BackCompat'), // not the same as !dojo.isQuirks - - _getHeight: function(textarea){ - var newH = textarea.scrollHeight; - if(dojo.isIE){ - newH += textarea.offsetHeight - textarea.clientHeight - ((dojo.isIE < 8 && this._strictMode) ? dojo._getPadBorderExtents(textarea).h : 0); - }else if(dojo.isMoz){ - newH += textarea.offsetHeight - textarea.clientHeight; // creates room for horizontal scrollbar - }else if(dojo.isWebKit){ - newH += dojo._getBorderExtents(textarea).h; - }else{ // Opera 9.6 (TODO: test if this is still needed) - newH += dojo._getPadBorderExtents(textarea).h; - } - return newH; - }, - - _estimateHeight: function(textarea){ - // summary: - // Approximate the height when the textarea is invisible with the number of lines in the text. - // Fails when someone calls setValue with a long wrapping line, but the layout fixes itself when the user clicks inside so . . . - // In IE, the resize event is supposed to fire when the textarea becomes visible again and that will correct the size automatically. - // - textarea.style.maxHeight = ""; - textarea.style.height = "auto"; - // #rows = #newlines+1 - // Note: on Moz, the following #rows appears to be 1 too many. - // Actually, Moz is reserving room for the scrollbar. - // If you increase the font size, this behavior becomes readily apparent as the last line gets cut off without the +1. - textarea.rows = (textarea.value.match(/\n/g) || []).length + 1; - }, - - _needsHelpShrinking: dojo.isMoz || dojo.isWebKit, - - _onInput: function(){ - // Override SimpleTextArea._onInput() to deal with height adjustment - this.inherited(arguments); - if(this._busyResizing){ return; } - this._busyResizing = true; - var textarea = this.textbox; - if(textarea.scrollHeight && textarea.offsetHeight && textarea.clientHeight){ - var newH = this._getHeight(textarea) + "px"; - if(textarea.style.height != newH){ - textarea.style.maxHeight = textarea.style.height = newH; - } - if(this._needsHelpShrinking){ - if(this._setTimeoutHandle){ - clearTimeout(this._setTimeoutHandle); - } - this._setTimeoutHandle = setTimeout(dojo.hitch(this, "_shrink"), 0); // try to collapse multiple shrinks into 1 - } - }else{ - // hidden content of unknown size - this._estimateHeight(textarea); - } - this._busyResizing = false; - }, - - _busyResizing: false, - _shrink: function(){ - // grow paddingBottom to see if scrollHeight shrinks (when it is unneccesarily big) - this._setTimeoutHandle = null; - if(this._needsHelpShrinking && !this._busyResizing){ - this._busyResizing = true; - var textarea = this.textbox; - var empty = false; - if(textarea.value == ''){ - textarea.value = ' '; // prevent collapse all the way back to 0 - empty = true; - } - var scrollHeight = textarea.scrollHeight; - if(!scrollHeight){ - this._estimateHeight(textarea); - }else{ - var oldPadding = textarea.style.paddingBottom; - var newPadding = dojo._getPadExtents(textarea); - newPadding = newPadding.h - newPadding.t; - textarea.style.paddingBottom = newPadding + 1 + "px"; // tweak padding to see if height can be reduced - var newH = this._getHeight(textarea) - 1 + "px"; // see if the height changed by the 1px added - if(textarea.style.maxHeight != newH){ // if can be reduced, so now try a big chunk - textarea.style.paddingBottom = newPadding + scrollHeight + "px"; - textarea.scrollTop = 0; - textarea.style.maxHeight = this._getHeight(textarea) - scrollHeight + "px"; // scrollHeight is the added padding - } - textarea.style.paddingBottom = oldPadding; - } - if(empty){ - textarea.value = ''; - } - this._busyResizing = false; - } - }, - - resize: function(){ - // summary: - // Resizes the textarea vertically (should be called after a style/value change) - this._onInput(); - }, - - _setValueAttr: function(){ - this.inherited(arguments); - this.resize(); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // tweak textarea style to reduce browser differences - dojo.style(this.textbox, { overflowY: 'hidden', overflowX: 'auto', boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' }); - }, - - postCreate: function(){ - this.inherited(arguments); - - this.connect(this.textbox, "onscroll", "_onInput"); - this.connect(this.textbox, "onresize", "_onInput"); - this.connect(this.textbox, "onfocus", "_onInput"); // useful when a previous estimate was off a bit - this._setTimeoutHandle = setTimeout(dojo.hitch(this, "resize"), 0); - }, - - uninitialize: function(){ - if(this._setTimeoutHandle){ - clearTimeout(this._setTimeoutHandle); - } - this.inherited(arguments); - } -}); - -} +//>>built +define("dijit/form/Textarea",["dojo/_base/declare","dojo/dom-style","./_ExpandingTextAreaMixin","./SimpleTextarea"],function(_1,_2,_3,_4){return _1("dijit.form.Textarea",[_4,_3],{baseClass:"dijitTextBox dijitTextArea dijitExpandingTextArea",cols:"",buildRendering:function(){this.inherited(arguments);_2.set(this.textbox,{overflowY:"hidden",overflowX:"auto",boxSizing:"border-box",MsBoxSizing:"border-box",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box"});}});});
\ No newline at end of file diff --git a/lib/dijit/form/Textarea.js.uncompressed.js b/lib/dijit/form/Textarea.js.uncompressed.js new file mode 100644 index 000000000..c99816e72 --- /dev/null +++ b/lib/dijit/form/Textarea.js.uncompressed.js @@ -0,0 +1,49 @@ +define("dijit/form/Textarea", [ + "dojo/_base/declare", // declare + "dojo/dom-style", // domStyle.set + "./_ExpandingTextAreaMixin", + "./SimpleTextarea" +], function(declare, domStyle, _ExpandingTextAreaMixin, SimpleTextarea){ + +/*===== + var _ExpandingTextAreaMixin = dijit.form._ExpandingTextAreaMixin; + var SimpleTextarea = dijit.form.SimpleTextarea; +=====*/ + +// module: +// dijit/form/Textarea +// summary: +// A textarea widget that adjusts it's height according to the amount of data. + + +return declare("dijit.form.Textarea", [SimpleTextarea, _ExpandingTextAreaMixin], { + // summary: + // A textarea widget that adjusts it's height according to the amount of data. + // + // description: + // A textarea that dynamically expands/contracts (changing it's height) as + // the user types, to display all the text without requiring a scroll bar. + // + // Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes. + // Rows is not supported since this widget adjusts the height. + // + // example: + // | <textarea data-dojo-type="dijit.form.TextArea">...</textarea> + + + // TODO: for 2.0, rename this to ExpandingTextArea, and rename SimpleTextarea to TextArea + + baseClass: "dijitTextBox dijitTextArea dijitExpandingTextArea", + + // Override SimpleTextArea.cols to default to width:100%, for backward compatibility + cols: "", + + buildRendering: function(){ + this.inherited(arguments); + + // tweak textarea style to reduce browser differences + domStyle.set(this.textbox, { overflowY: 'hidden', overflowX: 'auto', boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' }); + } +}); + +}); diff --git a/lib/dijit/form/TimeTextBox.js b/lib/dijit/form/TimeTextBox.js index 81949c4a1..90b3f279d 100644 --- a/lib/dijit/form/TimeTextBox.js +++ b/lib/dijit/form/TimeTextBox.js @@ -1,87 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.TimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.TimeTextBox"] = true; -dojo.provide("dijit.form.TimeTextBox"); -dojo.require("dijit._TimePicker"); -dojo.require("dijit.form._DateTimeTextBox"); - - -/*===== -dojo.declare( - "dijit.form.TimeTextBox.__Constraints", - [dijit.form._DateTimeTextBox.__Constraints, dijit._TimePicker.__Constraints] -); -=====*/ - -dojo.declare( - "dijit.form.TimeTextBox", - dijit.form._DateTimeTextBox, - { - // summary: - // A validating, serializable, range-bound time text box with a drop down time picker - - baseClass: "dijitTextBox dijitComboBox dijitTimeTextBox", - popupClass: "dijit._TimePicker", - _selector: "time", - -/*===== - // constraints: dijit.form.TimeTextBox.__Constraints - constraints:{}, -=====*/ - - // value: Date - // The value of this widget as a JavaScript Date object. Note that the date portion implies time zone and daylight savings rules. - // - // Example: - // | new dijit.form.TimeTextBox({value: dojo.date.stamp.fromISOString("T12:59:59", new Date())}) - // - // When passed to the parser in markup, must be specified according to locale-independent - // `dojo.date.stamp.fromISOString` format. - // - // Example: - // | <input dojotype='dijit.form.TimeTextBox' value='T12:34:00'> - value: new Date(""), // value.toString()="NaN" - //FIXME: in markup, you have no control over daylight savings - - _onKey: function(evt){ - this.inherited(arguments); - - // If the user has backspaced or typed some numbers, then filter the result list - // by what they typed. Maybe there's a better way to detect this, like _handleOnChange()? - switch(evt.keyCode){ - case dojo.keys.ENTER: - case dojo.keys.TAB: - case dojo.keys.ESCAPE: - case dojo.keys.DOWN_ARROW: - case dojo.keys.UP_ARROW: - // these keys have special meaning - break; - default: - // setTimeout() because the keystroke hasn't yet appeared in the <input>, - // so the get('displayedValue') call below won't give the result we want. - setTimeout(dojo.hitch(this, function(){ - // set this.filterString to the filter to apply to the drop down list; - // it will be used in openDropDown() - var val = this.get('displayedValue'); - this.filterString = (val && !this.parse(val, this.constraints)) ? val.toLowerCase() : ""; - - // close the drop down and reopen it, in order to filter the items shown in the list - // and also since the drop down may need to be repositioned if the number of list items has changed - // and it's being displayed above the <input> - if(this._opened){ - this.closeDropDown(); - } - this.openDropDown(); - }), 0); - } - } - } -); - -} +//>>built +define("dijit/form/TimeTextBox",["dojo/_base/declare","dojo/keys","dojo/_base/lang","../_TimePicker","./_DateTimeTextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.TimeTextBox",_5,{baseClass:"dijitTextBox dijitComboBox dijitTimeTextBox",popupClass:_4,_selector:"time",value:new Date(""),_onKey:function(_6){if(this.disabled||this.readOnly){return;}this.inherited(arguments);switch(_6.keyCode){case _2.ENTER:case _2.TAB:case _2.ESCAPE:case _2.DOWN_ARROW:case _2.UP_ARROW:break;default:setTimeout(_3.hitch(this,function(){var _7=this.get("displayedValue");this.filterString=(_7&&!this.parse(_7,this.constraints))?_7.toLowerCase():"";if(this._opened){this.closeDropDown();}this.openDropDown();}),0);}}});});
\ No newline at end of file diff --git a/lib/dijit/form/TimeTextBox.js.uncompressed.js b/lib/dijit/form/TimeTextBox.js.uncompressed.js new file mode 100644 index 000000000..30d80b236 --- /dev/null +++ b/lib/dijit/form/TimeTextBox.js.uncompressed.js @@ -0,0 +1,88 @@ +define("dijit/form/TimeTextBox", [ + "dojo/_base/declare", // declare + "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE keys.TAB keys.UP_ARROW + "dojo/_base/lang", // lang.hitch + "../_TimePicker", + "./_DateTimeTextBox" +], function(declare, keys, lang, _TimePicker, _DateTimeTextBox){ + +/*===== + var _TimePicker = dijit._TimePicker; + var _DateTimeTextBox = dijit.form._DateTimeTextBox; +=====*/ + + // module: + // dijit/form/TimeTextBox + // summary: + // A validating, serializable, range-bound time text box with a drop down time picker + + + /*===== + declare( + "dijit.form.TimeTextBox.__Constraints", + [dijit.form._DateTimeTextBox.__Constraints, dijit._TimePicker.__Constraints] + ); + =====*/ + + return declare("dijit.form.TimeTextBox", _DateTimeTextBox, { + // summary: + // A validating, serializable, range-bound time text box with a drop down time picker + + baseClass: "dijitTextBox dijitComboBox dijitTimeTextBox", + popupClass: _TimePicker, + _selector: "time", + +/*===== + // constraints: dijit.form.TimeTextBox.__Constraints + constraints:{}, +=====*/ + + // value: Date + // The value of this widget as a JavaScript Date object. Note that the date portion implies time zone and daylight savings rules. + // + // Example: + // | new dijit.form.TimeTextBox({value: stamp.fromISOString("T12:59:59", new Date())}) + // + // When passed to the parser in markup, must be specified according to locale-independent + // `stamp.fromISOString` format. + // + // Example: + // | <input data-dojo-type='dijit.form.TimeTextBox' value='T12:34:00'> + value: new Date(""), // value.toString()="NaN" + //FIXME: in markup, you have no control over daylight savings + + _onKey: function(evt){ + if(this.disabled || this.readOnly){ return; } + this.inherited(arguments); + + // If the user has backspaced or typed some numbers, then filter the result list + // by what they typed. Maybe there's a better way to detect this, like _handleOnChange()? + switch(evt.keyCode){ + case keys.ENTER: + case keys.TAB: + case keys.ESCAPE: + case keys.DOWN_ARROW: + case keys.UP_ARROW: + // these keys have special meaning + break; + default: + // setTimeout() because the keystroke hasn't yet appeared in the <input>, + // so the get('displayedValue') call below won't give the result we want. + setTimeout(lang.hitch(this, function(){ + // set this.filterString to the filter to apply to the drop down list; + // it will be used in openDropDown() + var val = this.get('displayedValue'); + this.filterString = (val && !this.parse(val, this.constraints)) ? val.toLowerCase() : ""; + + // close the drop down and reopen it, in order to filter the items shown in the list + // and also since the drop down may need to be repositioned if the number of list items has changed + // and it's being displayed above the <input> + if(this._opened){ + this.closeDropDown(); + } + this.openDropDown(); + }), 0); + } + } + }); +}); diff --git a/lib/dijit/form/ToggleButton.js b/lib/dijit/form/ToggleButton.js index 27b836fbd..196f67f8d 100644 --- a/lib/dijit/form/ToggleButton.js +++ b/lib/dijit/form/ToggleButton.js @@ -1,15 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.ToggleButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ToggleButton"] = true; -dojo.provide("dijit.form.ToggleButton"); -dojo.require("dijit.form.Button"); - - - -} +//>>built +define("dijit/form/ToggleButton",["dojo/_base/declare","dojo/_base/kernel","./Button","./_ToggleButtonMixin"],function(_1,_2,_3,_4){return _1("dijit.form.ToggleButton",[_3,_4],{baseClass:"dijitToggleButton",setChecked:function(_5){_2.deprecated("setChecked("+_5+") is deprecated. Use set('checked',"+_5+") instead.","","2.0");this.set("checked",_5);}});});
\ No newline at end of file diff --git a/lib/dijit/form/ToggleButton.js.uncompressed.js b/lib/dijit/form/ToggleButton.js.uncompressed.js new file mode 100644 index 000000000..21ee070cb --- /dev/null +++ b/lib/dijit/form/ToggleButton.js.uncompressed.js @@ -0,0 +1,33 @@ +define("dijit/form/ToggleButton", [ + "dojo/_base/declare", // declare + "dojo/_base/kernel", // kernel.deprecated + "./Button", + "./_ToggleButtonMixin" +], function(declare, kernel, Button, _ToggleButtonMixin){ + +/*===== + var Button = dijit.form.Button; + var _ToggleButtonMixin = dijit.form._ToggleButtonMixin; +=====*/ + + // module: + // dijit/form/ToggleButton + // summary: + // A templated button widget that can be in two states (checked or not). + + + return declare("dijit.form.ToggleButton", [Button, _ToggleButtonMixin], { + // summary: + // A templated button widget that can be in two states (checked or not). + // Can be base class for things like tabs or checkbox or radio buttons + + baseClass: "dijitToggleButton", + + setChecked: function(/*Boolean*/ checked){ + // summary: + // Deprecated. Use set('checked', true/false) instead. + kernel.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0"); + this.set('checked', checked); + } + }); +}); diff --git a/lib/dijit/form/ValidationTextBox.js b/lib/dijit/form/ValidationTextBox.js index ee4292441..5ca837ac1 100644 --- a/lib/dijit/form/ValidationTextBox.js +++ b/lib/dijit/form/ValidationTextBox.js @@ -1,486 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.ValidationTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ValidationTextBox"] = true; -dojo.provide("dijit.form.ValidationTextBox"); -dojo.require("dojo.i18n"); -dojo.require("dijit.form.TextBox"); -dojo.require("dijit.Tooltip"); -dojo.requireLocalization("dijit.form", "validate", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw"); - - -/*===== - dijit.form.ValidationTextBox.__Constraints = function(){ - // locale: String - // locale used for validation, picks up value from this widget's lang attribute - // _flags_: anything - // various flags passed to regExpGen function - this.locale = ""; - this._flags_ = ""; - } -=====*/ - -dojo.declare( - "dijit.form.ValidationTextBox", - dijit.form.TextBox, - { - // summary: - // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. - // tags: - // protected - - templateString: dojo.cache("dijit.form", "templates/ValidationTextBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"), - baseClass: "dijitTextBox dijitValidationTextBox", - - // required: Boolean - // User is required to enter data into this field. - required: false, - - // promptMessage: String - // If defined, display this hint string immediately on focus to the textbox, if empty. - // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). - // Think of this like a tooltip that tells the user what to do, not an error message - // that tells the user what they've done wrong. - // - // Message disappears when user starts typing. - promptMessage: "", - - // invalidMessage: String - // The message to display if value is invalid. - // The translated string value is read from the message file by default. - // Set to "" to use the promptMessage instead. - invalidMessage: "$_unset_$", - - // missingMessage: String - // The message to display if value is empty and the field is required. - // The translated string value is read from the message file by default. - // Set to "" to use the invalidMessage instead. - missingMessage: "$_unset_$", - - // message: String - // Currently error/prompt message. - // When using the default tooltip implementation, this will only be - // displayed when the field is focused. - message: "", - - // constraints: dijit.form.ValidationTextBox.__Constraints - // user-defined object needed to pass parameters to the validator functions - constraints: {}, - - // regExp: [extension protected] String - // regular expression string used to validate the input - // Do not specify both regExp and regExpGen - regExp: ".*", - - regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ - // summary: - // Overridable function used to generate regExp when dependent on constraints. - // Do not specify both regExp and regExpGen. - // tags: - // extension protected - return this.regExp; // String - }, - - // state: [readonly] String - // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) - state: "", - - // tooltipPosition: String[] - // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. - tooltipPosition: [], - - _setValueAttr: function(){ - // summary: - // Hook so set('value', ...) works. - this.inherited(arguments); - this.validate(this._focused); - }, - - validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ - // summary: - // Overridable function used to validate the text input against the regular expression. - // tags: - // protected - return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && - (!this.required || !this._isEmpty(value)) && - (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean - }, - - _isValidSubset: function(){ - // summary: - // Returns true if the value is either already valid or could be made valid by appending characters. - // This is used for validation while the user [may be] still typing. - return this.textbox.value.search(this._partialre) == 0; - }, - - isValid: function(/*Boolean*/ isFocused){ - // summary: - // Tests if value is valid. - // Can override with your own routine in a subclass. - // tags: - // protected - return this.validator(this.textbox.value, this.constraints); - }, - - _isEmpty: function(value){ - // summary: - // Checks for whitespace - return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean - }, - - getErrorMessage: function(/*Boolean*/ isFocused){ - // summary: - // Return an error message to show if appropriate - // tags: - // protected - return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String - }, - - getPromptMessage: function(/*Boolean*/ isFocused){ - // summary: - // Return a hint message to show when widget is first focused - // tags: - // protected - return this.promptMessage; // String - }, - - _maskValidSubsetError: true, - validate: function(/*Boolean*/ isFocused){ - // summary: - // Called by oninit, onblur, and onkeypress. - // description: - // Show missing or invalid messages if appropriate, and highlight textbox field. - // tags: - // protected - var message = ""; - var isValid = this.disabled || this.isValid(isFocused); - if(isValid){ this._maskValidSubsetError = true; } - var isEmpty = this._isEmpty(this.textbox.value); - var isValidSubset = !isValid && isFocused && this._isValidSubset(); - this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); - dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true"); - - if(this.state == "Error"){ - this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus - message = this.getErrorMessage(isFocused); - }else if(this.state == "Incomplete"){ - message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete - this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused - }else if(isEmpty){ - message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text - } - this.set("message", message); - - return isValid; - }, - - displayMessage: function(/*String*/ message){ - // summary: - // Overridable method to display validation errors/hints. - // By default uses a tooltip. - // tags: - // extension - dijit.hideTooltip(this.domNode); - if(message && this._focused){ - dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); - } - }, - - _refreshState: function(){ - // Overrides TextBox._refreshState() - this.validate(this._focused); - this.inherited(arguments); - }, - - //////////// INITIALIZATION METHODS /////////////////////////////////////// - - constructor: function(){ - this.constraints = {}; - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - if(!constraints.locale && this.lang){ - constraints.locale = this.lang; - } - this._set("constraints", constraints); - this._computePartialRE(); - }, - - _computePartialRE: function(){ - var p = this.regExpGen(this.constraints); - this.regExp = p; - var partialre = ""; - // parse the regexp and produce a new regexp that matches valid subsets - // if the regexp is .* then there's no use in matching subsets since everything is valid - if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, - function (re){ - switch(re.charAt(0)){ - case '{': - case '+': - case '?': - case '*': - case '^': - case '$': - case '|': - case '(': - partialre += re; - break; - case ")": - partialre += "|$)"; - break; - default: - partialre += "(?:"+re+"|$)"; - break; - } - } - );} - try{ // this is needed for now since the above regexp parsing needs more test verification - "".search(partialre); - }catch(e){ // should never be here unless the original RE is bad or the parsing is bad - partialre = this.regExp; - console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); - } // should never be here unless the original RE is bad or the parsing is bad - this._partialre = "^(?:" + partialre + ")$"; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); - if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } - if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } - if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } - if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } - this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - this.inherited(arguments); // call FormValueWidget._setDisabledAttr() - this._refreshState(); - }, - - _setRequiredAttr: function(/*Boolean*/ value){ - this._set("required", value); - dijit.setWaiState(this.focusNode, "required", value); - this._refreshState(); - }, - - _setMessageAttr: function(/*String*/ message){ - this._set("message", message); - this.displayMessage(message); - }, - - reset:function(){ - // Overrides dijit.form.TextBox.reset() by also - // hiding errors about partial matches - this._maskValidSubsetError = true; - this.inherited(arguments); - }, - - _onBlur: function(){ - // the message still exists but for back-compat, and to erase the tooltip - // (if the message is being displayed as a tooltip), call displayMessage('') - this.displayMessage(''); - - this.inherited(arguments); - } - } -); - -dojo.declare( - "dijit.form.MappedTextBox", - dijit.form.ValidationTextBox, - { - // summary: - // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have - // a visible formatted display value, and a serializable - // value in a hidden input field which is actually sent to the server. - // description: - // The visible display may - // be locale-dependent and interactive. The value sent to the server is stored in a hidden - // input field which uses the `name` attribute declared by the original widget. That value sent - // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically - // locale-neutral. - // tags: - // protected - - postMixInProperties: function(){ - this.inherited(arguments); - - // we want the name attribute to go to the hidden <input>, not the displayed <input>, - // so override _FormWidget.postMixInProperties() setting of nameAttrSetting - this.nameAttrSetting = ""; - }, - - serialize: function(/*anything*/ val, /*Object?*/ options){ - // summary: - // Overridable function used to convert the get('value') result to a canonical - // (non-localized) string. For example, will print dates in ISO format, and - // numbers the same way as they are represented in javascript. - // tags: - // protected extension - return val.toString ? val.toString() : ""; // String - }, - - toString: function(){ - // summary: - // Returns widget as a printable string using the widget's value - // tags: - // protected - var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized - return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String - }, - - validate: function(){ - // Overrides `dijit.form.TextBox.validate` - this.valueNode.value = this.toString(); - return this.inherited(arguments); - }, - - buildRendering: function(){ - // Overrides `dijit._Templated.buildRendering` - - this.inherited(arguments); - - // Create a hidden <input> node with the serialized value used for submit - // (as opposed to the displayed value). - // Passing in name as markup rather than calling dojo.create() with an attrs argument - // to make dojo.query(input[name=...]) work on IE. (see #8660) - this.valueNode = dojo.place("<input type='hidden'" + (this.name ? " name='" + this.name.replace(/'/g, """) + "'" : "") + "/>", this.textbox, "after"); - }, - - reset: function(){ - // Overrides `dijit.form.ValidationTextBox.reset` to - // reset the hidden textbox value to '' - this.valueNode.value = ''; - this.inherited(arguments); - } - } -); - -/*===== - dijit.form.RangeBoundTextBox.__Constraints = function(){ - // min: Number - // Minimum signed value. Default is -Infinity - // max: Number - // Maximum signed value. Default is +Infinity - this.min = min; - this.max = max; - } -=====*/ - -dojo.declare( - "dijit.form.RangeBoundTextBox", - dijit.form.MappedTextBox, - { - // summary: - // Base class for textbox form widgets which defines a range of valid values. - - // rangeMessage: String - // The message to display if value is out-of-range - rangeMessage: "", - - /*===== - // constraints: dijit.form.RangeBoundTextBox.__Constraints - constraints: {}, - ======*/ - - rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){ - // summary: - // Overridable function used to validate the range of the numeric input value. - // tags: - // protected - return ("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) && - ("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean - }, - - isInRange: function(/*Boolean*/ isFocused){ - // summary: - // Tests if the value is in the min/max range specified in constraints - // tags: - // protected - return this.rangeCheck(this.get('value'), this.constraints); - }, - - _isDefinitelyOutOfRange: function(){ - // summary: - // Returns true if the value is out of range and will remain - // out of range even if the user types more characters - var val = this.get('value'); - var isTooLittle = false; - var isTooMuch = false; - if("min" in this.constraints){ - var min = this.constraints.min; - min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min); - isTooLittle = (typeof min == "number") && min < 0; - } - if("max" in this.constraints){ - var max = this.constraints.max; - max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0); - isTooMuch = (typeof max == "number") && max > 0; - } - return isTooLittle || isTooMuch; - }, - - _isValidSubset: function(){ - // summary: - // Overrides `dijit.form.ValidationTextBox._isValidSubset`. - // Returns true if the input is syntactically valid, and either within - // range or could be made in range by more typing. - return this.inherited(arguments) && !this._isDefinitelyOutOfRange(); - }, - - isValid: function(/*Boolean*/ isFocused){ - // Overrides dijit.form.ValidationTextBox.isValid to check that the value is also in range. - return this.inherited(arguments) && - ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean - }, - - getErrorMessage: function(/*Boolean*/ isFocused){ - // Overrides dijit.form.ValidationTextBox.getErrorMessage to print "out of range" message if appropriate - var v = this.get('value'); - if(v !== null && v !== '' && v !== undefined && (typeof v != "number" || !isNaN(v)) && !this.isInRange(isFocused)){ // don't check isInRange w/o a real value - return this.rangeMessage; // String - } - return this.inherited(arguments); - }, - - postMixInProperties: function(){ - this.inherited(arguments); - if(!this.rangeMessage){ - this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); - this.rangeMessage = this.messages.rangeMessage; - } - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - this.inherited(arguments); - if(this.focusNode){ // not set when called from postMixInProperties - if(this.constraints.min !== undefined){ - dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min); - }else{ - dijit.removeWaiState(this.focusNode, "valuemin"); - } - if(this.constraints.max !== undefined){ - dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max); - }else{ - dijit.removeWaiState(this.focusNode, "valuemax"); - } - } - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', ...) works. - - dijit.setWaiState(this.focusNode, "valuenow", value); - this.inherited(arguments); - } - } -); - -} +//>>built +require({cache:{"url:dijit/form/templates/ValidationTextBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});define("dijit/form/ValidationTextBox",["dojo/_base/declare","dojo/i18n","./TextBox","../Tooltip","dojo/text!./templates/ValidationTextBox.html","dojo/i18n!./nls/validate"],function(_1,_2,_3,_4,_5){return _1("dijit.form.ValidationTextBox",_3,{templateString:_5,baseClass:"dijitTextBox dijitValidationTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",missingMessage:"$_unset_$",message:"",constraints:{},regExp:".*",regExpGen:function(){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this.focused);},validator:function(_6,_7){return (new RegExp("^(?:"+this.regExpGen(_7)+")"+(this.required?"":"?")+"$")).test(_6)&&(!this.required||!this._isEmpty(_6))&&(this._isEmpty(_6)||this.parse(_6,_7)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_8){return (this.trim?/^\s*$/:/^$/).test(_8);},getErrorMessage:function(){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_9){var _a="";var _b=this.disabled||this.isValid(_9);if(_b){this._maskValidSubsetError=true;}var _c=this._isEmpty(this.textbox.value);var _d=!_b&&_9&&this._isValidSubset();this._set("state",_b?"":(((((!this._hasBeenBlurred||_9)&&_c)||_d)&&this._maskValidSubsetError)?"Incomplete":"Error"));this.focusNode.setAttribute("aria-invalid",_b?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_9&&_d;_a=this.getErrorMessage(_9);}else{if(this.state=="Incomplete"){_a=this.getPromptMessage(_9);this._maskValidSubsetError=!this._hasBeenBlurred||_9;}else{if(_c){_a=this.getPromptMessage(_9);}}}this.set("message",_a);return _b;},displayMessage:function(_e){if(_e&&this.focused){_4.show(_e,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_4.hide(this.domNode);}},_refreshState:function(){this.validate(this.focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_f){if(!_f.locale&&this.lang){_f.locale=this.lang;}this._set("constraints",_f);this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _10="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_10+=re;break;case ")":_10+="|$)";break;default:_10+="(?:"+re+"|$)";break;}});}try{"".search(_10);}catch(e){_10=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_10+")$";},postMixInProperties:function(){this.inherited(arguments);this.messages=_2.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}if(!this.invalidMessage){this.invalidMessage=this.promptMessage;}if(this.missingMessage=="$_unset_$"){this.missingMessage=this.messages.missingMessage;}if(!this.missingMessage){this.missingMessage=this.invalidMessage;}this._setConstraintsAttr(this.constraints);},_setDisabledAttr:function(_11){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_12){this._set("required",_12);this.focusNode.setAttribute("aria-required",_12);this._refreshState();},_setMessageAttr:function(_13){this._set("message",_13);this.displayMessage(_13);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/ValidationTextBox.js.uncompressed.js b/lib/dijit/form/ValidationTextBox.js.uncompressed.js new file mode 100644 index 000000000..b9a0b42f6 --- /dev/null +++ b/lib/dijit/form/ValidationTextBox.js.uncompressed.js @@ -0,0 +1,296 @@ +require({cache:{ +'url:dijit/form/templates/ValidationTextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}}); +define("dijit/form/ValidationTextBox", [ + "dojo/_base/declare", // declare + "dojo/i18n", // i18n.getLocalization + "./TextBox", + "../Tooltip", + "dojo/text!./templates/ValidationTextBox.html", + "dojo/i18n!./nls/validate" +], function(declare, i18n, TextBox, Tooltip, template){ + +/*===== + var Tooltip = dijit.Tooltip; + var TextBox = dijit.form.TextBox; +=====*/ + + // module: + // dijit/form/ValidationTextBox + // summary: + // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. + + + /*===== + dijit.form.ValidationTextBox.__Constraints = function(){ + // locale: String + // locale used for validation, picks up value from this widget's lang attribute + // _flags_: anything + // various flags passed to regExpGen function + this.locale = ""; + this._flags_ = ""; + } + =====*/ + + return declare("dijit.form.ValidationTextBox", TextBox, { + // summary: + // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. + // tags: + // protected + + templateString: template, + baseClass: "dijitTextBox dijitValidationTextBox", + + // required: Boolean + // User is required to enter data into this field. + required: false, + + // promptMessage: String + // If defined, display this hint string immediately on focus to the textbox, if empty. + // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). + // Think of this like a tooltip that tells the user what to do, not an error message + // that tells the user what they've done wrong. + // + // Message disappears when user starts typing. + promptMessage: "", + + // invalidMessage: String + // The message to display if value is invalid. + // The translated string value is read from the message file by default. + // Set to "" to use the promptMessage instead. + invalidMessage: "$_unset_$", + + // missingMessage: String + // The message to display if value is empty and the field is required. + // The translated string value is read from the message file by default. + // Set to "" to use the invalidMessage instead. + missingMessage: "$_unset_$", + + // message: String + // Currently error/prompt message. + // When using the default tooltip implementation, this will only be + // displayed when the field is focused. + message: "", + + // constraints: dijit.form.ValidationTextBox.__Constraints + // user-defined object needed to pass parameters to the validator functions + constraints: {}, + + // regExp: [extension protected] String + // regular expression string used to validate the input + // Do not specify both regExp and regExpGen + regExp: ".*", + + regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ /*===== constraints =====*/){ + // summary: + // Overridable function used to generate regExp when dependent on constraints. + // Do not specify both regExp and regExpGen. + // tags: + // extension protected + return this.regExp; // String + }, + + // state: [readonly] String + // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) + state: "", + + // tooltipPosition: String[] + // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. + tooltipPosition: [], + + _setValueAttr: function(){ + // summary: + // Hook so set('value', ...) works. + this.inherited(arguments); + this.validate(this.focused); + }, + + validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ + // summary: + // Overridable function used to validate the text input against the regular expression. + // tags: + // protected + return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && + (!this.required || !this._isEmpty(value)) && + (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean + }, + + _isValidSubset: function(){ + // summary: + // Returns true if the value is either already valid or could be made valid by appending characters. + // This is used for validation while the user [may be] still typing. + return this.textbox.value.search(this._partialre) == 0; + }, + + isValid: function(/*Boolean*/ /*===== isFocused =====*/){ + // summary: + // Tests if value is valid. + // Can override with your own routine in a subclass. + // tags: + // protected + return this.validator(this.textbox.value, this.constraints); + }, + + _isEmpty: function(value){ + // summary: + // Checks for whitespace + return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean + }, + + getErrorMessage: function(/*Boolean*/ /*===== isFocused =====*/){ + // summary: + // Return an error message to show if appropriate + // tags: + // protected + return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String + }, + + getPromptMessage: function(/*Boolean*/ /*===== isFocused =====*/){ + // summary: + // Return a hint message to show when widget is first focused + // tags: + // protected + return this.promptMessage; // String + }, + + _maskValidSubsetError: true, + validate: function(/*Boolean*/ isFocused){ + // summary: + // Called by oninit, onblur, and onkeypress. + // description: + // Show missing or invalid messages if appropriate, and highlight textbox field. + // tags: + // protected + var message = ""; + var isValid = this.disabled || this.isValid(isFocused); + if(isValid){ this._maskValidSubsetError = true; } + var isEmpty = this._isEmpty(this.textbox.value); + var isValidSubset = !isValid && isFocused && this._isValidSubset(); + this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); + this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true"); + + if(this.state == "Error"){ + this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus + message = this.getErrorMessage(isFocused); + }else if(this.state == "Incomplete"){ + message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete + this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused + }else if(isEmpty){ + message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text + } + this.set("message", message); + + return isValid; + }, + + displayMessage: function(/*String*/ message){ + // summary: + // Overridable method to display validation errors/hints. + // By default uses a tooltip. + // tags: + // extension + if(message && this.focused){ + Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); + }else{ + Tooltip.hide(this.domNode); + } + }, + + _refreshState: function(){ + // Overrides TextBox._refreshState() + this.validate(this.focused); + this.inherited(arguments); + }, + + //////////// INITIALIZATION METHODS /////////////////////////////////////// + + constructor: function(){ + this.constraints = {}; + }, + + _setConstraintsAttr: function(/*Object*/ constraints){ + if(!constraints.locale && this.lang){ + constraints.locale = this.lang; + } + this._set("constraints", constraints); + this._computePartialRE(); + }, + + _computePartialRE: function(){ + var p = this.regExpGen(this.constraints); + this.regExp = p; + var partialre = ""; + // parse the regexp and produce a new regexp that matches valid subsets + // if the regexp is .* then there's no use in matching subsets since everything is valid + if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, + function(re){ + switch(re.charAt(0)){ + case '{': + case '+': + case '?': + case '*': + case '^': + case '$': + case '|': + case '(': + partialre += re; + break; + case ")": + partialre += "|$)"; + break; + default: + partialre += "(?:"+re+"|$)"; + break; + } + } + );} + try{ // this is needed for now since the above regexp parsing needs more test verification + "".search(partialre); + }catch(e){ // should never be here unless the original RE is bad or the parsing is bad + partialre = this.regExp; + console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); + } // should never be here unless the original RE is bad or the parsing is bad + this._partialre = "^(?:" + partialre + ")$"; + }, + + postMixInProperties: function(){ + this.inherited(arguments); + this.messages = i18n.getLocalization("dijit.form", "validate", this.lang); + if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } + if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } + if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } + if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } + this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints + }, + + _setDisabledAttr: function(/*Boolean*/ value){ + this.inherited(arguments); // call FormValueWidget._setDisabledAttr() + this._refreshState(); + }, + + _setRequiredAttr: function(/*Boolean*/ value){ + this._set("required", value); + this.focusNode.setAttribute("aria-required", value); + this._refreshState(); + }, + + _setMessageAttr: function(/*String*/ message){ + this._set("message", message); + this.displayMessage(message); + }, + + reset:function(){ + // Overrides dijit.form.TextBox.reset() by also + // hiding errors about partial matches + this._maskValidSubsetError = true; + this.inherited(arguments); + }, + + _onBlur: function(){ + // the message still exists but for back-compat, and to erase the tooltip + // (if the message is being displayed as a tooltip), call displayMessage('') + this.displayMessage(''); + + this.inherited(arguments); + } + }); +}); diff --git a/lib/dijit/form/VerticalRule.js b/lib/dijit/form/VerticalRule.js index 98f612cf0..2212665c0 100644 --- a/lib/dijit/form/VerticalRule.js +++ b/lib/dijit/form/VerticalRule.js @@ -1,35 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.VerticalRule"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.VerticalRule"] = true; -dojo.provide("dijit.form.VerticalRule"); -dojo.require("dijit.form.HorizontalRule"); - - -dojo.declare("dijit.form.VerticalRule", dijit.form.HorizontalRule, -{ - // summary: - // Hash marks for the `dijit.form.VerticalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>', - _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:', - -/*===== - // container: String - // This is either "leftDecoration" or "rightDecoration", - // to indicate whether this rule goes to the left or to the right of the slider. - // Note that on RTL system, "leftDecoration" would actually go to the right, and vice-versa. - container: "", -=====*/ - - // Overrides HorizontalRule._isHorizontal - _isHorizontal: false - -}); - -} +//>>built +define("dijit/form/VerticalRule",["dojo/_base/declare","./HorizontalRule"],function(_1,_2){return _1("dijit.form.VerticalRule",_2,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkV\" style=\"top:",_isHorizontal:false});});
\ No newline at end of file diff --git a/lib/dijit/form/VerticalRule.js.uncompressed.js b/lib/dijit/form/VerticalRule.js.uncompressed.js new file mode 100644 index 000000000..dd568d827 --- /dev/null +++ b/lib/dijit/form/VerticalRule.js.uncompressed.js @@ -0,0 +1,34 @@ +define("dijit/form/VerticalRule", [ + "dojo/_base/declare", // declare + "./HorizontalRule" +], function(declare, HorizontalRule){ + +/*===== + var HorizontalRule = dijit.form.HorizontalRule; +=====*/ + + // module: + // dijit/form/VerticalRule + // summary: + // Hash marks for the `dijit.form.VerticalSlider` + + return declare("dijit.form.VerticalRule", HorizontalRule, { + // summary: + // Hash marks for the `dijit.form.VerticalSlider` + + templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>', + _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:', + + /*===== + // container: String + // This is either "leftDecoration" or "rightDecoration", + // to indicate whether this rule goes to the left or to the right of the slider. + // Note that on RTL system, "leftDecoration" would actually go to the right, and vice-versa. + container: "", + =====*/ + + // Overrides HorizontalRule._isHorizontal + _isHorizontal: false + + }); +}); diff --git a/lib/dijit/form/VerticalRuleLabels.js b/lib/dijit/form/VerticalRuleLabels.js index 57caba8b5..6b2e8948c 100644 --- a/lib/dijit/form/VerticalRuleLabels.js +++ b/lib/dijit/form/VerticalRuleLabels.js @@ -1,33 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.VerticalRuleLabels"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.VerticalRuleLabels"] = true; -dojo.provide("dijit.form.VerticalRuleLabels"); -dojo.require("dijit.form.HorizontalRuleLabels"); - - -dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.HorizontalRuleLabels, -{ - // summary: - // Labels for the `dijit.form.VerticalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV"></div>', - - _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:', - _labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">', - - _calcPosition: function(pos){ - // Overrides HorizontalRuleLabel._calcPosition() - return 100-pos; - }, - - // needed to prevent labels from being reversed in RTL mode - _isHorizontal: false -}); - -} +//>>built +define("dijit/form/VerticalRuleLabels",["dojo/_base/declare","./HorizontalRuleLabels"],function(_1,_2){return _1("dijit.form.VerticalRuleLabels",_2,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(_3){return 100-_3;},_isHorizontal:false});});
\ No newline at end of file diff --git a/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js new file mode 100644 index 000000000..45d8f41d8 --- /dev/null +++ b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js @@ -0,0 +1,32 @@ +define("dijit/form/VerticalRuleLabels", [ + "dojo/_base/declare", // declare + "./HorizontalRuleLabels" +], function(declare, HorizontalRuleLabels){ + +/*===== + var HorizontalRuleLabels = dijit.form.HorizontalRuleLabels; +=====*/ + + // module: + // dijit/form/VerticalRuleLabels + // summary: + // Labels for the `dijit.form.VerticalSlider` + + return declare("dijit.form.VerticalRuleLabels", HorizontalRuleLabels, { + // summary: + // Labels for the `dijit.form.VerticalSlider` + + templateString: '<div class="dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV"></div>', + + _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:', + _labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">', + + _calcPosition: function(pos){ + // Overrides HorizontalRuleLabel._calcPosition() + return 100-pos; + }, + + // needed to prevent labels from being reversed in RTL mode + _isHorizontal: false + }); +}); diff --git a/lib/dijit/form/VerticalSlider.js b/lib/dijit/form/VerticalSlider.js index f074c7cd1..aae7524fb 100644 --- a/lib/dijit/form/VerticalSlider.js +++ b/lib/dijit/form/VerticalSlider.js @@ -1,42 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form.VerticalSlider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.VerticalSlider"] = true; -dojo.provide("dijit.form.VerticalSlider"); -dojo.require("dijit.form.HorizontalSlider"); - - -dojo.declare( - "dijit.form.VerticalSlider", - dijit.form.HorizontalSlider, -{ - // summary: - // A form widget that allows one to select a value with a vertically draggable handle - - templateString: dojo.cache("dijit.form", "templates/VerticalSlider.html", "<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" dojoAttachPoint=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" dojoAttachEvent=\"onmousedown:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td dojoAttachPoint=\"leftDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" dojoAttachEvent=\"onmousedown:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td dojoAttachPoint=\"containerNode,rightDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" dojoAttachEvent=\"onmousedown:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" dojoAttachPoint=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"), - _mousePixelCoord: "pageY", - _pixelCount: "h", - _startingPixelCoord: "y", - _startingPixelCount: "t", - _handleOffsetCoord: "top", - _progressPixelSize: "height", - - // _descending: Boolean - // Specifies if the slider values go from high-on-top (true), or low-on-top (false) - // TODO: expose this in 1.2 - the css progress/remaining bar classes need to be reversed - _descending: true, - - _isReversed: function(){ - // summary: - // Overrides HorizontalSlider._isReversed. - // Indicates if values are high on top (with low numbers on the bottom). - return this._descending; - } -}); - -} +//>>built +require({cache:{"url:dijit/form/templates/VerticalSlider.html":"<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td data-dojo-attach-point=\"leftDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" data-dojo-attach-event=\"press:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td data-dojo-attach-point=\"containerNode,rightDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"}});define("dijit/form/VerticalSlider",["dojo/_base/declare","./HorizontalSlider","dojo/text!./templates/VerticalSlider.html"],function(_1,_2,_3){return _1("dijit.form.VerticalSlider",_2,{templateString:_3,_mousePixelCoord:"pageY",_pixelCount:"h",_startingPixelCoord:"y",_handleOffsetCoord:"top",_progressPixelSize:"height",_descending:true,_isReversed:function(){return this._descending;}});});
\ No newline at end of file diff --git a/lib/dijit/form/VerticalSlider.js.uncompressed.js b/lib/dijit/form/VerticalSlider.js.uncompressed.js new file mode 100644 index 000000000..691441d02 --- /dev/null +++ b/lib/dijit/form/VerticalSlider.js.uncompressed.js @@ -0,0 +1,42 @@ +require({cache:{ +'url:dijit/form/templates/VerticalSlider.html':"<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td data-dojo-attach-point=\"leftDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" data-dojo-attach-event=\"press:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td data-dojo-attach-point=\"containerNode,rightDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"}}); +define("dijit/form/VerticalSlider", [ + "dojo/_base/declare", // declare + "./HorizontalSlider", + "dojo/text!./templates/VerticalSlider.html" +], function(declare, HorizontalSlider, template){ + +/*===== + var HorizontalSlider = dijit.form.HorizontalSlider; +=====*/ + + // module: + // dijit/form/VerticalSlider + // summary: + // A form widget that allows one to select a value with a vertically draggable handle + + + return declare("dijit.form.VerticalSlider", HorizontalSlider, { + // summary: + // A form widget that allows one to select a value with a vertically draggable handle + + templateString: template, + _mousePixelCoord: "pageY", + _pixelCount: "h", + _startingPixelCoord: "y", + _handleOffsetCoord: "top", + _progressPixelSize: "height", + + // _descending: Boolean + // Specifies if the slider values go from high-on-top (true), or low-on-top (false) + // TODO: expose this in 1.2 - the css progress/remaining bar classes need to be reversed + _descending: true, + + _isReversed: function(){ + // summary: + // Overrides HorizontalSlider._isReversed. + // Indicates if values are high on top (with low numbers on the bottom). + return this._descending; + } + }); +}); diff --git a/lib/dijit/form/_AutoCompleterMixin.js b/lib/dijit/form/_AutoCompleterMixin.js new file mode 100644 index 000000000..2487e0277 --- /dev/null +++ b/lib/dijit/form/_AutoCompleterMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_AutoCompleterMixin",["dojo/_base/connect","dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/dom-attr","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/query","dojo/regexp","dojo/_base/sniff","dojo/string","dojo/_base/window","./DataList","../registry","./_TextBoxMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){return _3("dijit.form._AutoCompleterMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,maxHeight:-1,_stopClickEvents:false,_getCaretPos:function(_11){var pos=0;if(typeof (_11.selectionStart)=="number"){pos=_11.selectionStart;}else{if(_b("ie")){var tr=_d.doc.selection.createRange().duplicate();var ntr=_11.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_12,_13){_13=parseInt(_13);_10.selectInputText(_12,_13,_13);},_setDisabledAttr:function(_14){this.inherited(arguments);this.domNode.setAttribute("aria-disabled",_14);},_abortQuery:function(){if(this.searchTimer){clearTimeout(this.searchTimer);this.searchTimer=null;}if(this._fetchHandle){if(this._fetchHandle.cancel){this._cancelingQuery=true;this._fetchHandle.cancel();this._cancelingQuery=false;}this._fetchHandle=null;}},_onInput:function(evt){this.inherited(arguments);if(evt.charOrCode==229){this._onKey(evt);}},_onKey:function(evt){if(this.disabled||this.readOnly){return;}var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==_7.SHIFT){return;}var _15=false;var pw=this.dropDown;var _16=null;this._prev_key_backspace=false;this._abortQuery();this.inherited(arguments);if(this._opened){_16=pw.getHighlightedOption();}switch(key){case _7.PAGE_DOWN:case _7.DOWN_ARROW:case _7.PAGE_UP:case _7.UP_ARROW:if(this._opened){this._announceOption(_16);}_6.stop(evt);break;case _7.ENTER:if(_16){if(_16==pw.nextButton){this._nextSearch(1);_6.stop(evt);break;}else{if(_16==pw.previousButton){this._nextSearch(-1);_6.stop(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}if(this._opened||this._fetchHandle){_6.stop(evt);}case _7.TAB:var _17=this.get("displayedValue");if(pw&&(_17==pw._messages["previousMessage"]||_17==pw._messages["nextMessage"])){break;}if(_16){this._selectOption(_16);}case _7.ESCAPE:if(this._opened){this._lastQuery=null;this.closeDropDown();}break;case " ":if(_16){_6.stop(evt);this._selectOption(_16);this.closeDropDown();}else{_15=true;}break;case _7.DELETE:case _7.BACKSPACE:this._prev_key_backspace=true;_15=true;break;default:_15=typeof key=="string"||key==229;}if(_15){this.item=undefined;this.searchTimer=setTimeout(_8.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(_18){var fn=this.focusNode;_10.selectInputText(fn,fn.value.length);var _19=this.ignoreCase?"toLowerCase":"substr";if(_18[_19](0).indexOf(this.focusNode.value[_19](0))==0){var _1a=this.autoComplete?this._getCaretPos(fn):fn.value.length;if((_1a+1)>fn.value.length){fn.value=_18;_10.selectInputText(fn,_1a);}}else{fn.value=_18;_10.selectInputText(fn);}},_openResultList:function(_1b,_1c,_1d){this._fetchHandle=null;if(this.disabled||this.readOnly||(_1c[this.searchAttr]!==this._lastQuery)){return;}var _1e=this.dropDown.getHighlightedOption();this.dropDown.clearResultList();if(!_1b.length&&_1d.start==0){this.closeDropDown();return;}var _1f=this.dropDown.createOptions(_1b,_1d,_8.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_1d.direction){if(1==_1d.direction){this.dropDown.highlightFirstOption();}else{if(-1==_1d.direction){this.dropDown.highlightLastOption();}}if(_1e){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_1c[this.searchAttr].toString())){this._announceOption(_1f[1]);}}},_showResultList:function(){this.closeDropDown(true);this.openDropDown();this.domNode.setAttribute("aria-expanded","true");},loadDropDown:function(){this._startSearchAll();},isLoaded:function(){return false;},closeDropDown:function(){this._abortQuery();if(this._opened){this.inherited(arguments);this.domNode.setAttribute("aria-expanded","false");this.focusNode.removeAttribute("aria-activedescendant");}},_setBlurValue:function(){var _20=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_20==pw._messages["previousMessage"]||_20==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_20);}else{if(this.value!=this._lastValueReported){this._handleOnChange(this.value,true);}this._refreshState();}}},_setItemAttr:function(_21,_22,_23){var _24="";if(_21){if(!_23){_23=this.store._oldAPI?this.store.getValue(_21,this.searchAttr):_21[this.searchAttr];}_24=this._getValueField()!=this.searchAttr?this.store.getIdentity(_21):_23;}this.set("value",_24,_22,_23,_21);},_announceOption:function(_25){if(!_25){return;}var _26;if(_25==this.dropDown.nextButton||_25==this.dropDown.previousButton){_26=_25.innerHTML;this.item=undefined;this.value="";}else{_26=(this.store._oldAPI?this.store.getValue(_25.item,this.searchAttr):_25.item[this.searchAttr]).toString();this.set("item",_25.item,false,_26);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);this.focusNode.setAttribute("aria-activedescendant",_5.get(_25,"id"));this._autoCompleteText(_26);},_selectOption:function(_27){this.closeDropDown();if(_27){this._announceOption(_27);}this._setCaretPos(this.focusNode,this.focusNode.value.length);this._handleOnChange(this.value,true);},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_getQueryString:function(_28){return _c.substitute(this.queryExpr,[_28]);},_startSearch:function(key){if(!this.dropDown){var _29=this.id+"_popup",_2a=_8.isString(this.dropDownClass)?_8.getObject(this.dropDownClass,false):this.dropDownClass;this.dropDown=new _2a({onChange:_8.hitch(this,this._selectOption),id:_29,dir:this.dir,textDir:this.textDir});this.focusNode.removeAttribute("aria-activedescendant");this.textbox.setAttribute("aria-owns",_29);}this._lastInput=key;var _2b=_8.clone(this.query);var _2c={start:0,count:this.pageSize,queryOptions:{ignoreCase:this.ignoreCase,deep:true}};_8.mixin(_2c,this.fetchProperties);var qs=this._getQueryString(key),q;if(this.store._oldAPI){q=qs;}else{q=_2.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_2b[this.searchAttr]=q;var _2d=this,_2e=function(){var _2f=_2d._fetchHandle=_2d.store.query(_2b,_2c);_4.when(_2f,function(res){_2d._fetchHandle=null;res.total=_2f.total;_2d._openResultList(res,_2b,_2c);},function(err){_2d._fetchHandle=null;if(!_2d._cancelingQuery){console.error(_2d.declaredClass+" "+err.toString());_2d.closeDropDown();}});};this.searchTimer=setTimeout(_8.hitch(this,function(_30,_31){this.searchTimer=null;_2e();this._nextSearch=this.dropDown.onPage=function(_32){_2c.start+=_2c.count*_32;_2c.direction=_32;_2e();_31.focus();};},_2b,this),this.searchDelay);},_getValueField:function(){return this.searchAttr;},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _33=this.srcNodeRef;var _34=this.list;if(_34){this.store=_f.byId(_34);}else{this.store=new _e({},_33);}if(!("value" in this.params)){var _35=(this.item=this.store.fetchSelectedItem());if(_35){var _36=this._getValueField();this.value=this.store._oldAPI?this.store.getValue(_35,_36):_35[_36];}}}this.inherited(arguments);},postCreate:function(){var _37=_9("label[for=\""+this.id+"\"]");if(_37.length){_37[0].id=(this.id+"_label");this.domNode.setAttribute("aria-labelledby",_37[0].id);}this.inherited(arguments);},_getMenuLabelFromItem:function(_38){var _39=this.labelFunc(_38,this.store),_3a=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_39=this.doHighlight(_39,this._escapeHtml(this._lastInput));_3a="html";}return {html:_3a=="html",label:_39};},doHighlight:function(_3b,_3c){var _3d=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");_3c=_a.escapeString(_3c);return this._escapeHtml(_3b).replace(new RegExp((i==0?"^":"")+"("+_3c+")"+(i==(this.queryExpr.length-4)?"$":""),_3d),"<span class=\"dijitComboBoxHighlightMatch\">$1</span>");},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""");return str;},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(_3e,_3f){return (_3f._oldAPI?_3f.getValue(_3e,this.labelAttr||this.searchAttr):_3e[this.labelAttr||this.searchAttr]).toString();},_setValueAttr:function(_40,_41,_42,_43){this._set("item",_43||null);if(!_40){_40="";}this.inherited(arguments);},_setTextDirAttr:function(_44){this.inherited(arguments);if(this.dropDown){this.dropDown._set("textDir",_44);}}});});
\ No newline at end of file diff --git a/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js new file mode 100644 index 000000000..57cbb27b6 --- /dev/null +++ b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js @@ -0,0 +1,765 @@ +define("dijit/form/_AutoCompleterMixin", [ + "dojo/_base/connect", // keys keys.SHIFT + "dojo/data/util/filter", // patternToRegExp + "dojo/_base/declare", // declare + "dojo/_base/Deferred", // Deferred.when + "dojo/dom-attr", // domAttr.get + "dojo/_base/event", // event.stop + "dojo/keys", + "dojo/_base/lang", // lang.clone lang.hitch + "dojo/query", // query + "dojo/regexp", // regexp.escapeString + "dojo/_base/sniff", // has("ie") + "dojo/string", // string.substitute + "dojo/_base/window", // win.doc.selection.createRange + "./DataList", + "../registry", // registry.byId + "./_TextBoxMixin" // defines _TextBoxMixin.selectInputText +], function(connect, filter, declare, Deferred, domAttr, event, keys, lang, query, regexp, has, string, win, + DataList, registry, _TextBoxMixin){ + + // module: + // dijit/form/_AutoCompleterMixin + // summary: + // A mixin that implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect` + + + return declare("dijit.form._AutoCompleterMixin", null, { + // summary: + // A mixin that implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect` + // description: + // All widgets that mix in dijit.form._AutoCompleterMixin must extend `dijit.form._FormValueWidget`. + // tags: + // protected + + // item: Object + // This is the item returned by the dojo.data.store implementation that + // provides the data for this ComboBox, it's the currently selected item. + item: null, + + // pageSize: Integer + // Argument to data provider. + // Specifies number of search results per page (before hitting "next" button) + pageSize: Infinity, + + // store: [const] dojo.store.api.Store + // Reference to data provider object used by this ComboBox + store: null, + + // fetchProperties: Object + // Mixin to the store's fetch. + // For example, to set the sort order of the ComboBox menu, pass: + // | { sort: [{attribute:"name",descending: true}] } + // To override the default queryOptions so that deep=false, do: + // | { queryOptions: {ignoreCase: true, deep: false} } + fetchProperties:{}, + + // query: Object + // A query that can be passed to 'store' to initially filter the items, + // before doing further filtering based on `searchAttr` and the key. + // Any reference to the `searchAttr` is ignored. + query: {}, + + // autoComplete: Boolean + // If user types in a partial string, and then tab out of the `<input>` box, + // automatically copy the first entry displayed in the drop down list to + // the `<input>` field + autoComplete: true, + + // highlightMatch: String + // One of: "first", "all" or "none". + // + // If the ComboBox/FilteringSelect opens with the search results and the searched + // string can be found, it will be highlighted. If set to "all" + // then will probably want to change `queryExpr` parameter to '*${0}*' + // + // Highlighting is only performed when `labelType` is "text", so as to not + // interfere with any HTML markup an HTML label might contain. + highlightMatch: "first", + + // searchDelay: Integer + // Delay in milliseconds between when user types something and we start + // searching based on that value + searchDelay: 100, + + // searchAttr: String + // Search for items in the data store where this attribute (in the item) + // matches what the user typed + searchAttr: "name", + + // labelAttr: String? + // The entries in the drop down list come from this attribute in the + // dojo.data items. + // If not specified, the searchAttr attribute is used instead. + labelAttr: "", + + // labelType: String + // Specifies how to interpret the labelAttr in the data store items. + // Can be "html" or "text". + labelType: "text", + + // queryExpr: String + // This specifies what query ComboBox/FilteringSelect sends to the data store, + // based on what the user has typed. Changing this expression will modify + // whether the drop down shows only exact matches, a "starting with" match, + // etc. Use it in conjunction with highlightMatch. + // dojo.data query expression pattern. + // `${0}` will be substituted for the user text. + // `*` is used for wildcards. + // `${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is" + queryExpr: "${0}*", + + // ignoreCase: Boolean + // Set true if the ComboBox/FilteringSelect should ignore case when matching possible items + ignoreCase: true, + + // Flags to _HasDropDown to limit height of drop down to make it fit in viewport + maxHeight: -1, + + // For backwards compatibility let onClick events propagate, even clicks on the down arrow button + _stopClickEvents: false, + + _getCaretPos: function(/*DomNode*/ element){ + // khtml 3.5.2 has selection* methods as does webkit nightlies from 2005-06-22 + var pos = 0; + if(typeof(element.selectionStart) == "number"){ + // FIXME: this is totally borked on Moz < 1.3. Any recourse? + pos = element.selectionStart; + }else if(has("ie")){ + // in the case of a mouse click in a popup being handled, + // then the win.doc.selection is not the textarea, but the popup + // var r = win.doc.selection.createRange(); + // hack to get IE 6 to play nice. What a POS browser. + var tr = win.doc.selection.createRange().duplicate(); + var ntr = element.createTextRange(); + tr.move("character",0); + ntr.move("character",0); + try{ + // If control doesn't have focus, you get an exception. + // Seems to happen on reverse-tab, but can also happen on tab (seems to be a race condition - only happens sometimes). + // There appears to be no workaround for this - googled for quite a while. + ntr.setEndPoint("EndToEnd", tr); + pos = String(ntr.text).replace(/\r/g,"").length; + }catch(e){ + // If focus has shifted, 0 is fine for caret pos. + } + } + return pos; + }, + + _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){ + location = parseInt(location); + _TextBoxMixin.selectInputText(element, location, location); + }, + + _setDisabledAttr: function(/*Boolean*/ value){ + // Additional code to set disabled state of ComboBox node. + // Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr(). + this.inherited(arguments); + this.domNode.setAttribute("aria-disabled", value); + }, + + _abortQuery: function(){ + // stop in-progress query + if(this.searchTimer){ + clearTimeout(this.searchTimer); + this.searchTimer = null; + } + if(this._fetchHandle){ + if(this._fetchHandle.cancel){ + this._cancelingQuery = true; + this._fetchHandle.cancel(); + this._cancelingQuery = false; + } + this._fetchHandle = null; + } + }, + + _onInput: function(/*Event*/ evt){ + // summary: + // Handles paste events + this.inherited(arguments); + if(evt.charOrCode == 229){ // IME or cut/paste event + this._onKey(evt); + } + }, + + _onKey: function(/*Event*/ evt){ + // summary: + // Handles keyboard events + + if(this.disabled || this.readOnly){ return; } + var key = evt.charOrCode; + + // except for cutting/pasting case - ctrl + x/v + if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == keys.SHIFT){ + return; // throw out weird key combinations and spurious events + } + + var doSearch = false; + var pw = this.dropDown; + var highlighted = null; + this._prev_key_backspace = false; + this._abortQuery(); + + // _HasDropDown will do some of the work: + // 1. when drop down is not yet shown: + // - if user presses the down arrow key, call loadDropDown() + // 2. when drop down is already displayed: + // - on ESC key, call closeDropDown() + // - otherwise, call dropDown.handleKey() to process the keystroke + this.inherited(arguments); + + if(this._opened){ + highlighted = pw.getHighlightedOption(); + } + switch(key){ + case keys.PAGE_DOWN: + case keys.DOWN_ARROW: + case keys.PAGE_UP: + case keys.UP_ARROW: + // Keystroke caused ComboBox_menu to move to a different item. + // Copy new item to <input> box. + if(this._opened){ + this._announceOption(highlighted); + } + event.stop(evt); + break; + + case keys.ENTER: + // prevent submitting form if user presses enter. Also + // prevent accepting the value if either Next or Previous + // are selected + if(highlighted){ + // only stop event on prev/next + if(highlighted == pw.nextButton){ + this._nextSearch(1); + event.stop(evt); + break; + }else if(highlighted == pw.previousButton){ + this._nextSearch(-1); + event.stop(evt); + break; + } + }else{ + // Update 'value' (ex: KY) according to currently displayed text + this._setBlurValue(); // set value if needed + this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting + } + // default case: + // if enter pressed while drop down is open, or for FilteringSelect, + // if we are in the middle of a query to convert a directly typed in value to an item, + // prevent submit + if(this._opened || this._fetchHandle){ + event.stop(evt); + } + // fall through + + case keys.TAB: + var newvalue = this.get('displayedValue'); + // if the user had More Choices selected fall into the + // _onBlur handler + if(pw && ( + newvalue == pw._messages["previousMessage"] || + newvalue == pw._messages["nextMessage"]) + ){ + break; + } + if(highlighted){ + this._selectOption(highlighted); + } + // fall through + + case keys.ESCAPE: + if(this._opened){ + this._lastQuery = null; // in case results come back later + this.closeDropDown(); + } + break; + + case ' ': + if(highlighted){ + // user is effectively clicking a choice in the drop down menu + event.stop(evt); + this._selectOption(highlighted); + this.closeDropDown(); + }else{ + // user typed a space into the input box, treat as normal character + doSearch = true; + } + break; + + case keys.DELETE: + case keys.BACKSPACE: + this._prev_key_backspace = true; + doSearch = true; + break; + + default: + // Non char keys (F1-F12 etc..) shouldn't open list. + // Ascii characters and IME input (Chinese, Japanese etc.) should. + //IME input produces keycode == 229. + doSearch = typeof key == 'string' || key == 229; + } + if(doSearch){ + // need to wait a tad before start search so that the event + // bubbles through DOM and we have value visible + this.item = undefined; // undefined means item needs to be set + this.searchTimer = setTimeout(lang.hitch(this, "_startSearchFromInput"),1); + } + }, + + _autoCompleteText: function(/*String*/ text){ + // summary: + // Fill in the textbox with the first item from the drop down + // list, and highlight the characters that were + // auto-completed. For example, if user typed "CA" and the + // drop down list appeared, the textbox would be changed to + // "California" and "ifornia" would be highlighted. + + var fn = this.focusNode; + + // IE7: clear selection so next highlight works all the time + _TextBoxMixin.selectInputText(fn, fn.value.length); + // does text autoComplete the value in the textbox? + var caseFilter = this.ignoreCase? 'toLowerCase' : 'substr'; + if(text[caseFilter](0).indexOf(this.focusNode.value[caseFilter](0)) == 0){ + var cpos = this.autoComplete ? this._getCaretPos(fn) : fn.value.length; + // only try to extend if we added the last character at the end of the input + if((cpos+1) > fn.value.length){ + // only add to input node as we would overwrite Capitalisation of chars + // actually, that is ok + fn.value = text;//.substr(cpos); + // visually highlight the autocompleted characters + _TextBoxMixin.selectInputText(fn, cpos); + } + }else{ + // text does not autoComplete; replace the whole value and highlight + fn.value = text; + _TextBoxMixin.selectInputText(fn); + } + }, + + _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){ + // summary: + // Callback when a search completes. + // description: + // 1. generates drop-down list and calls _showResultList() to display it + // 2. if this result list is from user pressing "more choices"/"previous choices" + // then tell screen reader to announce new option + this._fetchHandle = null; + if( this.disabled || + this.readOnly || + (query[this.searchAttr] !== this._lastQuery) // TODO: better way to avoid getting unwanted notify + ){ + return; + } + var wasSelected = this.dropDown.getHighlightedOption(); + this.dropDown.clearResultList(); + if(!results.length && options.start == 0){ // if no results and not just the previous choices button + this.closeDropDown(); + return; + } + + // Fill in the textbox with the first item from the drop down list, + // and highlight the characters that were auto-completed. For + // example, if user typed "CA" and the drop down list appeared, the + // textbox would be changed to "California" and "ifornia" would be + // highlighted. + + var nodes = this.dropDown.createOptions( + results, + options, + lang.hitch(this, "_getMenuLabelFromItem") + ); + + // show our list (only if we have content, else nothing) + this._showResultList(); + + // #4091: + // tell the screen reader that the paging callback finished by + // shouting the next choice + if(options.direction){ + if(1 == options.direction){ + this.dropDown.highlightFirstOption(); + }else if(-1 == options.direction){ + this.dropDown.highlightLastOption(); + } + if(wasSelected){ + this._announceOption(this.dropDown.getHighlightedOption()); + } + }else if(this.autoComplete && !this._prev_key_backspace + // when the user clicks the arrow button to show the full list, + // startSearch looks for "*". + // it does not make sense to autocomplete + // if they are just previewing the options available. + && !/^[*]+$/.test(query[this.searchAttr].toString())){ + this._announceOption(nodes[1]); // 1st real item + } + }, + + _showResultList: function(){ + // summary: + // Display the drop down if not already displayed, or if it is displayed, then + // reposition it if necessary (reposition may be necessary if drop down's height changed). + this.closeDropDown(true); + this.openDropDown(); + this.domNode.setAttribute("aria-expanded", "true"); + }, + + loadDropDown: function(/*Function*/ /*===== callback =====*/){ + // Overrides _HasDropDown.loadDropDown(). + // This is called when user has pressed button icon or pressed the down arrow key + // to open the drop down. + + this._startSearchAll(); + }, + + isLoaded: function(){ + // signal to _HasDropDown that it needs to call loadDropDown() to load the + // drop down asynchronously before displaying it + return false; + }, + + closeDropDown: function(){ + // Overrides _HasDropDown.closeDropDown(). Closes the drop down (assuming that it's open). + // This method is the callback when the user types ESC or clicking + // the button icon while the drop down is open. It's also called by other code. + this._abortQuery(); + if(this._opened){ + this.inherited(arguments); + this.domNode.setAttribute("aria-expanded", "false"); + this.focusNode.removeAttribute("aria-activedescendant"); + } + }, + + _setBlurValue: function(){ + // if the user clicks away from the textbox OR tabs away, set the + // value to the textbox value + // #4617: + // if value is now more choices or previous choices, revert + // the value + var newvalue = this.get('displayedValue'); + var pw = this.dropDown; + if(pw && ( + newvalue == pw._messages["previousMessage"] || + newvalue == pw._messages["nextMessage"] + ) + ){ + this._setValueAttr(this._lastValueReported, true); + }else if(typeof this.item == "undefined"){ + // Update 'value' (ex: KY) according to currently displayed text + this.item = null; + this.set('displayedValue', newvalue); + }else{ + if(this.value != this._lastValueReported){ + this._handleOnChange(this.value, true); + } + this._refreshState(); + } + }, + + _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ + // summary: + // Set the displayed valued in the input box, and the hidden value + // that gets submitted, based on a dojo.data store item. + // description: + // Users shouldn't call this function; they should be calling + // set('item', value) + // tags: + // private + var value = ''; + if(item){ + if(!displayedValue){ + displayedValue = this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API) + this.store.getValue(item, this.searchAttr) : item[this.searchAttr]; + } + value = this._getValueField() != this.searchAttr ? this.store.getIdentity(item) : displayedValue; + } + this.set('value', value, priorityChange, displayedValue, item); + }, + + _announceOption: function(/*Node*/ node){ + // summary: + // a11y code that puts the highlighted option in the textbox. + // This way screen readers will know what is happening in the + // menu. + + if(!node){ + return; + } + // pull the text value from the item attached to the DOM node + var newValue; + if(node == this.dropDown.nextButton || + node == this.dropDown.previousButton){ + newValue = node.innerHTML; + this.item = undefined; + this.value = ''; + }else{ + newValue = (this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API) + this.store.getValue(node.item, this.searchAttr) : node.item[this.searchAttr]).toString(); + this.set('item', node.item, false, newValue); + } + // get the text that the user manually entered (cut off autocompleted text) + this.focusNode.value = this.focusNode.value.substring(0, this._lastInput.length); + // set up ARIA activedescendant + this.focusNode.setAttribute("aria-activedescendant", domAttr.get(node, "id")); + // autocomplete the rest of the option to announce change + this._autoCompleteText(newValue); + }, + + _selectOption: function(/*DomNode*/ target){ + // summary: + // Menu callback function, called when an item in the menu is selected. + this.closeDropDown(); + if(target){ + this._announceOption(target); + } + this._setCaretPos(this.focusNode, this.focusNode.value.length); + this._handleOnChange(this.value, true); + }, + + _startSearchAll: function(){ + this._startSearch(''); + }, + + _startSearchFromInput: function(){ + this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1")); + }, + + _getQueryString: function(/*String*/ text){ + return string.substitute(this.queryExpr, [text]); + }, + + _startSearch: function(/*String*/ key){ + // summary: + // Starts a search for elements matching key (key=="" means to return all items), + // and calls _openResultList() when the search completes, to display the results. + if(!this.dropDown){ + var popupId = this.id + "_popup", + dropDownConstructor = lang.isString(this.dropDownClass) ? + lang.getObject(this.dropDownClass, false) : this.dropDownClass; + this.dropDown = new dropDownConstructor({ + onChange: lang.hitch(this, this._selectOption), + id: popupId, + dir: this.dir, + textDir: this.textDir + }); + this.focusNode.removeAttribute("aria-activedescendant"); + this.textbox.setAttribute("aria-owns",popupId); // associate popup with textbox + } + this._lastInput = key; // Store exactly what was entered by the user. + + // Setup parameters to be passed to store.query(). + // Create a new query to prevent accidentally querying for a hidden + // value from FilteringSelect's keyField + var query = lang.clone(this.query); // #5970 + var options = { + start: 0, + count: this.pageSize, + queryOptions: { // remove for 2.0 + ignoreCase: this.ignoreCase, + deep: true + } + }; + lang.mixin(options, this.fetchProperties); + + // Generate query + var qs = this._getQueryString(key), q; + if(this.store._oldAPI){ + // remove this branch for 2.0 + q = qs; + }else{ + // Query on searchAttr is a regex for benefit of dojo.store.Memory, + // but with a toString() method to help dojo.store.JsonRest. + // Search string like "Co*" converted to regex like /^Co.*$/i. + q = filter.patternToRegExp(qs, this.ignoreCase); + q.toString = function(){ return qs; }; + } + this._lastQuery = query[this.searchAttr] = q; + + // Function to run the query, wait for the results, and then call _openResultList() + var _this = this, + startQuery = function(){ + var resPromise = _this._fetchHandle = _this.store.query(query, options); + Deferred.when(resPromise, function(res){ + _this._fetchHandle = null; + res.total = resPromise.total; + _this._openResultList(res, query, options); + }, function(err){ + _this._fetchHandle = null; + if(!_this._cancelingQuery){ // don't treat canceled query as an error + console.error(_this.declaredClass + ' ' + err.toString()); + _this.closeDropDown(); + } + }); + }; + + // #5970: set _lastQuery, *then* start the timeout + // otherwise, if the user types and the last query returns before the timeout, + // _lastQuery won't be set and their input gets rewritten + + this.searchTimer = setTimeout(lang.hitch(this, function(query, _this){ + this.searchTimer = null; + + startQuery(); + + // Setup method to handle clicking next/previous buttons to page through results + this._nextSearch = this.dropDown.onPage = function(direction){ + options.start += options.count * direction; + // tell callback the direction of the paging so the screen + // reader knows which menu option to shout + options.direction = direction; + startQuery(); + _this.focus(); + }; + }, query, this), this.searchDelay); + }, + + _getValueField: function(){ + // summary: + // Helper for postMixInProperties() to set this.value based on data inlined into the markup. + // Returns the attribute name in the item (in dijit.form._ComboBoxDataStore) to use as the value. + return this.searchAttr; + }, + + //////////// INITIALIZATION METHODS /////////////////////////////////////// + + constructor: function(){ + this.query={}; + this.fetchProperties={}; + }, + + postMixInProperties: function(){ + if(!this.store){ + var srcNodeRef = this.srcNodeRef; + var list = this.list; + if(list){ + this.store = registry.byId(list); + }else{ + // if user didn't specify store, then assume there are option tags + this.store = new DataList({}, srcNodeRef); + } + + // if there is no value set and there is an option list, set + // the value to the first value to be consistent with native Select + // Firefox and Safari set value + // IE6 and Opera set selectedIndex, which is automatically set + // by the selected attribute of an option tag + // IE6 does not set value, Opera sets value = selectedIndex + if(!("value" in this.params)){ + var item = (this.item = this.store.fetchSelectedItem()); + if(item){ + var valueField = this._getValueField(); + // remove getValue() for 2.0 (old dojo.data API) + this.value = this.store._oldAPI ? this.store.getValue(item, valueField) : item[valueField]; + } + } + } + + this.inherited(arguments); + }, + + postCreate: function(){ + // summary: + // Subclasses must call this method from their postCreate() methods + // tags: + // protected + + // find any associated label element and add to ComboBox node. + var label=query('label[for="'+this.id+'"]'); + if(label.length){ + label[0].id = (this.id+"_label"); + this.domNode.setAttribute("aria-labelledby", label[0].id); + + } + this.inherited(arguments); + }, + + _getMenuLabelFromItem: function(/*Item*/ item){ + var label = this.labelFunc(item, this.store), + labelType = this.labelType; + // If labelType is not "text" we don't want to screw any markup ot whatever. + if(this.highlightMatch != "none" && this.labelType == "text" && this._lastInput){ + label = this.doHighlight(label, this._escapeHtml(this._lastInput)); + labelType = "html"; + } + return {html: labelType == "html", label: label}; + }, + + doHighlight: function(/*String*/ label, /*String*/ find){ + // summary: + // Highlights the string entered by the user in the menu. By default this + // highlights the first occurrence found. Override this method + // to implement your custom highlighting. + // tags: + // protected + + var + // Add (g)lobal modifier when this.highlightMatch == "all" and (i)gnorecase when this.ignoreCase == true + modifiers = (this.ignoreCase ? "i" : "") + (this.highlightMatch == "all" ? "g" : ""), + i = this.queryExpr.indexOf("${0}"); + find = regexp.escapeString(find); // escape regexp special chars + return this._escapeHtml(label).replace( + // prepend ^ when this.queryExpr == "${0}*" and append $ when this.queryExpr == "*${0}" + new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers), + '<span class="dijitComboBoxHighlightMatch">$1</span>' + ); // returns String, (almost) valid HTML (entities encoded) + }, + + _escapeHtml: function(/*String*/ str){ + // TODO Should become dojo.html.entities(), when exists use instead + // summary: + // Adds escape sequences for special characters in XML: &<>"' + str = String(str).replace(/&/gm, "&").replace(/</gm, "<") + .replace(/>/gm, ">").replace(/"/gm, """); //balance" + return str; // string + }, + + reset: function(){ + // Overrides the _FormWidget.reset(). + // Additionally reset the .item (to clean up). + this.item = null; + this.inherited(arguments); + }, + + labelFunc: function(/*item*/ item, /*dojo.store.api.Store*/ store){ + // summary: + // Computes the label to display based on the dojo.data store item. + // returns: + // The label that the ComboBox should display + // tags: + // private + + // Use toString() because XMLStore returns an XMLItem whereas this + // method is expected to return a String (#9354). + // Remove getValue() for 2.0 (old dojo.data API) + return (store._oldAPI ? store.getValue(item, this.labelAttr || this.searchAttr) : + item[this.labelAttr || this.searchAttr]).toString(); // String + }, + + _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){ + // summary: + // Hook so set('value', value) works. + // description: + // Sets the value of the select. + this._set("item", item||null); // value not looked up in store + if(!value){ value = ''; } // null translates to blank + this.inherited(arguments); + }, + _setTextDirAttr: function(/*String*/ textDir){ + // summary: + // Setter for textDir, needed for the dropDown's textDir update. + // description: + // Users shouldn't call this function; they should be calling + // set('textDir', value) + // tags: + // private + this.inherited(arguments); + // update the drop down also (_ComboBoxMenuMixin) + if(this.dropDown){ + this.dropDown._set("textDir", textDir); + } + } + }); +}); diff --git a/lib/dijit/form/_ButtonMixin.js b/lib/dijit/form/_ButtonMixin.js new file mode 100644 index 000000000..553049335 --- /dev/null +++ b/lib/dijit/form/_ButtonMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ButtonMixin",["dojo/_base/declare","dojo/dom","dojo/_base/event","../registry"],function(_1,_2,_3,_4){return _1("dijit.form._ButtonMixin",null,{label:"",type:"button",_onClick:function(e){if(this.disabled){_3.stop(e);return false;}var _5=this.onClick(e)===false;if(!_5&&this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var _6=this.domNode;_6.parentNode;_6=_6.parentNode){var _7=_4.byNode(_6);if(_7&&typeof _7._onSubmit=="function"){_7._onSubmit(e);_5=true;break;}}}if(_5){e.preventDefault();}return !_5;},postCreate:function(){this.inherited(arguments);_2.setSelectable(this.focusNode,false);},onClick:function(){return true;},_setLabelAttr:function(_8){this._set("label",_8);(this.containerNode||this.focusNode).innerHTML=_8;}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ButtonMixin.js.uncompressed.js b/lib/dijit/form/_ButtonMixin.js.uncompressed.js new file mode 100644 index 000000000..f00ebdb07 --- /dev/null +++ b/lib/dijit/form/_ButtonMixin.js.uncompressed.js @@ -0,0 +1,85 @@ +define("dijit/form/_ButtonMixin", [ + "dojo/_base/declare", // declare + "dojo/dom", // dom.setSelectable + "dojo/_base/event", // event.stop + "../registry" // registry.byNode +], function(declare, dom, event, registry){ + +// module: +// dijit/form/_ButtonMixin +// summary: +// A mixin to add a thin standard API wrapper to a normal HTML button + +return declare("dijit.form._ButtonMixin", null, { + // summary: + // A mixin to add a thin standard API wrapper to a normal HTML button + // description: + // A label should always be specified (through innerHTML) or the label attribute. + // Attach points: + // focusNode (required): this node receives focus + // valueNode (optional): this node's value gets submitted with FORM elements + // containerNode (optional): this node gets the innerHTML assignment for label + // example: + // | <button data-dojo-type="dijit.form.Button" onClick="...">Hello world</button> + // + // example: + // | var button1 = new dijit.form.Button({label: "hello world", onClick: foo}); + // | dojo.body().appendChild(button1.domNode); + + // label: HTML String + // Content to display in button. + label: "", + + // type: [const] String + // Type of button (submit, reset, button, checkbox, radio) + type: "button", + + _onClick: function(/*Event*/ e){ + // summary: + // Internal function to handle click actions + if(this.disabled){ + event.stop(e); + return false; + } + var preventDefault = this.onClick(e) === false; // user click actions + if(!preventDefault && this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a non-form widget needs to be signalled + for(var node=this.domNode; node.parentNode; node=node.parentNode){ + var widget=registry.byNode(node); + if(widget && typeof widget._onSubmit == "function"){ + widget._onSubmit(e); + preventDefault = true; + break; + } + } + } + if(preventDefault){ + e.preventDefault(); + } + return !preventDefault; + }, + + postCreate: function(){ + this.inherited(arguments); + dom.setSelectable(this.focusNode, false); + }, + + onClick: function(/*Event*/ /*===== e =====*/){ + // summary: + // Callback for when button is clicked. + // If type="submit", return true to perform submit, or false to cancel it. + // type: + // callback + return true; // Boolean + }, + + _setLabelAttr: function(/*String*/ content){ + // summary: + // Hook for set('label', ...) to work. + // description: + // Set the label (text) of the button; takes an HTML string. + this._set("label", content); + (this.containerNode||this.focusNode).innerHTML = content; + } +}); + +}); diff --git a/lib/dijit/form/_CheckBoxMixin.js b/lib/dijit/form/_CheckBoxMixin.js new file mode 100644 index 000000000..da6d96a2d --- /dev/null +++ b/lib/dijit/form/_CheckBoxMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_CheckBoxMixin",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event"],function(_1,_2,_3){return _1("dijit.form._CheckBoxMixin",null,{type:"checkbox",value:"on",readOnly:false,_aria_attr:"aria-checked",_setReadOnlyAttr:function(_4){this._set("readOnly",_4);_2.set(this.focusNode,"readOnly",_4);this.focusNode.setAttribute("aria-readonly",_4);},_setLabelAttr:undefined,postMixInProperties:function(){if(this.value==""){this.value="on";}this.inherited(arguments);},reset:function(){this.inherited(arguments);this._set("value",this.params.value||"on");_2.set(this.focusNode,"value",this.value);},_onClick:function(e){if(this.readOnly){_3.stop(e);return false;}return this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js b/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js new file mode 100644 index 000000000..703f8ead7 --- /dev/null +++ b/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js @@ -0,0 +1,77 @@ +define("dijit/form/_CheckBoxMixin", [ + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/_base/event" // event.stop +], function(declare, domAttr, event){ + + // module: + // dijit/form/_CheckBoxMixin + // summary: + // Mixin to provide widget functionality corresponding to an HTML checkbox + + return declare("dijit.form._CheckBoxMixin", null, { + // summary: + // Mixin to provide widget functionality corresponding to an HTML checkbox + // + // description: + // User interacts with real html inputs. + // On onclick (which occurs by mouse click, space-bar, or + // using the arrow keys to switch the selected radio button), + // we update the state of the checkbox/radio. + // + + // type: [private] String + // type attribute on <input> node. + // Overrides `dijit.form.Button.type`. Users should not change this value. + type: "checkbox", + + // value: String + // As an initialization parameter, equivalent to value field on normal checkbox + // (if checked, the value is passed as the value when form is submitted). + value: "on", + + // readOnly: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "readOnly". + // Similar to disabled except readOnly form values are submitted. + readOnly: false, + + // aria-pressed for toggle buttons, and aria-checked for checkboxes + _aria_attr: "aria-checked", + + _setReadOnlyAttr: function(/*Boolean*/ value){ + this._set("readOnly", value); + domAttr.set(this.focusNode, 'readOnly', value); + this.focusNode.setAttribute("aria-readonly", value); + }, + + // Override dijit.form.Button._setLabelAttr() since we don't even have a containerNode. + // Normally users won't try to set label, except when CheckBox or RadioButton is the child of a dojox.layout.TabContainer + _setLabelAttr: undefined, + + postMixInProperties: function(){ + if(this.value == ""){ + this.value = "on"; + } + this.inherited(arguments); + }, + + reset: function(){ + this.inherited(arguments); + // Handle unlikely event that the <input type=checkbox> value attribute has changed + this._set("value", this.params.value || "on"); + domAttr.set(this.focusNode, 'value', this.value); + }, + + _onClick: function(/*Event*/ e){ + // summary: + // Internal function to handle click actions - need to check + // readOnly, since button no longer does that check. + if(this.readOnly){ + event.stop(e); + return false; + } + return this.inherited(arguments); + } + }); +}); diff --git a/lib/dijit/form/_ComboBoxMenu.js b/lib/dijit/form/_ComboBoxMenu.js new file mode 100644 index 000000000..419e28c54 --- /dev/null +++ b/lib/dijit/form/_ComboBoxMenu.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ComboBoxMenu",["dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/keys","../_WidgetBase","../_TemplatedMixin","./_ComboBoxMenuMixin","./_ListMouseMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form._ComboBoxMenu",[_6,_7,_9,_8],{templateString:"<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;'>"+"<div class='dijitMenuItem dijitMenuPreviousButton' data-dojo-attach-point='previousButton' role='option'></div>"+"<div class='dijitMenuItem dijitMenuNextButton' data-dojo-attach-point='nextButton' role='option'></div>"+"</div>",baseClass:"dijitComboBoxMenu",postCreate:function(){this.inherited(arguments);if(!this.isLeftToRight()){_2.add(this.previousButton,"dijitMenuItemRtl");_2.add(this.nextButton,"dijitMenuItemRtl");}},_createMenuItem:function(){return _3.create("div",{"class":"dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"),role:"option"});},onHover:function(_a){_2.add(_a,"dijitMenuItemHover");},onUnhover:function(_b){_2.remove(_b,"dijitMenuItemHover");},onSelect:function(_c){_2.add(_c,"dijitMenuItemSelected");},onDeselect:function(_d){_2.remove(_d,"dijitMenuItemSelected");},_page:function(up){var _e=0;var _f=this.domNode.scrollTop;var _10=_4.get(this.domNode,"height");if(!this.getHighlightedOption()){this.selectNextNode();}while(_e<_10){var _11=this.getHighlightedOption();if(up){if(!_11.previousSibling||_11.previousSibling.style.display=="none"){break;}this.selectPreviousNode();}else{if(!_11.nextSibling||_11.nextSibling.style.display=="none"){break;}this.selectNextNode();}var _12=this.domNode.scrollTop;_e+=(_12-_f)*(up?-1:1);_f=_12;}},handleKey:function(evt){switch(evt.charOrCode){case _5.DOWN_ARROW:this.selectNextNode();return false;case _5.PAGE_DOWN:this._page(false);return false;case _5.UP_ARROW:this.selectPreviousNode();return false;case _5.PAGE_UP:this._page(true);return false;default:return true;}}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js new file mode 100644 index 000000000..e46db28ed --- /dev/null +++ b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js @@ -0,0 +1,138 @@ +define("dijit/form/_ComboBoxMenu", [ + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.add domClass.remove + "dojo/dom-construct", // domConstruct.create + "dojo/dom-style", // domStyle.get + "dojo/keys", // keys.DOWN_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.UP_ARROW + "../_WidgetBase", + "../_TemplatedMixin", + "./_ComboBoxMenuMixin", + "./_ListMouseMixin" +], function(declare, domClass, domConstruct, domStyle, keys, + _WidgetBase, _TemplatedMixin, _ComboBoxMenuMixin, _ListMouseMixin){ + +/*===== + var _WidgetBase = dijit._WidgetBase; + var _TemplatedMixin = dijit._TemplatedMixin; + var _ComboBoxMenuMixin = dijit.form._ComboBoxMenuMixin; + var _ListMouseMixin = dijit.form._ListMouseMixin; +=====*/ + + // module: + // dijit/form/_ComboBoxMenu + // summary: + // Focus-less menu for internal use in `dijit.form.ComboBox` + + return declare("dijit.form._ComboBoxMenu",[_WidgetBase, _TemplatedMixin, _ListMouseMixin, _ComboBoxMenuMixin], { + // summary: + // Focus-less menu for internal use in `dijit.form.ComboBox` + // Abstract methods that must be defined externally: + // onChange: item was explicitly chosen (mousedown somewhere on the menu and mouseup somewhere on the menu) + // onPage: next(1) or previous(-1) button pressed + // tags: + // private + + templateString: "<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;'>" + +"<div class='dijitMenuItem dijitMenuPreviousButton' data-dojo-attach-point='previousButton' role='option'></div>" + +"<div class='dijitMenuItem dijitMenuNextButton' data-dojo-attach-point='nextButton' role='option'></div>" + +"</div>", + + baseClass: "dijitComboBoxMenu", + + postCreate: function(){ + this.inherited(arguments); + if(!this.isLeftToRight()){ + domClass.add(this.previousButton, "dijitMenuItemRtl"); + domClass.add(this.nextButton, "dijitMenuItemRtl"); + } + }, + + _createMenuItem: function(){ + return domConstruct.create("div", { + "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"), + role: "option" + }); + }, + + onHover: function(/*DomNode*/ node){ + // summary: + // Add hover CSS + domClass.add(node, "dijitMenuItemHover"); + }, + + onUnhover: function(/*DomNode*/ node){ + // summary: + // Remove hover CSS + domClass.remove(node, "dijitMenuItemHover"); + }, + + onSelect: function(/*DomNode*/ node){ + // summary: + // Add selected CSS + domClass.add(node, "dijitMenuItemSelected"); + }, + + onDeselect: function(/*DomNode*/ node){ + // summary: + // Remove selected CSS + domClass.remove(node, "dijitMenuItemSelected"); + }, + + _page: function(/*Boolean*/ up){ + // summary: + // Handles page-up and page-down keypresses + + var scrollamount = 0; + var oldscroll = this.domNode.scrollTop; + var height = domStyle.get(this.domNode, "height"); + // if no item is highlighted, highlight the first option + if(!this.getHighlightedOption()){ + this.selectNextNode(); + } + while(scrollamount<height){ + var highlighted_option = this.getHighlightedOption(); + if(up){ + // stop at option 1 + if(!highlighted_option.previousSibling || + highlighted_option.previousSibling.style.display == "none"){ + break; + } + this.selectPreviousNode(); + }else{ + // stop at last option + if(!highlighted_option.nextSibling || + highlighted_option.nextSibling.style.display == "none"){ + break; + } + this.selectNextNode(); + } + // going backwards + var newscroll = this.domNode.scrollTop; + scrollamount += (newscroll-oldscroll)*(up ? -1:1); + oldscroll = newscroll; + } + }, + + handleKey: function(evt){ + // summary: + // Handle keystroke event forwarded from ComboBox, returning false if it's + // a keystroke I recognize and process, true otherwise. + switch(evt.charOrCode){ + case keys.DOWN_ARROW: + this.selectNextNode(); + return false; + case keys.PAGE_DOWN: + this._page(false); + return false; + case keys.UP_ARROW: + this.selectPreviousNode(); + return false; + case keys.PAGE_UP: + this._page(true); + return false; + default: + return true; + } + } + }); +}); diff --git a/lib/dijit/form/_ComboBoxMenuMixin.js b/lib/dijit/form/_ComboBoxMenuMixin.js new file mode 100644 index 000000000..1dd299902 --- /dev/null +++ b/lib/dijit/form/_ComboBoxMenuMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ComboBoxMenuMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/i18n","dojo/_base/window","dojo/i18n!./nls/ComboBox"],function(_1,_2,_3,_4,_5){return _2("dijit.form._ComboBoxMenuMixin",null,{_messages:null,postMixInProperties:function(){this.inherited(arguments);this._messages=_4.getLocalization("dijit.form","ComboBox",this.lang);},buildRendering:function(){this.inherited(arguments);this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];},_setValueAttr:function(_6){this.value=_6;this.onChange(_6);},onClick:function(_7){if(_7==this.previousButton){this._setSelectedAttr(null);this.onPage(-1);}else{if(_7==this.nextButton){this._setSelectedAttr(null);this.onPage(1);}else{this.onChange(_7);}}},onChange:function(){},onPage:function(){},onClose:function(){this._setSelectedAttr(null);},_createOption:function(_8,_9){var _a=this._createMenuItem();var _b=_9(_8);if(_b.html){_a.innerHTML=_b.label;}else{_a.appendChild(_5.doc.createTextNode(_b.label));}if(_a.innerHTML==""){_a.innerHTML=" ";}this.applyTextDir(_a,(_a.innerText||_a.textContent||""));_a.item=_8;return _a;},createOptions:function(_c,_d,_e){this.previousButton.style.display=(_d.start==0)?"none":"";_3.set(this.previousButton,"id",this.id+"_prev");_1.forEach(_c,function(_f,i){var _10=this._createOption(_f,_e);_3.set(_10,"id",this.id+i);this.nextButton.parentNode.insertBefore(_10,this.nextButton);},this);var _11=false;if(_c.total&&!_c.total.then&&_c.total!=-1){if((_d.start+_d.count)<_c.total){_11=true;}else{if((_d.start+_d.count)>_c.total&&_d.count==_c.length){_11=true;}}}else{if(_d.count==_c.length){_11=true;}}this.nextButton.style.display=_11?"":"none";_3.set(this.nextButton,"id",this.id+"_next");return this.containerNode.childNodes;},clearResultList:function(){var _12=this.containerNode;while(_12.childNodes.length>2){_12.removeChild(_12.childNodes[_12.childNodes.length-2]);}this._setSelectedAttr(null);},highlightFirstOption:function(){this.selectFirstNode();},highlightLastOption:function(){this.selectLastNode();},selectFirstNode:function(){this.inherited(arguments);if(this.getHighlightedOption()==this.previousButton){this.selectNextNode();}},selectLastNode:function(){this.inherited(arguments);if(this.getHighlightedOption()==this.nextButton){this.selectPreviousNode();}},getHighlightedOption:function(){return this._getSelectedAttr();}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js new file mode 100644 index 000000000..826f0a1fb --- /dev/null +++ b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js @@ -0,0 +1,191 @@ +define("dijit/form/_ComboBoxMenuMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/i18n", // i18n.getLocalization + "dojo/_base/window", // win.doc.createTextNode + "dojo/i18n!./nls/ComboBox" +], function(array, declare, domAttr, i18n, win){ + +// module: +// dijit/form/_ComboBoxMenuMixin +// summary: +// Focus-less menu for internal use in `dijit.form.ComboBox` + +return declare( "dijit.form._ComboBoxMenuMixin", null, { + // summary: + // Focus-less menu for internal use in `dijit.form.ComboBox` + // tags: + // private + + // _messages: Object + // Holds "next" and "previous" text for paging buttons on drop down + _messages: null, + + postMixInProperties: function(){ + this.inherited(arguments); + this._messages = i18n.getLocalization("dijit.form", "ComboBox", this.lang); + }, + + buildRendering: function(){ + this.inherited(arguments); + + // fill in template with i18n messages + this.previousButton.innerHTML = this._messages["previousMessage"]; + this.nextButton.innerHTML = this._messages["nextMessage"]; + }, + + _setValueAttr: function(/*Object*/ value){ + this.value = value; + this.onChange(value); + }, + + onClick: function(/*DomNode*/ node){ + if(node == this.previousButton){ + this._setSelectedAttr(null); + this.onPage(-1); + }else if(node == this.nextButton){ + this._setSelectedAttr(null); + this.onPage(1); + }else{ + this.onChange(node); + } + }, + + // stubs + onChange: function(/*Number*/ /*===== direction =====*/){ + // summary: + // Notifies ComboBox/FilteringSelect that user selected an option. + // tags: + // callback + }, + + onPage: function(/*Number*/ /*===== direction =====*/){ + // summary: + // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page. + // tags: + // callback + }, + + onClose: function(){ + // summary: + // Callback from dijit.popup code to this widget, notifying it that it closed + // tags: + // private + this._setSelectedAttr(null); + }, + + _createOption: function(/*Object*/ item, labelFunc){ + // summary: + // Creates an option to appear on the popup menu subclassed by + // `dijit.form.FilteringSelect`. + + var menuitem = this._createMenuItem(); + var labelObject = labelFunc(item); + if(labelObject.html){ + menuitem.innerHTML = labelObject.label; + }else{ + menuitem.appendChild( + win.doc.createTextNode(labelObject.label) + ); + } + // #3250: in blank options, assign a normal height + if(menuitem.innerHTML == ""){ + menuitem.innerHTML = " "; // + } + + // update menuitem.dir if BidiSupport was required + this.applyTextDir(menuitem, (menuitem.innerText || menuitem.textContent || "")); + + menuitem.item=item; + return menuitem; + }, + + createOptions: function(results, options, labelFunc){ + // summary: + // Fills in the items in the drop down list + // results: + // Array of items + // options: + // The options to the query function of the store + // + // labelFunc: + // Function to produce a label in the drop down list from a dojo.data item + + // display "Previous . . ." button + this.previousButton.style.display = (options.start == 0) ? "none" : ""; + domAttr.set(this.previousButton, "id", this.id + "_prev"); + // create options using _createOption function defined by parent + // ComboBox (or FilteringSelect) class + // #2309: + // iterate over cache nondestructively + array.forEach(results, function(item, i){ + var menuitem = this._createOption(item, labelFunc); + domAttr.set(menuitem, "id", this.id + i); + this.nextButton.parentNode.insertBefore(menuitem, this.nextButton); + }, this); + // display "Next . . ." button + var displayMore = false; + // Try to determine if we should show 'more'... + if(results.total && !results.total.then && results.total != -1){ + if((options.start + options.count) < results.total){ + displayMore = true; + }else if((options.start + options.count) > results.total && options.count == results.length){ + // Weird return from a data store, where a start + count > maxOptions + // implies maxOptions isn't really valid and we have to go into faking it. + // And more or less assume more if count == results.length + displayMore = true; + } + }else if(options.count == results.length){ + //Don't know the size, so we do the best we can based off count alone. + //So, if we have an exact match to count, assume more. + displayMore = true; + } + + this.nextButton.style.display = displayMore ? "" : "none"; + domAttr.set(this.nextButton,"id", this.id + "_next"); + return this.containerNode.childNodes; + }, + + clearResultList: function(){ + // summary: + // Clears the entries in the drop down list, but of course keeps the previous and next buttons. + var container = this.containerNode; + while(container.childNodes.length > 2){ + container.removeChild(container.childNodes[container.childNodes.length-2]); + } + this._setSelectedAttr(null); + }, + + highlightFirstOption: function(){ + // summary: + // Highlight the first real item in the list (not Previous Choices). + this.selectFirstNode(); + }, + + highlightLastOption: function(){ + // summary: + // Highlight the last real item in the list (not More Choices). + this.selectLastNode(); + }, + + selectFirstNode: function(){ + this.inherited(arguments); + if(this.getHighlightedOption() == this.previousButton){ + this.selectNextNode(); + } + }, + + selectLastNode: function(){ + this.inherited(arguments); + if(this.getHighlightedOption() == this.nextButton){ + this.selectPreviousNode(); + } + }, + + getHighlightedOption: function(){ + return this._getSelectedAttr(); + } +}); + +}); diff --git a/lib/dijit/form/_DateTimeTextBox.js b/lib/dijit/form/_DateTimeTextBox.js index 9d5c004c8..b79008509 100644 --- a/lib/dijit/form/_DateTimeTextBox.js +++ b/lib/dijit/form/_DateTimeTextBox.js @@ -1,250 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._DateTimeTextBox"] = true; -dojo.provide("dijit.form._DateTimeTextBox"); -dojo.require("dojo.date"); -dojo.require("dojo.date.locale"); -dojo.require("dojo.date.stamp"); -dojo.require("dijit.form.ValidationTextBox"); -dojo.require("dijit._HasDropDown"); - - -new Date("X"); // workaround for #11279, new Date("") == NaN - -/*===== -dojo.declare( - "dijit.form._DateTimeTextBox.__Constraints", - [dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions], { - // summary: - // Specifies both the rules on valid/invalid values (first/last date/time allowed), - // and also formatting options for how the date/time is displayed. - // example: - // To restrict to dates within 2004, displayed in a long format like "December 25, 2005": - // | {min:'2004-01-01',max:'2004-12-31', formatLength:'long'} -}); -=====*/ - -dojo.declare( - "dijit.form._DateTimeTextBox", - [ dijit.form.RangeBoundTextBox, dijit._HasDropDown ], - { - // summary: - // Base class for validating, serializable, range-bound date or time text box. - - templateString: dojo.cache("dijit.form", "templates/DropDownBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"), - - // hasDownArrow: [const] Boolean - // Set this textbox to display a down arrow button, to open the drop down list. - hasDownArrow: true, - - // openOnClick: [const] Boolean - // Set to true to open drop down upon clicking anywhere on the textbox. - openOnClick: true, - - /*===== - // constraints: dijit.form._DateTimeTextBox.__Constraints - // Despite the name, this parameter specifies both constraints on the input - // (including starting/ending dates/times allowed) as well as - // formatting options like whether the date is displayed in long (ex: December 25, 2005) - // or short (ex: 12/25/2005) format. See `dijit.form._DateTimeTextBox.__Constraints` for details. - constraints: {}, - ======*/ - - // Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather - // than a straight regexp to deal with locale (plus formatting options too?) - regExpGen: dojo.date.locale.regexp, - - // datePackage: String - // JavaScript namespace to find calendar routines. Uses Gregorian calendar routines - // at dojo.date, by default. - datePackage: "dojo.date", - - // Override _FormWidget.compare() to work for dates/times - compare: function(/*Date*/ val1, /*Date*/ val2){ - var isInvalid1 = this._isInvalidDate(val1); - var isInvalid2 = this._isInvalidDate(val2); - return isInvalid1 ? (isInvalid2 ? 0 : -1) : (isInvalid2 ? 1 : dojo.date.compare(val1, val2, this._selector)); - }, - - // flag to _HasDropDown to make drop down Calendar width == <input> width - forceWidth: true, - - format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){ - // summary: - // Formats the value as a Date, according to specified locale (second argument) - // tags: - // protected - if(!value){ return ''; } - return this.dateLocaleModule.format(value, constraints); - }, - - "parse": function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){ - // summary: - // Parses as string as a Date, according to constraints - // tags: - // protected - - return this.dateLocaleModule.parse(value, constraints) || (this._isEmpty(value) ? null : undefined); // Date - }, - - // Overrides ValidationTextBox.serialize() to serialize a date in canonical ISO format. - serialize: function(/*anything*/ val, /*Object?*/ options){ - if(val.toGregorian){ - val = val.toGregorian(); - } - return dojo.date.stamp.toISOString(val, options); - }, - - // dropDownDefaultValue: Date - // The default value to focus in the popupClass widget when the textbox value is empty. - dropDownDefaultValue : new Date(), - - // value: Date - // The value of this widget as a JavaScript Date object. Use get("value") / set("value", val) to manipulate. - // When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString` - value: new Date(""), // value.toString()="NaN" - - _blankValue: null, // used by filter() when the textbox is blank - - // popupClass: [protected extension] String - // Name of the popup widget class used to select a date/time. - // Subclasses should specify this. - popupClass: "", // default is no popup = text only - - - // _selector: [protected extension] String - // Specifies constraints.selector passed to dojo.date functions, should be either - // "date" or "time". - // Subclass must specify this. - _selector: "", - - constructor: function(/*Object*/ args){ - var dateClass = args.datePackage ? args.datePackage + ".Date" : "Date"; - this.dateClassObj = dojo.getObject(dateClass, false); - this.value = new this.dateClassObj(""); - - this.datePackage = args.datePackage || this.datePackage; - this.dateLocaleModule = dojo.getObject(this.datePackage + ".locale", false); - this.regExpGen = this.dateLocaleModule.regexp; - this._invalidDate = dijit.form._DateTimeTextBox.prototype.value.toString(); - }, - - buildRendering: function(){ - this.inherited(arguments); - - if(!this.hasDownArrow){ - this._buttonNode.style.display = "none"; - } - - // If openOnClick is true, we basically just want to treat the whole widget as the - // button. We need to do that also if the actual drop down button will be hidden, - // so that there's a mouse method for opening the drop down. - if(this.openOnClick || !this.hasDownArrow){ - this._buttonNode = this.domNode; - this.baseClass += " dijitComboBoxOpenOnClick"; - } - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - constraints.selector = this._selector; - constraints.fullYear = true; // see #5465 - always format with 4-digit years - var fromISO = dojo.date.stamp.fromISOString; - if(typeof constraints.min == "string"){ constraints.min = fromISO(constraints.min); } - if(typeof constraints.max == "string"){ constraints.max = fromISO(constraints.max); } - this.inherited(arguments); - }, - - _isInvalidDate: function(/*Date*/ value){ - // summary: - // Runs various tests on the value, checking for invalid conditions - // tags: - // private - return !value || isNaN(value) || typeof value != "object" || value.toString() == this._invalidDate; - }, - - _setValueAttr: function(/*Date|String*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Sets the date on this textbox. Note: value can be a JavaScript Date literal or a string to be parsed. - if(value !== undefined){ - if(typeof value == "string"){ - value = dojo.date.stamp.fromISOString(value); - } - if(this._isInvalidDate(value)){ - value = null; - } - if(value instanceof Date && !(this.dateClassObj instanceof Date)){ - value = new this.dateClassObj(value); - } - } - this.inherited(arguments); - if(this.dropDown){ - this.dropDown.set('value', value, false); - } - }, - - _set: function(attr, value){ - // Avoid spurious watch() notifications when value is changed to new Date object w/the same value - if(attr == "value" && this.value instanceof Date && this.compare(value, this.value) == 0){ - return; - } - this.inherited(arguments); - }, - - _setDropDownDefaultValueAttr: function(/*Date*/ val){ - if(this._isInvalidDate(val)){ - // convert null setting into today's date, since there needs to be *some* default at all times. - val = new this.dateClassObj() - } - this.dropDownDefaultValue = val; - }, - - openDropDown: function(/*Function*/ callback){ - // rebuild drop down every time, so that constraints get copied (#6002) - if(this.dropDown){ - this.dropDown.destroy(); - } - var PopupProto = dojo.getObject(this.popupClass, false), - textBox = this, - value = this.get("value"); - this.dropDown = new PopupProto({ - onChange: function(value){ - // this will cause InlineEditBox and other handlers to do stuff so make sure it's last - dijit.form._DateTimeTextBox.superclass._setValueAttr.call(textBox, value, true); - }, - id: this.id + "_popup", - dir: textBox.dir, - lang: textBox.lang, - value: value, - currentFocus: !this._isInvalidDate(value) ? value : this.dropDownDefaultValue, - constraints: textBox.constraints, - filterString: textBox.filterString, // for TimeTextBox, to filter times shown - - datePackage: textBox.datePackage, - - isDisabledDate: function(/*Date*/ date){ - // summary: - // disables dates outside of the min/max of the _DateTimeTextBox - return !textBox.rangeCheck(date, textBox.constraints); - } - }); - - this.inherited(arguments); - }, - - _getDisplayedValueAttr: function(){ - return this.textbox.value; - }, - - _setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){ - this._setValueAttr(this.parse(value, this.constraints), priorityChange, value); - } - } -); - -} +//>>built +require({cache:{"url:dijit/form/templates/DropDownBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});define("dijit/form/_DateTimeTextBox",["dojo/date","dojo/date/locale","dojo/date/stamp","dojo/_base/declare","dojo/_base/lang","./RangeBoundTextBox","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_1,_2,_3,_4,_5,_6,_7,_8){new Date("X");var _9=_4("dijit.form._DateTimeTextBox",[_6,_7],{templateString:_8,hasDownArrow:true,openOnClick:true,regExpGen:_2.regexp,datePackage:_1,postMixInProperties:function(){this.inherited(arguments);this._set("type","text");},compare:function(_a,_b){var _c=this._isInvalidDate(_a);var _d=this._isInvalidDate(_b);return _c?(_d?0:-1):(_d?1:_1.compare(_a,_b,this._selector));},forceWidth:true,format:function(_e,_f){if(!_e){return "";}return this.dateLocaleModule.format(_e,_f);},"parse":function(_10,_11){return this.dateLocaleModule.parse(_10,_11)||(this._isEmpty(_10)?null:undefined);},serialize:function(val,_12){if(val.toGregorian){val=val.toGregorian();}return _3.toISOString(val,_12);},dropDownDefaultValue:new Date(),value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(_13){this.datePackage=_13.datePackage||this.datePackage;this.dateFuncObj=typeof this.datePackage=="string"?_5.getObject(this.datePackage,false):this.datePackage;this.dateClassObj=this.dateFuncObj.Date||Date;this.dateLocaleModule=_5.getObject("locale",false,this.dateFuncObj);this.regExpGen=this.dateLocaleModule.regexp;this._invalidDate=this.constructor.prototype.value.toString();},buildRendering:function(){this.inherited(arguments);if(!this.hasDownArrow){this._buttonNode.style.display="none";}if(this.openOnClick||!this.hasDownArrow){this._buttonNode=this.domNode;this.baseClass+=" dijitComboBoxOpenOnClick";}},_setConstraintsAttr:function(_14){_14.selector=this._selector;_14.fullYear=true;var _15=_3.fromISOString;if(typeof _14.min=="string"){_14.min=_15(_14.min);}if(typeof _14.max=="string"){_14.max=_15(_14.max);}this.inherited(arguments);},_isInvalidDate:function(_16){return !_16||isNaN(_16)||typeof _16!="object"||_16.toString()==this._invalidDate;},_setValueAttr:function(_17,_18,_19){if(_17!==undefined){if(typeof _17=="string"){_17=_3.fromISOString(_17);}if(this._isInvalidDate(_17)){_17=null;}if(_17 instanceof Date&&!(this.dateClassObj instanceof Date)){_17=new this.dateClassObj(_17);}}this.inherited(arguments);if(this.value instanceof Date){this.filterString="";}if(this.dropDown){this.dropDown.set("value",_17,false);}},_set:function(_1a,_1b){if(_1a=="value"&&this.value instanceof Date&&this.compare(_1b,this.value)==0){return;}this.inherited(arguments);},_setDropDownDefaultValueAttr:function(val){if(this._isInvalidDate(val)){val=new this.dateClassObj();}this.dropDownDefaultValue=val;},openDropDown:function(_1c){if(this.dropDown){this.dropDown.destroy();}var _1d=_5.isString(this.popupClass)?_5.getObject(this.popupClass,false):this.popupClass,_1e=this,_1f=this.get("value");this.dropDown=new _1d({onChange:function(_20){_1e.set("value",_20,true);},id:this.id+"_popup",dir:_1e.dir,lang:_1e.lang,value:_1f,currentFocus:!this._isInvalidDate(_1f)?_1f:this.dropDownDefaultValue,constraints:_1e.constraints,filterString:_1e.filterString,datePackage:_1e.datePackage,isDisabledDate:function(_21){return !_1e.rangeCheck(_21,_1e.constraints);}});this.inherited(arguments);},_getDisplayedValueAttr:function(){return this.textbox.value;},_setDisplayedValueAttr:function(_22,_23){this._setValueAttr(this.parse(_22,this.constraints),_23,_22);}});return _9;});
\ No newline at end of file diff --git a/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js new file mode 100644 index 000000000..980c5ff21 --- /dev/null +++ b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js @@ -0,0 +1,262 @@ +require({cache:{ +'url:dijit/form/templates/DropDownBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}}); +define("dijit/form/_DateTimeTextBox", [ + "dojo/date", // date date.compare + "dojo/date/locale", // locale.regexp + "dojo/date/stamp", // stamp.fromISOString stamp.toISOString + "dojo/_base/declare", // declare + "dojo/_base/lang", // lang.getObject + "./RangeBoundTextBox", + "../_HasDropDown", + "dojo/text!./templates/DropDownBox.html" +], function(date, locale, stamp, declare, lang, RangeBoundTextBox, _HasDropDown, template){ + +/*===== + var _HasDropDown = dijit._HasDropDown; + var RangeBoundTextBox = dijit.form.RangeBoundTextBox; +=====*/ + + // module: + // dijit/form/_DateTimeTextBox + // summary: + // Base class for validating, serializable, range-bound date or time text box. + + + new Date("X"); // workaround for #11279, new Date("") == NaN + + /*===== + declare( + "dijit.form._DateTimeTextBox.__Constraints", + [RangeBoundTextBox.__Constraints, locale.__FormatOptions], { + // summary: + // Specifies both the rules on valid/invalid values (first/last date/time allowed), + // and also formatting options for how the date/time is displayed. + // example: + // To restrict to dates within 2004, displayed in a long format like "December 25, 2005": + // | {min:'2004-01-01',max:'2004-12-31', formatLength:'long'} + }); + =====*/ + + var _DateTimeTextBox = declare("dijit.form._DateTimeTextBox", [RangeBoundTextBox, _HasDropDown], { + // summary: + // Base class for validating, serializable, range-bound date or time text box. + + templateString: template, + + // hasDownArrow: [const] Boolean + // Set this textbox to display a down arrow button, to open the drop down list. + hasDownArrow: true, + + // openOnClick: [const] Boolean + // Set to true to open drop down upon clicking anywhere on the textbox. + openOnClick: true, + + /*===== + // constraints: dijit.form._DateTimeTextBox.__Constraints + // Despite the name, this parameter specifies both constraints on the input + // (including starting/ending dates/times allowed) as well as + // formatting options like whether the date is displayed in long (ex: December 25, 2005) + // or short (ex: 12/25/2005) format. See `dijit.form._DateTimeTextBox.__Constraints` for details. + constraints: {}, + ======*/ + + // Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather + // than a straight regexp to deal with locale (plus formatting options too?) + regExpGen: locale.regexp, + + // datePackage: String + // JavaScript namespace to find calendar routines. Uses Gregorian calendar routines + // at dojo.date, by default. + datePackage: date, + + postMixInProperties: function(){ + this.inherited(arguments); + this._set("type", "text"); // in case type="date"|"time" was specified which messes up parse/format + }, + + // Override _FormWidget.compare() to work for dates/times + compare: function(/*Date*/ val1, /*Date*/ val2){ + var isInvalid1 = this._isInvalidDate(val1); + var isInvalid2 = this._isInvalidDate(val2); + return isInvalid1 ? (isInvalid2 ? 0 : -1) : (isInvalid2 ? 1 : date.compare(val1, val2, this._selector)); + }, + + // flag to _HasDropDown to make drop down Calendar width == <input> width + forceWidth: true, + + format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){ + // summary: + // Formats the value as a Date, according to specified locale (second argument) + // tags: + // protected + if(!value){ return ''; } + return this.dateLocaleModule.format(value, constraints); + }, + + "parse": function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){ + // summary: + // Parses as string as a Date, according to constraints + // tags: + // protected + + return this.dateLocaleModule.parse(value, constraints) || (this._isEmpty(value) ? null : undefined); // Date + }, + + // Overrides ValidationTextBox.serialize() to serialize a date in canonical ISO format. + serialize: function(/*anything*/ val, /*Object?*/ options){ + if(val.toGregorian){ + val = val.toGregorian(); + } + return stamp.toISOString(val, options); + }, + + // dropDownDefaultValue: Date + // The default value to focus in the popupClass widget when the textbox value is empty. + dropDownDefaultValue : new Date(), + + // value: Date + // The value of this widget as a JavaScript Date object. Use get("value") / set("value", val) to manipulate. + // When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString` + value: new Date(""), // value.toString()="NaN" + + _blankValue: null, // used by filter() when the textbox is blank + + // popupClass: [protected extension] String + // Name of the popup widget class used to select a date/time. + // Subclasses should specify this. + popupClass: "", // default is no popup = text only + + + // _selector: [protected extension] String + // Specifies constraints.selector passed to dojo.date functions, should be either + // "date" or "time". + // Subclass must specify this. + _selector: "", + + constructor: function(/*Object*/ args){ + this.datePackage = args.datePackage || this.datePackage; + this.dateFuncObj = typeof this.datePackage == "string" ? + lang.getObject(this.datePackage, false) :// "string" part for back-compat, remove for 2.0 + this.datePackage; + this.dateClassObj = this.dateFuncObj.Date || Date; + this.dateLocaleModule = lang.getObject("locale", false, this.dateFuncObj); + this.regExpGen = this.dateLocaleModule.regexp; + this._invalidDate = this.constructor.prototype.value.toString(); + }, + + buildRendering: function(){ + this.inherited(arguments); + + if(!this.hasDownArrow){ + this._buttonNode.style.display = "none"; + } + + // If openOnClick is true, we basically just want to treat the whole widget as the + // button. We need to do that also if the actual drop down button will be hidden, + // so that there's a mouse method for opening the drop down. + if(this.openOnClick || !this.hasDownArrow){ + this._buttonNode = this.domNode; + this.baseClass += " dijitComboBoxOpenOnClick"; + } + }, + + _setConstraintsAttr: function(/*Object*/ constraints){ + constraints.selector = this._selector; + constraints.fullYear = true; // see #5465 - always format with 4-digit years + var fromISO = stamp.fromISOString; + if(typeof constraints.min == "string"){ constraints.min = fromISO(constraints.min); } + if(typeof constraints.max == "string"){ constraints.max = fromISO(constraints.max); } + this.inherited(arguments); + }, + + _isInvalidDate: function(/*Date*/ value){ + // summary: + // Runs various tests on the value, checking for invalid conditions + // tags: + // private + return !value || isNaN(value) || typeof value != "object" || value.toString() == this._invalidDate; + }, + + _setValueAttr: function(/*Date|String*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + // summary: + // Sets the date on this textbox. Note: value can be a JavaScript Date literal or a string to be parsed. + if(value !== undefined){ + if(typeof value == "string"){ + value = stamp.fromISOString(value); + } + if(this._isInvalidDate(value)){ + value = null; + } + if(value instanceof Date && !(this.dateClassObj instanceof Date)){ + value = new this.dateClassObj(value); + } + } + this.inherited(arguments); + if(this.value instanceof Date){ + this.filterString = ""; + } + if(this.dropDown){ + this.dropDown.set('value', value, false); + } + }, + + _set: function(attr, value){ + // Avoid spurious watch() notifications when value is changed to new Date object w/the same value + if(attr == "value" && this.value instanceof Date && this.compare(value, this.value) == 0){ + return; + } + this.inherited(arguments); + }, + + _setDropDownDefaultValueAttr: function(/*Date*/ val){ + if(this._isInvalidDate(val)){ + // convert null setting into today's date, since there needs to be *some* default at all times. + val = new this.dateClassObj(); + } + this.dropDownDefaultValue = val; + }, + + openDropDown: function(/*Function*/ callback){ + // rebuild drop down every time, so that constraints get copied (#6002) + if(this.dropDown){ + this.dropDown.destroy(); + } + var PopupProto = lang.isString(this.popupClass) ? lang.getObject(this.popupClass, false) : this.popupClass, + textBox = this, + value = this.get("value"); + this.dropDown = new PopupProto({ + onChange: function(value){ + // this will cause InlineEditBox and other handlers to do stuff so make sure it's last + textBox.set('value', value, true); + }, + id: this.id + "_popup", + dir: textBox.dir, + lang: textBox.lang, + value: value, + currentFocus: !this._isInvalidDate(value) ? value : this.dropDownDefaultValue, + constraints: textBox.constraints, + filterString: textBox.filterString, // for TimeTextBox, to filter times shown + + datePackage: textBox.datePackage, + + isDisabledDate: function(/*Date*/ date){ + // summary: + // disables dates outside of the min/max of the _DateTimeTextBox + return !textBox.rangeCheck(date, textBox.constraints); + } + }); + + this.inherited(arguments); + }, + + _getDisplayedValueAttr: function(){ + return this.textbox.value; + }, + + _setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){ + this._setValueAttr(this.parse(value, this.constraints), priorityChange, value); + } + }); + + return _DateTimeTextBox; +}); diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js b/lib/dijit/form/_ExpandingTextAreaMixin.js new file mode 100644 index 000000000..d5071e7ca --- /dev/null +++ b/lib/dijit/form/_ExpandingTextAreaMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ExpandingTextAreaMixin",["dojo/_base/declare","dojo/dom-construct","dojo/_base/lang","dojo/_base/window"],function(_1,_2,_3,_4){var _5;return _1("dijit.form._ExpandingTextAreaMixin",null,{_setValueAttr:function(){this.inherited(arguments);this.resize();},postCreate:function(){this.inherited(arguments);var _6=this.textbox;if(_5==undefined){var te=_2.create("textarea",{rows:"5",cols:"20",value:" ",style:{zoom:1,overflow:"hidden",visibility:"hidden",position:"absolute",border:"0px solid black",padding:"0px"}},_4.body(),"last");_5=te.scrollHeight>=te.clientHeight;_4.body().removeChild(te);}this.connect(_6,"onscroll","_resizeLater");this.connect(_6,"onresize","_resizeLater");this.connect(_6,"onfocus","_resizeLater");_6.style.overflowY="hidden";this._estimateHeight();this._resizeLater();},_onInput:function(e){this.inherited(arguments);this.resize();},_estimateHeight:function(){var _7=this.textbox;_7.style.height="auto";_7.rows=(_7.value.match(/\n/g)||[]).length+2;},_resizeLater:function(){this.defer("resize");},resize:function(){function _8(){var _9=false;if(_a.value===""){_a.value=" ";_9=true;}var sh=_a.scrollHeight;if(_9){_a.value="";}return sh;};var _a=this.textbox;if(_a.style.overflowY=="hidden"){_a.scrollTop=0;}if(this.busyResizing){return;}this.busyResizing=true;if(_8()||_a.offsetHeight){var _b=_a.style.height;if(!(/px/.test(_b))){_b=_8();_a.rows=1;_a.style.height=_b+"px";}var _c=Math.max(Math.max(_a.offsetHeight,parseInt(_b))-_a.clientHeight,0)+_8();var _d=_c+"px";if(_d!=_a.style.height){_a.rows=1;_a.style.height=_d;}if(_5){var _e=_8(),_f=_e,_10=_a.style.minHeight,_11=4,_12;_a.style.minHeight=_d;_a.style.height="auto";while(_c>0){_a.style.minHeight=Math.max(_c-_11,4)+"px";_12=_8();var _13=_f-_12;_c-=_13;if(_13<_11){break;}_f=_12;_11<<=1;}_a.style.height=_c+"px";_a.style.minHeight=_10;}_a.style.overflowY=_8()>_a.clientHeight?"auto":"hidden";}else{this._estimateHeight();}this.busyResizing=false;}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js new file mode 100644 index 000000000..c06656863 --- /dev/null +++ b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js @@ -0,0 +1,127 @@ +define("dijit/form/_ExpandingTextAreaMixin", [ + "dojo/_base/declare", // declare + "dojo/dom-construct", // domConstruct.create + "dojo/_base/lang", // lang.hitch + "dojo/_base/window" // win.body +], function(declare, domConstruct, lang, win){ + + // module: + // dijit/form/_ExpandingTextAreaMixin + // summary: + // Mixin for textarea widgets to add auto-expanding capability + + // feature detection + var needsHelpShrinking; + + return declare("dijit.form._ExpandingTextAreaMixin", null, { + // summary: + // Mixin for textarea widgets to add auto-expanding capability + + _setValueAttr: function(){ + this.inherited(arguments); + this.resize(); + }, + + postCreate: function(){ + this.inherited(arguments); + var textarea = this.textbox; + + if(needsHelpShrinking == undefined){ + var te = domConstruct.create('textarea', {rows:"5", cols:"20", value: ' ', style: {zoom:1, overflow:'hidden', visibility:'hidden', position:'absolute', border:"0px solid black", padding:"0px"}}, win.body(), "last"); + needsHelpShrinking = te.scrollHeight >= te.clientHeight; + win.body().removeChild(te); + } + this.connect(textarea, "onscroll", "_resizeLater"); + this.connect(textarea, "onresize", "_resizeLater"); + this.connect(textarea, "onfocus", "_resizeLater"); + textarea.style.overflowY = "hidden"; + this._estimateHeight(); + this._resizeLater(); + }, + + _onInput: function(e){ + this.inherited(arguments); + this.resize(); + }, + + _estimateHeight: function(){ + // summary: + // Approximate the height when the textarea is invisible with the number of lines in the text. + // Fails when someone calls setValue with a long wrapping line, but the layout fixes itself when the user clicks inside so . . . + // In IE, the resize event is supposed to fire when the textarea becomes visible again and that will correct the size automatically. + // + var textarea = this.textbox; + textarea.style.height = "auto"; + // #rows = #newlines+1 + // Note: on Moz, the following #rows appears to be 1 too many. + // Actually, Moz is reserving room for the scrollbar. + // If you increase the font size, this behavior becomes readily apparent as the last line gets cut off without the +1. + textarea.rows = (textarea.value.match(/\n/g) || []).length + 2; + }, + + _resizeLater: function(){ + this.defer("resize"); + }, + + resize: function(){ + // summary: + // Resizes the textarea vertically (should be called after a style/value change) + function textareaScrollHeight(){ + var empty = false; + if(textarea.value === ''){ + textarea.value = ' '; + empty = true; + } + var sh = textarea.scrollHeight; + if(empty){ textarea.value = ''; } + return sh; + } + + var textarea = this.textbox; + if(textarea.style.overflowY == "hidden"){ textarea.scrollTop = 0; } + if(this.busyResizing){ return; } + this.busyResizing = true; + if(textareaScrollHeight() || textarea.offsetHeight){ + var currentHeight = textarea.style.height; + if(!(/px/.test(currentHeight))){ + currentHeight = textareaScrollHeight(); + textarea.rows = 1; + textarea.style.height = currentHeight + "px"; + } + var newH = Math.max(Math.max(textarea.offsetHeight, parseInt(currentHeight)) - textarea.clientHeight, 0) + textareaScrollHeight(); + var newHpx = newH + "px"; + if(newHpx != textarea.style.height){ + textarea.rows = 1; + textarea.style.height = newHpx; + } + if(needsHelpShrinking){ + var origScrollHeight = textareaScrollHeight(), + newScrollHeight = origScrollHeight, + origMinHeight = textarea.style.minHeight, + decrement = 4, // not too fast, not too slow + thisScrollHeight; + textarea.style.minHeight = newHpx; // maintain current height + textarea.style.height = "auto"; // allow scrollHeight to change + while(newH > 0){ + textarea.style.minHeight = Math.max(newH - decrement, 4) + "px"; + thisScrollHeight = textareaScrollHeight(); + var change = newScrollHeight - thisScrollHeight; + newH -= change; + if(change < decrement){ + break; // scrollHeight didn't shrink + } + newScrollHeight = thisScrollHeight; + decrement <<= 1; + } + textarea.style.height = newH + "px"; + textarea.style.minHeight = origMinHeight; + } + textarea.style.overflowY = textareaScrollHeight() > textarea.clientHeight ? "auto" : "hidden"; + }else{ + // hidden content of unknown size + this._estimateHeight(); + } + this.busyResizing = false; + } + }); +}); diff --git a/lib/dijit/form/_FormMixin.js b/lib/dijit/form/_FormMixin.js index e42702d31..770ec2471 100644 --- a/lib/dijit/form/_FormMixin.js +++ b/lib/dijit/form/_FormMixin.js @@ -1,461 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form._FormMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._FormMixin"] = true; -dojo.provide("dijit.form._FormMixin"); -dojo.require("dojo.window"); - - -dojo.declare("dijit.form._FormMixin", null, { - // summary: - // Mixin for containers of form widgets (i.e. widgets that represent a single value - // and can be children of a <form> node or dijit.form.Form widget) - // description: - // Can extract all the form widgets - // values and combine them into a single javascript object, or alternately - // take such an object and set the values for all the contained - // form widgets - -/*===== - // value: Object - // Name/value hash for each child widget with a name and value. - // Child widgets without names are not part of the hash. - // - // If there are multiple child widgets w/the same name, value is an array, - // unless they are radio buttons in which case value is a scalar (since only - // one radio button can be checked at a time). - // - // If a child widget's name is a dot separated list (like a.b.c.d), it's a nested structure. - // - // Example: - // | { name: "John Smith", interests: ["sports", "movies"] } -=====*/ - - // state: [readonly] String - // Will be "Error" if one or more of the child widgets has an invalid value, - // "Incomplete" if not all of the required child widgets are filled in. Otherwise, "", - // which indicates that the form is ready to be submitted. - state: "", - - // TODO: - // * Repeater - // * better handling for arrays. Often form elements have names with [] like - // * people[3].sex (for a list of people [{name: Bill, sex: M}, ...]) - // - // - - reset: function(){ - dojo.forEach(this.getDescendants(), function(widget){ - if(widget.reset){ - widget.reset(); - } - }); - }, - - validate: function(){ - // summary: - // returns if the form is valid - same as isValid - but - // provides a few additional (ui-specific) features. - // 1 - it will highlight any sub-widgets that are not - // valid - // 2 - it will call focus() on the first invalid - // sub-widget - var didFocus = false; - return dojo.every(dojo.map(this.getDescendants(), function(widget){ - // Need to set this so that "required" widgets get their - // state set. - widget._hasBeenBlurred = true; - var valid = widget.disabled || !widget.validate || widget.validate(); - if(!valid && !didFocus){ - // Set focus of the first non-valid widget - dojo.window.scrollIntoView(widget.containerNode || widget.domNode); - widget.focus(); - didFocus = true; - } - return valid; - }), function(item){ return item; }); - }, - - setValues: function(val){ - dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0"); - return this.set('value', val); - }, - _setValueAttr: function(/*Object*/ obj){ - // summary: - // Fill in form values from according to an Object (in the format returned by get('value')) - - // generate map from name --> [list of widgets with that name] - var map = { }; - dojo.forEach(this.getDescendants(), function(widget){ - if(!widget.name){ return; } - var entry = map[widget.name] || (map[widget.name] = [] ); - entry.push(widget); - }); - - for(var name in map){ - if(!map.hasOwnProperty(name)){ - continue; - } - var widgets = map[name], // array of widgets w/this name - values = dojo.getObject(name, false, obj); // list of values for those widgets - - if(values === undefined){ - continue; - } - if(!dojo.isArray(values)){ - values = [ values ]; - } - if(typeof widgets[0].checked == 'boolean'){ - // for checkbox/radio, values is a list of which widgets should be checked - dojo.forEach(widgets, function(w, i){ - w.set('value', dojo.indexOf(values, w.value) != -1); - }); - }else if(widgets[0].multiple){ - // it takes an array (e.g. multi-select) - widgets[0].set('value', values); - }else{ - // otherwise, values is a list of values to be assigned sequentially to each widget - dojo.forEach(widgets, function(w, i){ - w.set('value', values[i]); - }); - } - } - - /*** - * TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets) - - dojo.forEach(this.containerNode.elements, function(element){ - if(element.name == ''){return}; // like "continue" - var namePath = element.name.split("."); - var myObj=obj; - var name=namePath[namePath.length-1]; - for(var j=1,len2=namePath.length;j<len2;++j){ - var p=namePath[j - 1]; - // repeater support block - var nameA=p.split("["); - if(nameA.length > 1){ - if(typeof(myObj[nameA[0]]) == "undefined"){ - myObj[nameA[0]]=[ ]; - } // if - - nameIndex=parseInt(nameA[1]); - if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ - myObj[nameA[0]][nameIndex] = { }; - } - myObj=myObj[nameA[0]][nameIndex]; - continue; - } // repeater support ends - - if(typeof(myObj[p]) == "undefined"){ - myObj=undefined; - break; - }; - myObj=myObj[p]; - } - - if(typeof(myObj) == "undefined"){ - return; // like "continue" - } - if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){ - return; // like "continue" - } - - // TODO: widget values (just call set('value', ...) on the widget) - - // TODO: maybe should call dojo.getNodeProp() instead - switch(element.type){ - case "checkbox": - element.checked = (name in myObj) && - dojo.some(myObj[name], function(val){ return val == element.value; }); - break; - case "radio": - element.checked = (name in myObj) && myObj[name] == element.value; - break; - case "select-multiple": - element.selectedIndex=-1; - dojo.forEach(element.options, function(option){ - option.selected = dojo.some(myObj[name], function(val){ return option.value == val; }); - }); - break; - case "select-one": - element.selectedIndex="0"; - dojo.forEach(element.options, function(option){ - option.selected = option.value == myObj[name]; - }); - break; - case "hidden": - case "text": - case "textarea": - case "password": - element.value = myObj[name] || ""; - break; - } - }); - */ - - // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events - // which I am monitoring. - }, - - getValues: function(){ - dojo.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get('value'); - }, - _getValueAttr: function(){ - // summary: - // Returns Object representing form values. See description of `value` for details. - // description: - - // The value is updated into this.value every time a child has an onChange event, - // so in the common case this function could just return this.value. However, - // that wouldn't work when: - // - // 1. User presses return key to submit a form. That doesn't fire an onchange event, - // and even if it did it would come too late due to the setTimout(..., 0) in _handleOnChange() - // - // 2. app for some reason calls this.get("value") while the user is typing into a - // form field. Not sure if that case needs to be supported or not. - - // get widget values - var obj = { }; - dojo.forEach(this.getDescendants(), function(widget){ - var name = widget.name; - if(!name || widget.disabled){ return; } - - // Single value widget (checkbox, radio, or plain <input> type widget) - var value = widget.get('value'); - - // Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays - if(typeof widget.checked == 'boolean'){ - if(/Radio/.test(widget.declaredClass)){ - // radio button - if(value !== false){ - dojo.setObject(name, value, obj); - }else{ - // give radio widgets a default of null - value = dojo.getObject(name, false, obj); - if(value === undefined){ - dojo.setObject(name, null, obj); - } - } - }else{ - // checkbox/toggle button - var ary=dojo.getObject(name, false, obj); - if(!ary){ - ary=[]; - dojo.setObject(name, ary, obj); - } - if(value !== false){ - ary.push(value); - } - } - }else{ - var prev=dojo.getObject(name, false, obj); - if(typeof prev != "undefined"){ - if(dojo.isArray(prev)){ - prev.push(value); - }else{ - dojo.setObject(name, [prev, value], obj); - } - }else{ - // unique name - dojo.setObject(name, value, obj); - } - } - }); - - /*** - * code for plain input boxes (see also dojo.formToObject, can we use that instead of this code? - * but it doesn't understand [] notation, presumably) - var obj = { }; - dojo.forEach(this.containerNode.elements, function(elm){ - if(!elm.name) { - return; // like "continue" - } - var namePath = elm.name.split("."); - var myObj=obj; - var name=namePath[namePath.length-1]; - for(var j=1,len2=namePath.length;j<len2;++j){ - var nameIndex = null; - var p=namePath[j - 1]; - var nameA=p.split("["); - if(nameA.length > 1){ - if(typeof(myObj[nameA[0]]) == "undefined"){ - myObj[nameA[0]]=[ ]; - } // if - nameIndex=parseInt(nameA[1]); - if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ - myObj[nameA[0]][nameIndex] = { }; - } - } else if(typeof(myObj[nameA[0]]) == "undefined"){ - myObj[nameA[0]] = { } - } // if - - if(nameA.length == 1){ - myObj=myObj[nameA[0]]; - } else{ - myObj=myObj[nameA[0]][nameIndex]; - } // if - } // for - - if((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type == "radio" && elm.checked)){ - if(name == name.split("[")[0]){ - myObj[name]=elm.value; - } else{ - // can not set value when there is no name - } - } else if(elm.type == "checkbox" && elm.checked){ - if(typeof(myObj[name]) == 'undefined'){ - myObj[name]=[ ]; - } - myObj[name].push(elm.value); - } else if(elm.type == "select-multiple"){ - if(typeof(myObj[name]) == 'undefined'){ - myObj[name]=[ ]; - } - for(var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){ - if(elm.options[jdx].selected){ - myObj[name].push(elm.options[jdx].value); - } - } - } // if - name=undefined; - }); // forEach - ***/ - return obj; - }, - - isValid: function(){ - // summary: - // Returns true if all of the widgets are valid. - // Deprecated, will be removed in 2.0. Use get("state") instead. - - return this.state == ""; - }, - - onValidStateChange: function(isValid){ - // summary: - // Stub function to connect to if you want to do something - // (like disable/enable a submit button) when the valid - // state changes on the form as a whole. - // - // Deprecated. Will be removed in 2.0. Use watch("state", ...) instead. - }, - - _getState: function(){ - // summary: - // Compute what this.state should be based on state of children - var states = dojo.map(this._descendants, function(w){ - return w.get("state") || ""; - }); - - return dojo.indexOf(states, "Error") >= 0 ? "Error" : - dojo.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : ""; - }, - - disconnectChildren: function(){ - // summary: - // Remove connections to monitor changes to children's value, error state, and disabled state, - // in order to update Form.value and Form.state. - dojo.forEach(this._childConnections || [], dojo.hitch(this, "disconnect")); - dojo.forEach(this._childWatches || [], function(w){ w.unwatch(); }); - }, - - connectChildren: function(/*Boolean*/ inStartup){ - // summary: - // Setup connections to monitor changes to children's value, error state, and disabled state, - // in order to update Form.value and Form.state. - // - // You can call this function directly, ex. in the event that you - // programmatically add a widget to the form *after* the form has been - // initialized. - - var _this = this; - - // Remove old connections, if any - this.disconnectChildren(); - - this._descendants = this.getDescendants(); - - // (Re)set this.value and this.state. Send watch() notifications but not on startup. - var set = inStartup ? function(name, val){ _this[name] = val; } : dojo.hitch(this, "_set"); - set("value", this.get("value")); - set("state", this._getState()); - - // Monitor changes to error state and disabled state in order to update - // Form.state - var conns = (this._childConnections = []), - watches = (this._childWatches = []); - dojo.forEach(dojo.filter(this._descendants, - function(item){ return item.validate; } - ), - function(widget){ - // We are interested in whenever the widget changes validity state - or - // whenever the disabled attribute on that widget is changed. - dojo.forEach(["state", "disabled"], function(attr){ - watches.push(widget.watch(attr, function(attr, oldVal, newVal){ - _this.set("state", _this._getState()); - })); - }); - }); - - // And monitor calls to child.onChange so we can update this.value - var onChange = function(){ - // summary: - // Called when child's value or disabled state changes - - // Use setTimeout() to collapse value changes in multiple children into a single - // update to my value. Multiple updates will occur on: - // 1. Form.set() - // 2. Form.reset() - // 3. user selecting a radio button (which will de-select another radio button, - // causing two onChange events) - if(_this._onChangeDelayTimer){ - clearTimeout(_this._onChangeDelayTimer); - } - _this._onChangeDelayTimer = setTimeout(function(){ - delete _this._onChangeDelayTimer; - _this._set("value", _this.get("value")); - }, 10); - }; - dojo.forEach( - dojo.filter(this._descendants, function(item){ return item.onChange; } ), - function(widget){ - // When a child widget's value changes, - // the efficient thing to do is to just update that one attribute in this.value, - // but that gets a little complicated when a checkbox is checked/unchecked - // since this.value["checkboxName"] contains an array of all the checkboxes w/the same name. - // Doing simple thing for now. - conns.push(_this.connect(widget, "onChange", onChange)); - - // Disabling/enabling a child widget should remove it's value from this.value. - // Again, this code could be more efficient, doing simple thing for now. - watches.push(widget.watch("disabled", onChange)); - } - ); - }, - - startup: function(){ - this.inherited(arguments); - - // Initialize value and valid/invalid state tracking. Needs to be done in startup() - // so that children are initialized. - this.connectChildren(true); - - // Make state change call onValidStateChange(), will be removed in 2.0 - this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); }); - }, - - destroy: function(){ - this.disconnectChildren(); - this.inherited(arguments); - } - - }); - -} +//>>built +define("dijit/form/_FormMixin",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/window"],function(_1,_2,_3,_4,_5){return _2("dijit.form._FormMixin",null,{state:"",_getDescendantFormWidgets:function(_6){var _7=[];_1.forEach(_6||this.getChildren(),function(_8){if("value" in _8){_7.push(_8);}else{_7=_7.concat(this._getDescendantFormWidgets(_8.getChildren()));}},this);return _7;},reset:function(){_1.forEach(this._getDescendantFormWidgets(),function(_9){if(_9.reset){_9.reset();}});},validate:function(){var _a=false;return _1.every(_1.map(this._getDescendantFormWidgets(),function(_b){_b._hasBeenBlurred=true;var _c=_b.disabled||!_b.validate||_b.validate();if(!_c&&!_a){_5.scrollIntoView(_b.containerNode||_b.domNode);_b.focus();_a=true;}return _c;}),function(_d){return _d;});},setValues:function(_e){_3.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");return this.set("value",_e);},_setValueAttr:function(_f){var map={};_1.forEach(this._getDescendantFormWidgets(),function(_10){if(!_10.name){return;}var _11=map[_10.name]||(map[_10.name]=[]);_11.push(_10);});for(var _12 in map){if(!map.hasOwnProperty(_12)){continue;}var _13=map[_12],_14=_4.getObject(_12,false,_f);if(_14===undefined){continue;}if(!_4.isArray(_14)){_14=[_14];}if(typeof _13[0].checked=="boolean"){_1.forEach(_13,function(w){w.set("value",_1.indexOf(_14,w.value)!=-1);});}else{if(_13[0].multiple){_13[0].set("value",_14);}else{_1.forEach(_13,function(w,i){w.set("value",_14[i]);});}}}},getValues:function(){_3.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};_1.forEach(this._getDescendantFormWidgets(),function(_15){var _16=_15.name;if(!_16||_15.disabled){return;}var _17=_15.get("value");if(typeof _15.checked=="boolean"){if(/Radio/.test(_15.declaredClass)){if(_17!==false){_4.setObject(_16,_17,obj);}else{_17=_4.getObject(_16,false,obj);if(_17===undefined){_4.setObject(_16,null,obj);}}}else{var ary=_4.getObject(_16,false,obj);if(!ary){ary=[];_4.setObject(_16,ary,obj);}if(_17!==false){ary.push(_17);}}}else{var _18=_4.getObject(_16,false,obj);if(typeof _18!="undefined"){if(_4.isArray(_18)){_18.push(_17);}else{_4.setObject(_16,[_18,_17],obj);}}else{_4.setObject(_16,_17,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(){},_getState:function(){var _19=_1.map(this._descendants,function(w){return w.get("state")||"";});return _1.indexOf(_19,"Error")>=0?"Error":_1.indexOf(_19,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){_1.forEach(this._childConnections||[],_4.hitch(this,"disconnect"));_1.forEach(this._childWatches||[],function(w){w.unwatch();});},connectChildren:function(_1a){var _1b=this;this.disconnectChildren();this._descendants=this._getDescendantFormWidgets();var set=_1a?function(_1c,val){_1b[_1c]=val;}:_4.hitch(this,"_set");set("value",this.get("value"));set("state",this._getState());var _1d=(this._childConnections=[]),_1e=(this._childWatches=[]);_1.forEach(_1.filter(this._descendants,function(_1f){return _1f.validate;}),function(_20){_1.forEach(["state","disabled"],function(_21){_1e.push(_20.watch(_21,function(){_1b.set("state",_1b._getState());}));});});var _22=function(){if(_1b._onChangeDelayTimer){clearTimeout(_1b._onChangeDelayTimer);}_1b._onChangeDelayTimer=setTimeout(function(){delete _1b._onChangeDelayTimer;_1b._set("value",_1b.get("value"));},10);};_1.forEach(_1.filter(this._descendants,function(_23){return _23.onChange;}),function(_24){_1d.push(_1b.connect(_24,"onChange",_22));_1e.push(_24.watch("disabled",_22));});},startup:function(){this.inherited(arguments);this.connectChildren(true);this.watch("state",function(_25,_26,_27){this.onValidStateChange(_27=="");});},destroy:function(){this.disconnectChildren();this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/_FormMixin.js.uncompressed.js b/lib/dijit/form/_FormMixin.js.uncompressed.js new file mode 100644 index 000000000..1eb7aa2b2 --- /dev/null +++ b/lib/dijit/form/_FormMixin.js.uncompressed.js @@ -0,0 +1,475 @@ +define("dijit/form/_FormMixin", [ + "dojo/_base/array", // array.every array.filter array.forEach array.indexOf array.map + "dojo/_base/declare", // declare + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/lang", // lang.hitch lang.isArray + "dojo/window" // winUtils.scrollIntoView +], function(array, declare, kernel, lang, winUtils){ + + // module: + // dijit/form/_FormMixin + // summary: + // Mixin for containers of form widgets (i.e. widgets that represent a single value + // and can be children of a <form> node or dijit.form.Form widget) + + return declare("dijit.form._FormMixin", null, { + // summary: + // Mixin for containers of form widgets (i.e. widgets that represent a single value + // and can be children of a <form> node or dijit.form.Form widget) + // description: + // Can extract all the form widgets + // values and combine them into a single javascript object, or alternately + // take such an object and set the values for all the contained + // form widgets + + /*===== + // value: Object + // Name/value hash for each child widget with a name and value. + // Child widgets without names are not part of the hash. + // + // If there are multiple child widgets w/the same name, value is an array, + // unless they are radio buttons in which case value is a scalar (since only + // one radio button can be checked at a time). + // + // If a child widget's name is a dot separated list (like a.b.c.d), it's a nested structure. + // + // Example: + // | { name: "John Smith", interests: ["sports", "movies"] } + =====*/ + + // state: [readonly] String + // Will be "Error" if one or more of the child widgets has an invalid value, + // "Incomplete" if not all of the required child widgets are filled in. Otherwise, "", + // which indicates that the form is ready to be submitted. + state: "", + + // TODO: + // * Repeater + // * better handling for arrays. Often form elements have names with [] like + // * people[3].sex (for a list of people [{name: Bill, sex: M}, ...]) + // + // + + _getDescendantFormWidgets: function(/*dijit._WidgetBase[]?*/ children){ + // summary: + // Returns all form widget descendants, searching through non-form child widgets like BorderContainer + var res = []; + array.forEach(children || this.getChildren(), function(child){ + if("value" in child){ + res.push(child); + }else{ + res = res.concat(this._getDescendantFormWidgets(child.getChildren())); + } + }, this); + return res; + }, + + reset: function(){ + array.forEach(this._getDescendantFormWidgets(), function(widget){ + if(widget.reset){ + widget.reset(); + } + }); + }, + + validate: function(){ + // summary: + // returns if the form is valid - same as isValid - but + // provides a few additional (ui-specific) features. + // 1 - it will highlight any sub-widgets that are not + // valid + // 2 - it will call focus() on the first invalid + // sub-widget + var didFocus = false; + return array.every(array.map(this._getDescendantFormWidgets(), function(widget){ + // Need to set this so that "required" widgets get their + // state set. + widget._hasBeenBlurred = true; + var valid = widget.disabled || !widget.validate || widget.validate(); + if(!valid && !didFocus){ + // Set focus of the first non-valid widget + winUtils.scrollIntoView(widget.containerNode || widget.domNode); + widget.focus(); + didFocus = true; + } + return valid; + }), function(item){ return item; }); + }, + + setValues: function(val){ + kernel.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0"); + return this.set('value', val); + }, + _setValueAttr: function(/*Object*/ obj){ + // summary: + // Fill in form values from according to an Object (in the format returned by get('value')) + + // generate map from name --> [list of widgets with that name] + var map = { }; + array.forEach(this._getDescendantFormWidgets(), function(widget){ + if(!widget.name){ return; } + var entry = map[widget.name] || (map[widget.name] = [] ); + entry.push(widget); + }); + + for(var name in map){ + if(!map.hasOwnProperty(name)){ + continue; + } + var widgets = map[name], // array of widgets w/this name + values = lang.getObject(name, false, obj); // list of values for those widgets + + if(values === undefined){ + continue; + } + if(!lang.isArray(values)){ + values = [ values ]; + } + if(typeof widgets[0].checked == 'boolean'){ + // for checkbox/radio, values is a list of which widgets should be checked + array.forEach(widgets, function(w){ + w.set('value', array.indexOf(values, w.value) != -1); + }); + }else if(widgets[0].multiple){ + // it takes an array (e.g. multi-select) + widgets[0].set('value', values); + }else{ + // otherwise, values is a list of values to be assigned sequentially to each widget + array.forEach(widgets, function(w, i){ + w.set('value', values[i]); + }); + } + } + + /*** + * TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets) + + array.forEach(this.containerNode.elements, function(element){ + if(element.name == ''){return}; // like "continue" + var namePath = element.name.split("."); + var myObj=obj; + var name=namePath[namePath.length-1]; + for(var j=1,len2=namePath.length;j<len2;++j){ + var p=namePath[j - 1]; + // repeater support block + var nameA=p.split("["); + if(nameA.length > 1){ + if(typeof(myObj[nameA[0]]) == "undefined"){ + myObj[nameA[0]]=[ ]; + } // if + + nameIndex=parseInt(nameA[1]); + if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ + myObj[nameA[0]][nameIndex] = { }; + } + myObj=myObj[nameA[0]][nameIndex]; + continue; + } // repeater support ends + + if(typeof(myObj[p]) == "undefined"){ + myObj=undefined; + break; + }; + myObj=myObj[p]; + } + + if(typeof(myObj) == "undefined"){ + return; // like "continue" + } + if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){ + return; // like "continue" + } + + // TODO: widget values (just call set('value', ...) on the widget) + + // TODO: maybe should call dojo.getNodeProp() instead + switch(element.type){ + case "checkbox": + element.checked = (name in myObj) && + array.some(myObj[name], function(val){ return val == element.value; }); + break; + case "radio": + element.checked = (name in myObj) && myObj[name] == element.value; + break; + case "select-multiple": + element.selectedIndex=-1; + array.forEach(element.options, function(option){ + option.selected = array.some(myObj[name], function(val){ return option.value == val; }); + }); + break; + case "select-one": + element.selectedIndex="0"; + array.forEach(element.options, function(option){ + option.selected = option.value == myObj[name]; + }); + break; + case "hidden": + case "text": + case "textarea": + case "password": + element.value = myObj[name] || ""; + break; + } + }); + */ + + // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events + // which I am monitoring. + }, + + getValues: function(){ + kernel.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.", "", "2.0"); + return this.get('value'); + }, + _getValueAttr: function(){ + // summary: + // Returns Object representing form values. See description of `value` for details. + // description: + + // The value is updated into this.value every time a child has an onChange event, + // so in the common case this function could just return this.value. However, + // that wouldn't work when: + // + // 1. User presses return key to submit a form. That doesn't fire an onchange event, + // and even if it did it would come too late due to the setTimeout(..., 0) in _handleOnChange() + // + // 2. app for some reason calls this.get("value") while the user is typing into a + // form field. Not sure if that case needs to be supported or not. + + // get widget values + var obj = { }; + array.forEach(this._getDescendantFormWidgets(), function(widget){ + var name = widget.name; + if(!name || widget.disabled){ return; } + + // Single value widget (checkbox, radio, or plain <input> type widget) + var value = widget.get('value'); + + // Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays + if(typeof widget.checked == 'boolean'){ + if(/Radio/.test(widget.declaredClass)){ + // radio button + if(value !== false){ + lang.setObject(name, value, obj); + }else{ + // give radio widgets a default of null + value = lang.getObject(name, false, obj); + if(value === undefined){ + lang.setObject(name, null, obj); + } + } + }else{ + // checkbox/toggle button + var ary=lang.getObject(name, false, obj); + if(!ary){ + ary=[]; + lang.setObject(name, ary, obj); + } + if(value !== false){ + ary.push(value); + } + } + }else{ + var prev=lang.getObject(name, false, obj); + if(typeof prev != "undefined"){ + if(lang.isArray(prev)){ + prev.push(value); + }else{ + lang.setObject(name, [prev, value], obj); + } + }else{ + // unique name + lang.setObject(name, value, obj); + } + } + }); + + /*** + * code for plain input boxes (see also domForm.formToObject, can we use that instead of this code? + * but it doesn't understand [] notation, presumably) + var obj = { }; + array.forEach(this.containerNode.elements, function(elm){ + if(!elm.name) { + return; // like "continue" + } + var namePath = elm.name.split("."); + var myObj=obj; + var name=namePath[namePath.length-1]; + for(var j=1,len2=namePath.length;j<len2;++j){ + var nameIndex = null; + var p=namePath[j - 1]; + var nameA=p.split("["); + if(nameA.length > 1){ + if(typeof(myObj[nameA[0]]) == "undefined"){ + myObj[nameA[0]]=[ ]; + } // if + nameIndex=parseInt(nameA[1]); + if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ + myObj[nameA[0]][nameIndex] = { }; + } + }else if(typeof(myObj[nameA[0]]) == "undefined"){ + myObj[nameA[0]] = { } + } // if + + if(nameA.length == 1){ + myObj=myObj[nameA[0]]; + }else{ + myObj=myObj[nameA[0]][nameIndex]; + } // if + } // for + + if((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type == "radio" && elm.checked)){ + if(name == name.split("[")[0]){ + myObj[name]=elm.value; + }else{ + // can not set value when there is no name + } + }else if(elm.type == "checkbox" && elm.checked){ + if(typeof(myObj[name]) == 'undefined'){ + myObj[name]=[ ]; + } + myObj[name].push(elm.value); + }else if(elm.type == "select-multiple"){ + if(typeof(myObj[name]) == 'undefined'){ + myObj[name]=[ ]; + } + for(var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){ + if(elm.options[jdx].selected){ + myObj[name].push(elm.options[jdx].value); + } + } + } // if + name=undefined; + }); // forEach + ***/ + return obj; + }, + + isValid: function(){ + // summary: + // Returns true if all of the widgets are valid. + // Deprecated, will be removed in 2.0. Use get("state") instead. + + return this.state == ""; + }, + + onValidStateChange: function(/*Boolean*/ /*===== isValid =====*/){ + // summary: + // Stub function to connect to if you want to do something + // (like disable/enable a submit button) when the valid + // state changes on the form as a whole. + // + // Deprecated. Will be removed in 2.0. Use watch("state", ...) instead. + }, + + _getState: function(){ + // summary: + // Compute what this.state should be based on state of children + var states = array.map(this._descendants, function(w){ + return w.get("state") || ""; + }); + + return array.indexOf(states, "Error") >= 0 ? "Error" : + array.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : ""; + }, + + disconnectChildren: function(){ + // summary: + // Remove connections to monitor changes to children's value, error state, and disabled state, + // in order to update Form.value and Form.state. + array.forEach(this._childConnections || [], lang.hitch(this, "disconnect")); + array.forEach(this._childWatches || [], function(w){ w.unwatch(); }); + }, + + connectChildren: function(/*Boolean*/ inStartup){ + // summary: + // Setup connections to monitor changes to children's value, error state, and disabled state, + // in order to update Form.value and Form.state. + // + // You can call this function directly, ex. in the event that you + // programmatically add a widget to the form *after* the form has been + // initialized. + + var _this = this; + + // Remove old connections, if any + this.disconnectChildren(); + + this._descendants = this._getDescendantFormWidgets(); + + // (Re)set this.value and this.state. Send watch() notifications but not on startup. + var set = inStartup ? function(name, val){ _this[name] = val; } : lang.hitch(this, "_set"); + set("value", this.get("value")); + set("state", this._getState()); + + // Monitor changes to error state and disabled state in order to update + // Form.state + var conns = (this._childConnections = []), + watches = (this._childWatches = []); + array.forEach(array.filter(this._descendants, + function(item){ return item.validate; } + ), + function(widget){ + // We are interested in whenever the widget changes validity state - or + // whenever the disabled attribute on that widget is changed. + array.forEach(["state", "disabled"], function(attr){ + watches.push(widget.watch(attr, function(){ + _this.set("state", _this._getState()); + })); + }); + }); + + // And monitor calls to child.onChange so we can update this.value + var onChange = function(){ + // summary: + // Called when child's value or disabled state changes + + // Use setTimeout() to collapse value changes in multiple children into a single + // update to my value. Multiple updates will occur on: + // 1. Form.set() + // 2. Form.reset() + // 3. user selecting a radio button (which will de-select another radio button, + // causing two onChange events) + if(_this._onChangeDelayTimer){ + clearTimeout(_this._onChangeDelayTimer); + } + _this._onChangeDelayTimer = setTimeout(function(){ + delete _this._onChangeDelayTimer; + _this._set("value", _this.get("value")); + }, 10); + }; + array.forEach( + array.filter(this._descendants, function(item){ return item.onChange; } ), + function(widget){ + // When a child widget's value changes, + // the efficient thing to do is to just update that one attribute in this.value, + // but that gets a little complicated when a checkbox is checked/unchecked + // since this.value["checkboxName"] contains an array of all the checkboxes w/the same name. + // Doing simple thing for now. + conns.push(_this.connect(widget, "onChange", onChange)); + + // Disabling/enabling a child widget should remove it's value from this.value. + // Again, this code could be more efficient, doing simple thing for now. + watches.push(widget.watch("disabled", onChange)); + } + ); + }, + + startup: function(){ + this.inherited(arguments); + + // Initialize value and valid/invalid state tracking. Needs to be done in startup() + // so that children are initialized. + this.connectChildren(true); + + // Make state change call onValidStateChange(), will be removed in 2.0 + this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); }); + }, + + destroy: function(){ + this.disconnectChildren(); + this.inherited(arguments); + } + + }); +}); diff --git a/lib/dijit/form/_FormSelectWidget.js b/lib/dijit/form/_FormSelectWidget.js index fbbf7226b..994bc940b 100644 --- a/lib/dijit/form/_FormSelectWidget.js +++ b/lib/dijit/form/_FormSelectWidget.js @@ -1,582 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form._FormSelectWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._FormSelectWidget"] = true; -dojo.provide("dijit.form._FormSelectWidget"); -dojo.require("dijit.form._FormWidget"); -dojo.require("dojo.data.util.sorter"); - - -/*===== -dijit.form.__SelectOption = function(){ - // value: String - // The value of the option. Setting to empty (or missing) will - // place a separator at that location - // label: String - // The label for our option. It can contain html tags. - // selected: Boolean - // Whether or not we are a selected option - // disabled: Boolean - // Whether or not this specific option is disabled - this.value = value; - this.label = label; - this.selected = selected; - this.disabled = disabled; -} -=====*/ - -dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, { - // summary: - // Extends _FormValueWidget in order to provide "select-specific" - // values - i.e., those values that are unique to <select> elements. - // This also provides the mechanism for reading the elements from - // a store, if desired. - - // multiple: [const] Boolean - // Whether or not we are multi-valued - multiple: false, - - // options: dijit.form.__SelectOption[] - // The set of options for our select item. Roughly corresponds to - // the html <option> tag. - options: null, - - // store: dojo.data.api.Identity - // A store which, at the very least impelements dojo.data.api.Identity - // to use for getting our list of options - rather than reading them - // from the <option> html tags. - store: null, - - // query: object - // A query to use when fetching items from our store - query: null, - - // queryOptions: object - // Query options to use when fetching from the store - queryOptions: null, - - // onFetch: Function - // A callback to do with an onFetch - but before any items are actually - // iterated over (i.e. to filter even futher what you want to add) - onFetch: null, - - // sortByLabel: Boolean - // Flag to sort the options returned from a store by the label of - // the store. - sortByLabel: true, - - - // loadChildrenOnOpen: Boolean - // By default loadChildren is called when the items are fetched from the - // store. This property allows delaying loadChildren (and the creation - // of the options/menuitems) until the user clicks the button to open the - // dropdown. - loadChildrenOnOpen: false, - - getOptions: function(/*anything*/ valueOrIdx){ - // summary: - // Returns a given option (or options). - // valueOrIdx: - // If passed in as a string, that string is used to look up the option - // in the array of options - based on the value property. - // (See dijit.form.__SelectOption). - // - // If passed in a number, then the option with the given index (0-based) - // within this select will be returned. - // - // If passed in a dijit.form.__SelectOption, the same option will be - // returned if and only if it exists within this select. - // - // If passed an array, then an array will be returned with each element - // in the array being looked up. - // - // If not passed a value, then all options will be returned - // - // returns: - // The option corresponding with the given value or index. null - // is returned if any of the following are true: - // - A string value is passed in which doesn't exist - // - An index is passed in which is outside the bounds of the array of options - // - A dijit.form.__SelectOption is passed in which is not a part of the select - - // NOTE: the compare for passing in a dijit.form.__SelectOption checks - // if the value property matches - NOT if the exact option exists - // NOTE: if passing in an array, null elements will be placed in the returned - // array when a value is not found. - var lookupValue = valueOrIdx, opts = this.options || [], l = opts.length; - - if(lookupValue === undefined){ - return opts; // dijit.form.__SelectOption[] - } - if(dojo.isArray(lookupValue)){ - return dojo.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__SelectOption[] - } - if(dojo.isObject(valueOrIdx)){ - // We were passed an option - so see if it's in our array (directly), - // and if it's not, try and find it by value. - if(!dojo.some(this.options, function(o, idx){ - if(o === lookupValue || - (o.value && o.value === lookupValue.value)){ - lookupValue = idx; - return true; - } - return false; - })){ - lookupValue = -1; - } - } - if(typeof lookupValue == "string"){ - for(var i=0; i<l; i++){ - if(opts[i].value === lookupValue){ - lookupValue = i; - break; - } - } - } - if(typeof lookupValue == "number" && lookupValue >= 0 && lookupValue < l){ - return this.options[lookupValue] // dijit.form.__SelectOption - } - return null; // null - }, - - addOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ option){ - // summary: - // Adds an option or options to the end of the select. If value - // of the option is empty or missing, a separator is created instead. - // Passing in an array of options will yield slightly better performance - // since the children are only loaded once. - if(!dojo.isArray(option)){ option = [option]; } - dojo.forEach(option, function(i){ - if(i && dojo.isObject(i)){ - this.options.push(i); - } - }, this); - this._loadChildren(); - }, - - removeOption: function(/*String|dijit.form.__SelectOption|Number|Array*/ valueOrIdx){ - // summary: - // Removes the given option or options. You can remove by string - // (in which case the value is removed), number (in which case the - // index in the options array is removed), or select option (in - // which case, the select option with a matching value is removed). - // You can also pass in an array of those values for a slightly - // better performance since the children are only loaded once. - if(!dojo.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; } - var oldOpts = this.getOptions(valueOrIdx); - dojo.forEach(oldOpts, function(i){ - // We can get null back in our array - if our option was not found. In - // that case, we don't want to blow up... - if(i){ - this.options = dojo.filter(this.options, function(node, idx){ - return (node.value !== i.value || node.label !== i.label); - }); - this._removeOptionItem(i); - } - }, this); - this._loadChildren(); - }, - - updateOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ newOption){ - // summary: - // Updates the values of the given option. The option to update - // is matched based on the value of the entered option. Passing - // in an array of new options will yeild better performance since - // the children will only be loaded once. - if(!dojo.isArray(newOption)){ newOption = [newOption]; } - dojo.forEach(newOption, function(i){ - var oldOpt = this.getOptions(i), k; - if(oldOpt){ - for(k in i){ oldOpt[k] = i[k]; } - } - }, this); - this._loadChildren(); - }, - - setStore: function(/*dojo.data.api.Identity*/ store, - /*anything?*/ selectedValue, - /*Object?*/ fetchArgs){ - // summary: - // Sets the store you would like to use with this select widget. - // The selected value is the value of the new store to set. This - // function returns the original store, in case you want to reuse - // it or something. - // store: dojo.data.api.Identity - // The store you would like to use - it MUST implement Identity, - // and MAY implement Notification. - // selectedValue: anything? - // The value that this widget should set itself to *after* the store - // has been loaded - // fetchArgs: Object? - // The arguments that will be passed to the store's fetch() function - var oStore = this.store; - fetchArgs = fetchArgs || {}; - if(oStore !== store){ - // Our store has changed, so update our notifications - dojo.forEach(this._notifyConnections || [], dojo.disconnect); - delete this._notifyConnections; - if(store && store.getFeatures()["dojo.data.api.Notification"]){ - this._notifyConnections = [ - dojo.connect(store, "onNew", this, "_onNewItem"), - dojo.connect(store, "onDelete", this, "_onDeleteItem"), - dojo.connect(store, "onSet", this, "_onSetItem") - ]; - } - this._set("store", store); - } - - // Turn off change notifications while we make all these changes - this._onChangeActive = false; - - // Remove existing options (if there are any) - if(this.options && this.options.length){ - this.removeOption(this.options); - } - - // Add our new options - if(store){ - this._loadingStore = true; - store.fetch(dojo.delegate(fetchArgs, { - onComplete: function(items, opts){ - if(this.sortByLabel && !fetchArgs.sort && items.length){ - items.sort(dojo.data.util.sorter.createSortFunction([{ - attribute: store.getLabelAttributes(items[0])[0] - }], store)); - } - - if(fetchArgs.onFetch){ - items = fetchArgs.onFetch.call(this, items, opts); - } - // TODO: Add these guys as a batch, instead of separately - dojo.forEach(items, function(i){ - this._addOptionForItem(i); - }, this); - - // Set our value (which might be undefined), and then tweak - // it to send a change event with the real value - this._loadingStore = false; - this.set("value", "_pendingValue" in this ? this._pendingValue : selectedValue); - delete this._pendingValue; - - if(!this.loadChildrenOnOpen){ - this._loadChildren(); - }else{ - this._pseudoLoadChildren(items); - } - this._fetchedWith = opts; - this._lastValueReported = this.multiple ? [] : null; - this._onChangeActive = true; - this.onSetStore(); - this._handleOnChange(this.value); - }, - scope: this - })); - }else{ - delete this._fetchedWith; - } - return oStore; // dojo.data.api.Identity - }, - - // TODO: implement set() and watch() for store and query, although not sure how to handle - // setting them individually rather than together (as in setStore() above) - - _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // set the value of the widget. - // If a string is passed, then we set our value from looking it up. - if(this._loadingStore){ - // Our store is loading - so save our value, and we'll set it when - // we're done - this._pendingValue = newValue; - return; - } - var opts = this.getOptions() || []; - if(!dojo.isArray(newValue)){ - newValue = [newValue]; - } - dojo.forEach(newValue, function(i, idx){ - if(!dojo.isObject(i)){ - i = i + ""; - } - if(typeof i === "string"){ - newValue[idx] = dojo.filter(opts, function(node){ - return node.value === i; - })[0] || {value: "", label: ""}; - } - }, this); - - // Make sure some sane default is set - newValue = dojo.filter(newValue, function(i){ return i && i.value; }); - if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){ - newValue[0] = opts[0]; - } - dojo.forEach(opts, function(i){ - i.selected = dojo.some(newValue, function(v){ return v.value === i.value; }); - }); - var val = dojo.map(newValue, function(i){ return i.value; }), - disp = dojo.map(newValue, function(i){ return i.label; }); - - this._set("value", this.multiple ? val : val[0]); - this._setDisplay(this.multiple ? disp : disp[0]); - this._updateSelection(); - this._handleOnChange(this.value, priorityChange); - }, - - _getDisplayedValueAttr: function(){ - // summary: - // returns the displayed value of the widget - var val = this.get("value"); - if(!dojo.isArray(val)){ - val = [val]; - } - var ret = dojo.map(this.getOptions(val), function(v){ - if(v && "label" in v){ - return v.label; - }else if(v){ - return v.value; - } - return null; - }, this); - return this.multiple ? ret : ret[0]; - }, - - _loadChildren: function(){ - // summary: - // Loads the children represented by this widget's options. - // reset the menu to make it populatable on the next click - if(this._loadingStore){ return; } - dojo.forEach(this._getChildren(), function(child){ - child.destroyRecursive(); - }); - // Add each menu item - dojo.forEach(this.options, this._addOptionItem, this); - - // Update states - this._updateSelection(); - }, - - _updateSelection: function(){ - // summary: - // Sets the "selected" class on the item for styling purposes - this._set("value", this._getValueFromOpts()); - var val = this.value; - if(!dojo.isArray(val)){ - val = [val]; - } - if(val && val[0]){ - dojo.forEach(this._getChildren(), function(child){ - var isSelected = dojo.some(val, function(v){ - return child.option && (v === child.option.value); - }); - dojo.toggleClass(child.domNode, this.baseClass + "SelectedOption", isSelected); - dijit.setWaiState(child.domNode, "selected", isSelected); - }, this); - } - }, - - _getValueFromOpts: function(){ - // summary: - // Returns the value of the widget by reading the options for - // the selected flag - var opts = this.getOptions() || []; - if(!this.multiple && opts.length){ - // Mirror what a select does - choose the first one - var opt = dojo.filter(opts, function(i){ - return i.selected; - })[0]; - if(opt && opt.value){ - return opt.value - }else{ - opts[0].selected = true; - return opts[0].value; - } - }else if(this.multiple){ - // Set value to be the sum of all selected - return dojo.map(dojo.filter(opts, function(i){ - return i.selected; - }), function(i){ - return i.value; - }) || []; - } - return ""; - }, - - // Internal functions to call when we have store notifications come in - _onNewItem: function(/*item*/ item, /*Object?*/ parentInfo){ - if(!parentInfo || !parentInfo.parent){ - // Only add it if we are top-level - this._addOptionForItem(item); - } - }, - _onDeleteItem: function(/*item*/ item){ - var store = this.store; - this.removeOption(store.getIdentity(item)); - }, - _onSetItem: function(/*item*/ item){ - this.updateOption(this._getOptionObjForItem(item)); - }, - - _getOptionObjForItem: function(item){ - // summary: - // Returns an option object based off the given item. The "value" - // of the option item will be the identity of the item, the "label" - // of the option will be the label of the item. If the item contains - // children, the children value of the item will be set - var store = this.store, label = store.getLabel(item), - value = (label ? store.getIdentity(item) : null); - return {value: value, label: label, item:item}; // dijit.form.__SelectOption - }, - - _addOptionForItem: function(/*item*/ item){ - // summary: - // Creates (and adds) the option for the given item - var store = this.store; - if(!store.isItemLoaded(item)){ - // We are not loaded - so let's load it and add later - store.loadItem({item: item, onComplete: function(i){ - this._addOptionForItem(item); - }, - scope: this}); - return; - } - var newOpt = this._getOptionObjForItem(item); - this.addOption(newOpt); - }, - - constructor: function(/*Object*/ keywordArgs){ - // summary: - // Saves off our value, if we have an initial one set so we - // can use it if we have a store as well (see startup()) - this._oValue = (keywordArgs || {}).value || null; - }, - - buildRendering: function(){ - this.inherited(arguments); - dojo.setSelectable(this.focusNode, false); - }, - - _fillContent: function(){ - // summary: - // Loads our options and sets up our dropdown correctly. We - // don't want any content, so we don't call any inherit chain - // function. - var opts = this.options; - if(!opts){ - opts = this.options = this.srcNodeRef ? dojo.query(">", - this.srcNodeRef).map(function(node){ - if(node.getAttribute("type") === "separator"){ - return { value: "", label: "", selected: false, disabled: false }; - } - return { - value: (node.getAttribute("data-" + dojo._scopeName + "-value") || node.getAttribute("value")), - label: String(node.innerHTML), - // FIXME: disabled and selected are not valid on complex markup children (which is why we're - // looking for data-dojo-value above. perhaps we should data-dojo-props="" this whole thing?) - // decide before 1.6 - selected: node.getAttribute("selected") || false, - disabled: node.getAttribute("disabled") || false - }; - }, this) : []; - } - if(!this.value){ - this._set("value", this._getValueFromOpts()); - }else if(this.multiple && typeof this.value == "string"){ - this_set("value", this.value.split(",")); - } - }, - - postCreate: function(){ - // summary: - // sets up our event handling that we need for functioning - // as a select - this.inherited(arguments); - - // Make our event connections for updating state - this.connect(this, "onChange", "_updateSelection"); - this.connect(this, "startup", "_loadChildren"); - - this._setValueAttr(this.value, null); - }, - - startup: function(){ - // summary: - // Connects in our store, if we have one defined - this.inherited(arguments); - var store = this.store, fetchArgs = {}; - dojo.forEach(["query", "queryOptions", "onFetch"], function(i){ - if(this[i]){ - fetchArgs[i] = this[i]; - } - delete this[i]; - }, this); - if(store && store.getFeatures()["dojo.data.api.Identity"]){ - // Temporarily set our store to null so that it will get set - // and connected appropriately - this.store = null; - this.setStore(store, this._oValue, fetchArgs); - } - }, - - destroy: function(){ - // summary: - // Clean up our connections - dojo.forEach(this._notifyConnections || [], dojo.disconnect); - this.inherited(arguments); - }, - - _addOptionItem: function(/*dijit.form.__SelectOption*/ option){ - // summary: - // User-overridable function which, for the given option, adds an - // item to the select. If the option doesn't have a value, then a - // separator is added in that place. Make sure to store the option - // in the created option widget. - }, - - _removeOptionItem: function(/*dijit.form.__SelectOption*/ option){ - // summary: - // User-overridable function which, for the given option, removes - // its item from the select. - }, - - _setDisplay: function(/*String or String[]*/ newDisplay){ - // summary: - // Overridable function which will set the display for the - // widget. newDisplay is either a string (in the case of - // single selects) or array of strings (in the case of multi-selects) - }, - - _getChildren: function(){ - // summary: - // Overridable function to return the children that this widget contains. - return []; - }, - - _getSelectedOptionsAttr: function(){ - // summary: - // hooks into this.attr to provide a mechanism for getting the - // option items for the current value of the widget. - return this.getOptions(this.get("value")); - }, - - _pseudoLoadChildren: function(/*item[]*/ items){ - // summary: - // a function that will "fake" loading children, if needed, and - // if we have set to not load children until the widget opens. - // items: - // An array of items that will be loaded, when needed - }, - - onSetStore: function(){ - // summary: - // a function that can be connected to in order to receive a - // notification that the store has finished loading and all options - // from that store are available - } -}); - -} +//>>built +define("dijit/form/_FormSelectWidget",["dojo/_base/array","dojo/aspect","dojo/data/util/sorter","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/query","./_FormValueWidget"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _4("dijit.form._FormSelectWidget",_a,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_b){var _c=_b,_d=this.options||[],l=_d.length;if(_c===undefined){return _d;}if(_8.isArray(_c)){return _1.map(_c,"return this.getOptions(item);",this);}if(_8.isObject(_b)){if(!_1.some(this.options,function(o,_e){if(o===_c||(o.value&&o.value===_c.value)){_c=_e;return true;}return false;})){_c=-1;}}if(typeof _c=="string"){for(var i=0;i<l;i++){if(_d[i].value===_c){_c=i;break;}}}if(typeof _c=="number"&&_c>=0&&_c<l){return this.options[_c];}return null;},addOption:function(_f){if(!_8.isArray(_f)){_f=[_f];}_1.forEach(_f,function(i){if(i&&_8.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_10){if(!_8.isArray(_10)){_10=[_10];}var _11=this.getOptions(_10);_1.forEach(_11,function(i){if(i){this.options=_1.filter(this.options,function(_12){return (_12.value!==i.value||_12.label!==i.label);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_13){if(!_8.isArray(_13)){_13=[_13];}_1.forEach(_13,function(i){var _14=this.getOptions(i),k;if(_14){for(k in i){_14[k]=i[k];}}},this);this._loadChildren();},setStore:function(_15,_16,_17){var _18=this.store;_17=_17||{};if(_18!==_15){var h;while(h=this._notifyConnections.pop()){h.remove();}if(_15&&_15.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[_2.after(_15,"onNew",_8.hitch(this,"_onNewItem"),true),_2.after(_15,"onDelete",_8.hitch(this,"_onDeleteItem"),true),_2.after(_15,"onSet",_8.hitch(this,"_onSetItem"),true)];}this._set("store",_15);}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_15){this._loadingStore=true;_15.fetch(_8.delegate(_17,{onComplete:function(_19,_1a){if(this.sortByLabel&&!_17.sort&&_19.length){_19.sort(_3.createSortFunction([{attribute:_15.getLabelAttributes(_19[0])[0]}],_15));}if(_17.onFetch){_19=_17.onFetch.call(this,_19,_1a);}_1.forEach(_19,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_16);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_19);}this._fetchedWith=_1a;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);},scope:this}));}else{delete this._fetchedWith;}return _18;},_setValueAttr:function(_1b,_1c){if(this._loadingStore){this._pendingValue=_1b;return;}var _1d=this.getOptions()||[];if(!_8.isArray(_1b)){_1b=[_1b];}_1.forEach(_1b,function(i,idx){if(!_8.isObject(i)){i=i+"";}if(typeof i==="string"){_1b[idx]=_1.filter(_1d,function(_1e){return _1e.value===i;})[0]||{value:"",label:""};}},this);_1b=_1.filter(_1b,function(i){return i&&i.value;});if(!this.multiple&&(!_1b[0]||!_1b[0].value)&&_1d.length){_1b[0]=_1d[0];}_1.forEach(_1d,function(i){i.selected=_1.some(_1b,function(v){return v.value===i.value;});});var val=_1.map(_1b,function(i){return i.value;}),_1f=_1.map(_1b,function(i){return i.label;});this._set("value",this.multiple?val:val[0]);this._setDisplay(this.multiple?_1f:_1f[0]);this._updateSelection();this._handleOnChange(this.value,_1c);},_getDisplayedValueAttr:function(){var val=this.get("value");if(!_8.isArray(val)){val=[val];}var ret=_1.map(this.getOptions(val),function(v){if(v&&"label" in v){return v.label;}else{if(v){return v.value;}}return null;},this);return this.multiple?ret:ret[0];},_loadChildren:function(){if(this._loadingStore){return;}_1.forEach(this._getChildren(),function(_20){_20.destroyRecursive();});_1.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!_8.isArray(val)){val=[val];}if(val&&val[0]){_1.forEach(this._getChildren(),function(_21){var _22=_1.some(val,function(v){return _21.option&&(v===_21.option.value);});_6.toggle(_21.domNode,this.baseClass+"SelectedOption",_22);_21.domNode.setAttribute("aria-selected",_22);},this);}},_getValueFromOpts:function(){var _23=this.getOptions()||[];if(!this.multiple&&_23.length){var opt=_1.filter(_23,function(i){return i.selected;})[0];if(opt&&opt.value){return opt.value;}else{_23[0].selected=true;return _23[0].value;}}else{if(this.multiple){return _1.map(_1.filter(_23,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(_24,_25){if(!_25||!_25.parent){this._addOptionForItem(_24);}},_onDeleteItem:function(_26){var _27=this.store;this.removeOption(_27.getIdentity(_26));},_onSetItem:function(_28){this.updateOption(this._getOptionObjForItem(_28));},_getOptionObjForItem:function(_29){var _2a=this.store,_2b=_2a.getLabel(_29),_2c=(_2b?_2a.getIdentity(_29):null);return {value:_2c,label:_2b,item:_29};},_addOptionForItem:function(_2d){var _2e=this.store;if(!_2e.isItemLoaded(_2d)){_2e.loadItem({item:_2d,onItem:function(i){this._addOptionForItem(i);},scope:this});return;}var _2f=this._getOptionObjForItem(_2d);this.addOption(_2f);},constructor:function(_30){this._oValue=(_30||{}).value||null;this._notifyConnections=[];},buildRendering:function(){this.inherited(arguments);_5.setSelectable(this.focusNode,false);},_fillContent:function(){var _31=this.options;if(!_31){_31=this.options=this.srcNodeRef?_9("> *",this.srcNodeRef).map(function(_32){if(_32.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(_32.getAttribute("data-"+_7._scopeName+"-value")||_32.getAttribute("value")),label:String(_32.innerHTML),selected:_32.getAttribute("selected")||false,disabled:_32.getAttribute("disabled")||false};},this):[];}if(!this.value){this._set("value",this._getValueFromOpts());}else{if(this.multiple&&typeof this.value=="string"){this._set("value",this.value.split(","));}}},postCreate:function(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _33=this.store,_34={};_1.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_34[i]=this[i];}delete this[i];},this);if(_33&&_33.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_33,this._oValue,_34);}},destroy:function(){var h;while(h=this._notifyConnections.pop()){h.remove();}this.inherited(arguments);},_addOptionItem:function(){},_removeOptionItem:function(){},_setDisplay:function(){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(){},onSetStore:function(){}});});
\ No newline at end of file diff --git a/lib/dijit/form/_FormSelectWidget.js.uncompressed.js b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js new file mode 100644 index 000000000..ade84035c --- /dev/null +++ b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js @@ -0,0 +1,595 @@ +define("dijit/form/_FormSelectWidget", [ + "dojo/_base/array", // array.filter array.forEach array.map array.some + "dojo/aspect", // aspect.after + "dojo/data/util/sorter", // util.sorter.createSortFunction + "dojo/_base/declare", // declare + "dojo/dom", // dom.setSelectable + "dojo/dom-class", // domClass.toggle + "dojo/_base/kernel", // _scopeName + "dojo/_base/lang", // lang.delegate lang.isArray lang.isObject lang.hitch + "dojo/query", // query + "./_FormValueWidget" +], function(array, aspect, sorter, declare, dom, domClass, kernel, lang, query, _FormValueWidget){ + +/*===== + var _FormValueWidget = dijit.form._FormValueWidget; +=====*/ + +// module: +// dijit/form/_FormSelectWidget +// summary: +// Extends _FormValueWidget in order to provide "select-specific" +// values - i.e., those values that are unique to <select> elements. + + +/*===== +dijit.form.__SelectOption = function(){ + // value: String + // The value of the option. Setting to empty (or missing) will + // place a separator at that location + // label: String + // The label for our option. It can contain html tags. + // selected: Boolean + // Whether or not we are a selected option + // disabled: Boolean + // Whether or not this specific option is disabled + this.value = value; + this.label = label; + this.selected = selected; + this.disabled = disabled; +} +=====*/ + +return declare("dijit.form._FormSelectWidget", _FormValueWidget, { + // summary: + // Extends _FormValueWidget in order to provide "select-specific" + // values - i.e., those values that are unique to <select> elements. + // This also provides the mechanism for reading the elements from + // a store, if desired. + + // multiple: [const] Boolean + // Whether or not we are multi-valued + multiple: false, + + // options: dijit.form.__SelectOption[] + // The set of options for our select item. Roughly corresponds to + // the html <option> tag. + options: null, + + // store: dojo.data.api.Identity + // A store which, at the very least implements dojo.data.api.Identity + // to use for getting our list of options - rather than reading them + // from the <option> html tags. + store: null, + + // query: object + // A query to use when fetching items from our store + query: null, + + // queryOptions: object + // Query options to use when fetching from the store + queryOptions: null, + + // onFetch: Function + // A callback to do with an onFetch - but before any items are actually + // iterated over (i.e. to filter even further what you want to add) + onFetch: null, + + // sortByLabel: Boolean + // Flag to sort the options returned from a store by the label of + // the store. + sortByLabel: true, + + + // loadChildrenOnOpen: Boolean + // By default loadChildren is called when the items are fetched from the + // store. This property allows delaying loadChildren (and the creation + // of the options/menuitems) until the user clicks the button to open the + // dropdown. + loadChildrenOnOpen: false, + + getOptions: function(/*anything*/ valueOrIdx){ + // summary: + // Returns a given option (or options). + // valueOrIdx: + // If passed in as a string, that string is used to look up the option + // in the array of options - based on the value property. + // (See dijit.form.__SelectOption). + // + // If passed in a number, then the option with the given index (0-based) + // within this select will be returned. + // + // If passed in a dijit.form.__SelectOption, the same option will be + // returned if and only if it exists within this select. + // + // If passed an array, then an array will be returned with each element + // in the array being looked up. + // + // If not passed a value, then all options will be returned + // + // returns: + // The option corresponding with the given value or index. null + // is returned if any of the following are true: + // - A string value is passed in which doesn't exist + // - An index is passed in which is outside the bounds of the array of options + // - A dijit.form.__SelectOption is passed in which is not a part of the select + + // NOTE: the compare for passing in a dijit.form.__SelectOption checks + // if the value property matches - NOT if the exact option exists + // NOTE: if passing in an array, null elements will be placed in the returned + // array when a value is not found. + var lookupValue = valueOrIdx, opts = this.options || [], l = opts.length; + + if(lookupValue === undefined){ + return opts; // dijit.form.__SelectOption[] + } + if(lang.isArray(lookupValue)){ + return array.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__SelectOption[] + } + if(lang.isObject(valueOrIdx)){ + // We were passed an option - so see if it's in our array (directly), + // and if it's not, try and find it by value. + if(!array.some(this.options, function(o, idx){ + if(o === lookupValue || + (o.value && o.value === lookupValue.value)){ + lookupValue = idx; + return true; + } + return false; + })){ + lookupValue = -1; + } + } + if(typeof lookupValue == "string"){ + for(var i=0; i<l; i++){ + if(opts[i].value === lookupValue){ + lookupValue = i; + break; + } + } + } + if(typeof lookupValue == "number" && lookupValue >= 0 && lookupValue < l){ + return this.options[lookupValue]; // dijit.form.__SelectOption + } + return null; // null + }, + + addOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ option){ + // summary: + // Adds an option or options to the end of the select. If value + // of the option is empty or missing, a separator is created instead. + // Passing in an array of options will yield slightly better performance + // since the children are only loaded once. + if(!lang.isArray(option)){ option = [option]; } + array.forEach(option, function(i){ + if(i && lang.isObject(i)){ + this.options.push(i); + } + }, this); + this._loadChildren(); + }, + + removeOption: function(/*String|dijit.form.__SelectOption|Number|Array*/ valueOrIdx){ + // summary: + // Removes the given option or options. You can remove by string + // (in which case the value is removed), number (in which case the + // index in the options array is removed), or select option (in + // which case, the select option with a matching value is removed). + // You can also pass in an array of those values for a slightly + // better performance since the children are only loaded once. + if(!lang.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; } + var oldOpts = this.getOptions(valueOrIdx); + array.forEach(oldOpts, function(i){ + // We can get null back in our array - if our option was not found. In + // that case, we don't want to blow up... + if(i){ + this.options = array.filter(this.options, function(node){ + return (node.value !== i.value || node.label !== i.label); + }); + this._removeOptionItem(i); + } + }, this); + this._loadChildren(); + }, + + updateOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ newOption){ + // summary: + // Updates the values of the given option. The option to update + // is matched based on the value of the entered option. Passing + // in an array of new options will yield better performance since + // the children will only be loaded once. + if(!lang.isArray(newOption)){ newOption = [newOption]; } + array.forEach(newOption, function(i){ + var oldOpt = this.getOptions(i), k; + if(oldOpt){ + for(k in i){ oldOpt[k] = i[k]; } + } + }, this); + this._loadChildren(); + }, + + setStore: function(/*dojo.data.api.Identity*/ store, + /*anything?*/ selectedValue, + /*Object?*/ fetchArgs){ + // summary: + // Sets the store you would like to use with this select widget. + // The selected value is the value of the new store to set. This + // function returns the original store, in case you want to reuse + // it or something. + // store: dojo.data.api.Identity + // The store you would like to use - it MUST implement dojo.data.api.Identity, + // and MAY implement dojo.data.api.Notification. + // selectedValue: anything? + // The value that this widget should set itself to *after* the store + // has been loaded + // fetchArgs: Object? + // The arguments that will be passed to the store's fetch() function + var oStore = this.store; + fetchArgs = fetchArgs || {}; + if(oStore !== store){ + // Our store has changed, so update our notifications + var h; + while(h = this._notifyConnections.pop()){ h.remove(); } + + if(store && store.getFeatures()["dojo.data.api.Notification"]){ + this._notifyConnections = [ + aspect.after(store, "onNew", lang.hitch(this, "_onNewItem"), true), + aspect.after(store, "onDelete", lang.hitch(this, "_onDeleteItem"), true), + aspect.after(store, "onSet", lang.hitch(this, "_onSetItem"), true) + ]; + } + this._set("store", store); + } + + // Turn off change notifications while we make all these changes + this._onChangeActive = false; + + // Remove existing options (if there are any) + if(this.options && this.options.length){ + this.removeOption(this.options); + } + + // Add our new options + if(store){ + this._loadingStore = true; + store.fetch(lang.delegate(fetchArgs, { + onComplete: function(items, opts){ + if(this.sortByLabel && !fetchArgs.sort && items.length){ + items.sort(sorter.createSortFunction([{ + attribute: store.getLabelAttributes(items[0])[0] + }], store)); + } + + if(fetchArgs.onFetch){ + items = fetchArgs.onFetch.call(this, items, opts); + } + // TODO: Add these guys as a batch, instead of separately + array.forEach(items, function(i){ + this._addOptionForItem(i); + }, this); + + // Set our value (which might be undefined), and then tweak + // it to send a change event with the real value + this._loadingStore = false; + this.set("value", "_pendingValue" in this ? this._pendingValue : selectedValue); + delete this._pendingValue; + + if(!this.loadChildrenOnOpen){ + this._loadChildren(); + }else{ + this._pseudoLoadChildren(items); + } + this._fetchedWith = opts; + this._lastValueReported = this.multiple ? [] : null; + this._onChangeActive = true; + this.onSetStore(); + this._handleOnChange(this.value); + }, + scope: this + })); + }else{ + delete this._fetchedWith; + } + return oStore; // dojo.data.api.Identity + }, + + // TODO: implement set() and watch() for store and query, although not sure how to handle + // setting them individually rather than together (as in setStore() above) + + _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // set the value of the widget. + // If a string is passed, then we set our value from looking it up. + if(this._loadingStore){ + // Our store is loading - so save our value, and we'll set it when + // we're done + this._pendingValue = newValue; + return; + } + var opts = this.getOptions() || []; + if(!lang.isArray(newValue)){ + newValue = [newValue]; + } + array.forEach(newValue, function(i, idx){ + if(!lang.isObject(i)){ + i = i + ""; + } + if(typeof i === "string"){ + newValue[idx] = array.filter(opts, function(node){ + return node.value === i; + })[0] || {value: "", label: ""}; + } + }, this); + + // Make sure some sane default is set + newValue = array.filter(newValue, function(i){ return i && i.value; }); + if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){ + newValue[0] = opts[0]; + } + array.forEach(opts, function(i){ + i.selected = array.some(newValue, function(v){ return v.value === i.value; }); + }); + var val = array.map(newValue, function(i){ return i.value; }), + disp = array.map(newValue, function(i){ return i.label; }); + + this._set("value", this.multiple ? val : val[0]); + this._setDisplay(this.multiple ? disp : disp[0]); + this._updateSelection(); + this._handleOnChange(this.value, priorityChange); + }, + + _getDisplayedValueAttr: function(){ + // summary: + // returns the displayed value of the widget + var val = this.get("value"); + if(!lang.isArray(val)){ + val = [val]; + } + var ret = array.map(this.getOptions(val), function(v){ + if(v && "label" in v){ + return v.label; + }else if(v){ + return v.value; + } + return null; + }, this); + return this.multiple ? ret : ret[0]; + }, + + _loadChildren: function(){ + // summary: + // Loads the children represented by this widget's options. + // reset the menu to make it populatable on the next click + if(this._loadingStore){ return; } + array.forEach(this._getChildren(), function(child){ + child.destroyRecursive(); + }); + // Add each menu item + array.forEach(this.options, this._addOptionItem, this); + + // Update states + this._updateSelection(); + }, + + _updateSelection: function(){ + // summary: + // Sets the "selected" class on the item for styling purposes + this._set("value", this._getValueFromOpts()); + var val = this.value; + if(!lang.isArray(val)){ + val = [val]; + } + if(val && val[0]){ + array.forEach(this._getChildren(), function(child){ + var isSelected = array.some(val, function(v){ + return child.option && (v === child.option.value); + }); + domClass.toggle(child.domNode, this.baseClass + "SelectedOption", isSelected); + child.domNode.setAttribute("aria-selected", isSelected); + }, this); + } + }, + + _getValueFromOpts: function(){ + // summary: + // Returns the value of the widget by reading the options for + // the selected flag + var opts = this.getOptions() || []; + if(!this.multiple && opts.length){ + // Mirror what a select does - choose the first one + var opt = array.filter(opts, function(i){ + return i.selected; + })[0]; + if(opt && opt.value){ + return opt.value + }else{ + opts[0].selected = true; + return opts[0].value; + } + }else if(this.multiple){ + // Set value to be the sum of all selected + return array.map(array.filter(opts, function(i){ + return i.selected; + }), function(i){ + return i.value; + }) || []; + } + return ""; + }, + + // Internal functions to call when we have store notifications come in + _onNewItem: function(/*item*/ item, /*Object?*/ parentInfo){ + if(!parentInfo || !parentInfo.parent){ + // Only add it if we are top-level + this._addOptionForItem(item); + } + }, + _onDeleteItem: function(/*item*/ item){ + var store = this.store; + this.removeOption(store.getIdentity(item)); + }, + _onSetItem: function(/*item*/ item){ + this.updateOption(this._getOptionObjForItem(item)); + }, + + _getOptionObjForItem: function(item){ + // summary: + // Returns an option object based off the given item. The "value" + // of the option item will be the identity of the item, the "label" + // of the option will be the label of the item. If the item contains + // children, the children value of the item will be set + var store = this.store, label = store.getLabel(item), + value = (label ? store.getIdentity(item) : null); + return {value: value, label: label, item:item}; // dijit.form.__SelectOption + }, + + _addOptionForItem: function(/*item*/ item){ + // summary: + // Creates (and adds) the option for the given item + var store = this.store; + if(!store.isItemLoaded(item)){ + // We are not loaded - so let's load it and add later + store.loadItem({item: item, onItem: function(i){ + this._addOptionForItem(i); + }, + scope: this}); + return; + } + var newOpt = this._getOptionObjForItem(item); + this.addOption(newOpt); + }, + + constructor: function(/*Object*/ keywordArgs){ + // summary: + // Saves off our value, if we have an initial one set so we + // can use it if we have a store as well (see startup()) + this._oValue = (keywordArgs || {}).value || null; + this._notifyConnections = []; + }, + + buildRendering: function(){ + this.inherited(arguments); + dom.setSelectable(this.focusNode, false); + }, + + _fillContent: function(){ + // summary: + // Loads our options and sets up our dropdown correctly. We + // don't want any content, so we don't call any inherit chain + // function. + var opts = this.options; + if(!opts){ + opts = this.options = this.srcNodeRef ? query("> *", + this.srcNodeRef).map(function(node){ + if(node.getAttribute("type") === "separator"){ + return { value: "", label: "", selected: false, disabled: false }; + } + return { + value: (node.getAttribute("data-" + kernel._scopeName + "-value") || node.getAttribute("value")), + label: String(node.innerHTML), + // FIXME: disabled and selected are not valid on complex markup children (which is why we're + // looking for data-dojo-value above. perhaps we should data-dojo-props="" this whole thing?) + // decide before 1.6 + selected: node.getAttribute("selected") || false, + disabled: node.getAttribute("disabled") || false + }; + }, this) : []; + } + if(!this.value){ + this._set("value", this._getValueFromOpts()); + }else if(this.multiple && typeof this.value == "string"){ + this._set("value", this.value.split(",")); + } + }, + + postCreate: function(){ + // summary: + // sets up our event handling that we need for functioning + // as a select + this.inherited(arguments); + + // Make our event connections for updating state + this.connect(this, "onChange", "_updateSelection"); + this.connect(this, "startup", "_loadChildren"); + + this._setValueAttr(this.value, null); + }, + + startup: function(){ + // summary: + // Connects in our store, if we have one defined + this.inherited(arguments); + var store = this.store, fetchArgs = {}; + array.forEach(["query", "queryOptions", "onFetch"], function(i){ + if(this[i]){ + fetchArgs[i] = this[i]; + } + delete this[i]; + }, this); + if(store && store.getFeatures()["dojo.data.api.Identity"]){ + // Temporarily set our store to null so that it will get set + // and connected appropriately + this.store = null; + this.setStore(store, this._oValue, fetchArgs); + } + }, + + destroy: function(){ + // summary: + // Clean up our connections + var h; + while(h = this._notifyConnections.pop()){ h.remove(); } + this.inherited(arguments); + }, + + _addOptionItem: function(/*dijit.form.__SelectOption*/ /*===== option =====*/){ + // summary: + // User-overridable function which, for the given option, adds an + // item to the select. If the option doesn't have a value, then a + // separator is added in that place. Make sure to store the option + // in the created option widget. + }, + + _removeOptionItem: function(/*dijit.form.__SelectOption*/ /*===== option =====*/){ + // summary: + // User-overridable function which, for the given option, removes + // its item from the select. + }, + + _setDisplay: function(/*String or String[]*/ /*===== newDisplay =====*/){ + // summary: + // Overridable function which will set the display for the + // widget. newDisplay is either a string (in the case of + // single selects) or array of strings (in the case of multi-selects) + }, + + _getChildren: function(){ + // summary: + // Overridable function to return the children that this widget contains. + return []; + }, + + _getSelectedOptionsAttr: function(){ + // summary: + // hooks into this.attr to provide a mechanism for getting the + // option items for the current value of the widget. + return this.getOptions(this.get("value")); + }, + + _pseudoLoadChildren: function(/*item[]*/ /*===== items =====*/){ + // summary: + // a function that will "fake" loading children, if needed, and + // if we have set to not load children until the widget opens. + // items: + // An array of items that will be loaded, when needed + }, + + onSetStore: function(){ + // summary: + // a function that can be connected to in order to receive a + // notification that the store has finished loading and all options + // from that store are available + } +}); + +}); diff --git a/lib/dijit/form/_FormValueMixin.js b/lib/dijit/form/_FormValueMixin.js new file mode 100644 index 000000000..46bb6c52d --- /dev/null +++ b/lib/dijit/form/_FormValueMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_FormValueMixin",["dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/sniff","./_FormWidgetMixin"],function(_1,_2,_3,_4,_5){return _1("dijit.form._FormValueMixin",_5,{readOnly:false,_setReadOnlyAttr:function(_6){_2.set(this.focusNode,"readOnly",_6);this.focusNode.setAttribute("aria-readonly",_6);this._set("readOnly",_6);},postCreate:function(){this.inherited(arguments);if(_4("ie")){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_7,_8){this._handleOnChange(_7,_8);},_handleOnChange:function(_9,_a){this._set("value",_9);this.inherited(arguments);},undo:function(){this._setValueAttr(this._lastValueReported,false);},reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},_onKeyDown:function(e){if(e.keyCode==_3.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(_4("ie")<9||(_4("ie")&&_4("quirks"))){e.preventDefault();te=document.createEventObject();te.keyCode=_3.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}}});});
\ No newline at end of file diff --git a/lib/dijit/form/_FormValueMixin.js.uncompressed.js b/lib/dijit/form/_FormValueMixin.js.uncompressed.js new file mode 100644 index 000000000..73a01b3fe --- /dev/null +++ b/lib/dijit/form/_FormValueMixin.js.uncompressed.js @@ -0,0 +1,95 @@ +define("dijit/form/_FormValueMixin", [ + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/keys", // keys.ESCAPE + "dojo/_base/sniff", // has("ie"), has("quirks") + "./_FormWidgetMixin" +], function(declare, domAttr, keys, has, _FormWidgetMixin){ + +/*===== + var _FormWidgetMixin = dijit.form._FormWidgetMixin; +=====*/ + + // module: + // dijit/form/_FormValueMixin + // summary: + // Mixin for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. + + return declare("dijit.form._FormValueMixin", _FormWidgetMixin, { + // summary: + // Mixin for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. + // description: + // Each _FormValueMixin represents a single input value, and has a (possibly hidden) <input> element, + // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?) + // works as expected. + + // readOnly: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "readOnly". + // Similar to disabled except readOnly form values are submitted. + readOnly: false, + + _setReadOnlyAttr: function(/*Boolean*/ value){ + domAttr.set(this.focusNode, 'readOnly', value); + this.focusNode.setAttribute("aria-readonly", value); + this._set("readOnly", value); + }, + + postCreate: function(){ + this.inherited(arguments); + + if(has("ie")){ // IE won't stop the event with keypress + this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown); + } + // Update our reset value if it hasn't yet been set (because this.set() + // is only called when there *is* a value) + if(this._resetValue === undefined){ + this._lastValueReported = this._resetValue = this.value; + } + }, + + _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // Hook so set('value', value) works. + // description: + // Sets the value of the widget. + // If the value has changed, then fire onChange event, unless priorityChange + // is specified as null (or false?) + this._handleOnChange(newValue, priorityChange); + }, + + _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // Called when the value of the widget has changed. Saves the new value in this.value, + // and calls onChange() if appropriate. See _FormWidget._handleOnChange() for details. + this._set("value", newValue); + this.inherited(arguments); + }, + + undo: function(){ + // summary: + // Restore the value to the last value passed to onChange + this._setValueAttr(this._lastValueReported, false); + }, + + reset: function(){ + // summary: + // Reset the widget's value to what it was at initialization time + this._hasBeenBlurred = false; + this._setValueAttr(this._resetValue, true); + }, + + _onKeyDown: function(e){ + if(e.keyCode == keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){ + var te; + if(has("ie") < 9 || (has("ie") && has("quirks"))){ + e.preventDefault(); // default behavior needs to be stopped here since keypress is too late + te = document.createEventObject(); + te.keyCode = keys.ESCAPE; + te.shiftKey = e.shiftKey; + e.srcElement.fireEvent('onkeypress', te); + } + } + } + }); +}); diff --git a/lib/dijit/form/_FormValueWidget.js b/lib/dijit/form/_FormValueWidget.js new file mode 100644 index 000000000..276378577 --- /dev/null +++ b/lib/dijit/form/_FormValueWidget.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_FormValueWidget",["dojo/_base/declare","dojo/_base/sniff","./_FormWidget","./_FormValueMixin"],function(_1,_2,_3,_4){return _1("dijit.form._FormValueWidget",[_3,_4],{_layoutHackIE7:function(){if(_2("ie")==7){var _5=this.domNode;var _6=_5.parentNode;var _7=_5.firstChild||_5;var _8=_7.style.filter;var _9=this;while(_6&&_6.clientHeight==0){(function ping(){var _a=_9.connect(_6,"onscroll",function(){_9.disconnect(_a);_7.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_7.style.filter=_8;},0);});})();_6=_6.parentNode;}}}});});
\ No newline at end of file diff --git a/lib/dijit/form/_FormValueWidget.js.uncompressed.js b/lib/dijit/form/_FormValueWidget.js.uncompressed.js new file mode 100644 index 000000000..01b5bbd7c --- /dev/null +++ b/lib/dijit/form/_FormValueWidget.js.uncompressed.js @@ -0,0 +1,58 @@ +define("dijit/form/_FormValueWidget", [ + "dojo/_base/declare", // declare + "dojo/_base/sniff", // has("ie") + "./_FormWidget", + "./_FormValueMixin" +], function(declare, has, _FormWidget, _FormValueMixin){ + +/*===== +var _FormWidget = dijit.form._FormWidget; +var _FormValueMixin = dijit.form._FormValueMixin; +=====*/ + +// module: +// dijit/form/_FormValueWidget +// summary: +// FormValueWidget + + +return declare("dijit.form._FormValueWidget", [_FormWidget, _FormValueMixin], +{ + // summary: + // Base class for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. + // description: + // Each _FormValueWidget represents a single input value, and has a (possibly hidden) <input> element, + // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?) + // works as expected. + + // Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared + // directly in the template as read by the parser in order to function. IE is known to specifically + // require the 'name' attribute at element creation time. See #8484, #8660. + + _layoutHackIE7: function(){ + // summary: + // Work around table sizing bugs on IE7 by forcing redraw + + if(has("ie") == 7){ // fix IE7 layout bug when the widget is scrolled out of sight + var domNode = this.domNode; + var parent = domNode.parentNode; + var pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter + var origFilter = pingNode.style.filter; // save custom filter, most likely nothing + var _this = this; + while(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet + (function ping(){ + var disconnectHandle = _this.connect(parent, "onscroll", + function(){ + _this.disconnect(disconnectHandle); // only call once + pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique + setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any + } + ); + })(); + parent = parent.parentNode; + } + } + } +}); + +}); diff --git a/lib/dijit/form/_FormWidget.js b/lib/dijit/form/_FormWidget.js index ebd1cfb18..f7867b0c5 100644 --- a/lib/dijit/form/_FormWidget.js +++ b/lib/dijit/form/_FormWidget.js @@ -1,377 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form._FormWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._FormWidget"] = true; -dojo.provide("dijit.form._FormWidget"); -dojo.require("dojo.window"); -dojo.require("dijit._Widget"); -dojo.require("dijit._Templated"); -dojo.require("dijit._CssStateMixin"); - - -dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._CssStateMixin], - { - // summary: - // Base class for widgets corresponding to native HTML elements such as <checkbox> or <button>, - // which can be children of a <form> node or a `dijit.form.Form` widget. - // - // description: - // Represents a single HTML element. - // All these widgets should have these attributes just like native HTML input elements. - // You can set them during widget construction or afterwards, via `dijit._Widget.attr`. - // - // They also share some common methods. - - // name: [const] String - // Name used when submitting form; same as "name" attribute or plain HTML elements - name: "", - - // alt: String - // Corresponds to the native HTML <input> element's attribute. - alt: "", - - // value: String - // Corresponds to the native HTML <input> element's attribute. - value: "", - - // type: String - // Corresponds to the native HTML <input> element's attribute. - type: "text", - - // tabIndex: Integer - // Order fields are traversed when user hits the tab key - tabIndex: "0", - - // disabled: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "disabled='disabled'", or just "disabled". - disabled: false, - - // intermediateChanges: Boolean - // Fires onChange for each value change or only on demand - intermediateChanges: false, - - // scrollOnFocus: Boolean - // On focus, should this widget scroll into view? - scrollOnFocus: true, - - // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are. - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - value: "focusNode", - id: "focusNode", - tabIndex: "focusNode", - alt: "focusNode", - title: "focusNode" - }), - - postMixInProperties: function(){ - // Setup name=foo string to be referenced from the template (but only if a name has been specified) - // Unfortunately we can't use attributeMap to set the name due to IE limitations, see #8660 - // Regarding escaping, see heading "Attribute values" in - // http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2 - this.nameAttrSetting = this.name ? ('name="' + this.name.replace(/'/g, """) + '"') : ''; - this.inherited(arguments); - }, - - postCreate: function(){ - this.inherited(arguments); - this.connect(this.domNode, "onmousedown", "_onMouseDown"); - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - this._set("disabled", value); - dojo.attr(this.focusNode, 'disabled', value); - if(this.valueNode){ - dojo.attr(this.valueNode, 'disabled', value); - } - dijit.setWaiState(this.focusNode, "disabled", value); - - if(value){ - // reset these, because after the domNode is disabled, we can no longer receive - // mouse related events, see #4200 - this._set("hovering", false); - this._set("active", false); - - // clear tab stop(s) on this widget's focusable node(s) (ComboBox has two focusable nodes) - var attachPointNames = "tabIndex" in this.attributeMap ? this.attributeMap.tabIndex : "focusNode"; - dojo.forEach(dojo.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){ - var node = this[attachPointName]; - // complex code because tabIndex=-1 on a <div> doesn't work on FF - if(dojo.isWebKit || dijit.hasDefaultTabStop(node)){ // see #11064 about webkit bug - node.setAttribute('tabIndex', "-1"); - }else{ - node.removeAttribute('tabIndex'); - } - }, this); - }else{ - if(this.tabIndex != ""){ - this.focusNode.setAttribute('tabIndex', this.tabIndex); - } - } - }, - - setDisabled: function(/*Boolean*/ disabled){ - // summary: - // Deprecated. Use set('disabled', ...) instead. - dojo.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0"); - this.set('disabled', disabled); - }, - - _onFocus: function(e){ - if(this.scrollOnFocus){ - dojo.window.scrollIntoView(this.domNode); - } - this.inherited(arguments); - }, - - isFocusable: function(){ - // summary: - // Tells if this widget is focusable or not. Used internally by dijit. - // tags: - // protected - return !this.disabled && this.focusNode && (dojo.style(this.domNode, "display") != "none"); - }, - - focus: function(){ - // summary: - // Put focus on this widget - if(!this.disabled){ - dijit.focus(this.focusNode); - } - }, - - compare: function(/*anything*/ val1, /*anything*/ val2){ - // summary: - // Compare 2 values (as returned by get('value') for this widget). - // tags: - // protected - if(typeof val1 == "number" && typeof val2 == "number"){ - return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; - }else if(val1 > val2){ - return 1; - }else if(val1 < val2){ - return -1; - }else{ - return 0; - } - }, - - onChange: function(newValue){ - // summary: - // Callback when this widget's value is changed. - // tags: - // callback - }, - - // _onChangeActive: [private] Boolean - // Indicates that changes to the value should call onChange() callback. - // This is false during widget initialization, to avoid calling onChange() - // when the initial value is set. - _onChangeActive: false, - - _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // Called when the value of the widget is set. Calls onChange() if appropriate - // newValue: - // the new value - // priorityChange: - // For a slider, for example, dragging the slider is priorityChange==false, - // but on mouse up, it's priorityChange==true. If intermediateChanges==false, - // onChange is only called form priorityChange=true events. - // tags: - // private - if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){ - // this block executes not for a change, but during initialization, - // and is used to store away the original value (or for ToggleButton, the original checked state) - this._resetValue = this._lastValueReported = newValue; - } - this._pendingOnChange = this._pendingOnChange - || (typeof newValue != typeof this._lastValueReported) - || (this.compare(newValue, this._lastValueReported) != 0); - if((this.intermediateChanges || priorityChange || priorityChange === undefined) && this._pendingOnChange){ - this._lastValueReported = newValue; - this._pendingOnChange = false; - if(this._onChangeActive){ - if(this._onChangeHandle){ - clearTimeout(this._onChangeHandle); - } - // setTimout allows hidden value processing to run and - // also the onChange handler can safely adjust focus, etc - this._onChangeHandle = setTimeout(dojo.hitch(this, - function(){ - this._onChangeHandle = null; - this.onChange(newValue); - }), 0); // try to collapse multiple onChange's fired faster than can be processed - } - } - }, - - create: function(){ - // Overrides _Widget.create() - this.inherited(arguments); - this._onChangeActive = true; - }, - - destroy: function(){ - if(this._onChangeHandle){ // destroy called before last onChange has fired - clearTimeout(this._onChangeHandle); - this.onChange(this._lastValueReported); - } - this.inherited(arguments); - }, - - setValue: function(/*String*/ value){ - // summary: - // Deprecated. Use set('value', ...) instead. - dojo.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use set('value',"+value+") instead.", "", "2.0"); - this.set('value', value); - }, - - getValue: function(){ - // summary: - // Deprecated. Use get('value') instead. - dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get('value'); - }, - - _onMouseDown: function(e){ - // If user clicks on the button, even if the mouse is released outside of it, - // this button should get focus (to mimics native browser buttons). - // This is also needed on chrome because otherwise buttons won't get focus at all, - // which leads to bizarre focus restore on Dialog close etc. - if(!e.ctrlKey && dojo.mouseButtons.isLeft(e) && this.isFocusable()){ // !e.ctrlKey to ignore right-click on mac - // Set a global event to handle mouseup, so it fires properly - // even if the cursor leaves this.domNode before the mouse up event. - var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){ - if (this.isFocusable()) { - this.focus(); - } - this.disconnect(mouseUpConnector); - }); - } - } -}); - -dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget, -{ - // summary: - // Base class for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. - // description: - // Each _FormValueWidget represents a single input value, and has a (possibly hidden) <input> element, - // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?) - // works as expected. - - // Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared - // directly in the template as read by the parser in order to function. IE is known to specifically - // require the 'name' attribute at element creation time. See #8484, #8660. - // TODO: unclear what that {value: ""} is for; FormWidget.attributeMap copies value to focusNode, - // so maybe {value: ""} is so the value *doesn't* get copied to focusNode? - // Seems like we really want value removed from attributeMap altogether - // (although there's no easy way to do that now) - - // readOnly: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "readOnly". - // Similar to disabled except readOnly form values are submitted. - readOnly: false, - - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - value: "", - readOnly: "focusNode" - }), - - _setReadOnlyAttr: function(/*Boolean*/ value){ - dojo.attr(this.focusNode, 'readOnly', value); - dijit.setWaiState(this.focusNode, "readonly", value); - this._set("readOnly", value); - }, - - postCreate: function(){ - this.inherited(arguments); - - if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ // IE won't stop the event with keypress - this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown); - } - // Update our reset value if it hasn't yet been set (because this.set() - // is only called when there *is* a value) - if(this._resetValue === undefined){ - this._lastValueReported = this._resetValue = this.value; - } - }, - - _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the widget. - // If the value has changed, then fire onChange event, unless priorityChange - // is specified as null (or false?) - this._handleOnChange(newValue, priorityChange); - }, - - _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // Called when the value of the widget has changed. Saves the new value in this.value, - // and calls onChange() if appropriate. See _FormWidget._handleOnChange() for details. - this._set("value", newValue); - this.inherited(arguments); - }, - - undo: function(){ - // summary: - // Restore the value to the last value passed to onChange - this._setValueAttr(this._lastValueReported, false); - }, - - reset: function(){ - // summary: - // Reset the widget's value to what it was at initialization time - this._hasBeenBlurred = false; - this._setValueAttr(this._resetValue, true); - }, - - _onKeyDown: function(e){ - if(e.keyCode == dojo.keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){ - var te; - if(dojo.isIE){ - e.preventDefault(); // default behavior needs to be stopped here since keypress is too late - te = document.createEventObject(); - te.keyCode = dojo.keys.ESCAPE; - te.shiftKey = e.shiftKey; - e.srcElement.fireEvent('onkeypress', te); - } - } - }, - - _layoutHackIE7: function(){ - // summary: - // Work around table sizing bugs on IE7 by forcing redraw - - if(dojo.isIE == 7){ // fix IE7 layout bug when the widget is scrolled out of sight - var domNode = this.domNode; - var parent = domNode.parentNode; - var pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter - var origFilter = pingNode.style.filter; // save custom filter, most likely nothing - var _this = this; - while(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet - (function ping(){ - var disconnectHandle = _this.connect(parent, "onscroll", - function(e){ - _this.disconnect(disconnectHandle); // only call once - pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique - setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any - } - ); - })(); - parent = parent.parentNode; - } - } - } -}); - -} +//>>built +define("dijit/form/_FormWidget",["dojo/_base/declare","dojo/_base/kernel","dojo/ready","../_Widget","../_CssStateMixin","../_TemplatedMixin","./_FormWidgetMixin"],function(_1,_2,_3,_4,_5,_6,_7){if(!_2.isAsync){_3(0,function(){var _8=["dijit/form/_FormValueWidget"];require(_8);});}return _1("dijit.form._FormWidget",[_4,_6,_5,_7],{setDisabled:function(_9){_2.deprecated("setDisabled("+_9+") is deprecated. Use set('disabled',"+_9+") instead.","","2.0");this.set("disabled",_9);},setValue:function(_a){_2.deprecated("dijit.form._FormWidget:setValue("+_a+") is deprecated. Use set('value',"+_a+") instead.","","2.0");this.set("value",_a);},getValue:function(){_2.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},postMixInProperties:function(){this.nameAttrSetting=this.name?("name=\""+this.name.replace(/'/g,""")+"\""):"";this.inherited(arguments);},_setTypeAttr:null});});
\ No newline at end of file diff --git a/lib/dijit/form/_FormWidget.js.uncompressed.js b/lib/dijit/form/_FormWidget.js.uncompressed.js new file mode 100644 index 000000000..f4a44fc79 --- /dev/null +++ b/lib/dijit/form/_FormWidget.js.uncompressed.js @@ -0,0 +1,79 @@ +define("dijit/form/_FormWidget", [ + "dojo/_base/declare", // declare + "dojo/_base/kernel", // kernel.deprecated + "dojo/ready", + "../_Widget", + "../_CssStateMixin", + "../_TemplatedMixin", + "./_FormWidgetMixin" +], function(declare, kernel, ready, _Widget, _CssStateMixin, _TemplatedMixin, _FormWidgetMixin){ + +/*===== +var _Widget = dijit._Widget; +var _TemplatedMixin = dijit._TemplatedMixin; +var _CssStateMixin = dijit._CssStateMixin; +var _FormWidgetMixin = dijit.form._FormWidgetMixin; +=====*/ + +// module: +// dijit/form/_FormWidget +// summary: +// FormWidget + + +// Back compat w/1.6, remove for 2.0 +if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/form/_FormValueWidget"]; + require(requires); // use indirection so modules not rolled into a build + }); +} + +return declare("dijit.form._FormWidget", [_Widget, _TemplatedMixin, _CssStateMixin, _FormWidgetMixin], { + // summary: + // Base class for widgets corresponding to native HTML elements such as <checkbox> or <button>, + // which can be children of a <form> node or a `dijit.form.Form` widget. + // + // description: + // Represents a single HTML element. + // All these widgets should have these attributes just like native HTML input elements. + // You can set them during widget construction or afterwards, via `dijit._Widget.attr`. + // + // They also share some common methods. + + setDisabled: function(/*Boolean*/ disabled){ + // summary: + // Deprecated. Use set('disabled', ...) instead. + kernel.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0"); + this.set('disabled', disabled); + }, + + setValue: function(/*String*/ value){ + // summary: + // Deprecated. Use set('value', ...) instead. + kernel.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use set('value',"+value+") instead.", "", "2.0"); + this.set('value', value); + }, + + getValue: function(){ + // summary: + // Deprecated. Use get('value') instead. + kernel.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0"); + return this.get('value'); + }, + + postMixInProperties: function(){ + // Setup name=foo string to be referenced from the template (but only if a name has been specified) + // Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8484, #8660. + // Regarding escaping, see heading "Attribute values" in + // http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2 + this.nameAttrSetting = this.name ? ('name="' + this.name.replace(/'/g, """) + '"') : ''; + this.inherited(arguments); + }, + + // Override automatic assigning type --> focusNode, it causes exception on IE. + // Instead, type must be specified as ${type} in the template, as part of the original DOM + _setTypeAttr: null +}); + +}); diff --git a/lib/dijit/form/_FormWidgetMixin.js b/lib/dijit/form/_FormWidgetMixin.js new file mode 100644 index 000000000..d84fe9a2a --- /dev/null +++ b/lib/dijit/form/_FormWidgetMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_FormWidgetMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-style","dojo/_base/lang","dojo/mouse","dojo/_base/sniff","dojo/_base/window","dojo/window","../a11y"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _2("dijit.form._FormWidgetMixin",null,{name:"",alt:"",value:"",type:"text",tabIndex:"0",_setTabIndexAttr:"focusNode",disabled:false,intermediateChanges:false,scrollOnFocus:true,_setIdAttr:"focusNode",_setDisabledAttr:function(_b){this._set("disabled",_b);_3.set(this.focusNode,"disabled",_b);if(this.valueNode){_3.set(this.valueNode,"disabled",_b);}this.focusNode.setAttribute("aria-disabled",_b?"true":"false");if(_b){this._set("hovering",false);this._set("active",false);var _c="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:("_setTabIndexAttr" in this)?this._setTabIndexAttr:"focusNode";_1.forEach(_5.isArray(_c)?_c:[_c],function(_d){var _e=this[_d];if(_7("webkit")||_a.hasDefaultTabStop(_e)){_e.setAttribute("tabIndex","-1");}else{_e.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.set("tabIndex",this.tabIndex);}}},_onFocus:function(by){if(by=="mouse"&&this.isFocusable()){var _f=this.connect(this.focusNode,"onfocus",function(){this.disconnect(_10);this.disconnect(_f);});var _10=this.connect(_8.body(),"onmouseup",function(){this.disconnect(_10);this.disconnect(_f);if(this.focused){this.focus();}});}if(this.scrollOnFocus){this.defer(function(){_9.scrollIntoView(this.domNode);});}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(_4.get(this.domNode,"display")!="none");},focus:function(){if(!this.disabled&&this.focusNode.focus){try{this.focusNode.focus();}catch(e){}}},compare:function(_11,_12){if(typeof _11=="number"&&typeof _12=="number"){return (isNaN(_11)&&isNaN(_12))?0:_11-_12;}else{if(_11>_12){return 1;}else{if(_11<_12){return -1;}else{return 0;}}}},onChange:function(){},_onChangeActive:false,_handleOnChange:function(_13,_14){if(this._lastValueReported==undefined&&(_14===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_13;}this._pendingOnChange=this._pendingOnChange||(typeof _13!=typeof this._lastValueReported)||(this.compare(_13,this._lastValueReported)!=0);if((this.intermediateChanges||_14||_14===undefined)&&this._pendingOnChange){this._lastValueReported=_13;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){this._onChangeHandle.remove();}this._onChangeHandle=this.defer(function(){this._onChangeHandle=null;this.onChange(_13);});}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){this._onChangeHandle.remove();this.onChange(this._lastValueReported);}this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js b/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js new file mode 100644 index 000000000..7900b6e28 --- /dev/null +++ b/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js @@ -0,0 +1,227 @@ +define("dijit/form/_FormWidgetMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/dom-style", // domStyle.get + "dojo/_base/lang", // lang.hitch lang.isArray + "dojo/mouse", // mouse.isLeft + "dojo/_base/sniff", // has("webkit") + "dojo/_base/window", // win.body + "dojo/window", // winUtils.scrollIntoView + "../a11y" // a11y.hasDefaultTabStop +], function(array, declare, domAttr, domStyle, lang, mouse, has, win, winUtils, a11y){ + +// module: +// dijit/form/_FormWidgetMixin +// summary: +// Mixin for widgets corresponding to native HTML elements such as <checkbox> or <button>, +// which can be children of a <form> node or a `dijit.form.Form` widget. + +return declare("dijit.form._FormWidgetMixin", null, { + // summary: + // Mixin for widgets corresponding to native HTML elements such as <checkbox> or <button>, + // which can be children of a <form> node or a `dijit.form.Form` widget. + // + // description: + // Represents a single HTML element. + // All these widgets should have these attributes just like native HTML input elements. + // You can set them during widget construction or afterwards, via `dijit._Widget.attr`. + // + // They also share some common methods. + + // name: [const] String + // Name used when submitting form; same as "name" attribute or plain HTML elements + name: "", + + // alt: String + // Corresponds to the native HTML <input> element's attribute. + alt: "", + + // value: String + // Corresponds to the native HTML <input> element's attribute. + value: "", + + // type: [const] String + // Corresponds to the native HTML <input> element's attribute. + type: "text", + + // tabIndex: Integer + // Order fields are traversed when user hits the tab key + tabIndex: "0", + _setTabIndexAttr: "focusNode", // force copy even when tabIndex default value, needed since Button is <span> + + // disabled: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "disabled='disabled'", or just "disabled". + disabled: false, + + // intermediateChanges: Boolean + // Fires onChange for each value change or only on demand + intermediateChanges: false, + + // scrollOnFocus: Boolean + // On focus, should this widget scroll into view? + scrollOnFocus: true, + + // Override _WidgetBase mapping id to this.domNode, needs to be on focusNode so <label> etc. + // works with screen reader + _setIdAttr: "focusNode", + + _setDisabledAttr: function(/*Boolean*/ value){ + this._set("disabled", value); + domAttr.set(this.focusNode, 'disabled', value); + if(this.valueNode){ + domAttr.set(this.valueNode, 'disabled', value); + } + this.focusNode.setAttribute("aria-disabled", value ? "true" : "false"); + + if(value){ + // reset these, because after the domNode is disabled, we can no longer receive + // mouse related events, see #4200 + this._set("hovering", false); + this._set("active", false); + + // clear tab stop(s) on this widget's focusable node(s) (ComboBox has two focusable nodes) + var attachPointNames = "tabIndex" in this.attributeMap ? this.attributeMap.tabIndex : + ("_setTabIndexAttr" in this) ? this._setTabIndexAttr : "focusNode"; + array.forEach(lang.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){ + var node = this[attachPointName]; + // complex code because tabIndex=-1 on a <div> doesn't work on FF + if(has("webkit") || a11y.hasDefaultTabStop(node)){ // see #11064 about webkit bug + node.setAttribute('tabIndex', "-1"); + }else{ + node.removeAttribute('tabIndex'); + } + }, this); + }else{ + if(this.tabIndex != ""){ + this.set('tabIndex', this.tabIndex); + } + } + }, + + _onFocus: function(/*String*/ by){ + // If user clicks on the widget, even if the mouse is released outside of it, + // this widget's focusNode should get focus (to mimic native browser hehavior). + // Browsers often need help to make sure the focus via mouse actually gets to the focusNode. + if(by == "mouse" && this.isFocusable()){ + // IE exhibits strange scrolling behavior when refocusing a node so only do it when !focused. + var focusConnector = this.connect(this.focusNode, "onfocus", function(){ + this.disconnect(mouseUpConnector); + this.disconnect(focusConnector); + }); + // Set a global event to handle mouseup, so it fires properly + // even if the cursor leaves this.domNode before the mouse up event. + var mouseUpConnector = this.connect(win.body(), "onmouseup", function(){ + this.disconnect(mouseUpConnector); + this.disconnect(focusConnector); + // if here, then the mousedown did not focus the focusNode as the default action + if(this.focused){ + this.focus(); + } + }); + } + if(this.scrollOnFocus){ + this.defer(function(){ winUtils.scrollIntoView(this.domNode); }); // without defer, the input caret position can change on mouse click + } + this.inherited(arguments); + }, + + isFocusable: function(){ + // summary: + // Tells if this widget is focusable or not. Used internally by dijit. + // tags: + // protected + return !this.disabled && this.focusNode && (domStyle.get(this.domNode, "display") != "none"); + }, + + focus: function(){ + // summary: + // Put focus on this widget + if(!this.disabled && this.focusNode.focus){ + try{ this.focusNode.focus(); }catch(e){}/*squelch errors from hidden nodes*/ + } + }, + + compare: function(/*anything*/ val1, /*anything*/ val2){ + // summary: + // Compare 2 values (as returned by get('value') for this widget). + // tags: + // protected + if(typeof val1 == "number" && typeof val2 == "number"){ + return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; + }else if(val1 > val2){ + return 1; + }else if(val1 < val2){ + return -1; + }else{ + return 0; + } + }, + + onChange: function(/*===== newValue =====*/){ + // summary: + // Callback when this widget's value is changed. + // tags: + // callback + }, + + // _onChangeActive: [private] Boolean + // Indicates that changes to the value should call onChange() callback. + // This is false during widget initialization, to avoid calling onChange() + // when the initial value is set. + _onChangeActive: false, + + _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + // summary: + // Called when the value of the widget is set. Calls onChange() if appropriate + // newValue: + // the new value + // priorityChange: + // For a slider, for example, dragging the slider is priorityChange==false, + // but on mouse up, it's priorityChange==true. If intermediateChanges==false, + // onChange is only called form priorityChange=true events. + // tags: + // private + if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){ + // this block executes not for a change, but during initialization, + // and is used to store away the original value (or for ToggleButton, the original checked state) + this._resetValue = this._lastValueReported = newValue; + } + this._pendingOnChange = this._pendingOnChange + || (typeof newValue != typeof this._lastValueReported) + || (this.compare(newValue, this._lastValueReported) != 0); + if((this.intermediateChanges || priorityChange || priorityChange === undefined) && this._pendingOnChange){ + this._lastValueReported = newValue; + this._pendingOnChange = false; + if(this._onChangeActive){ + if(this._onChangeHandle){ + this._onChangeHandle.remove(); + } + // defer allows hidden value processing to run and + // also the onChange handler can safely adjust focus, etc + this._onChangeHandle = this.defer( + function(){ + this._onChangeHandle = null; + this.onChange(newValue); + }); // try to collapse multiple onChange's fired faster than can be processed + } + } + }, + + create: function(){ + // Overrides _Widget.create() + this.inherited(arguments); + this._onChangeActive = true; + }, + + destroy: function(){ + if(this._onChangeHandle){ // destroy called before last onChange has fired + this._onChangeHandle.remove(); + this.onChange(this._lastValueReported); + } + this.inherited(arguments); + } +}); + +}); diff --git a/lib/dijit/form/_ListBase.js b/lib/dijit/form/_ListBase.js new file mode 100644 index 000000000..1e0dee136 --- /dev/null +++ b/lib/dijit/form/_ListBase.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ListBase",["dojo/_base/declare","dojo/window"],function(_1,_2){return _1("dijit.form._ListBase",null,{selected:null,_getTarget:function(_3){var _4=_3.target;var _5=this.containerNode;if(_4==_5||_4==this.domNode){return null;}while(_4&&_4.parentNode!=_5){_4=_4.parentNode;}return _4;},selectFirstNode:function(){var _6=this.containerNode.firstChild;while(_6&&_6.style.display=="none"){_6=_6.nextSibling;}this._setSelectedAttr(_6);},selectLastNode:function(){var _7=this.containerNode.lastChild;while(_7&&_7.style.display=="none"){_7=_7.previousSibling;}this._setSelectedAttr(_7);},selectNextNode:function(){var _8=this._getSelectedAttr();if(!_8){this.selectFirstNode();}else{var _9=_8.nextSibling;while(_9&&_9.style.display=="none"){_9=_9.nextSibling;}if(!_9){this.selectFirstNode();}else{this._setSelectedAttr(_9);}}},selectPreviousNode:function(){var _a=this._getSelectedAttr();if(!_a){this.selectLastNode();}else{var _b=_a.previousSibling;while(_b&&_b.style.display=="none"){_b=_b.previousSibling;}if(!_b){this.selectLastNode();}else{this._setSelectedAttr(_b);}}},_setSelectedAttr:function(_c){if(this.selected!=_c){var _d=this._getSelectedAttr();if(_d){this.onDeselect(_d);this.selected=null;}if(_c&&_c.parentNode==this.containerNode){this.selected=_c;_2.scrollIntoView(_c);this.onSelect(_c);}}else{if(_c){this.onSelect(_c);}}},_getSelectedAttr:function(){var v=this.selected;return (v&&v.parentNode==this.containerNode)?v:(this.selected=null);}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ListBase.js.uncompressed.js b/lib/dijit/form/_ListBase.js.uncompressed.js new file mode 100644 index 000000000..c993c9d34 --- /dev/null +++ b/lib/dijit/form/_ListBase.js.uncompressed.js @@ -0,0 +1,123 @@ +define("dijit/form/_ListBase", [ + "dojo/_base/declare", // declare + "dojo/window" // winUtils.scrollIntoView +], function(declare, winUtils){ + +// module: +// dijit/form/_ListBase +// summary: +// Focus-less menu to handle UI events consistently + +return declare( "dijit.form._ListBase", null, { + // summary: + // Focus-less menu to handle UI events consistently + // Abstract methods that must be defined externally: + // onSelect: item is active (mousedown but not yet mouseup, or keyboard arrow selected but no Enter) + // onDeselect: cancels onSelect + // tags: + // private + + // selected: DOMnode + // currently selected node + selected: null, + + _getTarget: function(/*Event*/ evt){ + var tgt = evt.target; + var container = this.containerNode; + if(tgt == container || tgt == this.domNode){ return null; } + while(tgt && tgt.parentNode != container){ + // recurse to the top + tgt = tgt.parentNode; + } + return tgt; + }, + + selectFirstNode: function(){ + // summary: + // Select the first displayed item in the list. + var first = this.containerNode.firstChild; + while(first && first.style.display == "none"){ + first = first.nextSibling; + } + this._setSelectedAttr(first); + }, + + selectLastNode: function(){ + // summary: + // Select the last displayed item in the list + var last = this.containerNode.lastChild; + while(last && last.style.display == "none"){ + last = last.previousSibling; + } + this._setSelectedAttr(last); + }, + + selectNextNode: function(){ + // summary: + // Select the item just below the current selection. + // If nothing selected, select first node. + var selectedNode = this._getSelectedAttr(); + if(!selectedNode){ + this.selectFirstNode(); + }else{ + var next = selectedNode.nextSibling; + while(next && next.style.display == "none"){ + next = next.nextSibling; + } + if(!next){ + this.selectFirstNode(); + }else{ + this._setSelectedAttr(next); + } + } + }, + + selectPreviousNode: function(){ + // summary: + // Select the item just above the current selection. + // If nothing selected, select last node (if + // you select Previous and try to keep scrolling up the list). + var selectedNode = this._getSelectedAttr(); + if(!selectedNode){ + this.selectLastNode(); + }else{ + var prev = selectedNode.previousSibling; + while(prev && prev.style.display == "none"){ + prev = prev.previousSibling; + } + if(!prev){ + this.selectLastNode(); + }else{ + this._setSelectedAttr(prev); + } + } + }, + + _setSelectedAttr: function(/*DomNode*/ node){ + // summary: + // Does the actual select. + if(this.selected != node){ + var selectedNode = this._getSelectedAttr(); + if(selectedNode){ + this.onDeselect(selectedNode); + this.selected = null; + } + if(node && node.parentNode == this.containerNode){ + this.selected = node; + winUtils.scrollIntoView(node); + this.onSelect(node); + } + }else if(node){ + this.onSelect(node); + } + }, + + _getSelectedAttr: function(){ + // summary: + // Returns the selected node. + var v = this.selected; + return (v && v.parentNode == this.containerNode) ? v : (this.selected = null); + } +}); + +}); diff --git a/lib/dijit/form/_ListMouseMixin.js b/lib/dijit/form/_ListMouseMixin.js new file mode 100644 index 000000000..8c731e33c --- /dev/null +++ b/lib/dijit/form/_ListMouseMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ListMouseMixin",["dojo/_base/declare","dojo/_base/event","dojo/touch","./_ListBase"],function(_1,_2,_3,_4){return _1("dijit.form._ListMouseMixin",_4,{postCreate:function(){this.inherited(arguments);this.connect(this.domNode,_3.press,"_onMouseDown");this.connect(this.domNode,_3.release,"_onMouseUp");this.connect(this.domNode,"onmouseover","_onMouseOver");this.connect(this.domNode,"onmouseout","_onMouseOut");},_onMouseDown:function(_5){_2.stop(_5);if(this._hoveredNode){this.onUnhover(this._hoveredNode);this._hoveredNode=null;}this._isDragging=true;this._setSelectedAttr(this._getTarget(_5));},_onMouseUp:function(_6){_2.stop(_6);this._isDragging=false;var _7=this._getSelectedAttr();var _8=this._getTarget(_6);var _9=this._hoveredNode;if(_7&&_8==_7){this.onClick(_7);}else{if(_9&&_8==_9){this._setSelectedAttr(_9);this.onClick(_9);}}},_onMouseOut:function(){if(this._hoveredNode){this.onUnhover(this._hoveredNode);if(this._getSelectedAttr()==this._hoveredNode){this.onSelect(this._hoveredNode);}this._hoveredNode=null;}if(this._isDragging){this._cancelDrag=(new Date()).getTime()+1000;}},_onMouseOver:function(_a){if(this._cancelDrag){var _b=(new Date()).getTime();if(_b>this._cancelDrag){this._isDragging=false;}this._cancelDrag=null;}var _c=this._getTarget(_a);if(!_c){return;}if(this._hoveredNode!=_c){if(this._hoveredNode){this._onMouseOut({target:this._hoveredNode});}if(_c&&_c.parentNode==this.containerNode){if(this._isDragging){this._setSelectedAttr(_c);}else{this._hoveredNode=_c;this.onHover(_c);}}}}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ListMouseMixin.js.uncompressed.js b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js new file mode 100644 index 000000000..733a2a63f --- /dev/null +++ b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js @@ -0,0 +1,96 @@ +define("dijit/form/_ListMouseMixin", [ + "dojo/_base/declare", // declare + "dojo/_base/event", // event.stop + "dojo/touch", + "./_ListBase" +], function(declare, event, touch, _ListBase){ + +/*===== +var _ListBase = dijit.form._ListBase; +=====*/ + +// module: +// dijit/form/_ListMouseMixin +// summary: +// a mixin to handle mouse or touch events for a focus-less menu + +return declare( "dijit.form._ListMouseMixin", _ListBase, { + // summary: + // a Mixin to handle mouse or touch events for a focus-less menu + // Abstract methods that must be defined externally: + // onClick: item was chosen (mousedown somewhere on the menu and mouseup somewhere on the menu) + // tags: + // private + + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, touch.press, "_onMouseDown"); + this.connect(this.domNode, touch.release, "_onMouseUp"); + this.connect(this.domNode, "onmouseover", "_onMouseOver"); + this.connect(this.domNode, "onmouseout", "_onMouseOut"); + }, + + _onMouseDown: function(/*Event*/ evt){ + event.stop(evt); + if(this._hoveredNode){ + this.onUnhover(this._hoveredNode); + this._hoveredNode = null; + } + this._isDragging = true; + this._setSelectedAttr(this._getTarget(evt)); + }, + + _onMouseUp: function(/*Event*/ evt){ + event.stop(evt); + this._isDragging = false; + var selectedNode = this._getSelectedAttr(); + var target = this._getTarget(evt); + var hoveredNode = this._hoveredNode; + if(selectedNode && target == selectedNode){ + this.onClick(selectedNode); + }else if(hoveredNode && target == hoveredNode){ // drag to select + this._setSelectedAttr(hoveredNode); + this.onClick(hoveredNode); + } + }, + + _onMouseOut: function(/*Event*/ /*===== evt ====*/){ + if(this._hoveredNode){ + this.onUnhover(this._hoveredNode); + if(this._getSelectedAttr() == this._hoveredNode){ + this.onSelect(this._hoveredNode); + } + this._hoveredNode = null; + } + if(this._isDragging){ + this._cancelDrag = (new Date()).getTime() + 1000; // cancel in 1 second if no _onMouseOver fires + } + }, + + _onMouseOver: function(/*Event*/ evt){ + if(this._cancelDrag){ + var time = (new Date()).getTime(); + if(time > this._cancelDrag){ + this._isDragging = false; + } + this._cancelDrag = null; + } + var node = this._getTarget(evt); + if(!node){ return; } + if(this._hoveredNode != node){ + if(this._hoveredNode){ + this._onMouseOut({ target: this._hoveredNode }); + } + if(node && node.parentNode == this.containerNode){ + if(this._isDragging){ + this._setSelectedAttr(node); + }else{ + this._hoveredNode = node; + this.onHover(node); + } + } + } + } +}); + +}); diff --git a/lib/dijit/form/_RadioButtonMixin.js b/lib/dijit/form/_RadioButtonMixin.js new file mode 100644 index 000000000..a444f3bd1 --- /dev/null +++ b/lib/dijit/form/_RadioButtonMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_RadioButtonMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/lang","dojo/query","dojo/_base/window","../registry"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _2("dijit.form._RadioButtonMixin",null,{type:"radio",_getRelatedWidgets:function(){var _9=[];_6("input[type=radio]",this.focusNode.form||_7.doc).forEach(_5.hitch(this,function(_a){if(_a.name==this.name&&_a.form==this.focusNode.form){var _b=_8.getEnclosingWidget(_a);if(_b){_9.push(_b);}}}));return _9;},_setCheckedAttr:function(_c){this.inherited(arguments);if(!this._created){return;}if(_c){_1.forEach(this._getRelatedWidgets(),_5.hitch(this,function(_d){if(_d!=this&&_d.checked){_d.set("checked",false);}}));}},_onClick:function(e){if(this.checked||this.disabled){_4.stop(e);return false;}if(this.readOnly){_4.stop(e);_1.forEach(this._getRelatedWidgets(),_5.hitch(this,function(_e){_3.set(this.focusNode||this.domNode,"checked",_e.checked);}));return false;}return this.inherited(arguments);}});});
\ No newline at end of file diff --git a/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js new file mode 100644 index 000000000..3ab34f226 --- /dev/null +++ b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js @@ -0,0 +1,70 @@ +define("dijit/form/_RadioButtonMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/_base/event", // event.stop + "dojo/_base/lang", // lang.hitch + "dojo/query", // query + "dojo/_base/window", // win.doc + "../registry" // registry.getEnclosingWidget +], function(array, declare, domAttr, event, lang, query, win, registry){ + + // module: + // dijit/form/_RadioButtonMixin + // summary: + // Mixin to provide widget functionality for an HTML radio button + + return declare("dijit.form._RadioButtonMixin", null, { + // summary: + // Mixin to provide widget functionality for an HTML radio button + + // type: [private] String + // type attribute on <input> node. + // Users should not change this value. + type: "radio", + + _getRelatedWidgets: function(){ + // Private function needed to help iterate over all radio buttons in a group. + var ary = []; + query("input[type=radio]", this.focusNode.form || win.doc).forEach( // can't use name= since query doesn't support [] in the name + lang.hitch(this, function(inputNode){ + if(inputNode.name == this.name && inputNode.form == this.focusNode.form){ + var widget = registry.getEnclosingWidget(inputNode); + if(widget){ + ary.push(widget); + } + } + }) + ); + return ary; + }, + + _setCheckedAttr: function(/*Boolean*/ value){ + // If I am being checked then have to deselect currently checked radio button + this.inherited(arguments); + if(!this._created){ return; } + if(value){ + array.forEach(this._getRelatedWidgets(), lang.hitch(this, function(widget){ + if(widget != this && widget.checked){ + widget.set('checked', false); + } + })); + } + }, + + _onClick: function(/*Event*/ e){ + if(this.checked || this.disabled){ // nothing to do + event.stop(e); + return false; + } + if(this.readOnly){ // ignored by some browsers so we have to resync the DOM elements with widget values + event.stop(e); + array.forEach(this._getRelatedWidgets(), lang.hitch(this, function(widget){ + domAttr.set(this.focusNode || this.domNode, 'checked', widget.checked); + })); + return false; + } + return this.inherited(arguments); + } + }); +}); diff --git a/lib/dijit/form/_Spinner.js b/lib/dijit/form/_Spinner.js index 37750ffb7..10c6e14a2 100644 --- a/lib/dijit/form/_Spinner.js +++ b/lib/dijit/form/_Spinner.js @@ -1,128 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.form._Spinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._Spinner"] = true; -dojo.provide("dijit.form._Spinner"); -dojo.require("dijit.form.ValidationTextBox"); - - -dojo.declare( - "dijit.form._Spinner", - dijit.form.RangeBoundTextBox, - { - // summary: - // Mixin for validation widgets with a spinner. - // description: - // This class basically (conceptually) extends `dijit.form.ValidationTextBox`. - // It modifies the template to have up/down arrows, and provides related handling code. - - // defaultTimeout: Number - // Number of milliseconds before a held arrow key or up/down button becomes typematic - defaultTimeout: 500, - - // minimumTimeout: Number - // minimum number of milliseconds that typematic event fires when held key or button is held - minimumTimeout: 10, - - // timeoutChangeRate: Number - // Fraction of time used to change the typematic timer between events. - // 1.0 means that each typematic event fires at defaultTimeout intervals. - // < 1.0 means that each typematic event fires at an increasing faster rate. - timeoutChangeRate: 0.90, - - // smallDelta: Number - // Adjust the value by this much when spinning using the arrow keys/buttons - smallDelta: 1, - - // largeDelta: Number - // Adjust the value by this much when spinning using the PgUp/Dn keys - largeDelta: 10, - - templateString: dojo.cache("dijit.form", "templates/Spinner.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▲\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▼\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"), - - baseClass: "dijitTextBox dijitSpinner", - - // Set classes like dijitUpArrowButtonHover or dijitDownArrowButtonActive depending on - // mouse action over specified node - cssStateNodes: { - "upArrowNode": "dijitUpArrowButton", - "downArrowNode": "dijitDownArrowButton" - }, - - adjust: function(/*Object*/ val, /*Number*/ delta){ - // summary: - // Overridable function used to adjust a primitive value(Number/Date/...) by the delta amount specified. - // The val is adjusted in a way that makes sense to the object type. - // tags: - // protected extension - return val; - }, - - _arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction, /*Number*/ increment){ - // summary: - // Handler for arrow button or arrow key being pressed - if(this.disabled || this.readOnly){ return; } - this._setValueAttr(this.adjust(this.get('value'), direction*increment), false); - dijit.selectInputText(this.textbox, this.textbox.value.length); - }, - - _arrowReleased: function(/*Node*/ node){ - // summary: - // Handler for arrow button or arrow key being released - this._wheelTimer = null; - if(this.disabled || this.readOnly){ return; } - }, - - _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){ - var inc=this.smallDelta; - if(node == this.textbox){ - var k=dojo.keys; - var key = evt.charOrCode; - inc = (key == k.PAGE_UP || key == k.PAGE_DOWN) ? this.largeDelta : this.smallDelta; - node = (key == k.UP_ARROW || key == k.PAGE_UP) ? this.upArrowNode : this.downArrowNode; - } - if(count == -1){ this._arrowReleased(node); } - else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1, inc); } - }, - - _wheelTimer: null, - _mouseWheeled: function(/*Event*/ evt){ - // summary: - // Mouse wheel listener where supported - - dojo.stopEvent(evt); - // FIXME: Safari bubbles - - // be nice to DOH and scroll as much as the event says to - var scrollAmount = evt.detail ? (evt.detail * -1) : (evt.wheelDelta / 120); - if(scrollAmount !== 0){ - var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )]; - - this._arrowPressed(node, scrollAmount, this.smallDelta); - - if(!this._wheelTimer){ - clearTimeout(this._wheelTimer); - } - this._wheelTimer = setTimeout(dojo.hitch(this,"_arrowReleased",node), 50); - } - - }, - - postCreate: function(){ - this.inherited(arguments); - - // extra listeners - this.connect(this.domNode, !dojo.isMozilla ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled"); - this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); - this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); - this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); - this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); - } -}); - -} +//>>built +require({cache:{"url:dijit/form/templates/Spinner.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdata-dojo-attach-point=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▲\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdata-dojo-attach-point=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▼\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' data-dojo-attach-point=\"textbox,focusNode\" type=\"${type}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"}});define("dijit/form/_Spinner",["dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dijit/typematic","./RangeBoundTextBox","dojo/text!./templates/Spinner.html","./_TextBoxMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form._Spinner",_7,{defaultTimeout:500,minimumTimeout:10,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:_8,baseClass:"dijitTextBox dijitSpinner",cssStateNodes:{"upArrowNode":"dijitUpArrowButton","downArrowNode":"dijitDownArrowButton"},adjust:function(_a){return _a;},_arrowPressed:function(_b,_c,_d){if(this.disabled||this.readOnly){return;}this._setValueAttr(this.adjust(this.get("value"),_c*_d),false);_9.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(){this._wheelTimer=null;},_typematicCallback:function(_e,_f,evt){var inc=this.smallDelta;if(_f==this.textbox){var key=evt.charOrCode;inc=(key==_3.PAGE_UP||key==_3.PAGE_DOWN)?this.largeDelta:this.smallDelta;_f=(key==_3.UP_ARROW||key==_3.PAGE_UP)?this.upArrowNode:this.downArrowNode;}if(_e==-1){this._arrowReleased(_f);}else{this._arrowPressed(_f,(_f==this.upArrowNode)?1:-1,inc);}},_wheelTimer:null,_mouseWheeled:function(evt){_2.stop(evt);var _10=evt.wheelDelta/120;if(Math.floor(_10)!=_10){_10=evt.wheelDelta>0?1:-1;}var _11=evt.detail?(evt.detail*-1):_10;if(_11!==0){var _12=this[(_11>0?"upArrowNode":"downArrowNode")];this._arrowPressed(_12,_11,this.smallDelta);if(!this._wheelTimer){clearTimeout(this._wheelTimer);}this._wheelTimer=setTimeout(_4.hitch(this,"_arrowReleased",_12),50);}},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,!_5("mozilla")?"onmousewheel":"DOMMouseScroll","_mouseWheeled");this._connects.push(_6.addListener(this.upArrowNode,this.textbox,{charOrCode:_3.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));this._connects.push(_6.addListener(this.downArrowNode,this.textbox,{charOrCode:_3.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));this._connects.push(_6.addListener(this.upArrowNode,this.textbox,{charOrCode:_3.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));this._connects.push(_6.addListener(this.downArrowNode,this.textbox,{charOrCode:_3.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));}});});
\ No newline at end of file diff --git a/lib/dijit/form/_Spinner.js.uncompressed.js b/lib/dijit/form/_Spinner.js.uncompressed.js new file mode 100644 index 000000000..f2c4aac8f --- /dev/null +++ b/lib/dijit/form/_Spinner.js.uncompressed.js @@ -0,0 +1,141 @@ +require({cache:{ +'url:dijit/form/templates/Spinner.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdata-dojo-attach-point=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▲\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdata-dojo-attach-point=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▼\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' data-dojo-attach-point=\"textbox,focusNode\" type=\"${type}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"}}); +define("dijit/form/_Spinner", [ + "dojo/_base/declare", // declare + "dojo/_base/event", // event.stop + "dojo/keys", // keys keys.DOWN_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.UP_ARROW + "dojo/_base/lang", // lang.hitch + "dojo/_base/sniff", // has("mozilla") + "dijit/typematic", + "./RangeBoundTextBox", + "dojo/text!./templates/Spinner.html", + "./_TextBoxMixin" // selectInputText +], function(declare, event, keys, lang, has, typematic, RangeBoundTextBox, template, _TextBoxMixin){ + +/*===== + var RangeBoundTextBox = dijit.form.RangeBoundTextBox; +=====*/ + + // module: + // dijit/form/_Spinner + // summary: + // Mixin for validation widgets with a spinner. + + + return declare("dijit.form._Spinner", RangeBoundTextBox, { + // summary: + // Mixin for validation widgets with a spinner. + // description: + // This class basically (conceptually) extends `dijit.form.ValidationTextBox`. + // It modifies the template to have up/down arrows, and provides related handling code. + + // defaultTimeout: Number + // Number of milliseconds before a held arrow key or up/down button becomes typematic + defaultTimeout: 500, + + // minimumTimeout: Number + // minimum number of milliseconds that typematic event fires when held key or button is held + minimumTimeout: 10, + + // timeoutChangeRate: Number + // Fraction of time used to change the typematic timer between events. + // 1.0 means that each typematic event fires at defaultTimeout intervals. + // < 1.0 means that each typematic event fires at an increasing faster rate. + timeoutChangeRate: 0.90, + + // smallDelta: Number + // Adjust the value by this much when spinning using the arrow keys/buttons + smallDelta: 1, + + // largeDelta: Number + // Adjust the value by this much when spinning using the PgUp/Dn keys + largeDelta: 10, + + templateString: template, + + baseClass: "dijitTextBox dijitSpinner", + + // Set classes like dijitUpArrowButtonHover or dijitDownArrowButtonActive depending on + // mouse action over specified node + cssStateNodes: { + "upArrowNode": "dijitUpArrowButton", + "downArrowNode": "dijitDownArrowButton" + }, + + adjust: function(val /*=====, delta =====*/){ + // summary: + // Overridable function used to adjust a primitive value(Number/Date/...) by the delta amount specified. + // The val is adjusted in a way that makes sense to the object type. + // val: Object + // delta: Number + // tags: + // protected extension + return val; + }, + + _arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction, /*Number*/ increment){ + // summary: + // Handler for arrow button or arrow key being pressed + if(this.disabled || this.readOnly){ return; } + this._setValueAttr(this.adjust(this.get('value'), direction*increment), false); + _TextBoxMixin.selectInputText(this.textbox, this.textbox.value.length); + }, + + _arrowReleased: function(/*Node*/ /*===== node =====*/){ + // summary: + // Handler for arrow button or arrow key being released + this._wheelTimer = null; + }, + + _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){ + var inc=this.smallDelta; + if(node == this.textbox){ + var key = evt.charOrCode; + inc = (key == keys.PAGE_UP || key == keys.PAGE_DOWN) ? this.largeDelta : this.smallDelta; + node = (key == keys.UP_ARROW || key == keys.PAGE_UP) ? this.upArrowNode : this.downArrowNode; + } + if(count == -1){ this._arrowReleased(node); } + else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1, inc); } + }, + + _wheelTimer: null, + _mouseWheeled: function(/*Event*/ evt){ + // summary: + // Mouse wheel listener where supported + + event.stop(evt); + // FIXME: Safari bubbles + + // be nice to DOH and scroll as much as the event says to + var wheelDelta = evt.wheelDelta / 120; + if(Math.floor(wheelDelta) != wheelDelta){ + // If not an int multiple of 120, then its touchpad scrolling. + // This can change very fast so just assume 1 wheel click to make it more manageable. + wheelDelta = evt.wheelDelta > 0 ? 1 : -1; + } + var scrollAmount = evt.detail ? (evt.detail * -1) : wheelDelta; + if(scrollAmount !== 0){ + var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )]; + + this._arrowPressed(node, scrollAmount, this.smallDelta); + + if(!this._wheelTimer){ + clearTimeout(this._wheelTimer); + } + this._wheelTimer = setTimeout(lang.hitch(this,"_arrowReleased",node), 50); + } + + }, + + postCreate: function(){ + this.inherited(arguments); + + // extra listeners + this.connect(this.domNode, !has("mozilla") ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled"); + this._connects.push(typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); + this._connects.push(typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); + this._connects.push(typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); + this._connects.push(typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)); + } + }); +}); diff --git a/lib/dijit/form/_TextBoxMixin.js b/lib/dijit/form/_TextBoxMixin.js new file mode 100644 index 000000000..133074972 --- /dev/null +++ b/lib/dijit/form/_TextBoxMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_TextBoxMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/_base/event","dojo/keys","dojo/_base/lang",".."],function(_1,_2,_3,_4,_5,_6,_7){var _8=_2("dijit.form._TextBoxMixin",null,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,placeHolder:"",_getValueAttr:function(){return this.parse(this.get("displayedValue"),this.constraints);},_setValueAttr:function(_9,_a,_b){var _c;if(_9!==undefined){_c=this.filter(_9);if(typeof _b!="string"){if(_c!==null&&((typeof _c!="number")||!isNaN(_c))){_b=this.filter(this.format(_c,this.constraints));}else{_b="";}}}if(_b!=null&&_b!=undefined&&((typeof _b)!="number"||!isNaN(_b))&&this.textbox.value!=_b){this.textbox.value=_b;this._set("displayedValue",this.get("displayedValue"));}if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_b);}this.inherited(arguments,[_c,_a]);},displayedValue:"",_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},_setDisplayedValueAttr:function(_d){if(_d===null||_d===undefined){_d="";}else{if(typeof _d!="string"){_d=String(_d);}}this.textbox.value=_d;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_d);}},format:function(_e){return ((_e==null||_e==undefined)?"":(_e.toString?_e.toString():_e));},parse:function(_f){return _f;},_refreshState:function(){},onInput:function(){},__skipInputEvent:false,_onInput:function(){if(this.textDir=="auto"){this.applyTextDir(this.focusNode,this.focusNode.value);}this._refreshState();this._set("displayedValue",this.get("displayedValue"));},postCreate:function(){this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);var _10=function(e){var _11=e.charOrCode||e.keyCode||229;if(e.type=="keydown"){switch(_11){case _5.SHIFT:case _5.ALT:case _5.CTRL:case _5.META:case _5.CAPS_LOCK:return;default:if(_11>=65&&_11<=90){return;}}}if(e.type=="keypress"&&typeof _11!="string"){return;}if(e.type=="input"){if(this.__skipInputEvent){this.__skipInputEvent=false;return;}}else{this.__skipInputEvent=true;}var _12=_6.mixin({},e,{charOrCode:_11,wasConsumed:false,preventDefault:function(){_12.wasConsumed=true;e.preventDefault();},stopPropagation:function(){e.stopPropagation();}});if(this.onInput(_12)===false){_4.stop(_12);}if(_12.wasConsumed){return;}setTimeout(_6.hitch(this,"_onInput",_12),0);};_1.forEach(["onkeydown","onkeypress","onpaste","oncut","oninput","oncompositionend"],function(_13){this.connect(this.textbox,_13,_10);},this);},_blankValue:"",filter:function(val){if(val===null){return this._blankValue;}if(typeof val!="string"){return val;}if(this.trim){val=_6.trim(val);}if(this.uppercase){val=val.toUpperCase();}if(this.lowercase){val=val.toLowerCase();}if(this.propercase){val=val.replace(/[^\s]+/g,function(_14){return _14.substring(0,1).toUpperCase()+_14.substring(1);});}return val;},_setBlurValue:function(){this._setValueAttr(this.get("value"),true);},_onBlur:function(e){if(this.disabled){return;}this._setBlurValue();this.inherited(arguments);if(this._selectOnClickHandle){this.disconnect(this._selectOnClickHandle);}},_isTextSelected:function(){return this.textbox.selectionStart==this.textbox.selectionEnd;},_onFocus:function(by){if(this.disabled||this.readOnly){return;}if(this.selectOnClick&&by=="mouse"){this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){this.disconnect(this._selectOnClickHandle);if(this._isTextSelected()){_8.selectInputText(this.textbox);}});}this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);},_setTextDirAttr:function(_15){if(!this._created||this.textDir!=_15){this._set("textDir",_15);this.applyTextDir(this.focusNode,this.focusNode.value);}}});_8._setSelectionRange=_7._setSelectionRange=function(_16,_17,_18){if(_16.setSelectionRange){_16.setSelectionRange(_17,_18);}};_8.selectInputText=_7.selectInputText=function(_19,_1a,_1b){_19=_3.byId(_19);if(isNaN(_1a)){_1a=0;}if(isNaN(_1b)){_1b=_19.value?_19.value.length:0;}try{_19.focus();_8._setSelectionRange(_19,_1a,_1b);}catch(e){}};return _8;});
\ No newline at end of file diff --git a/lib/dijit/form/_TextBoxMixin.js.uncompressed.js b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js new file mode 100644 index 000000000..5bf8b7f85 --- /dev/null +++ b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js @@ -0,0 +1,408 @@ +define("dijit/form/_TextBoxMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom", // dom.byId + "dojo/_base/event", // event.stop + "dojo/keys", // keys.ALT keys.CAPS_LOCK keys.CTRL keys.META keys.SHIFT + "dojo/_base/lang", // lang.mixin + ".." // for exporting dijit._setSelectionRange, dijit.selectInputText +], function(array, declare, dom, event, keys, lang, dijit){ + +// module: +// dijit/form/_TextBoxMixin +// summary: +// A mixin for textbox form input widgets + +var _TextBoxMixin = declare("dijit.form._TextBoxMixin", null, { + // summary: + // A mixin for textbox form input widgets + + // trim: Boolean + // Removes leading and trailing whitespace if true. Default is false. + trim: false, + + // uppercase: Boolean + // Converts all characters to uppercase if true. Default is false. + uppercase: false, + + // lowercase: Boolean + // Converts all characters to lowercase if true. Default is false. + lowercase: false, + + // propercase: Boolean + // Converts the first character of each word to uppercase if true. + propercase: false, + + // maxLength: String + // HTML INPUT tag maxLength declaration. + maxLength: "", + + // selectOnClick: [const] Boolean + // If true, all text will be selected when focused with mouse + selectOnClick: false, + + // placeHolder: String + // Defines a hint to help users fill out the input field (as defined in HTML 5). + // This should only contain plain text (no html markup). + placeHolder: "", + + _getValueAttr: function(){ + // summary: + // Hook so get('value') works as we like. + // description: + // For `dijit.form.TextBox` this basically returns the value of the <input>. + // + // For `dijit.form.MappedTextBox` subclasses, which have both + // a "displayed value" and a separate "submit value", + // This treats the "displayed value" as the master value, computing the + // submit value from it via this.parse(). + return this.parse(this.get('displayedValue'), this.constraints); + }, + + _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + // summary: + // Hook so set('value', ...) works. + // + // description: + // Sets the value of the widget to "value" which can be of + // any type as determined by the widget. + // + // value: + // The visual element value is also set to a corresponding, + // but not necessarily the same, value. + // + // formattedValue: + // If specified, used to set the visual element value, + // otherwise a computed visual value is used. + // + // priorityChange: + // If true, an onChange event is fired immediately instead of + // waiting for the next blur event. + + var filteredValue; + if(value !== undefined){ + // TODO: this is calling filter() on both the display value and the actual value. + // I added a comment to the filter() definition about this, but it should be changed. + filteredValue = this.filter(value); + if(typeof formattedValue != "string"){ + if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){ + formattedValue = this.filter(this.format(filteredValue, this.constraints)); + }else{ formattedValue = ''; } + } + } + if(formattedValue != null && formattedValue != undefined && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ + this.textbox.value = formattedValue; + this._set("displayedValue", this.get("displayedValue")); + } + + if(this.textDir == "auto"){ + this.applyTextDir(this.focusNode, formattedValue); + } + + this.inherited(arguments, [filteredValue, priorityChange]); + }, + + // displayedValue: String + // For subclasses like ComboBox where the displayed value + // (ex: Kentucky) and the serialized value (ex: KY) are different, + // this represents the displayed value. + // + // Setting 'displayedValue' through set('displayedValue', ...) + // updates 'value', and vice-versa. Otherwise 'value' is updated + // from 'displayedValue' periodically, like onBlur etc. + // + // TODO: move declaration to MappedTextBox? + // Problem is that ComboBox references displayedValue, + // for benefit of FilteringSelect. + displayedValue: "", + + _getDisplayedValueAttr: function(){ + // summary: + // Hook so get('displayedValue') works. + // description: + // Returns the displayed value (what the user sees on the screen), + // after filtering (ie, trimming spaces etc.). + // + // For some subclasses of TextBox (like ComboBox), the displayed value + // is different from the serialized value that's actually + // sent to the server (see dijit.form.ValidationTextBox.serialize) + + // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need + // this method + // TODO: this isn't really the displayed value when the user is typing + return this.filter(this.textbox.value); + }, + + _setDisplayedValueAttr: function(/*String*/ value){ + // summary: + // Hook so set('displayedValue', ...) works. + // description: + // Sets the value of the visual element to the string "value". + // The widget value is also set to a corresponding, + // but not necessarily the same, value. + + if(value === null || value === undefined){ value = '' } + else if(typeof value != "string"){ value = String(value) } + + this.textbox.value = value; + + // sets the serialized value to something corresponding to specified displayedValue + // (if possible), and also updates the textbox.value, for example converting "123" + // to "123.00" + this._setValueAttr(this.get('value'), undefined); + + this._set("displayedValue", this.get('displayedValue')); + + // textDir support + if(this.textDir == "auto"){ + this.applyTextDir(this.focusNode, value); + } + }, + + format: function(value /*=====, constraints =====*/){ + // summary: + // Replaceable function to convert a value to a properly formatted string. + // value: String + // constraints: Object + // tags: + // protected extension + return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value)); + }, + + parse: function(value /*=====, constraints =====*/){ + // summary: + // Replaceable function to convert a formatted string to a value + // value: String + // constraints: Object + // tags: + // protected extension + + return value; // String + }, + + _refreshState: function(){ + // summary: + // After the user types some characters, etc., this method is + // called to check the field for validity etc. The base method + // in `dijit.form.TextBox` does nothing, but subclasses override. + // tags: + // protected + }, + + /*===== + onInput: function(event){ + // summary: + // Connect to this function to receive notifications of various user data-input events. + // Return false to cancel the event and prevent it from being processed. + // event: + // keydown | keypress | cut | paste | input + // tags: + // callback + }, + =====*/ + onInput: function(){}, + + __skipInputEvent: false, + _onInput: function(){ + // summary: + // Called AFTER the input event has happened + // set text direction according to textDir that was defined in creation + if(this.textDir == "auto"){ + this.applyTextDir(this.focusNode, this.focusNode.value); + } + + this._refreshState(); + + // In case someone is watch()'ing for changes to displayedValue + this._set("displayedValue", this.get("displayedValue")); + }, + + postCreate: function(){ + // setting the value here is needed since value="" in the template causes "undefined" + // and setting in the DOM (instead of the JS object) helps with form reset actions + this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same + + this.inherited(arguments); + + // normalize input events to reduce spurious event processing + // onkeydown: do not forward modifier keys + // set charOrCode to numeric keycode + // onkeypress: do not forward numeric charOrCode keys (already sent through onkeydown) + // onpaste & oncut: set charOrCode to 229 (IME) + // oninput: if primary event not already processed, set charOrCode to 229 (IME), else do not forward + var handleEvent = function(e){ + var charCode = e.charOrCode || e.keyCode || 229; + if(e.type == "keydown"){ + switch(charCode){ // ignore "state" keys + case keys.SHIFT: + case keys.ALT: + case keys.CTRL: + case keys.META: + case keys.CAPS_LOCK: + return; + default: + if(charCode >= 65 && charCode <= 90){ return; } // keydown for A-Z can be processed with keypress + } + } + if(e.type == "keypress" && typeof charCode != "string"){ return; } + if(e.type == "input"){ + if(this.__skipInputEvent){ // duplicate event + this.__skipInputEvent = false; + return; + } + }else{ + this.__skipInputEvent = true; + } + // create fake event to set charOrCode and to know if preventDefault() was called + var faux = lang.mixin({}, e, { + charOrCode: charCode, + wasConsumed: false, + preventDefault: function(){ + faux.wasConsumed = true; + e.preventDefault(); + }, + stopPropagation: function(){ e.stopPropagation(); } + }); + // give web page author a chance to consume the event + if(this.onInput(faux) === false){ + event.stop(faux); // return false means stop + } + if(faux.wasConsumed){ return; } // if preventDefault was called + setTimeout(lang.hitch(this, "_onInput", faux), 0); // widget notification after key has posted + }; + array.forEach([ "onkeydown", "onkeypress", "onpaste", "oncut", "oninput", "oncompositionend" ], function(event){ + this.connect(this.textbox, event, handleEvent); + }, this); + }, + + _blankValue: '', // if the textbox is blank, what value should be reported + filter: function(val){ + // summary: + // Auto-corrections (such as trimming) that are applied to textbox + // value on blur or form submit. + // description: + // For MappedTextBox subclasses, this is called twice + // - once with the display value + // - once the value as set/returned by set('value', ...) + // and get('value'), ex: a Number for NumberTextBox. + // + // In the latter case it does corrections like converting null to NaN. In + // the former case the NumberTextBox.filter() method calls this.inherited() + // to execute standard trimming code in TextBox.filter(). + // + // TODO: break this into two methods in 2.0 + // + // tags: + // protected extension + if(val === null){ return this._blankValue; } + if(typeof val != "string"){ return val; } + if(this.trim){ + val = lang.trim(val); + } + if(this.uppercase){ + val = val.toUpperCase(); + } + if(this.lowercase){ + val = val.toLowerCase(); + } + if(this.propercase){ + val = val.replace(/[^\s]+/g, function(word){ + return word.substring(0,1).toUpperCase() + word.substring(1); + }); + } + return val; + }, + + _setBlurValue: function(){ + this._setValueAttr(this.get('value'), true); + }, + + _onBlur: function(e){ + if(this.disabled){ return; } + this._setBlurValue(); + this.inherited(arguments); + + if(this._selectOnClickHandle){ + this.disconnect(this._selectOnClickHandle); + } + }, + + _isTextSelected: function(){ + return this.textbox.selectionStart == this.textbox.selectionEnd; + }, + + _onFocus: function(/*String*/ by){ + if(this.disabled || this.readOnly){ return; } + + // Select all text on focus via click if nothing already selected. + // Since mouse-up will clear the selection need to defer selection until after mouse-up. + // Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event. + if(this.selectOnClick && by == "mouse"){ + this._selectOnClickHandle = this.connect(this.domNode, "onmouseup", function(){ + // Only select all text on first click; otherwise users would have no way to clear + // the selection. + this.disconnect(this._selectOnClickHandle); + + // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up) + // and if not, then select all the text + if(this._isTextSelected()){ + _TextBoxMixin.selectInputText(this.textbox); + } + }); + } + // call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport + // (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip + this.inherited(arguments); + + this._refreshState(); + }, + + reset: function(){ + // Overrides dijit._FormWidget.reset(). + // Additionally resets the displayed textbox value to '' + this.textbox.value = ''; + this.inherited(arguments); + }, + _setTextDirAttr: function(/*String*/ textDir){ + // summary: + // Setter for textDir. + // description: + // Users shouldn't call this function; they should be calling + // set('textDir', value) + // tags: + // private + + // only if new textDir is different from the old one + // and on widgets creation. + if(!this._created + || this.textDir != textDir){ + this._set("textDir", textDir); + // so the change of the textDir will take place immediately. + this.applyTextDir(this.focusNode, this.focusNode.value); + } + } +}); + + +_TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ + if(element.setSelectionRange){ + element.setSelectionRange(start, stop); + } +}; + +_TextBoxMixin.selectInputText = dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ + // summary: + // Select text in the input element argument, from start (default 0), to stop (default end). + + // TODO: use functions in _editor/selection.js? + element = dom.byId(element); + if(isNaN(start)){ start = 0; } + if(isNaN(stop)){ stop = element.value ? element.value.length : 0; } + try{ + element.focus(); + _TextBoxMixin._setSelectionRange(element, start, stop); + }catch(e){ /* squelch random errors (esp. on IE) from unexpected focus changes or DOM nodes being hidden */ } +}; + +return _TextBoxMixin; +}); diff --git a/lib/dijit/form/_ToggleButtonMixin.js b/lib/dijit/form/_ToggleButtonMixin.js new file mode 100644 index 000000000..bffb6a64d --- /dev/null +++ b/lib/dijit/form/_ToggleButtonMixin.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/_ToggleButtonMixin",["dojo/_base/declare","dojo/dom-attr"],function(_1,_2){return _1("dijit.form._ToggleButtonMixin",null,{checked:false,_aria_attr:"aria-pressed",_onClick:function(_3){var _4=this.checked;this._set("checked",!_4);var _5=this.inherited(arguments);this.set("checked",_5?this.checked:_4);return _5;},_setCheckedAttr:function(_6,_7){this._set("checked",_6);_2.set(this.focusNode||this.domNode,"checked",_6);(this.focusNode||this.domNode).setAttribute(this._aria_attr,_6?"true":"false");this._handleOnChange(_6,_7);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});});
\ No newline at end of file diff --git a/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js new file mode 100644 index 000000000..d044fcc66 --- /dev/null +++ b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js @@ -0,0 +1,51 @@ +define("dijit/form/_ToggleButtonMixin", [ + "dojo/_base/declare", // declare + "dojo/dom-attr" // domAttr.set +], function(declare, domAttr){ + +// module: +// dijit/form/_ToggleButtonMixin +// summary: +// A mixin to provide functionality to allow a button that can be in two states (checked or not). + +return declare("dijit.form._ToggleButtonMixin", null, { + // summary: + // A mixin to provide functionality to allow a button that can be in two states (checked or not). + + // checked: Boolean + // Corresponds to the native HTML <input> element's attribute. + // In markup, specified as "checked='checked'" or just "checked". + // True if the button is depressed, or the checkbox is checked, + // or the radio button is selected, etc. + checked: false, + + // aria-pressed for toggle buttons, and aria-checked for checkboxes + _aria_attr: "aria-pressed", + + _onClick: function(/*Event*/ evt){ + var original = this.checked; + this._set('checked', !original); // partially set the toggled value, assuming the toggle will work, so it can be overridden in the onclick handler + var ret = this.inherited(arguments); // the user could reset the value here + this.set('checked', ret ? this.checked : original); // officially set the toggled or user value, or reset it back + return ret; + }, + + _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){ + this._set("checked", value); + domAttr.set(this.focusNode || this.domNode, "checked", value); + (this.focusNode || this.domNode).setAttribute(this._aria_attr, value ? "true" : "false"); // aria values should be strings + this._handleOnChange(value, priorityChange); + }, + + reset: function(){ + // summary: + // Reset the widget's value to what it was at initialization time + + this._hasBeenBlurred = false; + + // set checked state to original setting + this.set('checked', this.params.checked || false); + } +}); + +}); diff --git a/lib/dijit/form/nls/ComboBox.js b/lib/dijit/form/nls/ComboBox.js index 49bba39a0..b76d7e439 100644 --- a/lib/dijit/form/nls/ComboBox.js +++ b/lib/dijit/form/nls/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Previous choices","nextMessage":"More choices"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ComboBox",{root:({previousMessage:"Previous choices",nextMessage:"More choices"}),"zh":true,"zh-tw":true,"tr":true,"th":true,"sv":true,"sl":true,"sk":true,"ru":true,"ro":true,"pt":true,"pt-pt":true,"pl":true,"nl":true,"nb":true,"ko":true,"kk":true,"ja":true,"it":true,"hu":true,"hr":true,"he":true,"fr":true,"fi":true,"es":true,"el":true,"de":true,"da":true,"cs":true,"ca":true,"az":true,"ar":true});
\ No newline at end of file diff --git a/lib/dijit/form/nls/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..dd9807dda --- /dev/null +++ b/lib/dijit/form/nls/ComboBox.js.uncompressed.js @@ -0,0 +1,40 @@ +define("dijit/form/nls/ComboBox", { root: +//begin v1.x content +({ + previousMessage: "Previous choices", + nextMessage: "More choices" +}) +//end v1.x content +, +"zh": true, +"zh-tw": true, +"tr": true, +"th": true, +"sv": true, +"sl": true, +"sk": true, +"ru": true, +"ro": true, +"pt": true, +"pt-pt": true, +"pl": true, +"nl": true, +"nb": true, +"ko": true, +"kk": true, +"ja": true, +"it": true, +"hu": true, +"hr": true, +"he": true, +"fr": true, +"fi": true, +"es": true, +"el": true, +"de": true, +"da": true, +"cs": true, +"ca": true, +"az": true, +"ar": true +}); diff --git a/lib/dijit/form/nls/Textarea.js b/lib/dijit/form/nls/Textarea.js index 4b0e996ad..0363bc093 100644 --- a/lib/dijit/form/nls/Textarea.js +++ b/lib/dijit/form/nls/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"})
\ No newline at end of file +//>>built +define("dijit/form/nls/Textarea",{root:({iframeEditTitle:"edit area",iframeFocusTitle:"edit area frame"}),"zh":true,"zh-tw":true,"tr":true,"th":true,"sv":true,"sl":true,"sk":true,"ru":true,"ro":true,"pt":true,"pt-pt":true,"pl":true,"nl":true,"nb":true,"ko":true,"kk":true,"ja":true,"it":true,"hu":true,"hr":true,"he":true,"fr":true,"fi":true,"es":true,"el":true,"de":true,"da":true,"cs":true,"ca":true,"az":true,"ar":true});
\ No newline at end of file diff --git a/lib/dijit/form/nls/Textarea.js.uncompressed.js b/lib/dijit/form/nls/Textarea.js.uncompressed.js new file mode 100644 index 000000000..2d05609c1 --- /dev/null +++ b/lib/dijit/form/nls/Textarea.js.uncompressed.js @@ -0,0 +1,43 @@ +define("dijit/form/nls/Textarea", { root: +//begin v1.x content +// used by both the editor and textarea widgets to provide information to screen reader users +({ + iframeEditTitle: 'edit area', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'edit area frame' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +, +"zh": true, +"zh-tw": true, +"tr": true, +"th": true, +"sv": true, +"sl": true, +"sk": true, +"ru": true, +"ro": true, +"pt": true, +"pt-pt": true, +"pl": true, +"nl": true, +"nb": true, +"ko": true, +"kk": true, +"ja": true, +"it": true, +"hu": true, +"hr": true, +"he": true, +"fr": true, +"fi": true, +"es": true, +"el": true, +"de": true, +"da": true, +"cs": true, +"ca": true, +"az": true, +"ar": true +}); diff --git a/lib/dijit/form/nls/ar/ComboBox.js b/lib/dijit/form/nls/ar/ComboBox.js index 6a8453183..10a1a7af0 100644 --- a/lib/dijit/form/nls/ar/ComboBox.js +++ b/lib/dijit/form/nls/ar/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ar/ComboBox",({previousMessage:"الاختيارات السابقة",nextMessage:"مزيد من الاختيارات"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..a9a3200f2 --- /dev/null +++ b/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/ar/ComboBox", //begin v1.x content +({ + previousMessage: "الاختيارات السابقة", + nextMessage: "مزيد من الاختيارات" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ar/Textarea.js b/lib/dijit/form/nls/ar/Textarea.js index fe623c694..6a3b426a8 100644 --- a/lib/dijit/form/nls/ar/Textarea.js +++ b/lib/dijit/form/nls/ar/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"مساحة التحرير","iframeFocusTitle":"اطار مساحة التحرير"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ar/Textarea",({iframeEditTitle:"مساحة التحرير",iframeFocusTitle:"اطار مساحة التحرير"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js new file mode 100644 index 000000000..81201afe3 --- /dev/null +++ b/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/ar/Textarea", //begin v1.x content +({ + iframeEditTitle: 'مساحة التحرير', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'اطار مساحة التحرير' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ar/validate.js b/lib/dijit/form/nls/ar/validate.js index 615e56b35..73c17bf18 100644 --- a/lib/dijit/form/nls/ar/validate.js +++ b/lib/dijit/form/nls/ar/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."})
\ No newline at end of file +//>>built +define("dijit/form/nls/ar/validate",({invalidMessage:"القيمة التي تم ادخالها غير صحيحة.",missingMessage:"يجب ادخال هذه القيمة.",rangeMessage:"هذه القيمة ليس بالمدى الصحيح."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ar/validate.js.uncompressed.js b/lib/dijit/form/nls/ar/validate.js.uncompressed.js new file mode 100644 index 000000000..fb023d28e --- /dev/null +++ b/lib/dijit/form/nls/ar/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/ar/validate", //begin v1.x content +({ + invalidMessage: "القيمة التي تم ادخالها غير صحيحة.", + missingMessage: "يجب ادخال هذه القيمة.", + rangeMessage: "هذه القيمة ليس بالمدى الصحيح." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/az/ComboBox.js b/lib/dijit/form/nls/az/ComboBox.js new file mode 100644 index 000000000..40eb2b91e --- /dev/null +++ b/lib/dijit/form/nls/az/ComboBox.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/nls/az/ComboBox",({"previousMessage":"Əvvəlki variantlar","nextMessage":"Başqa variantlar"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..e65e9e47b --- /dev/null +++ b/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/az/ComboBox", //begin v1.x content +({ + "previousMessage" : "Əvvəlki variantlar", + "nextMessage" : "Başqa variantlar" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/az/Textarea.js b/lib/dijit/form/nls/az/Textarea.js new file mode 100644 index 000000000..d048287a6 --- /dev/null +++ b/lib/dijit/form/nls/az/Textarea.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/nls/az/Textarea",({"iframeEditTitle":"Redaktə sahəsi","iframeFocusTitle":"Redaktə sahəsi çərçivəsi"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/az/Textarea.js.uncompressed.js b/lib/dijit/form/nls/az/Textarea.js.uncompressed.js new file mode 100644 index 000000000..6fd34894d --- /dev/null +++ b/lib/dijit/form/nls/az/Textarea.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/az/Textarea", //begin v1.x content +({ + "iframeEditTitle" : "Redaktə sahəsi", + "iframeFocusTitle" : "Redaktə sahəsi çərçivəsi" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/az/validate.js b/lib/dijit/form/nls/az/validate.js new file mode 100644 index 000000000..c8e183452 --- /dev/null +++ b/lib/dijit/form/nls/az/validate.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/nls/az/validate",({"rangeMessage":"Bu dəyər aralıq xaricində.","invalidMessage":"Girilən dəyər keçərli deyil.","missingMessage":"Bu deyər lazımlı."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/az/validate.js.uncompressed.js b/lib/dijit/form/nls/az/validate.js.uncompressed.js new file mode 100644 index 000000000..25d65cd7c --- /dev/null +++ b/lib/dijit/form/nls/az/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/az/validate", //begin v1.x content +({ + "rangeMessage" : "Bu dəyər aralıq xaricində.", + "invalidMessage" : "Girilən dəyər keçərli deyil.", + "missingMessage" : "Bu deyər lazımlı." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ca/ComboBox.js b/lib/dijit/form/nls/ca/ComboBox.js index 1a3786881..4153bf7b6 100644 --- a/lib/dijit/form/nls/ca/ComboBox.js +++ b/lib/dijit/form/nls/ca/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ca/ComboBox",({previousMessage:"Opcions anteriors",nextMessage:"Més opcions"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..6dd7f93d5 --- /dev/null +++ b/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/ca/ComboBox", //begin v1.x content +({ + previousMessage: "Opcions anteriors", + nextMessage: "Més opcions" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/ca/Textarea.js b/lib/dijit/form/nls/ca/Textarea.js index 357f92389..fb64883e2 100644 --- a/lib/dijit/form/nls/ca/Textarea.js +++ b/lib/dijit/form/nls/ca/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"àrea d'edició","iframeFocusTitle":"Marc de l'àrea d'edició"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ca/Textarea",({iframeEditTitle:"àrea d'edició",iframeFocusTitle:"Marc de l'àrea d'edició"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js new file mode 100644 index 000000000..af65a94dd --- /dev/null +++ b/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js @@ -0,0 +1,12 @@ +define( +"dijit/form/nls/ca/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'àrea d\'edició', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'Marc de l\'àrea d\'edició' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/ca/validate.js b/lib/dijit/form/nls/ca/validate.js index a0a592ed6..5152362ae 100644 --- a/lib/dijit/form/nls/ca/validate.js +++ b/lib/dijit/form/nls/ca/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ca/validate",({invalidMessage:"El valor introduït no és vàlid",missingMessage:"Aquest valor és necessari",rangeMessage:"Aquest valor és fora de l'interval"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ca/validate.js.uncompressed.js b/lib/dijit/form/nls/ca/validate.js.uncompressed.js new file mode 100644 index 000000000..93315bf7f --- /dev/null +++ b/lib/dijit/form/nls/ca/validate.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/ca/validate", //begin v1.x content +({ + invalidMessage: "El valor introduït no és vàlid", + missingMessage: "Aquest valor és necessari", + rangeMessage: "Aquest valor és fora de l'interval" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/cs/ComboBox.js b/lib/dijit/form/nls/cs/ComboBox.js index 84e084139..e034c1a35 100644 --- a/lib/dijit/form/nls/cs/ComboBox.js +++ b/lib/dijit/form/nls/cs/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Předchozí volby","nextMessage":"Další volby"})
\ No newline at end of file +//>>built +define("dijit/form/nls/cs/ComboBox",({previousMessage:"Předchozí volby",nextMessage:"Další volby"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..72727c73c --- /dev/null +++ b/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/cs/ComboBox", //begin v1.x content +({ + previousMessage: "Předchozí volby", + nextMessage: "Další volby" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/cs/Textarea.js b/lib/dijit/form/nls/cs/Textarea.js index 8a75ddc45..53bd01463 100644 --- a/lib/dijit/form/nls/cs/Textarea.js +++ b/lib/dijit/form/nls/cs/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"oblast úprav","iframeFocusTitle":"rámec oblasti úprav"})
\ No newline at end of file +//>>built +define("dijit/form/nls/cs/Textarea",({iframeEditTitle:"oblast úprav",iframeFocusTitle:"rámec oblasti úprav"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js b/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js new file mode 100644 index 000000000..9c40ef6ec --- /dev/null +++ b/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/cs/Textarea", //begin v1.x content +({ + iframeEditTitle: 'oblast úprav', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'rámec oblasti úprav' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/cs/validate.js b/lib/dijit/form/nls/cs/validate.js index 7bb7b9e21..6323c21c3 100644 --- a/lib/dijit/form/nls/cs/validate.js +++ b/lib/dijit/form/nls/cs/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."})
\ No newline at end of file +//>>built +define("dijit/form/nls/cs/validate",({invalidMessage:"Zadaná hodnota není platná.",missingMessage:"Tato hodnota je vyžadována.",rangeMessage:"Tato hodnota je mimo rozsah."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/cs/validate.js.uncompressed.js b/lib/dijit/form/nls/cs/validate.js.uncompressed.js new file mode 100644 index 000000000..3615adf5e --- /dev/null +++ b/lib/dijit/form/nls/cs/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/cs/validate", //begin v1.x content +({ + invalidMessage: "Zadaná hodnota není platná.", + missingMessage: "Tato hodnota je vyžadována.", + rangeMessage: "Tato hodnota je mimo rozsah." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/da/ComboBox.js b/lib/dijit/form/nls/da/ComboBox.js index 4ddc10dce..3af927d82 100644 --- a/lib/dijit/form/nls/da/ComboBox.js +++ b/lib/dijit/form/nls/da/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Forrige valg","nextMessage":"Flere valg"})
\ No newline at end of file +//>>built +define("dijit/form/nls/da/ComboBox",({previousMessage:"Forrige valg",nextMessage:"Flere valg"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..b73523524 --- /dev/null +++ b/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/da/ComboBox", //begin v1.x content +({ + previousMessage: "Forrige valg", + nextMessage: "Flere valg" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/da/Textarea.js b/lib/dijit/form/nls/da/Textarea.js index 244c2109f..50f298eea 100644 --- a/lib/dijit/form/nls/da/Textarea.js +++ b/lib/dijit/form/nls/da/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme om redigeringsområde"})
\ No newline at end of file +//>>built +define("dijit/form/nls/da/Textarea",({iframeEditTitle:"redigeringsområde",iframeFocusTitle:"ramme om redigeringsområde"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/da/Textarea.js.uncompressed.js b/lib/dijit/form/nls/da/Textarea.js.uncompressed.js new file mode 100644 index 000000000..403f258c8 --- /dev/null +++ b/lib/dijit/form/nls/da/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/da/Textarea", //begin v1.x content +({ + iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'ramme om redigeringsområde' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/da/validate.js b/lib/dijit/form/nls/da/validate.js index b42a99d39..b29f9ccca 100644 --- a/lib/dijit/form/nls/da/validate.js +++ b/lib/dijit/form/nls/da/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."})
\ No newline at end of file +//>>built +define("dijit/form/nls/da/validate",({invalidMessage:"Den angivne værdi er ikke gyldig.",missingMessage:"Værdien er påkrævet.",rangeMessage:"Værdien er uden for intervallet."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/da/validate.js.uncompressed.js b/lib/dijit/form/nls/da/validate.js.uncompressed.js new file mode 100644 index 000000000..57027fa9a --- /dev/null +++ b/lib/dijit/form/nls/da/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/da/validate", //begin v1.x content +({ + invalidMessage: "Den angivne værdi er ikke gyldig.", + missingMessage: "Værdien er påkrævet.", + rangeMessage: "Værdien er uden for intervallet." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/de/ComboBox.js b/lib/dijit/form/nls/de/ComboBox.js index 6cce34bf5..6a3e1874d 100644 --- a/lib/dijit/form/nls/de/ComboBox.js +++ b/lib/dijit/form/nls/de/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"})
\ No newline at end of file +//>>built +define("dijit/form/nls/de/ComboBox",({previousMessage:"Vorherige Auswahl",nextMessage:"Weitere Auswahlmöglichkeiten"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..4240e9ded --- /dev/null +++ b/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/de/ComboBox", //begin v1.x content +({ + previousMessage: "Vorherige Auswahl", + nextMessage: "Weitere Auswahlmöglichkeiten" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/de/Textarea.js b/lib/dijit/form/nls/de/Textarea.js index 2cf75dbe6..f3f9abbf5 100644 --- a/lib/dijit/form/nls/de/Textarea.js +++ b/lib/dijit/form/nls/de/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"})
\ No newline at end of file +//>>built +define("dijit/form/nls/de/Textarea",({iframeEditTitle:"Editierbereich",iframeFocusTitle:"Rahmen für Editierbereich"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/de/Textarea.js.uncompressed.js b/lib/dijit/form/nls/de/Textarea.js.uncompressed.js new file mode 100644 index 000000000..c068e8904 --- /dev/null +++ b/lib/dijit/form/nls/de/Textarea.js.uncompressed.js @@ -0,0 +1,11 @@ +define( +"dijit/form/nls/de/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'Editierbereich', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'Rahmen für Editierbereich' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/de/validate.js b/lib/dijit/form/nls/de/validate.js index 597796d52..b5c3daefc 100644 --- a/lib/dijit/form/nls/de/validate.js +++ b/lib/dijit/form/nls/de/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."})
\ No newline at end of file +//>>built +define("dijit/form/nls/de/validate",({invalidMessage:"Der eingegebene Wert ist ungültig. ",missingMessage:"Dieser Wert ist erforderlich.",rangeMessage:"Dieser Wert liegt außerhalb des gültigen Bereichs. "}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/de/validate.js.uncompressed.js b/lib/dijit/form/nls/de/validate.js.uncompressed.js new file mode 100644 index 000000000..0981eeeca --- /dev/null +++ b/lib/dijit/form/nls/de/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/de/validate", //begin v1.x content +({ + invalidMessage: "Der eingegebene Wert ist ungültig. ", + missingMessage: "Dieser Wert ist erforderlich.", + rangeMessage: "Dieser Wert liegt außerhalb des gültigen Bereichs. " +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/el/ComboBox.js b/lib/dijit/form/nls/el/ComboBox.js index ec294d14b..9a7a223f7 100644 --- a/lib/dijit/form/nls/el/ComboBox.js +++ b/lib/dijit/form/nls/el/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"})
\ No newline at end of file +//>>built +define("dijit/form/nls/el/ComboBox",({previousMessage:"Προηγούμενες επιλογές",nextMessage:"Περισσότερες επιλογές"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..f9c33c75d --- /dev/null +++ b/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/el/ComboBox", //begin v1.x content +({ + previousMessage: "Προηγούμενες επιλογές", + nextMessage: "Περισσότερες επιλογές" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/el/Textarea.js b/lib/dijit/form/nls/el/Textarea.js index 9ce37a93c..4966a3615 100644 --- a/lib/dijit/form/nls/el/Textarea.js +++ b/lib/dijit/form/nls/el/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"περιοχή επεξεργασίας","iframeFocusTitle":"πλαίσιο περιοχής επεξεργασίας"})
\ No newline at end of file +//>>built +define("dijit/form/nls/el/Textarea",({iframeEditTitle:"περιοχή επεξεργασίας",iframeFocusTitle:"πλαίσιο περιοχής επεξεργασίας"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/el/Textarea.js.uncompressed.js b/lib/dijit/form/nls/el/Textarea.js.uncompressed.js new file mode 100644 index 000000000..f39ae1d10 --- /dev/null +++ b/lib/dijit/form/nls/el/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/el/Textarea", //begin v1.x content +({ + iframeEditTitle: 'περιοχή επεξεργασίας', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'πλαίσιο περιοχής επεξεργασίας' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/el/validate.js b/lib/dijit/form/nls/el/validate.js index cc57d55e4..18c54d5fe 100644 --- a/lib/dijit/form/nls/el/validate.js +++ b/lib/dijit/form/nls/el/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."})
\ No newline at end of file +//>>built +define("dijit/form/nls/el/validate",({invalidMessage:"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.",missingMessage:"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί.",rangeMessage:"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/el/validate.js.uncompressed.js b/lib/dijit/form/nls/el/validate.js.uncompressed.js new file mode 100644 index 000000000..e3b31baee --- /dev/null +++ b/lib/dijit/form/nls/el/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/el/validate", //begin v1.x content +({ + invalidMessage: "Η τιμή που καταχωρήσατε δεν είναι έγκυρη.", + missingMessage: "Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί.", + rangeMessage: "Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/es/ComboBox.js b/lib/dijit/form/nls/es/ComboBox.js index 5bf69f988..20e8af158 100644 --- a/lib/dijit/form/nls/es/ComboBox.js +++ b/lib/dijit/form/nls/es/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"})
\ No newline at end of file +//>>built +define("dijit/form/nls/es/ComboBox",({previousMessage:"Opciones anteriores",nextMessage:"Más opciones"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..408d0249b --- /dev/null +++ b/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/es/ComboBox", //begin v1.x content +({ + previousMessage: "Opciones anteriores", + nextMessage: "Más opciones" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/es/Textarea.js b/lib/dijit/form/nls/es/Textarea.js index f92a50f65..2f9ff0da5 100644 --- a/lib/dijit/form/nls/es/Textarea.js +++ b/lib/dijit/form/nls/es/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"})
\ No newline at end of file +//>>built +define("dijit/form/nls/es/Textarea",({iframeEditTitle:"área de edición",iframeFocusTitle:"marco del área de edición"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/es/Textarea.js.uncompressed.js b/lib/dijit/form/nls/es/Textarea.js.uncompressed.js new file mode 100644 index 000000000..a0b43a0b3 --- /dev/null +++ b/lib/dijit/form/nls/es/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/es/Textarea", //begin v1.x content +({ + iframeEditTitle: 'área de edición', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'marco del área de edición' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/es/validate.js b/lib/dijit/form/nls/es/validate.js index 65e190ec5..4a3c5d8c3 100644 --- a/lib/dijit/form/nls/es/validate.js +++ b/lib/dijit/form/nls/es/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."})
\ No newline at end of file +//>>built +define("dijit/form/nls/es/validate",({invalidMessage:"El valor especificado no es válido.",missingMessage:"Este valor es necesario.",rangeMessage:"Este valor está fuera del intervalo."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/es/validate.js.uncompressed.js b/lib/dijit/form/nls/es/validate.js.uncompressed.js new file mode 100644 index 000000000..090112fd0 --- /dev/null +++ b/lib/dijit/form/nls/es/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/es/validate", //begin v1.x content +({ + invalidMessage: "El valor especificado no es válido.", + missingMessage: "Este valor es necesario.", + rangeMessage: "Este valor está fuera del intervalo." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/fi/ComboBox.js b/lib/dijit/form/nls/fi/ComboBox.js index 6d9b830a4..f1b726987 100644 --- a/lib/dijit/form/nls/fi/ComboBox.js +++ b/lib/dijit/form/nls/fi/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"})
\ No newline at end of file +//>>built +define("dijit/form/nls/fi/ComboBox",({previousMessage:"Edelliset valinnat",nextMessage:"Lisää valintoja"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..daa672824 --- /dev/null +++ b/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/fi/ComboBox", //begin v1.x content +({ + previousMessage: "Edelliset valinnat", + nextMessage: "Lisää valintoja" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/fi/Textarea.js b/lib/dijit/form/nls/fi/Textarea.js index 5efaee957..be863528d 100644 --- a/lib/dijit/form/nls/fi/Textarea.js +++ b/lib/dijit/form/nls/fi/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"})
\ No newline at end of file +//>>built +define("dijit/form/nls/fi/Textarea",({iframeEditTitle:"muokkausalue",iframeFocusTitle:"muokkausalueen kehys"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js b/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js new file mode 100644 index 000000000..b9d4383b4 --- /dev/null +++ b/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/fi/Textarea", //begin v1.x content +({ + iframeEditTitle: 'muokkausalue', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'muokkausalueen kehys' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/fi/validate.js b/lib/dijit/form/nls/fi/validate.js index 276efcd29..4f897258f 100644 --- a/lib/dijit/form/nls/fi/validate.js +++ b/lib/dijit/form/nls/fi/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."})
\ No newline at end of file +//>>built +define("dijit/form/nls/fi/validate",({invalidMessage:"Annettu arvo ei kelpaa.",missingMessage:"Tämä arvo on pakollinen.",rangeMessage:"Tämä arvo on sallitun alueen ulkopuolella."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/fi/validate.js.uncompressed.js b/lib/dijit/form/nls/fi/validate.js.uncompressed.js new file mode 100644 index 000000000..5b568bc18 --- /dev/null +++ b/lib/dijit/form/nls/fi/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/fi/validate", //begin v1.x content +({ + invalidMessage: "Annettu arvo ei kelpaa.", + missingMessage: "Tämä arvo on pakollinen.", + rangeMessage: "Tämä arvo on sallitun alueen ulkopuolella." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/fr/ComboBox.js b/lib/dijit/form/nls/fr/ComboBox.js index 14b39762d..5b17cf9d6 100644 --- a/lib/dijit/form/nls/fr/ComboBox.js +++ b/lib/dijit/form/nls/fr/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Choix précédents","nextMessage":"Plus de choix"})
\ No newline at end of file +//>>built +define("dijit/form/nls/fr/ComboBox",({previousMessage:"Choix précédents",nextMessage:"Plus de choix"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..d5dfd7437 --- /dev/null +++ b/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/fr/ComboBox", //begin v1.x content +({ + previousMessage: "Choix précédents", + nextMessage: "Plus de choix" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/fr/Textarea.js b/lib/dijit/form/nls/fr/Textarea.js index 4abb6c3e9..d959610b3 100644 --- a/lib/dijit/form/nls/fr/Textarea.js +++ b/lib/dijit/form/nls/fr/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"})
\ No newline at end of file +//>>built +define("dijit/form/nls/fr/Textarea",({iframeEditTitle:"zone d'édition",iframeFocusTitle:"cadre de la zone d'édition"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js new file mode 100644 index 000000000..c5d32d7e4 --- /dev/null +++ b/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/fr/Textarea", //begin v1.x content +({ + iframeEditTitle: "zone d'édition", // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: "cadre de la zone d'édition" // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/fr/validate.js b/lib/dijit/form/nls/fr/validate.js index 95a016947..c5fecdcef 100644 --- a/lib/dijit/form/nls/fr/validate.js +++ b/lib/dijit/form/nls/fr/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."})
\ No newline at end of file +//>>built +define("dijit/form/nls/fr/validate",({invalidMessage:"La valeur indiquée n'est pas correcte.",missingMessage:"Cette valeur est requise.",rangeMessage:"Cette valeur n'est pas comprise dans la plage autorisée."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/fr/validate.js.uncompressed.js b/lib/dijit/form/nls/fr/validate.js.uncompressed.js new file mode 100644 index 000000000..cc4981ce2 --- /dev/null +++ b/lib/dijit/form/nls/fr/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/fr/validate", //begin v1.x content +({ + invalidMessage: "La valeur indiquée n'est pas correcte.", + missingMessage: "Cette valeur est requise.", + rangeMessage: "Cette valeur n'est pas comprise dans la plage autorisée." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/he/ComboBox.js b/lib/dijit/form/nls/he/ComboBox.js index 169d0f5ad..49eed434b 100644 --- a/lib/dijit/form/nls/he/ComboBox.js +++ b/lib/dijit/form/nls/he/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"})
\ No newline at end of file +//>>built +define("dijit/form/nls/he/ComboBox",({previousMessage:"האפשרויות הקודמות",nextMessage:"אפשרויות נוספות"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..907faf18b --- /dev/null +++ b/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/he/ComboBox", //begin v1.x content +({ + previousMessage: "האפשרויות הקודמות", + nextMessage: "אפשרויות נוספות" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/he/Textarea.js b/lib/dijit/form/nls/he/Textarea.js index 809eadfa7..8276f545d 100644 --- a/lib/dijit/form/nls/he/Textarea.js +++ b/lib/dijit/form/nls/he/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"})
\ No newline at end of file +//>>built +define("dijit/form/nls/he/Textarea",({iframeEditTitle:"אזור עריכה",iframeFocusTitle:"מסגרת אזור עריכה"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/he/Textarea.js.uncompressed.js b/lib/dijit/form/nls/he/Textarea.js.uncompressed.js new file mode 100644 index 000000000..92a762002 --- /dev/null +++ b/lib/dijit/form/nls/he/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/he/Textarea", //begin v1.x content +({ + iframeEditTitle: 'אזור עריכה', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'מסגרת אזור עריכה' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/he/validate.js b/lib/dijit/form/nls/he/validate.js index 3d778e2c9..097e29c25 100644 --- a/lib/dijit/form/nls/he/validate.js +++ b/lib/dijit/form/nls/he/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."})
\ No newline at end of file +//>>built +define("dijit/form/nls/he/validate",({invalidMessage:"הערך שצוין אינו חוקי.",missingMessage:"זהו ערך דרוש.",rangeMessage:"הערך מחוץ לטווח."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/he/validate.js.uncompressed.js b/lib/dijit/form/nls/he/validate.js.uncompressed.js new file mode 100644 index 000000000..c4121d1a7 --- /dev/null +++ b/lib/dijit/form/nls/he/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/he/validate", //begin v1.x content +({ + invalidMessage: "הערך שצוין אינו חוקי.", + missingMessage: "זהו ערך דרוש.", + rangeMessage: "הערך מחוץ לטווח." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/hr/ComboBox.js b/lib/dijit/form/nls/hr/ComboBox.js new file mode 100644 index 000000000..9b4e3c1c1 --- /dev/null +++ b/lib/dijit/form/nls/hr/ComboBox.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/nls/hr/ComboBox",({previousMessage:"Prethodni izbori",nextMessage:"Više izbora"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..c242142cd --- /dev/null +++ b/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js @@ -0,0 +1,6 @@ +define( +"dijit/form/nls/hr/ComboBox", ({ + previousMessage: "Prethodni izbori", + nextMessage: "Više izbora" +}) +); diff --git a/lib/dijit/form/nls/hr/Textarea.js b/lib/dijit/form/nls/hr/Textarea.js new file mode 100644 index 000000000..1b0e3e44f --- /dev/null +++ b/lib/dijit/form/nls/hr/Textarea.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/nls/hr/Textarea",({iframeEditTitle:"područje uređivanja",iframeFocusTitle:"okvir područja uređivanja"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js new file mode 100644 index 000000000..bfe511dc9 --- /dev/null +++ b/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/hr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users +({ + iframeEditTitle: 'područje uređivanja', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'okvir područja uređivanja' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +); diff --git a/lib/dijit/form/nls/hr/validate.js b/lib/dijit/form/nls/hr/validate.js new file mode 100644 index 000000000..e32be74df --- /dev/null +++ b/lib/dijit/form/nls/hr/validate.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/form/nls/hr/validate",({invalidMessage:"Unesena vrijednost nije važeća.",missingMessage:"Potrebna je ova vrijednost.",rangeMessage:"Ova vrijednost je izvan raspona."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/hr/validate.js.uncompressed.js b/lib/dijit/form/nls/hr/validate.js.uncompressed.js new file mode 100644 index 000000000..80784c8e1 --- /dev/null +++ b/lib/dijit/form/nls/hr/validate.js.uncompressed.js @@ -0,0 +1,7 @@ +define( +"dijit/form/nls/hr/validate", ({ + invalidMessage: "Unesena vrijednost nije važeća.", + missingMessage: "Potrebna je ova vrijednost.", + rangeMessage: "Ova vrijednost je izvan raspona." +}) +); diff --git a/lib/dijit/form/nls/hu/ComboBox.js b/lib/dijit/form/nls/hu/ComboBox.js index 4b6a620ad..0ac77e96b 100644 --- a/lib/dijit/form/nls/hu/ComboBox.js +++ b/lib/dijit/form/nls/hu/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"})
\ No newline at end of file +//>>built +define("dijit/form/nls/hu/ComboBox",({previousMessage:"Előző menüpontok",nextMessage:"További menüpontok"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..0ed25acfa --- /dev/null +++ b/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/hu/ComboBox", //begin v1.x content +({ + previousMessage: "Előző menüpontok", + nextMessage: "További menüpontok" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/hu/Textarea.js b/lib/dijit/form/nls/hu/Textarea.js index 9b4ca01a0..48d1249bf 100644 --- a/lib/dijit/form/nls/hu/Textarea.js +++ b/lib/dijit/form/nls/hu/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"szerkesztési terület","iframeFocusTitle":"szerkesztési terület keret"})
\ No newline at end of file +//>>built +define("dijit/form/nls/hu/Textarea",({iframeEditTitle:"szerkesztési terület",iframeFocusTitle:"szerkesztési terület keret"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js b/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js new file mode 100644 index 000000000..02afcf4e7 --- /dev/null +++ b/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/hu/Textarea", //begin v1.x content +({ + iframeEditTitle: 'szerkesztési terület', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'szerkesztési terület keret' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/hu/validate.js b/lib/dijit/form/nls/hu/validate.js index b6d7996a8..76a108340 100644 --- a/lib/dijit/form/nls/hu/validate.js +++ b/lib/dijit/form/nls/hu/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Az érték kívül van a megengedett tartományon.","invalidMessage":"A megadott érték érvénytelen.","missingMessage":"Meg kell adni egy értéket."})
\ No newline at end of file +//>>built +define("dijit/form/nls/hu/validate",({invalidMessage:"A megadott érték érvénytelen.",missingMessage:"Meg kell adni egy értéket.",rangeMessage:"Az érték kívül van a megengedett tartományon."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/hu/validate.js.uncompressed.js b/lib/dijit/form/nls/hu/validate.js.uncompressed.js new file mode 100644 index 000000000..919b15034 --- /dev/null +++ b/lib/dijit/form/nls/hu/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/hu/validate", //begin v1.x content +({ + invalidMessage: "A megadott érték érvénytelen.", + missingMessage: "Meg kell adni egy értéket.", + rangeMessage: "Az érték kívül van a megengedett tartományon." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/it/ComboBox.js b/lib/dijit/form/nls/it/ComboBox.js index 9f6707235..80392837a 100644 --- a/lib/dijit/form/nls/it/ComboBox.js +++ b/lib/dijit/form/nls/it/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"})
\ No newline at end of file +//>>built +define("dijit/form/nls/it/ComboBox",({previousMessage:"Scelte precedenti",nextMessage:"Altre scelte"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..e5826b345 --- /dev/null +++ b/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/it/ComboBox", //begin v1.x content +({ + previousMessage: "Scelte precedenti", + nextMessage: "Altre scelte" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/it/Textarea.js b/lib/dijit/form/nls/it/Textarea.js index 1b14ecc0c..ecf107197 100644 --- a/lib/dijit/form/nls/it/Textarea.js +++ b/lib/dijit/form/nls/it/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"})
\ No newline at end of file +//>>built +define("dijit/form/nls/it/Textarea",({iframeEditTitle:"modifica area",iframeFocusTitle:"modifica frame area"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/it/Textarea.js.uncompressed.js b/lib/dijit/form/nls/it/Textarea.js.uncompressed.js new file mode 100644 index 000000000..6df02c030 --- /dev/null +++ b/lib/dijit/form/nls/it/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/it/Textarea", //begin v1.x content +({ + iframeEditTitle: 'modifica area', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'modifica frame area' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/it/validate.js b/lib/dijit/form/nls/it/validate.js index af7227fde..4d439d539 100644 --- a/lib/dijit/form/nls/it/validate.js +++ b/lib/dijit/form/nls/it/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."})
\ No newline at end of file +//>>built +define("dijit/form/nls/it/validate",({invalidMessage:"Il valore immesso non è valido.",missingMessage:"Questo valore è obbligatorio.",rangeMessage:"Questo valore non è compreso nell'intervallo."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/it/validate.js.uncompressed.js b/lib/dijit/form/nls/it/validate.js.uncompressed.js new file mode 100644 index 000000000..115674276 --- /dev/null +++ b/lib/dijit/form/nls/it/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/it/validate", //begin v1.x content +({ + invalidMessage: "Il valore immesso non è valido.", + missingMessage: "Questo valore è obbligatorio.", + rangeMessage: "Questo valore non è compreso nell'intervallo." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ja/ComboBox.js b/lib/dijit/form/nls/ja/ComboBox.js index 6b34170b6..349f3f1df 100644 --- a/lib/dijit/form/nls/ja/ComboBox.js +++ b/lib/dijit/form/nls/ja/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ja/ComboBox",({previousMessage:"以前の選択項目",nextMessage:"追加の選択項目"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..f8d08892c --- /dev/null +++ b/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/ja/ComboBox", //begin v1.x content +({ + previousMessage: "以前の選択項目", + nextMessage: "追加の選択項目" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ja/Textarea.js b/lib/dijit/form/nls/ja/Textarea.js index 8a52f4a36..eb2a3d465 100644 --- a/lib/dijit/form/nls/ja/Textarea.js +++ b/lib/dijit/form/nls/ja/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ja/Textarea",({iframeEditTitle:"編集域",iframeFocusTitle:"編集域フレーム"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js new file mode 100644 index 000000000..87230ac19 --- /dev/null +++ b/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/ja/Textarea", //begin v1.x content +({ + iframeEditTitle: '編集域', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: '編集域フレーム' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ja/validate.js b/lib/dijit/form/nls/ja/validate.js index 450cd7e3e..4c4d9ef01 100644 --- a/lib/dijit/form/nls/ja/validate.js +++ b/lib/dijit/form/nls/ja/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ja/validate",({invalidMessage:"入力した値は無効です。",missingMessage:"この値は必須です。",rangeMessage:"この値は範囲外です。"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ja/validate.js.uncompressed.js b/lib/dijit/form/nls/ja/validate.js.uncompressed.js new file mode 100644 index 000000000..2ec91882e --- /dev/null +++ b/lib/dijit/form/nls/ja/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/ja/validate", //begin v1.x content +({ + invalidMessage: "入力した値は無効です。", + missingMessage: "この値は必須です。", + rangeMessage: "この値は範囲外です。" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/kk/ComboBox.js b/lib/dijit/form/nls/kk/ComboBox.js index edb918a9c..54debcefe 100644 --- a/lib/dijit/form/nls/kk/ComboBox.js +++ b/lib/dijit/form/nls/kk/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Алдыңғы нұсқалар","nextMessage":"Басқа нұсқалар"})
\ No newline at end of file +//>>built +define("dijit/form/nls/kk/ComboBox",({previousMessage:"Алдыңғы нұсқалар",nextMessage:"Басқа нұсқалар"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..b213b9c87 --- /dev/null +++ b/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/kk/ComboBox", //begin v1.x content +({ + previousMessage: "Алдыңғы нұсқалар", + nextMessage: "Басқа нұсқалар" +}) +//end v1.x content +); + diff --git a/lib/dijit/form/nls/kk/Textarea.js b/lib/dijit/form/nls/kk/Textarea.js index 617fcb91e..45ee0dcfa 100644 --- a/lib/dijit/form/nls/kk/Textarea.js +++ b/lib/dijit/form/nls/kk/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"өңдеу аумағы","iframeFocusTitle":"өңдеу аумағының жақтауы"})
\ No newline at end of file +//>>built +define("dijit/form/nls/kk/Textarea",({iframeEditTitle:"өңдеу аумағы",iframeFocusTitle:"өңдеу аумағының жақтауы"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js b/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js new file mode 100644 index 000000000..44bccd3ae --- /dev/null +++ b/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js @@ -0,0 +1,12 @@ +define( +"dijit/form/nls/kk/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'өңдеу аумағы', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'өңдеу аумағының жақтауы' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); + diff --git a/lib/dijit/form/nls/kk/validate.js b/lib/dijit/form/nls/kk/validate.js index d67612119..26b667317 100644 --- a/lib/dijit/form/nls/kk/validate.js +++ b/lib/dijit/form/nls/kk/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Бұл мән ауқымнан тыс.","invalidMessage":"Енгізілген мән жарамды емес.","missingMessage":"Бұл мән міндетті."})
\ No newline at end of file +//>>built +define("dijit/form/nls/kk/validate",({invalidMessage:"Енгізілген мән жарамды емес.",missingMessage:"Бұл мән міндетті.",rangeMessage:"Бұл мән ауқымнан тыс."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/kk/validate.js.uncompressed.js b/lib/dijit/form/nls/kk/validate.js.uncompressed.js new file mode 100644 index 000000000..1d0bb1b1d --- /dev/null +++ b/lib/dijit/form/nls/kk/validate.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/kk/validate", //begin v1.x content +({ + invalidMessage: "Енгізілген мән жарамды емес.", + missingMessage: "Бұл мән міндетті.", + rangeMessage: "Бұл мән ауқымнан тыс." +}) +//end v1.x content +); + diff --git a/lib/dijit/form/nls/ko/ComboBox.js b/lib/dijit/form/nls/ko/ComboBox.js index 87d0f0649..a35baf820 100644 --- a/lib/dijit/form/nls/ko/ComboBox.js +++ b/lib/dijit/form/nls/ko/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ko/ComboBox",({previousMessage:"이전 선택사항",nextMessage:"기타 선택사항"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..97b209cda --- /dev/null +++ b/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/ko/ComboBox", //begin v1.x content +({ + previousMessage: "이전 선택사항", + nextMessage: "기타 선택사항" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ko/Textarea.js b/lib/dijit/form/nls/ko/Textarea.js index 5c4e91622..9232a0753 100644 --- a/lib/dijit/form/nls/ko/Textarea.js +++ b/lib/dijit/form/nls/ko/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ko/Textarea",({iframeEditTitle:"편집 영역",iframeFocusTitle:"편집 영역 프레임"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js new file mode 100644 index 000000000..1ac40771e --- /dev/null +++ b/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/ko/Textarea", //begin v1.x content +({ + iframeEditTitle: '편집 영역', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: '편집 영역 프레임' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ko/validate.js b/lib/dijit/form/nls/ko/validate.js index c76c67640..233702921 100644 --- a/lib/dijit/form/nls/ko/validate.js +++ b/lib/dijit/form/nls/ko/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."})
\ No newline at end of file +//>>built +define("dijit/form/nls/ko/validate",({invalidMessage:"입력된 값이 올바르지 않습니다.",missingMessage:"이 값은 필수입니다.",rangeMessage:"이 값은 범위를 벗어납니다."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ko/validate.js.uncompressed.js b/lib/dijit/form/nls/ko/validate.js.uncompressed.js new file mode 100644 index 000000000..e0df76239 --- /dev/null +++ b/lib/dijit/form/nls/ko/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/ko/validate", //begin v1.x content +({ + invalidMessage: "입력된 값이 올바르지 않습니다.", + missingMessage: "이 값은 필수입니다.", + rangeMessage: "이 값은 범위를 벗어납니다." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/nb/ComboBox.js b/lib/dijit/form/nls/nb/ComboBox.js index de145542f..9a69fcbf3 100644 --- a/lib/dijit/form/nls/nb/ComboBox.js +++ b/lib/dijit/form/nls/nb/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Tidligere valg","nextMessage":"Flere valg"})
\ No newline at end of file +//>>built +define("dijit/form/nls/nb/ComboBox",({previousMessage:"Tidligere valg",nextMessage:"Flere valg"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..a0bfbd944 --- /dev/null +++ b/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/nb/ComboBox", //begin v1.x content +({ + previousMessage: "Tidligere valg", + nextMessage: "Flere valg" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/nb/Textarea.js b/lib/dijit/form/nls/nb/Textarea.js index 16fadf59c..8708bd7f8 100644 --- a/lib/dijit/form/nls/nb/Textarea.js +++ b/lib/dijit/form/nls/nb/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme for redigeringsområde"})
\ No newline at end of file +//>>built +define("dijit/form/nls/nb/Textarea",({iframeEditTitle:"redigeringsområde",iframeFocusTitle:"ramme for redigeringsområde"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js b/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js new file mode 100644 index 000000000..79a0a5072 --- /dev/null +++ b/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/nb/Textarea", //begin v1.x content +({ + iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'ramme for redigeringsområde' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/nb/validate.js b/lib/dijit/form/nls/nb/validate.js index 2fe96f263..2c82655c5 100644 --- a/lib/dijit/form/nls/nb/validate.js +++ b/lib/dijit/form/nls/nb/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."})
\ No newline at end of file +//>>built +define("dijit/form/nls/nb/validate",({invalidMessage:"Den angitte verdien er ikke gyldig.",missingMessage:"Denne verdien er obligatorisk.",rangeMessage:"Denne verdien er utenfor gyldig område."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/nb/validate.js.uncompressed.js b/lib/dijit/form/nls/nb/validate.js.uncompressed.js new file mode 100644 index 000000000..061c798b1 --- /dev/null +++ b/lib/dijit/form/nls/nb/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/nb/validate", //begin v1.x content +({ + invalidMessage: "Den angitte verdien er ikke gyldig.", + missingMessage: "Denne verdien er obligatorisk.", + rangeMessage: "Denne verdien er utenfor gyldig område." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/nl/ComboBox.js b/lib/dijit/form/nls/nl/ComboBox.js index b5885d75e..2c332212e 100644 --- a/lib/dijit/form/nls/nl/ComboBox.js +++ b/lib/dijit/form/nls/nl/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Eerdere opties","nextMessage":"Meer opties"})
\ No newline at end of file +//>>built +define("dijit/form/nls/nl/ComboBox",({previousMessage:"Eerdere opties",nextMessage:"Meer opties"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..6cfa476f1 --- /dev/null +++ b/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/nl/ComboBox", //begin v1.x content +({ + previousMessage: "Eerdere opties", + nextMessage: "Meer opties" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/nl/Textarea.js b/lib/dijit/form/nls/nl/Textarea.js index d13c3a6e5..78115bc3f 100644 --- a/lib/dijit/form/nls/nl/Textarea.js +++ b/lib/dijit/form/nls/nl/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"})
\ No newline at end of file +//>>built +define("dijit/form/nls/nl/Textarea",({iframeEditTitle:"veld bewerken",iframeFocusTitle:"veldkader bewerken"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js new file mode 100644 index 000000000..0d1d8b3ec --- /dev/null +++ b/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/nl/Textarea", //begin v1.x content +({ + iframeEditTitle: 'veld bewerken', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'veldkader bewerken' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/nl/validate.js b/lib/dijit/form/nls/nl/validate.js index b3062c145..f92fac025 100644 --- a/lib/dijit/form/nls/nl/validate.js +++ b/lib/dijit/form/nls/nl/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."})
\ No newline at end of file +//>>built +define("dijit/form/nls/nl/validate",({invalidMessage:"De opgegeven waarde is ongeldig.",missingMessage:"Deze waarde is verplicht.",rangeMessage:"Deze waarde is niet toegestaan."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/nl/validate.js.uncompressed.js b/lib/dijit/form/nls/nl/validate.js.uncompressed.js new file mode 100644 index 000000000..269cf4d45 --- /dev/null +++ b/lib/dijit/form/nls/nl/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/nl/validate", //begin v1.x content +({ + invalidMessage: "De opgegeven waarde is ongeldig.", + missingMessage: "Deze waarde is verplicht.", + rangeMessage: "Deze waarde is niet toegestaan." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pl/ComboBox.js b/lib/dijit/form/nls/pl/ComboBox.js index f2b4b08a3..9dbfe8352 100644 --- a/lib/dijit/form/nls/pl/ComboBox.js +++ b/lib/dijit/form/nls/pl/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"})
\ No newline at end of file +//>>built +define("dijit/form/nls/pl/ComboBox",({previousMessage:"Poprzednie wybory",nextMessage:"Więcej wyborów"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..ab668c282 --- /dev/null +++ b/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/pl/ComboBox", //begin v1.x content +({ + previousMessage: "Poprzednie wybory", + nextMessage: "Więcej wyborów" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pl/Textarea.js b/lib/dijit/form/nls/pl/Textarea.js index 33b050a1d..1e83b604a 100644 --- a/lib/dijit/form/nls/pl/Textarea.js +++ b/lib/dijit/form/nls/pl/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"edycja obszaru","iframeFocusTitle":"edycja ramki obszaru"})
\ No newline at end of file +//>>built +define("dijit/form/nls/pl/Textarea",({iframeEditTitle:"edycja obszaru",iframeFocusTitle:"edycja ramki obszaru"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js new file mode 100644 index 000000000..bb7a13e55 --- /dev/null +++ b/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/pl/Textarea", //begin v1.x content +({ + iframeEditTitle: 'edycja obszaru', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'edycja ramki obszaru' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pl/validate.js b/lib/dijit/form/nls/pl/validate.js index cf05d2f95..2a6a12893 100644 --- a/lib/dijit/form/nls/pl/validate.js +++ b/lib/dijit/form/nls/pl/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."})
\ No newline at end of file +//>>built +define("dijit/form/nls/pl/validate",({invalidMessage:"Wprowadzona wartość jest niepoprawna.",missingMessage:"Ta wartość jest wymagana.",rangeMessage:"Ta wartość jest spoza zakresu."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pl/validate.js.uncompressed.js b/lib/dijit/form/nls/pl/validate.js.uncompressed.js new file mode 100644 index 000000000..91dc973cb --- /dev/null +++ b/lib/dijit/form/nls/pl/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/pl/validate", //begin v1.x content +({ + invalidMessage: "Wprowadzona wartość jest niepoprawna.", + missingMessage: "Ta wartość jest wymagana.", + rangeMessage: "Ta wartość jest spoza zakresu." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pt-pt/ComboBox.js b/lib/dijit/form/nls/pt-pt/ComboBox.js index 254054241..8d7421cd4 100644 --- a/lib/dijit/form/nls/pt-pt/ComboBox.js +++ b/lib/dijit/form/nls/pt-pt/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"})
\ No newline at end of file +//>>built +define("dijit/form/nls/pt-pt/ComboBox",({previousMessage:"Opções anteriores",nextMessage:"Mais opções"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..2a24c4cb7 --- /dev/null +++ b/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/pt-pt/ComboBox", //begin v1.x content +({ + previousMessage: "Opções anteriores", + nextMessage: "Mais opções" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pt-pt/Textarea.js b/lib/dijit/form/nls/pt-pt/Textarea.js index bcd75e781..d9390a2f0 100644 --- a/lib/dijit/form/nls/pt-pt/Textarea.js +++ b/lib/dijit/form/nls/pt-pt/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"área de edição","iframeFocusTitle":"painel da área de edição"})
\ No newline at end of file +//>>built +define("dijit/form/nls/pt-pt/Textarea",({iframeEditTitle:"área de edição",iframeFocusTitle:"painel da área de edição"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js new file mode 100644 index 000000000..b2cf2f453 --- /dev/null +++ b/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/pt-pt/Textarea", //begin v1.x content +({ + iframeEditTitle: 'área de edição', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'painel da área de edição' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pt-pt/validate.js b/lib/dijit/form/nls/pt-pt/validate.js index 3d921704d..85492c62c 100644 --- a/lib/dijit/form/nls/pt-pt/validate.js +++ b/lib/dijit/form/nls/pt-pt/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."})
\ No newline at end of file +//>>built +define("dijit/form/nls/pt-pt/validate",({invalidMessage:"O valor introduzido não é válido.",missingMessage:"Este valor é requerido.",rangeMessage:"Este valor encontra-se fora do intervalo."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js new file mode 100644 index 000000000..625b062b9 --- /dev/null +++ b/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/pt-pt/validate", //begin v1.x content +({ + invalidMessage: "O valor introduzido não é válido.", + missingMessage: "Este valor é requerido.", + rangeMessage: "Este valor encontra-se fora do intervalo." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pt/ComboBox.js b/lib/dijit/form/nls/pt/ComboBox.js index 254054241..10ea3f67d 100644 --- a/lib/dijit/form/nls/pt/ComboBox.js +++ b/lib/dijit/form/nls/pt/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"})
\ No newline at end of file +//>>built +define("dijit/form/nls/pt/ComboBox",({previousMessage:"Opções anteriores",nextMessage:"Mais opções"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..b4c8367be --- /dev/null +++ b/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/pt/ComboBox", //begin v1.x content +({ + previousMessage: "Opções anteriores", + nextMessage: "Mais opções" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pt/Textarea.js b/lib/dijit/form/nls/pt/Textarea.js index b4a0b0fad..8fd88d871 100644 --- a/lib/dijit/form/nls/pt/Textarea.js +++ b/lib/dijit/form/nls/pt/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"editar área","iframeFocusTitle":"editar quadro da área"})
\ No newline at end of file +//>>built +define("dijit/form/nls/pt/Textarea",({iframeEditTitle:"editar área",iframeFocusTitle:"editar quadro da área"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js new file mode 100644 index 000000000..08bd6d6ed --- /dev/null +++ b/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/pt/Textarea", //begin v1.x content +({ + iframeEditTitle: 'editar área', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'editar quadro da área' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/pt/validate.js b/lib/dijit/form/nls/pt/validate.js index 3b4357999..014847826 100644 --- a/lib/dijit/form/nls/pt/validate.js +++ b/lib/dijit/form/nls/pt/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."})
\ No newline at end of file +//>>built +define("dijit/form/nls/pt/validate",({invalidMessage:"O valor inserido não é válido.",missingMessage:"Este valor é necessário.",rangeMessage:"Este valor está fora do intervalo. "}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/pt/validate.js.uncompressed.js b/lib/dijit/form/nls/pt/validate.js.uncompressed.js new file mode 100644 index 000000000..592caf7db --- /dev/null +++ b/lib/dijit/form/nls/pt/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/pt/validate", //begin v1.x content +({ + invalidMessage: "O valor inserido não é válido.", + missingMessage: "Este valor é necessário.", + rangeMessage: "Este valor está fora do intervalo. " +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ro/ComboBox.js b/lib/dijit/form/nls/ro/ComboBox.js index f491a1135..a2d5810a2 100644 --- a/lib/dijit/form/nls/ro/ComboBox.js +++ b/lib/dijit/form/nls/ro/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Alegeri anterioare","nextMessage":"Mai multe alegeri"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ro/ComboBox",({previousMessage:"Alegeri anterioare",nextMessage:"Mai multe alegeri"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..05864f56e --- /dev/null +++ b/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/ro/ComboBox", //begin v1.x content +({ + previousMessage: "Alegeri anterioare", + nextMessage: "Mai multe alegeri" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/ro/Textarea.js b/lib/dijit/form/nls/ro/Textarea.js index 2e029d964..30409dfa5 100644 --- a/lib/dijit/form/nls/ro/Textarea.js +++ b/lib/dijit/form/nls/ro/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"zonă de editare","iframeFocusTitle":"cadru zonă de editare"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ro/Textarea",({iframeEditTitle:"zonă de editare",iframeFocusTitle:"cadru zonă de editare"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js new file mode 100644 index 000000000..ca92074f9 --- /dev/null +++ b/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js @@ -0,0 +1,12 @@ +define( +"dijit/form/nls/ro/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'zonă de editare', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'cadru zonă de editare' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/ro/validate.js b/lib/dijit/form/nls/ro/validate.js index f0892c76a..94eefb49f 100644 --- a/lib/dijit/form/nls/ro/validate.js +++ b/lib/dijit/form/nls/ro/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Această valoare este în afara intervalului. ","invalidMessage":"Valoarea introdusă nu este validă.","missingMessage":"Această valoare este necesară."})
\ No newline at end of file +//>>built +define("dijit/form/nls/ro/validate",({invalidMessage:"Valoarea introdusă nu este validă.",missingMessage:"Această valoare este necesară.",rangeMessage:"Această valoare este în afara intervalului. "}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ro/validate.js.uncompressed.js b/lib/dijit/form/nls/ro/validate.js.uncompressed.js new file mode 100644 index 000000000..165ed83fa --- /dev/null +++ b/lib/dijit/form/nls/ro/validate.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/ro/validate", //begin v1.x content +({ + invalidMessage: "Valoarea introdusă nu este validă.", + missingMessage: "Această valoare este necesară.", + rangeMessage: "Această valoare este în afara intervalului. " +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/ru/ComboBox.js b/lib/dijit/form/nls/ru/ComboBox.js index 193f4ee33..7c1c483f4 100644 --- a/lib/dijit/form/nls/ru/ComboBox.js +++ b/lib/dijit/form/nls/ru/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ru/ComboBox",({previousMessage:"Предыдущие варианты",nextMessage:"Следующие варианты"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..f807e9e0d --- /dev/null +++ b/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/ru/ComboBox", //begin v1.x content +({ + previousMessage: "Предыдущие варианты", + nextMessage: "Следующие варианты" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ru/Textarea.js b/lib/dijit/form/nls/ru/Textarea.js index ad7ad22fa..0f11acfec 100644 --- a/lib/dijit/form/nls/ru/Textarea.js +++ b/lib/dijit/form/nls/ru/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"область редактирования","iframeFocusTitle":"фрейм области редактирования"})
\ No newline at end of file +//>>built +define("dijit/form/nls/ru/Textarea",({iframeEditTitle:"область редактирования",iframeFocusTitle:"фрейм области редактирования"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js new file mode 100644 index 000000000..e1d7da6a9 --- /dev/null +++ b/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/ru/Textarea", //begin v1.x content +({ + iframeEditTitle: 'область редактирования', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'фрейм области редактирования' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/ru/validate.js b/lib/dijit/form/nls/ru/validate.js index 35fb5ca29..72e41ac20 100644 --- a/lib/dijit/form/nls/ru/validate.js +++ b/lib/dijit/form/nls/ru/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."})
\ No newline at end of file +//>>built +define("dijit/form/nls/ru/validate",({invalidMessage:"Указано недопустимое значение.",missingMessage:"Это обязательное значение.",rangeMessage:"Это значение вне диапазона."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/ru/validate.js.uncompressed.js b/lib/dijit/form/nls/ru/validate.js.uncompressed.js new file mode 100644 index 000000000..bcacc1116 --- /dev/null +++ b/lib/dijit/form/nls/ru/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/ru/validate", //begin v1.x content +({ + invalidMessage: "Указано недопустимое значение.", + missingMessage: "Это обязательное значение.", + rangeMessage: "Это значение вне диапазона." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/sk/ComboBox.js b/lib/dijit/form/nls/sk/ComboBox.js index a45c7f236..798051638 100644 --- a/lib/dijit/form/nls/sk/ComboBox.js +++ b/lib/dijit/form/nls/sk/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Predchádzajúce voľby","nextMessage":"Ďalšie voľby"})
\ No newline at end of file +//>>built +define("dijit/form/nls/sk/ComboBox",({previousMessage:"Predchádzajúce voľby",nextMessage:"Ďalšie voľby"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..2ce093a9b --- /dev/null +++ b/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/sk/ComboBox", //begin v1.x content +({ + previousMessage: "Predchádzajúce voľby", + nextMessage: "Ďalšie voľby" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/sk/Textarea.js b/lib/dijit/form/nls/sk/Textarea.js index 3ee98c355..003b04757 100644 --- a/lib/dijit/form/nls/sk/Textarea.js +++ b/lib/dijit/form/nls/sk/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"upraviť oblasť","iframeFocusTitle":"upraviť rám oblasti"})
\ No newline at end of file +//>>built +define("dijit/form/nls/sk/Textarea",({iframeEditTitle:"upraviť oblasť",iframeFocusTitle:"upraviť rám oblasti"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js new file mode 100644 index 000000000..6386d33c9 --- /dev/null +++ b/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js @@ -0,0 +1,12 @@ +define( +"dijit/form/nls/sk/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'upraviť oblasť', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'upraviť rám oblasti' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/sk/validate.js b/lib/dijit/form/nls/sk/validate.js index 612dab57e..d5b9883a5 100644 --- a/lib/dijit/form/nls/sk/validate.js +++ b/lib/dijit/form/nls/sk/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."})
\ No newline at end of file +//>>built +define("dijit/form/nls/sk/validate",({invalidMessage:"Zadaná hodnota nie je platná.",missingMessage:"Táto hodnota je vyžadovaná.",rangeMessage:"Táto hodnota je mimo rozsah."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sk/validate.js.uncompressed.js b/lib/dijit/form/nls/sk/validate.js.uncompressed.js new file mode 100644 index 000000000..a9efd9c1c --- /dev/null +++ b/lib/dijit/form/nls/sk/validate.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/sk/validate", //begin v1.x content +({ + invalidMessage: "Zadaná hodnota nie je platná.", + missingMessage: "Táto hodnota je vyžadovaná.", + rangeMessage: "Táto hodnota je mimo rozsah." +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/sl/ComboBox.js b/lib/dijit/form/nls/sl/ComboBox.js index 61d4469c6..1f72eee5a 100644 --- a/lib/dijit/form/nls/sl/ComboBox.js +++ b/lib/dijit/form/nls/sl/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Prejšnje izbire","nextMessage":"Dodatne izbire"})
\ No newline at end of file +//>>built +define("dijit/form/nls/sl/ComboBox",({previousMessage:"Prejšnje izbire",nextMessage:"Dodatne izbire"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..4b28199f7 --- /dev/null +++ b/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/sl/ComboBox", //begin v1.x content +({ + previousMessage: "Prejšnje izbire", + nextMessage: "Dodatne izbire" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/sl/Textarea.js b/lib/dijit/form/nls/sl/Textarea.js index 0e0d51175..6f9717d44 100644 --- a/lib/dijit/form/nls/sl/Textarea.js +++ b/lib/dijit/form/nls/sl/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"urejevalno področje","iframeFocusTitle":"okvir urejevalnega področja"})
\ No newline at end of file +//>>built +define("dijit/form/nls/sl/Textarea",({iframeEditTitle:"urejevalno področje",iframeFocusTitle:"okvir urejevalnega področja"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js new file mode 100644 index 000000000..ce65dc984 --- /dev/null +++ b/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js @@ -0,0 +1,12 @@ +define( +"dijit/form/nls/sl/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'urejevalno področje', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'okvir urejevalnega področja' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/sl/validate.js b/lib/dijit/form/nls/sl/validate.js index b84b35350..4cbe99bef 100644 --- a/lib/dijit/form/nls/sl/validate.js +++ b/lib/dijit/form/nls/sl/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."})
\ No newline at end of file +//>>built +define("dijit/form/nls/sl/validate",({invalidMessage:"Vnesena vrednost ni veljavna.",missingMessage:"Ta vrednost je zahtevana.",rangeMessage:"Ta vrednost je izven območja."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sl/validate.js.uncompressed.js b/lib/dijit/form/nls/sl/validate.js.uncompressed.js new file mode 100644 index 000000000..ffa3e0fd4 --- /dev/null +++ b/lib/dijit/form/nls/sl/validate.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/sl/validate", //begin v1.x content +({ + invalidMessage: "Vnesena vrednost ni veljavna.", + missingMessage: "Ta vrednost je zahtevana.", + rangeMessage: "Ta vrednost je izven območja." +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/sv/ComboBox.js b/lib/dijit/form/nls/sv/ComboBox.js index 860bf75a7..804ca0fb5 100644 --- a/lib/dijit/form/nls/sv/ComboBox.js +++ b/lib/dijit/form/nls/sv/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"})
\ No newline at end of file +//>>built +define("dijit/form/nls/sv/ComboBox",({previousMessage:"Föregående alternativ",nextMessage:"Fler alternativ"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..6c1dad3ec --- /dev/null +++ b/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/sv/ComboBox", //begin v1.x content +({ + previousMessage: "Föregående alternativ", + nextMessage: "Fler alternativ" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/sv/Textarea.js b/lib/dijit/form/nls/sv/Textarea.js index 9e508ac7b..d7110e6d3 100644 --- a/lib/dijit/form/nls/sv/Textarea.js +++ b/lib/dijit/form/nls/sv/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"redigeringsområdesram"})
\ No newline at end of file +//>>built +define("dijit/form/nls/sv/Textarea",({iframeEditTitle:"redigeringsområde",iframeFocusTitle:"redigeringsområdesram"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js new file mode 100644 index 000000000..ec08afa29 --- /dev/null +++ b/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/sv/Textarea", //begin v1.x content +({ + iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'redigeringsområdesram' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/sv/validate.js b/lib/dijit/form/nls/sv/validate.js index 8c1b537bd..3cccc47dc 100644 --- a/lib/dijit/form/nls/sv/validate.js +++ b/lib/dijit/form/nls/sv/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."})
\ No newline at end of file +//>>built +define("dijit/form/nls/sv/validate",({invalidMessage:"Det angivna värdet är ogiltigt.",missingMessage:"Värdet är obligatoriskt.",rangeMessage:"Värdet är utanför intervallet."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/sv/validate.js.uncompressed.js b/lib/dijit/form/nls/sv/validate.js.uncompressed.js new file mode 100644 index 000000000..0c4c74757 --- /dev/null +++ b/lib/dijit/form/nls/sv/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/sv/validate", //begin v1.x content +({ + invalidMessage: "Det angivna värdet är ogiltigt.", + missingMessage: "Värdet är obligatoriskt.", + rangeMessage: "Värdet är utanför intervallet." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/th/ComboBox.js b/lib/dijit/form/nls/th/ComboBox.js index ff32a4fe7..9ea370d79 100644 --- a/lib/dijit/form/nls/th/ComboBox.js +++ b/lib/dijit/form/nls/th/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"})
\ No newline at end of file +//>>built +define("dijit/form/nls/th/ComboBox",({previousMessage:"การเลือกก่อนหน้า",nextMessage:"การเลือกเพิ่มเติม"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..e9288d8eb --- /dev/null +++ b/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/th/ComboBox", //begin v1.x content +({ + previousMessage: "การเลือกก่อนหน้า", + nextMessage: "การเลือกเพิ่มเติม" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/th/Textarea.js b/lib/dijit/form/nls/th/Textarea.js index 436118314..a5a4ea132 100644 --- a/lib/dijit/form/nls/th/Textarea.js +++ b/lib/dijit/form/nls/th/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"แก้ไขพื้นที่","iframeFocusTitle":"แก้ไขกรอบพื้นที่"})
\ No newline at end of file +//>>built +define("dijit/form/nls/th/Textarea",({iframeEditTitle:"แก้ไขพื้นที่",iframeFocusTitle:"แก้ไขกรอบพื้นที่"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/th/Textarea.js.uncompressed.js b/lib/dijit/form/nls/th/Textarea.js.uncompressed.js new file mode 100644 index 000000000..0ca1b672d --- /dev/null +++ b/lib/dijit/form/nls/th/Textarea.js.uncompressed.js @@ -0,0 +1,12 @@ +define( +"dijit/form/nls/th/Textarea", //begin v1.x content +/* used by both the editor and textarea widgets to provide information to screen reader users */ +({ + iframeEditTitle: 'แก้ไขพื้นที่', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'แก้ไขกรอบพื้นที่' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/th/validate.js b/lib/dijit/form/nls/th/validate.js index 86606b774..337e33372 100644 --- a/lib/dijit/form/nls/th/validate.js +++ b/lib/dijit/form/nls/th/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"})
\ No newline at end of file +//>>built +define("dijit/form/nls/th/validate",({invalidMessage:"ค่าที่ป้อนไม่ถูกต้อง",missingMessage:"จำเป็นต้องมีค่านี้",rangeMessage:"ค่านี้เกินช่วง"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/th/validate.js.uncompressed.js b/lib/dijit/form/nls/th/validate.js.uncompressed.js new file mode 100644 index 000000000..e0b3a04a6 --- /dev/null +++ b/lib/dijit/form/nls/th/validate.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/th/validate", //begin v1.x content +({ + invalidMessage: "ค่าที่ป้อนไม่ถูกต้อง", + missingMessage: "จำเป็นต้องมีค่านี้", + rangeMessage: "ค่านี้เกินช่วง" +}) + +//end v1.x content +); diff --git a/lib/dijit/form/nls/tr/ComboBox.js b/lib/dijit/form/nls/tr/ComboBox.js index 46f71dc8a..ce24c2df4 100644 --- a/lib/dijit/form/nls/tr/ComboBox.js +++ b/lib/dijit/form/nls/tr/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"})
\ No newline at end of file +//>>built +define("dijit/form/nls/tr/ComboBox",({previousMessage:"Önceki seçenekler",nextMessage:"Diğer seçenekler"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..6c4f31957 --- /dev/null +++ b/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/tr/ComboBox", //begin v1.x content +({ + previousMessage: "Önceki seçenekler", + nextMessage: "Diğer seçenekler" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/tr/Textarea.js b/lib/dijit/form/nls/tr/Textarea.js index 3f2b5e71d..637c3ac5a 100644 --- a/lib/dijit/form/nls/tr/Textarea.js +++ b/lib/dijit/form/nls/tr/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"düzenleme alanı","iframeFocusTitle":"düzenleme alanı çerçevesi"})
\ No newline at end of file +//>>built +define("dijit/form/nls/tr/Textarea",({iframeEditTitle:"düzenleme alanı",iframeFocusTitle:"düzenleme alanı çerçevesi"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js new file mode 100644 index 000000000..6406bd177 --- /dev/null +++ b/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/tr/Textarea", //begin v1.x content +({ + iframeEditTitle: 'düzenleme alanı', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: 'düzenleme alanı çerçevesi' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/tr/validate.js b/lib/dijit/form/nls/tr/validate.js index 838dbdaed..fc1b859a5 100644 --- a/lib/dijit/form/nls/tr/validate.js +++ b/lib/dijit/form/nls/tr/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."})
\ No newline at end of file +//>>built +define("dijit/form/nls/tr/validate",({invalidMessage:"Girilen değer geçersiz.",missingMessage:"Bu değer gerekli.",rangeMessage:"Bu değer aralık dışında."}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/tr/validate.js.uncompressed.js b/lib/dijit/form/nls/tr/validate.js.uncompressed.js new file mode 100644 index 000000000..acee03a0a --- /dev/null +++ b/lib/dijit/form/nls/tr/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/tr/validate", //begin v1.x content +({ + invalidMessage: "Girilen değer geçersiz.", + missingMessage: "Bu değer gerekli.", + rangeMessage: "Bu değer aralık dışında." +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/validate.js b/lib/dijit/form/nls/validate.js index 29a1a476b..d1219b98c 100644 --- a/lib/dijit/form/nls/validate.js +++ b/lib/dijit/form/nls/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."})
\ No newline at end of file +//>>built +define("dijit/form/nls/validate",{root:({invalidMessage:"The value entered is not valid.",missingMessage:"This value is required.",rangeMessage:"This value is out of range."}),"zh":true,"zh-tw":true,"tr":true,"th":true,"sv":true,"sl":true,"sk":true,"ru":true,"ro":true,"pt":true,"pt-pt":true,"pl":true,"nl":true,"nb":true,"ko":true,"kk":true,"ja":true,"it":true,"hu":true,"hr":true,"he":true,"fr":true,"fi":true,"es":true,"el":true,"de":true,"da":true,"cs":true,"ca":true,"az":true,"ar":true});
\ No newline at end of file diff --git a/lib/dijit/form/nls/validate.js.uncompressed.js b/lib/dijit/form/nls/validate.js.uncompressed.js new file mode 100644 index 000000000..421ddb51a --- /dev/null +++ b/lib/dijit/form/nls/validate.js.uncompressed.js @@ -0,0 +1,41 @@ +define("dijit/form/nls/validate", { root: +//begin v1.x content +({ + invalidMessage: "The value entered is not valid.", + missingMessage: "This value is required.", + rangeMessage: "This value is out of range." +}) +//end v1.x content +, +"zh": true, +"zh-tw": true, +"tr": true, +"th": true, +"sv": true, +"sl": true, +"sk": true, +"ru": true, +"ro": true, +"pt": true, +"pt-pt": true, +"pl": true, +"nl": true, +"nb": true, +"ko": true, +"kk": true, +"ja": true, +"it": true, +"hu": true, +"hr": true, +"he": true, +"fr": true, +"fi": true, +"es": true, +"el": true, +"de": true, +"da": true, +"cs": true, +"ca": true, +"az": true, +"ar": true +}); diff --git a/lib/dijit/form/nls/zh-tw/ComboBox.js b/lib/dijit/form/nls/zh-tw/ComboBox.js index ead5fa6b2..344747db7 100644 --- a/lib/dijit/form/nls/zh-tw/ComboBox.js +++ b/lib/dijit/form/nls/zh-tw/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"})
\ No newline at end of file +//>>built +define("dijit/form/nls/zh-tw/ComboBox",({previousMessage:"前一個選擇項",nextMessage:"其他選擇項"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..dbcf05530 --- /dev/null +++ b/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/zh-tw/ComboBox", //begin v1.x content +({ + previousMessage: "前一個選擇項", + nextMessage: "其他選擇項" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/zh-tw/Textarea.js b/lib/dijit/form/nls/zh-tw/Textarea.js index cb7abda29..df98f9eab 100644 --- a/lib/dijit/form/nls/zh-tw/Textarea.js +++ b/lib/dijit/form/nls/zh-tw/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"編輯區","iframeFocusTitle":"編輯區框"})
\ No newline at end of file +//>>built +define("dijit/form/nls/zh-tw/Textarea",({iframeEditTitle:"編輯區",iframeFocusTitle:"編輯區框"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js new file mode 100644 index 000000000..825ebbbd4 --- /dev/null +++ b/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/zh-tw/Textarea", //begin v1.x content +({ + iframeEditTitle: '編輯區', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: '編輯區框' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/zh-tw/validate.js b/lib/dijit/form/nls/zh-tw/validate.js index b398a31ae..7e0352175 100644 --- a/lib/dijit/form/nls/zh-tw/validate.js +++ b/lib/dijit/form/nls/zh-tw/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"})
\ No newline at end of file +//>>built +define("dijit/form/nls/zh-tw/validate",({invalidMessage:"輸入的值無效。",missingMessage:"必須提供此值。",rangeMessage:"此值超出範圍。"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js new file mode 100644 index 000000000..7cc5e08fb --- /dev/null +++ b/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/zh-tw/validate", //begin v1.x content +({ + invalidMessage: "輸入的值無效。", + missingMessage: "必須提供此值。", + rangeMessage: "此值超出範圍。" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/zh/ComboBox.js b/lib/dijit/form/nls/zh/ComboBox.js index 7cc92cf1d..2fc14ae0d 100644 --- a/lib/dijit/form/nls/zh/ComboBox.js +++ b/lib/dijit/form/nls/zh/ComboBox.js @@ -1 +1,2 @@ -({"previousMessage":"先前选项","nextMessage":"更多选项"})
\ No newline at end of file +//>>built +define("dijit/form/nls/zh/ComboBox",({previousMessage:"先前选项",nextMessage:"更多选项"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js new file mode 100644 index 000000000..346794a3a --- /dev/null +++ b/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js @@ -0,0 +1,8 @@ +define( +"dijit/form/nls/zh/ComboBox", //begin v1.x content +({ + previousMessage: "先前选项", + nextMessage: "更多选项" +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/zh/Textarea.js b/lib/dijit/form/nls/zh/Textarea.js index e1cf172ad..917b5cd68 100644 --- a/lib/dijit/form/nls/zh/Textarea.js +++ b/lib/dijit/form/nls/zh/Textarea.js @@ -1 +1,2 @@ -({"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"})
\ No newline at end of file +//>>built +define("dijit/form/nls/zh/Textarea",({iframeEditTitle:"编辑区",iframeFocusTitle:"编辑区框架"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js b/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js new file mode 100644 index 000000000..e1aca268a --- /dev/null +++ b/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js @@ -0,0 +1,10 @@ +define( +"dijit/form/nls/zh/Textarea", //begin v1.x content +({ + iframeEditTitle: '编辑区', // primary title for editable IFRAME, for screen readers when focus is in the editing area + iframeFocusTitle: '编辑区框架' // secondary title for editable IFRAME when focus is on outer container + // to let user know that focus has moved out of editing area and to the + // parent element of the editing area +}) +//end v1.x content +); diff --git a/lib/dijit/form/nls/zh/validate.js b/lib/dijit/form/nls/zh/validate.js index e2c01f55b..7a78d23c6 100644 --- a/lib/dijit/form/nls/zh/validate.js +++ b/lib/dijit/form/nls/zh/validate.js @@ -1 +1,2 @@ -({"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"})
\ No newline at end of file +//>>built +define("dijit/form/nls/zh/validate",({invalidMessage:"输入的值无效。",missingMessage:"此值是必需值。",rangeMessage:"此值超出范围。"}));
\ No newline at end of file diff --git a/lib/dijit/form/nls/zh/validate.js.uncompressed.js b/lib/dijit/form/nls/zh/validate.js.uncompressed.js new file mode 100644 index 000000000..8044a7633 --- /dev/null +++ b/lib/dijit/form/nls/zh/validate.js.uncompressed.js @@ -0,0 +1,9 @@ +define( +"dijit/form/nls/zh/validate", //begin v1.x content +({ + invalidMessage: "输入的值无效。", + missingMessage: "此值是必需值。", + rangeMessage: "此值超出范围。" +}) +//end v1.x content +); diff --git a/lib/dijit/form/templates/Button.html b/lib/dijit/form/templates/Button.html new file mode 100644 index 000000000..d167ac0d0 --- /dev/null +++ b/lib/dijit/form/templates/Button.html @@ -0,0 +1,17 @@ +<span class="dijit dijitReset dijitInline" role="presentation" + ><span class="dijitReset dijitInline dijitButtonNode" + data-dojo-attach-event="ondijitclick:_onClick" role="presentation" + ><span class="dijitReset dijitStretch dijitButtonContents" + data-dojo-attach-point="titleNode,focusNode" + role="button" aria-labelledby="${id}_label" + ><span class="dijitReset dijitInline dijitIcon" data-dojo-attach-point="iconNode"></span + ><span class="dijitReset dijitToggleButtonIconChar">●</span + ><span class="dijitReset dijitInline dijitButtonText" + id="${id}_label" + data-dojo-attach-point="containerNode" + ></span + ></span + ></span + ><input ${!nameAttrSetting} type="${type}" value="${value}" class="dijitOffScreen" + tabIndex="-1" role="presentation" data-dojo-attach-point="valueNode" +/></span> diff --git a/lib/dijit/form/templates/CheckBox.html b/lib/dijit/form/templates/CheckBox.html new file mode 100644 index 000000000..fd81fc226 --- /dev/null +++ b/lib/dijit/form/templates/CheckBox.html @@ -0,0 +1,7 @@ +<div class="dijit dijitReset dijitInline" role="presentation" + ><input + ${!nameAttrSetting} type="${type}" ${checkedAttrSetting} + class="dijitReset dijitCheckBoxInput" + data-dojo-attach-point="focusNode" + data-dojo-attach-event="onclick:_onClick" +/></div> diff --git a/lib/dijit/form/templates/ComboButton.html b/lib/dijit/form/templates/ComboButton.html new file mode 100644 index 000000000..49eed10a8 --- /dev/null +++ b/lib/dijit/form/templates/ComboButton.html @@ -0,0 +1,23 @@ +<table class="dijit dijitReset dijitInline dijitLeft" + cellspacing='0' cellpadding='0' role="presentation" + ><tbody role="presentation"><tr role="presentation" + ><td class="dijitReset dijitStretch dijitButtonNode" data-dojo-attach-point="buttonNode" data-dojo-attach-event="ondijitclick:_onClick,onkeypress:_onButtonKeyPress" + ><div id="${id}_button" class="dijitReset dijitButtonContents" + data-dojo-attach-point="titleNode" + role="button" aria-labelledby="${id}_label" + ><div class="dijitReset dijitInline dijitIcon" data-dojo-attach-point="iconNode" role="presentation"></div + ><div class="dijitReset dijitInline dijitButtonText" id="${id}_label" data-dojo-attach-point="containerNode" role="presentation"></div + ></div + ></td + ><td id="${id}_arrow" class='dijitReset dijitRight dijitButtonNode dijitArrowButton' + data-dojo-attach-point="_popupStateNode,focusNode,_buttonNode" + data-dojo-attach-event="onkeypress:_onArrowKeyPress" + title="${optionsTitle}" + role="button" aria-haspopup="true" + ><div class="dijitReset dijitArrowButtonInner" role="presentation"></div + ><div class="dijitReset dijitArrowButtonChar" role="presentation">▼</div + ></td + ><td style="display:none !important;" + ><input ${!nameAttrSetting} type="${type}" value="${value}" data-dojo-attach-point="valueNode" + /></td></tr></tbody +></table> diff --git a/lib/dijit/form/templates/DropDownBox.html b/lib/dijit/form/templates/DropDownBox.html new file mode 100644 index 000000000..0314ad951 --- /dev/null +++ b/lib/dijit/form/templates/DropDownBox.html @@ -0,0 +1,16 @@ +<div class="dijit dijitReset dijitInline dijitLeft" + id="widget_${id}" + role="combobox" + ><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer' + data-dojo-attach-point="_buttonNode, _popupStateNode" role="presentation" + ><input class="dijitReset dijitInputField dijitArrowButtonInner" value="▼ " type="text" tabIndex="-1" readonly="readonly" role="presentation" + ${_buttonInputDisabled} + /></div + ><div class='dijitReset dijitValidationContainer' + ><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ " type="text" tabIndex="-1" readonly="readonly" role="presentation" + /></div + ><div class="dijitReset dijitInputField dijitInputContainer" + ><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type="text" autocomplete="off" + data-dojo-attach-point="textbox,focusNode" role="textbox" aria-haspopup="true" + /></div +></div> diff --git a/lib/dijit/form/templates/DropDownButton.html b/lib/dijit/form/templates/DropDownButton.html new file mode 100644 index 000000000..56d2618f4 --- /dev/null +++ b/lib/dijit/form/templates/DropDownButton.html @@ -0,0 +1,20 @@ +<span class="dijit dijitReset dijitInline" + ><span class='dijitReset dijitInline dijitButtonNode' + data-dojo-attach-event="ondijitclick:_onClick" data-dojo-attach-point="_buttonNode" + ><span class="dijitReset dijitStretch dijitButtonContents" + data-dojo-attach-point="focusNode,titleNode,_arrowWrapperNode" + role="button" aria-haspopup="true" aria-labelledby="${id}_label" + ><span class="dijitReset dijitInline dijitIcon" + data-dojo-attach-point="iconNode" + ></span + ><span class="dijitReset dijitInline dijitButtonText" + data-dojo-attach-point="containerNode,_popupStateNode" + id="${id}_label" + ></span + ><span class="dijitReset dijitInline dijitArrowButtonInner"></span + ><span class="dijitReset dijitInline dijitArrowButtonChar">▼</span + ></span + ></span + ><input ${!nameAttrSetting} type="${type}" value="${value}" class="dijitOffScreen" tabIndex="-1" + data-dojo-attach-point="valueNode" +/></span> diff --git a/lib/dijit/form/templates/HorizontalSlider.html b/lib/dijit/form/templates/HorizontalSlider.html new file mode 100644 index 000000000..9fd16d4ea --- /dev/null +++ b/lib/dijit/form/templates/HorizontalSlider.html @@ -0,0 +1,37 @@ +<table class="dijit dijitReset dijitSlider dijitSliderH" cellspacing="0" cellpadding="0" border="0" rules="none" data-dojo-attach-event="onkeypress:_onKeyPress,onkeyup:_onKeyUp" + ><tr class="dijitReset" + ><td class="dijitReset" colspan="2"></td + ><td data-dojo-attach-point="topDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH"></td + ><td class="dijitReset" colspan="2"></td + ></tr + ><tr class="dijitReset" + ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH" + ><div class="dijitSliderDecrementIconH" style="display:none" data-dojo-attach-point="decrementButton"><span class="dijitSliderButtonInner">-</span></div + ></td + ><td class="dijitReset" + ><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper" data-dojo-attach-event="press:_onClkDecBumper"></div + ></td + ><td class="dijitReset" + ><input data-dojo-attach-point="valueNode" type="hidden" ${!nameAttrSetting} + /><div class="dijitReset dijitSliderBarContainerH" role="presentation" data-dojo-attach-point="sliderBarContainer" + ><div role="presentation" data-dojo-attach-point="progressBar" class="dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH" data-dojo-attach-event="press:_onBarClick" + ><div class="dijitSliderMoveable dijitSliderMoveableH" + ><div data-dojo-attach-point="sliderHandle,focusNode" class="dijitSliderImageHandle dijitSliderImageHandleH" data-dojo-attach-event="press:_onHandleClick" role="slider" valuemin="${minimum}" valuemax="${maximum}"></div + ></div + ></div + ><div role="presentation" data-dojo-attach-point="remainingBar" class="dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH" data-dojo-attach-event="press:_onBarClick"></div + ></div + ></td + ><td class="dijitReset" + ><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper" data-dojo-attach-event="press:_onClkIncBumper"></div + ></td + ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH" + ><div class="dijitSliderIncrementIconH" style="display:none" data-dojo-attach-point="incrementButton"><span class="dijitSliderButtonInner">+</span></div + ></td + ></tr + ><tr class="dijitReset" + ><td class="dijitReset" colspan="2"></td + ><td data-dojo-attach-point="containerNode,bottomDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH"></td + ><td class="dijitReset" colspan="2"></td + ></tr +></table> diff --git a/lib/dijit/form/templates/Select.html b/lib/dijit/form/templates/Select.html new file mode 100644 index 000000000..9e917ab92 --- /dev/null +++ b/lib/dijit/form/templates/Select.html @@ -0,0 +1,14 @@ +<table class="dijit dijitReset dijitInline dijitLeft" + data-dojo-attach-point="_buttonNode,tableNode,focusNode" cellspacing='0' cellpadding='0' + role="combobox" aria-haspopup="true" + ><tbody role="presentation"><tr role="presentation" + ><td class="dijitReset dijitStretch dijitButtonContents dijitButtonNode" role="presentation" + ><span class="dijitReset dijitInline dijitButtonText" data-dojo-attach-point="containerNode,_popupStateNode"></span + ><input type="hidden" ${!nameAttrSetting} data-dojo-attach-point="valueNode" value="${value}" aria-hidden="true" + /></td><td class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton" + data-dojo-attach-point="titleNode" role="presentation" + ><div class="dijitReset dijitArrowButtonInner" role="presentation"></div + ><div class="dijitReset dijitArrowButtonChar" role="presentation">▼</div + ></td + ></tr></tbody +></table> diff --git a/lib/dijit/form/templates/Spinner.html b/lib/dijit/form/templates/Spinner.html new file mode 100644 index 000000000..468613d01 --- /dev/null +++ b/lib/dijit/form/templates/Spinner.html @@ -0,0 +1,27 @@ +<div class="dijit dijitReset dijitInline dijitLeft" + id="widget_${id}" role="presentation" + ><div class="dijitReset dijitButtonNode dijitSpinnerButtonContainer" + ><input class="dijitReset dijitInputField dijitSpinnerButtonInner" type="text" tabIndex="-1" readonly="readonly" role="presentation" + /><div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton" + data-dojo-attach-point="upArrowNode" + ><div class="dijitArrowButtonInner" + ><input class="dijitReset dijitInputField" value="▲" type="text" tabIndex="-1" readonly="readonly" role="presentation" + ${_buttonInputDisabled} + /></div + ></div + ><div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton" + data-dojo-attach-point="downArrowNode" + ><div class="dijitArrowButtonInner" + ><input class="dijitReset dijitInputField" value="▼" type="text" tabIndex="-1" readonly="readonly" role="presentation" + ${_buttonInputDisabled} + /></div + ></div + ></div + ><div class='dijitReset dijitValidationContainer' + ><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ" type="text" tabIndex="-1" readonly="readonly" role="presentation" + /></div + ><div class="dijitReset dijitInputField dijitInputContainer" + ><input class='dijitReset dijitInputInner' data-dojo-attach-point="textbox,focusNode" type="${type}" data-dojo-attach-event="onkeypress:_onKeyPress" + role="spinbutton" autocomplete="off" ${!nameAttrSetting} + /></div +></div> diff --git a/lib/dijit/form/templates/TextBox.html b/lib/dijit/form/templates/TextBox.html new file mode 100644 index 000000000..fd543c695 --- /dev/null +++ b/lib/dijit/form/templates/TextBox.html @@ -0,0 +1,6 @@ +<div class="dijit dijitReset dijitInline dijitLeft" id="widget_${id}" role="presentation" + ><div class="dijitReset dijitInputField dijitInputContainer" + ><input class="dijitReset dijitInputInner" data-dojo-attach-point='textbox,focusNode' autocomplete="off" + ${!nameAttrSetting} type='${type}' + /></div +></div> diff --git a/lib/dijit/form/templates/ValidationTextBox.html b/lib/dijit/form/templates/ValidationTextBox.html new file mode 100644 index 000000000..d49dd8c59 --- /dev/null +++ b/lib/dijit/form/templates/ValidationTextBox.html @@ -0,0 +1,10 @@ +<div class="dijit dijitReset dijitInline dijitLeft" + id="widget_${id}" role="presentation" + ><div class='dijitReset dijitValidationContainer' + ><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ " type="text" tabIndex="-1" readonly="readonly" role="presentation" + /></div + ><div class="dijitReset dijitInputField dijitInputContainer" + ><input class="dijitReset dijitInputInner" data-dojo-attach-point='textbox,focusNode' autocomplete="off" + ${!nameAttrSetting} type='${type}' + /></div +></div> diff --git a/lib/dijit/form/templates/VerticalSlider.html b/lib/dijit/form/templates/VerticalSlider.html new file mode 100644 index 000000000..0c72ed90a --- /dev/null +++ b/lib/dijit/form/templates/VerticalSlider.html @@ -0,0 +1,45 @@ +<table class="dijit dijitReset dijitSlider dijitSliderV" cellspacing="0" cellpadding="0" border="0" rules="none" data-dojo-attach-event="onkeypress:_onKeyPress,onkeyup:_onKeyUp" + ><tr class="dijitReset" + ><td class="dijitReset"></td + ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV" + ><div class="dijitSliderIncrementIconV" style="display:none" data-dojo-attach-point="decrementButton"><span class="dijitSliderButtonInner">+</span></div + ></td + ><td class="dijitReset"></td + ></tr + ><tr class="dijitReset" + ><td class="dijitReset"></td + ><td class="dijitReset" + ><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper" data-dojo-attach-event="press:_onClkIncBumper"></div></center + ></td + ><td class="dijitReset"></td + ></tr + ><tr class="dijitReset" + ><td data-dojo-attach-point="leftDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV"></td + ><td class="dijitReset dijitSliderDecorationC" style="height:100%;" + ><input data-dojo-attach-point="valueNode" type="hidden" ${!nameAttrSetting} + /><center class="dijitReset dijitSliderBarContainerV" role="presentation" data-dojo-attach-point="sliderBarContainer" + ><div role="presentation" data-dojo-attach-point="remainingBar" class="dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV" data-dojo-attach-event="press:_onBarClick"><!--#5629--></div + ><div role="presentation" data-dojo-attach-point="progressBar" class="dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV" data-dojo-attach-event="press:_onBarClick" + ><div class="dijitSliderMoveable dijitSliderMoveableV" style="vertical-align:top;" + ><div data-dojo-attach-point="sliderHandle,focusNode" class="dijitSliderImageHandle dijitSliderImageHandleV" data-dojo-attach-event="press:_onHandleClick" role="slider" valuemin="${minimum}" valuemax="${maximum}"></div + ></div + ></div + ></center + ></td + ><td data-dojo-attach-point="containerNode,rightDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV"></td + ></tr + ><tr class="dijitReset" + ><td class="dijitReset"></td + ><td class="dijitReset" + ><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper" data-dojo-attach-event="press:_onClkDecBumper"></div></center + ></td + ><td class="dijitReset"></td + ></tr + ><tr class="dijitReset" + ><td class="dijitReset"></td + ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV" + ><div class="dijitSliderDecrementIconV" style="display:none" data-dojo-attach-point="incrementButton"><span class="dijitSliderButtonInner">-</span></div + ></td + ><td class="dijitReset"></td + ></tr +></table> |