define([
|
'dojo/_base/array',
|
'dojo/_base/declare',
|
'dojo/_base/lang',
|
'dojo/dom-class',
|
'dojo/on',
|
'dojo/query',
|
'dojo/string',
|
'dojo/topic',
|
'dijit/registry',
|
'dijit/_WidgetBase',
|
'dijit/_TemplatedMixin',
|
'dijit/_WidgetsInTemplateMixin',
|
'dijit/form/_FormMixin',
|
'./_ResizeMixin',
|
'../data/config',
|
'dojo/i18n!../nls/laboratory',
|
'dojo/text!./templates/ColumnConfigForm.html',
|
// for template
|
'dijit/form/Button',
|
'dijit/form/ComboBox',
|
'dijit/form/FilteringSelect',
|
'dijit/form/NumberTextBox',
|
'dijit/form/RadioButton',
|
'dijit/form/TextBox'
|
], function (arrayUtil, declare, lang, domClass, on, query, string, topic, registry, _WidgetBase, _TemplatedMixin,
|
_WidgetsInTemplateMixin, _FormMixin, _ResizeMixin, config, i18n, template) {
|
|
var defaultColumnValues = {
|
// Standard column properties
|
field: '',
|
label: '',
|
className: '',
|
sortable: 'true',
|
|
// Editor properties
|
editor: '',
|
editOn: '',
|
autoSave: 'false',
|
autoSelect: 'false',
|
dismissOnEnter: 'true',
|
|
// ColumnHider properties
|
hidden: 'false',
|
unhidable: 'false',
|
|
// ColumnReorder properties
|
reorderable: 'true',
|
|
// ColumnResizer properties
|
resizable: 'true',
|
|
// Selector properties
|
selector: ''
|
};
|
|
return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FormMixin, _ResizeMixin ], {
|
baseClass: 'configForm column',
|
templateString: template,
|
i18n: i18n,
|
docBaseUrl: config.docBaseUrl,
|
|
_featureMidToNodeMap: null,
|
|
buildRendering: function () {
|
this.inherited(arguments);
|
|
if (!this.containerNode) {
|
this.containerNode = this.domNode;
|
}
|
|
var map = this._featureMidToNodeMap = {
|
'dgrid/Editor': this.editorFields,
|
'dgrid/extensions/ColumnHider': this.columnHiderFields,
|
'dgrid/extensions/ColumnReorder': this.columnReorderFields,
|
'dgrid/extensions/ColumnResizer': this.columnResizerFields,
|
'dgrid/Selector': this.selectorFields
|
};
|
|
for (var k in map) {
|
// Add legend labels programmatically
|
var moduleName = k.slice(k.lastIndexOf('/') + 1);
|
map[k].getElementsByTagName('legend')[0].innerHTML =
|
string.substitute(this.i18n.moduleProperties, [ moduleName ]);
|
}
|
},
|
|
postCreate: function () {
|
function shouldDismiss(editor) {
|
return editor ? editor.toLowerCase().indexOf('textarea') === -1 : true;
|
}
|
|
this.inherited(arguments);
|
this.own(
|
topic.subscribe('/feature/select', lang.hitch(this, '_onFeatureSelect')),
|
on(this.doneButton, 'click', lang.hitch(this, function () {
|
this.emit('close');
|
})),
|
this.watch('value', function (propertyName, oldValue, newValue) {
|
// Let the ColumnGrid know the column config has changed so it an update the store
|
topic.publish('/column/changed', newValue);
|
if (newValue.editor !== oldValue.editor) {
|
// Set a sane default for dismissOnEnter if switching to/from a textarea editor
|
var newDismiss = shouldDismiss(newValue.editor);
|
var oldDismiss = shouldDismiss(oldValue.editor);
|
if (newDismiss !== oldDismiss) {
|
this.set('value', lang.mixin(newValue, { dismissOnEnter: '' + newDismiss }));
|
}
|
}
|
})
|
);
|
},
|
|
_setValueAttr: function (value) {
|
// Use default values for any unspecified fields
|
this.inherited(arguments, [lang.mixin(lang.clone(defaultColumnValues), value)]);
|
// Store the id - _FormMixin will discard this value, but we need it to persist the data back to the store
|
this._id = value.id;
|
},
|
|
_getValueAttr: function () {
|
var returnValue = this.inherited(arguments);
|
var propertyName, k;
|
|
for (k in this._getHiddenFieldNames()) {
|
delete returnValue[k];
|
}
|
|
// Omit properties with default values
|
for (propertyName in returnValue) {
|
if (returnValue[propertyName] === defaultColumnValues[propertyName]) {
|
delete returnValue[propertyName];
|
}
|
}
|
|
// Restore the id
|
returnValue.id = this._id;
|
|
return returnValue;
|
},
|
|
_getHiddenFieldNames: function () {
|
var hiddenFieldNames = {};
|
// Remove values from hidden fields
|
query('fieldset.dijitHidden', this.domNode).forEach(function (fieldset) {
|
arrayUtil.forEach(registry.findWidgets(fieldset), function (childWidget) {
|
hiddenFieldNames[childWidget.name] = true;
|
});
|
});
|
|
return hiddenFieldNames;
|
},
|
|
_onFeatureSelect: function (featureMid, isEnabled) {
|
var featureNode = this._featureMidToNodeMap[featureMid];
|
|
if (featureNode) {
|
domClass.toggle(featureNode, 'dijitHidden', !isEnabled);
|
|
if (!isEnabled) {
|
// Close the dialog so input fields will reset if the user reenables the feature.
|
this.emit('close');
|
topic.publish('/columnConfig/hidden', this._getHiddenFieldNames());
|
}
|
}
|
},
|
|
_clearField: function (event) {
|
var fieldName = event.target.getAttribute('data-field-name');
|
var formValue = this.get('value');
|
|
if (!fieldName) {
|
return;
|
}
|
|
if (fieldName in formValue) {
|
formValue[fieldName] = '';
|
this.set('value', formValue);
|
}
|
}
|
});
|
});
|