@provoly/dashboard 1.2.7 → 1.2.9

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 (71) hide show
  1. package/admin/admin.module.d.ts +16 -15
  2. package/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.d.ts +5 -16
  3. package/admin/components/admin-dataset/{shared/admin-form-dataset → admin-form-dataset}/admin-form-dataset.component.d.ts +8 -7
  4. package/admin/components/admin-dataset/store/admin-dataset.actions.d.ts +23 -18
  5. package/admin/components/admin-dataset/store/admin-dataset.effects.d.ts +9 -6
  6. package/admin/components/admin-dataset/store/admin-dataset.service.d.ts +2 -1
  7. package/admin/components/shared/add-category-modal/add-category-modal.component.d.ts +39 -0
  8. package/admin/i18n/en.translations.d.ts +23 -8
  9. package/admin/i18n/fr.translations.d.ts +23 -8
  10. package/dataset/components/dataset.component.d.ts +6 -2
  11. package/dataset/dataset.module.d.ts +1 -1
  12. package/dataset/i18n/en.translations.d.ts +8 -0
  13. package/dataset/i18n/fr.translations.d.ts +8 -0
  14. package/dataset/style/_o-pry-dataset-card.scss +19 -11
  15. package/dataset/style/_o-pry-dataset.scss +43 -11
  16. package/esm2022/admin/admin.module.mjs +7 -4
  17. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +22 -53
  18. package/esm2022/admin/components/admin-dataset/admin-edit-dataset/admin-edit-dataset.component.mjs +1 -1
  19. package/esm2022/admin/components/admin-dataset/admin-form-dataset/admin-form-dataset.component.mjs +115 -0
  20. package/esm2022/admin/components/admin-dataset/admin-new-dataset/admin-new-dataset.component.mjs +1 -1
  21. package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +3 -3
  22. package/esm2022/admin/components/admin-dataset/store/admin-dataset.actions.mjs +11 -10
  23. package/esm2022/admin/components/admin-dataset/store/admin-dataset.effects.mjs +2 -1
  24. package/esm2022/admin/components/admin-dataset/store/admin-dataset.service.mjs +10 -4
  25. package/esm2022/admin/components/shared/add-category-modal/add-category-modal.component.mjs +73 -0
  26. package/esm2022/admin/i18n/en.translations.mjs +25 -10
  27. package/esm2022/admin/i18n/fr.translations.mjs +26 -11
  28. package/esm2022/dataset/components/dataset-card/dataset-card.component.mjs +6 -6
  29. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +3 -3
  30. package/esm2022/dataset/components/dataset.component.mjs +16 -6
  31. package/esm2022/dataset/dataset.module.mjs +8 -5
  32. package/esm2022/dataset/i18n/en.translations.mjs +9 -1
  33. package/esm2022/dataset/i18n/fr.translations.mjs +10 -2
  34. package/esm2022/dataset/style/css.component.mjs +2 -2
  35. package/esm2022/lib/core/components/share/access-rights-share/access-rights-share.component.mjs +1 -3
  36. package/esm2022/lib/core/components/share/access-rights-share-modal/access-rights-share-modal.component.mjs +11 -9
  37. package/esm2022/lib/core/components/share/share.utils.mjs +7 -4
  38. package/esm2022/lib/core/store/data-source/data-source.actions.mjs +4 -2
  39. package/esm2022/lib/core/store/data-source/data-source.effects.mjs +4 -1
  40. package/esm2022/lib/core/store/data-source/data-source.model.mjs +1 -1
  41. package/esm2022/lib/core/store/data-source/data-source.reducer.mjs +6 -2
  42. package/esm2022/lib/core/store/data-source/data-source.selectors.mjs +4 -2
  43. package/esm2022/lib/core/store/data-source/data-source.service.mjs +6 -1
  44. package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +3 -3
  45. package/esm2022/toolbox/components/save-view/save-view.component.mjs +7 -1
  46. package/esm2022/toolbox/shared/presentation-form/presentation-form.component.mjs +3 -3
  47. package/fesm2022/provoly-dashboard-admin.mjs +194 -105
  48. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  49. package/fesm2022/provoly-dashboard-dataset.mjs +45 -16
  50. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  51. package/fesm2022/provoly-dashboard-presentation.mjs +2 -2
  52. package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
  53. package/fesm2022/provoly-dashboard-toolbox.mjs +8 -2
  54. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  55. package/fesm2022/provoly-dashboard.mjs +50 -16
  56. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  57. package/lib/core/components/share/share.utils.d.ts +1 -1
  58. package/lib/core/store/data-source/data-source.actions.d.ts +7 -0
  59. package/lib/core/store/data-source/data-source.effects.d.ts +3 -0
  60. package/lib/core/store/data-source/data-source.model.d.ts +3 -0
  61. package/lib/core/store/data-source/data-source.reducer.d.ts +2 -0
  62. package/lib/core/store/data-source/data-source.selectors.d.ts +1 -0
  63. package/lib/core/store/data-source/data-source.service.d.ts +2 -0
  64. package/package.json +48 -48
  65. package/styles/base/_typography.scss +4 -0
  66. package/styles/base/_utils.scss +27 -1
  67. package/styles/components/_a-btn.scss +4 -0
  68. package/styles/components/_a-chip.scss +1 -0
  69. package/styles/components/_o-modal.scss +0 -42
  70. package/styles/layout/_o-base-layout.scss +1 -7
  71. package/esm2022/admin/components/admin-dataset/shared/admin-form-dataset/admin-form-dataset.component.mjs +0 -99
@@ -10,7 +10,7 @@ export declare const WRITE_ACCESS = "WRITE";
10
10
  export declare const getGroupLabel: (group: Group, i18n: PryI18nService) => string;
11
11
  export declare const getGroupLabelByName: (groupName: string, i18n: PryI18nService) => string;
12
12
  export declare const canManifestBeMadePublic: (manifest: ManifestDescription, datasets: Dataset[]) => boolean;
13
- export declare const getCommonDatasourceGroupsForManifest: (manifest: ManifestDescription, datasets: Dataset[]) => string[];
13
+ export declare const getCommonDatasourceGroupsForManifest: (manifest: ManifestDescription, datasets: Dataset[], allGroups: Group[]) => string[];
14
14
  export declare const getAccessRightsArrayByGroup: (accessByGroup: {
15
15
  [key: string]: string;
16
16
  }) => {
@@ -2,6 +2,7 @@ import { DatasetPreview } from '../../model/dataset.interface';
2
2
  import { MonoClassSearchPayload } from '../../model/search-mono-class.model';
3
3
  import { FullTextSearchPayload, MultiClassSearchPayload } from '../../model/search-multi-class.model';
4
4
  import { Dataset, DatasetVersion, NamedQuery, PryVisibilityType } from './data-source.model';
5
+ import { Category } from '../category/category.interface';
5
6
  export declare const DataSourceActions: {
6
7
  load: import("@ngrx/store").ActionCreator<"[Datasource] load", () => import("@ngrx/store/src/models").TypedAction<"[Datasource] load">>;
7
8
  namedQuery: {
@@ -191,5 +192,11 @@ export declare const DataSourceActions: {
191
192
  }) => {
192
193
  err: any;
193
194
  } & import("@ngrx/store/src/models").TypedAction<"[Dataset] Delete datasetVersion failure">>;
195
+ getCategories: import("@ngrx/store").ActionCreator<"[Dataset] Get Categories", () => import("@ngrx/store/src/models").TypedAction<"[Dataset] Get Categories">>;
196
+ getCategoriesSuccess: import("@ngrx/store").ActionCreator<"[Dataset] Get Categories Success", (props: {
197
+ categories: Category[];
198
+ }) => {
199
+ categories: Category[];
200
+ } & import("@ngrx/store/src/models").TypedAction<"[Dataset] Get Categories Success">>;
194
201
  };
195
202
  };
@@ -85,6 +85,9 @@ export declare class DataSourceEffects {
85
85
  } & import("@ngrx/store/src/models").TypedAction<"[Dataset] Get Dataset Versions by Dataset Id">) | ({
86
86
  err: any;
87
87
  } & import("@ngrx/store/src/models").TypedAction<"[Dataset] Delete datasetVersion failure">)> & import("@ngrx/effects").CreateEffectMetadata;
88
+ getCategories$: import("rxjs").Observable<{
89
+ categories: import("@provoly/dashboard").Category[];
90
+ } & import("@ngrx/store/src/models").TypedAction<"[Dataset] Get Categories Success">> & import("@ngrx/effects").CreateEffectMetadata;
88
91
  static ɵfac: i0.ɵɵFactoryDeclaration<DataSourceEffects, never>;
89
92
  static ɵprov: i0.ɵɵInjectableDeclaration<DataSourceEffects>;
90
93
  }
@@ -2,6 +2,7 @@ import { MetadataValue } from '../../model/admin-api.model';
2
2
  import { PryDatasetType } from '../../model/dataset.interface';
3
3
  import { MonoClassSearchPayload } from '../../model/search-mono-class.model';
4
4
  import { FullTextSearchPayload, MultiClassSearchPayload } from '../../model/search-multi-class.model';
5
+ import { Category } from '../category/category.interface';
5
6
  export type DataSource = NamedQuery | Dataset;
6
7
  export interface NamedQuery extends DescriptionQuery {
7
8
  sourceType: 'namedQuery';
@@ -33,6 +34,8 @@ export interface Dataset extends DescriptionQuery {
33
34
  type: PryDatasetType;
34
35
  owner?: boolean;
35
36
  groups?: string[];
37
+ slug: string;
38
+ categories?: Category[];
36
39
  }
37
40
  export interface DatasetVersion {
38
41
  id: string;
@@ -1,5 +1,6 @@
1
1
  import { DatasetPreview } from '../../model/dataset.interface';
2
2
  import { Dataset, DatasetVersion, NamedQuery } from './data-source.model';
3
+ import { Category } from '../category/category.interface';
3
4
  export declare const dataSourceFeatureKey = "@pry/datasources";
4
5
  export interface DataSourceState {
5
6
  isLoading: boolean;
@@ -15,6 +16,7 @@ export interface DataSourceState {
15
16
  datasetVersions: DatasetVersion[];
16
17
  selectedDatasetVersion: DatasetVersion | null;
17
18
  previews: DatasetPreview[];
19
+ categories: Category[];
18
20
  }
19
21
  export declare const initialDataSourceState: DataSourceState;
20
22
  export declare const dataSourceReducer: import("@ngrx/store").ActionReducer<DataSourceState, import("@ngrx/store").Action>;
@@ -25,4 +25,5 @@ export declare const DataSourceSelectors: {
25
25
  datasetVersions: MemoizedSelector<object, DatasetVersion[], (s1: DataSourceState) => DatasetVersion[]>;
26
26
  matchingDatasetVersions: (datasetId: string) => MemoizedSelector<any, DatasetVersion[], import("@ngrx/store").DefaultProjectorFn<DatasetVersion[]>>;
27
27
  datasetPreviews: MemoizedSelector<object, import("@provoly/dashboard").DatasetPreview[], (s1: DataSourceState) => import("@provoly/dashboard").DatasetPreview[]>;
28
+ categories: MemoizedSelector<object, import("@provoly/dashboard").Category[], (s1: DataSourceState) => import("@provoly/dashboard").Category[]>;
28
29
  };
@@ -6,6 +6,7 @@ import { DatasetPreview } from '../../model/dataset.interface';
6
6
  import { ConfigState } from '../config/config.reducer';
7
7
  import { Dataset, DatasetVersion, NamedQuery } from './data-source.model';
8
8
  import { DataSourceState } from './data-source.reducer';
9
+ import { Category } from '../category/category.interface';
9
10
  import * as i0 from "@angular/core";
10
11
  export interface ResponseRequest {
11
12
  data: {
@@ -31,6 +32,7 @@ export declare class DataSourceService {
31
32
  getLastActiveDatasetVersion(datasetId: string): Observable<DatasetVersion>;
32
33
  updateDatasetVersionInfo(version: Partial<DatasetVersion>): Observable<DatasetVersion>;
33
34
  deleteDatasetVersion(version: DatasetVersion): Observable<void>;
35
+ getCategories(): Observable<Category[]>;
34
36
  static ɵfac: i0.ɵɵFactoryDeclaration<DataSourceService, never>;
35
37
  static ɵprov: i0.ɵɵInjectableDeclaration<DataSourceService>;
36
38
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@provoly/dashboard",
3
- "version": "1.2.7",
3
+ "version": "1.2.9",
4
4
  "type": "commonjs",
5
5
  "peerDependencies": {
6
6
  "@angular/cdk": "16.x || 17.x",
@@ -132,6 +132,36 @@
132
132
  "esm": "./esm2022/toolbox/provoly-dashboard-toolbox.mjs",
133
133
  "default": "./fesm2022/provoly-dashboard-toolbox.mjs"
134
134
  },
135
+ "./filters/autocomplete": {
136
+ "types": "./filters/autocomplete/index.d.ts",
137
+ "esm2022": "./esm2022/filters/autocomplete/provoly-dashboard-filters-autocomplete.mjs",
138
+ "esm": "./esm2022/filters/autocomplete/provoly-dashboard-filters-autocomplete.mjs",
139
+ "default": "./fesm2022/provoly-dashboard-filters-autocomplete.mjs"
140
+ },
141
+ "./filters/date": {
142
+ "types": "./filters/date/index.d.ts",
143
+ "esm2022": "./esm2022/filters/date/provoly-dashboard-filters-date.mjs",
144
+ "esm": "./esm2022/filters/date/provoly-dashboard-filters-date.mjs",
145
+ "default": "./fesm2022/provoly-dashboard-filters-date.mjs"
146
+ },
147
+ "./filters/list": {
148
+ "types": "./filters/list/index.d.ts",
149
+ "esm2022": "./esm2022/filters/list/provoly-dashboard-filters-list.mjs",
150
+ "esm": "./esm2022/filters/list/provoly-dashboard-filters-list.mjs",
151
+ "default": "./fesm2022/provoly-dashboard-filters-list.mjs"
152
+ },
153
+ "./filters/number": {
154
+ "types": "./filters/number/index.d.ts",
155
+ "esm2022": "./esm2022/filters/number/provoly-dashboard-filters-number.mjs",
156
+ "esm": "./esm2022/filters/number/provoly-dashboard-filters-number.mjs",
157
+ "default": "./fesm2022/provoly-dashboard-filters-number.mjs"
158
+ },
159
+ "./filters/text": {
160
+ "types": "./filters/text/index.d.ts",
161
+ "esm2022": "./esm2022/filters/text/provoly-dashboard-filters-text.mjs",
162
+ "esm": "./esm2022/filters/text/provoly-dashboard-filters-text.mjs",
163
+ "default": "./fesm2022/provoly-dashboard-filters-text.mjs"
164
+ },
135
165
  "./components/card": {
136
166
  "types": "./components/card/index.d.ts",
137
167
  "esm2022": "./esm2022/components/card/provoly-dashboard-components-card.mjs",
@@ -174,65 +204,35 @@
174
204
  "esm": "./esm2022/components/metadata-editor/provoly-dashboard-components-metadata-editor.mjs",
175
205
  "default": "./fesm2022/provoly-dashboard-components-metadata-editor.mjs"
176
206
  },
177
- "./components/scheme-picker": {
178
- "types": "./components/scheme-picker/index.d.ts",
179
- "esm2022": "./esm2022/components/scheme-picker/provoly-dashboard-components-scheme-picker.mjs",
180
- "esm": "./esm2022/components/scheme-picker/provoly-dashboard-components-scheme-picker.mjs",
181
- "default": "./fesm2022/provoly-dashboard-components-scheme-picker.mjs"
182
- },
183
207
  "./components/page-loader": {
184
208
  "types": "./components/page-loader/index.d.ts",
185
209
  "esm2022": "./esm2022/components/page-loader/provoly-dashboard-components-page-loader.mjs",
186
210
  "esm": "./esm2022/components/page-loader/provoly-dashboard-components-page-loader.mjs",
187
211
  "default": "./fesm2022/provoly-dashboard-components-page-loader.mjs"
188
212
  },
213
+ "./components/scheme-picker": {
214
+ "types": "./components/scheme-picker/index.d.ts",
215
+ "esm2022": "./esm2022/components/scheme-picker/provoly-dashboard-components-scheme-picker.mjs",
216
+ "esm": "./esm2022/components/scheme-picker/provoly-dashboard-components-scheme-picker.mjs",
217
+ "default": "./fesm2022/provoly-dashboard-components-scheme-picker.mjs"
218
+ },
189
219
  "./components/sinceDate": {
190
220
  "types": "./components/sinceDate/index.d.ts",
191
221
  "esm2022": "./esm2022/components/sinceDate/provoly-dashboard-components-sinceDate.mjs",
192
222
  "esm": "./esm2022/components/sinceDate/provoly-dashboard-components-sinceDate.mjs",
193
223
  "default": "./fesm2022/provoly-dashboard-components-sinceDate.mjs"
194
224
  },
195
- "./components/text-editor": {
196
- "types": "./components/text-editor/index.d.ts",
197
- "esm2022": "./esm2022/components/text-editor/provoly-dashboard-components-text-editor.mjs",
198
- "esm": "./esm2022/components/text-editor/provoly-dashboard-components-text-editor.mjs",
199
- "default": "./fesm2022/provoly-dashboard-components-text-editor.mjs"
200
- },
201
225
  "./components/stepper": {
202
226
  "types": "./components/stepper/index.d.ts",
203
227
  "esm2022": "./esm2022/components/stepper/provoly-dashboard-components-stepper.mjs",
204
228
  "esm": "./esm2022/components/stepper/provoly-dashboard-components-stepper.mjs",
205
229
  "default": "./fesm2022/provoly-dashboard-components-stepper.mjs"
206
230
  },
207
- "./filters/autocomplete": {
208
- "types": "./filters/autocomplete/index.d.ts",
209
- "esm2022": "./esm2022/filters/autocomplete/provoly-dashboard-filters-autocomplete.mjs",
210
- "esm": "./esm2022/filters/autocomplete/provoly-dashboard-filters-autocomplete.mjs",
211
- "default": "./fesm2022/provoly-dashboard-filters-autocomplete.mjs"
212
- },
213
- "./filters/date": {
214
- "types": "./filters/date/index.d.ts",
215
- "esm2022": "./esm2022/filters/date/provoly-dashboard-filters-date.mjs",
216
- "esm": "./esm2022/filters/date/provoly-dashboard-filters-date.mjs",
217
- "default": "./fesm2022/provoly-dashboard-filters-date.mjs"
218
- },
219
- "./filters/list": {
220
- "types": "./filters/list/index.d.ts",
221
- "esm2022": "./esm2022/filters/list/provoly-dashboard-filters-list.mjs",
222
- "esm": "./esm2022/filters/list/provoly-dashboard-filters-list.mjs",
223
- "default": "./fesm2022/provoly-dashboard-filters-list.mjs"
224
- },
225
- "./filters/number": {
226
- "types": "./filters/number/index.d.ts",
227
- "esm2022": "./esm2022/filters/number/provoly-dashboard-filters-number.mjs",
228
- "esm": "./esm2022/filters/number/provoly-dashboard-filters-number.mjs",
229
- "default": "./fesm2022/provoly-dashboard-filters-number.mjs"
230
- },
231
- "./filters/text": {
232
- "types": "./filters/text/index.d.ts",
233
- "esm2022": "./esm2022/filters/text/provoly-dashboard-filters-text.mjs",
234
- "esm": "./esm2022/filters/text/provoly-dashboard-filters-text.mjs",
235
- "default": "./fesm2022/provoly-dashboard-filters-text.mjs"
231
+ "./components/text-editor": {
232
+ "types": "./components/text-editor/index.d.ts",
233
+ "esm2022": "./esm2022/components/text-editor/provoly-dashboard-components-text-editor.mjs",
234
+ "esm": "./esm2022/components/text-editor/provoly-dashboard-components-text-editor.mjs",
235
+ "default": "./fesm2022/provoly-dashboard-components-text-editor.mjs"
236
236
  },
237
237
  "./pipeline-components/filter": {
238
238
  "types": "./pipeline-components/filter/index.d.ts",
@@ -300,18 +300,18 @@
300
300
  "esm": "./esm2022/widgets/widget-detail/provoly-dashboard-widgets-widget-detail.mjs",
301
301
  "default": "./fesm2022/provoly-dashboard-widgets-widget-detail.mjs"
302
302
  },
303
- "./widgets/widget-iframe": {
304
- "types": "./widgets/widget-iframe/index.d.ts",
305
- "esm2022": "./esm2022/widgets/widget-iframe/provoly-dashboard-widgets-widget-iframe.mjs",
306
- "esm": "./esm2022/widgets/widget-iframe/provoly-dashboard-widgets-widget-iframe.mjs",
307
- "default": "./fesm2022/provoly-dashboard-widgets-widget-iframe.mjs"
308
- },
309
303
  "./widgets/widget-graph": {
310
304
  "types": "./widgets/widget-graph/index.d.ts",
311
305
  "esm2022": "./esm2022/widgets/widget-graph/provoly-dashboard-widgets-widget-graph.mjs",
312
306
  "esm": "./esm2022/widgets/widget-graph/provoly-dashboard-widgets-widget-graph.mjs",
313
307
  "default": "./fesm2022/provoly-dashboard-widgets-widget-graph.mjs"
314
308
  },
309
+ "./widgets/widget-iframe": {
310
+ "types": "./widgets/widget-iframe/index.d.ts",
311
+ "esm2022": "./esm2022/widgets/widget-iframe/provoly-dashboard-widgets-widget-iframe.mjs",
312
+ "esm": "./esm2022/widgets/widget-iframe/provoly-dashboard-widgets-widget-iframe.mjs",
313
+ "default": "./fesm2022/provoly-dashboard-widgets-widget-iframe.mjs"
314
+ },
315
315
  "./widgets/widget-image": {
316
316
  "types": "./widgets/widget-image/index.d.ts",
317
317
  "esm2022": "./esm2022/widgets/widget-image/provoly-dashboard-widgets-widget-image.mjs",
@@ -23,3 +23,7 @@ h4 {
23
23
  margin: 0;
24
24
  padding-bottom: toRem(10);
25
25
  }
26
+
27
+ .-italic {
28
+ font-style: italic;
29
+ }
@@ -36,6 +36,10 @@
36
36
  }
37
37
  }
38
38
 
39
+ .u-txt-left {
40
+ text-align: left;
41
+ }
42
+
39
43
  .u-txt-center {
40
44
  text-align: center;
41
45
  }
@@ -49,14 +53,22 @@
49
53
  align-items: center;
50
54
  }
51
55
 
52
- &.-align-start{
56
+ &.-align-start {
53
57
  align-items: flex-start;
54
58
  }
55
59
 
60
+ &.-justify-start {
61
+ justify-content: flex-start;
62
+ }
63
+
56
64
  &.-justify-center {
57
65
  justify-content: center;
58
66
  }
59
67
 
68
+ &.-justify-end {
69
+ justify-content: flex-end;
70
+ }
71
+
60
72
  &.-justify-space-between {
61
73
  justify-content: space-between;
62
74
  }
@@ -69,14 +81,28 @@
69
81
  flex-direction: row;
70
82
  }
71
83
 
84
+ &.-wrap {
85
+ flex-wrap: wrap;
86
+ }
87
+
72
88
  &.-no-gap {
73
89
  gap: 0;
74
90
  }
91
+
75
92
  &.-gap-10 {
76
93
  gap: toRem(10);
77
94
  }
95
+
96
+ &.-gap-20 {
97
+ gap: toRem(20);
98
+ }
78
99
  }
79
100
 
101
+ .u-self-start {
102
+ align-self: start;
103
+ }
104
+
105
+
80
106
  .u-self-center {
81
107
  align-self: center;
82
108
  }
@@ -185,4 +185,8 @@
185
185
  &.-pad-5 {
186
186
  padding: 0 toRem(5);
187
187
  }
188
+
189
+ &.-no-padding {
190
+ padding: 0;
191
+ }
188
192
  }
@@ -11,6 +11,7 @@
11
11
  &.-md {
12
12
  height: toRem(20);
13
13
  font-size: toRem(12);
14
+ padding: toRem(3) toRem(10);
14
15
  }
15
16
 
16
17
  &.-no-wrap {
@@ -72,46 +72,4 @@
72
72
  .m-btn-group {
73
73
  padding-top: toRem(15);
74
74
  }
75
-
76
- // Version of modal with a filter/selector OR item creator (ex. admin/classes/nouvel attribut)
77
- &--selector {
78
- .m-form-label-field.selector {
79
- position: relative;
80
- // Color layer behind field
81
- &:before {
82
- content: '';
83
- position: absolute;
84
- z-index: -1;
85
- top: toRem(-300);
86
- bottom: toRem(-25);
87
- left: toRem(-30);
88
- right: toRem(-30);
89
- }
90
- }
91
-
92
- .a-table {
93
- tbody tr td {
94
- padding: toRem(5);
95
- }
96
-
97
- .a-btn--secondary.select-it {
98
- justify-content: flex-start;
99
- width: 100%;
100
- height: 100%;
101
- padding: toRem(10) toRem(2);
102
- @include outlineOnFocus($border-radius: 2px);
103
- }
104
- }
105
-
106
- .a-p--create {
107
- margin-top: toRem(15);
108
- padding-bottom: toRem(10);
109
- line-height: toRem(21);
110
-
111
- + .a-btn {
112
- left: 50%;
113
- transform: translateX(-50%);
114
- }
115
- }
116
- }
117
75
  }
@@ -101,19 +101,13 @@
101
101
 
102
102
  &.is-open {
103
103
  overflow: hidden;
104
- width: toRem(320);
104
+ width: 30rem;
105
105
  -webkit-transition: width ease-in-out 0.6s;
106
106
  transition: width ease-in-out 0.6s;
107
107
 
108
108
  .o-base-layout__panel__content {
109
109
  display: block;
110
- }
111
-
112
- &.-model {
113
110
  width: 30rem;
114
- .o-base-layout__panel__content {
115
- width: 30rem;
116
- }
117
111
  }
118
112
  }
119
113
  }
@@ -1,99 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import { ClassActions, ClassSelectors, DataSourceActions, DataSourceSelectors, PryDatasetType } from '@provoly/dashboard';
4
- import { Subscription } from 'rxjs';
5
- import { v4 as uuidv4 } from 'uuid';
6
- import { AdminActions } from '../../../../store/admin.actions';
7
- import { AdminDatasetActions } from '../../store/admin-dataset.actions';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@ngrx/store";
10
- import * as i2 from "@angular/router";
11
- import * as i3 from "@angular/forms";
12
- import * as i4 from "@angular/common";
13
- import * as i5 from "@provoly/dashboard";
14
- export class AdminFormDatasetComponent {
15
- constructor(store, router, route, formBuilder) {
16
- this.store = store;
17
- this.router = router;
18
- this.route = route;
19
- this.formBuilder = formBuilder;
20
- this.datasetList = [];
21
- this.datasetTypes = [];
22
- this.sub = new Subscription();
23
- this.isSameName = false;
24
- this.isSubmitted = false;
25
- this.store.dispatch(ClassActions.load());
26
- this.store.dispatch(DataSourceActions.dataset.loadDataset());
27
- this.datasetList$ = this.store.select(DataSourceSelectors.datasets);
28
- this.classes = this.store.select(ClassSelectors.classes);
29
- this.form = this.formBuilder.group({
30
- id: [uuidv4()],
31
- name: ['', [Validators.required, Validators.maxLength(100)]],
32
- oClass: ['', [Validators.required]],
33
- type: ['', [Validators.required]],
34
- description: ['', [Validators.maxLength(500)]]
35
- });
36
- }
37
- ngOnInit() {
38
- this.isSameName = false;
39
- this.sub = this.datasetList$.subscribe((dataset) => {
40
- this.datasetList = dataset;
41
- });
42
- this.datasetTypes = Object.keys(PryDatasetType).map((label) => ({
43
- label: '@pry.admin.dataset.' + label,
44
- value: label
45
- }));
46
- this.sub.add(this.dataset$?.subscribe((dataset) => {
47
- if (dataset) {
48
- this.form.patchValue({
49
- id: dataset.id,
50
- name: dataset.name,
51
- oClass: dataset.oClass,
52
- type: dataset.type,
53
- description: dataset.description
54
- });
55
- }
56
- }));
57
- }
58
- ngOnDestroy() {
59
- this.sub.unsubscribe();
60
- }
61
- goBack() {
62
- this.store.dispatch(AdminActions.routeTo({ path: this.getPath() }));
63
- }
64
- getPath() {
65
- let path = this.router.createUrlTree(['..'], { relativeTo: this.route });
66
- if (this.dataset$) {
67
- path = this.router.createUrlTree(['../..'], { relativeTo: this.route });
68
- }
69
- return path.toString();
70
- }
71
- changeValueName(value) {
72
- this.isSameName = false;
73
- }
74
- submit() {
75
- this.isSubmitted = true;
76
- if (this.form.valid) {
77
- this.isSubmitted = false;
78
- if (this.dataset$) {
79
- const path = this.router.createUrlTree(['../..'], { relativeTo: this.route });
80
- this.store.dispatch(AdminDatasetActions.update({ dataset: this.form.value, route: path.toString() }));
81
- return;
82
- }
83
- const path = this.router.createUrlTree(['..'], { relativeTo: this.route });
84
- this.isSameName = !!this.datasetList.find((dataset) => this.form.get('name')?.value.toLowerCase() === dataset.name.toLowerCase());
85
- if (!this.isSameName) {
86
- this.store.dispatch(AdminDatasetActions.create({ dataset: this.form.value, route: path.toString() }));
87
- }
88
- }
89
- }
90
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AdminFormDatasetComponent, deps: [{ token: i1.Store }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
91
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: AdminFormDatasetComponent, selector: "pry-admin-form-dataset", inputs: { dataset$: "dataset$" }, ngImport: i0, template: "<form class=\"o-form\" [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"name-label\" for=\"name\">\n {{ '@pry.admin.dataset.name' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"a-form-field\"\n formControlName=\"name\"\n (ngModelChange)=\"changeValueName($event)\"\n [attr.aria-labelledby]=\"isSubmitted && form.get('name')?.invalid ? 'name-label name-error' : 'name-label'\"\n [attr.aria-invalid]=\"isSubmitted && form.get('name')?.invalid\"\n required\n />\n <label\n class=\"a-label a-label--help -error\"\n id=\"name-error\"\n for=\"name\"\n *ngIf=\"isSubmitted && form.get('name')?.invalid\"\n >{{ '@pry.admin.required' | i18n }}</label\n >\n </div>\n\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"description-label\" for=\"description\">{{ '@pry.admin.fields.description' | i18n }}</label>\n <textarea\n class=\"-resizable-both\"\n formControlName=\"description\"\n name=\"description\"\n id=\"description\"\n maxlength=\"500\"\n ></textarea>\n <label\n for=\"description\"\n *ngIf=\"form.get('description')?.hasError('maxlength')\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.presentation.maxLength' | i18n : { len: '500' } }}\n </label>\n </div>\n\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"item-label\" for=\"class\">{{ '@pry.admin.dataset.oClass' | i18n }}</label>\n <pry-select\n id=\"class\"\n formControlName=\"oClass\"\n [items]=\"classes | async\"\n bindValue=\"id\"\n bindLabel=\"name\"\n [isForm]=\"true\"\n aria-labelledby=\"item-label\"\n [readonly]=\"!!dataset$\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"user-label\" for=\"type\">{{ '@pry.admin.dataset.type' | i18n }}</label>\n <pry-select\n id=\"type\"\n formControlName=\"type\"\n [items]=\"datasetTypes\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [isForm]=\"true\"\n aria-labelledby=\"user-label\"\n [readonly]=\"!!dataset$\"\n ></pry-select>\n </div>\n\n <label class=\"a-label a-label--help -error\" *ngIf=\"isSameName\">{{ '@pry.admin.dataset.is-same-name' | i18n }}</label>\n\n <div class=\"m-btn-group -width-sm\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--secondary\"\n (click)=\"goBack()\"\n [innerHTML]=\"'@pry.admin.cancel' | i18n\"\n ></button>\n <button\n class=\"a-btn a-btn--primary\"\n type=\"submit\"\n [innerHTML]=\"(dataset$ ? '@pry.admin.edit' : '@pry.admin.create') | i18n\"\n ></button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] }); }
92
- }
93
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AdminFormDatasetComponent, decorators: [{
94
- type: Component,
95
- args: [{ selector: 'pry-admin-form-dataset', template: "<form class=\"o-form\" [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"name-label\" for=\"name\">\n {{ '@pry.admin.dataset.name' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"a-form-field\"\n formControlName=\"name\"\n (ngModelChange)=\"changeValueName($event)\"\n [attr.aria-labelledby]=\"isSubmitted && form.get('name')?.invalid ? 'name-label name-error' : 'name-label'\"\n [attr.aria-invalid]=\"isSubmitted && form.get('name')?.invalid\"\n required\n />\n <label\n class=\"a-label a-label--help -error\"\n id=\"name-error\"\n for=\"name\"\n *ngIf=\"isSubmitted && form.get('name')?.invalid\"\n >{{ '@pry.admin.required' | i18n }}</label\n >\n </div>\n\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"description-label\" for=\"description\">{{ '@pry.admin.fields.description' | i18n }}</label>\n <textarea\n class=\"-resizable-both\"\n formControlName=\"description\"\n name=\"description\"\n id=\"description\"\n maxlength=\"500\"\n ></textarea>\n <label\n for=\"description\"\n *ngIf=\"form.get('description')?.hasError('maxlength')\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.presentation.maxLength' | i18n : { len: '500' } }}\n </label>\n </div>\n\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"item-label\" for=\"class\">{{ '@pry.admin.dataset.oClass' | i18n }}</label>\n <pry-select\n id=\"class\"\n formControlName=\"oClass\"\n [items]=\"classes | async\"\n bindValue=\"id\"\n bindLabel=\"name\"\n [isForm]=\"true\"\n aria-labelledby=\"item-label\"\n [readonly]=\"!!dataset$\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field -width-sm\">\n <label class=\"a-label\" id=\"user-label\" for=\"type\">{{ '@pry.admin.dataset.type' | i18n }}</label>\n <pry-select\n id=\"type\"\n formControlName=\"type\"\n [items]=\"datasetTypes\"\n bindValue=\"value\"\n bindLabel=\"label\"\n [isForm]=\"true\"\n aria-labelledby=\"user-label\"\n [readonly]=\"!!dataset$\"\n ></pry-select>\n </div>\n\n <label class=\"a-label a-label--help -error\" *ngIf=\"isSameName\">{{ '@pry.admin.dataset.is-same-name' | i18n }}</label>\n\n <div class=\"m-btn-group -width-sm\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--secondary\"\n (click)=\"goBack()\"\n [innerHTML]=\"'@pry.admin.cancel' | i18n\"\n ></button>\n <button\n class=\"a-btn a-btn--primary\"\n type=\"submit\"\n [innerHTML]=\"(dataset$ ? '@pry.admin.edit' : '@pry.admin.create') | i18n\"\n ></button>\n </div>\n</form>\n" }]
96
- }], ctorParameters: () => [{ type: i1.Store }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.UntypedFormBuilder }], propDecorators: { dataset$: [{
97
- type: Input
98
- }] } });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tZm9ybS1kYXRhc2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL2FkbWluL2NvbXBvbmVudHMvYWRtaW4tZGF0YXNldC9zaGFyZWQvYWRtaW4tZm9ybS1kYXRhc2V0L2FkbWluLWZvcm0tZGF0YXNldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9hZG1pbi9jb21wb25lbnRzL2FkbWluLWRhdGFzZXQvc2hhcmVkL2FkbWluLWZvcm0tZGF0YXNldC9hZG1pbi1mb3JtLWRhdGFzZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBd0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbEYsT0FBTyxFQUVMLFlBQVksRUFDWixjQUFjLEVBRWQsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUVuQixjQUFjLEVBQ2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7OztBQU14RSxNQUFNLE9BQU8seUJBQXlCO0lBZXBDLFlBQ1UsS0FBNkIsRUFDN0IsTUFBYyxFQUNkLEtBQXFCLEVBQ3JCLFdBQStCO1FBSC9CLFVBQUssR0FBTCxLQUFLLENBQXdCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxV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LENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUN2QyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQ3ZGLENBQUM7WUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7OEdBL0ZVLHlCQUF5QjtrR0FBekIseUJBQXlCLGdHQ3ZCdEMsNDRGQXVGQTs7MkZEaEVhLHlCQUF5QjtrQkFKckMsU0FBUzsrQkFDRSx3QkFBd0I7NkpBSXpCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7XG4gIENsYXNzLFxuICBDbGFzc0FjdGlvbnMsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBEYXRhc2V0LFxuICBEYXRhU291cmNlQWN0aW9ucyxcbiAgRGF0YVNvdXJjZVNlbGVjdG9ycyxcbiAgRGF0YVNvdXJjZVN0YXRlLFxuICBQcnlEYXRhc2V0VHlwZVxufSBmcm9tICdAcHJvdm9seS9kYXNoYm9hcmQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IEFkbWluQWN0aW9ucyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0b3JlL2FkbWluLmFjdGlvbnMnO1xuaW1wb3J0IHsgQWRtaW5EYXRhc2V0QWN0aW9ucyB9IGZyb20gJy4uLy4uL3N0b3JlL2FkbWluLWRhdGFzZXQuYWN0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1hZG1pbi1mb3JtLWRhdGFzZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRtaW4tZm9ybS1kYXRhc2V0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBZG1pbkZvcm1EYXRhc2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBkYXRhc2V0JD86IE9ic2VydmFibGU8RGF0YXNldCB8IG51bGw+O1xuXG4gIGRhdGFzZXRMaXN0JDogT2JzZXJ2YWJsZTxEYXRhc2V0W10+O1xuICBkYXRhc2V0TGlzdDogRGF0YXNldFtdID0gW107XG4gIGRhdGFzZXRUeXBlczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICBjbGFzc2VzOiBPYnNlcnZhYmxlPENsYXNzW10+O1xuXG4gIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIGlzU2FtZU5hbWUgPSBmYWxzZTtcbiAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZTxEYXRhU291cmNlU3RhdGU+LFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyXG4gICkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ2xhc3NBY3Rpb25zLmxvYWQoKSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXRhU291cmNlQWN0aW9ucy5kYXRhc2V0LmxvYWREYXRhc2V0KCkpO1xuICAgIHRoaXMuZGF0YXNldExpc3QkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGF0YVNvdXJjZVNlbGVjdG9ycy5kYXRhc2V0cyk7XG4gICAgdGhpcy5jbGFzc2VzID0gdGhpcy5zdG9yZS5zZWxlY3QoQ2xhc3NTZWxlY3RvcnMuY2xhc3Nlcyk7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBpZDogW3V1aWR2NCgpXSxcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldXSxcbiAgICAgIG9DbGFzczogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgdHlwZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwMCldXVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1NhbWVOYW1lID0gZmFsc2U7XG4gICAgdGhpcy5zdWIgPSB0aGlzLmRhdGFzZXRMaXN0JC5zdWJzY3JpYmUoKGRhdGFzZXQpID0+IHtcbiAgICAgIHRoaXMuZGF0YXNldExpc3QgPSBkYXRhc2V0O1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YXNldFR5cGVzID0gT2JqZWN0LmtleXMoUHJ5RGF0YXNldFR5cGUpLm1hcCgobGFiZWwpID0+ICh7XG4gICAgICBsYWJlbDogJ0BwcnkuYWRtaW4uZGF0YXNldC4nICsgbGFiZWwsXG4gICAgICB2YWx1ZTogbGFiZWxcbiAgICB9KSk7XG4gICAgdGhpcy5zdWIuYWRkKFxuICAgICAgdGhpcy5kYXRhc2V0JD8uc3Vic2NyaWJlKChkYXRhc2V0OiBEYXRhc2V0IHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoZGF0YXNldCkge1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIGlkOiBkYXRhc2V0LmlkLFxuICAgICAgICAgICAgbmFtZTogZGF0YXNldC5uYW1lLFxuICAgICAgICAgICAgb0NsYXNzOiBkYXRhc2V0Lm9DbGFzcyxcbiAgICAgICAgICAgIHR5cGU6IGRhdGFzZXQudHlwZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhc2V0LmRlc2NyaXB0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnb0JhY2soKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChBZG1pbkFjdGlvbnMucm91dGVUbyh7IHBhdGg6IHRoaXMuZ2V0UGF0aCgpIH0pKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgbGV0IHBhdGggPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFsnLi4nXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIGlmICh0aGlzLmRhdGFzZXQkKSB7XG4gICAgICBwYXRoID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy4uLy4uJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNoYW5nZVZhbHVlTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5pc1NhbWVOYW1lID0gZmFsc2U7XG4gIH1cblxuICBzdWJtaXQoKSB7XG4gICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuZGF0YXNldCQpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoWycuLi8uLiddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQWRtaW5EYXRhc2V0QWN0aW9ucy51cGRhdGUoeyBkYXRhc2V0OiB0aGlzLmZvcm0udmFsdWUsIHJvdXRlOiBwYXRoLnRvU3RyaW5nKCkgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy4uJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgIHRoaXMuaXNTYW1lTmFtZSA9ICEhdGhpcy5kYXRhc2V0TGlzdC5maW5kKFxuICAgICAgICAoZGF0YXNldCkgPT4gdGhpcy5mb3JtLmdldCgnbmFtZScpPy52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBkYXRhc2V0Lm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5pc1NhbWVOYW1lKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQWRtaW5EYXRhc2V0QWN0aW9ucy5jcmVhdGUoeyBkYXRhc2V0OiB0aGlzLmZvcm0udmFsdWUsIHJvdXRlOiBwYXRoLnRvU3RyaW5nKCkgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGZvcm0gY2xhc3M9XCJvLWZvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0KClcIj5cbiAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZCAtd2lkdGgtc21cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgaWQ9XCJuYW1lLWxhYmVsXCIgZm9yPVwibmFtZVwiPlxuICAgICAge3sgJ0BwcnkuYWRtaW4uZGF0YXNldC5uYW1lJyB8IGkxOG4gfX0gKlxuICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPih7eyAnQHByeS5hZG1pbi5yZXF1aXJlZCcgfCBpMThuIH19KTwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgaWQ9XCJuYW1lXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlVmFsdWVOYW1lKCRldmVudClcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCduYW1lJyk/LmludmFsaWQgPyAnbmFtZS1sYWJlbCBuYW1lLWVycm9yJyA6ICduYW1lLWxhYmVsJ1wiXG4gICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaXNTdWJtaXR0ZWQgJiYgZm9ybS5nZXQoJ25hbWUnKT8uaW52YWxpZFwiXG4gICAgICByZXF1aXJlZFxuICAgIC8+XG4gICAgPGxhYmVsXG4gICAgICBjbGFzcz1cImEtbGFiZWwgYS1sYWJlbC0taGVscCAtZXJyb3JcIlxuICAgICAgaWQ9XCJuYW1lLWVycm9yXCJcbiAgICAgIGZvcj1cIm5hbWVcIlxuICAgICAgKm5nSWY9XCJpc1N1Ym1pdHRlZCAmJiBmb3JtLmdldCgnbmFtZScpPy5pbnZhbGlkXCJcbiAgICAgID57eyAnQHByeS5hZG1pbi5yZXF1aXJlZCcgfCBpMThuIH19PC9sYWJlbFxuICAgID5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZCAtd2lkdGgtc21cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgaWQ9XCJkZXNjcmlwdGlvbi1sYWJlbFwiIGZvcj1cImRlc2NyaXB0aW9uXCI+e3sgJ0BwcnkuYWRtaW4uZmllbGRzLmRlc2NyaXB0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgIDx0ZXh0YXJlYVxuICAgICAgY2xhc3M9XCItcmVzaXphYmxlLWJvdGhcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgIGlkPVwiZGVzY3JpcHRpb25cIlxuICAgICAgbWF4bGVuZ3RoPVwiNTAwXCJcbiAgICA+PC90ZXh0YXJlYT5cbiAgICA8bGFiZWxcbiAgICAgIGZvcj1cImRlc2NyaXB0aW9uXCJcbiAgICAgICpuZ0lmPVwiZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/Lmhhc0Vycm9yKCdtYXhsZW5ndGgnKVwiXG4gICAgICBjbGFzcz1cImEtbGFiZWwgYS1sYWJlbC0taGVscCAtZXJyb3JcIlxuICAgID5cbiAgICAgIHt7ICdAcHJ5LnByZXNlbnRhdGlvbi5tYXhMZW5ndGgnIHwgaTE4biA6IHsgbGVuOiAnNTAwJyB9IH19XG4gICAgPC9sYWJlbD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZCAtd2lkdGgtc21cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgaWQ9XCJpdGVtLWxhYmVsXCIgZm9yPVwiY2xhc3NcIj57eyAnQHByeS5hZG1pbi5kYXRhc2V0Lm9DbGFzcycgfCBpMThuIH19PC9sYWJlbD5cbiAgICA8cHJ5LXNlbGVjdFxuICAgICAgaWQ9XCJjbGFzc1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJvQ2xhc3NcIlxuICAgICAgW2l0ZW1zXT1cImNsYXNzZXMgfCBhc3luY1wiXG4gICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgIFtpc0Zvcm1dPVwidHJ1ZVwiXG4gICAgICBhcmlhLWxhYmVsbGVkYnk9XCJpdGVtLWxhYmVsXCJcbiAgICAgIFtyZWFkb25seV09XCIhIWRhdGFzZXQkXCJcbiAgICA+PC9wcnktc2VsZWN0PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkIC13aWR0aC1zbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBpZD1cInVzZXItbGFiZWxcIiBmb3I9XCJ0eXBlXCI+e3sgJ0BwcnkuYWRtaW4uZGF0YXNldC50eXBlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgIDxwcnktc2VsZWN0XG4gICAgICBpZD1cInR5cGVcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXG4gICAgICBbaXRlbXNdPVwiZGF0YXNldFR5cGVzXCJcbiAgICAgIGJpbmRWYWx1ZT1cInZhbHVlXCJcbiAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgIFtpc0Zvcm1dPVwidHJ1ZVwiXG4gICAgICBhcmlhLWxhYmVsbGVkYnk9XCJ1c2VyLWxhYmVsXCJcbiAgICAgIFtyZWFkb25seV09XCIhIWRhdGFzZXQkXCJcbiAgICA+PC9wcnktc2VsZWN0PlxuICA8L2Rpdj5cblxuICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsIGEtbGFiZWwtLWhlbHAgLWVycm9yXCIgKm5nSWY9XCJpc1NhbWVOYW1lXCI+e3sgJ0BwcnkuYWRtaW4uZGF0YXNldC5pcy1zYW1lLW5hbWUnIHwgaTE4biB9fTwvbGFiZWw+XG5cbiAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwIC13aWR0aC1zbVwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tc2Vjb25kYXJ5XCJcbiAgICAgIChjbGljayk9XCJnb0JhY2soKVwiXG4gICAgICBbaW5uZXJIVE1MXT1cIidAcHJ5LmFkbWluLmNhbmNlbCcgfCBpMThuXCJcbiAgICA+PC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIFtpbm5lckhUTUxdPVwiKGRhdGFzZXQkID8gJ0BwcnkuYWRtaW4uZWRpdCcgOiAnQHByeS5hZG1pbi5jcmVhdGUnKSB8IGkxOG5cIlxuICAgID48L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=