@tekus/design-system 5.0.0 → 5.0.2

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 (59) hide show
  1. package/components/button/src/button.component.d.ts +2 -2
  2. package/fesm2022/tekus-design-system-components-button.mjs +5 -5
  3. package/fesm2022/tekus-design-system-components-button.mjs.map +1 -1
  4. package/fesm2022/tekus-design-system-components-fallback-view.mjs +2 -2
  5. package/fesm2022/tekus-design-system-components-fallback-view.mjs.map +1 -1
  6. package/fesm2022/tekus-design-system-components-typography.mjs +2 -2
  7. package/fesm2022/tekus-design-system-components-typography.mjs.map +1 -1
  8. package/fesm2022/tekus-design-system-core-types.mjs +4 -0
  9. package/fesm2022/tekus-design-system-core-types.mjs.map +1 -1
  10. package/fesm2022/tekus-design-system-core.mjs +4 -0
  11. package/fesm2022/tekus-design-system-core.mjs.map +1 -1
  12. package/package.json +21 -49
  13. package/tokens/colors/_colors.scss +84 -85
  14. package/tokens/index.scss +0 -1
  15. package/components/dropdown-list/index.d.ts +0 -5
  16. package/components/dropdown-list/public-api.d.ts +0 -1
  17. package/components/dropdown-list/src/dropdown-list.component.d.ts +0 -113
  18. package/components/forms/form-autocomplete-field/index.d.ts +0 -5
  19. package/components/forms/form-autocomplete-field/public-api.d.ts +0 -1
  20. package/components/forms/form-autocomplete-field/src/form-autocomplete-field.component.d.ts +0 -173
  21. package/components/forms/form-chips-autocomplete-field/index.d.ts +0 -5
  22. package/components/forms/form-chips-autocomplete-field/public-api.d.ts +0 -1
  23. package/components/forms/form-chips-autocomplete-field/src/form-chips-autocomplete-field.component.d.ts +0 -124
  24. package/components/forms/form-input-field/index.d.ts +0 -5
  25. package/components/forms/form-input-field/public-api.d.ts +0 -1
  26. package/components/forms/form-input-field/src/form-input-field.component.d.ts +0 -137
  27. package/components/forms/index.d.ts +0 -5
  28. package/components/forms/public-api.d.ts +0 -3
  29. package/components/search-bar/index.d.ts +0 -5
  30. package/components/search-bar/public-api.d.ts +0 -1
  31. package/components/search-bar/src/search-bar.component.d.ts +0 -25
  32. package/fesm2022/tekus-design-system-components-dropdown-list.mjs +0 -147
  33. package/fesm2022/tekus-design-system-components-dropdown-list.mjs.map +0 -1
  34. package/fesm2022/tekus-design-system-components-forms-form-autocomplete-field.mjs +0 -268
  35. package/fesm2022/tekus-design-system-components-forms-form-autocomplete-field.mjs.map +0 -1
  36. package/fesm2022/tekus-design-system-components-forms-form-chips-autocomplete-field.mjs +0 -193
  37. package/fesm2022/tekus-design-system-components-forms-form-chips-autocomplete-field.mjs.map +0 -1
  38. package/fesm2022/tekus-design-system-components-forms-form-input-field.mjs +0 -212
  39. package/fesm2022/tekus-design-system-components-forms-form-input-field.mjs.map +0 -1
  40. package/fesm2022/tekus-design-system-components-forms.mjs +0 -640
  41. package/fesm2022/tekus-design-system-components-forms.mjs.map +0 -1
  42. package/fesm2022/tekus-design-system-components-search-bar.mjs +0 -56
  43. package/fesm2022/tekus-design-system-components-search-bar.mjs.map +0 -1
  44. package/fesm2022/tekus-design-system-services-design-tokens.mjs +0 -47
  45. package/fesm2022/tekus-design-system-services-design-tokens.mjs.map +0 -1
  46. package/fesm2022/tekus-design-system-services-typography.mjs +0 -91
  47. package/fesm2022/tekus-design-system-services-typography.mjs.map +0 -1
  48. package/services/design-tokens/index.d.ts +0 -5
  49. package/services/design-tokens/public-api.d.ts +0 -1
  50. package/services/design-tokens/src/design-tokens.service.d.ts +0 -10
  51. package/services/typography/index.d.ts +0 -5
  52. package/services/typography/public-api.d.ts +0 -1
  53. package/services/typography/src/typography.service.d.ts +0 -8
  54. package/tokens/typography/_typography.scss +0 -6
  55. package/tokens/typography/font-size/_font-size.scss +0 -16
  56. package/tokens/typography/font-weight/_font-weight.scss +0 -14
  57. package/tokens/typography/letter-spacing/_letter-spacing.scss +0 -12
  58. package/tokens/typography/line-height/_line-height.scss +0 -16
  59. package/tokens/typography/variants/_variants.scss +0 -211
@@ -1 +0,0 @@
1
- {"version":3,"file":"tekus-design-system-components-dropdown-list.mjs","sources":["../../../projects/design-system/components/dropdown-list/src/dropdown-list.component.ts","../../../projects/design-system/components/dropdown-list/src/dropdown-list.component.html","../../../projects/design-system/components/dropdown-list/tekus-design-system-components-dropdown-list.ts"],"sourcesContent":["import {\n faXmark,\n faCheck,\n faCaretUp,\n faCaretDown,\n} from '@fortawesome/pro-solid-svg-icons';\nimport { FormsModule } from '@angular/forms';\nimport { NgClass, NgFor, NgIf, NgStyle } from '@angular/common';\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\nimport { DropdownListItem } from '@tekus/design-system/core/types';\nimport { Input, Output, OnInit, Component, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'tk-dropdown-list',\n standalone: true,\n imports: [NgStyle, NgClass, NgFor, NgIf, FormsModule, FontAwesomeModule],\n templateUrl: './dropdown-list.component.html',\n styleUrls: ['./dropdown-list.component.scss'],\n})\nexport class DropdownListComponent implements OnInit {\n /**\n * Search field input value\n * @ignore\n */\n public inputValue = '';\n\n /**\n * Selected value\n * @ignore\n */\n public selectedValue = { Value: '', ViewValue: '' };\n\n /**\n * Filtered data\n * @ignore\n */\n public filteredData!: DropdownListItem<string>[];\n\n /**\n * Is dropdown list visible\n * @ignore\n */\n public isDropDownListVisible = false;\n\n /**\n * Icon\n * @ignore\n */\n public readonly faXmark = faXmark;\n /**\n * Icon\n * @ignore\n */\n public readonly faCheck = faCheck;\n /**\n * Icon\n * @ignore\n */\n public readonly faCaretUp = faCaretUp;\n /**\n * Icon\n * @ignore\n */\n public readonly faCaretDown = faCaretDown;\n\n /**\n * Data for dropdown list\n */\n @Input() data!: DropdownListItem<string>[];\n\n /**\n * Dropdown list hint label\n * @default ''\n */\n @Input()\n hintLabel = '';\n\n /**\n * Dropdown list search field placeholder\n * @default ''\n */\n @Input()\n searchFieldPlaceHolder = '';\n\n /**\n * Width of the dropdown list\n * @default 13rem\n */\n @Input()\n width?: string;\n\n /**\n * What background color to use\n * @default #fff\n */\n @Input()\n backgroundColor?: string;\n\n /**\n * Selected value changes handler\n */\n @Output()\n selectedValueChange = new EventEmitter<string>();\n\n /**\n * @ignore\n * Component lifecycle method\n */\n ngOnInit(): void {\n this.loadData();\n }\n\n /**\n * @ignore\n * Component method to load data\n */\n private loadData(): void {\n if (this.data && this.data.length > 0) {\n this.filteredData = this.data.slice();\n } else {\n this.filteredData = [];\n }\n }\n\n /**\n * @ignore\n * Component method to handle click on dropdown list\n */\n public onClickDropDownList(): void {\n this.isDropDownListVisible = !this.isDropDownListVisible;\n }\n\n /**\n * @ignore\n * Component method to handle click on clear selected value\n */\n public onClickClearSelectedValue(): void {\n this.selectedValue.Value = '';\n this.selectedValue.ViewValue = '';\n this.selectedValueChange.emit(this.selectedValue.Value);\n }\n\n /**\n * @ignore\n * Component method to handle click on clear input value\n */\n public onClickClearInputValue(): void {\n this.inputValue = '';\n this.filter();\n }\n\n /**\n * @ignore\n * Component method to handle click on dropdown list item\n */\n public onClickListItem(item: DropdownListItem<string | number>): void {\n this.selectedValue.Value = String(item.Value);\n this.selectedValue.ViewValue = item.ViewValue;\n this.selectedValueChange.emit(String(item.Value));\n }\n\n /**\n * @ignore\n * Component method to filter data\n */\n public filter(): void {\n const filterValue = this.inputValue.toLowerCase();\n this.filteredData = this.data.filter(option =>\n String(option.ViewValue).toLowerCase().trim().includes(filterValue)\n );\n }\n}\n","<div class=\"dropdown__list\">\n <div\n class=\"dropdown__list__selected__item__field\"\n [ngStyle]=\"{ 'background-color': backgroundColor, width: width }\">\n <label [attr.aria-label]=\"selectedValue.ViewValue\" for=\"selectedValue\">\n <input\n class=\"dropdown__list__selected__item\"\n type=\"text\"\n readonly=\"true\"\n id=\"selectedValue\"\n name=\"selectedValue\"\n [value]=\"\n selectedValue.ViewValue ? selectedValue.ViewValue : hintLabel\n \" />\n </label>\n <fa-icon\n class=\"dropdown__list__clear__mark__icon\"\n [icon]=\"faXmark\"\n *ngIf=\"selectedValue.ViewValue !== ''\"\n (click)=\"onClickClearSelectedValue()\"></fa-icon>\n <fa-icon\n class=\"dropdown__list__caret__icon\"\n [icon]=\"isDropDownListVisible ? faCaretUp : faCaretDown\"\n (click)=\"onClickDropDownList()\"></fa-icon>\n </div>\n <div\n [class]=\"\n isDropDownListVisible\n ? 'dropdown__list__collapsible--open dropdown__list__collapsible'\n : 'dropdown__list__collapsible'\n \"\n [ngStyle]=\"{ 'background-color': backgroundColor, width: width }\">\n <div class=\"dropdown__list__search__field\">\n <input\n class=\"dropdown__list__search__field__input\"\n type=\"text\"\n (input)=\"filter()\"\n (focus)=\"filter()\"\n [(ngModel)]=\"inputValue\"\n [placeholder]=\"searchFieldPlaceHolder\" />\n <fa-icon\n class=\"dropdown__list__clear__mark__icon\"\n [icon]=\"faXmark\"\n *ngIf=\"inputValue !== ''\"\n (click)=\"onClickClearInputValue()\"></fa-icon>\n </div>\n <ul class=\"dropdown__list__items\">\n <li\n [ngClass]=\"\n filteredValue.ViewValue === selectedValue.ViewValue\n ? 'dropdown__list__item dropdown__list__item--selected'\n : 'dropdown__list__item'\n \"\n tabindex=\"0\"\n (click)=\"onClickListItem(filteredValue)\"\n *ngFor=\"let filteredValue of filteredData\"\n (keydown.enter)=\"onClickListItem(filteredValue)\">\n {{ filteredValue.ViewValue }}\n <fa-icon\n class=\"dropdown__list__item__checked__icon\"\n [icon]=\"faCheck\"\n *ngIf=\"filteredValue.ViewValue === selectedValue.ViewValue\"></fa-icon>\n </li>\n </ul>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;MAmBa,qBAAqB,CAAA;AAPlC,IAAA,WAAA,GAAA;AAQE;;;AAGG;QACI,IAAU,CAAA,UAAA,GAAG,EAAE;AAEtB;;;AAGG;QACI,IAAa,CAAA,aAAA,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;AAQnD;;;AAGG;QACI,IAAqB,CAAA,qBAAA,GAAG,KAAK;AAEpC;;;AAGG;QACa,IAAO,CAAA,OAAA,GAAG,OAAO;AACjC;;;AAGG;QACa,IAAO,CAAA,OAAA,GAAG,OAAO;AACjC;;;AAGG;QACa,IAAS,CAAA,SAAA,GAAG,SAAS;AACrC;;;AAGG;QACa,IAAW,CAAA,WAAA,GAAG,WAAW;AAOzC;;;AAGG;QAEH,IAAS,CAAA,SAAA,GAAG,EAAE;AAEd;;;AAGG;QAEH,IAAsB,CAAA,sBAAA,GAAG,EAAE;AAgB3B;;AAEG;AAEH,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU;AAqEjD;AAnEC;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,EAAE;;AAGjB;;;AAGG;IACK,QAAQ,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACrC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;;aAChC;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;;;AAI1B;;;AAGG;IACI,mBAAmB,GAAA;AACxB,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,qBAAqB;;AAG1D;;;AAGG;IACI,yBAAyB,GAAA;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;;AAGzD;;;AAGG;IACI,sBAAsB,GAAA;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACpB,IAAI,CAAC,MAAM,EAAE;;AAGf;;;AAGG;AACI,IAAA,eAAe,CAAC,IAAwC,EAAA;QAC7D,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AAC7C,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;AAGnD;;;AAGG;IACI,MAAM,GAAA;QACX,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AACjD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpE;;+GAtJQ,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,ECnBlC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,61EAkEA,EDnDY,MAAA,EAAA,CAAA,unEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,EAAE,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,EAAE,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,KAAK,EAAE,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAI,EAAE,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,8mBAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI5D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAChB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,61EAAA,EAAA,MAAA,EAAA,CAAA,unEAAA,CAAA,EAAA;8BAqD/D,IAAI,EAAA,CAAA;sBAAZ;gBAOD,SAAS,EAAA,CAAA;sBADR;gBAQD,sBAAsB,EAAA,CAAA;sBADrB;gBAQD,KAAK,EAAA,CAAA;sBADJ;gBAQD,eAAe,EAAA,CAAA;sBADd;gBAOD,mBAAmB,EAAA,CAAA;sBADlB;;;AErGH;;AAEG;;;;"}
@@ -1,268 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, ViewChild, Output, Input, Component } from '@angular/core';
3
- import { MatFormFieldModule } from '@angular/material/form-field';
4
- import * as i3 from '@angular/material/autocomplete';
5
- import { MatAutocompleteModule } from '@angular/material/autocomplete';
6
- import { NgStyle, AsyncPipe } from '@angular/common';
7
- import * as i2 from '@angular/material/input';
8
- import { MatInputModule } from '@angular/material/input';
9
- import { Subscription, startWith, map } from 'rxjs';
10
- import * as i1 from '@angular/forms';
11
- import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
12
-
13
- class FormAutocompleteFieldComponent {
14
- constructor() {
15
- /**
16
- * Input field control
17
- * @ignore
18
- */
19
- this.formControl = new FormControl('');
20
- /**
21
- * What color palette to use
22
- * @default 'accent'
23
- */
24
- this.theme = 'accent';
25
- /**
26
- * Form field appearance
27
- * @default 'fill'
28
- */
29
- this.appearance = 'fill';
30
- /**
31
- * Form field reserved space for one line by default.
32
- * @default 'dynamic'
33
- */
34
- this.subscriptSizing = 'dynamic';
35
- /**
36
- * Whether the first option should be highlighted when the autocomplete panel is opened
37
- * @default true
38
- */
39
- this.autoActiveFirstOption = true;
40
- /**
41
- * Whether the active option should be selected as the user is navigating.
42
- * @default true
43
- */
44
- this.autoSelectActiveOption = true;
45
- /**
46
- * Optional field input type
47
- * @default 'text'
48
- */
49
- this.type = 'text';
50
- /**
51
- * Whether the field is required
52
- * @default true
53
- */
54
- this.required = true;
55
- /**
56
- * Input field label
57
- */
58
- this.fieldLabel = '';
59
- /**
60
- * Input field placeholder
61
- * @default ''
62
- */
63
- this.placeHolder = '';
64
- /**
65
- * Options to be displayed
66
- * @ignore
67
- */
68
- this.options = [];
69
- /**
70
- * Option changes handler
71
- */
72
- this.optionSelected = new EventEmitter();
73
- /**
74
- * Input field changes handler
75
- */
76
- this.inputStatus = new EventEmitter();
77
- /**
78
- * Autocomplete bottom reached handler
79
- */
80
- this.bottomReached = new EventEmitter();
81
- /**
82
- * Subscriptions property to handle all subscriptions
83
- * @ignore
84
- */
85
- this.subscriptions = new Subscription();
86
- }
87
- /**
88
- * Component lifecycle method
89
- * @ignore
90
- */
91
- ngOnInit() {
92
- this.updateFilteredOptions();
93
- }
94
- /**
95
- * Component lifecycle method
96
- * @ignore
97
- */
98
- ngAfterViewInit() {
99
- this.initAutocompleteListener();
100
- }
101
- /**
102
- * Component lifecycle method
103
- * @ignore
104
- */
105
- ngOnChanges(changes) {
106
- if (changes) {
107
- this.updateFilteredOptions();
108
- }
109
- }
110
- /**
111
- * Handles options updates
112
- * @ignore
113
- */
114
- updateFilteredOptions() {
115
- this.filteredOptions = this.formControl.valueChanges.pipe(startWith(''), map(value => {
116
- const option = typeof value === 'string' ? value : value?.ViewValue;
117
- return option
118
- ? this._filterOptions(option)
119
- : (this.options ?? []).slice();
120
- }));
121
- }
122
- /**
123
- * Starts the autocomplete subscriptions
124
- * @ignore
125
- */
126
- initAutocompleteListener() {
127
- const openedSubscription = this.onAutocompleteOpened();
128
- const closedSubscription = this.onAutocompleteClosed();
129
- this.subscriptions.add(openedSubscription);
130
- this.subscriptions.add(closedSubscription);
131
- }
132
- /**
133
- * Handles the autocomplete opened event
134
- * @ignore
135
- */
136
- onAutocompleteOpened() {
137
- return this.matAutocomplete.opened.subscribe(() => {
138
- setTimeout(() => {
139
- const panel = this.matAutocomplete.panel?.nativeElement;
140
- if (panel) {
141
- panel.addEventListener('scroll', this.onScroll.bind(this));
142
- }
143
- });
144
- });
145
- }
146
- /**
147
- * Handles the autocomplete closed event
148
- * @ignore
149
- */
150
- onAutocompleteClosed() {
151
- return this.matAutocomplete.closed.subscribe(() => {
152
- const panel = this.matAutocomplete.panel?.nativeElement;
153
- if (panel) {
154
- panel.removeEventListener('scroll', this.onScroll.bind(this));
155
- }
156
- });
157
- }
158
- /**
159
- * Handles the scrolling event
160
- * @ignore
161
- */
162
- onScroll(event) {
163
- const panel = event.target;
164
- const scrollTop = panel.scrollTop;
165
- const scrollHeight = panel.scrollHeight;
166
- const offsetHeight = panel.offsetHeight;
167
- if (scrollTop + offsetHeight >= scrollHeight) {
168
- this.onScrolledToEnd();
169
- }
170
- }
171
- /**
172
- * Emits the bottomReached when the user reaches the end of the autocomplete panel
173
- * @ignore
174
- */
175
- onScrolledToEnd() {
176
- this.bottomReached.emit();
177
- }
178
- /**
179
- * Conditions the options' view to display the view value
180
- * @ignore
181
- */
182
- displayFn(option) {
183
- return option?.ViewValue ? option.ViewValue : '';
184
- }
185
- /**
186
- * Filters the options according to the input value
187
- * @ignore
188
- */
189
- _filterOptions(value) {
190
- const filterValue = value.toLowerCase();
191
- return this.options.filter(option => option.ViewValue.toLowerCase().includes(filterValue));
192
- }
193
- /**
194
- * Emits the selected option every time it changes
195
- * @ignore
196
- */
197
- onSelectionChanged(option) {
198
- this.optionSelected.emit(option.Value);
199
- }
200
- /**
201
- * Emits the formControl variable every time the input value changes
202
- * @ignore
203
- */
204
- onInputChanged() {
205
- this.inputStatus.emit(this.formControl);
206
- }
207
- /**
208
- * Unsubscribe from all subscriptions when the component is destroyed
209
- * @ignore
210
- */
211
- ngOnDestroy() {
212
- this.subscriptions?.unsubscribe();
213
- }
214
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: FormAutocompleteFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
215
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: FormAutocompleteFieldComponent, isStandalone: true, selector: "tk-form-autocomplete-field", inputs: { fieldWidth: "fieldWidth", theme: "theme", appearance: "appearance", subscriptSizing: "subscriptSizing", autoActiveFirstOption: "autoActiveFirstOption", autoSelectActiveOption: "autoSelectActiveOption", type: "type", required: "required", fieldTitle: "fieldTitle", fieldLabel: "fieldLabel", placeHolder: "placeHolder", options: "options" }, outputs: { optionSelected: "optionSelected", inputStatus: "inputStatus", bottomReached: "bottomReached" }, viewQueries: [{ propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n aria-label=\"Option\"\n [required]=\"required\"\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChanged()\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\" />\n <mat-autocomplete\n requireSelection\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [autoActiveFirstOption]=\"autoActiveFirstOption\"\n [autoSelectActiveOption]=\"autoSelectActiveOption\"\n (optionSelected)=\"onSelectionChanged($event.option.value)\">\n @for (option of filteredOptions | async; track option.Value) {\n <mat-option [value]=\"option\">\n <span>{{ option.ViewValue }}</span>\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".section{gap:.5rem;display:flex;flex-wrap:wrap;max-width:100%;align-items:center;justify-content:flex-start}.form__field{flex:1;height:100%;width:20rem;display:flex;max-width:100%;min-width:10rem;font-size:clamp(.8rem,.657rem + .381vw,1rem)}.form__field__label{font-weight:400;font-style:normal;line-height:.98438em;font-size:clamp(.688rem,.554rem + .357vw,.875rem)}.field__title{margin:0;padding:0;max-width:100%;font-weight:500;overflow:hidden;font-style:normal;align-self:center;white-space:nowrap;text-overflow:ellipsis;font-size:clamp(.9rem,.852rem + .276vw,1.1rem)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }] }); }
216
- }
217
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: FormAutocompleteFieldComponent, decorators: [{
218
- type: Component,
219
- args: [{ selector: 'tk-form-autocomplete-field', standalone: true, imports: [
220
- NgStyle,
221
- AsyncPipe,
222
- FormsModule,
223
- MatInputModule,
224
- MatFormFieldModule,
225
- ReactiveFormsModule,
226
- MatAutocompleteModule,
227
- ], template: "<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n aria-label=\"Option\"\n [required]=\"required\"\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChanged()\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\" />\n <mat-autocomplete\n requireSelection\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [autoActiveFirstOption]=\"autoActiveFirstOption\"\n [autoSelectActiveOption]=\"autoSelectActiveOption\"\n (optionSelected)=\"onSelectionChanged($event.option.value)\">\n @for (option of filteredOptions | async; track option.Value) {\n <mat-option [value]=\"option\">\n <span>{{ option.ViewValue }}</span>\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".section{gap:.5rem;display:flex;flex-wrap:wrap;max-width:100%;align-items:center;justify-content:flex-start}.form__field{flex:1;height:100%;width:20rem;display:flex;max-width:100%;min-width:10rem;font-size:clamp(.8rem,.657rem + .381vw,1rem)}.form__field__label{font-weight:400;font-style:normal;line-height:.98438em;font-size:clamp(.688rem,.554rem + .357vw,.875rem)}.field__title{margin:0;padding:0;max-width:100%;font-weight:500;overflow:hidden;font-style:normal;align-self:center;white-space:nowrap;text-overflow:ellipsis;font-size:clamp(.9rem,.852rem + .276vw,1.1rem)}\n"] }]
228
- }], propDecorators: { fieldWidth: [{
229
- type: Input
230
- }], theme: [{
231
- type: Input
232
- }], appearance: [{
233
- type: Input
234
- }], subscriptSizing: [{
235
- type: Input
236
- }], autoActiveFirstOption: [{
237
- type: Input
238
- }], autoSelectActiveOption: [{
239
- type: Input
240
- }], type: [{
241
- type: Input
242
- }], required: [{
243
- type: Input
244
- }], fieldTitle: [{
245
- type: Input
246
- }], fieldLabel: [{
247
- type: Input
248
- }], placeHolder: [{
249
- type: Input
250
- }], options: [{
251
- type: Input
252
- }], optionSelected: [{
253
- type: Output
254
- }], inputStatus: [{
255
- type: Output
256
- }], bottomReached: [{
257
- type: Output
258
- }], matAutocomplete: [{
259
- type: ViewChild,
260
- args: ['auto']
261
- }] } });
262
-
263
- /**
264
- * Generated bundle index. Do not edit.
265
- */
266
-
267
- export { FormAutocompleteFieldComponent };
268
- //# sourceMappingURL=tekus-design-system-components-forms-form-autocomplete-field.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tekus-design-system-components-forms-form-autocomplete-field.mjs","sources":["../../../projects/design-system/components/forms/form-autocomplete-field/src/form-autocomplete-field.component.ts","../../../projects/design-system/components/forms/form-autocomplete-field/src/form-autocomplete-field.component.html","../../../projects/design-system/components/forms/form-autocomplete-field/tekus-design-system-components-forms-form-autocomplete-field.ts"],"sourcesContent":["import {\n Input,\n Output,\n OnInit,\n Component,\n ViewChild,\n OnDestroy,\n OnChanges,\n EventEmitter,\n AfterViewInit,\n SimpleChanges,\n} from '@angular/core';\nimport {\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport {\n MatAutocomplete,\n MatAutocompleteModule,\n} from '@angular/material/autocomplete';\nimport { Option } from '@tekus/design-system/core/types'\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { map, Observable, startWith, Subscription } from 'rxjs';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'tk-form-autocomplete-field',\n standalone: true,\n imports: [\n NgStyle,\n AsyncPipe,\n FormsModule,\n MatInputModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n ],\n templateUrl: './form-autocomplete-field.component.html',\n styleUrl: './form-autocomplete-field.component.scss',\n})\nexport class FormAutocompleteFieldComponent\n implements OnInit, OnDestroy, AfterViewInit, OnChanges\n{\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl<string | Option>('');\n\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Whether the first option should be highlighted when the autocomplete panel is opened\n * @default true\n */\n @Input()\n public autoActiveFirstOption?: boolean = true;\n\n /**\n * Whether the active option should be selected as the user is navigating.\n * @default true\n */\n @Input()\n public autoSelectActiveOption?: boolean = true;\n\n /**\n * Optional field input type\n * @default 'text'\n */\n @Input()\n public type = 'text';\n\n /**\n * Whether the field is required\n * @default true\n */\n @Input()\n public required = true;\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Filtered options\n * @ignore\n */\n public filteredOptions!: Observable<Option[]>;\n\n /**\n * Options to be displayed\n * @ignore\n */\n @Input()\n public options: Option[] = [];\n\n /**\n * Option changes handler\n */\n @Output()\n public optionSelected = new EventEmitter<string | number>();\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * Autocomplete bottom reached handler\n */\n @Output()\n public bottomReached = new EventEmitter<void>();\n\n /**\n * Subscriptions property to handle all subscriptions\n * @ignore\n */\n private readonly subscriptions: Subscription = new Subscription();\n\n /**\n * Mat-autocomplete reference\n * @ignore\n */\n @ViewChild('auto') matAutocomplete!: MatAutocomplete;\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnInit(): void {\n this.updateFilteredOptions();\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngAfterViewInit(): void {\n this.initAutocompleteListener();\n }\n\n /**\n * Component lifecycle method\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes) {\n this.updateFilteredOptions();\n }\n }\n\n /**\n * Handles options updates\n * @ignore\n */\n private updateFilteredOptions(): void {\n this.filteredOptions = this.formControl.valueChanges.pipe(\n startWith(''),\n map(value => {\n const option = typeof value === 'string' ? value : value?.ViewValue;\n return option\n ? this._filterOptions(option)\n : (this.options ?? []).slice();\n })\n );\n }\n\n /**\n * Starts the autocomplete subscriptions\n * @ignore\n */\n public initAutocompleteListener(): void {\n const openedSubscription = this.onAutocompleteOpened();\n const closedSubscription = this.onAutocompleteClosed();\n\n this.subscriptions.add(openedSubscription);\n this.subscriptions.add(closedSubscription);\n }\n\n /**\n * Handles the autocomplete opened event\n * @ignore\n */\n private onAutocompleteOpened(): Subscription {\n return this.matAutocomplete.opened.subscribe(() => {\n setTimeout(() => {\n const panel = this.matAutocomplete.panel?.nativeElement;\n if (panel) {\n panel.addEventListener('scroll', this.onScroll.bind(this));\n }\n });\n });\n }\n\n /**\n * Handles the autocomplete closed event\n * @ignore\n */\n private onAutocompleteClosed(): Subscription {\n return this.matAutocomplete.closed.subscribe(() => {\n const panel = this.matAutocomplete.panel?.nativeElement;\n if (panel) {\n panel.removeEventListener('scroll', this.onScroll.bind(this));\n }\n });\n }\n\n /**\n * Handles the scrolling event\n * @ignore\n */\n private onScroll(event: Event) {\n const panel = event.target as HTMLElement;\n const scrollTop = panel.scrollTop;\n const scrollHeight = panel.scrollHeight;\n const offsetHeight = panel.offsetHeight;\n\n if (scrollTop + offsetHeight >= scrollHeight) {\n this.onScrolledToEnd();\n }\n }\n\n /**\n * Emits the bottomReached when the user reaches the end of the autocomplete panel\n * @ignore\n */\n private onScrolledToEnd(): void {\n this.bottomReached.emit();\n }\n\n /**\n * Conditions the options' view to display the view value\n * @ignore\n */\n public displayFn(option: Option | null): string {\n return option?.ViewValue ? option.ViewValue : '';\n }\n\n /**\n * Filters the options according to the input value\n * @ignore\n */\n private _filterOptions(value: string): Option[] {\n const filterValue = value.toLowerCase();\n\n return this.options.filter(option =>\n option.ViewValue.toLowerCase().includes(filterValue)\n );\n }\n\n /**\n * Emits the selected option every time it changes\n * @ignore\n */\n public onSelectionChanged(option: Option): void {\n this.optionSelected.emit(option.Value);\n }\n\n /**\n * Emits the formControl variable every time the input value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Unsubscribe from all subscriptions when the component is destroyed\n * @ignore\n */\n ngOnDestroy() {\n this.subscriptions?.unsubscribe();\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <input\n matInput\n [type]=\"type\"\n aria-label=\"Option\"\n [required]=\"required\"\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChanged()\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\" />\n <mat-autocomplete\n requireSelection\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\"\n [autoActiveFirstOption]=\"autoActiveFirstOption\"\n [autoSelectActiveOption]=\"autoSelectActiveOption\"\n (optionSelected)=\"onSelectionChanged($event.option.value)\">\n @for (option of filteredOptions | async; track option.Value) {\n <mat-option [value]=\"option\">\n <span>{{ option.ViewValue }}</span>\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,193 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, ViewChild, Input, Output, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import * as i4 from '@angular/material/form-field';
4
- import { MatFormFieldModule } from '@angular/material/form-field';
5
- import * as i5 from '@angular/material/autocomplete';
6
- import { MatAutocompleteModule } from '@angular/material/autocomplete';
7
- import { startWith, map } from 'rxjs';
8
- import { NgStyle, AsyncPipe } from '@angular/common';
9
- import { ENTER, COMMA } from '@angular/cdk/keycodes';
10
- import * as i2 from '@angular/material/icon';
11
- import { MatIconModule } from '@angular/material/icon';
12
- import * as i3 from '@angular/material/chips';
13
- import { MatChipsModule } from '@angular/material/chips';
14
- import { MatButtonModule } from '@angular/material/button';
15
- import * as i1 from '@angular/forms';
16
- import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
17
-
18
- class FormChipsAutocompleteFieldComponent {
19
- constructor() {
20
- /**
21
- * Input field label
22
- */
23
- this.fieldLabel = '';
24
- /**
25
- * Input field placeholder
26
- * @default ''
27
- */
28
- this.placeHolder = '';
29
- /**
30
- * What color palette to use
31
- * @default 'accent'
32
- */
33
- this.theme = 'accent';
34
- /**
35
- * Form field reserved space for one line by default.
36
- * @default 'dynamic'
37
- */
38
- this.subscriptSizing = 'dynamic';
39
- /**
40
- * Form field appearance
41
- * @default 'fill'
42
- */
43
- this.appearance = 'fill';
44
- /**
45
- * Input field control
46
- * @ignore
47
- */
48
- this.formControl = new FormControl('');
49
- /**
50
- * Selected keywords
51
- * @ignore
52
- */
53
- this.keywords = [];
54
- /**
55
- * Input field changes handler
56
- */
57
- this.inputStatus = new EventEmitter();
58
- /**
59
- * Keywords changes handler
60
- */
61
- this.selectedKeywords = new EventEmitter();
62
- /**
63
- * Separator constants
64
- * @ignore
65
- */
66
- this.separatorKeysCodes = [ENTER, COMMA];
67
- /**
68
- * Options to be displayed
69
- * @ignore
70
- */
71
- this.allKeywords = [];
72
- }
73
- /**
74
- * @ignore
75
- * Lifecycle method
76
- */
77
- ngOnInit() {
78
- this.updateFilteredKeywords();
79
- }
80
- /**
81
- * @ignore
82
- * Lifecycle method
83
- */
84
- ngOnChanges(changes) {
85
- if (changes['allKeywords']) {
86
- this.updateFilteredKeywords();
87
- }
88
- }
89
- /**
90
- * Updates the filtered keywords when allKeywords changes
91
- * @ignore
92
- */
93
- updateFilteredKeywords() {
94
- this.filteredKeywords = this.formControl.valueChanges.pipe(startWith(null), map((keyword) => keyword
95
- ? this._filter(String(keyword))
96
- : (this.allKeywords ?? []).slice()));
97
- }
98
- /**
99
- * Handles every keyword deletion
100
- * @ignore
101
- */
102
- remove(keyword) {
103
- const index = this.keywords.indexOf(keyword);
104
- if (index >= 0) {
105
- this.keywords.splice(index, 1);
106
- this.onKeywordsChanged();
107
- }
108
- }
109
- /**
110
- * Emits the formControl variable every time the field value changes
111
- * @ignore
112
- */
113
- onInputChanged() {
114
- this.inputStatus.emit(this.formControl);
115
- }
116
- /**
117
- * Emits the selected keywords every time they changed
118
- * @ignore
119
- */
120
- onKeywordsChanged() {
121
- this.selectedKeywords.emit(this.keywords.map(keyword => keyword.Value));
122
- }
123
- /**
124
- * Handles the autocomplete selection
125
- * @ignore
126
- */
127
- selected(event) {
128
- const value = event.option.value;
129
- const selectedKeyword = this.allKeywords.find(option => option.Value === value);
130
- if (selectedKeyword &&
131
- !this.keywords.some(keyword => keyword.Value === selectedKeyword.Value)) {
132
- this.keywords.push(selectedKeyword);
133
- this.onKeywordsChanged();
134
- }
135
- this.keywordInput.nativeElement.value = '';
136
- this.formControl.setValue(null);
137
- }
138
- /**
139
- * Filters the keywords based on the input
140
- * @ignore
141
- */
142
- _filter(value) {
143
- this.onInputChanged();
144
- const filterValue = value.toLowerCase();
145
- return this.allKeywords.filter(keyword => keyword.ViewValue.toLowerCase().includes(filterValue));
146
- }
147
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: FormChipsAutocompleteFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
148
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: FormChipsAutocompleteFieldComponent, isStandalone: true, selector: "tk-form-chips-autocomplete-field", inputs: { fieldLabel: "fieldLabel", placeHolder: "placeHolder", fieldTitle: "fieldTitle", theme: "theme", subscriptSizing: "subscriptSizing", fieldWidth: "fieldWidth", appearance: "appearance", allKeywords: "allKeywords" }, outputs: { inputStatus: "inputStatus", selectedKeywords: "selectedKeywords" }, viewQueries: [{ propertyName: "keywordInput", first: true, predicate: ["keywordInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Keyword selection\">\n @for (keyword of keywords; track keyword.Value) {\n <mat-chip-row (removed)=\"remove(keyword)\">\n {{ keyword.ViewValue }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + keyword.ViewValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #keywordInput\n [matAutocomplete]=\"auto\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selected($event)\">\n @for (keyword of filteredKeywords | async; track keyword.Value) {\n <mat-option [value]=\"keyword.Value\">{{ keyword.ViewValue }}</mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".section{gap:.5rem;display:flex;flex-wrap:wrap;max-width:100%;align-items:center;justify-content:flex-start}.form__field{flex:1;height:100%;width:20rem;display:flex;max-width:100%;min-width:10rem;font-size:clamp(.8rem,.657rem + .381vw,1rem)}.form__field__label{font-weight:400;font-style:normal;line-height:.98438em;font-size:clamp(.688rem,.554rem + .357vw,.875rem)}.field__title{margin:0;padding:0;max-width:100%;font-weight:500;overflow:hidden;font-style:normal;align-self:center;white-space:nowrap;text-overflow:ellipsis;font-size:clamp(.9rem,.852rem + .276vw,1.1rem)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i3.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i3.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i3.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i3.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
149
- }
150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: FormChipsAutocompleteFieldComponent, decorators: [{
151
- type: Component,
152
- args: [{ selector: 'tk-form-chips-autocomplete-field', standalone: true, imports: [
153
- NgStyle,
154
- AsyncPipe,
155
- FormsModule,
156
- MatIconModule,
157
- MatChipsModule,
158
- MatButtonModule,
159
- MatFormFieldModule,
160
- ReactiveFormsModule,
161
- MatAutocompleteModule,
162
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Keyword selection\">\n @for (keyword of keywords; track keyword.Value) {\n <mat-chip-row (removed)=\"remove(keyword)\">\n {{ keyword.ViewValue }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + keyword.ViewValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #keywordInput\n [matAutocomplete]=\"auto\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selected($event)\">\n @for (keyword of filteredKeywords | async; track keyword.Value) {\n <mat-option [value]=\"keyword.Value\">{{ keyword.ViewValue }}</mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".section{gap:.5rem;display:flex;flex-wrap:wrap;max-width:100%;align-items:center;justify-content:flex-start}.form__field{flex:1;height:100%;width:20rem;display:flex;max-width:100%;min-width:10rem;font-size:clamp(.8rem,.657rem + .381vw,1rem)}.form__field__label{font-weight:400;font-style:normal;line-height:.98438em;font-size:clamp(.688rem,.554rem + .357vw,.875rem)}.field__title{margin:0;padding:0;max-width:100%;font-weight:500;overflow:hidden;font-style:normal;align-self:center;white-space:nowrap;text-overflow:ellipsis;font-size:clamp(.9rem,.852rem + .276vw,1.1rem)}\n"] }]
163
- }], propDecorators: { fieldLabel: [{
164
- type: Input
165
- }], placeHolder: [{
166
- type: Input
167
- }], fieldTitle: [{
168
- type: Input
169
- }], theme: [{
170
- type: Input
171
- }], subscriptSizing: [{
172
- type: Input
173
- }], fieldWidth: [{
174
- type: Input
175
- }], appearance: [{
176
- type: Input
177
- }], inputStatus: [{
178
- type: Output
179
- }], selectedKeywords: [{
180
- type: Output
181
- }], allKeywords: [{
182
- type: Input
183
- }], keywordInput: [{
184
- type: ViewChild,
185
- args: ['keywordInput']
186
- }] } });
187
-
188
- /**
189
- * Generated bundle index. Do not edit.
190
- */
191
-
192
- export { FormChipsAutocompleteFieldComponent };
193
- //# sourceMappingURL=tekus-design-system-components-forms-form-chips-autocomplete-field.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tekus-design-system-components-forms-form-chips-autocomplete-field.mjs","sources":["../../../projects/design-system/components/forms/form-chips-autocomplete-field/src/form-chips-autocomplete-field.component.ts","../../../projects/design-system/components/forms/form-chips-autocomplete-field/src/form-chips-autocomplete-field.component.html","../../../projects/design-system/components/forms/form-chips-autocomplete-field/tekus-design-system-components-forms-form-chips-autocomplete-field.ts"],"sourcesContent":["import {\n Input,\n Output,\n OnInit,\n Component,\n ViewChild,\n OnChanges,\n ElementRef,\n EventEmitter,\n SimpleChanges,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n SubscriptSizing,\n MatFormFieldModule,\n MatFormFieldAppearance,\n} from '@angular/material/form-field';\nimport {\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n} from '@angular/material/autocomplete';\nimport { Option } from '@tekus/design-system/core/types';\nimport { map, Observable, startWith } from 'rxjs';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'tk-form-chips-autocomplete-field',\n standalone: true,\n imports: [\n NgStyle,\n AsyncPipe,\n FormsModule,\n MatIconModule,\n MatChipsModule,\n MatButtonModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-chips-autocomplete-field.component.html',\n styleUrl: './form-chips-autocomplete-field.component.scss',\n})\nexport class FormChipsAutocompleteFieldComponent\n implements OnInit, OnChanges\n{\n /**\n * Input field label\n */\n @Input()\n public fieldLabel = '';\n\n /**\n * Input field placeholder\n * @default ''\n */\n @Input()\n public placeHolder = '';\n\n /**\n * Optional input field title\n * @default null\n */\n @Input()\n public fieldTitle?: string;\n\n /**\n * What color palette to use\n * @default 'accent'\n */\n @Input()\n public theme?: ThemePalette = 'accent';\n\n /**\n * Form field reserved space for one line by default.\n * @default 'dynamic'\n */\n @Input()\n public subscriptSizing: SubscriptSizing = 'dynamic';\n\n /**\n * Optional input field width\n * @default 100%\n */\n @Input()\n public fieldWidth?: string;\n\n /**\n * Form field appearance\n * @default 'fill'\n */\n @Input()\n public appearance: MatFormFieldAppearance = 'fill';\n\n /**\n * Input field control\n * @ignore\n */\n public formControl = new FormControl('');\n\n /**\n * Selected keywords\n * @ignore\n */\n public keywords: Option[] = [];\n\n /**\n * Input field changes handler\n */\n @Output()\n public inputStatus = new EventEmitter<FormControl>();\n\n /**\n * Keywords changes handler\n */\n @Output()\n public selectedKeywords = new EventEmitter<(string | number)[]>();\n\n /**\n * Separator constants\n * @ignore\n */\n public readonly separatorKeysCodes: number[] = [ENTER, COMMA];\n\n /**\n * Options to be displayed\n * @ignore\n */\n @Input()\n public allKeywords: Option[] = [];\n\n /**\n * Filtered keywords after the input field changes\n * @ignore\n */\n public filteredKeywords: Observable<Option[]> | undefined;\n\n /**\n * Keyword Input element reference\n * @ignore\n */\n @ViewChild('keywordInput') keywordInput!: ElementRef<HTMLInputElement>;\n\n /**\n * @ignore\n * Lifecycle method\n */\n ngOnInit(): void {\n this.updateFilteredKeywords();\n }\n\n /**\n * @ignore\n * Lifecycle method\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['allKeywords']) {\n this.updateFilteredKeywords();\n }\n }\n\n /**\n * Updates the filtered keywords when allKeywords changes\n * @ignore\n */\n private updateFilteredKeywords(): void {\n this.filteredKeywords = this.formControl.valueChanges.pipe(\n startWith(null),\n map((keyword: string | null) =>\n keyword\n ? this._filter(String(keyword))\n : (this.allKeywords ?? []).slice()\n )\n );\n }\n\n /**\n * Handles every keyword deletion\n * @ignore\n */\n public remove(keyword: Option): void {\n const index = this.keywords.indexOf(keyword);\n\n if (index >= 0) {\n this.keywords.splice(index, 1);\n this.onKeywordsChanged();\n }\n }\n\n /**\n * Emits the formControl variable every time the field value changes\n * @ignore\n */\n public onInputChanged(): void {\n this.inputStatus.emit(this.formControl);\n }\n\n /**\n * Emits the selected keywords every time they changed\n * @ignore\n */\n public onKeywordsChanged(): void {\n this.selectedKeywords.emit(this.keywords.map(keyword => keyword.Value));\n }\n\n /**\n * Handles the autocomplete selection\n * @ignore\n */\n public selected(event: MatAutocompleteSelectedEvent): void {\n const value = event.option.value;\n const selectedKeyword = this.allKeywords.find(\n option => option.Value === value\n );\n\n if (\n selectedKeyword &&\n !this.keywords.some(keyword => keyword.Value === selectedKeyword.Value)\n ) {\n this.keywords.push(selectedKeyword);\n this.onKeywordsChanged();\n }\n\n this.keywordInput.nativeElement.value = '';\n this.formControl.setValue(null);\n }\n\n /**\n * Filters the keywords based on the input\n * @ignore\n */\n private _filter(value: string): Option[] {\n this.onInputChanged();\n const filterValue = value.toLowerCase();\n\n return this.allKeywords.filter(keyword =>\n keyword.ViewValue.toLowerCase().includes(filterValue)\n );\n }\n}\n","<div class=\"section\" [ngStyle]=\"{ width: fieldWidth ? 'fit-content' : '100%' }\">\n @if (fieldTitle) {\n <h1 class=\"field__title\">{{ fieldTitle }}</h1>\n }\n <mat-form-field\n class=\"form__field\"\n [color]=\"theme\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [ngStyle]=\"{ width: fieldWidth ? fieldWidth : '100%' }\">\n <mat-label class=\"form__field__label\">{{ fieldLabel }}</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Keyword selection\">\n @for (keyword of keywords; track keyword.Value) {\n <mat-chip-row (removed)=\"remove(keyword)\">\n {{ keyword.ViewValue }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + keyword.ViewValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #keywordInput\n [matAutocomplete]=\"auto\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeHolder\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\" />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selected($event)\">\n @for (keyword of filteredKeywords | async; track keyword.Value) {\n <mat-option [value]=\"keyword.Value\">{{ keyword.ViewValue }}</mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}