123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- '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 = $('<div>');
- 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
|