@tft/crispr-forms 12.2.13 → 12.2.17

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 (34) hide show
  1. package/bundles/tft-crispr-forms.umd.js +51 -47
  2. package/bundles/tft-crispr-forms.umd.js.map +1 -1
  3. package/esm2015/lib/abstracts/autocomplete-field.abstract.js +4 -4
  4. package/esm2015/lib/abstracts/autocomplete-field.abstract.js.map +1 -1
  5. package/esm2015/lib/crispr-forms.module.ngfactory.js.map +1 -1
  6. package/esm2015/lib/form-group-list/form-group-list.component.js +2 -2
  7. package/esm2015/lib/form-group-list/form-group-list.component.js.map +1 -1
  8. package/esm2015/lib/form-group-list/form-group-list.component.metadata.json +1 -1
  9. package/esm2015/lib/form.helpers.js +4 -9
  10. package/esm2015/lib/form.helpers.js.map +1 -1
  11. package/esm2015/lib/form.helpers.metadata.json +1 -1
  12. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.js +31 -10
  13. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.js.map +1 -1
  14. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.metadata.json +1 -1
  15. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.js +7 -17
  16. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.js.map +1 -1
  17. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.metadata.json +1 -1
  18. package/esm2015/lib/material/material.module.ngfactory.js.map +1 -1
  19. package/esm2015/lib/material/option/option.component.js +1 -1
  20. package/esm2015/lib/material/option/option.component.js.map +1 -1
  21. package/esm2015/lib/material/option/option.component.metadata.json +1 -1
  22. package/esm2015/lib/models/autocomplete-chiplist-field.config.js.map +1 -1
  23. package/esm2015/lib/models/form-group-list.config.js.map +1 -1
  24. package/fesm2015/tft-crispr-forms.js +45 -42
  25. package/fesm2015/tft-crispr-forms.js.map +1 -1
  26. package/lib/form.helpers.d.ts +1 -1
  27. package/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.d.ts +11 -4
  28. package/lib/material/autocomplete-field/autocomplete-field.component.d.ts +0 -6
  29. package/lib/models/autocomplete-chiplist-field.config.d.ts +11 -2
  30. package/lib/models/form-group-list.config.d.ts +2 -0
  31. package/package.json +1 -1
  32. package/tft-crispr-forms-12.2.17.tgz +0 -0
  33. package/tft-crispr-forms.metadata.json +1 -1
  34. package/tft-crispr-forms-12.2.13.tgz +0 -0
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('@angular/forms'), require('rxjs/operators'), require('@angular/core'), require('@angular/material/autocomplete'), require('@angular/cdk/portal'), require('@angular/common'), require('@angular/material/button'), require('@angular/material/button-toggle'), require('@angular/material/checkbox'), require('@angular/material/chips'), require('@angular/material/datepicker'), require('@angular/material/form-field'), require('@angular/material/icon'), require('@angular/material/input'), require('@angular/material/radio'), require('@angular/material/select'), require('@angular/material/slide-toggle'), require('@angular/material/slider'), require('@angular/material/tooltip'), require('@angular/material/divider'), require('@angular/material/progress-bar'), require('@tft/form-validation-handler'), require('@angular/material-moment-adapter')) :
3
- typeof define === 'function' && define.amd ? define('@tft/crispr-forms', ['exports', 'rxjs', '@angular/forms', 'rxjs/operators', '@angular/core', '@angular/material/autocomplete', '@angular/cdk/portal', '@angular/common', '@angular/material/button', '@angular/material/button-toggle', '@angular/material/checkbox', '@angular/material/chips', '@angular/material/datepicker', '@angular/material/form-field', '@angular/material/icon', '@angular/material/input', '@angular/material/radio', '@angular/material/select', '@angular/material/slide-toggle', '@angular/material/slider', '@angular/material/tooltip', '@angular/material/divider', '@angular/material/progress-bar', '@tft/form-validation-handler', '@angular/material-moment-adapter'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.tft = global.tft || {}, global.tft['crispr-forms'] = {}), global.rxjs, global.ng.forms, global.rxjs.operators, global.ng.core, global.ng.material.autocomplete, global.ng.cdk.portal, global.ng.common, global.ng.material.button, global.ng.material.buttonToggle, global.ng.material.checkbox, global.ng.material.chips, global.ng.material.datepicker, global.ng.material.formField, global.ng.material.icon, global.ng.material.input, global.ng.material.radio, global.ng.material.select, global.ng.material.slideToggle, global.ng.material.slider, global.ng.material.tooltip, global.ng.material.divider, global.ng.material.progressBar, global.formValidationHandler, global.ng.materialMomentAdapter));
5
- }(this, (function (exports, rxjs, forms, operators, core, autocomplete, portal, common, button, buttonToggle, checkbox, chips, datepicker, formField, icon, input, radio, select, slideToggle, slider, tooltip, divider, progressBar, formValidationHandler, materialMomentAdapter) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('@angular/forms'), require('rxjs/operators'), require('@angular/core'), require('@angular/material/autocomplete'), require('@angular/cdk/keycodes'), require('@angular/cdk/portal'), require('@angular/common'), require('@angular/material/button'), require('@angular/material/button-toggle'), require('@angular/material/checkbox'), require('@angular/material/chips'), require('@angular/material/datepicker'), require('@angular/material/form-field'), require('@angular/material/icon'), require('@angular/material/input'), require('@angular/material/radio'), require('@angular/material/select'), require('@angular/material/slide-toggle'), require('@angular/material/slider'), require('@angular/material/tooltip'), require('@angular/material/divider'), require('@angular/material/progress-bar'), require('@tft/form-validation-handler'), require('@angular/material-moment-adapter')) :
3
+ typeof define === 'function' && define.amd ? define('@tft/crispr-forms', ['exports', 'rxjs', '@angular/forms', 'rxjs/operators', '@angular/core', '@angular/material/autocomplete', '@angular/cdk/keycodes', '@angular/cdk/portal', '@angular/common', '@angular/material/button', '@angular/material/button-toggle', '@angular/material/checkbox', '@angular/material/chips', '@angular/material/datepicker', '@angular/material/form-field', '@angular/material/icon', '@angular/material/input', '@angular/material/radio', '@angular/material/select', '@angular/material/slide-toggle', '@angular/material/slider', '@angular/material/tooltip', '@angular/material/divider', '@angular/material/progress-bar', '@tft/form-validation-handler', '@angular/material-moment-adapter'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.tft = global.tft || {}, global.tft['crispr-forms'] = {}), global.rxjs, global.ng.forms, global.rxjs.operators, global.ng.core, global.ng.material.autocomplete, global.ng.cdk.keycodes, global.ng.cdk.portal, global.ng.common, global.ng.material.button, global.ng.material.buttonToggle, global.ng.material.checkbox, global.ng.material.chips, global.ng.material.datepicker, global.ng.material.formField, global.ng.material.icon, global.ng.material.input, global.ng.material.radio, global.ng.material.select, global.ng.material.slideToggle, global.ng.material.slider, global.ng.material.tooltip, global.ng.material.divider, global.ng.material.progressBar, global.formValidationHandler, global.ng.materialMomentAdapter));
5
+ }(this, (function (exports, rxjs, forms, operators, core, autocomplete, keycodes, portal, common, button, buttonToggle, checkbox, chips, datepicker, formField, icon, input, radio, select, slideToggle, slider, tooltip, divider, progressBar, formValidationHandler, materialMomentAdapter) { 'use strict';
6
6
 
7
7
  var DEFAULT_EMPTY_OPTIONS_MESSAGE = 'No Items';
8
8
 
@@ -164,7 +164,7 @@
164
164
  * @param options the options passed in from the config
165
165
  * @param emptyMessageOption the message to display when the array is empty
166
166
  */
167
- function observablifyOptions(options, parentGroup, searchString, emptyOptionsMessage) {
167
+ function observablifyOptions(options, parentGroup, searchString) {
168
168
  var calledOptions = callOptionsIfFunction(options, parentGroup, searchString);
169
169
  // if options are a promise
170
170
  return calledOptions instanceof Promise
@@ -178,13 +178,8 @@
178
178
  : rxjs.isObservable(calledOptions)
179
179
  // return it
180
180
  ? calledOptions
181
- // else return empty option
182
- : rxjs.of([
183
- {
184
- label: emptyOptionsMessage || DEFAULT_EMPTY_OPTIONS_MESSAGE,
185
- value: null
186
- }
187
- ]);
181
+ // else an empty array
182
+ : rxjs.of([]);
188
183
  }
189
184
  /**
190
185
  * Determines if the field config is for a form control (not a divider, heading or other non-control field)
@@ -621,9 +616,9 @@
621
616
  _super.prototype.ngOnInit.call(this);
622
617
  this.group.addControl(this.config.controlName, new forms.FormControl());
623
618
  // filter options by the search string using either the default filter function or one passed in through config
624
- this.options$ = this.autocompleteInputControl.valueChanges.pipe(operators.debounceTime(this.config.typeDebounceTime), operators.distinctUntilChanged(), operators.map(function (searchText) { return searchText || ''; }), operators.switchMap(function (searchText) {
625
- return observablifyOptions(_this.config.options, _this.group, searchText, _this.config.emptyOptionsMessage);
626
- }));
619
+ this.options$ = this.autocompleteInputControl.valueChanges.pipe(
620
+ // this is needed to have the options panel to open on focus
621
+ operators.startWith(''), operators.debounceTime(this.config.typeDebounceTime), operators.distinctUntilChanged(), operators.map(function (searchText) { return searchText || ''; }), operators.switchMap(function (searchText) { return observablifyOptions(_this.config.options, _this.group, searchText); }));
627
622
  };
628
623
  return AbstractAutocompleteComponent;
629
624
  }(AbstractAutocompleteFieldMixin));
@@ -705,7 +700,8 @@
705
700
 
706
701
  var defaultConfig$8 = {
707
702
  autoActiveFirstOption: true,
708
- typeDebounceTime: 500
703
+ typeDebounceTime: 500,
704
+ emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE
709
705
  };
710
706
  var AutocompleteFieldComponent = /** @class */ (function (_super) {
711
707
  __extends(AutocompleteFieldComponent, _super);
@@ -716,13 +712,12 @@
716
712
  }
717
713
  AutocompleteFieldComponent.prototype.ngOnInit = function () {
718
714
  _super.prototype.ngOnInit.call(this);
719
- this.setControlValue(this.value);
720
715
  };
721
716
  AutocompleteFieldComponent.prototype.setControlValue = function (value) {
722
- if (value && this.control) {
717
+ if (this.control && value) {
723
718
  // sets the initial value on the control if one is passed
724
- this.control.setValue(value.value); // value.value :)
725
- this.autocompleteInputControl.setValue(value.label);
719
+ this.control.setValue(value.value || '');
720
+ this.autocompleteInputControl.setValue(value.label || '');
726
721
  }
727
722
  };
728
723
  /**
@@ -744,23 +739,12 @@
744
739
  this.control.setValue(event.option.value);
745
740
  this.autoInputRef.nativeElement.blur();
746
741
  };
747
- /**
748
- * To follow ARIA standards we want to select the active option on blur.
749
- * We do this by selecting the MatAutoCompleteTrigger, which triggers the select event
750
- * @param event blur event that triggers the handle blur, TODO: remove this parameter if not used by 7/4/19
751
- */
752
- AutocompleteFieldComponent.prototype.handleTab = function (_event) {
753
- if (this.autoInput.activeOption) {
754
- this.autoInput.activeOption.select();
755
- this.control.setValue(this.autoInput.activeOption.value);
756
- }
757
- };
758
742
  return AutocompleteFieldComponent;
759
743
  }(AbstractAutocompleteComponent));
760
744
  AutocompleteFieldComponent.decorators = [
761
745
  { type: core.Component, args: [{
762
746
  selector: 'crispr-autocomplete-field',
763
- template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matAutocomplete]=\"auto\"\n (keydown.tab)=\"handleTab($event)\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n <mat-option\n *ngFor=\"let option of options$ | async\"\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n\n </mat-autocomplete>\n </mat-form-field>\n</crispr-field-container>\n",
747
+ template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n <ng-container *ngIf=\"options$ | async as options; else emptyOption\">\n <ng-container *ngIf=\"options.length > 0; else emptyOption\">\n <mat-option\n *ngFor=\"let option of options$ | async\"\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n </ng-container>\n\n </ng-container>\n <ng-template #emptyOption>\n <mat-option disabled=\"true\">\n {{config.emptyOptionsMessage}}\n </mat-option>\n </ng-template>\n\n </mat-autocomplete>\n </mat-form-field>\n</crispr-field-container>\n",
764
748
  changeDetection: core.ChangeDetectionStrategy.OnPush,
765
749
  styles: [""]
766
750
  },] }
@@ -770,14 +754,18 @@
770
754
  autoInputRef: [{ type: core.ViewChild, args: ['autoInput',] }]
771
755
  };
772
756
 
757
+ var ɵ0 = function (chip, option) { return chip.value === option.value; };
773
758
  var defaultConfig$7 = {
774
759
  chipsSelectable: true,
775
760
  areChipsRemovable: true,
776
- addChipOnBlur: true,
761
+ tabToSelect: true,
777
762
  autoActiveFirstOption: true,
778
763
  imageUrlParam: 'image',
779
764
  typeDebounceTime: 500,
780
- allowDuplicates: false
765
+ allowDuplicates: false,
766
+ duplicateCompareFunction: ɵ0,
767
+ separatorKeyCodes: [keycodes.ENTER],
768
+ emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,
781
769
  };
782
770
  var AutocompleteChiplistFieldComponent = /** @class */ (function (_super) {
783
771
  __extends(AutocompleteChiplistFieldComponent, _super);
@@ -796,12 +784,12 @@
796
784
  this.remainingOptions$ = rxjs.combineLatest([
797
785
  this.chips$,
798
786
  this.options$
799
- ]).pipe(operators.map(function (_a) {
800
- var _b = __read(_a, 2), chips = _b[0], options = _b[1];
787
+ ]).pipe(operators.map(function (_b) {
788
+ var _c = __read(_b, 2), chips = _c[0], options = _c[1];
801
789
  return _this.config.allowDuplicates
802
790
  ? options
803
- : options.filter(function (option) {
804
- return !chips.some(function (chip) { return chip.value === option.value; });
791
+ : options === null || options === void 0 ? void 0 : options.filter(function (option) {
792
+ return !chips.some(function (chip) { return _this.config.duplicateCompareFunction(chip, option); });
805
793
  });
806
794
  }));
807
795
  };
@@ -810,20 +798,38 @@
810
798
  this.chips$.next(value);
811
799
  }
812
800
  };
801
+ // handles mat selecting
813
802
  AutocompleteChiplistFieldComponent.prototype.handleSelect = function (event) {
803
+ var _this = this;
814
804
  var selectedOption = event.option.value;
815
805
  this.chips$.next(__spreadArray(__spreadArray([], __read(this.chips$.value)), [selectedOption]));
816
806
  this.chipInputRef.nativeElement.value = '';
817
807
  this.autocompleteInputControl.setValue('');
808
+ // setTimeout needed because the panel thinks it's still open at this point
809
+ setTimeout(function () { return _this.chipInput.openPanel(); });
818
810
  };
819
811
  /**
820
812
  * To follow ARIA standards we want to select the active option on blur.
821
- * @param event blur event that triggers the handle blur, TODO: remove this parameter if not used by 7/4/19
813
+ * matChipInputAddOnBlur should do this but it causes buggy behaviour
814
+ * @param event blur event that triggers the handle blur
822
815
  */
823
816
  AutocompleteChiplistFieldComponent.prototype.handleTab = function (_event) {
817
+ if (this.chipInput.activeOption && (this.config.tabToSelect || this.config.addChipOnBlur)) {
818
+ var chip = this.chipInput.activeOption.value;
819
+ this.chips$.next(__spreadArray(__spreadArray([], __read(this.chips$.value)), [chip]));
820
+ }
821
+ };
822
+ /**
823
+ * Handles selection via key tokens passed through separatorKeyCodes propert
824
+ * NOTE: If TAB is used focus does not move on to next component
825
+ * @param event
826
+ */
827
+ AutocompleteChiplistFieldComponent.prototype.handleTokenEnd = function (event) {
828
+ var _a;
824
829
  if (this.chipInput.activeOption) {
825
830
  this.chipInput.activeOption.select();
826
831
  }
832
+ (_a = event.chipInput) === null || _a === void 0 ? void 0 : _a.clear();
827
833
  };
828
834
  AutocompleteChiplistFieldComponent.prototype.mapToLabel = function (option) {
829
835
  return option ? option.label : '';
@@ -832,17 +838,14 @@
832
838
  var remainingChips = this.chips$.value.filter(function (chip) { return chip !== removedChip; });
833
839
  this.chips$.next(remainingChips);
834
840
  };
835
- AutocompleteChiplistFieldComponent.prototype.inputFilter = function (stringToCheck, searchString) {
836
- return stringToCheck.toLowerCase().includes(searchString.trim().toLowerCase());
837
- };
838
841
  return AutocompleteChiplistFieldComponent;
839
842
  }(AbstractAutocompleteComponent));
840
843
  AutocompleteChiplistFieldComponent.decorators = [
841
844
  { type: core.Component, args: [{
842
845
  selector: 'crispr-autocomplete-chiplist-field',
843
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n\n <mat-chip-list\n #chipList>\n <mat-chip\n class=\"refinement-chip\"\n *ngFor=\"let chip of controlValue$ | async\"\n [selectable]=\"config.chipsSelectable\"\n [removable]=\"config.areChipsRemovable\"\n (removed)=\"removeChip(chip)\">\n {{chip.label}}\n <mat-icon\n matChipRemove\n *ngIf=\"config.areChipsRemovable\">\n cancel\n </mat-icon>\n </mat-chip>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n (keydown.tab)=\"handleTab($event)\"\n role=\"textbox\"\n type=\"text\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput/>\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n </mat-chip-list>\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"this.config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"mapToLabel\">\n\n <mat-option\n *ngFor=\"let option of remainingOptions$ | async\"\n [value]=\"option\">\n\n <img\n *ngIf=\"option[config.imageUrlParam]\"\n [src]=\"option[config.imageUrlParam]\"\n style=\"vertical-align:middle;\"\n aria-hidden\n height=\"25\"/>\n {{ option.label }}\n </mat-option>\n </mat-autocomplete>\n\n\n </mat-form-field>\n</crispr-field-container>\n",
846
+ template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n\n <mat-chip-list\n #chipList>\n <mat-chip\n class=\"refinement-chip\"\n *ngFor=\"let chip of controlValue$ | async\"\n [selectable]=\"config.chipsSelectable\"\n [removable]=\"config.areChipsRemovable\"\n (removed)=\"removeChip(chip)\">\n <span *ngIf=\"chip.imageUrl as imageUrl\" class=\"image-container\">\n <img [src]=\"imageUrl\" alt=\"image of {{chip.label}}\">\n </span>\n {{chip.label}}\n <mat-icon\n matChipRemove\n *ngIf=\"config.areChipsRemovable\">\n cancel\n </mat-icon>\n </mat-chip>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n (keydown.tab)=\"handleTab($event)\"\n [matChipInputSeparatorKeyCodes]=\"config.separatorKeyCodes\"\n (matChipInputTokenEnd)=\"handleTokenEnd($event)\"\n role=\"searchbox\"\n type=\"text\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput/>\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n </mat-chip-list>\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"this.config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"mapToLabel\">\n <ng-container *ngIf=\"remainingOptions$ | async as remainingOptions; else emptyOption\">\n <ng-container *ngIf=\"remainingOptions.length > 0; else emptyOption\">\n <mat-option\n *ngFor=\"let option of remainingOptions$ | async\"\n [value]=\"option\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n </ng-container>\n\n </ng-container>\n <ng-template #emptyOption>\n <mat-option disabled=\"true\">\n {{config.emptyOptionsMessage}}\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n\n </mat-form-field>\n</crispr-field-container>\n",
844
847
  changeDetection: core.ChangeDetectionStrategy.OnPush,
845
- styles: [""]
848
+ styles: [".refinement-chip .image-container{width:26px;height:26px;border-radius:50%;overflow:hidden;margin:-2px 4px -2px -8px}.refinement-chip .image-container img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}"]
846
849
  },] }
847
850
  ];
848
851
  AutocompleteChiplistFieldComponent.propDecorators = {
@@ -1299,7 +1302,7 @@
1299
1302
  OptionComponent.decorators = [
1300
1303
  { type: core.Component, args: [{
1301
1304
  selector: 'crispr-option',
1302
- template: "<img\n *ngIf=\"option.imageUrl\"\n [src]=\"option.imageUrl\"\n style=\"vertical-align:middle;\"\n aria-hidden\n height=\"25\"/>\n{{ option.label }}\n",
1305
+ template: "<img\n *ngIf=\"option.imageUrl\"\n [src]=\"option.imageUrl\"\n alt=\"image of {{option.label}}\"\n style=\"vertical-align:middle;\"\n aria-hidden\n height=\"25\"/>\n{{ option.label }}\n",
1303
1306
  changeDetection: core.ChangeDetectionStrategy.OnPush,
1304
1307
  styles: [""]
1305
1308
  },] }
@@ -1496,9 +1499,9 @@
1496
1499
  FormGroupListComponent.decorators = [
1497
1500
  { type: core.Component, args: [{
1498
1501
  selector: 'crispr-form-group-list',
1499
- template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- TODO: add sortBy function -->\n <div *ngFor=\"let control of formArray?.controls; let i = index;\">\n <!-- TODO: use content projection to allow custom item label component -->\n <span class=\"mat-h3\" *ngIf=\"config.itemLabelBuilder\"> {{ config.itemLabelBuilder(i) }} </span>\n <button\n mat-icon-button\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"deleteGroup(i)\">delete</mat-icon>\n </button>\n <div\n [formGroupName]=\"i\">\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [config]=\"field\"\n [value]=\"value[i] | initialControlValue : field\"\n [group]=\"control\">\n </ng-container>\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n mat-raised-button\n (click)=\"addGroup()\">\n {{config.addItemLabel}}\n </button>\n\n</crispr-field-container>\n",
1502
+ template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- TODO: add sortBy function -->\n <div *ngFor=\"let control of formArray?.controls; let i = index;\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\" *ngIf=\"config.itemLabelBuilder\"> {{ config.itemLabelBuilder(i) }} </span>\n <button\n mat-icon-button\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"deleteGroup(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroupName]=\"i\">\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [config]=\"field\"\n [value]=\"value[i] | initialControlValue : field\"\n [group]=\"control\">\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"addGroup()\">\n {{config.addItemLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n",
1500
1503
  changeDetection: core.ChangeDetectionStrategy.OnPush,
1501
- styles: [""]
1504
+ styles: [".item-header{display:flex;justify-content:space-between}.group-footer{display:flex;justify-content:flex-end}.group-footer button.add{margin-bottom:16px}"]
1502
1505
  },] }
1503
1506
  ];
1504
1507
 
@@ -1680,6 +1683,7 @@
1680
1683
  exports.filterOptionsByLabel = filterOptionsByLabel;
1681
1684
  exports.isControlConfig = isControlConfig;
1682
1685
  exports.observablifyOptions = observablifyOptions;
1686
+ exports.ɵ0 = ɵ0;
1683
1687
  exports.ɵa = MaterialModule;
1684
1688
  exports.ɵb = FieldContainerComponent;
1685
1689
  exports.ɵc = InputFieldComponent;