define([
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/dom-class',
'dojo/topic',
'dijit/_WidgetBase',
'dijit/_TemplatedMixin',
'dijit/_WidgetsInTemplateMixin',
'./_ResizeMixin',
'dojo/i18n!../nls/laboratory',
'dojo/text!./templates/ColumnGrid.html',
'dgrid/Grid',
'dgrid/Editor',
'dgrid/extensions/DijitRegistry',
'dgrid/extensions/DnD',
'dgrid/extensions/SingleQuery',
'dstore/Memory',
'dstore/Trackable',
// Widgets in template:
'dijit/form/Form',
'dijit/form/Button',
'dijit/form/TextBox'
], function (declare, lang, domClass, topic, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _ResizeMixin, i18n,
template, Grid, Editor, DijitRegistry, DnD, SingleQuery, Memory, Trackable) {
function renderDragSourceCell(item, value, node) {
domClass.add(node, 'dojoDndHandle');
node.innerHTML = '';
}
return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _ResizeMixin ], {
baseClass: 'columnGridContainer',
templateString: template,
i18n: i18n,
buildRendering: function () {
this.inherited(arguments);
this.store = new (declare([ Memory, Trackable ]))();
this.grid = new (declare([ Grid, SingleQuery, Editor, DnD, DijitRegistry ], {
columns: {
dragSource: {
label: '',
renderCell: renderDragSourceCell,
sortable: false
},
label: {
field: 'label',
label: i18n.label,
autoSave: true,
sortable: false
},
config: {
label: '',
formatter: function () {
return '' +
' ';
},
sortable: false
}
},
showHeader: false,
dndParams: {
withHandles: true
}
}))({
collection: this.store,
className: 'columnGrid dgrid-autoheight'
}, this.gridNode);
this._startupWidgets.push(this.grid);
},
postCreate: function () {
this.inherited(arguments);
this.own(
this.store.on('add,delete,update', lang.hitch(this, '_onStoreChange')),
this.grid.on('.icon-times:click', lang.hitch(this, 'removeColumn')),
this.grid.on('.icon-gear:click', lang.hitch(this, '_editColumn')),
topic.subscribe('/column/changed', lang.hitch(this, '_onColumnChange')),
topic.subscribe('/columnConfig/hidden', lang.hitch(this, '_onFieldsHidden'))
);
},
_getColumnsAttr: function () {
return this.store.fetchSync();
},
addColumn: function (label) {
// summary:
// Adds a column to the store with the given label;
// the column's field name will be based on the label provided
this.store.put({
field: label.replace(/[^\w-]/g, '_'),
label: label
});
},
removeColumn: function (target) {
// summary:
// Removes the column from the store corresponding to the given target
// (whether an event, element, ID, or item)
this.store.remove(this.grid.row(target).id);
},
_onFormSubmit: function (event) {
// summary:
// Adds a column to the store from the UI values
event.preventDefault();
var form = this.columnGridForm;
var value = form.get('value');
if (!value.label) {
return;
}
this.addColumn(value.label);
form.reset();
this.fieldLabelTextBox.focus();
},
_editColumn: function (event) {
// summary:
// Shows the column configuration for a column
var row = this.grid.row(event);
// Let the ColumnEditor know that is should set the form data and display the form
this.emit('editcolumn', { data: row.data });
},
_onColumnChange: function (value) {
this.store.put(value);
},
_onStoreChange: function () {
// Let the Laboratory know that it should update the demo display (grid or generated code)
topic.publish('/configuration/changed');
// Let the Tree config module know that is should update its list of column names
topic.publish('/store/columns/update', this.store);
},
_onFieldsHidden: function (hiddenFieldNames) {
this.store.forEach(function (columnConfig) {
var k, updated;
for (k in columnConfig) {
if (hiddenFieldNames[k]) {
delete columnConfig[k];
updated = true;
}
}
updated && this.store.put(columnConfig);
}, this);
}
});
});