define([
'require',
'dgrid/OnDemandGrid',
'dgrid/Selection',
'dgrid/Keyboard',
'dojo/_base/declare',
'dojo/dom-construct',
'dojo/dom-class',
'dojo/on',
'dstore/RequestMemory',
'dojo/text!./resources/description.html',
'dojo/query'
], function (require, Grid, Selection, Keyboard, declare, domConstruct, domClass, on, RequestMemory, descriptionHtml) {
// Render DOM
var containerNode = domConstruct.create('div', null, document.body);
var switchNode = domConstruct.create('div', { className: 'controls', innerHTML: 'Select View: ' });
var tableButton = domConstruct.create('button', { innerHTML: 'Table', type: 'button' }, switchNode);
var detailsButton = domConstruct.create('button', { innerHTML: 'Details', type: 'button' }, switchNode);
var galleryButton = domConstruct.create('button', { innerHTML: 'Gallery', type: 'button' }, switchNode);
var contentNode = domConstruct.create('div', { className: 'content' });
var gridNode;
var grid;
var store;
var expandoListener;
var expandedNode;
var renderers = {
gallery: function (obj) {
// function used for renderRow for gallery view (large tiled thumbnails)
return domConstruct.create('div', {
innerHTML: '
' + obj.name + '
'
});
},
details: function (obj) {
// function used for renderRow for details view (items w/ summary)
return domConstruct.create('div', {
innerHTML: '
' +
obj.name + '
' + obj.summary + '
'
});
},
table: function (obj) {
var div = domConstruct.create('div', { className: 'collapsed' });
div.appendChild(Grid.prototype.renderRow.apply(this, arguments));
var summaryDiv = domConstruct.create('div', { className: 'expando' }, div);
summaryDiv.appendChild(document.createTextNode(obj.summary));
return div;
}
};
function makeViewClickHandler(view) {
return function () {
// pause/resume click listener for expando in "table" view
expandoListener[view === 'table' ? 'resume' : 'pause']();
// reset expanded node for table view
expandedNode = null;
// update renderRow function
grid.renderRow = renderers[view];
// update class on grid domNode
domClass.replace(grid.domNode, view, 'table gallery details');
// only show headers if we're in "table" view
grid.set('showHeader', view === 'table');
// force redraw of rows
grid.refresh();
};
}
containerNode.appendChild(switchNode);
gridNode = domConstruct.create('div', { className: 'table', id: 'grid' }, contentNode);
domConstruct.place(descriptionHtml, contentNode);
containerNode.appendChild(contentNode);
// Use require.toUrl for portability (looking up via module path)
store = new RequestMemory({ target: require.toUrl('./data.json') });
grid = new Grid({
columns: [
{
label: ' ',
field: 'icon',
sortable: false,
formatter: function (icon) {
return '
';
}
},
{ label: 'Package', field: 'id' },
{ label: 'Name', field: 'name' }
],
collection: store,
renderRow: renderers.table
}, 'grid');
// store initially-active renderRow as renderer for table view
renderers.table = grid.renderRow;
// listen for clicks to trigger expand/collapse in table view mode
expandoListener = on.pausable(grid.domNode, '.dgrid-row:click', function (event) {
var node = grid.row(event).element;
var collapsed = domClass.contains(node, 'collapsed');
// toggle state of node which was clicked
domClass.toggle(node, 'collapsed', !collapsed);
// if clicked row wasn't expanded, collapse any previously-expanded row
collapsed && expandedNode && domClass.add(expandedNode, 'collapsed');
// if the row clicked was previously expanded, nothing is expanded now
expandedNode = collapsed ? node : null;
});
// switch views when buttons are clicked
on(tableButton, 'click', makeViewClickHandler('table'));
on(detailsButton, 'click', makeViewClickHandler('details'));
on(galleryButton, 'click', makeViewClickHandler('gallery'));
});