"use strict"; /** * Created by etang */ (function () { 'use strict'; angular.module('customWidgetsModule') .directive('personName', ["customFieldLinkFunction", "createTicketModel", "events", "objectValueMapperService", "permissionModel", "roles", "$modal", "$rootScope", "systemAlertService", "i18nService", "$timeout", "ticketModel", "configurationModel", function (customFieldLinkFunction, createTicketModel, events, objectValueMapperService, permissionModel, roles, $modal, $rootScope, systemAlertService, i18nService, $timeout, ticketModel, configurationModel) { 'ngInject'; return { restrict: 'E', replace: true, require: '?ngModel', scope: { data: '=', context: '=', isEditable: '=', isNew: '=' }, templateUrl: 'views/custom-widgets/person-name.html', controller: ["$scope", function ($scope) { $scope.options = { typeaheadFocusFirst: true }; if (permissionModel.hasRole(roles.ITSM_PEOPLE_USER_ROLE)) { $scope.options.typeaheadFocusFirst = false; } }], link: function (scope) { customFieldLinkFunction(scope); scope.showMailstopOnPersoncard = configurationModel.showMailstopOnPersoncard; scope.showPhoneNumOnPersonCard = configurationModel.showPhoneNumOnPersonCard; scope.state = { dataLoading: false }; var isContactWidget = scope.data.name === 'contact'; if (scope.data.value && !scope.data.value.fullName && scope.data.value.firstName) { scope.data.value.fullName = scope.data.value.firstName + ' ' + scope.data.value.lastName; } var members = []; if (scope.data.members) { _.forEach(scope.data.members, function (member) { members.push(member.name); }); } var originaldata = _.cloneDeep(scope.data.value), valueHistory = [scope.data.value]; var modalScope; scope.customerCompany = ""; scope.validate = function () { if (typeof (scope.data.value) !== 'object') { scope.data.value = ''; } }; scope.update = function ($model) { if (scope.data.name === 'requestedFor') { return systemAlertService.modal({ title: i18nService.getLocalizedString('create.change.setRequestedForLocation.title'), text: i18nService.getLocalizedString('create.change.setRequestedForLocation.text'), buttons: [ { text: i18nService.getLocalizedString('common.button.yes'), data: true }, { text: i18nService.getLocalizedString('common.button.no'), data: false } ] }).result.then(function (data) { if (data) { updateValue($model); } }); } else { updateValue($model); } }; function updateValue($model) { var personData = scope.data.value; if ($model.isEmptyResult) { if (!modalScope) { modalScope = $rootScope.$new(); modalScope.isContactCreateAction = isContactWidget; } var modalInstance = $modal.open({ templateUrl: 'views/person/create-person.html', controller: 'createPersonController', windowClass: 'modal_full-content', backdrop: false, keyboard: false, scope: modalScope }); modalInstance.result.then(function (data) { if (!_.isEmpty(data)) { updateWidgetValue(data); } }); } else { updateWidgetValue(personData); } } scope.$on(events.AFTER_SAVED_CHANGES, function () { originaldata = _.cloneDeep(scope.data.value); }); scope.$on(events.DISCARD_CHANGES, function () { scope.data.value = _.cloneDeep(originaldata); }); scope.clear = function () { scope.data.value = ""; if (scope.data.name === 'customer') { if (scope.context.selectedCompany) { scope.context.selectedCompany = ""; } objectValueMapperService.setValueByFieldName('company', ""); scope.$emit(events.FIELD_VALUE_CHANGE, { name: 'company' }); objectValueMapperService.setValueByFieldName('customerCompany', ""); scope.$emit(events.FIELD_VALUE_CHANGE, { name: 'customerCompany' }); objectValueMapperService.setByProperty(scope.context.type + 'Template', 'isReadOnly', true); } scope.data.previousValue = valueHistory.pop(); valueHistory.push(scope.data.value); scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, memberName: members }); }; scope.getListPersonsByCompany = function (term) { scope.state.dataLoading = true; var company = null; if (scope.data.name !== 'contact') { company = scope.data.value && scope.data.value.company ? scope.data.value.company.name : ''; if (!company) { company = objectValueMapperService.getValueByFieldName('company') || objectValueMapperService.getValueByFieldName('customerCompany'); } } return createTicketModel.getPersonsByCompany(term, company).then(function (response) { var persons = response.items; scope.exceedsChunkSizePerson = response.exceedsChunkSize; scope.isTooltipOpenPerson = true; $timeout(function () { scope.isTooltipOpenPerson = false; }, 10000); if (permissionModel.hasRole(roles.ITSM_PEOPLE_USER_ROLE)) { response.items.unshift({ isEmptyResult: true, isCreateContactAction: isContactWidget }); } return persons; }).finally(function () { scope.state.dataLoading = false; }); }; scope.onInputFocusBlur = function () { scope.isTooltipOpenPerson = false; }; function updateWidgetValue(data) { scope.data.value = data; scope.data.previousValue = valueHistory.pop(); valueHistory.push(scope.data.value); scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, memberName: members }); if (scope.data.name === 'customer') { if (scope.data.value.company && scope.data.value.company.name) { scope.context.selectedCompany = scope.data.value.company.name; if (scope.context.type !== 'workorder') { getIncidentRulesByCompany(); } objectValueMapperService.setValueByFieldName('company', scope.data.value.company.name); scope.$emit(events.FIELD_VALUE_CHANGE, { name: 'company' }); scope.$emit(events.FIELD_VALUE_CHANGE, { name: 'customerCompany' }); if (!objectValueMapperService.getFieldByName('locationCompany')) { scope.context.locationCompany = { name: scope.context.selectedCompany }; } } } else if (scope.data.name === 'requestedFor') { if (scope.data.value.company && scope.data.value.company.name) { scope.context.company = _.cloneDeep(scope.data.value.company); } if (scope.context.type == 'change') { $rootScope.$broadcast(events.RELOAD_RISK_QUESTION); } } } function getIncidentRulesByCompany() { if (scope.customerCompany !== scope.context.selectedCompany) { scope.customerCompany = scope.context.selectedCompany; ticketModel.getIncidentRules(scope.customerCompany).then(function (data) { scope.context.serviceCIRequired = data.serviceCIRequired == "true" ? true : false; scope.context.CIRequiredOnResolved = data.CIRequiredOnResolved == "true" ? true : false; scope.context.applyCognitiveForSupportGroup = data.applyCognitiveForSupportGroup; scope.$emit(events.COMPANY_VALUE_CHANGED); }); } } scope.onValueChange = function () { if (scope.data.value.firstName && scope.data.value.lastName) { scope.data.value.fullName = scope.data.value.firstName + ' ' + scope.data.value.lastName; } scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, memberName: members }); }; scope.$watch('data.setValueFlag', function (value) { if (value !== '#$#' && value) { if (!value.id && value.loginId) { value.id = value.loginId; } scope.data.value = value; scope.onValueChange(); scope.data.setValueFlag = '#$#'; } }); function handleDiscardChanges() { scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, action: 'cancel' }); } scope.$on(events.DISCARD_CHANGES, handleDiscardChanges); scope.$on('$destroy', function () { if (modalScope && !modalScope.$$destroyed) { modalScope.$destroy(); } }); } }; }]) .directive('setView', function () { return { require: 'ngModel', scope: { setView: '@' }, link: function (scope, elem, attr, ngModel) { ngModel.$formatters.push(function (value) { if (value && value.fullName) { return value.fullName; } else if (value && value.firstName && value.lastName) { return (value.firstName + ' ' + value.lastName); } else { return ""; } }); scope.onValueChange = function (events) { if (scope.data.value.firstName && scope.data.value.lastName) { scope.data.value.fullName = scope.data.value.firstName + ' ' + scope.data.value.lastName; } scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name }); }; scope.$watch('data.setValueFlag', function (value) { if (value !== '#$#' && value) { if (!value.id && value.loginId) { value.id = value.loginId; } scope.data.value = value; scope.onValueChange(); scope.data.setValueFlag = '#$#'; } }); } }; }); }());