"use strict"; (function () { 'use strict'; angular.module('consoleModule') .controller('ConsoleColumnConfiguratorController', ['$modalInstance', '$scope', 'systemAlertService', 'knowledgeConsoleModel', 'ticketConsoleModel', 'assetConsoleModel', 'permissionModel', 'roles', 'userModel', '$timeout', '$filter', 'params', function ($modalInstance, $scope, systemAlertService, knowledgeConsoleModel, ticketConsoleModel, assetConsoleModel, permissionModel, roles, userModel, $timeout, $filter, params) { $scope.state = { savingConfiguration: false }; $scope.userModel = userModel; $scope.userIsAdmin = permissionModel.hasRole(roles.ITSM_ADMIN_ROLE) || false; $scope.showMetadataReloadButton = false; $scope.consoleType = params.consoleType; var consoleModel = {}; switch (params.consoleType) { case 'ticket': consoleModel = ticketConsoleModel; break; case 'knowledge': consoleModel = knowledgeConsoleModel; break; case 'asset': consoleModel = assetConsoleModel; break; } $scope.availiableColumns = _.sortBy(_.filter(consoleModel.columnsConfig, { visible: false }), 'displayName'); $scope.selectedColumns = _.sortBy(_.filter(consoleModel.columnsConfig, { visible: true }), 'order'); if (params.consoleType === 'ticket') { if ($scope.userIsAdmin) { $scope.showMetadataReloadButton = true; } var columnFilter = consoleModel.ticketTypeFilter; if (columnFilter && columnFilter.options) { // copy the current ticket type filter config. The default setting for column filter should be // based on the ticket type filter config. $scope.columnFilterOptions = _.cloneDeep(columnFilter.options); // However, if no ticket types were selected in filter config, that means user want to see all ticket types, // in this case, all columns should be available for selecting. if (_.filter($scope.columnFilterOptions, { active: true }).length === 0) { _.forEach($scope.columnFilterOptions, function (option) { option.active = true; }); } $scope.columnFilterOptions.unshift({ name: 'general', label: 'general', order: 1, active: true }); } updateColumnDisplayProperty(); } else { _.forEach($scope.availiableColumns, function (column) { column.onDisplay = true; }); _.forEach($scope.selectedColumns, function (column) { column.onDisplay = true; }); } var optionsAvailiable = { placeholder: 'column-configurator__column', connectWith: '.column-configurator__container' }, optionsSelected = { placeholder: 'column-configurator__column', connectWith: '.column-configurator__container', update: function (event, ui) { if ($scope.selectedColumns.length === 1) { ui.item.sortable.cancel(); } } }; $scope.sortableOptionsList = [optionsAvailiable, optionsSelected]; $scope.updateColumnFilter = function (filterOption) { filterOption.active = !filterOption.active; updateColumnDisplayProperty(); }; function updateColumnDisplayProperty() { var ticketTypeSelected = _.map(_.filter($scope.columnFilterOptions, { active: true }), 'name'); var generalSelected = ticketTypeSelected.indexOf('general') !== -1; _.forEach($scope.availiableColumns, function (column) { if ((angular.isUndefined(column.ticketType) && generalSelected) || _.intersection(column.ticketType, ticketTypeSelected).length > 0) { column.onDisplay = true; } else { column.onDisplay = false; } }); _.forEach($scope.selectedColumns, function (column) { if ((angular.isUndefined(column.ticketType) && generalSelected) || _.intersection(column.ticketType, ticketTypeSelected).length > 0) { column.onDisplay = true; } else { column.onDisplay = false; } }); } $scope.submit = function () { var columsToUpdate = {}; $scope.state.savingConfiguration = true; $timeout(function () { _.forEach($scope.availiableColumns, function (column) { if (consoleModel.columnsConfig[column.name].visible) { consoleModel.columnsConfig[column.name].visible = false; delete consoleModel.columnsConfig[column.name].order; if (params.consoleType !== 'ticket') { columsToUpdate[column.name] = { visible: false }; } } }); if (params.consoleType === 'ticket') { _.forEach($scope.selectedColumns, function (column, idx) { var columnIndex = ++idx, insertUpdateColumn = function (columnName, propName, propValue) { if (!columsToUpdate[columnName]) { columsToUpdate[columnName] = {}; } columsToUpdate[columnName][propName] = propValue; }; if (consoleModel.columnsConfig[column.name].order !== columnIndex) { consoleModel.columnsConfig[column.name].order = columnIndex; } insertUpdateColumn(column.name, 'order', columnIndex); if (!consoleModel.columnsConfig[column.name].visible) { consoleModel.columnsConfig[column.name].visible = true; } insertUpdateColumn(column.name, 'visible', true); if (consoleModel.columnsConfig[column.name].type) { insertUpdateColumn(column.name, 'type', consoleModel.columnsConfig[column.name].type); } }); } else { _.forEach($scope.selectedColumns, function (column, idx) { var columnIndex = ++idx, insertUpdateColumn = function (columnName, propName, propValue) { if (!columsToUpdate[columnName]) { columsToUpdate[columnName] = {}; } columsToUpdate[columnName][propName] = propValue; }; if (!consoleModel.columnsConfig[column.name].visible) { consoleModel.columnsConfig[column.name].visible = true; insertUpdateColumn(column.name, 'visible', true); } if (consoleModel.columnsConfig[column.name].order !== columnIndex) { consoleModel.columnsConfig[column.name].order = columnIndex; insertUpdateColumn(column.name, 'order', columnIndex); } }); } consoleModel.updateColumnConfig(columsToUpdate); $modalInstance.close(); }, 10); }; $scope.updateColumn = function (column, listName) { if (listName === 'available') { $scope.availiableColumns.splice($scope.availiableColumns.indexOf(column), 1); $scope.selectedColumns.push(column); } else { // don't let user remove all the columns. At leaset one columns should be there. if ($scope.selectedColumns.length === 1) { systemAlertService.error({ text: $filter('i18n')('console.ticket.allColumnsRemove.warning'), clear: true }); return false; } $scope.selectedColumns.splice($scope.selectedColumns.indexOf(column), 1); $scope.availiableColumns.push(column); } }; $scope.moveColumn = function (index, direction) { var selectedColumn = $scope.selectedColumns[index]; if (direction === 'up' && $scope.selectedColumns[index - 1]) { $scope.selectedColumns[index] = $scope.selectedColumns[index - 1]; $scope.selectedColumns[index - 1] = selectedColumn; } else if (direction === 'down' && $scope.selectedColumns[index + 1]) { $scope.selectedColumns[index] = $scope.selectedColumns[index + 1]; $scope.selectedColumns[index + 1] = selectedColumn; } }; $scope.refreshMetadata = function () { if ($scope.showMetadataReloadButton) { $modalInstance.close('refresh'); } }; } ]); })();