function ListFacet(div, config, options, selection) { this._div = div; this._config = config; this._options = options || {}; if (!("sort" in this._options)) { this._options.sort = "name"; } this._selection = selection || []; this._blankChoice = null; this._errorChoice = null; this._data = null; this._initializeUI(); this._update(); } ListFacet.reconstruct = function(div, uiState) { return new ListFacet(div, uiState.c, uiState.o, uiState.s); }; ListFacet.prototype.dispose = function() { }; ListFacet.prototype.reset = function() { this._selection = []; this._blankChoice = null; this._errorChoice = null; }; ListFacet.prototype.getUIState = function() { var json = { c: this.getJSON(), o: this._options }; json.s = json.c.selection; delete json.c.selection; return json; }; ListFacet.prototype.getJSON = function() { var o = { type: "list", name: this._config.name, columnName: this._config.columnName, expression: this._config.expression, omitBlank: "omitBlank" in this._config ? this._config.omitBlank : false, omitError: "omitError" in this._config ? this._config.omitError : false, selection: [], selectBlank: this._blankChoice !== null && this._blankChoice.s, selectError: this._errorChoice !== null && this._errorChoice.s }; for (var i = 0; i < this._selection.length; i++) { var choice = { v: cloneDeep(this._selection[i].v) }; o.selection.push(choice); } return o; }; ListFacet.prototype.hasSelection = function() { return this._selection.length > 0 || (this._blankChoice !== null && this._blankChoice.s) || (this._errorChoice !== null && this._errorChoice.s); }; ListFacet.prototype.updateState = function(data) { this._data = data; if ("choices" in data) { var selection = []; var choices = data.choices; for (var i = 0; i < choices.length; i++) { var choice = choices[i]; if (choice.s) { selection.push(choice); } } this._selection = selection; this._reSortChoices(); this._blankChoice = data.blankChoice || null; this._errorChoice = data.errorChoice || null; } this._update(); }; ListFacet.prototype._reSortChoices = function() { this._data.choices.sort(this._options.sort == "name" ? function(a, b) { return a.v.l.localeCompare(b.v.l); } : function(a, b) { return b.c - a.c; } ); }; ListFacet.prototype._initializeUI = function() { var self = this; var facet_id = this._div.attr("id"); this._div.empty().show().html( '
' + '
' + '' + '' + '
 ' + 'reset' + 'change' + '' + '
' + '
' + '
' + '' + '
' + '
' + '
' ); this._elmts = DOM.bind(this._div); this._elmts.titleSpan.text(this._config.name); this._elmts.changeButton.attr("title","Current Expression: " + this._config.expression).click(function() { self._elmts.expressionDiv.slideToggle(100); }); this._elmts.expressionDiv.text(this._config.expression).hide().click(function() { self._editExpression(); }); this._elmts.removeButton.click(function() { self._remove(); }); this._elmts.resetButton.click(function() { self._reset(); }); this._elmts.sortByCountLink.click(function() { if (self._options.sort != "count") { self._options.sort = "count"; self._reSortChoices(); self._update(true); } }); this._elmts.sortByNameLink.click(function() { if (self._options.sort != "name") { self._options.sort = "name"; self._reSortChoices(); self._update(true); } }); this._elmts.sortGroup.buttonset(); this._elmts.clusterLink.click(function() { self._doEdit(); }).button(); if (this._config.expression != "value" && this._config.expression != "gel:value") { this._elmts.clusterLink.hide(); } if (!("scroll" in this._options) || this._options.scroll) { this._elmts.bodyDiv.addClass("facet-body-scrollable"); this._elmts.bodyDiv.resizable({ minHeight: 30, handles: 's', stop: function(event, ui) { event.target.style.width = "auto"; // don't force the width } }); } }; ListFacet.prototype._update = function(resetScroll) { var self = this; if (!this._data) { //this._elmts.statusDiv.hide(); this._elmts.controlsDiv.hide(); this._elmts.bodyInnerDiv.empty().append( $('
').text("Loading...").addClass("facet-body-message")); return; } else if ("error" in this._data) { //this._elmts.statusDiv.hide(); this._elmts.controlsDiv.hide(); this._elmts.bodyInnerDiv.empty().append( $('
').text(this._data.error).addClass("facet-body-message")); return; } var scrollTop = 0; if (!resetScroll) { try { scrollTop = this._elmts.bodyInnerDiv[0].scrollTop; } catch (e) { } } this._elmts.bodyInnerDiv.empty(); //this._elmts.statusDiv.show(); this._elmts.controlsDiv.show(); var choices = this._data.choices; var selectionCount = this._selection.length + (this._blankChoice !== null && this._blankChoice.s ? 1 : 0) + (this._errorChoice !== null && this._errorChoice.s ? 1 : 0); this._elmts.choiceCountContainer.text(choices.length + " choices"); if (selectionCount > 0) { this._elmts.resetButton.show(); } else { this._elmts.resetButton.hide(); } if (this._options.sort == "name") { this._elmts.sortByNameLink.addClass("facet-mode-link-selected"); this._elmts.sortByCountLink.removeClass("facet-mode-link-selected"); } else { this._elmts.sortByNameLink.removeClass("facet-mode-link-selected"); this._elmts.sortByCountLink.addClass("facet-mode-link-selected"); } var html = []; var temp = $('
'); var encodeHtml = function(s) { return temp.text(s).html(); }; var renderEdit = this._config.expression == "value"; var renderChoice = function(index, choice, customLabel) { var label = customLabel || choice.v.l; var count = choice.c; html.push('
'); // include/exclude link html.push( '' + (choice.s ? 'exclude' : 'include') + '' ); // edit link if (renderEdit && customLabel === undefined) { html.push(''); } html.push('' + encodeHtml(label) + ''); html.push('' + count + ''); html.push('
'); }; for (var i = 0; i < choices.length; i++) { renderChoice(i, choices[i]); } if (this._blankChoice !== null) { renderChoice(-1, this._blankChoice, "(blank)"); } if (this._errorChoice !== null) { renderChoice(-2, this._errorChoice, "(error)"); } this._elmts.bodyInnerDiv.html(html.join('')); this._elmts.bodyInnerDiv[0].scrollTop = scrollTop; var getChoice = function(elmt) { var index = parseInt(elmt.attr("choiceIndex")); if (index == -1) { return self._blankChoice; } else if (index == -2) { return self._errorChoice; } else { return choices[index]; } }; var findChoice = function(elmt) { return getChoice(elmt.closest('.facet-choice')); }; var select = function(choice) { self._select(choice, false); }; var selectOnly = function(choice) { self._select(choice, true); }; var deselect = function(choice) { self._deselect(choice); }; var wireEvents = function() { var bodyInnerDiv = self._elmts.bodyInnerDiv; bodyInnerDiv.find('.facet-choice-label').click(function() { var choice = findChoice($(this)); if (choice.s) { if (selectionCount > 1) { selectOnly(choice); } else { deselect(choice); } } else if (selectionCount > 0) { selectOnly(choice); } else { select(choice); } }); bodyInnerDiv.find('.facet-choice-edit').click(function() { var choice = findChoice($(this)); self._editChoice(choice, $(this).closest('.facet-choice')); }); bodyInnerDiv.find('.facet-choice').mouseenter(function() { $(this).find('.facet-choice-edit').css("visibility", "visible"); var choice = getChoice($(this)); if (!choice.s) { $(this).find('.facet-choice-toggle').css("visibility", "visible"); } }).mouseleave(function() { $(this).find('.facet-choice-edit').css("visibility", "hidden"); var choice = getChoice($(this)); if (!choice.s) { $(this).find('.facet-choice-toggle').css("visibility", "hidden"); } }); bodyInnerDiv.find('.facet-choice-toggle').click(function() { var choice = findChoice($(this)); if (choice.s) { deselect(choice); } else { select(choice); } }); } window.setTimeout(wireEvents, 100); }; ListFacet.prototype._doEdit = function() { new ClusteringDialog(this._config.columnName, this._config.expression); }; ListFacet.prototype._editChoice = function(choice, choiceDiv) { var self = this; var menu = MenuSystem.createMenu().addClass("data-table-cell-editor").width("400px"); menu.html( '' + '' + '
' + '