"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); }; scope.focusAddButton = function () { if (state.selectedVisibilityCompany && state.selectedVisibility) { $timeout(function () { element.find('.ka-metadata-specific-section__button').focus(); }); } }; 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; } }; }]); }());