"use strict"; (function () { 'use strict'; angular.module('myitsmApp') .directive('potentiallyRequiredField', ['metadataModel', '$timeout', '$filter', function (metadataModel, $timeout, $filter) { return { restrict: 'A', require: '?ngModel', link: function (scope, element, attrs, ngModelCtrl) { if (!angular.isDefined(scope[attrs.entity])) { return; } var type, categoryTier, isTierRequired = false; var tagName = element.prop('tagName'); if (scope[attrs.entity].ticketType === EntityVO.TYPE_ASSET) { type = EntityVO.TYPE_ASSET; if (scope[attrs.entity].assetUpdateFields) { categoryTier = attrs.fieldName.split(".")[2]; isTierRequired = scope[attrs.entity].assetUpdateFields[categoryTier]; } } else { type = scope[attrs.entity].type; } if (_.includes([EntityVO.TYPE_INCIDENT, EntityVO.TYPE_CHANGE, EntityVO.TYPE_WORKORDER, EntityVO.TYPE_TASK], type)) { if (attrs.itsmRequired && attrs.itsmRequired === 'true') { if (tagName === 'INPUT' || tagName === 'TEXTAREA') { element.prop('required', true); element.attr('aria-required', 'true'); if (ngModelCtrl.$isEmpty(ngModelCtrl.$viewValue)) { ngModelCtrl.$setValidity('required', false); } else { ngModelCtrl.$setValidity('required', true); } ngModelCtrl.$parsers.unshift(function (viewValue) { ngModelCtrl.$setValidity('required', viewValue ? true : false); return viewValue; }); ngModelCtrl.$formatters.unshift(function (modelValue) { $timeout(function () { ngModelCtrl.$setValidity('required', modelValue ? true : false); }, 0); return modelValue; }); } else { element.attr('data-required', $filter('i18n')('common.label.required.bracketed')); element.addClass('required__label'); } } } else { metadataModel.getMetadataByType(type).then(function (metadata) { if (type === EntityVO.TYPE_ASSET && attrs.fieldName === 'site.name') { var siteFields = ['site.name', 'site.siteGroup', 'site.region'], isSiteRequired = _.some(siteFields, function (fieldName) { return _.includes(metadata && metadata.requiredOOTBObjectName, fieldName); }); } if (type === EntityVO.TYPE_PERSON && attrs.fieldName === 'site.name') { isSiteRequired = true; } if (_.includes(metadata && metadata.requiredOOTBObjectName, attrs.fieldName) || isTierRequired || isSiteRequired) { if (tagName === 'INPUT' || tagName === 'TEXTAREA') { element.prop('required', true); element.attr('aria-required', 'true'); if (ngModelCtrl.$isEmpty(ngModelCtrl.$viewValue)) { ngModelCtrl.$setValidity('required', false); } else { ngModelCtrl.$setValidity('required', true); } ngModelCtrl.$parsers.unshift(function (viewValue) { ngModelCtrl.$setValidity('required', viewValue ? true : false); return viewValue; }); ngModelCtrl.$formatters.unshift(function (modelValue) { $timeout(function () { ngModelCtrl.$setValidity('required', modelValue ? true : false); }, 0); return modelValue; }); } else { element.attr('data-required', $filter('i18n')('common.label.required.bracketed')); element.addClass('required__label'); } } }); } if ((scope.data && scope.data.isRequired) || (scope.summaryField && scope.summaryField.isRequired)) { element.prop('required', true); element.attr('aria-required', 'true'); } } }; }]); }());