morpheus.SortDialog = function(project) { var _this = this; // choose rows or columns var $chooserDiv = $('
'); var $div = $('
'); var html = []; html .push('
'); html.push('
'); html .push('
'); html.push('
'); html .push('
'); html .push('
'); html.push('
'); html.push('
'); html.push('
'); $chooserDiv.html(html.join('')); function toggle(isColumns) { _this.isColumns = isColumns; var $element = _this.build(project, isColumns); $div.empty().html($element); $div.on('click', '[name=delete]', function(e) { var $this = $(this); e.preventDefault(); $this.closest('div.row').remove(); }); $div.on('click', '[name=add]', function(e) { var $this = $(this); var level = []; var $sibling = $this.closest('div.row'); _this.createLevel(level, new morpheus.SortKey('', morpheus.SortKey.SortOrder.ASCENDING), _this.fields); $sibling.after($(level.join(''))); e.preventDefault(); }); } $chooserDiv.on('change', '[name=rowsOrColumns]', function(e) { var $this = $(this); toggle($this.val() === 'columns'); }); toggle(false); var $outer = $('
'); $chooserDiv.appendTo($outer); $div.appendTo($outer); morpheus.FormBuilder .showOkCancel({ title : 'Sort', content : $outer, okCallback : function() { var $forms = $div.find('form'); var sortBy = $forms.find('[name=sortBy]').map(function() { return $(this).val(); }); var sortOrder = $forms.find('[name=sortOrder]:checked') .map(function() { return $(this).val(); }); var groupBy = $div.find('[name=groupBy]').val(); var newSortKeys = []; var modelIndices = _this.isColumns ? project .getRowSelectionModel().toModelIndices() : project .getColumnSelectionModel().toModelIndices(); var existingSortKeys = _this.isColumns ? project .getColumnSortKeys() : project.getRowSortKeys(); // keep MatchesOnTopSortKey and dendrogram var keysToKeep = _ .filter( existingSortKeys, function(key) { return key instanceof morpheus.MatchesOnTopSortKey || (key instanceof morpheus.SpecifiedModelSortOrder && key.name === 'dendrogram'); }); if (keysToKeep.length > 0) { _.each(keysToKeep, function(key) { newSortKeys.push(key); }); } var newSortKeyFields = new morpheus.Set(); for (var i = 0; i < sortBy.length; i++) { if (!newSortKeyFields.has(sortBy[i])) { newSortKeyFields.add(sortBy[i]); if (sortBy[i] === 'selection') { newSortKeys.push(new morpheus.SortByValuesKey( modelIndices, sortOrder[i], _this.isColumns)); } else if (sortBy[i] !== '') { newSortKeys.push(new morpheus.SortKey( sortBy[i], sortOrder[i])); } } } var newGroupKeys = []; if (groupBy != null) { for (var i = 0; i < groupBy.length; i++) { newGroupKeys.push(new morpheus.SortKey(groupBy[i], morpheus.SortKey.SortOrder.UNSORTED)); } } if (_this.isColumns) { project.setGroupColumns(newGroupKeys, false); project.setColumnSortKeys(morpheus.SortKey .keepExistingSortKeys(newSortKeys, project .getColumnSortKeys()), true); } else { project.setGroupRows(newGroupKeys, false); project.setRowSortKeys(morpheus.SortKey .keepExistingSortKeys(newSortKeys, project .getRowSortKeys()), true); } } }); }; morpheus.SortDialog.prototype = { isColumns : false, build : function(project, isColumns) { var fields = morpheus.MetadataUtil.getMetadataNames(isColumns ? project .getFullDataset().getColumnMetadata() : project .getFullDataset().getRowMetadata()); this.fields = fields; var html = []; var sortKeys = isColumns ? project.getColumnSortKeys() : project .getRowSortKeys(); this.createLevel0(html); for (var i = 0; i < sortKeys.length; i++) { // add existing keys // ignoring // MatchesOnTopSortKey and // dendrogram if (!(sortKeys[i] instanceof morpheus.MatchesOnTopSortKey) && !(sortKeys[i] instanceof morpheus.SpecifiedModelSortOrder && sortKeys[i].name === 'dendrogram')) { this.createLevel(html, sortKeys[i], fields); } } // group by html.push('
'); html .push('
'); html.push('
'); html.push('
'); var groupByKeys = (isColumns ? project.getGroupColumns() : project .getGroupRows()).map(function(key) { return key.field; }); html.push(''); html.push(''); html.push('
'); return $(html.join('')); }, createLevel0 : function(html) { html .push('
'); html.push('
'); html.push('
'); html.push('Add sort level'); html.push('
'); html.push('
'); html.push('
'); }, createLevel : function(html, key, fields) { html .push('
'); html.push('
'); html .push('
'); html.push('
'); html.push(''); html.push('
'); html.push('
'); html .push('
'); html .push('
'); html.push('
'); html.push('
'); html.push('Delete'); html.push('
'); html.push('
'); html.push('Add sort level'); html.push('
'); html.push('
'); html.push('
'); } };