'use strict'; /** * Licensed Materials - Property of IBM * IBM Cognos Products: Dashboard (C) Copyright IBM Corp. 2016, 2020 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ define(['jquery', 'underscore', '../DynamicFileLoader', '../lib/@waca/core-client/js/core-client/ui/core/View' //TODO change to non lib version ], function ($, _, DynamicFileLoader, View) { /** * Creates an application bar to serve as a main menu bar */ var Toolbar = View.extend({ moduleMap: [], addItemsReady: null, init: function init(options) { Toolbar.inherited('init', this, arguments); this.options = !this.options ? {} : this.options; _.extend(this.options, options); this.items = options.items; this.itemMap = {}; this._readyArray = []; this._reactToolbarContainer = null; this._isReactToolbar = this._canRenderInReactToolbar(options.items); }, /** * Adds an item to the toolbar * * Returns a deferred object that will be resolve once the rendered item is added to the toolbar */ addItem: function addItem(itemSpec) { return this._addItem(itemSpec); }, _addItem: function _addItem(itemSpec) { // Need to add the item to the bar before requiring a module var $item = $('
'); this.$el.append($item); return this._renderItem(itemSpec, $item); }, _renderItem: function _renderItem(itemSpec, $item) { if (!itemSpec.type && !itemSpec.module) { itemSpec.type = 'Menu'; } var module = itemSpec.type ? 'ui/toolbar_components/' + itemSpec.type : itemSpec.module; return this._renderItemHelper(module, itemSpec, $item); }, _renderItemHelper: function _renderItemHelper(module, itemSpec, $item) { var _this = this; var promise = DynamicFileLoader.load([module]).then(function (modules) { var Item = modules[0]; itemSpec.el = $item; var item = new Item(itemSpec, _this.rootMenu || _this.parentView, _this); _this.itemMap[item.name] = item; return Promise.resolve().then(item.render.bind(item)); }); this._readyArray.push(promise); return promise; }, /** * Removes an item from the toolbar */ removeItem: function removeItem(itemName) { this.itemMap[itemName].remove(); delete this.itemMap[itemName]; }, /** * If any item is of type SubView, we want to create the toolbar in the old way. * React toolbar does not support SubViews */ _canRenderInReactToolbar: function _canRenderInReactToolbar() { var itemSpecs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var isSupportedInReactToolbar = function isSupportedInReactToolbar(spec) { return spec.type !== 'SubView'; }; return this.options.reactToolbar && itemSpecs.every(isSupportedInReactToolbar); }, /** * Add an array of items to the toolbar * @param itemSpecs * * Returns a deferred object that will be resolved when all items are rendered and added to the toolbar */ addItems: function addItems() { var _this2 = this; var itemSpecs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; this._isReactToolbar = this._canRenderInReactToolbar(itemSpecs); if (this._isReactToolbar) { this.addItemsReady = DynamicFileLoader.load(['ui/react_toolbar/ReactToolbarContainer']).then(function (modules) { var ReactToolbarContainer = modules[0]; _this2._reactToolbarContainer = new ReactToolbarContainer(itemSpecs, _this2.el, _this2); _this2.itemMap = itemSpecs; // TODO: consumers are expecting an item name:view map and not an array of specs }); } else { this.addItemsReady = Promise.all(itemSpecs.map(function (itemSpec) { return _this2._addItem(itemSpec); })); } return this.addItemsReady; }, clearItems: function clearItems() { _.each(this.itemMap, function (item) { if (item.remove) { item.remove(); } }); if (this._isReactToolbar) { if (this._reactToolbarContainer) { this._reactToolbarContainer.clearItems(); this._reactToolbarContainer = null; } } else { this.$el.empty(); } this.itemMap = {}; this._readyArray = []; }, /** * Draws the Toolbar */ render: function render() { this.$el.empty(); if (this.items) { return this.addItems(this.items); } return Promise.resolve(); }, ready: function ready() { var _this3 = this; if (this._isReactToolbar) { return this.addItemsReady.then(function () { var orientation = _this3.options.preferredVertical ? 'vertical' : 'horizontal'; orientation = _this3.placement === 'top' ? 'horizontal' : orientation; return _this3._reactToolbarContainer.ready(orientation); }); } else { return Promise.all(this._readyArray); } }, setFocus: function setFocus() { var first = Object.keys(this.itemMap)[0]; if (first) { var focusElement = this.itemMap[first]; if (focusElement && focusElement.setFocus) { focusElement.setFocus(); } } }, updateButtons: function updateButtons() { if (this.itemMap) { _.each(this.itemMap, function (item) { if (item.update) { item.render(); } }); } }, remove: function remove() { this.clearItems(); Toolbar.inherited('remove', this, arguments); } }); return Toolbar; }); //# sourceMappingURL=Toolbar.js.map