Daniel@0: "use strict"; Daniel@0: Daniel@0: App.module("RepresentationModule", function(RepresentationModule, App, Backbone, Marionette, $, _, Logger) { Daniel@0: Daniel@0: RepresentationModule.addInitializer(function(options){ Daniel@0: Daniel@0: /** Daniel@0: * Base structure and functionality of all masters of any dimension Daniel@0: * All masters inherit from the given object Daniel@0: */ Daniel@0: RepresentationModule.registerMaster({ Daniel@0: id: "_", Daniel@0: Daniel@0: options: { Daniel@0: }, Daniel@0: Daniel@0: defaultConfigParameterValues: { Daniel@0: kind: "", Daniel@0: }, Daniel@0: Daniel@0: initialize: function() { Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: // ================================================================= Daniel@0: // housekeeping Daniel@0: Daniel@0: generateDynamicDerivedConfigData: function(config, configGrid) { Daniel@0: return new RepresentationModule.DynamicDerivedConfigData(); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: configGridParameterHasDefaultValue: function(config, parameterName) { Daniel@0: return this.getConfigParameterValueOrDefaultValue(config, parameterName) == this.defaultConfigParameterValues[parameterName]; Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: getConfigParameterValueOrDefaultValue: function(config, parameterName, trimResult) { Daniel@0: var value = config.getParameterValue(parameterName); Daniel@0: if (!_.isUndefined(value)) { Daniel@0: return (trimResult && _.isString(value)) ? _.str.trim(value) : value; Daniel@0: } else { Daniel@0: return this.defaultConfigParameterValues[parameterName]; Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: getConfigPlannedParameterValueOrDefaultValue: function(config, parameterName) { Daniel@0: var value = config.getPlannedParameterValue(parameterName); Daniel@0: if (!_.isUndefined(value)) { Daniel@0: return value; Daniel@0: } else { Daniel@0: return this.defaultConfigParameterValues[parameterName]; Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: getSupportedKind: function() { Daniel@0: if (this._cachedSupportedKind === undefined) { Daniel@0: this._cachedSupportedKind = this.id.split(".")[2]; Daniel@0: } Daniel@0: return this._cachedSupportedKind; Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: planConfigParameterUpdateWithRespectToValueAndDefaultValue: function(config, parameterName, parameterValue) { Daniel@0: var defaultParameterValue = this.defaultConfigParameterValues[parameterName]; Daniel@0: var currentParameterValue = config.getParameterValue(parameterName); Daniel@0: var plannedParameterValue = parameterValue; Daniel@0: Daniel@0: if (currentParameterValue === undefined && plannedParameterValue === "" + defaultParameterValue) { Daniel@0: config.cancelPlannedParameterUpdate(parameterName); Daniel@0: } else { Daniel@0: config.planParameterUpdate(parameterName, plannedParameterValue); Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: extractCleanedConfigParameterValuesFromPlannedParameterValues: function(config) { Daniel@0: var result = config.getPlannedParameterValues(); Daniel@0: Daniel@0: // make sure no redundant parameters are set Daniel@0: for (var key in result) { Daniel@0: if (result.hasOwnProperty(key)) { Daniel@0: if (this.defaultConfigParameterValues[key] === undefined) { Daniel@0: delete result[key]; Daniel@0: } Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // make sure all parameters are set to defaults if missing Daniel@0: for (var key in this.defaultConfigParameterValues) { Daniel@0: if (this.defaultConfigParameterValues.hasOwnProperty(key)) { Daniel@0: if (!result.hasOwnProperty(key)) { Daniel@0: result[key] = "" + this.defaultConfigParameterValues[key]; Daniel@0: } Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: return result; Daniel@0: }, Daniel@0: Daniel@0: cleanConfigPlannedParameterValuesAndApplyThem: function(config) { Daniel@0: var newParameterValues = this.extractCleanedConfigParameterValuesFromPlannedParameterValues(config); Daniel@0: config.unserialize({ Daniel@0: parameters: newParameterValues, Daniel@0: plannedParameterUpdates: {}, Daniel@0: tempParameters: {} Daniel@0: }); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: // ================================================================= Daniel@0: // config grid panel Daniel@0: Daniel@0: Daniel@0: parseAutocompleteSuggestions: function(rawAutocompleteSuggestions) { Daniel@0: if (!_.isString(rawAutocompleteSuggestions) || !rawAutocompleteSuggestions) { Daniel@0: return null; Daniel@0: } Daniel@0: var rawAutocompleteAsArray = rawAutocompleteSuggestions.split(";"); Daniel@0: var result = {}; Daniel@0: _.each(rawAutocompleteAsArray, function(item) { Daniel@0: var parts = item.split("|"); Daniel@0: if (parts.length == 2) { Daniel@0: result[parts[0]] = parts[1]; Daniel@0: } else { Daniel@0: result[parts[0]] = parts[0]; Daniel@0: } Daniel@0: }); Daniel@0: return result; Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: // ----------------------------------------------------------------- Daniel@0: // config grid panel - prepare Daniel@0: Daniel@0: prepareConfigGridPanelMainArea: function(configGridPanelView) { Daniel@0: Daniel@0: // text fields Daniel@0: var $textfields = configGridPanelView._$mainArea.find(".cgpma__textfield"); Daniel@0: configGridPanelView._$mainArea.data("$textfields", $textfields); Daniel@0: Daniel@0: var master = this; Daniel@0: Daniel@0: $textfields.each(function() { Daniel@0: var $textfield = $(this); Daniel@0: if (!$textfield.data("cgpma-textfield")) { Daniel@0: $textfield.textfield({ Daniel@0: autocompleteSuggestions: master.parseAutocompleteSuggestions($textfield.data("autocomplete-suggestions")), Daniel@0: autocompleteIsAdvisory: $textfield.data("autocomplete-is-advisory"), Daniel@0: autocompleteSort: $textfield.data("autocomplete-sort"), Daniel@0: autocompleteCSSClasses: "ui_config-grid-type_" + configGridPanelView._cachedConfigGridType Daniel@0: }); Daniel@0: } else { Daniel@0: $textfield.unbind("textfieldchangevalue"); Daniel@0: $textfield.unbind("textfieldapply"); Daniel@0: $textfield.unbind("textfielddiscard"); Daniel@0: } Daniel@0: $textfield.data("configGridPanelView", configGridPanelView); Daniel@0: $textfield.bind("textfieldchangevalue", master.__panelInputChangeValueHandler); Daniel@0: $textfield.bind("textfieldapply", master.__panelInputApplyHandler); Daniel@0: $textfield.bind("textfielddiscard", master.__panelInputDiscardHandler); Daniel@0: }); Daniel@0: Daniel@0: // tick boxes Daniel@0: var $tickboxes = configGridPanelView._$mainArea.find(".cgpma__tickbox"); Daniel@0: configGridPanelView._$mainArea.data("$tickboxes", $tickboxes); Daniel@0: Daniel@0: $tickboxes.each(function() { Daniel@0: var $tickbox = $(this); Daniel@0: if (!$tickbox.data("cgpma-tickbox")) { Daniel@0: $tickbox.tickbox(); Daniel@0: } Daniel@0: $tickbox.data("configGridPanelView", configGridPanelView); Daniel@0: $tickbox.bind("tickboxchangevalue", master.__panelInputChangeValueHandler); Daniel@0: }); Daniel@0: Daniel@0: // input blocks Daniel@0: var $inputBlocks = configGridPanelView._$mainArea.find(".cgpma__input-block"); Daniel@0: configGridPanelView._$mainArea.data("$inputBlocks", $inputBlocks); Daniel@0: $inputBlocks.each(function() { Daniel@0: var $inputBlock = $(this); Daniel@0: var inputBlockName = $inputBlock.data("name"); Daniel@0: if (!inputBlockName) { Daniel@0: var $firstElementWithParameterNameInsideInputBlock = $inputBlock.find("[data-parameter-name]").first(); Daniel@0: inputBlockName = $firstElementWithParameterNameInsideInputBlock.data("parameter-name"); Daniel@0: } Daniel@0: configGridPanelView._$mainArea.data("$inputBlock_" + inputBlockName, $inputBlock); Daniel@0: }); Daniel@0: Daniel@0: // initial population of the data Daniel@0: var $allInputs = $tickboxes.add($textfields); Daniel@0: configGridPanelView._$mainArea.data("$allInputs", $allInputs); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: __panelInputChangeValueHandler: function(event) { Daniel@0: var $this = $(this); Daniel@0: var parameterName = $this.data("parameter-name"); Daniel@0: if (!parameterName) { Daniel@0: return; Daniel@0: } Daniel@0: Daniel@0: var configGridPanelView = $this.data("configGridPanelView"); Daniel@0: var config = configGridPanelView._cachedConfig; Daniel@0: var master = configGridPanelView._masterBehindMainArea; Daniel@0: var value = undefined; Daniel@0: if ($this.data("cgpma-tickbox")) { Daniel@0: value = $this.tickbox("option", "value"); Daniel@0: } else { Daniel@0: value = $this.textfield("option", "value"); Daniel@0: } Daniel@0: master.planConfigParameterUpdateWithRespectToValueAndDefaultValue(config, parameterName, value); Daniel@0: }, Daniel@0: Daniel@0: __panelInputApplyHandler: function() { Daniel@0: var $this = $(this); Daniel@0: var configGridPanelView = $this.data("configGridPanelView"); Daniel@0: configGridPanelView._masterBehindMainArea.cleanConfigPlannedParameterValuesAndApplyThem(configGridPanelView._cachedConfig); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: __panelInputDiscardHandler: function() { Daniel@0: var $this = $(this); Daniel@0: var configGridPanelView = $this.data("configGridPanelView"); Daniel@0: configGridPanelView._cachedConfig.cancelPlannedParameterUpdates(); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: // ----------------------------------------------------------------- Daniel@0: // config grid panel - sync Daniel@0: Daniel@0: syncConfigGridPanelMainArea: function(configGridPanelView, instant) { Daniel@0: var $inputs = configGridPanelView._$mainArea.data("$allInputs"); Daniel@0: if ($inputs) { Daniel@0: var _this = this; Daniel@0: $inputs.each(function() { Daniel@0: var $input = $(this); Daniel@0: var parameterName = $input.attr("data-parameter-name"); Daniel@0: if (parameterName) { Daniel@0: var widgetType = "textfield"; Daniel@0: if ($input.data("cgpma-tickbox")) { Daniel@0: widgetType = "tickbox"; Daniel@0: } Daniel@0: $input[widgetType]("option", { Daniel@0: "value": "" + _this.getConfigPlannedParameterValueOrDefaultValue(configGridPanelView._cachedConfig, parameterName), Daniel@0: "baseValue": "" + _this.getConfigParameterValueOrDefaultValue(configGridPanelView._cachedConfig, parameterName), Daniel@0: }); Daniel@0: } Daniel@0: }); Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: // ----------------------------------------------------------------- Daniel@0: // config grid panel - destroy Daniel@0: Daniel@0: destroyConfigGridPanelMainArea: function() { Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: // =========================== Daniel@0: // config grid header Daniel@0: Daniel@0: renderHeaderContent: function(headerView, instant) { Daniel@0: var newHashRelatedToOwnData = this._generateHeaderContentHashRelatedToOwnData(headerView); Daniel@0: Daniel@0: if (newHashRelatedToOwnData !== headerView._cachedContentHashRelatedToOwnData) { Daniel@0: this._doRenderHeaderContentRelatedToOwnData(headerView, instant); Daniel@0: headerView._cachedContentHashRelatedToOwnData = newHashRelatedToOwnData; Daniel@0: } Daniel@0: Daniel@0: var newHash = this._generateHeaderContentHashRelatedToGridLayout(headerView); Daniel@0: if (newHash !== headerView._cachedContentHashRelatedToGridLayout) { Daniel@0: this._doRenderHeaderContentRelatedToGridLayout(headerView, instant); Daniel@0: headerView._cachedContentHashRelatedToGridLayout = newHash; Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: _renderHeaderContentRelatedToGridLayout: function(headerView, instant) {}, Daniel@0: Daniel@0: Daniel@0: _generateHeaderContentHashRelatedToOwnData: function(headerView) { Daniel@0: return headerView.options.config.getHashForParameters() + (headerView.options.config.hasPlannedParameterUpdates() ? "1" : "0") + headerView.dynamicDerivedConfigData.getHash(); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: _generateHeaderContentHashRelatedToGridLayout: function(headerView) {} Daniel@0: }); Daniel@0: }); Daniel@0: }, Logger);