diff options
author | Andrew Dolgov <[email protected]> | 2021-12-14 21:53:45 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2021-12-14 21:53:45 +0300 |
commit | 720b31879634f21ea7db85f49d6f07ec7d7344bc (patch) | |
tree | a8657d8762cd2d5d8ea3118731cc9826e9678d05 /js/form/Select.js | |
parent | 8a645892a60bc3181f598d2192f01cc21f35b719 (diff) |
* fox.form.Select: add several properties allowing it to better
imitate other controls like DropDownButton, etc.
* rework several main toolbar items to use fox.form.Select instead of
other controls
* replace HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM with
HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM2 because of markup change (option
instead of menuitem)
* PluginHost: add some explicit typecasts to make intellephense shut up
Diffstat (limited to 'js/form/Select.js')
-rwxr-xr-x | js/form/Select.js | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/js/form/Select.js b/js/form/Select.js index 530880e2d..0c73cd52c 100755 --- a/js/form/Select.js +++ b/js/form/Select.js @@ -1,8 +1,66 @@ -/* global dijit, define */ -define(["dojo/_base/declare", "dijit/form/Select"], function (declare) { - return declare("fox.form.Select", dijit.form.Select, { +/* eslint-disable prefer-rest-params */ +/* global define */ +// FIXME: there probably is a better, more dojo-like notation for custom data- properties +define(["dojo/_base/declare", + "dijit/form/Select", + "dojo/_base/lang", // lang.hitch + "dijit/MenuItem", + "dijit/MenuSeparator", + "dojo/aspect", + ], function (declare, select, lang, MenuItem, MenuSeparator, aspect) { + return declare("fox.form.Select", select, { focus: function() { return; // Stop dijit.form.Select from keeping focus after closing the menu }, + startup: function() { + this.inherited(arguments); + + if (this.attr('data-dropdown-skip-first') == 'true') { + aspect.before(this, "_loadChildren", () => { + this.options = this.options.splice(1); + }); + } + }, + // hook invoked when dropdown MenuItem is clicked + onItemClick: function(/*item, menu*/) { + // + }, + _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ + if (this.attr('data-prevent-value-change') == 'true' && newValue != '') + return; + + this.inherited(arguments); + }, + // the only difference from dijit/form/Select is _onItemClicked() handler + _getMenuItemForOption: function(/*_FormSelectWidget.__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({ownerDocument: this.ownerDocument}); + } else { + // Just a regular menu option + const click = lang.hitch(this, "_setValueAttr", option); + const item = new MenuItem({ + option: option, + label: (this.labelType === 'text' ? (option.label || '').toString() + .replace(/&/g, '&').replace(/</g, '<') : + option.label) || this.emptyLabel, + onClick: () => { + this.onItemClick(item, this.dropDown); + + click(); + }, + ownerDocument: this.ownerDocument, + dir: this.dir, + textDir: this.textDir, + disabled: option.disabled || false + }); + item.focusNode.setAttribute("role", "option"); + + return item; + } + }, }); }); |