@ruc-lib/multi-select 3.1.0 → 3.2.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.
- package/README.md +177 -3
- package/esm2020/index.mjs +5 -0
- package/esm2020/lib/animations/animations.mjs +30 -0
- package/esm2020/lib/directives/clickOutside.directive.mjs +31 -0
- package/esm2020/lib/interfaces/multiSelectDefault.mjs +2 -0
- package/esm2020/lib/model/ruc-multi-select.model.mjs +11 -0
- package/esm2020/lib/pipes/filter.pipe.mjs +28 -0
- package/esm2020/lib/pipes/sort.pipe.mjs +38 -0
- package/esm2020/lib/ruclib-multi-select/ruclib-multi-select.component.mjs +361 -0
- package/esm2020/lib/ruclib-multi-select.module.mjs +72 -0
- package/esm2020/ruc-lib-multi-select.mjs +5 -0
- package/fesm2015/ruc-lib-multi-select.mjs +557 -0
- package/fesm2015/ruc-lib-multi-select.mjs.map +1 -0
- package/fesm2020/ruc-lib-multi-select.mjs +558 -0
- package/fesm2020/ruc-lib-multi-select.mjs.map +1 -0
- package/index.d.ts +4 -207
- package/lib/animations/animations.d.ts +1 -0
- package/lib/directives/clickOutside.directive.d.ts +10 -0
- package/lib/interfaces/multiSelectDefault.d.ts +64 -0
- package/lib/model/ruc-multi-select.model.d.ts +9 -0
- package/lib/pipes/filter.pipe.d.ts +7 -0
- package/lib/pipes/sort.pipe.d.ts +9 -0
- package/lib/ruclib-multi-select/ruclib-multi-select.component.d.ts +118 -0
- package/lib/ruclib-multi-select.module.d.ts +20 -0
- package/package.json +26 -13
- package/fesm2022/ruc-lib-multi-select.mjs +0 -519
- package/fesm2022/ruc-lib-multi-select.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,7 +1,181 @@
|
|
|
1
1
|
# ruclib-multi-select
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A flexible and customizable multi-select dropdown component for Angular applications. It supports single or multiple selections, parent-child relationships, search, sorting, and custom theming.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Installation Guide
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
To use the Multi-Select component, you can install the entire RUC library or just this specific component.
|
|
8
|
+
|
|
9
|
+
### Install the Entire Library
|
|
10
|
+
```bash
|
|
11
|
+
npm install @uxpractice/ruc-lib
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Install Individual Component
|
|
15
|
+
If you only need the Multi-Select component:
|
|
16
|
+
```bash
|
|
17
|
+
npm install @ruc-lib/multi-select
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Version Compatibility
|
|
22
|
+
|
|
23
|
+
Please ensure you install the correct version of `@ruc-lib/multi-select` based on your Angular version.
|
|
24
|
+
|
|
25
|
+
| Angular Version | Compatible `@ruc-lib/multi-select` Version |
|
|
26
|
+
|--------------------|------------------------------------------------|
|
|
27
|
+
| 15.x.x | `npm install @ruc-lib/multi-select@^3.2.0` |
|
|
28
|
+
| 16.x.x | `npm install @ruc-lib/multi-select@^3.2.0` |
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
### 1. Import the Module
|
|
34
|
+
In your Angular module file (e.g., `app.module.ts`), import the `RuclibMultiSelectModule`:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { RuclibMultiSelectModule } from '@ruc-lib/multi-select';
|
|
38
|
+
import { AppComponent } from './app.component';
|
|
39
|
+
import { NgModule } from '@angular/core';
|
|
40
|
+
import { BrowserModule } from '@angular/platform-browser';
|
|
41
|
+
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|
42
|
+
|
|
43
|
+
@NgModule({
|
|
44
|
+
declarations: [AppComponent],
|
|
45
|
+
imports: [
|
|
46
|
+
BrowserModule,
|
|
47
|
+
BrowserAnimationsModule,
|
|
48
|
+
RuclibMultiSelectModule
|
|
49
|
+
],
|
|
50
|
+
providers: [],
|
|
51
|
+
bootstrap: [AppComponent]
|
|
52
|
+
})
|
|
53
|
+
export class AppModule {}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. Use the Component
|
|
57
|
+
In your component's template, use the `<uxp-ruclib-multi-select>` selector and pass the configuration and data to the respective inputs.
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<uxp-ruclib-multi-select
|
|
61
|
+
[dataSource]="dataSourceForMultiSelect"
|
|
62
|
+
[rucInputData]="inputObjectDataMulti"
|
|
63
|
+
[customTheme]="'custom-theme'"
|
|
64
|
+
(rucEvent)="handleEvent($event)">
|
|
65
|
+
</uxp-ruclib-multi-select>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## API Reference
|
|
69
|
+
|
|
70
|
+
### Component Inputs
|
|
71
|
+
|
|
72
|
+
| Input | Type | Description |
|
|
73
|
+
|----------------|--------------------|--------------------------------------------------|
|
|
74
|
+
| `rucInputData` | `DefaultConfig` | The main configuration object for the component. |
|
|
75
|
+
| `dataSource` | `ListItem[]` | An array of items to be displayed in the dropdown. |
|
|
76
|
+
| `customTheme` | `string` | An optional CSS class for custom theming. |
|
|
77
|
+
|
|
78
|
+
### Component Outputs
|
|
79
|
+
|
|
80
|
+
| Output | Type | Description |
|
|
81
|
+
|------------|--------------------|-----------------------------------------------------------------------------|
|
|
82
|
+
| `rucEvent` | `EventEmitter<any>` | Emits an event whenever a selection changes, an item is deselected, or the input is clicked. |
|
|
83
|
+
|
|
84
|
+
### `DefaultConfig`
|
|
85
|
+
This is the main configuration object for the multi-select component.
|
|
86
|
+
|
|
87
|
+
| Property | Type | Description |
|
|
88
|
+
|---------------------|------------------------|---------------------------------------------------------------------------------------------------------|
|
|
89
|
+
| `singleSelection` | `boolean` | If `true`, allows only a single item to be selected. Defaults to `false`. |
|
|
90
|
+
| `label` | `string` | The label for the multi-select input field. |
|
|
91
|
+
| `showSelectAll` | `boolean` | If `true`, displays a "Select All" checkbox. Defaults to `true`. |
|
|
92
|
+
| `showSelected` | `boolean` | If `true`, displays a "Show Selected" filter. Defaults to `true`. |
|
|
93
|
+
| `appearance` | `'fill' \| 'outline'` | The appearance of the form field. Defaults to `'outline'`. |
|
|
94
|
+
| `scroll` | `boolean` | Enables or disables scrolling within the dropdown. Defaults to `true`. |
|
|
95
|
+
| `placeholder` | `string` | The placeholder text for the search input. |
|
|
96
|
+
| `limit` | `number` | The maximum number of items that can be selected. |
|
|
97
|
+
| `maxDropdownHeight` | `string` | The maximum height of the dropdown container (e.g., `'200px'`). |
|
|
98
|
+
| `maxHeight` | `number` | The maximum height of the options box in pixels. Defaults to `150`. |
|
|
99
|
+
| `disabled` | `boolean` | If `true`, disables the entire component. Defaults to `false`. |
|
|
100
|
+
| `sortBy` | `string` | The property of the `ListItem` to sort by (e.g., `'id'`, `'text'`). |
|
|
101
|
+
| `sortOrder` | `'asc' \| 'desc'` | The order of sorting. |
|
|
102
|
+
|
|
103
|
+
### `ListItem`
|
|
104
|
+
This object defines the configuration for each item in the `dataSource`.
|
|
105
|
+
|
|
106
|
+
| Property | Type | Description |
|
|
107
|
+
|--------------|--------------------|--------------------------------------------------------------------------|
|
|
108
|
+
| `id` | `string \| number` | A unique identifier for the item. |
|
|
109
|
+
| `text` | `string` | The display text for the item. |
|
|
110
|
+
| `isDisabled` | `boolean` | If `true`, this item will be disabled and cannot be selected. |
|
|
111
|
+
| `icon` | `string` | An optional icon to display next to the item. |
|
|
112
|
+
| `childItem` | `any` | Used for creating parent-child relationships. |
|
|
113
|
+
| `grouped` | `boolean` | If `true`, indicates that the item is a group header. |
|
|
114
|
+
|
|
115
|
+
## Example Configuration
|
|
116
|
+
|
|
117
|
+
Here's an example of how to configure the Multi-Select component in your component's TypeScript file.
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { Component } from '@angular/core';
|
|
121
|
+
import { DefaultConfig, ListItem } from '@ruc-lib/multi-select';
|
|
122
|
+
|
|
123
|
+
@Component({
|
|
124
|
+
selector: 'app-root',
|
|
125
|
+
templateUrl: './app.component.html',
|
|
126
|
+
})
|
|
127
|
+
export class AppComponent {
|
|
128
|
+
|
|
129
|
+
inputObjectDataMulti: DefaultConfig = {
|
|
130
|
+
singleSelection: false,
|
|
131
|
+
label: 'Cities',
|
|
132
|
+
showSelectAll: true,
|
|
133
|
+
showSelected: true,
|
|
134
|
+
appearance: 'outline',
|
|
135
|
+
scroll: true,
|
|
136
|
+
placeholder: 'Search or select from dropdown',
|
|
137
|
+
limit: 5,
|
|
138
|
+
maxDropdownHeight: '200px',
|
|
139
|
+
maxHeight: 150,
|
|
140
|
+
disabled: false,
|
|
141
|
+
sortBy: 'id',
|
|
142
|
+
sortOrder: 'desc',
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
dataSourceForMultiSelect: ListItem[] = [
|
|
146
|
+
{ text: 'Afghanistan', id: 'AF', isDisabled: true },
|
|
147
|
+
{ text: 'Åland Islands', id: 'AX', isDisabled: false },
|
|
148
|
+
{ text: 'Albania', id: 'AL', isDisabled: false },
|
|
149
|
+
{ text: 'Algeria', id: 'DZ', isDisabled: false },
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
handleEvent(event: any) {
|
|
153
|
+
console.log(event.eventName, event.eventOutput);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
> ⚠️ **IMPORTANT: Custom Theme Usage in Angular Material**
|
|
159
|
+
|
|
160
|
+
When implementing **custom themes**, such as:
|
|
161
|
+
|
|
162
|
+
```scss
|
|
163
|
+
.custom-theme-1 {
|
|
164
|
+
@include angular-material-theme($custom-theme);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// You must also include the typography mixin to ensure text styles are applied correctly as shown below:
|
|
168
|
+
.custom-theme-1 {
|
|
169
|
+
@include angular-material-theme($custom-theme);
|
|
170
|
+
@include mat.typography-level($theme-custom-typography-name, body-1);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
## Contribution
|
|
176
|
+
|
|
177
|
+
Contributions are welcome! Feel free to open issues or pull requests for any enhancements or fixes.
|
|
178
|
+
|
|
179
|
+
## Acknowledgements
|
|
180
|
+
|
|
181
|
+
Thank you for choosing the Multi Select Component. If you have any feedback or suggestions, please let us know!
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './lib/ruclib-multi-select.module';
|
|
2
|
+
export * from './lib/ruclib-multi-select/ruclib-multi-select.component';
|
|
3
|
+
export * from './lib/model/ruc-multi-select.model';
|
|
4
|
+
export * from './lib/interfaces/multiSelectDefault';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLHlEQUF5RCxDQUFDO0FBQ3hFLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL3J1Y2xpYi1tdWx0aS1zZWxlY3QubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvcnVjbGliLW11bHRpLXNlbGVjdC9ydWNsaWItbXVsdGktc2VsZWN0LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVsL3J1Yy1tdWx0aS1zZWxlY3QubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL211bHRpU2VsZWN0RGVmYXVsdCc7XHJcbiJdfQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { animate, query, sequence, stagger, style, transition, trigger } from "@angular/animations";
|
|
2
|
+
export const DropDownAnimation = trigger("dropDownMenu", [
|
|
3
|
+
transition(":enter", [
|
|
4
|
+
style({ height: 0, overflow: "hidden" }),
|
|
5
|
+
query(".option", [
|
|
6
|
+
style({ opacity: 0, transform: "translateY(-50px)" })
|
|
7
|
+
]),
|
|
8
|
+
sequence([
|
|
9
|
+
animate("400ms", style({ height: "*" })),
|
|
10
|
+
query(".option", [
|
|
11
|
+
stagger(50, [
|
|
12
|
+
animate("200ms ease", style({ opacity: 1, transform: "none" }))
|
|
13
|
+
])
|
|
14
|
+
])
|
|
15
|
+
])
|
|
16
|
+
]),
|
|
17
|
+
transition(":leave", [
|
|
18
|
+
style({ height: "*", overflow: "hidden" }),
|
|
19
|
+
query(".option", [style({ opacity: 1, transform: "none" })]),
|
|
20
|
+
sequence([
|
|
21
|
+
query(".option", [
|
|
22
|
+
stagger(-10, [
|
|
23
|
+
animate("400ms ease", style({ opacity: 0, transform: "translateY(-50px)" }))
|
|
24
|
+
])
|
|
25
|
+
]),
|
|
26
|
+
animate("400ms", style({ height: 0 }))
|
|
27
|
+
])
|
|
28
|
+
])
|
|
29
|
+
]);
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYW5pbWF0aW9ucy9hbmltYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxPQUFPLEVBQ1AsS0FBSyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1AsS0FBSyxFQUNMLFVBQVUsRUFDVixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFO0lBQ3ZELFVBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDbkIsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDeEMsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUNmLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUM7U0FDdEQsQ0FBQztRQUNGLFFBQVEsQ0FBQztZQUNQLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDeEMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDZixPQUFPLENBQUMsRUFBRSxFQUFFO29CQUNWLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDaEUsQ0FBQzthQUNILENBQUM7U0FDSCxDQUFDO0tBQ0gsQ0FBQztJQUVGLFVBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDbkIsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDMUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RCxRQUFRLENBQUM7WUFDUCxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDWCxPQUFPLENBQ0wsWUFBWSxFQUNaLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FDdEQ7aUJBQ0YsQ0FBQzthQUNILENBQUM7WUFDRixPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZDLENBQUM7S0FDSCxDQUFDO0NBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIGFuaW1hdGUsXHJcbiAgICBxdWVyeSxcclxuICAgIHNlcXVlbmNlLFxyXG4gICAgc3RhZ2dlcixcclxuICAgIHN0eWxlLFxyXG4gICAgdHJhbnNpdGlvbixcclxuICAgIHRyaWdnZXJcclxuICB9IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCI7XHJcbiAgXHJcbiAgZXhwb3J0IGNvbnN0IERyb3BEb3duQW5pbWF0aW9uID0gdHJpZ2dlcihcImRyb3BEb3duTWVudVwiLCBbXHJcbiAgICB0cmFuc2l0aW9uKFwiOmVudGVyXCIsIFtcclxuICAgICAgc3R5bGUoeyBoZWlnaHQ6IDAsIG92ZXJmbG93OiBcImhpZGRlblwiIH0pLFxyXG4gICAgICBxdWVyeShcIi5vcHRpb25cIiwgW1xyXG4gICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoLTUwcHgpXCIgfSlcclxuICAgICAgXSksXHJcbiAgICAgIHNlcXVlbmNlKFtcclxuICAgICAgICBhbmltYXRlKFwiNDAwbXNcIiwgc3R5bGUoeyBoZWlnaHQ6IFwiKlwiIH0pKSxcclxuICAgICAgICBxdWVyeShcIi5vcHRpb25cIiwgW1xyXG4gICAgICAgICAgc3RhZ2dlcig1MCwgW1xyXG4gICAgICAgICAgICBhbmltYXRlKFwiMjAwbXMgZWFzZVwiLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogXCJub25lXCIgfSkpXHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgIF0pXHJcbiAgICAgIF0pXHJcbiAgICBdKSxcclxuICBcclxuICAgIHRyYW5zaXRpb24oXCI6bGVhdmVcIiwgW1xyXG4gICAgICBzdHlsZSh7IGhlaWdodDogXCIqXCIsIG92ZXJmbG93OiBcImhpZGRlblwiIH0pLFxyXG4gICAgICBxdWVyeShcIi5vcHRpb25cIiwgW3N0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiBcIm5vbmVcIiB9KV0pLFxyXG4gICAgICBzZXF1ZW5jZShbXHJcbiAgICAgICAgcXVlcnkoXCIub3B0aW9uXCIsIFtcclxuICAgICAgICAgIHN0YWdnZXIoLTEwLCBbXHJcbiAgICAgICAgICAgIGFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgXCI0MDBtcyBlYXNlXCIsXHJcbiAgICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgtNTBweClcIiB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgIGFuaW1hdGUoXCI0MDBtc1wiLCBzdHlsZSh7IGhlaWdodDogMCB9KSlcclxuICAgICAgXSlcclxuICAgIF0pXHJcbiAgXSk7XHJcbiAgIl19
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ClickOutsideDirective {
|
|
4
|
+
constructor(_elementRef) {
|
|
5
|
+
this._elementRef = _elementRef;
|
|
6
|
+
this.clickOutside = new EventEmitter();
|
|
7
|
+
}
|
|
8
|
+
onClick(event, targetElement) {
|
|
9
|
+
if (!targetElement) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const clickedInside = this._elementRef.nativeElement.contains(targetElement);
|
|
13
|
+
if (!clickedInside) {
|
|
14
|
+
this.clickOutside.emit(event);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
ClickOutsideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickOutsideDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
19
|
+
ClickOutsideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ClickOutsideDirective, selector: "[clickOutside]", outputs: { clickOutside: "clickOutside" }, host: { listeners: { "document:click": "onClick($event,$event.target)" } }, ngImport: i0 });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickOutsideDirective, decorators: [{
|
|
21
|
+
type: Directive,
|
|
22
|
+
args: [{
|
|
23
|
+
selector: '[clickOutside]'
|
|
24
|
+
}]
|
|
25
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { clickOutside: [{
|
|
26
|
+
type: Output
|
|
27
|
+
}], onClick: [{
|
|
28
|
+
type: HostListener,
|
|
29
|
+
args: ['document:click', ['$event', '$event.target']]
|
|
30
|
+
}] } });
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpY2tPdXRzaWRlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlyZWN0aXZlcy9jbGlja091dHNpZGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUt4RixNQUFNLE9BQU8scUJBQXFCO0lBQzlCLFlBQW9CLFdBQXVCO1FBQXZCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBSXBDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUhyRCxDQUFDO0lBTU0sT0FBTyxDQUFDLEtBQWlCLEVBQUUsYUFBMEI7UUFDeEQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNqQztJQUNMLENBQUM7O21IQWpCUSxxQkFBcUI7dUdBQXJCLHFCQUFxQjs0RkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzdCO2lHQU1VLFlBQVk7c0JBRGxCLE1BQU07Z0JBSUEsT0FBTztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuICAgIFxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW2NsaWNrT3V0c2lkZV0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbGlja091dHNpZGVEaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGNsaWNrT3V0c2lkZSA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50JywgJyRldmVudC50YXJnZXQnXSlcclxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZS5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlTZWxlY3REZWZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnRlcmZhY2VzL211bHRpU2VsZWN0RGVmYXVsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0Q29uZmlnIHtcclxuICAgIC8qKlxyXG4gICAgICogT1B0aW9uYWxcclxuICAgICAqIFZhbHVlcyA6LSB0cnVlICwgZmFsc2VcclxuICAgICAqL1xyXG4gICAgc2luZ2xlU2VsZWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFuZGF0b3J5LCBcclxuICAgICAqIHZhbHVlOiBhbnkgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIGxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWwgXHJcbiAgICAgKiB2YWx1ZSA6dHJ1ZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBzaG93U2VsZWN0QWxsPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICogT3B0aW9uYWwgXHJcbiAgICAqIHZhbHVlIDp0cnVlIGZhbHNlXHJcbiAgICAqL1xyXG4gICAgc2hvd1NlbGVjdGVkPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wdGlvbmFsIFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIGFwcGVhcmFuY2U/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcHRpb25hbCBcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBzY3JvbGw/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWwgXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcHRpb25hbCBcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBsaW1pdD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wdGlvbmFsIFxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIG1heERyb3Bkb3duSGVpZ2h0Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWwgXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgc29ydEJ5Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWxcclxuICAgICAqL1xyXG4gICAgc29ydE9yZGVyPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgICAgKiBPcHRpb25hbFxyXG4gICAgICAgICovXHJcbiAgICBtYXhIZWlnaHQ/OiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAgICAqIE9wdGlvbmFsXHJcbiAgICAgICAgKi9cclxuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class ListItem {
|
|
2
|
+
constructor(data) {
|
|
3
|
+
this.id = data.id;
|
|
4
|
+
this.text = data.text;
|
|
5
|
+
this.isDisabled = data.isDisabled;
|
|
6
|
+
this.icon = data.icon;
|
|
7
|
+
this.childItem = data.childItem;
|
|
8
|
+
this.grouped = data.grouped;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLW11bHRpLXNlbGVjdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWwvcnVjLW11bHRpLXNlbGVjdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQU9uQixZQUFvQixJQUFTO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7Q0FDQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMaXN0SXRlbSB7XHJcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gICAgaXNEaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgICBpY29uPyA6IHN0cmluZztcclxuICAgIGNoaWxkSXRlbT8gOiBhbnk7XHJcbiAgICBncm91cGVkPyA6IGFueTtcclxuICBwdWJsaWMgY29uc3RydWN0b3IgKGRhdGE6IGFueSl7XHJcbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQ7XHJcbiAgICAgICAgdGhpcy50ZXh0ID0gZGF0YS50ZXh0O1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGRhdGEuaXNEaXNhYmxlZDtcclxuICAgICAgICB0aGlzLmljb24gPSBkYXRhLmljb247XHJcbiAgICAgICAgdGhpcy5jaGlsZEl0ZW0gPSBkYXRhLmNoaWxkSXRlbTtcclxuICAgICAgICB0aGlzLmdyb3VwZWQgPSBkYXRhLmdyb3VwZWQ7XHJcbiAgfVxyXG4gIH0iXX0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class FilterPipe {
|
|
4
|
+
transform(items, searchText, key) {
|
|
5
|
+
if (!items)
|
|
6
|
+
return [];
|
|
7
|
+
if (!searchText)
|
|
8
|
+
return items;
|
|
9
|
+
searchText = searchText.toLowerCase();
|
|
10
|
+
return items.filter(it => {
|
|
11
|
+
if (!key) {
|
|
12
|
+
return it.toLowerCase().includes(searchText);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return it[key].toLowerCase().includes(searchText);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
FilterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
21
|
+
FilterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: FilterPipe, name: "filter" });
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterPipe, decorators: [{
|
|
23
|
+
type: Pipe,
|
|
24
|
+
args: [{
|
|
25
|
+
name: 'filter'
|
|
26
|
+
}]
|
|
27
|
+
}] });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BpcGVzL2ZpbHRlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUlwRCxNQUFNLE9BQU8sVUFBVTtJQUNyQixTQUFTLENBQUMsS0FBWSxFQUFFLFVBQWtCLEVBQUUsR0FBVztRQUNyRCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdkIsSUFBRyxDQUFDLEdBQUcsRUFBQztnQkFDTixPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDOUM7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ25EO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzt3R0FaVSxVQUFVO3NHQUFWLFVBQVU7NEZBQVYsVUFBVTtrQkFIdEIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsUUFBUTtpQkFDZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuQFBpcGUoe1xyXG4gIG5hbWU6ICdmaWx0ZXInXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgdHJhbnNmb3JtKGl0ZW1zOiBhbnlbXSwgc2VhcmNoVGV4dDogc3RyaW5nLCBrZXk/OnN0cmluZyk6IGFueVtdIHtcclxuICAgIGlmICghaXRlbXMpIHJldHVybiBbXTtcclxuICAgIGlmICghc2VhcmNoVGV4dCkgcmV0dXJuIGl0ZW1zO1xyXG4gICAgc2VhcmNoVGV4dCA9IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoaXQgPT4ge1xyXG4gICAgICBpZigha2V5KXtcclxuICAgICAgICByZXR1cm4gaXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXRba2V5XS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Injectable, Pipe } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class SortPipe {
|
|
4
|
+
transform(value, sortOrder = 'asc', sortKey = 'text') {
|
|
5
|
+
sortOrder = sortOrder && sortOrder.toLowerCase();
|
|
6
|
+
if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc'))
|
|
7
|
+
return value;
|
|
8
|
+
let numberArray = [];
|
|
9
|
+
let stringArray = [];
|
|
10
|
+
numberArray = value
|
|
11
|
+
.filter((item) => typeof item[sortKey] === 'number')
|
|
12
|
+
.sort((a, b) => a[sortKey] - b[sortKey]);
|
|
13
|
+
stringArray = value
|
|
14
|
+
.filter((item) => typeof item[sortKey] === 'string')
|
|
15
|
+
.sort((a, b) => {
|
|
16
|
+
if (a[sortKey] < b[sortKey])
|
|
17
|
+
return -1;
|
|
18
|
+
else if (a[sortKey] > b[sortKey])
|
|
19
|
+
return 1;
|
|
20
|
+
else
|
|
21
|
+
return 0;
|
|
22
|
+
});
|
|
23
|
+
const sorted = numberArray.concat(stringArray);
|
|
24
|
+
return sortOrder === 'asc' ? sorted : sorted.reverse();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
SortPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SortPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
28
|
+
SortPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: SortPipe, name: "sort" });
|
|
29
|
+
SortPipe.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SortPipe });
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SortPipe, decorators: [{
|
|
31
|
+
type: Injectable
|
|
32
|
+
}, {
|
|
33
|
+
type: Pipe,
|
|
34
|
+
args: [{
|
|
35
|
+
name: 'sort',
|
|
36
|
+
}]
|
|
37
|
+
}] });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9waXBlcy9zb3J0LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQVFoRSxNQUFNLE9BQU8sUUFBUTtJQUNuQixTQUFTLENBQ1AsS0FBWSxFQUNaLFlBQWdDLEtBQUssRUFDckMsT0FBTyxHQUFHLE1BQU07UUFFaEIsU0FBUyxHQUFHLFNBQVMsSUFBSyxTQUFTLENBQUMsV0FBVyxFQUFVLENBQUM7UUFFMUQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTFFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsV0FBVyxHQUFHLEtBQUs7YUFDaEIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7YUFDbkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNDLFdBQVcsR0FBRyxLQUFLO2FBQ2hCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDO2FBQ25ELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDbEMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQzs7Z0JBQ3RDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pELENBQUM7O3NHQXpCVSxRQUFRO29HQUFSLFFBQVE7MEdBQVIsUUFBUTs0RkFBUixRQUFRO2tCQUpwQixVQUFVOztrQkFDVixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxNQUFNO2lCQUNiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IHR5cGUgU29ydE9yZGVyID0gJ2FzYycgfCAnZGVzYyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnc29ydCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTb3J0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIHRyYW5zZm9ybShcclxuICAgIHZhbHVlOiBhbnlbXSxcclxuICAgIHNvcnRPcmRlcjogU29ydE9yZGVyIHwgc3RyaW5nID0gJ2FzYycsXHJcbiAgICBzb3J0S2V5ID0gJ3RleHQnXHJcbiAgKTogYW55IHtcclxuICAgIHNvcnRPcmRlciA9IHNvcnRPcmRlciAmJiAoc29ydE9yZGVyLnRvTG93ZXJDYXNlKCkgYXMgYW55KTtcclxuXHJcbiAgICBpZiAoIXZhbHVlIHx8IChzb3J0T3JkZXIgIT09ICdhc2MnICYmIHNvcnRPcmRlciAhPT0gJ2Rlc2MnKSkgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGxldCBudW1iZXJBcnJheSA9IFtdO1xyXG4gICAgbGV0IHN0cmluZ0FycmF5ID0gW107XHJcbiAgICBudW1iZXJBcnJheSA9IHZhbHVlXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHR5cGVvZiBpdGVtW3NvcnRLZXldID09PSAnbnVtYmVyJylcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGFbc29ydEtleV0gLSBiW3NvcnRLZXldKTtcclxuICAgIHN0cmluZ0FycmF5ID0gdmFsdWVcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gdHlwZW9mIGl0ZW1bc29ydEtleV0gPT09ICdzdHJpbmcnKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGlmIChhW3NvcnRLZXldIDwgYltzb3J0S2V5XSkgcmV0dXJuIC0xO1xyXG4gICAgICAgIGVsc2UgaWYgKGFbc29ydEtleV0gPiBiW3NvcnRLZXldKSByZXR1cm4gMTtcclxuICAgICAgICBlbHNlIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzb3J0ZWQgPSBudW1iZXJBcnJheS5jb25jYXQoc3RyaW5nQXJyYXkpO1xyXG4gICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2FzYycgPyBzb3J0ZWQgOiBzb3J0ZWQucmV2ZXJzZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=
|