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.
@@ -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 && fieldData) {
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
- if (fieldData.id) {
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
  /**