novo-elements 5.2.10 → 5.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/novo-elements.umd.js +48 -12
- package/bundles/novo-elements.umd.js.map +1 -1
- package/bundles/novo-elements.umd.min.js +1 -1
- package/bundles/novo-elements.umd.min.js.map +1 -1
- package/elements/form/FieldInteractionApi.d.ts +3 -2
- package/elements/form/Form.scss +5 -0
- package/elements/form/NovoFormControl.d.ts +1 -0
- package/elements/form/controls/BaseControl.d.ts +1 -0
- package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.d.ts +4 -0
- package/esm2015/elements/form/Control.js +2 -2
- package/esm2015/elements/form/ControlGroup.js +3 -3
- package/esm2015/elements/form/FieldInteractionApi.js +12 -5
- package/esm2015/elements/form/NovoFormControl.js +1 -1
- package/esm2015/elements/form/controls/BaseControl.js +3 -1
- package/esm2015/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.js +27 -2
- package/esm2015/utils/form-utils/FormUtils.js +7 -5
- package/fesm2015/novo-elements.js +48 -12
- package/fesm2015/novo-elements.js.map +1 -1
- package/novo-elements.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -6229,6 +6229,7 @@
|
|
|
6229
6229
|
_this.renderer = renderer;
|
|
6230
6230
|
_this.labels = labels;
|
|
6231
6231
|
_this.placeholder = '';
|
|
6232
|
+
_this.emptyOptionsLabel = '';
|
|
6232
6233
|
_this.internalMap = new Map();
|
|
6233
6234
|
return _this;
|
|
6234
6235
|
}
|
|
@@ -6258,6 +6259,13 @@
|
|
|
6258
6259
|
if (this.keyboardSubscription) {
|
|
6259
6260
|
this.keyboardSubscription.unsubscribe();
|
|
6260
6261
|
}
|
|
6262
|
+
if (this.config.options) {
|
|
6263
|
+
this.config.options.forEach(function (option) {
|
|
6264
|
+
if (option.clearSecondaryOptions) {
|
|
6265
|
+
option.clearSecondaryOptions.unsubscribe();
|
|
6266
|
+
}
|
|
6267
|
+
});
|
|
6268
|
+
}
|
|
6261
6269
|
};
|
|
6262
6270
|
MixedMultiPickerResults.prototype.selectPrimaryOption = function (primaryOption, event) {
|
|
6263
6271
|
var _this = this;
|
|
@@ -6307,6 +6315,18 @@
|
|
|
6307
6315
|
MixedMultiPickerResults.prototype.shouldShowSearchBox = function (primaryOption) {
|
|
6308
6316
|
return !!(primaryOption && primaryOption.showSearchOnSecondaryOptions);
|
|
6309
6317
|
};
|
|
6318
|
+
MixedMultiPickerResults.prototype.clearPrimaryOption = function (primaryOption) {
|
|
6319
|
+
var _a;
|
|
6320
|
+
if (this.internalMap.get(primaryOption.value)) {
|
|
6321
|
+
if (primaryOption.value === ((_a = this.selectedPrimaryOption) === null || _a === void 0 ? void 0 : _a.value)) {
|
|
6322
|
+
this.activeMatch = null;
|
|
6323
|
+
this.matches = [];
|
|
6324
|
+
this.selectedPrimaryOption = null;
|
|
6325
|
+
}
|
|
6326
|
+
this.internalMap.delete(primaryOption.value);
|
|
6327
|
+
this.ref.markForCheck();
|
|
6328
|
+
}
|
|
6329
|
+
};
|
|
6310
6330
|
MixedMultiPickerResults.prototype.filterData = function () {
|
|
6311
6331
|
if (this.selectedPrimaryOption) {
|
|
6312
6332
|
if (this.selectedPrimaryOption.secondaryOptions) {
|
|
@@ -6351,6 +6371,11 @@
|
|
|
6351
6371
|
_this.inputElement.nativeElement.focus();
|
|
6352
6372
|
});
|
|
6353
6373
|
});
|
|
6374
|
+
if (primaryOption.clearSecondaryOptions) {
|
|
6375
|
+
primaryOption.clearSecondaryOptions.subscribe(function () {
|
|
6376
|
+
_this.clearPrimaryOption(primaryOption);
|
|
6377
|
+
});
|
|
6378
|
+
}
|
|
6354
6379
|
}
|
|
6355
6380
|
else {
|
|
6356
6381
|
this.matches = this.filter(this.internalMap.get(primaryOption.value).items);
|
|
@@ -6363,7 +6388,7 @@
|
|
|
6363
6388
|
MixedMultiPickerResults.decorators = [
|
|
6364
6389
|
{ type: core.Component, args: [{
|
|
6365
6390
|
selector: 'mixed-multi-picker-results',
|
|
6366
|
-
template: "\n <div class=\"mixed-multi-picker-groups\">\n <novo-list direction=\"vertical\">\n <novo-list-item\n *ngFor=\"let option of options\"\n (click)=\"selectPrimaryOption(option, $event)\"\n [class.active]=\"selectedPrimaryOption?.value === option.value\"\n [attr.data-automation-id]=\"option.label\"\n [class.disabled]=\"isLoading\">\n <item-content>\n <i *ngIf=\"option.iconClass\" [class]=\"option.iconClass\"></i>\n <span data-automation-id=\"label\">{{ option.label }}</span>\n </item-content>\n <item-end *ngIf=\"optionHasSecondaryOptions(option)\">\n <i class=\"bhi-next\"></i>\n </item-end>\n </novo-list-item>\n </novo-list>\n </div>\n <div class=\"mixed-multi-picker-matches\" [hidden]=\"!optionHasSecondaryOptions(selectedPrimaryOption)\">\n <div class=\"mixed-multi-picker-input-container\" [hidden]=\"!shouldShowSearchBox(selectedPrimaryOption)\" data-automation-id=\"input-container\">\n <input autofocus #input [(ngModel)]=\"searchTerm\" [disabled]=\"isLoading\" data-automation-id=\"input\" [placeholder]=\"placeholder\"/>\n <i class=\"bhi-search\" *ngIf=\"!searchTerm\" [class.disabled]=\"isLoading\" data-automation-id=\"seach-icon\"></i>\n <i class=\"bhi-times\" *ngIf=\"searchTerm\" (click)=\"clearSearchTerm($event)\" [class.disabled]=\"isLoading\" data-automation-id=\"remove-icon\"></i>\n </div>\n <div class=\"mixed-multi-picker-list-container\">\n <novo-list direction=\"vertical\" #list>\n <novo-list-item\n *ngFor=\"let match of matches\"\n (click)=\"selectMatch($event)\"\n [class.active]=\"match === activeMatch\"\n (mouseenter)=\"selectActive(match)\"\n [class.disabled]=\"preselected(match) || isLoading\"\n [attr.data-automation-id]=\"match.label\">\n <item-content>\n <span>{{ match.label }}</span>\n </item-content>\n </novo-list-item>\n </novo-list>\n <div class=\"mixed-multi-picker-no-results\" *ngIf=\"matches.length === 0 && !isLoading && selectedPrimaryOption\" data-automation-id=\"empty-message\">\n {{ labels.groupedMultiPickerEmpty }}\n </div>\n <div class=\"mixed-multi-picker-loading\" *ngIf=\"isLoading\" data-automation-id=\"loading-message\">\n <novo-loading theme=\"line\"></novo-loading>\n </div>\n </div>\n </div>"
|
|
6391
|
+
template: "\n <div class=\"mixed-multi-picker-groups\">\n <novo-list direction=\"vertical\">\n <novo-list-item\n *ngFor=\"let option of options\"\n (click)=\"selectPrimaryOption(option, $event)\"\n [class.active]=\"selectedPrimaryOption?.value === option.value\"\n [attr.data-automation-id]=\"option.label\"\n [class.disabled]=\"isLoading\">\n <item-content>\n <i *ngIf=\"option.iconClass\" [class]=\"option.iconClass\"></i>\n <span data-automation-id=\"label\">{{ option.label }}</span>\n </item-content>\n <item-end *ngIf=\"optionHasSecondaryOptions(option)\">\n <i class=\"bhi-next\"></i>\n </item-end>\n </novo-list-item>\n </novo-list>\n </div>\n <div class=\"mixed-multi-picker-matches\" [hidden]=\"!optionHasSecondaryOptions(selectedPrimaryOption)\">\n <div class=\"mixed-multi-picker-input-container\" [hidden]=\"!shouldShowSearchBox(selectedPrimaryOption)\" data-automation-id=\"input-container\">\n <input autofocus #input [(ngModel)]=\"searchTerm\" [disabled]=\"isLoading\" data-automation-id=\"input\" [placeholder]=\"placeholder\"/>\n <i class=\"bhi-search\" *ngIf=\"!searchTerm\" [class.disabled]=\"isLoading\" data-automation-id=\"seach-icon\"></i>\n <i class=\"bhi-times\" *ngIf=\"searchTerm\" (click)=\"clearSearchTerm($event)\" [class.disabled]=\"isLoading\" data-automation-id=\"remove-icon\"></i>\n </div>\n <div class=\"mixed-multi-picker-list-container\">\n <novo-list direction=\"vertical\" #list>\n <novo-list-item\n *ngFor=\"let match of matches\"\n (click)=\"selectMatch($event)\"\n [class.active]=\"match === activeMatch\"\n (mouseenter)=\"selectActive(match)\"\n [class.disabled]=\"preselected(match) || isLoading\"\n [attr.data-automation-id]=\"match.label\">\n <item-content>\n <span>{{ match.label }}</span>\n </item-content>\n </novo-list-item>\n </novo-list>\n <div class=\"mixed-multi-picker-no-results\" *ngIf=\"matches.length === 0 && !isLoading && selectedPrimaryOption\" data-automation-id=\"empty-message\">\n {{ config.emptyOptionsLabel ? config.emptyOptionsLabel : labels.groupedMultiPickerEmpty }}\n </div>\n <div class=\"mixed-multi-picker-loading\" *ngIf=\"isLoading\" data-automation-id=\"loading-message\">\n <novo-loading theme=\"line\"></novo-loading>\n </div>\n </div>\n </div>"
|
|
6367
6392
|
},] }
|
|
6368
6393
|
];
|
|
6369
6394
|
MixedMultiPickerResults.ctorParameters = function () { return [
|
|
@@ -30462,6 +30487,7 @@
|
|
|
30462
30487
|
function ControlConfig() {
|
|
30463
30488
|
this.isEmbedded = false;
|
|
30464
30489
|
this.isInlineEmbedded = false;
|
|
30490
|
+
this.highlighted = false;
|
|
30465
30491
|
}
|
|
30466
30492
|
return ControlConfig;
|
|
30467
30493
|
}());
|
|
@@ -30510,6 +30536,7 @@
|
|
|
30510
30536
|
_this.startDate = config.startDate;
|
|
30511
30537
|
_this.endDate = config.endDate;
|
|
30512
30538
|
_this.restrictFieldInteractions = !!config.restrictFieldInteractions;
|
|
30539
|
+
_this.highlighted = !!config.highlighted;
|
|
30513
30540
|
if (!Helpers.isEmpty(config.warning)) {
|
|
30514
30541
|
_this.warning = config.warning;
|
|
30515
30542
|
}
|
|
@@ -31840,7 +31867,7 @@
|
|
|
31840
31867
|
else if (field.dataSpecialization === 'ALL_WORKFLOW_OPTIONS' && field.options) {
|
|
31841
31868
|
return field.options;
|
|
31842
31869
|
}
|
|
31843
|
-
else if (field.workflowOptions
|
|
31870
|
+
else if (field.workflowOptions) {
|
|
31844
31871
|
return this.getWorkflowOptions(field.workflowOptions, fieldData);
|
|
31845
31872
|
}
|
|
31846
31873
|
else if (field.dataSpecialization === 'SPECIALIZED_OPTIONS' ||
|
|
@@ -31864,12 +31891,14 @@
|
|
|
31864
31891
|
return null;
|
|
31865
31892
|
};
|
|
31866
31893
|
FormUtils.prototype.getWorkflowOptions = function (workflowOptions, fieldData) {
|
|
31867
|
-
var currentValue;
|
|
31868
|
-
|
|
31894
|
+
var currentValue = null;
|
|
31895
|
+
var currentWorkflowOption = 'initial';
|
|
31896
|
+
if (fieldData === null || fieldData === void 0 ? void 0 : fieldData.id) {
|
|
31869
31897
|
currentValue = { value: fieldData.id, label: fieldData.label ? fieldData.label : fieldData.id };
|
|
31898
|
+
currentWorkflowOption = fieldData.id;
|
|
31870
31899
|
}
|
|
31871
|
-
var currentWorkflowOption = fieldData.id ? fieldData.id : 'initial';
|
|
31872
31900
|
var updateWorkflowOptions = workflowOptions[currentWorkflowOption] || [];
|
|
31901
|
+
// Ensure that the current value is added to the beginning of the options list
|
|
31873
31902
|
if (currentValue && !updateWorkflowOptions.find(function (option) { return option.value === currentValue.value; })) {
|
|
31874
31903
|
updateWorkflowOptions.unshift(currentValue);
|
|
31875
31904
|
}
|
|
@@ -32670,6 +32699,13 @@
|
|
|
32670
32699
|
this.triggerEvent({ controlKey: key, prop: 'required', value: required }, otherForm);
|
|
32671
32700
|
}
|
|
32672
32701
|
};
|
|
32702
|
+
FieldInteractionApi.prototype.highlight = function (key, isHighlighted, otherForm) {
|
|
32703
|
+
var control = this.getControl(key, otherForm);
|
|
32704
|
+
if (control && !control.restrictFieldInteractions) {
|
|
32705
|
+
control.highlighted = isHighlighted;
|
|
32706
|
+
this.triggerEvent({ controlKey: key, prop: 'highlight', value: isHighlighted }, otherForm);
|
|
32707
|
+
}
|
|
32708
|
+
};
|
|
32673
32709
|
FieldInteractionApi.prototype.hide = function (key, clearValue, otherForm) {
|
|
32674
32710
|
if (clearValue === void 0) { clearValue = true; }
|
|
32675
32711
|
var control = this.getControl(key, otherForm);
|
|
@@ -32890,9 +32926,9 @@
|
|
|
32890
32926
|
FieldInteractionApi.prototype.removeStaticOption = function (key, optionToRemove, otherForm) {
|
|
32891
32927
|
var control = this.getControl(key, otherForm);
|
|
32892
32928
|
if (control && !control.restrictFieldInteractions) {
|
|
32893
|
-
var currentOptions = this.getProperty(key, 'options');
|
|
32929
|
+
var currentOptions = this.getProperty(key, 'options', otherForm);
|
|
32894
32930
|
if (!currentOptions || !currentOptions.length) {
|
|
32895
|
-
var config = this.getProperty(key, 'config');
|
|
32931
|
+
var config = this.getProperty(key, 'config', otherForm);
|
|
32896
32932
|
if (config) {
|
|
32897
32933
|
currentOptions = config.options;
|
|
32898
32934
|
if (currentOptions && Array.isArray(currentOptions)) {
|
|
@@ -32913,7 +32949,7 @@
|
|
|
32913
32949
|
currentOptions.splice(index_1, 1);
|
|
32914
32950
|
}
|
|
32915
32951
|
config.options = __spread(currentOptions);
|
|
32916
|
-
this.setProperty(key, 'config', config);
|
|
32952
|
+
this.setProperty(key, 'config', config, otherForm);
|
|
32917
32953
|
}
|
|
32918
32954
|
}
|
|
32919
32955
|
}
|
|
@@ -32934,7 +32970,7 @@
|
|
|
32934
32970
|
if (index_2 !== -1) {
|
|
32935
32971
|
currentOptions.splice(index_2, 1);
|
|
32936
32972
|
}
|
|
32937
|
-
this.setProperty(key, 'options', __spread(currentOptions));
|
|
32973
|
+
this.setProperty(key, 'options', __spread(currentOptions), otherForm);
|
|
32938
32974
|
}
|
|
32939
32975
|
this.triggerEvent({ controlKey: key, prop: 'options', value: control.options }, otherForm);
|
|
32940
32976
|
}
|
|
@@ -33791,7 +33827,7 @@
|
|
|
33791
33827
|
NovoControlElement.decorators = [
|
|
33792
33828
|
{ type: core.Component, args: [{
|
|
33793
33829
|
selector: 'novo-control',
|
|
33794
|
-
template: "\n <div class=\"novo-control-container\" [hidden]=\"form.controls[control.key].hidden || form.controls[control.key].type === 'hidden' || form.controls[control.key].controlType === 'hidden'\">\n <!--Encrypted Field-->\n <span [tooltip]=\"labels.encryptedFieldTooltip\" [tooltipPosition]=\"'right'\"><i [hidden]=\"!form.controls[control.key].encrypted\"\n class=\"bhi-lock\"></i></span>\n <!--Label (for horizontal)-->\n <label [attr.for]=\"control.key\" *ngIf=\"form.layout !== 'vertical' && form.controls[control.key].label && !condensed\" [ngClass]=\"{'encrypted': form.controls[control.key].encrypted }\">\n {{ form.controls[control.key].label }}\n </label>\n <div class=\"novo-control-outer-container\">\n <!--Label (for vertical)-->\n <label\n *ngIf=\"form.layout === 'vertical' && form.controls[control.key].label && !condensed\"\n class=\"novo-control-label\"\n [attr.for]=\"control.key\"\n [class.novo-control-empty]=\"!hasValue\"\n [class.novo-control-focused]=\"focused\"\n [class.novo-control-filled]=\"hasValue\"\n [class.novo-control-always-active]=\"alwaysActive || form.controls[control.key].placeholder\"\n [class.novo-control-extra-spacing]=\"requiresExtraSpacing\">\n {{ form.controls[control.key].label }}\n </label>\n <div class=\"novo-control-inner-container\" [class.required]=\"form.controls[control.key].required && !form.controls[control.key].readOnly\">\n <div class=\"novo-control-inner-input-container\" [class.novo-control-filled]=\"hasValue\" [class.novo-control-empty]=\"!hasValue\">\n <!--Required Indicator-->\n <i [hidden]=\"!form.controls[control.key].required || form.controls[control.key].readOnly\"\n class=\"required-indicator {{ form.controls[control.key].controlType }}\"\n [ngClass]=\"{'bhi-circle': !isValid, 'bhi-check': isValid}\" *ngIf=\"!condensed || form.controls[control.key].required\">\n </i>\n <!--Form Controls-->\n <div class=\"novo-control-input {{ form.controls[control.key].controlType }}\" [attr.data-automation-id]=\"control.key\" [class.control-disabled]=\"form.controls[control.key].disabled\">\n <!--TODO prefix/suffix on the control-->\n <ng-container *ngIf=\"templates\">\n <ng-container *ngTemplateOutlet=\"templates[form.controls[control.key].controlType]; context: templateContext\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!templates || loading\">\n <div class=\"novo-control-input-container novo-control-input-with-label\">\n <input type=\"text\"/>\n </div>\n </ng-container>\n </div>\n </div>\n <!--Error Message-->\n <div class=\"field-message {{ form.controls[control.key].controlType }}\" *ngIf=\"!condensed\" [class.has-tip]=\"form.controls[control.key].tipWell\" [ngClass]=\"showErrorState || showMaxLengthMetMessage ? 'error-shown' : 'error-hidden'\">\n <div class=\"messages\" [ngClass]=\"showMessages ? 'count-shown messages-shown' : 'count-hidden messages-hidden'\">\n <span class=\"error-text\" *ngIf=\"showFieldMessage\"></span>\n <span class=\"error-text\" *ngIf=\"isDirty && errors?.required && form.controls[control.key].controlType !== 'address'\">{{ form.controls[control.key].label | uppercase }} {{ labels.isRequired }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && errors?.minlength\">{{ form.controls[control.key].label | uppercase }} {{ labels.minLength }} {{ form.controls[control.key].minlength }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && maxLengthMet && focused && !errors?.maxlength && form.controls[control.key].controlType !== 'picker'\">{{ labels.maxlengthMet(form.controls[control.key].maxlength) }}</span>\n <span class=\"error-text\" *ngIf=\"errors?.maxlength && focused && !errors?.maxlengthFields\">{{ labels.invalidMaxlength(form.controls[control.key].maxlength) }}</span>\n <span class=\"error-text\" *ngIf=\"maxLengthMet && form.controls[control.key].controlType === 'picker'\">{{ labels.maxRecordsReached }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && errors?.invalidEmail\">{{ form.controls[control.key].label | uppercase }} {{ labels.invalidEmail }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && (errors?.integerTooLarge || errors?.doubleTooLarge)\">{{ form.controls[control.key].label | uppercase }} {{ labels.isTooLarge }}</span>\n <span *ngIf=\"isDirty && errors?.minYear\">{{ form.controls[control.key].label | uppercase }} {{ labels.notValidYear }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && (errors?.custom)\">{{ errors.custom }}</span>\n <span class=\"error-text\" *ngIf=\"errors?.maxlength && errors?.maxlengthFields && maxlengthErrorField && focused\">\n {{ labels.invalidMaxlengthWithField(control.config[maxlengthErrorField]?.label, control.config[maxlengthErrorField]?.maxlength) }}\n </span>\n <span class=\"error-text\" *ngIf=\"isDirty && maxlengthMetField && focused && !errors?.maxlengthFields?.includes(maxlengthMetField)\">\n {{ labels.maxlengthMetWithField(control.config[maxlengthMetField]?.label, control.config[maxlengthMetField]?.maxlength) }}\n </span>\n <span *ngIf=\"isDirty && errors?.invalidAddress\">\n <span class=\"error-text\" *ngFor=\"let invalidAddressField of errors?.invalidAddressFields\">{{ invalidAddressField | uppercase }} {{ labels.isRequired }} </span>\n </span>\n <!--Field Hint-->\n <span class=\"description\" *ngIf=\"form.controls[control.key].description\">\n {{ form.controls[control.key].description }}\n </span>\n <span class=\"warning-text\" *ngIf=\"form.controls[control.key].warning\">{{ form.controls[control.key].warning }}</span>\n\n </div>\n <span class=\"character-count\" [class.error]=\"((errors?.maxlength && !errors?.maxlengthFields) || (errors?.maxlength && errors?.maxlengthFields && errors.maxlengthFields.includes(focusedField)))\" *ngIf=\"showCount && form.controls[control.key].controlType !== 'picker'\">{{ itemCount }}/{{ maxLength || form.controls[control.key].maxlength }}</span>\n <span class=\"record-count\" [class.zero-count]=\"itemCount === 0\" [class.row-picker]=\"form.controls[this.control.key].config.columns\" *ngIf=\"showCount && form.controls[control.key].controlType === 'picker'\">{{ itemCount }}/{{ maxLength || form.controls[control.key].maxlength }}</span>\n </div>\n <!--Tip Wel-->\n <novo-tip-well *ngIf=\"form.controls[control.key].tipWell\" [name]=\"control.key\" [tip]=\"form.controls[control.key]?.tipWell?.tip\" [icon]=\"form.controls[control.key]?.tipWell?.icon\" [button]=\"form.controls[control.key]?.tipWell?.button\" [sanitize]=\"form.controls[control.key]?.tipWell?.sanitize\"></novo-tip-well>\n </div>\n <i *ngIf=\"form.controls[control.key].fieldInteractionloading\" class=\"loading\">\n <svg version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:a=\"http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/\"\n x=\"0px\" y=\"0px\" width=\"18.2px\" height=\"18.5px\" viewBox=\"0 0 18.2 18.5\" style=\"enable-background:new 0 0 18.2 18.5;\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .spinner { fill:#FFFFFF; }\n </style>\n <path class=\"spinner\" d=\"M9.2,18.5C4.1,18.5,0,14.4,0,9.2S4.1,0,9.2,0c0.9,0,1.9,0.1,2.7,0.4c0.8,0.2,1.2,1.1,1,1.9\n c-0.2,0.8-1.1,1.2-1.9,1C10.5,3.1,9.9,3,9.2,3C5.8,3,3,5.8,3,9.2s2.8,6.2,6.2,6.2c2.8,0,5.3-1.9,6-4.7c0.2-0.8,1-1.3,1.8-1.1\n c0.8,0.2,1.3,1,1.1,1.8C17.1,15.7,13.4,18.5,9.2,18.5z\"/>\n </svg>\n </i>\n </div>\n </div>\n ",
|
|
33830
|
+
template: "\n <div class=\"novo-control-container\" [hidden]=\"form.controls[control.key].hidden || form.controls[control.key].type === 'hidden' || form.controls[control.key].controlType === 'hidden'\">\n <!--Encrypted Field-->\n <span [tooltip]=\"labels.encryptedFieldTooltip\" [tooltipPosition]=\"'right'\"><i [hidden]=\"!form.controls[control.key].encrypted\"\n class=\"bhi-lock\"></i></span>\n <!--Label (for horizontal)-->\n <label [attr.for]=\"control.key\" *ngIf=\"form.layout !== 'vertical' && form.controls[control.key].label && !condensed\" [ngClass]=\"{'encrypted': form.controls[control.key].encrypted }\">\n {{ form.controls[control.key].label }}\n </label>\n <div class=\"novo-control-outer-container\">\n <!--Label (for vertical)-->\n <label\n *ngIf=\"form.layout === 'vertical' && form.controls[control.key].label && !condensed\"\n class=\"novo-control-label\"\n [attr.for]=\"control.key\"\n [class.novo-control-empty]=\"!hasValue\"\n [class.novo-control-focused]=\"focused\"\n [class.novo-control-filled]=\"hasValue\"\n [class.novo-control-always-active]=\"alwaysActive || form.controls[control.key].placeholder\"\n [class.novo-control-extra-spacing]=\"requiresExtraSpacing\">\n {{ form.controls[control.key].label }}\n </label>\n <div class=\"novo-control-inner-container\" [class.required]=\"form.controls[control.key].required && !form.controls[control.key].readOnly\">\n <div class=\"novo-control-inner-input-container\" [class.novo-control-filled]=\"hasValue\" [class.novo-control-empty]=\"!hasValue\">\n <!--Required Indicator-->\n <i [hidden]=\"!form.controls[control.key].required || form.controls[control.key].readOnly\"\n class=\"required-indicator {{ form.controls[control.key].controlType }}\"\n [ngClass]=\"{'bhi-circle': !isValid, 'bhi-check': isValid}\" *ngIf=\"!condensed || form.controls[control.key].required\">\n </i>\n <!--Form Controls-->\n <div class=\"novo-control-input {{ form.controls[control.key].controlType }}\" [attr.data-automation-id]=\"control.key\" [class.control-disabled]=\"form.controls[control.key].disabled\" [class.highlighted]=\"form.controls[control.key].highlighted\">\n <!--TODO prefix/suffix on the control-->\n <ng-container *ngIf=\"templates\">\n <ng-container *ngTemplateOutlet=\"templates[form.controls[control.key].controlType]; context: templateContext\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!templates || loading\">\n <div class=\"novo-control-input-container novo-control-input-with-label\">\n <input type=\"text\"/>\n </div>\n </ng-container>\n </div>\n </div>\n <!--Error Message-->\n <div class=\"field-message {{ form.controls[control.key].controlType }}\" *ngIf=\"!condensed\" [class.has-tip]=\"form.controls[control.key].tipWell\" [ngClass]=\"showErrorState || showMaxLengthMetMessage ? 'error-shown' : 'error-hidden'\">\n <div class=\"messages\" [ngClass]=\"showMessages ? 'count-shown messages-shown' : 'count-hidden messages-hidden'\">\n <span class=\"error-text\" *ngIf=\"showFieldMessage\"></span>\n <span class=\"error-text\" *ngIf=\"isDirty && errors?.required && form.controls[control.key].controlType !== 'address'\">{{ form.controls[control.key].label | uppercase }} {{ labels.isRequired }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && errors?.minlength\">{{ form.controls[control.key].label | uppercase }} {{ labels.minLength }} {{ form.controls[control.key].minlength }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && maxLengthMet && focused && !errors?.maxlength && form.controls[control.key].controlType !== 'picker'\">{{ labels.maxlengthMet(form.controls[control.key].maxlength) }}</span>\n <span class=\"error-text\" *ngIf=\"errors?.maxlength && focused && !errors?.maxlengthFields\">{{ labels.invalidMaxlength(form.controls[control.key].maxlength) }}</span>\n <span class=\"error-text\" *ngIf=\"maxLengthMet && form.controls[control.key].controlType === 'picker'\">{{ labels.maxRecordsReached }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && errors?.invalidEmail\">{{ form.controls[control.key].label | uppercase }} {{ labels.invalidEmail }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && (errors?.integerTooLarge || errors?.doubleTooLarge)\">{{ form.controls[control.key].label | uppercase }} {{ labels.isTooLarge }}</span>\n <span *ngIf=\"isDirty && errors?.minYear\">{{ form.controls[control.key].label | uppercase }} {{ labels.notValidYear }}</span>\n <span class=\"error-text\" *ngIf=\"isDirty && (errors?.custom)\">{{ errors.custom }}</span>\n <span class=\"error-text\" *ngIf=\"errors?.maxlength && errors?.maxlengthFields && maxlengthErrorField && focused\">\n {{ labels.invalidMaxlengthWithField(control.config[maxlengthErrorField]?.label, control.config[maxlengthErrorField]?.maxlength) }}\n </span>\n <span class=\"error-text\" *ngIf=\"isDirty && maxlengthMetField && focused && !errors?.maxlengthFields?.includes(maxlengthMetField)\">\n {{ labels.maxlengthMetWithField(control.config[maxlengthMetField]?.label, control.config[maxlengthMetField]?.maxlength) }}\n </span>\n <span *ngIf=\"isDirty && errors?.invalidAddress\">\n <span class=\"error-text\" *ngFor=\"let invalidAddressField of errors?.invalidAddressFields\">{{ invalidAddressField | uppercase }} {{ labels.isRequired }} </span>\n </span>\n <!--Field Hint-->\n <span class=\"description\" *ngIf=\"form.controls[control.key].description\">\n {{ form.controls[control.key].description }}\n </span>\n <span class=\"warning-text\" *ngIf=\"form.controls[control.key].warning\">{{ form.controls[control.key].warning }}</span>\n\n </div>\n <span class=\"character-count\" [class.error]=\"((errors?.maxlength && !errors?.maxlengthFields) || (errors?.maxlength && errors?.maxlengthFields && errors.maxlengthFields.includes(focusedField)))\" *ngIf=\"showCount && form.controls[control.key].controlType !== 'picker'\">{{ itemCount }}/{{ maxLength || form.controls[control.key].maxlength }}</span>\n <span class=\"record-count\" [class.zero-count]=\"itemCount === 0\" [class.row-picker]=\"form.controls[this.control.key].config.columns\" *ngIf=\"showCount && form.controls[control.key].controlType === 'picker'\">{{ itemCount }}/{{ maxLength || form.controls[control.key].maxlength }}</span>\n </div>\n <!--Tip Wel-->\n <novo-tip-well *ngIf=\"form.controls[control.key].tipWell\" [name]=\"control.key\" [tip]=\"form.controls[control.key]?.tipWell?.tip\" [icon]=\"form.controls[control.key]?.tipWell?.icon\" [button]=\"form.controls[control.key]?.tipWell?.button\" [sanitize]=\"form.controls[control.key]?.tipWell?.sanitize\"></novo-tip-well>\n </div>\n <i *ngIf=\"form.controls[control.key].fieldInteractionloading\" class=\"loading\">\n <svg version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:a=\"http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/\"\n x=\"0px\" y=\"0px\" width=\"18.2px\" height=\"18.5px\" viewBox=\"0 0 18.2 18.5\" style=\"enable-background:new 0 0 18.2 18.5;\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .spinner { fill:#FFFFFF; }\n </style>\n <path class=\"spinner\" d=\"M9.2,18.5C4.1,18.5,0,14.4,0,9.2S4.1,0,9.2,0c0.9,0,1.9,0.1,2.7,0.4c0.8,0.2,1.2,1.1,1,1.9\n c-0.2,0.8-1.1,1.2-1.9,1C10.5,3.1,9.9,3,9.2,3C5.8,3,3,5.8,3,9.2s2.8,6.2,6.2,6.2c2.8,0,5.3-1.9,6-4.7c0.2-0.8,1-1.3,1.8-1.1\n c0.8,0.2,1.3,1,1.1,1.8C17.1,15.7,13.4,18.5,9.2,18.5z\"/>\n </svg>\n </i>\n </div>\n </div>\n ",
|
|
33795
33831
|
host: {
|
|
33796
33832
|
'[class]': 'form.controls[control.key].controlType',
|
|
33797
33833
|
'[attr.data-control-type]': 'form.controls[control.key].controlType',
|
|
@@ -33958,8 +33994,6 @@
|
|
|
33958
33994
|
}
|
|
33959
33995
|
else {
|
|
33960
33996
|
this.form.addControl(this.key, this.fb.array([nestedFormGroup]));
|
|
33961
|
-
// Ensure that field interaction changes for nested forms originating from outside the form will be reflected in the nested elements
|
|
33962
|
-
nestedFormGroup.fieldInteractionEvents.subscribe(this.onFieldInteractionEvent.bind(this));
|
|
33963
33997
|
}
|
|
33964
33998
|
this.disabledArray.push({
|
|
33965
33999
|
edit: true,
|
|
@@ -33971,6 +34005,8 @@
|
|
|
33971
34005
|
}
|
|
33972
34006
|
this.currentIndex++;
|
|
33973
34007
|
this.assignIndexes();
|
|
34008
|
+
// Ensure that field interaction changes for nested forms originating from outside the form will be reflected in the nested elements
|
|
34009
|
+
nestedFormGroup.fieldInteractionEvents.subscribe(this.onFieldInteractionEvent.bind(this));
|
|
33974
34010
|
this.ref.markForCheck();
|
|
33975
34011
|
};
|
|
33976
34012
|
/**
|