| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774 |
- 'use strict';
- define(['../lib/@waca/dashboard-common/dist/ui/SearchableListView', '../lib/@waca/core-client/js/core-client/utils/Deferred', 'text!./templates/PinView.html', 'text!./templates/PinListItem.html', 'text!./templates/EmptyPinsList.html', '../app/nls/StringResources', 'jquery', 'underscore', 'doT', '../lib/@waca/core-client/js/core-client/utils/Utils', '../lib/@waca/core-client/js/core-client/utils/BidiUtil', '../lib/@waca/core-client/js/core-client/utils/ContentFormatter', '../lib/@waca/dashboard-common/dist/ui/toolbar_components/ToggleMenuBar', '../lib/@waca/dashboard-common/dist/lib/@ba-ui-toolkit/ba-graphics/dist/illustrations-js/no-pins_128'], function (SearchableListView, Deferred, ViewTemplate, PinListItem, EmptyPinsList, StringResources, $, _, dot, Utils, BidiUtil, ContentFormatter, ToggleMenuBar, noPinIcon) {
- var DEFAULT_DELAY = 500;
-
- var View = SearchableListView.extend({
- events: {
- 'mousedown .pinItem>div:not(.prop-deleteButton-item)': 'onDragStart',
- 'mouseup .pinItem>div:not(.prop-deleteButton-item)': 'onMouseUp',
- 'dragstart .pinItem': 'onDragStart',
- 'primaryaction .prop-deleteButton-item': 'onSingleRemove',
- 'deleteaction .pinItem': 'onSingleRemove'
- },
- itemTemplate: PinListItem,
- templateString: ViewTemplate,
- init: function init(attributes) {
- View.inherited('init', this, arguments);
- this.ajaxSvc = attributes.ajaxSvc;
- this.glassContext = attributes.glassContext;
- this.canvasController = attributes.canvasController;
- this.dashboardApi = this.canvasController.dashboardApi;
- this._icons = this.dashboardApi.getFeature('Icons');
- this.logger = this.glassContext.getCoreSvc('.Logger');
- this.dndManager = attributes.dndManager;
- this.dashboardPinningService = attributes.dashboardPinningService;
- this.smartNamingSvc = attributes.smartNamingSvc;
- this.promiseMap = {};
- this.pinCount = 0;
- this.viewMode = attributes.viewMode;
- this.elementClass = 'pinsPanel';
- this.dateFilterString = 'all';
- if (this.dashboardPinningService) {
-
- this.addHandler = this.dashboardPinningService.on('pin:created', this.addPin.bind(this));
-
- this.postDeletionHandler = this.dashboardPinningService.on('pin:deleted', this.postDeletion.bind(this));
-
- this.fakeDeletionHandler = this.dashboardPinningService.on('pin:fakeDeleted', this.fakeDeletion.bind(this));
-
- this.undoDeletionHandler = this.dashboardPinningService.on('pin:undoDeletion', this.undoDeletion.bind(this));
- } else {
- throw new Error('Pinning service not provided to PinsPanel constructor');
- }
- },
-
- onItemClick: function onItemClick(event) {
-
- event.stopPropagation();
-
- this._clearSelections();
-
- var $target = $(this.getTarget(event.currentTarget, 'pinItem'));
- this._toggleSelection($target);
-
- this._updateActionButtons();
- },
- onKeyDown: function onKeyDown(event) {
- var $target = $(this.getTarget(event.currentTarget, 'pinItem'));
- if (['Enter', ' '].indexOf(event.key) !== -1) {
-
- if (!$target.hasClass('selected')) {
- this._toggleSelection($target);
- }
- this.onKeyDownToCreatePin(event);
- } else {
- View.inherited('onKeyDown', this, arguments);
- }
- },
-
- onSelectItem: function onSelectItem(event) {
- this.onItemClick(event);
- },
-
- onRemoveClick: function onRemoveClick() {
-
- var pinId = this._getSelectedPin();
- return this.deletePin(pinId);
- },
-
- onSingleRemove: function onSingleRemove(event) {
- var pinEl = $(event.currentTarget).parents('.listitem')[0] || event.target;
- var pinToRemove = pinEl.getAttribute('data-id');
- return this.deletePin(pinToRemove);
- },
-
- accepts: function accepts(dragObject) {
- return dragObject.type === 'pin';
- },
-
- onDragStart: function onDragStart(event) {
- var _this = this;
- this._mouseUp = false;
- if (this.dashboardApi.getMode() !== this.dashboardApi.MODES.EDIT) {
- return Promise.resolve(true);
- }
- var pinEl = $(event.currentTarget).parents('.listitem')[0] || event.target;
- var id = pinEl.getAttribute('data-id');
- if (id) {
- return this.getPin(id).then(function (pinSpec) {
-
- if (_this._mouseUp) {
- return;
- }
- pinSpec = JSON.parse(JSON.stringify(pinSpec));
- if (!_.isEmpty(pinSpec) && !_this._stoppedDrag) {
- _this.dndManager.startDrag({
- event: event,
- type: 'pin',
- data: _this._buildDropInfo(pinSpec),
- avatar: _this._buildAvatar(pinSpec),
- moveXThreshold: 20,
- moveYThreshold: 20,
- callerCallbacks: {
- onDragDone: _this.onDragStop.bind(_this)
- }
- });
- }
- });
- } else {
- return Promise.resolve();
- }
- },
-
- onMouseUp: function onMouseUp() {
- this._mouseUp = true;
- this.onDragStop();
- },
- onDragStop: function onDragStop() {
- this._clearSelections();
- },
-
- getPin: function getPin(id) {
- return this.dashboardPinningService.getPin(id);
- },
-
- _buildAvatar: function _buildAvatar(pinSpec) {
- var avatar = $('<img/>', {
- class: 'avatar pin'
- });
- avatar.attr('src', pinSpec.thumbUri);
- return avatar;
- },
-
- _buildDropInfo: function _buildDropInfo(pinSpec) {
- return {
- operation: 'new',
- pinSpec: pinSpec
- };
- },
-
- deletePin: function deletePin(id) {
- this.dashboardPinningService.deletePin(id);
- },
-
- undoDeletion: function undoDeletion(pinId) {
- var that = this;
- var deferred = new Deferred();
- this.promiseMap[pinId].promise.done(function () {
- var $pinItem = that.$el.find('.pinItem[data-id=' + pinId + ']');
- $pinItem.slideDown(DEFAULT_DELAY, function () {
-
- that.pinCount++;
- that._updatePinCount();
-
- delete that.promiseMap[pinId];
- deferred.resolve();
- });
- });
- return deferred.promise;
- },
-
- fakeDeletion: function fakeDeletion(pinId) {
- var _this2 = this;
- var deferred = new Deferred();
-
- this.promiseMap[pinId] = deferred;
- var $pinItem = this.$el.find('.pinItem[data-id=' + pinId + ']');
- $pinItem.slideUp(DEFAULT_DELAY, function () {
-
- _this2.pinCount--;
- _this2._updatePinCount();
-
- _this2._clearSelections();
- _this2._updateActionButtons();
- deferred.resolve();
- });
- },
-
- postDeletion: function postDeletion(pinId) {
- var view = this;
- var deferred = new Deferred();
- if (this.promiseMap[pinId]) {
- this.promiseMap[pinId].promise.done(function () {
- var $el = view.$el.find('.pinItem[data-id=' + pinId + ']');
- $el.remove();
-
- var firstEl = view.$el.find('.pinItem:first');
- if (firstEl.length) {
- firstEl.attr('tabindex', '0');
- }
-
- delete view.promiseMap[pinId];
- deferred.resolve();
- });
- } else {
- deferred.resolve();
- }
- return deferred.promise;
- },
-
- onKeyDownToCreatePin: function onKeyDownToCreatePin(event) {
-
- var pinId = this._getSelectedPin();
- if (pinId) {
- return this.getPin(pinId).then(function (pinSpec) {
- pinSpec = JSON.parse(JSON.stringify(pinSpec));
- if (!_.isEmpty(pinSpec)) {
- var fragmentModel = {
- layout: pinSpec.content.layout,
- widgets: pinSpec.content.widgets,
- dataSources: pinSpec.content.dataSources,
- version: pinSpec.version ? pinSpec.content.specVersion : 6,
- sourceName: pinSpec.sourceName
- };
- if (pinSpec.content.episodes) {
- fragmentModel.episodes = pinSpec.content.episodes;
- }
- var options = {
- model: fragmentModel
- };
- if (pinSpec.content.layout && pinSpec.content.layout.style) {
- options.layoutProperties = {
- style: _.omit(pinSpec.content.layout.style, 'top', 'left')
- };
- }
- var isTouch = event.type === 'tap';
- this._addPinToLayout(options, isTouch);
- this._clearSelections();
- }
- }.bind(this));
- } else {
- return Promise.resolve();
- }
- },
- _addPinToLayout: function _addPinToLayout(options, isTouch) {
- this.canvasController.addPin(options, isTouch);
- },
-
- renderComplete: function renderComplete() {
-
- this._updatePinCount();
- this._middleShortenPins();
- this._setIcons();
- this._setFocus();
- },
- renderList: function renderList(items) {
- this.pinCount = items ? items.length : 0;
- View.inherited('renderList', this, arguments);
- },
- render: function render() {
- var deferred = new Deferred();
- this.dndManager.removeDropTarget(this.el);
- View.inherited('render', this).done(function () {
- this.dndManager.addDropTarget(this.el, {
- accepts: this.accepts
- });
- this._renderDateFilterDropdown().then(function () {
- deferred.resolve();
- });
- }.bind(this));
- return deferred.promise;
- },
- _filterByDate: function _filterByDate(filterString) {
- var _this3 = this;
- if (!filterString) {
- return;
- }
- this.dateFilterString = filterString;
- if (this.dateFilterString !== 'all') {
- this.$el.find('.filterWrapper').addClass('filtered');
- } else {
- this.$el.find('.filterWrapper').removeClass('filtered');
- }
- return this._getPins().then(function (pins) {
- _this3.pinCount = pins.length;
- _this3.renderList(pins);
-
- _this3.$el.find('.treeSearchInput').trigger('input');
- _this3.renderComplete();
- });
- },
- _renderDateFilterDropdown: function _renderDateFilterDropdown() {
- var _this4 = this;
- var $filterWrapper = this.$el.find('.filterWrapper');
- var menuItems = [{
- 'name': 'all',
- 'label': StringResources.get('pinDateFilterAll'),
- 'cssStyleClass': 'blueSelectedBar',
- 'action': function action() {
- _this4._filterByDate('all');
- }
- }, {
- 'name': 'today',
- 'label': StringResources.get('pinDateFilterToday'),
- 'cssStyleClass': 'blueSelectedBar',
- 'action': function action() {
- _this4._filterByDate('today');
- }
- }, {
- 'name': 'yesterday',
- 'label': StringResources.get('pinDateFilterYesterday'),
- 'cssStyleClass': 'blueSelectedBar',
- 'action': function action() {
- _this4._filterByDate('yesterday');
- }
- }, {
- 'name': 'pastWeek',
- 'label': StringResources.get('pinDateFilterPastWeek'),
- 'cssStyleClass': 'blueSelectedBar',
- 'action': function action() {
- _this4._filterByDate('pastWeek');
- }
- }, {
- 'name': 'pastMonth',
- 'label': StringResources.get('pinDateFilterPastMonth'),
- 'cssStyleClass': 'blueSelectedBar',
- 'action': function action() {
- _this4._filterByDate('pastMonth');
- }
- }, {
- 'name': 'earlier',
- 'label': StringResources.get('pinDateFilterEarlier'),
- 'cssStyleClass': 'blueSelectedBar',
- 'action': function action() {
- _this4._filterByDate('earlier');
- }
- }];
- this.ddMenu = new ToggleMenuBar({
- 'label': StringResources.get('pinDateFilter'),
- 'items': menuItems,
- 'actionElement': $filterWrapper,
- 'ddMenuPlacement': 'bottom-left',
- 'showTitle': false,
- 'updateLabel': true,
- 'icon': 'common-filter'
- });
- return this.ddMenu.render().then(function ($el) {
- Utils.setIcon($el.find('.common-filter'), _this4._icons.getIcon('filter').id, StringResources.get('pinDateFilter'));
- _this4.$el.find('.filterWrapper').append($el);
- });
- },
- _setFocus: function _setFocus() {
- this.$el.find('.searchWrapper input').focus();
- this.$el.find('.pinItem:first').attr('tabindex', '0');
- },
- _setIcons: function _setIcons() {
- var $deleteIcon = this.$el.find('.deleteButtonHolder:not(:has(svg))');
- Utils.setIcon($deleteIcon, 'dashboard-remove', StringResources.get('pinRemove'));
- },
-
- _updateEmptyPinsList: function _updateEmptyPinsList() {
- if (!this.pinCount) {
- this.$el.find('.list').append(dot.template(EmptyPinsList)({
- text: StringResources.get('NoPinsCollected'),
- emptyBeeIcon: noPinIcon.default.id
- }));
- } else {
- this.$el.find('.list .emptyTableContent').remove();
- }
- },
- _middleShortenPins: function _middleShortenPins() {
- if (this.pinCount) {
- var $pinTexts = this.$el.find('.pinName, .pinSource, .pinAge');
- for (var i = 0; i < $pinTexts.length; i++) {
- ContentFormatter.middleShortenString($pinTexts[i]);
- }
- }
- },
-
- getCustomRenderProperties: function getCustomRenderProperties() {
- return {
- searchText: StringResources.get('pinSearchOld'),
- lbl_listView: StringResources.get('pinListView'),
- lbl_iconView: StringResources.get('pinIconView'),
- lbl_remove: StringResources.get('pinRemove'),
- lbl_add: StringResources.get('add'),
- roleType: 'listitem',
- searchIcon: this._icons.getIcon('search').id
- };
- },
-
- getListItems: function getListItems() {
- var _this5 = this;
- return this._getPins().then(function (pins) {
- _this5.pinCount = pins.length;
- return pins;
- });
- },
- _getPins: function _getPins() {
- return this.dashboardPinningService.getPins(this.dateFilterString);
- },
-
- addPin: function addPin(pin) {
- if (!pin) {
- return;
- }
-
- if (this.dateFilterString !== 'yesterday' && this.dateFilterString !== 'earlier') {
- this.pinCount++;
- this._renderPin(pin);
- }
- this.$el.find('.treeSearchInput').trigger('input');
- },
-
- _renderPin: function _renderPin(pin) {
- var sHtml = this._getListItemsHtml([pin]);
- var $list = this.$el.find(this.controlClassSelector);
- var view = this;
-
- $list.queue(function () {
- var $item = $(this);
- $(sHtml).hide().css('opacity', 0.0).prependTo($list).delay(200).slideDown('slow', function () {
- $(this).animate({
- opacity: 1.0
- }).show();
- view.renderComplete();
-
- window.setTimeout(function () {
- $item.dequeue();
- }, 500);
- });
- });
- },
-
- prepareListItem: function prepareListItem(item) {
- item.cssClass = 'pinItem';
- item.selected = false;
- item.canSingleDelete = true;
- item.label_delete = StringResources.get('pinRemove');
- item.isSingleGroup = true;
- return item;
- },
-
- _toggleSelection: function _toggleSelection($item) {
-
- this._selectItem($item, !$item.hasClass('selected'));
- },
-
- _selectItem: function _selectItem($item, select) {
- if (select) {
-
- $item.addClass('selected');
- } else {
-
- $item.removeClass('selected');
- }
- },
-
- _updateActionButtons: function _updateActionButtons() {
-
- var $buttons = this.$el.find('.actionButton');
-
- if (this.$el.find('.pinItem.selected').length > 0 && this.dashboardApi.getMode() === this.dashboardApi.MODES.EDIT) {
-
- $buttons.removeClass('disabled');
- $buttons.prop('disabled', false);
- $buttons.attr('tabindex', '0');
- } else {
-
- $buttons.addClass('disabled');
- $buttons.prop('disabled', true);
- $buttons.attr('tabindex', '-1');
- }
- },
-
- _getSelectedPin: function _getSelectedPin() {
-
- var $listItems = this.$el.find('.pinItem.selected');
- if ($listItems.length === 1) {
- return $listItems[0].getAttribute('data-id');
- }
- },
-
- _updatePinCount: function _updatePinCount() {
-
- var formattedCount = BidiUtil.enforceNumericShaping(this.pinCount);
- this.$el.find('.pinCount').text(StringResources.get('pinCount', {
- smart_count: formattedCount,
- count: formattedCount
- }));
- this._updateEmptyPinsList();
- },
-
- _getSearchableItems: function _getSearchableItems() {
- return this.dashboardPinningService.getCachedPins(this.dateFilterString);
- },
-
- _getSearchableFieldValue: function _getSearchableFieldValue(value) {
- var _this6 = this;
-
- var separator = '___';
- var fields = value.displayName + separator + value.sourceName;
- if (value.contentType === 'boardFragment' && value.content.widgets) {
-
- _.each(value.content.widgets, function (widget) {
- fields = fields + separator + _this6.smartNamingSvc.getLocalizedWidgetType(widget);
- _.each(widget.mapping, function (mapping) {
- fields = fields + separator + mapping.label;
- });
-
- var items = widget.data && widget.data.dataViews && widget.data.dataViews[0] && widget.data.dataViews[0].dataItems;
- _.each(items, function (item) {
- fields = fields + separator + item.itemLabel;
- });
- });
- }
- return fields;
- },
- _clearSelections: function _clearSelections() {
- this.$el.find('.listitem').removeClass('selected');
- },
-
- remove: function remove() {
- this.addHandler.remove();
- this.postDeletionHandler.remove();
- this.fakeDeletionHandler.remove();
- this.undoDeletionHandler.remove();
- View.inherited('remove', this, arguments);
- }
- });
- return View;
- });
|