97 lines
5.5 KiB
JavaScript
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');
|
|
}
|
|
}
|
|
};
|
|
}]);
|
|
}());
|