SmartIT_Extensions/BMC/smart-it-full/scripts/app/console/column-configurator-control...

193 lines
10 KiB
JavaScript

"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(_.where(consoleModel.columnsConfig, { visible: false }), 'displayName');
$scope.selectedColumns = _.sortBy(_.where(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 = _.pluck(_.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');
}
};
}
]);
})();