novo-elements 7.4.0 → 7.5.0-next.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.
Files changed (25) hide show
  1. package/elements/picker/Picker.scss +8 -1
  2. package/elements/query-builder/condition-builder/condition-builder.component.scss +0 -1
  3. package/esm2020/src/elements/chips/ChipInput.mjs +2 -2
  4. package/esm2020/src/elements/data-table/data-table.component.mjs +14 -11
  5. package/esm2020/src/elements/data-table/interfaces.mjs +1 -1
  6. package/esm2020/src/elements/data-table/state/data-table-state.service.mjs +48 -30
  7. package/esm2020/src/elements/field/formats/date-format.mjs +2 -4
  8. package/esm2020/src/elements/field/formats/date-range-format.mjs +1 -2
  9. package/esm2020/src/elements/field/formats/time-format.mjs +2 -4
  10. package/esm2020/src/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.mjs +16 -21
  11. package/esm2020/src/elements/query-builder/condition-builder/condition-builder.component.mjs +1 -5
  12. package/esm2020/src/elements/query-builder/condition-definitions/string-condition.definition.mjs +9 -12
  13. package/esm2020/src/elements/query-builder/condition-group/condition-group.component.mjs +4 -4
  14. package/esm2020/src/elements/query-builder/criteria-builder/criteria-builder.component.mjs +2 -2
  15. package/fesm2015/novo-elements.mjs +89 -84
  16. package/fesm2015/novo-elements.mjs.map +1 -1
  17. package/fesm2020/novo-elements.mjs +88 -84
  18. package/fesm2020/novo-elements.mjs.map +1 -1
  19. package/package.json +1 -1
  20. package/src/elements/chips/ChipInput.d.ts +1 -1
  21. package/src/elements/data-table/interfaces.d.ts +1 -0
  22. package/src/elements/data-table/state/data-table-state.service.d.ts +5 -1
  23. package/src/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.d.ts +2 -5
  24. package/src/elements/query-builder/condition-definitions/string-condition.definition.d.ts +3 -4
  25. package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.scss +0 -0
@@ -29679,26 +29679,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
29679
29679
  }] } });
29680
29680
 
29681
29681
  // NG2
29682
- class WorkersCompCodesPickerResults extends BasePickerResults {
29682
+ class WorkersCompCodesPickerResults extends PickerResults {
29683
29683
  constructor(element, sanitizer, labels, ref) {
29684
- super(element, ref);
29684
+ super(element, labels, ref);
29685
29685
  this.sanitizer = sanitizer;
29686
29686
  this.labels = labels;
29687
- this.active = true;
29688
- this.sanitizer = sanitizer;
29689
- }
29690
- get isHidden() {
29691
- return this.matches.length === 0;
29692
- }
29693
- getListElement() {
29694
- return this.element.nativeElement.querySelector('novo-list');
29695
29687
  }
29696
29688
  sanitizeHTML(compCode, name) {
29697
29689
  return this.sanitizer.bypassSecurityTrustHtml(`${compCode} | ${name}`);
29698
29690
  }
29699
29691
  }
29700
29692
  WorkersCompCodesPickerResults.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: WorkersCompCodesPickerResults, deps: [{ token: i0.ElementRef }, { token: i1$2.DomSanitizer }, { token: NovoLabelService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
29701
- WorkersCompCodesPickerResults.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: WorkersCompCodesPickerResults, selector: "workers-comp-codes-picker-results", host: { properties: { "class.active": "this.active", "hidden": "this.isHidden" } }, usesInheritance: true, ngImport: i0, template: `
29693
+ WorkersCompCodesPickerResults.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: WorkersCompCodesPickerResults, selector: "workers-comp-codes-picker-results", host: { classAttribute: "active" }, usesInheritance: true, ngImport: i0, template: `
29702
29694
  <section class="picker-loading" *ngIf="isLoading && !matches?.length">
29703
29695
  <novo-loading theme="line"></novo-loading>
29704
29696
  </section>
@@ -29736,11 +29728,17 @@ WorkersCompCodesPickerResults.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "1
29736
29728
  </novo-list-item>
29737
29729
  <novo-loading theme="line" *ngIf="isLoading && matches?.length > 0"></novo-loading>
29738
29730
  </novo-list>
29731
+ <div class="picker-loader" *ngIf="isLoading && matches.length === 0"><novo-loading theme="line"></novo-loading></div>
29732
+ <p class="picker-error" *ngIf="hasError">{{ labels.pickerError }}</p>
29733
+ <p class="picker-null-results" *ngIf="hasNonErrorMessage">{{ getEmptyMessage() }}</p>
29739
29734
  `, isInline: true, components: [{ type: NovoLoadingElement, selector: "novo-loading", inputs: ["theme", "color", "size"] }, { type: NovoListElement, selector: "novo-list", inputs: ["theme", "direction"] }, { type: NovoListItemElement, selector: "novo-list-item, a[list-item], button[list-item]" }, { type: NovoItemHeaderElement, selector: "item-header, novo-item-header" }, { type: NovoItemTitleElement, selector: "item-title, novo-item-title" }, { type: NovoItemContentElement, selector: "item-content, novo-item-content", inputs: ["direction"] }], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ThemeColorDirective, selector: "[theme]", inputs: ["theme"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
29740
29735
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: WorkersCompCodesPickerResults, decorators: [{
29741
29736
  type: Component,
29742
29737
  args: [{
29743
29738
  selector: 'workers-comp-codes-picker-results',
29739
+ host: {
29740
+ class: 'active',
29741
+ },
29744
29742
  template: `
29745
29743
  <section class="picker-loading" *ngIf="isLoading && !matches?.length">
29746
29744
  <novo-loading theme="line"></novo-loading>
@@ -29779,15 +29777,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
29779
29777
  </novo-list-item>
29780
29778
  <novo-loading theme="line" *ngIf="isLoading && matches?.length > 0"></novo-loading>
29781
29779
  </novo-list>
29780
+ <div class="picker-loader" *ngIf="isLoading && matches.length === 0"><novo-loading theme="line"></novo-loading></div>
29781
+ <p class="picker-error" *ngIf="hasError">{{ labels.pickerError }}</p>
29782
+ <p class="picker-null-results" *ngIf="hasNonErrorMessage">{{ getEmptyMessage() }}</p>
29782
29783
  `,
29783
29784
  }]
29784
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$2.DomSanitizer }, { type: NovoLabelService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { active: [{
29785
- type: HostBinding,
29786
- args: ['class.active']
29787
- }], isHidden: [{
29788
- type: HostBinding,
29789
- args: ['hidden']
29790
- }] } });
29785
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$2.DomSanitizer }, { type: NovoLabelService }, { type: i0.ChangeDetectorRef }]; } });
29791
29786
 
29792
29787
  // NG2
29793
29788
  // Value accessor for the component (supports ngModel)
@@ -33225,9 +33220,7 @@ const DATEFORMAT_VALUE_ACCESSOR = {
33225
33220
  multi: true,
33226
33221
  };
33227
33222
  class NovoDateFormatDirective extends IMaskDirective {
33228
- constructor(_element, _renderer, _factory,
33229
- // @Optional() @Inject(PLATFORM_ID) _platformId: string,
33230
- _compositionMode, labels) {
33223
+ constructor(_element, _renderer, _factory, _compositionMode, labels) {
33231
33224
  super(_element, _renderer, _factory, _compositionMode);
33232
33225
  this._element = _element;
33233
33226
  this.labels = labels;
@@ -33351,7 +33344,6 @@ class NovoDateRangeFormatDirective extends IMaskDirective {
33351
33344
  this.unmask = false;
33352
33345
  this.imask = {
33353
33346
  mask: 'm{/}`d{/}`Y - m{/}`d{/}`Y',
33354
- // pattern: 'm{/}`d{/}`Y - m{/}`d{/}`Y',
33355
33347
  overwrite: true,
33356
33348
  autofix: true,
33357
33349
  lazy: false,
@@ -33479,9 +33471,7 @@ var TIME_FORMATS;
33479
33471
  TIME_FORMATS["STRING"] = "string";
33480
33472
  })(TIME_FORMATS || (TIME_FORMATS = {}));
33481
33473
  class NovoTimeFormatDirective extends IMaskDirective {
33482
- constructor(_element, _renderer, _factory,
33483
- // @Optional() @Inject(PLATFORM_ID) _platformId: string,
33484
- _compositionMode, labels, cdr) {
33474
+ constructor(_element, _renderer, _factory, _compositionMode, labels, cdr) {
33485
33475
  super(_element, _renderer, _factory, _compositionMode);
33486
33476
  this._element = _element;
33487
33477
  this.labels = labels;
@@ -35124,7 +35114,7 @@ class NovoChipInput {
35124
35114
  focus(options) {
35125
35115
  this._inputElement.focus(options);
35126
35116
  }
35127
- /** Focuses the input. */
35117
+ /** Clears the input. */
35128
35118
  clearValue() {
35129
35119
  this._inputElement.value = '';
35130
35120
  this.ngControl?.control.setValue('');
@@ -37195,6 +37185,8 @@ class DataTableState {
37195
37185
  this.isForceRefresh = false;
37196
37186
  this.updates = new EventEmitter();
37197
37187
  this.retainSelected = false;
37188
+ this.savedSearchName = undefined;
37189
+ this.displayedColumns = undefined;
37198
37190
  }
37199
37191
  get userFiltered() {
37200
37192
  return !!(this.filter || this.sort || this.globalSearch || this.outsideFilter || this.where);
@@ -37206,27 +37198,7 @@ class DataTableState {
37206
37198
  return Array.from(this.selectedRows.values());
37207
37199
  }
37208
37200
  reset(fireUpdate = true, persistUserFilters) {
37209
- if (!persistUserFilters) {
37210
- this.sort = undefined;
37211
- this.globalSearch = undefined;
37212
- this.filter = undefined;
37213
- this.where = undefined;
37214
- }
37215
- this.page = 0;
37216
- if (!this.retainSelected) {
37217
- this.selectedRows.clear();
37218
- this.resetSource.next();
37219
- }
37220
- this.onSortFilterChange();
37221
- this.retainSelected = false;
37222
- if (fireUpdate) {
37223
- this.updates.emit({
37224
- sort: this.sort,
37225
- filter: this.filter,
37226
- globalSearch: this.globalSearch,
37227
- where: this.where,
37228
- });
37229
- }
37201
+ this.setState({}, fireUpdate, persistUserFilters);
37230
37202
  }
37231
37203
  clearSort(fireUpdate = true) {
37232
37204
  this.sort = undefined;
@@ -37308,6 +37280,7 @@ class DataTableState {
37308
37280
  filter: this.filter,
37309
37281
  globalSearch: this.globalSearch,
37310
37282
  where: this.where,
37283
+ savedSearchName: this.savedSearchName,
37311
37284
  });
37312
37285
  }
37313
37286
  setInitialSortFilter(preferences) {
@@ -37319,23 +37292,58 @@ class DataTableState {
37319
37292
  this.sort = preferences.sort;
37320
37293
  }
37321
37294
  if (preferences.filter) {
37322
- const filters = Helpers.convertToArray(preferences.filter);
37323
- filters.forEach((filter) => {
37324
- filter.value =
37325
- filter.selectedOption && filter.type
37326
- ? NovoDataTableFilterUtils.constructFilter(filter.selectedOption, filter.type)
37327
- : filter.value;
37328
- });
37329
- this.filter = filters;
37295
+ this.filter = this.transformFilters(preferences.filter);
37330
37296
  }
37331
37297
  if (preferences.globalSearch) {
37332
37298
  this.globalSearch = preferences.globalSearch;
37333
37299
  }
37300
+ if (preferences.savedSearchName) {
37301
+ this.savedSearchName = preferences.savedSearchName;
37302
+ }
37303
+ }
37304
+ }
37305
+ setState(preferences, fireUpdate = true, persistUserFilters = false) {
37306
+ if (!persistUserFilters) {
37307
+ this.where = preferences.where;
37308
+ this.sort = preferences.sort;
37309
+ this.filter = preferences.filter ? this.transformFilters(preferences.filter) : undefined;
37310
+ this.globalSearch = preferences.globalSearch;
37311
+ this.savedSearchName = preferences.savedSearchName;
37312
+ if (preferences.displayedColumns?.length) {
37313
+ this.displayedColumns = preferences.displayedColumns;
37314
+ }
37315
+ }
37316
+ this.page = 0;
37317
+ if (!this.retainSelected) {
37318
+ this.selectedRows.clear();
37319
+ this.resetSource.next();
37320
+ }
37321
+ this.onSortFilterChange();
37322
+ this.retainSelected = false;
37323
+ if (fireUpdate) {
37324
+ this.updates.emit({
37325
+ sort: this.sort,
37326
+ filter: this.filter,
37327
+ globalSearch: this.globalSearch,
37328
+ where: this.where,
37329
+ savedSearchName: this.savedSearchName,
37330
+ displayedColumns: this.displayedColumns,
37331
+ });
37334
37332
  }
37335
37333
  }
37336
37334
  checkRetainment(caller, allMatchingSelected = false) {
37337
37335
  this.retainSelected = this.selectionOptions?.some((option) => option.label === caller) || this.retainSelected || allMatchingSelected;
37338
37336
  }
37337
+ transformFilters(filters) {
37338
+ const filterArray = Helpers.convertToArray(filters);
37339
+ filterArray.forEach((filter) => {
37340
+ filter.value =
37341
+ filter.selectedOption && filter.type
37342
+ ? NovoDataTableFilterUtils.constructFilter(filter.selectedOption, filter.type)
37343
+ : filter.value;
37344
+ });
37345
+ return filterArray;
37346
+ }
37339
37347
  }
37340
37348
  DataTableState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DataTableState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
37341
37349
  DataTableState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DataTableState });
@@ -40805,6 +40813,7 @@ class NovoDataTable {
40805
40813
  filter: event.filter,
40806
40814
  globalSearch: event.globalSearch,
40807
40815
  where: event.where,
40816
+ savedSearchName: event.savedSearchName,
40808
40817
  });
40809
40818
  this.performInteractions('change');
40810
40819
  }
@@ -40937,17 +40946,19 @@ class NovoDataTable {
40937
40946
  }
40938
40947
  modifyCellHeaderMultiSelectFilterOptions(column, newOptions) {
40939
40948
  const header = this.cellHeaders.find((cellHeader) => cellHeader.id === column);
40940
- if (header && header.config && header.config.filterConfig && header.config.filterConfig.options) {
40941
- const filterOptions = header.config.filterConfig.options;
40942
- const optionsToKeep = filterOptions.filter((opt) => header.isSelected(opt, header.multiSelectedOptions) &&
40943
- !newOptions.find((newOpt) => opt.value && newOpt.value && newOpt.value === opt.value));
40944
- header.config.filterConfig.options = [...optionsToKeep, ...newOptions];
40945
- }
40946
- else {
40947
- header.config.filterConfig.options = newOptions;
40949
+ if (header) {
40950
+ if (header.config && header.config.filterConfig && header.config.filterConfig.options) {
40951
+ const filterOptions = header.config.filterConfig.options;
40952
+ const optionsToKeep = filterOptions.filter((opt) => header.isSelected(opt, header.multiSelectedOptions) &&
40953
+ !newOptions.find((newOpt) => opt.value && newOpt.value && newOpt.value === opt.value));
40954
+ header.config.filterConfig.options = [...optionsToKeep, ...newOptions];
40955
+ }
40956
+ else {
40957
+ header.config.filterConfig.options = newOptions;
40958
+ }
40959
+ header.setupFilterOptions();
40960
+ header.changeDetectorRef.markForCheck();
40948
40961
  }
40949
- header.setupFilterOptions();
40950
- header.changeDetectorRef.markForCheck();
40951
40962
  }
40952
40963
  ngOnDestroy() {
40953
40964
  this.outsideFilterSubscription?.unsubscribe();
@@ -56503,7 +56514,6 @@ class ConditionBuilderComponent {
56503
56514
  const { fields = [] } = this.qbs.config || {};
56504
56515
  fields.length && this.changeFieldOptions(fields[0]);
56505
56516
  this.searches = this.searchTerm.valueChanges.pipe(debounceTime(300), distinctUntilChanged()).subscribe((term) => {
56506
- // this.parentForm.get('field').setValue(null);
56507
56517
  this.results$ = Promise.resolve(this.fieldConfig.options.filter((f) => f.name.toLowerCase().includes(term.toLowerCase()) || f.label?.toLowerCase().includes(term.toLowerCase())));
56508
56518
  this.cdr.markForCheck();
56509
56519
  });
@@ -56519,8 +56529,6 @@ class ConditionBuilderComponent {
56519
56529
  [this._operatorOutlet.viewContainer, this._inputOutlet.viewContainer].forEach((def) => {
56520
56530
  def.clear();
56521
56531
  });
56522
- // this._contentFieldTypeDefs = [];
56523
- // this._contentFieldDefs = [];
56524
56532
  this._onDestroy.next();
56525
56533
  this._onDestroy.complete();
56526
56534
  }
@@ -56529,7 +56537,6 @@ class ConditionBuilderComponent {
56529
56537
  * @param fieldConfig
56530
56538
  */
56531
56539
  changeFieldOptions(fieldConfig) {
56532
- // this.fields = entity.filter(term);
56533
56540
  this.fieldConfig = fieldConfig;
56534
56541
  this.searchTerm.setValue('');
56535
56542
  this.results$ = Promise.resolve(this.fieldConfig.options);
@@ -57119,9 +57126,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
57119
57126
  }] });
57120
57127
 
57121
57128
  /**
57122
- * Contruction filters against String fields can be complex. Each "chip" added to the
57123
- * condition can be used to indendantly used to query a database. Not all systems support
57124
- * quering within a text column, ie sql unless LIKE is enabled. This could result in a
57129
+ * Constructing filters against String fields can be complex. Each "chip" added to the
57130
+ * condition can be independently used to query a database. Not all systems support
57131
+ * querying within a text column, ie sql unless LIKE is enabled. This could result in a
57125
57132
  * performance penalty.
57126
57133
  */
57127
57134
  class NovoDefaultStringConditionDef extends AbstractConditionFieldDef {
@@ -57129,7 +57136,6 @@ class NovoDefaultStringConditionDef extends AbstractConditionFieldDef {
57129
57136
  super(...arguments);
57130
57137
  this.separatorKeysCodes = [ENTER, COMMA];
57131
57138
  this.defaultOperator = 'includeAny';
57132
- this.model = '';
57133
57139
  }
57134
57140
  getValue(formGroup) {
57135
57141
  return formGroup.value?.value || [];
@@ -57169,15 +57175,14 @@ NovoDefaultStringConditionDef.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "1
57169
57175
  <novo-option value="excludeAny">{{ labels.exclude }}</novo-option>
57170
57176
  </novo-select>
57171
57177
  </novo-field>
57172
- <novo-field *novoConditionInputDef="let formGroup">
57173
- <novo-chip-list #chipList aria-label="filter value">
57178
+ <novo-field *novoConditionInputDef="let formGroup" [formGroup]="formGroup">
57179
+ <novo-chip-list #chipList aria-label="filter value" formControlName="value">
57174
57180
  <novo-chip *ngFor="let chip of formGroup.value?.value || []" [value]="chip" (removed)="remove(chip, formGroup)">
57175
57181
  {{ chip }}
57176
57182
  <novo-icon novoChipRemove>close</novo-icon>
57177
57183
  </novo-chip>
57178
57184
  <input
57179
57185
  novoChipInput
57180
- [(ngModel)]="model"
57181
57186
  [placeholder]="labels.typeToAddChips"
57182
57187
  autocomplete="off"
57183
57188
  (novoChipInputTokenEnd)="add($event, formGroup)"
@@ -57186,7 +57191,7 @@ NovoDefaultStringConditionDef.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "1
57186
57191
  <novo-autocomplete></novo-autocomplete>
57187
57192
  </novo-field>
57188
57193
  </ng-container>
57189
- `, isInline: true, components: [{ type: NovoFieldElement, selector: "novo-field", inputs: ["layout", "appearance", "width"], outputs: ["valueChanges", "stateChanges"] }, { type: NovoSelectElement, selector: "novo-select", inputs: ["disabled", "required", "tabIndex", "id", "name", "options", "placeholder", "readonly", "headerConfig", "position", "overlayWidth", "overlayHeight", "displayWith", "compareWith", "value", "multiple"], outputs: ["onSelect", "selectionChange", "valueChange", "openedChange", "opened", "closed"] }, { type: NovoOption, selector: "novo-option", inputs: ["selected", "keepOpen", "novoInert", "value", "disabled"], exportAs: ["novoOption"] }, { type: NovoChipList, selector: "novo-chip-list", inputs: ["errorStateMatcher", "multiple", "stacked", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["novoChipList"] }, { type: NovoChipElement, selector: "novo-chip, [novo-chip]", inputs: ["color", "tabIndex", "size", "type", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"] }, { type: NovoIconComponent, selector: "novo-icon", inputs: ["raised", "theme", "shape", "color", "size", "smaller", "larger", "alt", "name"] }, { type: NovoAutocompleteElement, selector: "novo-autocomplete", inputs: ["tabIndex", "triggerOn", "displayWith", "aria-label", "multiple", "disabled"], outputs: ["optionSelected", "optionActivated"], exportAs: ["novoAutocomplete"] }], directives: [{ type: NovoConditionFieldDef, selector: "[novoConditionFieldDef]" }, { type: NovoConditionOperatorsDef, selector: "[novoConditionOperatorsDef]" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: NovoConditionInputDef, selector: "[novoConditionInputDef]" }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: NovoChipRemove, selector: "[novoChipRemove]" }, { type: NovoChipInput, selector: "input[novoChipInput]", inputs: ["novoChipInputAddOnBlur", "novoChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["novoChipInputTokenEnd"], exportAs: ["novoChipInput", "novoChipInputFor"] }, { type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
57194
+ `, isInline: true, components: [{ type: NovoFieldElement, selector: "novo-field", inputs: ["layout", "appearance", "width"], outputs: ["valueChanges", "stateChanges"] }, { type: NovoSelectElement, selector: "novo-select", inputs: ["disabled", "required", "tabIndex", "id", "name", "options", "placeholder", "readonly", "headerConfig", "position", "overlayWidth", "overlayHeight", "displayWith", "compareWith", "value", "multiple"], outputs: ["onSelect", "selectionChange", "valueChange", "openedChange", "opened", "closed"] }, { type: NovoOption, selector: "novo-option", inputs: ["selected", "keepOpen", "novoInert", "value", "disabled"], exportAs: ["novoOption"] }, { type: NovoChipList, selector: "novo-chip-list", inputs: ["errorStateMatcher", "multiple", "stacked", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["novoChipList"] }, { type: NovoChipElement, selector: "novo-chip, [novo-chip]", inputs: ["color", "tabIndex", "size", "type", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"] }, { type: NovoIconComponent, selector: "novo-icon", inputs: ["raised", "theme", "shape", "color", "size", "smaller", "larger", "alt", "name"] }, { type: NovoAutocompleteElement, selector: "novo-autocomplete", inputs: ["tabIndex", "triggerOn", "displayWith", "aria-label", "multiple", "disabled"], outputs: ["optionSelected", "optionActivated"], exportAs: ["novoAutocomplete"] }], directives: [{ type: NovoConditionFieldDef, selector: "[novoConditionFieldDef]" }, { type: NovoConditionOperatorsDef, selector: "[novoConditionOperatorsDef]" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: NovoConditionInputDef, selector: "[novoConditionInputDef]" }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: NovoChipRemove, selector: "[novoChipRemove]" }, { type: NovoChipInput, selector: "input[novoChipInput]", inputs: ["novoChipInputAddOnBlur", "novoChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["novoChipInputTokenEnd"], exportAs: ["novoChipInput", "novoChipInputFor"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
57190
57195
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NovoDefaultStringConditionDef, decorators: [{
57191
57196
  type: Component,
57192
57197
  args: [{
@@ -57201,15 +57206,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
57201
57206
  <novo-option value="excludeAny">{{ labels.exclude }}</novo-option>
57202
57207
  </novo-select>
57203
57208
  </novo-field>
57204
- <novo-field *novoConditionInputDef="let formGroup">
57205
- <novo-chip-list #chipList aria-label="filter value">
57209
+ <novo-field *novoConditionInputDef="let formGroup" [formGroup]="formGroup">
57210
+ <novo-chip-list #chipList aria-label="filter value" formControlName="value">
57206
57211
  <novo-chip *ngFor="let chip of formGroup.value?.value || []" [value]="chip" (removed)="remove(chip, formGroup)">
57207
57212
  {{ chip }}
57208
57213
  <novo-icon novoChipRemove>close</novo-icon>
57209
57214
  </novo-chip>
57210
57215
  <input
57211
57216
  novoChipInput
57212
- [(ngModel)]="model"
57213
57217
  [placeholder]="labels.typeToAddChips"
57214
57218
  autocomplete="off"
57215
57219
  (novoChipInputTokenEnd)="add($event, formGroup)"
@@ -57284,7 +57288,7 @@ class ConditionGroupComponent {
57284
57288
  return this.formBuilder.group({
57285
57289
  field: [field, Validators.required],
57286
57290
  operator: [operator, Validators.required],
57287
- value: [value, Validators.required],
57291
+ value: [value],
57288
57292
  });
57289
57293
  }
57290
57294
  cantRemoveRow(isFirst) {
@@ -57294,12 +57298,12 @@ class ConditionGroupComponent {
57294
57298
  }
57295
57299
  }
57296
57300
  ConditionGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ConditionGroupComponent, deps: [{ token: QueryBuilderService }, { token: NovoLabelService }, { token: i5.ControlContainer }, { token: i5.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
57297
- ConditionGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ConditionGroupComponent, selector: "novo-condition-group", inputs: { controlName: "controlName", groupIndex: "groupIndex" }, host: { classAttribute: "novo-condition-group" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ConditionGroupComponent), multi: true }], ngImport: i0, template: "<div [formGroup]=\"parentForm\" class=\"condition-group-container\">\n <novo-stack [formArrayName]=\"controlName\" gap=\"md\">\n <ng-container\n *ngFor=\"let andGroup of root.controls; let andIndex = index; let isFirst = first;let isLast = last;\">\n <ng-container [formGroupName]=\"andIndex\">\n <novo-flex class=\"condition-row\" align=\"end\" gap=\"sm\">\n <novo-dropdown *ngIf=\"!isFirst && qbs.allowedGroupings.length > 1; else labeledGroup\">\n <button theme=\"dialogue\" icon=\"collapse\" size=\"sm\">{{qbs.getConjunctionLabel(controlName)}}</button>\n <novo-optgroup>\n <novo-option *ngFor=\"let c of qbs.allowedGroupings\" (click)=\"updateControlName(c)\">\n {{qbs.getConjunctionLabel(c)}}</novo-option>\n </novo-optgroup>\n </novo-dropdown>\n <ng-template #labeledGroup>\n <novo-label *ngIf=\"!isFirst\" color=\"ash\" size=\"xs\" uppercase padding=\"sm\">\n {{qbs.getConjunctionLabel(controlName)}}</novo-label>\n </ng-template>\n <novo-condition-builder [groupIndex]=\"groupIndex\" [andIndex]=\"andIndex\" [isFirst]=\"isFirst\"></novo-condition-builder>\n <novo-button theme=\"icon\" icon=\"delete-o\" color=\"negative\" (click)=\"removeCondition(andIndex)\"\n [disabled]=\"cantRemoveRow(isFirst)\">\n </novo-button>\n </novo-flex>\n </ng-container>\n </ng-container>\n <button theme=\"dialogue\" data-automation-id=\"add-advanced-search-condition\" icon=\"add-thin\" side=\"left\" size=\"sm\" uppercase padding=\"sm\" (click)=\"addCondition()\">\n {{ labels.addCondition }}</button>\n </novo-stack>\n\n\n <!-- <button class=\"and-or-button\" theme=\"secondary\" size=\"sm\" (click)=\"addRootCondition()\">{{ addCriteriaLabel }}</button> -->\n</div>", styles: [":host{position:relative;display:block;border:1px solid var(--border);border-radius:var(--border-radius-round);padding:var(--spacing-md);width:100%}:host .condition-row{width:100%}\n"], components: [{ type: NovoStackElement, selector: "novo-stack,novo-column", inputs: ["direction", "align"] }, { type: NovoFlexElement, selector: "novo-flex,novo-row", inputs: ["direction", "align", "justify", "wrap", "gap"] }, { type: NovoDropdownElement, selector: "novo-dropdown", inputs: ["parentScrollSelector", "parentScrollAction", "containerClass", "side", "scrollStrategy", "keepOpen", "height", "width", "appendToBody", "multiple"], outputs: ["toggled"] }, { type: NovoButtonElement, selector: "novo-button,button[theme]", inputs: ["color", "side", "size", "theme", "loading", "icon", "disabled"] }, { type: NovoOptgroup, selector: "novo-optgroup", inputs: ["disabled", "label"], exportAs: ["novoOptgroup"] }, { type: NovoOption, selector: "novo-option", inputs: ["selected", "keepOpen", "novoInert", "value", "disabled"], exportAs: ["novoOption"] }, { type: NovoLabel, selector: "novo-label,[novo-label]" }, { type: ConditionBuilderComponent, selector: "novo-condition-builder", inputs: ["label", "isFirst", "andIndex", "groupIndex"] }], directives: [{ type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: GapDirective, selector: "[gap]", inputs: ["gap"] }, { type: i5.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ThemeColorDirective, selector: "[theme]", inputs: ["theme"] }, { type: PaddingDirective, selector: "[p],[padding],[paddingTop],[paddingRight],[paddingBottom],[paddingLeft],[paddingX],[paddingY],[pt],[pr],[pb],[pl],[px],[py]", inputs: ["padding", "p", "paddingLeft", "pl", "paddingRight", "pr", "paddingTop", "pt", "paddingBottom", "pb", "paddingX", "px", "paddingY", "py"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
57301
+ ConditionGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ConditionGroupComponent, selector: "novo-condition-group", inputs: { controlName: "controlName", groupIndex: "groupIndex" }, host: { classAttribute: "novo-condition-group" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ConditionGroupComponent), multi: true }], ngImport: i0, template: "<div [formGroup]=\"parentForm\" class=\"condition-group-container\">\n <novo-stack [formArrayName]=\"controlName\" gap=\"md\">\n <ng-container\n *ngFor=\"let andGroup of root.controls; let andIndex = index; let isFirst = first;let isLast = last;\">\n <ng-container [formGroupName]=\"andIndex\">\n <novo-flex class=\"condition-row\" align=\"end\" gap=\"sm\">\n <novo-dropdown *ngIf=\"!isFirst && qbs.allowedGroupings.length > 1; else labeledGroup\">\n <button theme=\"dialogue\" icon=\"collapse\" size=\"sm\">{{qbs.getConjunctionLabel(controlName)}}</button>\n <novo-optgroup>\n <novo-option *ngFor=\"let c of qbs.allowedGroupings\" (click)=\"updateControlName(c)\">\n {{qbs.getConjunctionLabel(c)}}</novo-option>\n </novo-optgroup>\n </novo-dropdown>\n <ng-template #labeledGroup>\n <novo-label *ngIf=\"!isFirst\" color=\"ash\" size=\"xs\" uppercase padding=\"sm\">\n {{qbs.getConjunctionLabel(controlName)}}</novo-label>\n </ng-template>\n <novo-condition-builder [groupIndex]=\"groupIndex\" [andIndex]=\"andIndex\" [isFirst]=\"isFirst\"></novo-condition-builder>\n <novo-button theme=\"icon\" icon=\"delete-o\" color=\"negative\" (click)=\"removeCondition(andIndex)\"\n [disabled]=\"cantRemoveRow(isFirst)\">\n </novo-button>\n </novo-flex>\n </ng-container>\n </ng-container>\n <button theme=\"dialogue\" data-automation-id=\"add-advanced-search-condition\" icon=\"add-thin\" side=\"left\" size=\"sm\" uppercase padding=\"sm\" (click)=\"addCondition()\">\n {{ labels.addCondition }}</button>\n </novo-stack>\n <!-- <button class=\"and-or-button\" theme=\"secondary\" size=\"sm\" (click)=\"addRootCondition()\">{{ addCriteriaLabel }}</button> -->\n</div>", styles: [":host{position:relative;display:block;border:1px solid var(--border);border-radius:var(--border-radius-round);padding:var(--spacing-md);width:100%}:host .condition-row{width:100%}\n"], components: [{ type: NovoStackElement, selector: "novo-stack,novo-column", inputs: ["direction", "align"] }, { type: NovoFlexElement, selector: "novo-flex,novo-row", inputs: ["direction", "align", "justify", "wrap", "gap"] }, { type: NovoDropdownElement, selector: "novo-dropdown", inputs: ["parentScrollSelector", "parentScrollAction", "containerClass", "side", "scrollStrategy", "keepOpen", "height", "width", "appendToBody", "multiple"], outputs: ["toggled"] }, { type: NovoButtonElement, selector: "novo-button,button[theme]", inputs: ["color", "side", "size", "theme", "loading", "icon", "disabled"] }, { type: NovoOptgroup, selector: "novo-optgroup", inputs: ["disabled", "label"], exportAs: ["novoOptgroup"] }, { type: NovoOption, selector: "novo-option", inputs: ["selected", "keepOpen", "novoInert", "value", "disabled"], exportAs: ["novoOption"] }, { type: NovoLabel, selector: "novo-label,[novo-label]" }, { type: ConditionBuilderComponent, selector: "novo-condition-builder", inputs: ["label", "isFirst", "andIndex", "groupIndex"] }], directives: [{ type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: GapDirective, selector: "[gap]", inputs: ["gap"] }, { type: i5.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ThemeColorDirective, selector: "[theme]", inputs: ["theme"] }, { type: PaddingDirective, selector: "[p],[padding],[paddingTop],[paddingRight],[paddingBottom],[paddingLeft],[paddingX],[paddingY],[pt],[pr],[pb],[pl],[px],[py]", inputs: ["padding", "p", "paddingLeft", "pl", "paddingRight", "pr", "paddingTop", "pt", "paddingBottom", "pb", "paddingX", "px", "paddingY", "py"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
57298
57302
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ConditionGroupComponent, decorators: [{
57299
57303
  type: Component,
57300
57304
  args: [{ selector: 'novo-condition-group', changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ConditionGroupComponent), multi: true }], host: {
57301
57305
  class: 'novo-condition-group',
57302
- }, template: "<div [formGroup]=\"parentForm\" class=\"condition-group-container\">\n <novo-stack [formArrayName]=\"controlName\" gap=\"md\">\n <ng-container\n *ngFor=\"let andGroup of root.controls; let andIndex = index; let isFirst = first;let isLast = last;\">\n <ng-container [formGroupName]=\"andIndex\">\n <novo-flex class=\"condition-row\" align=\"end\" gap=\"sm\">\n <novo-dropdown *ngIf=\"!isFirst && qbs.allowedGroupings.length > 1; else labeledGroup\">\n <button theme=\"dialogue\" icon=\"collapse\" size=\"sm\">{{qbs.getConjunctionLabel(controlName)}}</button>\n <novo-optgroup>\n <novo-option *ngFor=\"let c of qbs.allowedGroupings\" (click)=\"updateControlName(c)\">\n {{qbs.getConjunctionLabel(c)}}</novo-option>\n </novo-optgroup>\n </novo-dropdown>\n <ng-template #labeledGroup>\n <novo-label *ngIf=\"!isFirst\" color=\"ash\" size=\"xs\" uppercase padding=\"sm\">\n {{qbs.getConjunctionLabel(controlName)}}</novo-label>\n </ng-template>\n <novo-condition-builder [groupIndex]=\"groupIndex\" [andIndex]=\"andIndex\" [isFirst]=\"isFirst\"></novo-condition-builder>\n <novo-button theme=\"icon\" icon=\"delete-o\" color=\"negative\" (click)=\"removeCondition(andIndex)\"\n [disabled]=\"cantRemoveRow(isFirst)\">\n </novo-button>\n </novo-flex>\n </ng-container>\n </ng-container>\n <button theme=\"dialogue\" data-automation-id=\"add-advanced-search-condition\" icon=\"add-thin\" side=\"left\" size=\"sm\" uppercase padding=\"sm\" (click)=\"addCondition()\">\n {{ labels.addCondition }}</button>\n </novo-stack>\n\n\n <!-- <button class=\"and-or-button\" theme=\"secondary\" size=\"sm\" (click)=\"addRootCondition()\">{{ addCriteriaLabel }}</button> -->\n</div>", styles: [":host{position:relative;display:block;border:1px solid var(--border);border-radius:var(--border-radius-round);padding:var(--spacing-md);width:100%}:host .condition-row{width:100%}\n"] }]
57306
+ }, template: "<div [formGroup]=\"parentForm\" class=\"condition-group-container\">\n <novo-stack [formArrayName]=\"controlName\" gap=\"md\">\n <ng-container\n *ngFor=\"let andGroup of root.controls; let andIndex = index; let isFirst = first;let isLast = last;\">\n <ng-container [formGroupName]=\"andIndex\">\n <novo-flex class=\"condition-row\" align=\"end\" gap=\"sm\">\n <novo-dropdown *ngIf=\"!isFirst && qbs.allowedGroupings.length > 1; else labeledGroup\">\n <button theme=\"dialogue\" icon=\"collapse\" size=\"sm\">{{qbs.getConjunctionLabel(controlName)}}</button>\n <novo-optgroup>\n <novo-option *ngFor=\"let c of qbs.allowedGroupings\" (click)=\"updateControlName(c)\">\n {{qbs.getConjunctionLabel(c)}}</novo-option>\n </novo-optgroup>\n </novo-dropdown>\n <ng-template #labeledGroup>\n <novo-label *ngIf=\"!isFirst\" color=\"ash\" size=\"xs\" uppercase padding=\"sm\">\n {{qbs.getConjunctionLabel(controlName)}}</novo-label>\n </ng-template>\n <novo-condition-builder [groupIndex]=\"groupIndex\" [andIndex]=\"andIndex\" [isFirst]=\"isFirst\"></novo-condition-builder>\n <novo-button theme=\"icon\" icon=\"delete-o\" color=\"negative\" (click)=\"removeCondition(andIndex)\"\n [disabled]=\"cantRemoveRow(isFirst)\">\n </novo-button>\n </novo-flex>\n </ng-container>\n </ng-container>\n <button theme=\"dialogue\" data-automation-id=\"add-advanced-search-condition\" icon=\"add-thin\" side=\"left\" size=\"sm\" uppercase padding=\"sm\" (click)=\"addCondition()\">\n {{ labels.addCondition }}</button>\n </novo-stack>\n <!-- <button class=\"and-or-button\" theme=\"secondary\" size=\"sm\" (click)=\"addRootCondition()\">{{ addCriteriaLabel }}</button> -->\n</div>", styles: [":host{position:relative;display:block;border:1px solid var(--border);border-radius:var(--border-radius-round);padding:var(--spacing-md);width:100%}:host .condition-row{width:100%}\n"] }]
57303
57307
  }], ctorParameters: function () { return [{ type: QueryBuilderService }, { type: NovoLabelService }, { type: i5.ControlContainer }, { type: i5.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { controlName: [{
57304
57308
  type: Input
57305
57309
  }], groupIndex: [{
@@ -57390,7 +57394,7 @@ class CriteriaBuilderComponent {
57390
57394
  return this.formBuilder.group({
57391
57395
  field: [field, Validators.required],
57392
57396
  operator: [operator, Validators.required],
57393
- value: [value, Validators.required],
57397
+ value: [value],
57394
57398
  });
57395
57399
  }
57396
57400
  removeConditionGroupAt(index) {