public/layouts/dashboard/dashboard-toolbar.js (134 lines of code) (raw):

import angular from 'angular'; import 'lib/date-service'; import 'lib/filters-service'; import 'lib/prodoffice-service'; import 'lib/presence'; import { wfToolbarSectionsDropdown } from 'components/toolbar-sections-dropdown/toolbar-sections-dropdown'; import './dashboard-toolbar.html'; angular.module('wfDashboardToolbar', ['wfFiltersService', 'wfDateService', 'wfPresenceService', 'wfProdOfficeService']) .directive('wfToolbarSectionsDropdown', ['wfFiltersService', '$rootScope', 'sectionsInDesks', wfToolbarSectionsDropdown]) .controller('wfDashboardToolbarController', ['$scope', 'wfFiltersService', 'wfDateParser', 'wfProdOfficeService', 'desks', 'sections', 'sectionsInDesks', 'wfTitleService', function ($scope, wfFiltersService, wfDateParser, prodOfficeService, desks, sections, sectionsInDesks, wfTitleService) { $scope.selectedDesk = null // Prod Office =========================== $scope.selectedProdOffice = wfFiltersService.get('prodOffice'); $scope.prodOffices = prodOfficeService.getProdOffices(); $scope.$watch('selectedProdOffice', function (newValue, oldValue) { if (newValue !== oldValue) { // Prevents fire change event on init $scope.$emit('filtersChanged.prodOffice', $scope.selectedProdOffice); } }); // Sections ============================= function buildSelectedSections () { var sectionsString = wfFiltersService.get('section'); var sectionsStringArray = (typeof sectionsString === "string") ? sectionsString.split(',') : []; return sections.filter((el) => sectionsStringArray.indexOf(el.name) !== -1); } $scope.selectedSections = buildSelectedSections(); $scope.$on('filtersChanged.fromPreferences', function() { $scope.selectedSections = buildSelectedSections(); $scope.selectedDesk = updateSelectedDeskBasedOnSections($scope.selectedSections); }); $scope.sections = sections; // Desks ================================ /** * Update the selected desk scope variable based on whether a supplied array of selected sections matches any of * the desk configurations * @param selectedSections Array of sections eg: ["Environment", "Money", "News", "Technology"] */ function updateSelectedDeskBasedOnSections (selectedSections) { if (selectedSections.length === 0) { return null; } var selectedSectionIds = $scope.sections.filter((el) => selectedSections.indexOf(el.name) !== -1).map((el) => el.id); var selectedSectionsInDesksOption = sectionsInDesks.filter((el) => // Dirty Array comparison el.sectionIds.every((e) => selectedSectionIds.indexOf(e) !== -1) && // Has every element the other has el.sectionIds.length === selectedSectionIds.length // same length ); if (selectedSectionsInDesksOption.length) { // Found a matching desk return $scope.desks.filter((el) => el.id === selectedSectionsInDesksOption[0].deskId)[0]; } else { // Custom cofiguration -> selectedDesk = 'Custom' return $scope.desks[0]; } } $scope.desks = [{ name: 'Custom', id: 0, selected: false }].concat(desks); $scope.$watch('selectedDesk', function (newVal, oldVal) { // The listener will always get called on initialization, even if nothing has changed // Avoid doing anything when this is the case // https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch if (newVal === oldVal) { return } if ($scope.selectedDesk && $scope.selectedDesk.id) { $scope.$emit('filtersChanged.desk', $scope.selectedDesk.id); } else if ($scope.selectedDesk === null) { // 'All desks' $scope.$emit('filtersChanged.desk', -1); } if ($scope.selectedDesk && $scope.selectedDesk.name) { wfTitleService.set($scope.selectedDesk.name + ' - Workflow'); } else { wfTitleService.set('Workflow'); } }); $scope.$on('filtersChanged.section', function ($event, selectedSections) { // If selected sections are changed see if they constitute a desk or not $scope.selectedDesk = updateSelectedDeskBasedOnSections(selectedSections); }); $scope.selectedDesk = updateSelectedDeskBasedOnSections($scope.selectedSections.map((el) => el.name)); // Today View =========================== $scope.availableContentViews = [{name: 'Today', value: 'today'}]; $scope.selectedView = wfFiltersService.get('view'); // All $scope.$watch('selectedView', (newVal, oldVal) => { // The listener will always get called on initialization, even if nothing has changed // Avoid doing anything when this is the case // https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch if (newVal === oldVal) { return } $scope.$emit('filtersChanged.view', newVal); }, true); // Misc ================================= $scope.$on('filters.clearAll', () => { $scope.selectedSections = []; $scope.selectedDesk = null; $scope.selectedProdOffice = null; $scope.selectedView = null; }); }]) .directive('wfToolbarOption', [function () { return { restrict: 'A', require: '^ngModel', scope: { ngModel: '=', optionName: '@wfToolbarOption', value: '@wfToolbarOptionValue' }, link: function (scope, elem, attrs, ngModel) { var className = 'dashboard-toolbar__' + scope.optionName + '-option', activeClass = className + '--active', value = scope.value || undefined; ngModel.$render = function () { var newValue = ngModel.$modelValue; if (newValue === value) { elem.addClass(activeClass); elem.removeClass(className); } else { elem.addClass(className); elem.removeClass(activeClass); } }; elem.on('click', function () { ngModel.$setViewValue(value); ngModel.$render(); scope.$apply(); }); } }; }]) .directive('wfToolbarDisableOnSearch', [function () { return { scope: {}, restrict: 'A', link: function (scope, elem) { var elemScope = elem.scope() elemScope.isEnabled = ""; scope.$on("search-mode.enter", function() { elemScope.isEnabled = "--disabled"; }); scope.$on("search-mode.exit", function() { elemScope.isEnabled = ""; }); } } }]);