SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/common/potentially-required-field-...

97 lines
5.5 KiB
JavaScript

"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 (_.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');
}
}
};
}]);
}());