morpheus.SortDialog = function(project) {
var _this = this;
// choose rows or columns
var $chooserDiv = $('
');
var $div = $('');
var html = [];
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('