'use strict'; /** * Licensed Materials - Property of IBM * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2015, 2017 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ define(['../../lib/@waca/core-client/js/core-client/ui/core/Class', 'underscore'], function (Class, _) { /** * Service which facilitates access to contents of the dasboard spec. */ var Svc = Class.extend({ init: function init(boardModel) { this.boardModel = boardModel; //The filterContextAdapters map is responsible for providing functions that convert //widgetInstance type-specific filters to a portable form needed by the getFilterContext api. //Currently there is only one type so the function is provided. In future, this map could be extended or, to be more dynamic //callers could register their converters this._filterContextAdapters = { 'data': this._convertDataWidgetFilterContext //more converters should be referenced by widgetInstance type here. }; }, /** * Return mappings that match the condition in the supplied matching function as well as the dataset and optional page specified. * @param cbMappingMatches a matching function supplied by the caller....only mappings that succeed will be returned. * @param dataSetId A datasetId that any returned mappings must belong to. * @param containerPageId (optional) - Only mappings for widgets on the specified page will be processed (pageId is a string eg 'page1') * @returns an array of mappings that match the criteria defined in the callback function cbMappingMatches * */ getMappings: function getMappings(cbMappingMatches, dataSetId, containerPageId) { var returnMappings = []; if (!this.boardModel) { return returnMappings; } var fAddMapping = function fAddMapping(mapping) { if (cbMappingMatches(mapping)) { returnMappings.push(mapping); } }; _.keys(this.boardModel.widgetInstances).forEach(function (widgetInstanceModel) { var widgetInstance = this.boardModel.widgetInstances[widgetInstanceModel]; var mappings = widgetInstance.mapping; if (mappings && !Array.isArray(mappings)) { mappings = [mappings]; } var dataSetMatches = widgetInstance.dataSet && widgetInstance.dataSet.id === dataSetId; if (dataSetMatches && mappings) { //If containerPageId is not specified, all pages match. var pageIdMatches = !containerPageId; if (!pageIdMatches) { var pageForWidget = this.boardModel.layout.findTopLevelParentItem(widgetInstance.id); pageIdMatches = pageForWidget && pageForWidget.id === containerPageId; } if (pageIdMatches) { _.each(mappings, fAddMapping); } } }, this); return returnMappings; }, /** * Return an array of filterContexts in 'portable form' for all widgets that match the dataset and optional eventGroupId specified. * Since the datawidget is the only widget instance type with a filter context, portable form is the JSON format * it serializes but this is likely to change in future as new widgets capable of contributing to filter context are implemented (ie: visControl widget) * * For each widget, the array would be. * { * id: %widgetId%, * dataSet: %dataSetId,url%, * filterContext: { %portablefilterDefinition } * } * * @param dataSetId (optional) - include the filter context for widgets that match this dataSetId (widgets for all dataSets if null). * @param eventGroupId (optional) - include the filter context for widgets on this event group (widgets for all groups if null). * @returns the array as described for widgets that match the dataSetId and containerPageId constraints. */ getFilterContext: function getFilterContext(dataSetId, eventGroupId) { var returnResults = []; if (!this.boardModel) { return returnResults; } _.keys(this.boardModel.widgetInstances).forEach(function (widgetInstanceModel) { var widgetInstance = this.boardModel.widgetInstances[widgetInstanceModel]; var filterContextAdapter = this._filterContextAdapters[widgetInstance.type]; var dataSetMatches = !dataSetId || widgetInstance.dataSet && widgetInstance.dataSet.id === dataSetId; if (dataSetMatches && filterContextAdapter) { //If eventGroupId is not specified, all groups match. var groupIdMatches = !eventGroupId; if (!groupIdMatches) { var eventGroup = this.boardModel.eventGroups.findGroup(widgetInstance.id); groupIdMatches = eventGroup && eventGroup.id === eventGroupId; } if (groupIdMatches) { returnResults.push(filterContextAdapter(widgetInstance)); } } }, this); return returnResults; }, /** * This function is responsible for returning the filterContext in the form required by getFilterContext * for the data widget. If other widget types require returning * @param widgetInstance - the widgetInstance * @returns the filterContext structure which includes a filter specification in portable form that any widget type should be able * to interpret. */ _convertDataWidgetFilterContext: function _convertDataWidgetFilterContext(widgetInstance) { return { id: widgetInstance.id, dataSet: widgetInstance.dataSet, filterContext: widgetInstance.filters }; } }); return Svc; }); //# sourceMappingURL=DashboardSpecSvc.js.map