@js-smart/ng-kit 18.0.0

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 (72) hide show
  1. package/README.md +297 -0
  2. package/esm2022/js-smart-ng-kit.mjs +5 -0
  3. package/esm2022/lib/components/alert/alert.component.mjs +95 -0
  4. package/esm2022/lib/components/autocomplete/autocomplete.component.mjs +172 -0
  5. package/esm2022/lib/components/buttons/base-button/base-button.component.mjs +72 -0
  6. package/esm2022/lib/components/buttons/bs-link-button/bs-link-button.component.mjs +52 -0
  7. package/esm2022/lib/components/buttons/delete-button/delete-button.component.mjs +62 -0
  8. package/esm2022/lib/components/buttons/edit-bs-button/edit-bs-button.component.mjs +55 -0
  9. package/esm2022/lib/components/buttons/edit-button/edit-button.component.mjs +49 -0
  10. package/esm2022/lib/components/buttons/edit-svg-icon-button/edit-svg-icon-button.component.mjs +51 -0
  11. package/esm2022/lib/components/buttons/excel-export-button/excel-export-button.component.mjs +14 -0
  12. package/esm2022/lib/components/buttons/manage-button/manage-button.component.mjs +49 -0
  13. package/esm2022/lib/components/buttons/pdf-export-button/pdf-export-button.component.mjs +13 -0
  14. package/esm2022/lib/components/buttons/primary-button/primary-button.component.mjs +61 -0
  15. package/esm2022/lib/components/buttons/save-primary-button/save-primary-button.component.mjs +60 -0
  16. package/esm2022/lib/components/buttons/search-button/search-button.component.mjs +52 -0
  17. package/esm2022/lib/components/buttons/success-button/success-button.component.mjs +65 -0
  18. package/esm2022/lib/components/buttons/view-button/view-button.component.mjs +41 -0
  19. package/esm2022/lib/components/buttons/view-primary-button/view-primary-button.component.mjs +49 -0
  20. package/esm2022/lib/components/confirm-dialog/confirm-dialog.component.mjs +63 -0
  21. package/esm2022/lib/components/ngx-spinner/ngx-spinner.component.mjs +195 -0
  22. package/esm2022/lib/components/ngx-spinner/ngx-spinner.enum.mjs +16 -0
  23. package/esm2022/lib/components/ngx-spinner/ngx-spinner.service.mjs +71 -0
  24. package/esm2022/lib/components/ngx-spinner/safe-html.pipe.mjs +24 -0
  25. package/esm2022/lib/components/snack-bar/error-snack-bar/error-snack-bar.component.mjs +50 -0
  26. package/esm2022/lib/components/snack-bar/success-snack-bar/success-snack-bar.component.mjs +50 -0
  27. package/esm2022/lib/components/spinner/spinner.component.mjs +31 -0
  28. package/esm2022/lib/directives/ngx-print.directive.mjs +255 -0
  29. package/esm2022/lib/directives/prevent-multiple-clicks.directive.mjs +44 -0
  30. package/esm2022/lib/pipes/type-of.pipe.mjs +17 -0
  31. package/esm2022/lib/services/mat-snack-bar.service.mjs +82 -0
  32. package/esm2022/lib/svg-icons/edit-solid-svg/edit-solid-svg.component.mjs +22 -0
  33. package/esm2022/lib/types/progress-state.mjs +2 -0
  34. package/esm2022/lib/util/progress-util.mjs +80 -0
  35. package/esm2022/public-api.mjs +33 -0
  36. package/fesm2022/js-smart-ng-kit.mjs +1872 -0
  37. package/fesm2022/js-smart-ng-kit.mjs.map +1 -0
  38. package/index.d.ts +5 -0
  39. package/lib/components/alert/alert.component.d.ts +73 -0
  40. package/lib/components/autocomplete/autocomplete.component.d.ts +115 -0
  41. package/lib/components/buttons/base-button/base-button.component.d.ts +63 -0
  42. package/lib/components/buttons/bs-link-button/bs-link-button.component.d.ts +10 -0
  43. package/lib/components/buttons/delete-button/delete-button.component.d.ts +11 -0
  44. package/lib/components/buttons/edit-bs-button/edit-bs-button.component.d.ts +9 -0
  45. package/lib/components/buttons/edit-button/edit-button.component.d.ts +10 -0
  46. package/lib/components/buttons/edit-svg-icon-button/edit-svg-icon-button.component.d.ts +10 -0
  47. package/lib/components/buttons/excel-export-button/excel-export-button.component.d.ts +5 -0
  48. package/lib/components/buttons/manage-button/manage-button.component.d.ts +10 -0
  49. package/lib/components/buttons/pdf-export-button/pdf-export-button.component.d.ts +5 -0
  50. package/lib/components/buttons/primary-button/primary-button.component.d.ts +12 -0
  51. package/lib/components/buttons/save-primary-button/save-primary-button.component.d.ts +11 -0
  52. package/lib/components/buttons/search-button/search-button.component.d.ts +11 -0
  53. package/lib/components/buttons/success-button/success-button.component.d.ts +11 -0
  54. package/lib/components/buttons/view-button/view-button.component.d.ts +9 -0
  55. package/lib/components/buttons/view-primary-button/view-primary-button.component.d.ts +10 -0
  56. package/lib/components/confirm-dialog/confirm-dialog.component.d.ts +20 -0
  57. package/lib/components/ngx-spinner/ngx-spinner.component.d.ts +109 -0
  58. package/lib/components/ngx-spinner/ngx-spinner.enum.d.ts +37 -0
  59. package/lib/components/ngx-spinner/ngx-spinner.service.d.ts +34 -0
  60. package/lib/components/ngx-spinner/safe-html.pipe.d.ts +10 -0
  61. package/lib/components/snack-bar/error-snack-bar/error-snack-bar.component.d.ts +22 -0
  62. package/lib/components/snack-bar/success-snack-bar/success-snack-bar.component.d.ts +22 -0
  63. package/lib/components/spinner/spinner.component.d.ts +22 -0
  64. package/lib/directives/ngx-print.directive.d.ts +157 -0
  65. package/lib/directives/prevent-multiple-clicks.directive.d.ts +21 -0
  66. package/lib/pipes/type-of.pipe.d.ts +7 -0
  67. package/lib/services/mat-snack-bar.service.d.ts +61 -0
  68. package/lib/svg-icons/edit-solid-svg/edit-solid-svg.component.d.ts +8 -0
  69. package/lib/types/progress-state.d.ts +7 -0
  70. package/lib/util/progress-util.d.ts +45 -0
  71. package/package.json +47 -0
  72. package/public-api.d.ts +25 -0
package/README.md ADDED
@@ -0,0 +1,297 @@
1
+ # NGX Smart utilities
2
+ Reusable Angular components built with Angular Material and Bootstrap 5.x, Utility classes/functions for Date, Form and String operations
3
+
4
+ <p align="center">
5
+
6
+ [![CI](https://github.com/ng-kit/ng-kit/actions/workflows/build.yml/badge.svg)](https://github.com/ng-kit/ng-kit/actions/workflows/build.yml)
7
+ <a href="https://www.npmjs.com/@js-smart/ng-kit">
8
+ <img src="https://img.shields.io/npm/v/@js-smart/ng-kit" alt="Ngx Cookie Service on npm" />
9
+ </a>
10
+ </p>
11
+
12
+ ### Installation
13
+ Install the library
14
+ ```shell
15
+ npm install @js-smart/ng-kit
16
+ ```
17
+ and use it as shown below in each section
18
+
19
+
20
+ ### Technologies
21
+ 1. Angular 17+
22
+ 2. Bootstrap 5+ (if applicable)
23
+
24
+ ## Auto Complete
25
+ Reusable Auto Complete that extends Mat Auto Complete component
26
+ ### Demo
27
+ https://main--js-smart-ng-kit.netlify.app/autocomplete-demo
28
+ ### Usage
29
+
30
+ The library has one `autocomplete` component. To use the Auto Complete component, add the following code to the HTML page
31
+
32
+ **app.component.html**
33
+
34
+ ```typescript
35
+ <!-- Auto Complete with Objects -->
36
+
37
+ <form [formGroup]="genericFormGroup">
38
+ <autocomplete
39
+ [data]="cities"
40
+ [inputFormGroup]="genericFormGroup"
41
+ [required]="true"
42
+ [displayWith]="displayFn"
43
+ bindLabel="location"
44
+ bindValue="id"
45
+ label="City"
46
+ placeHolder="Select City">
47
+ </autocomplete>
48
+ </form>
49
+
50
+ ```
51
+
52
+ **app.component.ts**
53
+
54
+ Then define form group instances and object array (cities) and names (for string array)
55
+
56
+ ```typescript
57
+ // Define objects
58
+ cities = [{id: 1001, location: 'New York'}, {id: 1002, location: 'Boston'}, {id: 1001, location: 'Washington DC'}];
59
+
60
+ // Define Form Groups
61
+ inputFormGroup = this.fb.group({
62
+ autocomplete: ['']
63
+ })
64
+
65
+ //Display function
66
+ displayFn(object: any): string {
67
+ if (typeof object === "string") return object;
68
+ return object && object["location"] ? object["location"] : "";
69
+ }
70
+ ```
71
+
72
+ If you are using strings rather than objects, do not provide `bindLabel`, `bindValue` and `displayWith` inputs. See below sample
73
+ ```
74
+ <!-- Auto Complete with Strings -->
75
+ <form [formGroup]="inputFormGroup">
76
+ <autocomplete
77
+ [data]="names"
78
+ [inputFormGroup]="inputFormGroup"
79
+ [required]="true"
80
+ label="City"
81
+ placeHolder="Select City">
82
+ </autocomplete>
83
+ </form>
84
+ ```
85
+
86
+
87
+ ### Auto Complete API
88
+
89
+ #### List of selectors that can be used to select the component(s)
90
+
91
+ | AutoComplete Selector |
92
+ | ----------- |
93
+ | autocomplete, lib-autocomplete |
94
+
95
+
96
+ #### Properties
97
+
98
+ | Property | Description | Type | Default Value |
99
+ | ----------- | ----------- |----------- |----------- |
100
+ | inputFormGroup | Input Form Group |FormGroup||
101
+ | label | Label of the AutoComplete|string||
102
+ | placeHolder | PlaceHolder of the AutoComplete|string||
103
+ | appearance | Appearance of the AutoComplete, defaults to `fill` |string|fill|
104
+ | classes | List of CSS classes that need to applied to autocomplete|string||
105
+ | bindLabel | Applies only to AutoComplete with Objects. Attribute of the Object whose value would be shown when searching for data |string|id|
106
+ | bindValue | Applies only to AutoComplete with Objects. Attribute of the Object whose value would be used for search. Defaults to `ID` |string|id|
107
+ | displayWith | Applies only to AutoComplete with Objects. A function used to show display value in Input |boolean|false|
108
+ | required | Provide `true` if AutoComplete is required, otherwise provide `false` |boolean|false|
109
+ | data | List of Objects or String values that need to be bind and searched for |any[] or string[]|false|
110
+
111
+
112
+ ## Alert
113
+ Reusable alert component created with Bootstrap 5+ and Angular 17+
114
+ ### Auto Complete API
115
+ #### List of selectors that can be used to select the component
116
+
117
+ | Selector |
118
+ | ----------- |
119
+ | alert,lib-alert |
120
+
121
+
122
+ #### Properties
123
+
124
+ | Property | Description | Type | Default Value |
125
+ | ----------- | ----------- |----------- |----------- |
126
+ | dismissible | If set, displays an inline "Close" button |boolean|false|
127
+ | dismissOnTimeout | If set, dismisses the alert after Dismiss Timeout|boolean|true|
128
+ | dismissTimeout | Number in milliseconds, after which alert will be closed|string or number|5000|
129
+ | isOpen | Is alert visible |boolean|false|
130
+ | type | Alert type. Provides one of four bootstrap supported contextual classes: success, info, warning and danger|string|info|
131
+
132
+ ## Spinner
133
+ Reusable Spinner component created with Bootstrap 5.x and Angular 17.x
134
+
135
+ ### Demo
136
+ https://main--js-smart-ng-kit.netlify.app/alert-demo
137
+ ### API
138
+ #### List of selectors that can be used to select the component
139
+
140
+ | Selector |
141
+ | ----------- |
142
+ | spinner,lib-spinner |
143
+
144
+
145
+ #### Properties
146
+
147
+ | Property | Description | Type | Default Value |
148
+ | ----------- | ----------- |----------- |----------- |
149
+ | bootstrapSpinner | Use Boostrap Spinner. Default `true` |boolean|false|
150
+ | diameter | Diameter of the Angular Material spinner|boolean|true|
151
+ | color | Color of the Angular Material spinner|string or `ThemePalette`|5000|
152
+ | strokeWidth | Stroke Width of the Angular Material spinner|boolean|false|
153
+
154
+ ## Print
155
+ Angular (2++) directive that prints HTML section
156
+ ### Usage
157
+ Import the main module `NgxPrintModule` :
158
+
159
+ ```js
160
+ import {NgxPrintModule} from '@js-smart/print';
161
+
162
+ @NgModule({
163
+ ...
164
+ imports:
165
+ [NgxPrintModule, ...],
166
+ ...
167
+ })
168
+
169
+ export class YourAppModule {
170
+ }
171
+ ```
172
+
173
+ **3-** Then plug n' play with it:
174
+
175
+ - Assuming you want to print the following HTML section:
176
+
177
+ ```html
178
+
179
+ <div>
180
+ <!--Your html stuff that you want to print-->
181
+ </div>
182
+ <button>print</button> <!--Your relevant print button-->
183
+
184
+ ```
185
+
186
+ - Now, what you have to do is tagging your *wanted-to-print* section by an `id` attribute, then link that `id` to a
187
+ directive parameter in your button :
188
+
189
+ ```html
190
+ <!--
191
+ 1)- Add an ID here
192
+ -->
193
+ <div id="print-section">
194
+ <!--Your html stuff that you want to print-->
195
+ </div>
196
+
197
+ <!--
198
+ 2)- Add the directive name in your button (ngxPrint),
199
+ 3)- Affect your ID to printSectionId
200
+ -->
201
+ <button printSectionId="print-section" ngxPrint>print</button>
202
+
203
+ ```
204
+
205
+ ### Optional properties
206
+
207
+ - You want a customized title for your printing window ? you have the choice by adding a new attribute to your print
208
+ button `printTitle`:
209
+
210
+ ```html
211
+
212
+ <div id="print-section">
213
+
214
+ <!-- ... -->
215
+
216
+ </div>
217
+
218
+ <button
219
+ printTitle="MyTitle"
220
+ printSectionId="print-section"
221
+ ngxPrint>print
222
+ </button>
223
+
224
+ ```
225
+
226
+ - Also, would you like to customize the printing window style sheet (CSS) ? Hence you can do so by adding infinite
227
+ styles to another attribute called `printStyle`:
228
+
229
+ ```html
230
+
231
+ <div id="print-section">
232
+
233
+ <!-- ... -->
234
+
235
+ </div>
236
+
237
+ <button
238
+ [printStyle]="{h1 : {'color': 'red'}, h2 : {'border': 'solid 1px'}}"
239
+ printSectionId="print-section"
240
+ ngxPrint>print
241
+ </button>
242
+
243
+ ```
244
+
245
+ Here some simple styles were added to every `h1` & `h2` tags within the `div` where `print-section` is tagged to
246
+ its `id` attribute.
247
+
248
+ - If you would like to use your existing CSS with media print you can add the `useExistingCss` attribute:
249
+
250
+ ```html
251
+
252
+ <div id="print-section">
253
+
254
+ <!-- ... -->
255
+
256
+ </div>
257
+
258
+ <button
259
+ [useExistingCss]="true"
260
+ printSectionId="print-section"
261
+ ngxPrint>print
262
+ </button>
263
+
264
+ ```
265
+
266
+ - If you want to customize the printing window style sheet (CSS) by importing the css provided in assets/css
267
+ use `styleSheetFile`:
268
+
269
+ ```html
270
+
271
+ <div id="print-section">
272
+
273
+ <!-- ... -->
274
+
275
+ </div>
276
+
277
+ <button
278
+ styleSheetFile="assets/css/custom1.css,assets/css/custom2.css"
279
+ printSectionId="print-section"
280
+ ngxPrint>print
281
+ </button>
282
+
283
+ ```
284
+ ### Publish library to NPM
285
+ 1. Build the library
286
+ ```shell
287
+ nx build ng-kit
288
+ ```
289
+ 2. If the NPM token is not configured, open `~/.npmrc` and add the following line:
290
+ ```shell
291
+ //registry.npmjs.org/:_authToken=<your npm token>
292
+ ```
293
+ 3. Then navigate to `dist` directory anf publish the library to NPM. If prompted, enter the 2fa auth code from the Authenticator app.
294
+ ```shell
295
+ cd dist/libs/ng-kit && npm publish --tag latest
296
+ ```
297
+ For beta releases use tag `--tag beta`
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtc21hcnQtbmcta2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmcta2l0L3NyYy9qcy1zbWFydC1uZy1raXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,95 @@
1
+ import { Component, input, signal } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Boostrap Alert component that can be used to alert messages to the user
6
+ *
7
+ * @author Pavan Kumar Jadda
8
+ * @since 12.0.0
9
+ */
10
+ export class AlertComponent {
11
+ constructor(cdr) {
12
+ this.cdr = cdr;
13
+ /**
14
+ * Type of the BootStrap Alert. Following values are supported. See BootStrap docs for more information
15
+ * <pre>
16
+ * 1. info
17
+ * 2. primary
18
+ * 3. secondary
19
+ * 4. success
20
+ * 5. warning
21
+ * 6. danger
22
+ * 7. dark
23
+ * 8. light
24
+ * </pre>
25
+ */
26
+ this.type = input('info');
27
+ /**
28
+ * Is alert visible or open
29
+ */
30
+ this.isOpen = input(true);
31
+ /**
32
+ * Writable signal for isOpen
33
+ */
34
+ this.open = signal(this.isOpen());
35
+ /**
36
+ * If set, displays an inline “Close” button
37
+ */
38
+ this.dismissible = input(true);
39
+ /**
40
+ * If set, dismisses the alert after Dismiss Timeout
41
+ */
42
+ this.dismissOnTimeout = input(true);
43
+ /**
44
+ * Number in milliseconds, after which alert will be closed. Default value is 5000 ms
45
+ */
46
+ this.dismissTimeout = input(5000);
47
+ /**
48
+ * Additional classes to be added to the alert. This can be used to add custom styles to the alert
49
+ */
50
+ this.class = input('');
51
+ }
52
+ /**
53
+ * Initialize the component and settings
54
+ *
55
+ * @author Pavan Kumar Jadda
56
+ * @since 12.0.0
57
+ */
58
+ ngOnInit() {
59
+ this.openAlert();
60
+ if (this.dismissOnTimeout()) {
61
+ setTimeout(() => {
62
+ this.closeAlert();
63
+ this.cdr.markForCheck();
64
+ }, this.dismissTimeout());
65
+ }
66
+ }
67
+ /**
68
+ * Closes BootStrap Alert if not open
69
+ *
70
+ * @author Pavan Kumar Jadda
71
+ * @since 12.0.0
72
+ */
73
+ closeAlert() {
74
+ if (!this.isOpen()) {
75
+ return;
76
+ }
77
+ this.open.set(false);
78
+ }
79
+ /**
80
+ * Opens Bootstrap Alert
81
+ *
82
+ * @author Pavan Kumar Jadda
83
+ * @since 12.0.0
84
+ */
85
+ openAlert() {
86
+ this.open.set(true);
87
+ }
88
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: AlertComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
89
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: AlertComponent, isStandalone: true, selector: "lib-alert, alert", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, dismissOnTimeout: { classPropertyName: "dismissOnTimeout", publicName: "dismissOnTimeout", isSignal: true, isRequired: false, transformFunction: null }, dismissTimeout: { classPropertyName: "dismissTimeout", publicName: "dismissTimeout", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (open()) {\n\t<div class=\"row {{ class() }}\">\n\t\t<div class=\"col-xs-12 col-sm-12 col-md-auto mx-auto\">\n\t\t\t<div class=\"alert alert-{{ type() }} alert-dismissible alert_div\" role=\"alert\">\n\t\t\t\t<ng-content></ng-content>\n\t\t\t\t@if (dismissible()) {\n\t\t\t\t\t<button (click)=\"closeAlert()\" aria-label=\"Close\" class=\"btn-close\" data-bs-dismiss=\"alert\" type=\"button\"></button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n}\n", styles: [".alert_div{display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: AlertComponent, decorators: [{
92
+ type: Component,
93
+ args: [{ selector: 'lib-alert, alert', standalone: true, imports: [CommonModule], template: "@if (open()) {\n\t<div class=\"row {{ class() }}\">\n\t\t<div class=\"col-xs-12 col-sm-12 col-md-auto mx-auto\">\n\t\t\t<div class=\"alert alert-{{ type() }} alert-dismissible alert_div\" role=\"alert\">\n\t\t\t\t<ng-content></ng-content>\n\t\t\t\t@if (dismissible()) {\n\t\t\t\t\t<button (click)=\"closeAlert()\" aria-label=\"Close\" class=\"btn-close\" data-bs-dismiss=\"alert\" type=\"button\"></button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n}\n", styles: [".alert_div{display:flex;align-items:center;justify-content:center}\n"] }]
94
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2l0L3NyYy9saWIvY29tcG9uZW50cy9hbGVydC9hbGVydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raXQvc3JjL2xpYi9jb21wb25lbnRzL2FsZXJ0L2FsZXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUUvQzs7Ozs7R0FLRztBQVFILE1BQU0sT0FBTyxjQUFjO0lBOEMxQixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTdDMUM7Ozs7Ozs7Ozs7OztXQVlHO1FBQ0gsU0FBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyQjs7V0FFRztRQUNILFdBQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckI7O1dBRUc7UUFDSCxTQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTdCOztXQUVHO1FBQ0gsZ0JBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUI7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0I7O1dBRUc7UUFDSCxtQkFBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3Qjs7V0FFRztRQUNILFVBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFMkIsQ0FBQztJQUU5Qzs7Ozs7T0FLRztJQUNILFFBQVE7UUFDUCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1lBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pCLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1IsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFNBQVM7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsQ0FBQzs4R0F0RlcsY0FBYztrR0FBZCxjQUFjLHMzQkNoQjNCLDRjQVlBLDZIREFXLFlBQVk7OzJGQUlWLGNBQWM7a0JBUDFCLFNBQVM7K0JBQ0Msa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uSW5pdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBCb29zdHJhcCBBbGVydCBjb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBhbGVydCBtZXNzYWdlcyB0byB0aGUgdXNlclxuICpcbiAqIEBhdXRob3IgUGF2YW4gS3VtYXIgSmFkZGFcbiAqIEBzaW5jZSAxMi4wLjBcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbGliLWFsZXJ0LCBhbGVydCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuXHR0ZW1wbGF0ZVVybDogJy4vYWxlcnQuY29tcG9uZW50Lmh0bWwnLFxuXHRzdHlsZVVybHM6IFsnLi9hbGVydC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBbGVydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cdC8qKlxuXHQgKiBUeXBlIG9mIHRoZSBCb290U3RyYXAgQWxlcnQuIEZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4gU2VlIEJvb3RTdHJhcCBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uXG5cdCAqIDxwcmU+XG5cdCAqICAgMS4gaW5mb1xuXHQgKiAgIDIuIHByaW1hcnlcblx0ICogICAzLiBzZWNvbmRhcnlcblx0ICogICA0LiBzdWNjZXNzXG5cdCAqICAgNS4gd2FybmluZ1xuXHQgKiAgIDYuIGRhbmdlclxuXHQgKiAgIDcuIGRhcmtcblx0ICogICA4LiBsaWdodFxuXHQgKiA8L3ByZT5cblx0ICovXG5cdHR5cGUgPSBpbnB1dCgnaW5mbycpO1xuXG5cdC8qKlxuXHQgKiAgSXMgYWxlcnQgdmlzaWJsZSBvciBvcGVuXG5cdCAqL1xuXHRpc09wZW4gPSBpbnB1dCh0cnVlKTtcblxuXHQvKipcblx0ICogIFdyaXRhYmxlIHNpZ25hbCBmb3IgaXNPcGVuXG5cdCAqL1xuXHRvcGVuID0gc2lnbmFsKHRoaXMuaXNPcGVuKCkpO1xuXG5cdC8qKlxuXHQgKiBJZiBzZXQsIGRpc3BsYXlzIGFuIGlubGluZSDigJxDbG9zZeKAnSBidXR0b25cblx0ICovXG5cdGRpc21pc3NpYmxlID0gaW5wdXQodHJ1ZSk7XG5cblx0LyoqXG5cdCAqIElmIHNldCwgZGlzbWlzc2VzIHRoZSBhbGVydCBhZnRlciBEaXNtaXNzIFRpbWVvdXRcblx0ICovXG5cdGRpc21pc3NPblRpbWVvdXQgPSBpbnB1dCh0cnVlKTtcblxuXHQvKipcblx0ICogTnVtYmVyIGluIG1pbGxpc2Vjb25kcywgYWZ0ZXIgd2hpY2ggYWxlcnQgd2lsbCBiZSBjbG9zZWQuIERlZmF1bHQgdmFsdWUgaXMgNTAwMCBtc1xuXHQgKi9cblx0ZGlzbWlzc1RpbWVvdXQgPSBpbnB1dCg1MDAwKTtcblxuXHQvKipcblx0ICogQWRkaXRpb25hbCBjbGFzc2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBhbGVydC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgY3VzdG9tIHN0eWxlcyB0byB0aGUgYWxlcnRcblx0ICovXG5cdGNsYXNzID0gaW5wdXQoJycpO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGFuZCBzZXR0aW5nc1xuXHQgKlxuXHQgKiBAYXV0aG9yIFBhdmFuIEt1bWFyIEphZGRhXG5cdCAqIEBzaW5jZSAxMi4wLjBcblx0ICovXG5cdG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMub3BlbkFsZXJ0KCk7XG5cblx0XHRpZiAodGhpcy5kaXNtaXNzT25UaW1lb3V0KCkpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNsb3NlQWxlcnQoKTtcblx0XHRcdFx0dGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cdFx0XHR9LCB0aGlzLmRpc21pc3NUaW1lb3V0KCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgQm9vdFN0cmFwIEFsZXJ0IGlmIG5vdCBvcGVuXG5cdCAqXG5cdCAqIEBhdXRob3IgUGF2YW4gS3VtYXIgSmFkZGFcblx0ICogQHNpbmNlIDEyLjAuMFxuXHQgKi9cblx0Y2xvc2VBbGVydCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuaXNPcGVuKCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5vcGVuLnNldChmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogT3BlbnMgQm9vdHN0cmFwIEFsZXJ0XG5cdCAqXG5cdCAqIEBhdXRob3IgUGF2YW4gS3VtYXIgSmFkZGFcblx0ICogQHNpbmNlIDEyLjAuMFxuXHQgKi9cblx0cHJpdmF0ZSBvcGVuQWxlcnQoKTogdm9pZCB7XG5cdFx0dGhpcy5vcGVuLnNldCh0cnVlKTtcblx0fVxufVxuIiwiQGlmIChvcGVuKCkpIHtcblx0PGRpdiBjbGFzcz1cInJvdyB7eyBjbGFzcygpIH19XCI+XG5cdFx0PGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtc20tMTIgY29sLW1kLWF1dG8gbXgtYXV0b1wiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXt7IHR5cGUoKSB9fSBhbGVydC1kaXNtaXNzaWJsZSBhbGVydF9kaXZcIiByb2xlPVwiYWxlcnRcIj5cblx0XHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdFx0XHRAaWYgKGRpc21pc3NpYmxlKCkpIHtcblx0XHRcdFx0XHQ8YnV0dG9uIChjbGljayk9XCJjbG9zZUFsZXJ0KClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cImFsZXJ0XCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxuXHRcdFx0XHR9XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG59XG4iXX0=
@@ -0,0 +1,172 @@
1
+ import { Component, Input, input, Optional, output, ViewChild, } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { map, startWith } from 'rxjs/operators';
5
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
6
+ import { MatFormFieldModule } from '@angular/material/form-field';
7
+ import { MatInputModule } from '@angular/material/input';
8
+ import { TypeOfPipe } from '../../pipes/type-of.pipe';
9
+ import { MatButtonModule } from '@angular/material/button';
10
+ import { MatIconModule } from '@angular/material/icon';
11
+ import { AsyncPipe } from '@angular/common';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/forms";
14
+ import * as i2 from "@angular/material/form-field";
15
+ import * as i3 from "@angular/material/autocomplete";
16
+ import * as i4 from "@angular/material/core";
17
+ import * as i5 from "@angular/material/input";
18
+ import * as i6 from "@angular/material/button";
19
+ import * as i7 from "@angular/material/icon";
20
+ /**
21
+ * Reusable Auto Complete component that extends MatAutoComplete to show Clear icon and Arrow buttons
22
+ *
23
+ * @author Pavan Kumar Jadda
24
+ * @since 12.0.0
25
+ */
26
+ export class AutocompleteComponent {
27
+ constructor(cdRef) {
28
+ this.cdRef = cdRef;
29
+ /**
30
+ * Label of the AutoComplete
31
+ */
32
+ this.label = input('');
33
+ /**
34
+ * Placeholder of the AutoComplete
35
+ */
36
+ this.placeHolder = input('');
37
+ /**
38
+ * Appearance of the AutoComplete, defaults to `fill`
39
+ */
40
+ this.appearance = input('fill');
41
+ /**
42
+ * List of CSS classes that need to applied to autocomplete
43
+ */
44
+ this.classes = input('');
45
+ /**
46
+ * Attribute of the Object whose value would be shown when searching for data. Defaults to `ID`
47
+ */
48
+ this.bindLabel = input('');
49
+ /**
50
+ * Attribute of the Object whose value would be used for search
51
+ */
52
+ this.bindValue = input('id');
53
+ /**
54
+ * Function that maps an option's control value to its display value in the trigger.
55
+ */
56
+ this.displayWith = null;
57
+ /**
58
+ * Specifies if the autocomplete is required. Default is not required.
59
+ */
60
+ this.required = input(false);
61
+ /**
62
+ * List of Objects that need to be bind and searched for
63
+ */
64
+ this.data = input();
65
+ /**
66
+ * Emit selected value on selection changes
67
+ *
68
+ * @author Pavan Kumar Jadda
69
+ * @since 13.0.3
70
+ */
71
+ this.onSelectionChange = output();
72
+ /**
73
+ * BehaviorSubject that shows the current active arrow icon
74
+ */
75
+ this.arrowIconSubject = new BehaviorSubject('arrow_drop_down');
76
+ }
77
+ ngAfterContentChecked() {
78
+ this.cdRef.detectChanges();
79
+ }
80
+ /**
81
+ * Define autocomplete search filter on search text changes
82
+ *
83
+ * @author Pavan Kumar Jadda
84
+ * @since 12.0.0
85
+ */
86
+ ngOnInit() {
87
+ this.filteredOptions = this.inputFormGroup?.get('autocomplete')?.valueChanges.pipe(startWith(''), map((value) => (typeof value === 'string' ? value : value !== null ? value[this.bindLabel()] : '')), map((propertyName) => this.data()?.filter((option) => {
88
+ return typeof option === 'string'
89
+ ? option?.toLowerCase().indexOf(propertyName.toLowerCase()) === 0
90
+ : option[this.bindLabel()]?.toLowerCase().indexOf(propertyName.toLowerCase()) === 0;
91
+ }) ?? this.data()?.slice()));
92
+ }
93
+ ngOnChanges(_changes) {
94
+ this.displayFn = this.displayFn.bind(this);
95
+ }
96
+ /**
97
+ * Clear input and Reset autocomplete form control
98
+ *
99
+ * @author Pavan Kumar Jadda
100
+ * @since 12.0.0
101
+ */
102
+ clearInput(evt) {
103
+ evt.stopPropagation();
104
+ this.inputFormGroup.get('autocomplete')?.reset();
105
+ this.inputAutoComplete?.nativeElement.focus();
106
+ }
107
+ /**
108
+ * Open or Close panel
109
+ *
110
+ * @author Pavan Kumar Jadda
111
+ * @since 12.0.0
112
+ */
113
+ openOrClosePanel(evt, trigger) {
114
+ evt.stopPropagation();
115
+ if (trigger.panelOpen)
116
+ trigger.closePanel();
117
+ else
118
+ trigger.openPanel();
119
+ }
120
+ /**
121
+ * Display function that is used to show the values
122
+ *
123
+ * @author Pavan Kumar Jadda
124
+ * @since 12.0.0
125
+ */
126
+ displayFn(object) {
127
+ if (this.displayWith !== undefined && this.displayWith !== null && typeof this.displayWith === 'function') {
128
+ this.displayFn = this.displayWith.bind(this);
129
+ return this.displayWith(object);
130
+ }
131
+ else {
132
+ if (typeof object === 'string')
133
+ return object;
134
+ return object && object[this.bindLabel()] ? object[this.bindLabel()] : '';
135
+ }
136
+ }
137
+ /**
138
+ * Emit selected value
139
+ * @param $event - Event emitted by autocomplete
140
+ *
141
+ * @author Pavan Kumar Jadda
142
+ * @since 13.0.3
143
+ */
144
+ emitSelectedValue($event) {
145
+ this.onSelectionChange.emit($event.source.value);
146
+ }
147
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
148
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: AutocompleteComponent, isStandalone: true, selector: "autocomplete, lib-autocomplete", inputs: { inputFormGroup: { classPropertyName: "inputFormGroup", publicName: "inputFormGroup", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeHolder: { classPropertyName: "placeHolder", publicName: "placeHolder", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, classes: { classPropertyName: "classes", publicName: "classes", isSignal: true, isRequired: false, transformFunction: null }, bindLabel: { classPropertyName: "bindLabel", publicName: "bindLabel", isSignal: true, isRequired: false, transformFunction: null }, bindValue: { classPropertyName: "bindValue", publicName: "bindValue", isSignal: true, isRequired: false, transformFunction: null }, displayWith: { classPropertyName: "displayWith", publicName: "displayWith", isSignal: false, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelectionChange: "onSelectionChange" }, viewQueries: [{ propertyName: "inputAutoComplete", first: true, predicate: ["inputAutoComplete"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"inputFormGroup\">\n\t<mat-form-field appearance=\"fill\" class=\"{{ classes() }}\">\n\t\t<mat-label>{{ label() }}</mat-label>\n\t\t<input\n\t\t\t#inputAutoComplete\n\t\t\t#trigger=\"matAutocompleteTrigger\"\n\t\t\t[matAutocomplete]=\"auto\"\n\t\t\t[placeholder]=\"placeHolder()\"\n\t\t\t[required]=\"required()\"\n\t\t\tformControlName=\"autocomplete\"\n\t\t\tmatInput\n\t\t\ttype=\"text\" />\n\n\t\t<div matSuffix style=\"display: flex\">\n\t\t\t@if (!!inputFormGroup.get('autocomplete')?.value) {\n\t\t\t\t<button (click)=\"clearInput($event)\" aria-label=\"Clear\" mat-icon-button type=\"button\">\n\t\t\t\t\t<mat-icon>clear</mat-icon>\n\t\t\t\t</button>\n\t\t\t}\n\t\t\t<button (click)=\"openOrClosePanel($event, trigger)\" aria-label=\"Clear\" mat-icon-button type=\"button\">\n\t\t\t\t<mat-icon>{{ arrowIconSubject.getValue() }}</mat-icon>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<mat-autocomplete\n\t\t\t#auto=\"matAutocomplete\"\n\t\t\t(closed)=\"arrowIconSubject.next('arrow_drop_down')\"\n\t\t\t(opened)=\"arrowIconSubject.next('arrow_drop_up')\"\n\t\t\t(optionSelected)=\"arrowIconSubject.next('arrow_drop_down')\"\n\t\t\t[displayWith]=\"displayFn\">\n\t\t\t@for (option of filteredOptions | async; track option[bindValue()]) {\n\t\t\t\t<mat-option (onSelectionChange)=\"emitSelectedValue($event)\" [value]=\"option\">\n\t\t\t\t\t@if ((option | typeOf) === 'string') {\n\t\t\t\t\t\t<ng-container>{{ option }}</ng-container>\n\t\t\t\t\t} @else if ((option | typeOf) === 'object') {\n\t\t\t\t\t\t<ng-container>{{ option[bindLabel()] }}</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-option>\n\t\t\t}\n\t\t</mat-autocomplete>\n\t</mat-form-field>\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: TypeOfPipe, name: "typeOf" }, { kind: "ngmodule", type: MatFormFieldModule }, { 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: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: i4.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"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: AutocompleteComponent, decorators: [{
151
+ type: Component,
152
+ args: [{ selector: 'autocomplete, lib-autocomplete', standalone: true, imports: [
153
+ ReactiveFormsModule,
154
+ TypeOfPipe,
155
+ MatFormFieldModule,
156
+ MatAutocompleteModule,
157
+ MatInputModule,
158
+ MatButtonModule,
159
+ MatIconModule,
160
+ AsyncPipe,
161
+ ], template: "<div [formGroup]=\"inputFormGroup\">\n\t<mat-form-field appearance=\"fill\" class=\"{{ classes() }}\">\n\t\t<mat-label>{{ label() }}</mat-label>\n\t\t<input\n\t\t\t#inputAutoComplete\n\t\t\t#trigger=\"matAutocompleteTrigger\"\n\t\t\t[matAutocomplete]=\"auto\"\n\t\t\t[placeholder]=\"placeHolder()\"\n\t\t\t[required]=\"required()\"\n\t\t\tformControlName=\"autocomplete\"\n\t\t\tmatInput\n\t\t\ttype=\"text\" />\n\n\t\t<div matSuffix style=\"display: flex\">\n\t\t\t@if (!!inputFormGroup.get('autocomplete')?.value) {\n\t\t\t\t<button (click)=\"clearInput($event)\" aria-label=\"Clear\" mat-icon-button type=\"button\">\n\t\t\t\t\t<mat-icon>clear</mat-icon>\n\t\t\t\t</button>\n\t\t\t}\n\t\t\t<button (click)=\"openOrClosePanel($event, trigger)\" aria-label=\"Clear\" mat-icon-button type=\"button\">\n\t\t\t\t<mat-icon>{{ arrowIconSubject.getValue() }}</mat-icon>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<mat-autocomplete\n\t\t\t#auto=\"matAutocomplete\"\n\t\t\t(closed)=\"arrowIconSubject.next('arrow_drop_down')\"\n\t\t\t(opened)=\"arrowIconSubject.next('arrow_drop_up')\"\n\t\t\t(optionSelected)=\"arrowIconSubject.next('arrow_drop_down')\"\n\t\t\t[displayWith]=\"displayFn\">\n\t\t\t@for (option of filteredOptions | async; track option[bindValue()]) {\n\t\t\t\t<mat-option (onSelectionChange)=\"emitSelectedValue($event)\" [value]=\"option\">\n\t\t\t\t\t@if ((option | typeOf) === 'string') {\n\t\t\t\t\t\t<ng-container>{{ option }}</ng-container>\n\t\t\t\t\t} @else if ((option | typeOf) === 'object') {\n\t\t\t\t\t\t<ng-container>{{ option[bindLabel()] }}</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-option>\n\t\t\t}\n\t\t</mat-autocomplete>\n\t</mat-form-field>\n</div>\n" }]
162
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { inputAutoComplete: [{
163
+ type: ViewChild,
164
+ args: ['inputAutoComplete']
165
+ }], inputFormGroup: [{
166
+ type: Input
167
+ }], displayWith: [{
168
+ type: Input
169
+ }, {
170
+ type: Optional
171
+ }] } });
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raXQvc3JjL2xpYi9jb21wb25lbnRzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxlQUFlLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFZLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMscUJBQXFCLEVBQXlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFN0YsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBRTFDOzs7OztHQUtHO0FBZ0JILE1BQU0sT0FBTyxxQkFBcUI7SUEwRWpDLFlBQW9CLEtBQXdCO1FBQXhCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBL0Q1Qzs7V0FFRztRQUNILFVBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEI7O1dBRUc7UUFDSCxnQkFBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4Qjs7V0FFRztRQUNILGVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0I7O1dBRUc7UUFDSCxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXBCOztXQUVHO1FBQ0gsY0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0Qjs7V0FFRztRQUNILGNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEI7O1dBRUc7UUFDa0IsZ0JBQVcsR0FBb0MsSUFBSSxDQUFDO1FBRXpFOztXQUVHO1FBQ0gsYUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4Qjs7V0FFRztRQUNILFNBQUksR0FBRyxLQUFLLEVBQW9CLENBQUM7UUFFakM7Ozs7O1dBS0c7UUFDSCxzQkFBaUIsR0FBRyxNQUFNLEVBQU8sQ0FBQztRQUVsQzs7V0FFRztRQUNILHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFPWCxDQUFDO0lBRWhELHFCQUFxQjtRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVE7UUFDUCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQ2pGLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFDYixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbkcsR0FBRyxDQUNGLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDaEIsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzlCLE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFDaEMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDakUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FDM0IsQ0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUF1QjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVUsQ0FBQyxHQUFRO1FBQ2xCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFDLEdBQVEsRUFBRSxPQUErQjtRQUN6RCxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdEIsSUFBSSxPQUFPLENBQUMsU0FBUztZQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7WUFDdkMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxNQUFXO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzNHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ1AsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1lBQzlDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsQ0FBQztJQUNGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsQ0FBQyxNQUFnQztRQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQzs4R0ExSlcscUJBQXFCO2tHQUFyQixxQkFBcUIsNGtEQy9DbEMsNm9EQTBDQSwyQ0RORSxtQkFBbUIsNGpDQUNuQixVQUFVLDhDQUNWLGtCQUFrQiwyYUFDbEIscUJBQXFCLHcxQkFDckIsY0FBYywwV0FDZCxlQUFlLDJJQUNmLGFBQWEsK0tBQ2IsU0FBUzs7MkZBSUUscUJBQXFCO2tCQWZqQyxTQUFTOytCQUNDLGdDQUFnQyxjQUM5QixJQUFJLFdBQ1A7d0JBQ1IsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLGtCQUFrQjt3QkFDbEIscUJBQXFCO3dCQUNyQixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixTQUFTO3FCQUNUO3NGQU8rQixpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQUtyQixjQUFjO3NCQUF0QixLQUFLO2dCQW1DZSxXQUFXO3NCQUEvQixLQUFLOztzQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIGlucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIG91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Rm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge21hcCwgc3RhcnRXaXRofSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7TWF0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7TWF0SW5wdXRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7VHlwZU9mUGlwZX0gZnJvbSAnLi4vLi4vcGlwZXMvdHlwZS1vZi5waXBlJztcbmltcG9ydCB7TWF0QnV0dG9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7QXN5bmNQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIFJldXNhYmxlIEF1dG8gQ29tcGxldGUgY29tcG9uZW50IHRoYXQgZXh0ZW5kcyBNYXRBdXRvQ29tcGxldGUgdG8gc2hvdyBDbGVhciBpY29uIGFuZCBBcnJvdyBidXR0b25zXG4gKlxuICogQGF1dGhvciBQYXZhbiBLdW1hciBKYWRkYVxuICogQHNpbmNlIDEyLjAuMFxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdhdXRvY29tcGxldGUsIGxpYi1hdXRvY29tcGxldGUnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRpbXBvcnRzOiBbXG5cdFx0UmVhY3RpdmVGb3Jtc01vZHVsZSxcblx0XHRUeXBlT2ZQaXBlLFxuXHRcdE1hdEZvcm1GaWVsZE1vZHVsZSxcblx0XHRNYXRBdXRvY29tcGxldGVNb2R1bGUsXG5cdFx0TWF0SW5wdXRNb2R1bGUsXG5cdFx0TWF0QnV0dG9uTW9kdWxlLFxuXHRcdE1hdEljb25Nb2R1bGUsXG5cdFx0QXN5bmNQaXBlLFxuXHRdLFxuXHR0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudENoZWNrZWQge1xuXHQvKipcblx0ICogR2V0cyByZWZlcmVuY2UgaW5wdXRBdXRvQ29tcGxldGUgSFRNTCBhdHRyaWJ1dGVcblx0ICovXG5cdEBWaWV3Q2hpbGQoJ2lucHV0QXV0b0NvbXBsZXRlJykgaW5wdXRBdXRvQ29tcGxldGUhOiBFbGVtZW50UmVmO1xuXG5cdC8qKlxuXHQgKiBJbnB1dCBmb3JtIGdyb3VwIG9mIHRoZSBhdXRvIGNvbXBsZXRlXG5cdCAqL1xuXHRASW5wdXQoKSBpbnB1dEZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcblxuXHQvKipcblx0ICogTGFiZWwgb2YgdGhlIEF1dG9Db21wbGV0ZVxuXHQgKi9cblx0bGFiZWwgPSBpbnB1dCgnJyk7XG5cblx0LyoqXG5cdCAqIFBsYWNlaG9sZGVyIG9mIHRoZSBBdXRvQ29tcGxldGVcblx0ICovXG5cdHBsYWNlSG9sZGVyID0gaW5wdXQoJycpO1xuXG5cdC8qKlxuXHQgKiBBcHBlYXJhbmNlIG9mIHRoZSBBdXRvQ29tcGxldGUsIGRlZmF1bHRzIHRvIGBmaWxsYFxuXHQgKi9cblx0YXBwZWFyYW5jZSA9IGlucHV0KCdmaWxsJyk7XG5cblx0LyoqXG5cdCAqIExpc3Qgb2YgQ1NTIGNsYXNzZXMgdGhhdCBuZWVkIHRvIGFwcGxpZWQgdG8gYXV0b2NvbXBsZXRlXG5cdCAqL1xuXHRjbGFzc2VzID0gaW5wdXQoJycpO1xuXG5cdC8qKlxuXHQgKiBBdHRyaWJ1dGUgb2YgdGhlIE9iamVjdCB3aG9zZSB2YWx1ZSB3b3VsZCBiZSBzaG93biB3aGVuIHNlYXJjaGluZyBmb3IgZGF0YS4gRGVmYXVsdHMgdG8gYElEYFxuXHQgKi9cblx0YmluZExhYmVsID0gaW5wdXQoJycpO1xuXG5cdC8qKlxuXHQgKiBBdHRyaWJ1dGUgb2YgdGhlIE9iamVjdCB3aG9zZSB2YWx1ZSB3b3VsZCBiZSB1c2VkIGZvciBzZWFyY2hcblx0ICovXG5cdGJpbmRWYWx1ZSA9IGlucHV0KCdpZCcpO1xuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0aGF0IG1hcHMgYW4gb3B0aW9uJ3MgY29udHJvbCB2YWx1ZSB0byBpdHMgZGlzcGxheSB2YWx1ZSBpbiB0aGUgdHJpZ2dlci5cblx0ICovXG5cdEBJbnB1dCgpIEBPcHRpb25hbCgpIGRpc3BsYXlXaXRoOiAoKHZhbHVlOiBhbnkpID0+IHN0cmluZykgfCBudWxsID0gbnVsbDtcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIGlmIHRoZSBhdXRvY29tcGxldGUgaXMgcmVxdWlyZWQuIERlZmF1bHQgaXMgbm90IHJlcXVpcmVkLlxuXHQgKi9cblx0cmVxdWlyZWQgPSBpbnB1dChmYWxzZSk7XG5cblx0LyoqXG5cdCAqIExpc3Qgb2YgT2JqZWN0cyB0aGF0IG5lZWQgdG8gYmUgYmluZCBhbmQgc2VhcmNoZWQgZm9yXG5cdCAqL1xuXHRkYXRhID0gaW5wdXQ8c3RyaW5nW10gfCBhbnlbXT4oKTtcblxuXHQvKipcblx0ICogRW1pdCBzZWxlY3RlZCB2YWx1ZSBvbiBzZWxlY3Rpb24gY2hhbmdlc1xuXHQgKlxuXHQgKiBAYXV0aG9yIFBhdmFuIEt1bWFyIEphZGRhXG5cdCAqIEBzaW5jZSAxMy4wLjNcblx0ICovXG5cdG9uU2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcblxuXHQvKipcblx0ICogQmVoYXZpb3JTdWJqZWN0IHRoYXQgc2hvd3MgdGhlIGN1cnJlbnQgYWN0aXZlIGFycm93IGljb25cblx0ICovXG5cdGFycm93SWNvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCdhcnJvd19kcm9wX2Rvd24nKTtcblxuXHQvKipcblx0ICogRmlsdGVyZWQgb3B0aW9ucyB3aGVuIHVzZXJcblx0ICovXG5cdGZpbHRlcmVkT3B0aW9uczogT2JzZXJ2YWJsZTxhbnlbXSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cblx0bmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuXHRcdHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZSBhdXRvY29tcGxldGUgc2VhcmNoIGZpbHRlciBvbiBzZWFyY2ggdGV4dCBjaGFuZ2VzXG5cdCAqXG5cdCAqIEBhdXRob3IgUGF2YW4gS3VtYXIgSmFkZGFcblx0ICogQHNpbmNlIDEyLjAuMFxuXHQgKi9cblx0bmdPbkluaXQoKSB7XG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmlucHV0Rm9ybUdyb3VwPy5nZXQoJ2F1dG9jb21wbGV0ZScpPy52YWx1ZUNoYW5nZXMucGlwZShcblx0XHRcdHN0YXJ0V2l0aCgnJyksXG5cdFx0XHRtYXAoKHZhbHVlKSA9PiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdmFsdWUgIT09IG51bGwgPyB2YWx1ZVt0aGlzLmJpbmRMYWJlbCgpXSA6ICcnKSksXG5cdFx0XHRtYXAoXG5cdFx0XHRcdChwcm9wZXJ0eU5hbWUpID0+XG5cdFx0XHRcdFx0dGhpcy5kYXRhKCk/LmZpbHRlcigob3B0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZydcblx0XHRcdFx0XHRcdFx0PyBvcHRpb24/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSkgPT09IDBcblx0XHRcdFx0XHRcdFx0OiBvcHRpb25bdGhpcy5iaW5kTGFiZWwoKV0/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSkgPT09IDA7XG5cdFx0XHRcdFx0fSkgPz8gdGhpcy5kYXRhKCk/LnNsaWNlKCksXG5cdFx0XHQpLFxuXHRcdCk7XG5cdH1cblxuXHRuZ09uQ2hhbmdlcyhfY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuXHRcdHRoaXMuZGlzcGxheUZuID0gdGhpcy5kaXNwbGF5Rm4uYmluZCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciBpbnB1dCBhbmQgUmVzZXQgYXV0b2NvbXBsZXRlIGZvcm0gY29udHJvbFxuXHQgKlxuXHQgKiBAYXV0aG9yIFBhdmFuIEt1bWFyIEphZGRhXG5cdCAqIEBzaW5jZSAxMi4wLjBcblx0ICovXG5cdGNsZWFySW5wdXQoZXZ0OiBhbnkpOiB2b2lkIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5pbnB1dEZvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZScpPy5yZXNldCgpO1xuXHRcdHRoaXMuaW5wdXRBdXRvQ29tcGxldGU/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPcGVuIG9yIENsb3NlIHBhbmVsXG5cdCAqXG5cdCAqIEBhdXRob3IgUGF2YW4gS3VtYXIgSmFkZGFcblx0ICogQHNpbmNlIDEyLjAuMFxuXHQgKi9cblx0b3Blbk9yQ2xvc2VQYW5lbChldnQ6IGFueSwgdHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcik6IHZvaWQge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRpZiAodHJpZ2dlci5wYW5lbE9wZW4pIHRyaWdnZXIuY2xvc2VQYW5lbCgpO1xuXHRcdGVsc2UgdHJpZ2dlci5vcGVuUGFuZWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5IGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBzaG93IHRoZSB2YWx1ZXNcblx0ICpcblx0ICogQGF1dGhvciBQYXZhbiBLdW1hciBKYWRkYVxuXHQgKiBAc2luY2UgMTIuMC4wXG5cdCAqL1xuXHRkaXNwbGF5Rm4ob2JqZWN0OiBhbnkpOiBzdHJpbmcge1xuXHRcdGlmICh0aGlzLmRpc3BsYXlXaXRoICE9PSB1bmRlZmluZWQgJiYgdGhpcy5kaXNwbGF5V2l0aCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5kaXNwbGF5V2l0aCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dGhpcy5kaXNwbGF5Rm4gPSB0aGlzLmRpc3BsYXlXaXRoLmJpbmQodGhpcyk7XG5cdFx0XHRyZXR1cm4gdGhpcy5kaXNwbGF5V2l0aChvYmplY3QpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycpIHJldHVybiBvYmplY3Q7XG5cdFx0XHRyZXR1cm4gb2JqZWN0ICYmIG9iamVjdFt0aGlzLmJpbmRMYWJlbCgpXSA/IG9iamVjdFt0aGlzLmJpbmRMYWJlbCgpXSA6ICcnO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFbWl0IHNlbGVjdGVkIHZhbHVlXG5cdCAqIEBwYXJhbSAkZXZlbnQgLSBFdmVudCBlbWl0dGVkIGJ5IGF1dG9jb21wbGV0ZVxuXHQgKlxuXHQgKiBAYXV0aG9yIFBhdmFuIEt1bWFyIEphZGRhXG5cdCAqIEBzaW5jZSAxMy4wLjNcblx0ICovXG5cdGVtaXRTZWxlY3RlZFZhbHVlKCRldmVudDogTWF0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlKSB7XG5cdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KCRldmVudC5zb3VyY2UudmFsdWUpO1xuXHR9XG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiaW5wdXRGb3JtR3JvdXBcIj5cblx0PG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJ7eyBjbGFzc2VzKCkgfX1cIj5cblx0XHQ8bWF0LWxhYmVsPnt7IGxhYmVsKCkgfX08L21hdC1sYWJlbD5cblx0XHQ8aW5wdXRcblx0XHRcdCNpbnB1dEF1dG9Db21wbGV0ZVxuXHRcdFx0I3RyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcblx0XHRcdFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG5cdFx0XHRbcGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXIoKVwiXG5cdFx0XHRbcmVxdWlyZWRdPVwicmVxdWlyZWQoKVwiXG5cdFx0XHRmb3JtQ29udHJvbE5hbWU9XCJhdXRvY29tcGxldGVcIlxuXHRcdFx0bWF0SW5wdXRcblx0XHRcdHR5cGU9XCJ0ZXh0XCIgLz5cblxuXHRcdDxkaXYgbWF0U3VmZml4IHN0eWxlPVwiZGlzcGxheTogZmxleFwiPlxuXHRcdFx0QGlmICghIWlucHV0Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlJyk/LnZhbHVlKSB7XG5cdFx0XHRcdDxidXR0b24gKGNsaWNrKT1cImNsZWFySW5wdXQoJGV2ZW50KVwiIGFyaWEtbGFiZWw9XCJDbGVhclwiIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+XG5cdFx0XHRcdFx0PG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cblx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHR9XG5cdFx0XHQ8YnV0dG9uIChjbGljayk9XCJvcGVuT3JDbG9zZVBhbmVsKCRldmVudCwgdHJpZ2dlcilcIiBhcmlhLWxhYmVsPVwiQ2xlYXJcIiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiPlxuXHRcdFx0XHQ8bWF0LWljb24+e3sgYXJyb3dJY29uU3ViamVjdC5nZXRWYWx1ZSgpIH19PC9tYXQtaWNvbj5cblx0XHRcdDwvYnV0dG9uPlxuXHRcdDwvZGl2PlxuXG5cdFx0PG1hdC1hdXRvY29tcGxldGVcblx0XHRcdCNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcblx0XHRcdChjbG9zZWQpPVwiYXJyb3dJY29uU3ViamVjdC5uZXh0KCdhcnJvd19kcm9wX2Rvd24nKVwiXG5cdFx0XHQob3BlbmVkKT1cImFycm93SWNvblN1YmplY3QubmV4dCgnYXJyb3dfZHJvcF91cCcpXCJcblx0XHRcdChvcHRpb25TZWxlY3RlZCk9XCJhcnJvd0ljb25TdWJqZWN0Lm5leHQoJ2Fycm93X2Ryb3BfZG93bicpXCJcblx0XHRcdFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIj5cblx0XHRcdEBmb3IgKG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMgfCBhc3luYzsgdHJhY2sgb3B0aW9uW2JpbmRWYWx1ZSgpXSkge1xuXHRcdFx0XHQ8bWF0LW9wdGlvbiAob25TZWxlY3Rpb25DaGFuZ2UpPVwiZW1pdFNlbGVjdGVkVmFsdWUoJGV2ZW50KVwiIFt2YWx1ZV09XCJvcHRpb25cIj5cblx0XHRcdFx0XHRAaWYgKChvcHRpb24gfCB0eXBlT2YpID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lcj57eyBvcHRpb24gfX08L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0XHR9IEBlbHNlIGlmICgob3B0aW9uIHwgdHlwZU9mKSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXI+e3sgb3B0aW9uW2JpbmRMYWJlbCgpXSB9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0PC9tYXQtb3B0aW9uPlxuXHRcdFx0fVxuXHRcdDwvbWF0LWF1dG9jb21wbGV0ZT5cblx0PC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuIl19