SmartIT_Extensions/BMC/smart-it-full/scripts/app/knowledge-article/ka-visibility-directive.js

154 lines
8.4 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('knowledgeArticleModule')
.directive('kaVisibilityDirective', ['knowledgeArticleModel', 'configurationModel', '$timeout', 'userModel', 'localStorageService', 'searchModel',
function (knowledgeArticleModel, configurationModel, $timeout, userModel, localStorageService, searchModel) {
return {
restrict: 'E',
templateUrl: 'views/knowledge-article/knowledge-article-visibility.html',
scope: {
article: '=',
company: '='
},
link: function (scope, element) {
var article = scope.article, state = {
loadVisibility: false,
visibilitySet: configurationModel.get('knowledgeArticle.visibilities'),
selectedVisibilitySetItem: null,
tooManyCompanies: false,
tooManyVisibilityGroups: false,
visibilityCompanies: [],
selectedVisibilityCompany: null,
visibilities: [],
selectedVisibility: null,
specificGroupCache: []
}, visibilityMap = {
everyone: function () {
return [{
visibilityGroupName: 'ALL',
company: 'ALL',
visibilityGroupId: '0'
}];
},
myCompany: function () {
return [{
visibilityGroupName: 'ALL',
company: scope.company.name,
visibilityGroupId: '0'
}];
},
lastGroupSet: function () {
return getSetOfVisibilityGroups();
},
specificGroup: function () {
return state.specificGroupCache;
}
}, localStorageLastTemplateKey = 'LAST_SET_OF_VISIBILITY_GROUPS';
searchModel.getOperatingCompanies(null, -1).then(function (response) {
state.visibilityCompanies = angular.extend([], response.companies);
state.tooManyCompanies = response.exceedsChunkSize;
state.visibilityCompanies.unshift({ name: 'ALL' });
});
_.find(state.visibilitySet, { value: 'myCompany' }).subLabel = scope.company.name;
scope.handleKeydown = function ($event) {
if ($event.keyCode === 27) { // escape key
var dropdownToggle = element.find('.dropdown-toggle');
$timeout(function () {
dropdownToggle.trigger('click');
dropdownToggle.focus();
}, 0);
$event.stopPropagation();
}
};
scope.visibilitySelected = function (item) {
if (state.selectedVisibilitySetItem && state.selectedVisibilitySetItem.value === 'specificGroup') {
state.specificGroupCache = _.cloneDeep(article.articleVisibilityGroup);
}
state.selectedVisibilitySetItem = item;
$timeout(function () {
article.articleVisibilityGroup = visibilityMap[state.selectedVisibilitySetItem.value]();
//manual close of dropdown for IE9-IE10
if (scope.state.isOpen) {
scope.state.isOpen = false;
}
var dropdownToggle = element.find('.dropdown-toggle');
dropdownToggle.focus();
}, 0);
};
scope.getCompaniesByName = function (name) {
return searchModel.getCompaniesByText(name).then(function (response) {
return { list: response.companies, exceedsChunkSize: response.exceedsChunkSize };
});
};
scope.getVisibilityGroupsByName = function (name) {
return knowledgeArticleModel.getVisibilityGroupsByText(state.selectedVisibilityCompany.name, name);
};
scope.loadVisibilityByCompanyName = function (companyName) {
state.visibilities = [];
state.loadVisibility = true;
return knowledgeArticleModel.getVisibilityByCompanyName(companyName).then(function (data) {
state.visibilities = data;
if (data.length >= searchModel.supportGroupChunkSize) {
state.tooManyVisibilityGroups = true;
}
else {
state.tooManyVisibilityGroups = false;
}
}).finally(function () {
state.loadVisibility = false;
});
};
scope.addVisibility = function () {
var item = {
company: state.selectedVisibilityCompany.name,
visibilityGroupName: state.selectedVisibility.visibilityGroupName,
visibilityGroupId: state.selectedVisibility.visibilityGroupId
}, visibilityArr = article.articleVisibilityGroup;
if (!_.find(visibilityArr, item)) {
visibilityArr.push(item);
}
state.selectedVisibility = null;
state.selectedVisibilityCompany = null;
};
scope.isAddButtonDisabled = function () {
if (!state.selectedVisibility) {
return true;
}
return _.filter(article.articleVisibilityGroup, {
company: state.selectedVisibilityCompany.name,
visibilityGroupName: state.selectedVisibility.visibilityGroupName
}).length;
};
scope.removeVisibility = function (tag) {
_.pull(article.articleVisibilityGroup, tag);
};
function getSetOfVisibilityGroups() {
return localStorageService.get(localStorageLastTemplateKey);
}
function getVisibilitySetItem() {
var visibilityConfiguration = configurationModel.get('knowledgeArticle.visibilities');
if (!article.articleVisibilityGroup.length) {
return null;
}
if (article.articleVisibilityGroup.length === 1) {
var visibility = _.pick(article.articleVisibilityGroup[0], ['visibilityGroupName', 'company']);
if (_.find(visibilityMap.everyone(), visibility)) {
return _.find(visibilityConfiguration, { value: 'everyone' });
}
if (_.find(visibilityMap.myCompany(), visibility)) {
return _.find(visibilityConfiguration, { value: 'myCompany' });
}
}
return _.find(visibilityConfiguration, { value: 'specificGroup' });
}
state.selectedVisibilitySetItem = getVisibilitySetItem();
scope.$watch('state.selectedVisibilityCompany', function () {
state.selectedVisibility = null;
}, true);
scope.state = state;
}
};
}]);
}());