@igo2/context 1.14.1 → 1.14.3

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 (127) hide show
  1. package/esm2020/igo2-context.mjs +4 -4
  2. package/esm2020/lib/context-import-export/context-import-export/context-import-export.component.mjs +228 -228
  3. package/esm2020/lib/context-import-export/context-import-export.module.mjs +84 -84
  4. package/esm2020/lib/context-import-export/index.mjs +2 -2
  5. package/esm2020/lib/context-import-export/shared/context-export.errors.mjs +14 -14
  6. package/esm2020/lib/context-import-export/shared/context-export.interface.mjs +1 -1
  7. package/esm2020/lib/context-import-export/shared/context-export.service.mjs +37 -37
  8. package/esm2020/lib/context-import-export/shared/context-export.utils.mjs +23 -23
  9. package/esm2020/lib/context-import-export/shared/context-import.errors.mjs +32 -32
  10. package/esm2020/lib/context-import-export/shared/context-import.service.mjs +78 -78
  11. package/esm2020/lib/context-import-export/shared/context-import.utils.mjs +157 -157
  12. package/esm2020/lib/context-import-export/shared/index.mjs +7 -7
  13. package/esm2020/lib/context-manager/context-edit/context-edit-binding.directive.mjs +53 -53
  14. package/esm2020/lib/context-manager/context-edit/context-edit.component.mjs +45 -45
  15. package/esm2020/lib/context-manager/context-edit/index.mjs +2 -2
  16. package/esm2020/lib/context-manager/context-form/context-form.component.mjs +146 -146
  17. package/esm2020/lib/context-manager/context-form/index.mjs +1 -1
  18. package/esm2020/lib/context-manager/context-item/context-item.component.mjs +244 -244
  19. package/esm2020/lib/context-manager/context-item/index.mjs +1 -1
  20. package/esm2020/lib/context-manager/context-list/context-list-binding.directive.mjs +259 -259
  21. package/esm2020/lib/context-manager/context-list/context-list.component.mjs +591 -591
  22. package/esm2020/lib/context-manager/context-list/context-list.enum.mjs +6 -6
  23. package/esm2020/lib/context-manager/context-list/index.mjs +2 -2
  24. package/esm2020/lib/context-manager/context-manager.module.mjs +161 -161
  25. package/esm2020/lib/context-manager/context-permissions/context-permissions-binding.directive.mjs +115 -115
  26. package/esm2020/lib/context-manager/context-permissions/context-permissions.component.mjs +305 -305
  27. package/esm2020/lib/context-manager/context-permissions/index.mjs +2 -2
  28. package/esm2020/lib/context-manager/index.mjs +6 -6
  29. package/esm2020/lib/context-manager/shared/context.enum.mjs +12 -12
  30. package/esm2020/lib/context-manager/shared/context.interface.mjs +1 -1
  31. package/esm2020/lib/context-manager/shared/context.service.mjs +629 -622
  32. package/esm2020/lib/context-manager/shared/index.mjs +5 -5
  33. package/esm2020/lib/context-manager/shared/layer-context.directive.mjs +145 -145
  34. package/esm2020/lib/context-manager/shared/map-context.directive.mjs +69 -69
  35. package/esm2020/lib/context-map-button/bookmark-button/bookmark-button.component.mjs +71 -71
  36. package/esm2020/lib/context-map-button/bookmark-button/bookmark-dialog.component.mjs +49 -49
  37. package/esm2020/lib/context-map-button/bookmark-button/index.mjs +2 -2
  38. package/esm2020/lib/context-map-button/context-map-button.module.mjs +95 -95
  39. package/esm2020/lib/context-map-button/index.mjs +3 -3
  40. package/esm2020/lib/context-map-button/poi-button/index.mjs +3 -3
  41. package/esm2020/lib/context-map-button/poi-button/poi-button.component.mjs +170 -170
  42. package/esm2020/lib/context-map-button/poi-button/poi-dialog.component.mjs +49 -49
  43. package/esm2020/lib/context-map-button/poi-button/shared/index.mjs +2 -2
  44. package/esm2020/lib/context-map-button/poi-button/shared/poi.interface.mjs +1 -1
  45. package/esm2020/lib/context-map-button/poi-button/shared/poi.service.mjs +32 -32
  46. package/esm2020/lib/context-map-button/user-button/index.mjs +2 -2
  47. package/esm2020/lib/context-map-button/user-button/user-button.animation.mjs +16 -16
  48. package/esm2020/lib/context-map-button/user-button/user-button.component.mjs +103 -103
  49. package/esm2020/lib/context-map-button/user-button/user-dialog.component.mjs +65 -65
  50. package/esm2020/lib/context.module.mjs +44 -44
  51. package/esm2020/lib/share-map/index.mjs +4 -4
  52. package/esm2020/lib/share-map/share-map/share-map-api.component.mjs +180 -180
  53. package/esm2020/lib/share-map/share-map/share-map-url.component.mjs +242 -242
  54. package/esm2020/lib/share-map/share-map/share-map.component.mjs +56 -56
  55. package/esm2020/lib/share-map/share-map.module.mjs +66 -66
  56. package/esm2020/lib/share-map/shared/index.mjs +1 -1
  57. package/esm2020/lib/share-map/shared/share-map.service.mjs +209 -209
  58. package/esm2020/lib/sidenav/index.mjs +1 -1
  59. package/esm2020/lib/sidenav/sidenav.component.mjs +169 -169
  60. package/esm2020/lib/sidenav/sidenav.module.mjs +60 -60
  61. package/esm2020/public_api.mjs +14 -14
  62. package/fesm2015/igo2-context.mjs +5037 -5031
  63. package/fesm2015/igo2-context.mjs.map +1 -1
  64. package/fesm2020/igo2-context.mjs +4687 -4681
  65. package/fesm2020/igo2-context.mjs.map +1 -1
  66. package/index.d.ts +5 -5
  67. package/lib/context-import-export/context-import-export/context-import-export.component.d.ts +45 -45
  68. package/lib/context-import-export/context-import-export.module.d.ts +23 -23
  69. package/lib/context-import-export/index.d.ts +2 -2
  70. package/lib/context-import-export/shared/context-export.errors.d.ts +8 -8
  71. package/lib/context-import-export/shared/context-export.interface.d.ts +5 -5
  72. package/lib/context-import-export/shared/context-export.service.d.ts +10 -10
  73. package/lib/context-import-export/shared/context-export.utils.d.ts +4 -4
  74. package/lib/context-import-export/shared/context-import.errors.d.ts +17 -17
  75. package/lib/context-import-export/shared/context-import.service.d.ts +18 -18
  76. package/lib/context-import-export/shared/context-import.utils.d.ts +17 -17
  77. package/lib/context-import-export/shared/index.d.ts +7 -7
  78. package/lib/context-manager/context-edit/context-edit-binding.directive.d.ts +21 -21
  79. package/lib/context-manager/context-edit/context-edit.component.d.ts +14 -14
  80. package/lib/context-manager/context-edit/index.d.ts +2 -2
  81. package/lib/context-manager/context-form/context-form.component.d.ts +31 -31
  82. package/lib/context-manager/context-form/index.d.ts +1 -1
  83. package/lib/context-manager/context-item/context-item.component.d.ts +32 -32
  84. package/lib/context-manager/context-item/index.d.ts +1 -1
  85. package/lib/context-manager/context-list/context-list-binding.directive.d.ts +46 -46
  86. package/lib/context-manager/context-list/context-list.component.d.ts +93 -93
  87. package/lib/context-manager/context-list/context-list.enum.d.ts +5 -5
  88. package/lib/context-manager/context-list/index.d.ts +2 -2
  89. package/lib/context-manager/context-manager.module.d.ts +37 -37
  90. package/lib/context-manager/context-permissions/context-permissions-binding.directive.d.ts +23 -23
  91. package/lib/context-manager/context-permissions/context-permissions.component.d.ts +40 -40
  92. package/lib/context-manager/context-permissions/index.d.ts +2 -2
  93. package/lib/context-manager/index.d.ts +6 -6
  94. package/lib/context-manager/shared/context.enum.d.ts +10 -10
  95. package/lib/context-manager/shared/context.interface.d.ts +75 -75
  96. package/lib/context-manager/shared/context.service.d.ts +75 -73
  97. package/lib/context-manager/shared/index.d.ts +5 -5
  98. package/lib/context-manager/shared/layer-context.directive.d.ts +27 -27
  99. package/lib/context-manager/shared/map-context.directive.d.ts +19 -19
  100. package/lib/context-map-button/bookmark-button/bookmark-button.component.d.ts +21 -21
  101. package/lib/context-map-button/bookmark-button/bookmark-dialog.component.d.ts +9 -9
  102. package/lib/context-map-button/bookmark-button/index.d.ts +2 -2
  103. package/lib/context-map-button/context-map-button.module.d.ts +27 -27
  104. package/lib/context-map-button/index.d.ts +3 -3
  105. package/lib/context-map-button/poi-button/index.d.ts +3 -3
  106. package/lib/context-map-button/poi-button/poi-button.component.d.ts +34 -34
  107. package/lib/context-map-button/poi-button/poi-dialog.component.d.ts +9 -9
  108. package/lib/context-map-button/poi-button/shared/index.d.ts +2 -2
  109. package/lib/context-map-button/poi-button/shared/poi.interface.d.ts +7 -7
  110. package/lib/context-map-button/poi-button/shared/poi.service.d.ts +16 -16
  111. package/lib/context-map-button/user-button/index.d.ts +2 -2
  112. package/lib/context-map-button/user-button/user-button.animation.d.ts +2 -2
  113. package/lib/context-map-button/user-button/user-button.component.d.ts +25 -25
  114. package/lib/context-map-button/user-button/user-dialog.component.d.ts +15 -15
  115. package/lib/context.module.d.ts +16 -16
  116. package/lib/share-map/index.d.ts +4 -4
  117. package/lib/share-map/share-map/share-map-api.component.d.ts +27 -27
  118. package/lib/share-map/share-map/share-map-url.component.d.ts +26 -26
  119. package/lib/share-map/share-map/share-map.component.d.ts +11 -11
  120. package/lib/share-map/share-map.module.d.ts +21 -21
  121. package/lib/share-map/shared/index.d.ts +1 -1
  122. package/lib/share-map/shared/share-map.service.d.ts +17 -17
  123. package/lib/sidenav/index.d.ts +1 -1
  124. package/lib/sidenav/sidenav.component.d.ts +35 -35
  125. package/lib/sidenav/sidenav.module.d.ts +18 -18
  126. package/package.json +6 -6
  127. package/public_api.d.ts +11 -11
@@ -1,260 +1,260 @@
1
- import { Directive, Self, HostListener } from '@angular/core';
2
- import { debounceTime } from 'rxjs/operators';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./context-list.component";
5
- import * as i2 from "../shared/context.service";
6
- import * as i3 from "@igo2/geo";
7
- import * as i4 from "@igo2/core";
8
- import * as i5 from "@igo2/common";
9
- import * as i6 from "@igo2/auth";
10
- export class ContextListBindingDirective {
11
- constructor(component, contextService, mapService, languageService, confirmDialogService, messageService, auth, storageService, cdRef) {
12
- this.contextService = contextService;
13
- this.mapService = mapService;
14
- this.languageService = languageService;
15
- this.confirmDialogService = confirmDialogService;
16
- this.messageService = messageService;
17
- this.auth = auth;
18
- this.storageService = storageService;
19
- this.cdRef = cdRef;
20
- this.component = component;
21
- }
22
- onSelect(context) {
23
- this.contextService.loadContext(context.uri);
24
- }
25
- onEdit(context) {
26
- this.contextService.loadEditedContext(context.uri);
27
- }
28
- onSave(context) {
29
- const map = this.mapService.getMap();
30
- const contextFromMap = this.contextService.getContextFromMap(map);
31
- const msgSuccess = () => {
32
- const translate = this.languageService.translate;
33
- const message = translate.instant('igo.context.contextManager.dialog.saveMsg', {
34
- value: context.title
35
- });
36
- const title = translate.instant('igo.context.contextManager.dialog.saveTitle');
37
- this.messageService.success(message, title);
38
- };
39
- if (context.imported) {
40
- contextFromMap.title = context.title;
41
- this.contextService.delete(context.id, true);
42
- this.contextService.create(contextFromMap).subscribe((contextCreated) => {
43
- this.contextService.loadContext(contextCreated.uri);
44
- msgSuccess();
45
- });
46
- return;
47
- }
48
- const changes = {
49
- layers: contextFromMap.layers,
50
- map: {
51
- view: contextFromMap.map.view
52
- }
53
- };
54
- this.contextService.update(context.id, changes).subscribe(() => {
55
- msgSuccess();
56
- });
57
- }
58
- onFavorite(context) {
59
- if (!context.id) {
60
- context.id = context.uri;
61
- }
62
- this.contextService.setDefault(context.id).subscribe(() => {
63
- if (this.previousMessageId) {
64
- this.messageService.remove(this.previousMessageId);
65
- }
66
- this.contextService.defaultContextId$.next(context.id);
67
- const translate = this.languageService.translate;
68
- const message = translate.instant('igo.context.contextManager.dialog.favoriteMsg', {
69
- value: context.title
70
- });
71
- const title = translate.instant('igo.context.contextManager.dialog.favoriteTitle');
72
- const messageObj = this.messageService.success(message, title);
73
- this.previousMessageId = messageObj.toastId;
74
- this.cdRef.detectChanges();
75
- });
76
- }
77
- onManageTools(context) {
78
- this.contextService.loadEditedContext(context.uri);
79
- }
80
- onManagePermissions(context) {
81
- this.contextService.loadEditedContext(context.uri);
82
- }
83
- onDelete(context) {
84
- const translate = this.languageService.translate;
85
- this.confirmDialogService
86
- .open(translate.instant('igo.context.contextManager.dialog.confirmDelete'))
87
- .subscribe((confirm) => {
88
- if (confirm) {
89
- this.contextService
90
- .delete(context.id, context.imported)
91
- .subscribe(() => {
92
- const message = translate.instant('igo.context.contextManager.dialog.deleteMsg', {
93
- value: context.title
94
- });
95
- const title = translate.instant('igo.context.contextManager.dialog.deleteTitle');
96
- this.messageService.info(message, title);
97
- });
98
- }
99
- });
100
- }
101
- onClone(context) {
102
- const properties = {
103
- title: context.title + '-copy',
104
- uri: context.uri + '-copy'
105
- };
106
- this.contextService.clone(context.id, properties).subscribe(() => {
107
- const translate = this.languageService.translate;
108
- const message = translate.instant('igo.context.contextManager.dialog.cloneMsg', {
109
- value: context.title
110
- });
111
- const title = translate.instant('igo.context.contextManager.dialog.cloneTitle');
112
- this.messageService.success(message, title);
113
- });
114
- }
115
- onCreate(opts) {
116
- const { title, empty } = opts;
117
- const context = this.contextService.getContextFromMap(this.component.map, empty);
118
- context.title = title;
119
- this.contextService.create(context).subscribe(() => {
120
- const translate = this.languageService.translate;
121
- const titleD = translate.instant('igo.context.bookmarkButton.dialog.createTitle');
122
- const message = translate.instant('igo.context.bookmarkButton.dialog.createMsg', {
123
- value: context.title
124
- });
125
- this.messageService.success(message, titleD);
126
- this.contextService.loadContext(context.uri);
127
- });
128
- }
129
- loadContexts() {
130
- const permissions = ['none'];
131
- for (const p of this.component.permissions) {
132
- if (p.checked === true || p.indeterminate === true) {
133
- permissions.push(p.name);
134
- }
135
- }
136
- this.component.showHidden
137
- ? this.contextService.loadContexts(permissions, true)
138
- : this.contextService.loadContexts(permissions, false);
139
- }
140
- showHiddenContexts() {
141
- this.component.showHidden = !this.component.showHidden;
142
- this.storageService.set('contexts.showHidden', this.component.showHidden);
143
- this.loadContexts();
144
- }
145
- onShowContext(context) {
146
- this.contextService.showContext(context.id).subscribe();
147
- }
148
- onHideContext(context) {
149
- this.contextService.hideContext(context.id).subscribe();
150
- }
151
- ngOnInit() {
152
- // Override input contexts
153
- this.component.contexts = { ours: [] };
154
- this.component.showHidden = this.storageService.get('contexts.showHidden');
155
- this.contexts$$ = this.contextService.contexts$.subscribe((contexts) => this.handleContextsChange(contexts));
156
- this.defaultContextId$$ = this.contextService.defaultContextId$.subscribe((id) => {
157
- this.component.defaultContextId = id;
158
- });
159
- const storedContextUri = this.storageService.get('favorite.context.uri');
160
- if (storedContextUri && !this.auth.authenticated) {
161
- this.contextService.defaultContextId$.next(storedContextUri);
162
- }
163
- // See feature-list.component for an explanation about the debounce time
164
- this.selectedContext$$ = this.contextService.context$
165
- .pipe(debounceTime(100))
166
- .subscribe((context) => (this.component.selectedContext = context));
167
- this.auth.authenticate$.subscribe((authenticate) => {
168
- if (authenticate) {
169
- this.contextService.getProfilByUser().subscribe((profils) => {
170
- this.component.users = profils;
171
- this.component.permissions = [];
172
- const profilsAcc = this.component.users.reduce((acc, cur) => {
173
- acc = acc.concat(cur);
174
- acc = cur.childs ? acc.concat(cur.childs) : acc;
175
- return acc;
176
- }, []);
177
- for (const user of profilsAcc) {
178
- const permission = {
179
- name: user.name,
180
- checked: this.storageService.get('contexts.permissions.' + user.name)
181
- };
182
- if (permission.checked === null) {
183
- permission.checked = true;
184
- }
185
- this.component.permissions.push(permission);
186
- }
187
- const permissions = ['none'];
188
- for (const p of this.component.permissions) {
189
- if (p.checked === true || p.indeterminate === true) {
190
- permissions.push(p.name);
191
- }
192
- }
193
- this.component.showHidden
194
- ? this.contextService.loadContexts(permissions, true)
195
- : this.contextService.loadContexts(permissions, false);
196
- });
197
- }
198
- });
199
- }
200
- ngOnDestroy() {
201
- this.contexts$$.unsubscribe();
202
- this.selectedContext$$.unsubscribe();
203
- this.defaultContextId$$.unsubscribe();
204
- }
205
- handleContextsChange(contexts) {
206
- this.component.contexts = contexts;
207
- }
208
- }
209
- ContextListBindingDirective.ɵfac = function ContextListBindingDirective_Factory(t) { return new (t || ContextListBindingDirective)(i0.ɵɵdirectiveInject(i1.ContextListComponent, 2), i0.ɵɵdirectiveInject(i2.ContextService), i0.ɵɵdirectiveInject(i3.MapService), i0.ɵɵdirectiveInject(i4.LanguageService), i0.ɵɵdirectiveInject(i5.ConfirmDialogService), i0.ɵɵdirectiveInject(i4.MessageService), i0.ɵɵdirectiveInject(i6.AuthService), i0.ɵɵdirectiveInject(i4.StorageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
210
- ContextListBindingDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ContextListBindingDirective, selectors: [["", "igoContextListBinding", ""]], hostBindings: function ContextListBindingDirective_HostBindings(rf, ctx) { if (rf & 1) {
211
- i0.ɵɵlistener("select", function ContextListBindingDirective_select_HostBindingHandler($event) { return ctx.onSelect($event); })("edit", function ContextListBindingDirective_edit_HostBindingHandler($event) { return ctx.onEdit($event); })("save", function ContextListBindingDirective_save_HostBindingHandler($event) { return ctx.onSave($event); })("favorite", function ContextListBindingDirective_favorite_HostBindingHandler($event) { return ctx.onFavorite($event); })("manageTools", function ContextListBindingDirective_manageTools_HostBindingHandler($event) { return ctx.onManageTools($event); })("managePermissions", function ContextListBindingDirective_managePermissions_HostBindingHandler($event) { return ctx.onManagePermissions($event); })("delete", function ContextListBindingDirective_delete_HostBindingHandler($event) { return ctx.onDelete($event); })("clone", function ContextListBindingDirective_clone_HostBindingHandler($event) { return ctx.onClone($event); })("create", function ContextListBindingDirective_create_HostBindingHandler($event) { return ctx.onCreate($event); })("filterPermissionsChanged", function ContextListBindingDirective_filterPermissionsChanged_HostBindingHandler() { return ctx.loadContexts(); })("showHiddenContexts", function ContextListBindingDirective_showHiddenContexts_HostBindingHandler() { return ctx.showHiddenContexts(); })("show", function ContextListBindingDirective_show_HostBindingHandler($event) { return ctx.onShowContext($event); })("hide", function ContextListBindingDirective_hide_HostBindingHandler($event) { return ctx.onHideContext($event); });
212
- } } });
213
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ContextListBindingDirective, [{
214
- type: Directive,
215
- args: [{
216
- selector: '[igoContextListBinding]'
217
- }]
218
- }], function () { return [{ type: i1.ContextListComponent, decorators: [{
219
- type: Self
220
- }] }, { type: i2.ContextService }, { type: i3.MapService }, { type: i4.LanguageService }, { type: i5.ConfirmDialogService }, { type: i4.MessageService }, { type: i6.AuthService }, { type: i4.StorageService }, { type: i0.ChangeDetectorRef }]; }, { onSelect: [{
221
- type: HostListener,
222
- args: ['select', ['$event']]
223
- }], onEdit: [{
224
- type: HostListener,
225
- args: ['edit', ['$event']]
226
- }], onSave: [{
227
- type: HostListener,
228
- args: ['save', ['$event']]
229
- }], onFavorite: [{
230
- type: HostListener,
231
- args: ['favorite', ['$event']]
232
- }], onManageTools: [{
233
- type: HostListener,
234
- args: ['manageTools', ['$event']]
235
- }], onManagePermissions: [{
236
- type: HostListener,
237
- args: ['managePermissions', ['$event']]
238
- }], onDelete: [{
239
- type: HostListener,
240
- args: ['delete', ['$event']]
241
- }], onClone: [{
242
- type: HostListener,
243
- args: ['clone', ['$event']]
244
- }], onCreate: [{
245
- type: HostListener,
246
- args: ['create', ['$event']]
247
- }], loadContexts: [{
248
- type: HostListener,
249
- args: ['filterPermissionsChanged']
250
- }], showHiddenContexts: [{
251
- type: HostListener,
252
- args: ['showHiddenContexts']
253
- }], onShowContext: [{
254
- type: HostListener,
255
- args: ['show', ['$event']]
256
- }], onHideContext: [{
257
- type: HostListener,
258
- args: ['hide', ['$event']]
259
- }] }); })();
1
+ import { Directive, Self, HostListener } from '@angular/core';
2
+ import { debounceTime } from 'rxjs/operators';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./context-list.component";
5
+ import * as i2 from "../shared/context.service";
6
+ import * as i3 from "@igo2/geo";
7
+ import * as i4 from "@igo2/core";
8
+ import * as i5 from "@igo2/common";
9
+ import * as i6 from "@igo2/auth";
10
+ export class ContextListBindingDirective {
11
+ constructor(component, contextService, mapService, languageService, confirmDialogService, messageService, auth, storageService, cdRef) {
12
+ this.contextService = contextService;
13
+ this.mapService = mapService;
14
+ this.languageService = languageService;
15
+ this.confirmDialogService = confirmDialogService;
16
+ this.messageService = messageService;
17
+ this.auth = auth;
18
+ this.storageService = storageService;
19
+ this.cdRef = cdRef;
20
+ this.component = component;
21
+ }
22
+ onSelect(context) {
23
+ this.contextService.loadContext(context.uri);
24
+ }
25
+ onEdit(context) {
26
+ this.contextService.loadEditedContext(context.uri);
27
+ }
28
+ onSave(context) {
29
+ const map = this.mapService.getMap();
30
+ const contextFromMap = this.contextService.getContextFromMap(map);
31
+ const msgSuccess = () => {
32
+ const translate = this.languageService.translate;
33
+ const message = translate.instant('igo.context.contextManager.dialog.saveMsg', {
34
+ value: context.title
35
+ });
36
+ const title = translate.instant('igo.context.contextManager.dialog.saveTitle');
37
+ this.messageService.success(message, title);
38
+ };
39
+ if (context.imported) {
40
+ contextFromMap.title = context.title;
41
+ this.contextService.delete(context.id, true);
42
+ this.contextService.create(contextFromMap).subscribe((contextCreated) => {
43
+ this.contextService.loadContext(contextCreated.uri);
44
+ msgSuccess();
45
+ });
46
+ return;
47
+ }
48
+ const changes = {
49
+ layers: contextFromMap.layers,
50
+ map: {
51
+ view: contextFromMap.map.view
52
+ }
53
+ };
54
+ this.contextService.update(context.id, changes).subscribe(() => {
55
+ msgSuccess();
56
+ });
57
+ }
58
+ onFavorite(context) {
59
+ if (!context.id) {
60
+ context.id = context.uri;
61
+ }
62
+ this.contextService.setDefault(context.id).subscribe(() => {
63
+ if (this.previousMessageId) {
64
+ this.messageService.remove(this.previousMessageId);
65
+ }
66
+ this.contextService.defaultContextId$.next(context.id);
67
+ const translate = this.languageService.translate;
68
+ const message = translate.instant('igo.context.contextManager.dialog.favoriteMsg', {
69
+ value: context.title
70
+ });
71
+ const title = translate.instant('igo.context.contextManager.dialog.favoriteTitle');
72
+ const messageObj = this.messageService.success(message, title);
73
+ this.previousMessageId = messageObj.toastId;
74
+ this.cdRef.detectChanges();
75
+ });
76
+ }
77
+ onManageTools(context) {
78
+ this.contextService.loadEditedContext(context.uri);
79
+ }
80
+ onManagePermissions(context) {
81
+ this.contextService.loadEditedContext(context.uri);
82
+ }
83
+ onDelete(context) {
84
+ const translate = this.languageService.translate;
85
+ this.confirmDialogService
86
+ .open(translate.instant('igo.context.contextManager.dialog.confirmDelete'))
87
+ .subscribe((confirm) => {
88
+ if (confirm) {
89
+ this.contextService
90
+ .delete(context.id, context.imported)
91
+ .subscribe(() => {
92
+ const message = translate.instant('igo.context.contextManager.dialog.deleteMsg', {
93
+ value: context.title
94
+ });
95
+ const title = translate.instant('igo.context.contextManager.dialog.deleteTitle');
96
+ this.messageService.info(message, title);
97
+ });
98
+ }
99
+ });
100
+ }
101
+ onClone(context) {
102
+ const properties = {
103
+ title: context.title + '-copy',
104
+ uri: context.uri + '-copy'
105
+ };
106
+ this.contextService.clone(context.id, properties).subscribe(() => {
107
+ const translate = this.languageService.translate;
108
+ const message = translate.instant('igo.context.contextManager.dialog.cloneMsg', {
109
+ value: context.title
110
+ });
111
+ const title = translate.instant('igo.context.contextManager.dialog.cloneTitle');
112
+ this.messageService.success(message, title);
113
+ });
114
+ }
115
+ onCreate(opts) {
116
+ const { title, empty } = opts;
117
+ const context = this.contextService.getContextFromMap(this.component.map, empty);
118
+ context.title = title;
119
+ this.contextService.create(context).subscribe(() => {
120
+ const translate = this.languageService.translate;
121
+ const titleD = translate.instant('igo.context.bookmarkButton.dialog.createTitle');
122
+ const message = translate.instant('igo.context.bookmarkButton.dialog.createMsg', {
123
+ value: context.title
124
+ });
125
+ this.messageService.success(message, titleD);
126
+ this.contextService.loadContext(context.uri);
127
+ });
128
+ }
129
+ loadContexts() {
130
+ const permissions = ['none'];
131
+ for (const p of this.component.permissions) {
132
+ if (p.checked === true || p.indeterminate === true) {
133
+ permissions.push(p.name);
134
+ }
135
+ }
136
+ this.component.showHidden
137
+ ? this.contextService.loadContexts(permissions, true)
138
+ : this.contextService.loadContexts(permissions, false);
139
+ }
140
+ showHiddenContexts() {
141
+ this.component.showHidden = !this.component.showHidden;
142
+ this.storageService.set('contexts.showHidden', this.component.showHidden);
143
+ this.loadContexts();
144
+ }
145
+ onShowContext(context) {
146
+ this.contextService.showContext(context.id).subscribe();
147
+ }
148
+ onHideContext(context) {
149
+ this.contextService.hideContext(context.id).subscribe();
150
+ }
151
+ ngOnInit() {
152
+ // Override input contexts
153
+ this.component.contexts = { ours: [] };
154
+ this.component.showHidden = this.storageService.get('contexts.showHidden');
155
+ this.contexts$$ = this.contextService.contexts$.subscribe((contexts) => this.handleContextsChange(contexts));
156
+ this.defaultContextId$$ = this.contextService.defaultContextId$.subscribe((id) => {
157
+ this.component.defaultContextId = id;
158
+ });
159
+ const storedContextUri = this.storageService.get('favorite.context.uri');
160
+ if (storedContextUri && !this.auth.authenticated) {
161
+ this.contextService.defaultContextId$.next(storedContextUri);
162
+ }
163
+ // See feature-list.component for an explanation about the debounce time
164
+ this.selectedContext$$ = this.contextService.context$
165
+ .pipe(debounceTime(100))
166
+ .subscribe((context) => (this.component.selectedContext = context));
167
+ this.auth.authenticate$.subscribe((authenticate) => {
168
+ if (authenticate) {
169
+ this.contextService.getProfilByUser().subscribe((profils) => {
170
+ this.component.users = profils;
171
+ this.component.permissions = [];
172
+ const profilsAcc = this.component.users.reduce((acc, cur) => {
173
+ acc = acc.concat(cur);
174
+ acc = cur.childs ? acc.concat(cur.childs) : acc;
175
+ return acc;
176
+ }, []);
177
+ for (const user of profilsAcc) {
178
+ const permission = {
179
+ name: user.name,
180
+ checked: this.storageService.get('contexts.permissions.' + user.name)
181
+ };
182
+ if (permission.checked === null) {
183
+ permission.checked = true;
184
+ }
185
+ this.component.permissions.push(permission);
186
+ }
187
+ const permissions = ['none'];
188
+ for (const p of this.component.permissions) {
189
+ if (p.checked === true || p.indeterminate === true) {
190
+ permissions.push(p.name);
191
+ }
192
+ }
193
+ this.component.showHidden
194
+ ? this.contextService.loadContexts(permissions, true)
195
+ : this.contextService.loadContexts(permissions, false);
196
+ });
197
+ }
198
+ });
199
+ }
200
+ ngOnDestroy() {
201
+ this.contexts$$.unsubscribe();
202
+ this.selectedContext$$.unsubscribe();
203
+ this.defaultContextId$$.unsubscribe();
204
+ }
205
+ handleContextsChange(contexts) {
206
+ this.component.contexts = contexts;
207
+ }
208
+ }
209
+ ContextListBindingDirective.ɵfac = function ContextListBindingDirective_Factory(t) { return new (t || ContextListBindingDirective)(i0.ɵɵdirectiveInject(i1.ContextListComponent, 2), i0.ɵɵdirectiveInject(i2.ContextService), i0.ɵɵdirectiveInject(i3.MapService), i0.ɵɵdirectiveInject(i4.LanguageService), i0.ɵɵdirectiveInject(i5.ConfirmDialogService), i0.ɵɵdirectiveInject(i4.MessageService), i0.ɵɵdirectiveInject(i6.AuthService), i0.ɵɵdirectiveInject(i4.StorageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
210
+ ContextListBindingDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ContextListBindingDirective, selectors: [["", "igoContextListBinding", ""]], hostBindings: function ContextListBindingDirective_HostBindings(rf, ctx) { if (rf & 1) {
211
+ i0.ɵɵlistener("select", function ContextListBindingDirective_select_HostBindingHandler($event) { return ctx.onSelect($event); })("edit", function ContextListBindingDirective_edit_HostBindingHandler($event) { return ctx.onEdit($event); })("save", function ContextListBindingDirective_save_HostBindingHandler($event) { return ctx.onSave($event); })("favorite", function ContextListBindingDirective_favorite_HostBindingHandler($event) { return ctx.onFavorite($event); })("manageTools", function ContextListBindingDirective_manageTools_HostBindingHandler($event) { return ctx.onManageTools($event); })("managePermissions", function ContextListBindingDirective_managePermissions_HostBindingHandler($event) { return ctx.onManagePermissions($event); })("delete", function ContextListBindingDirective_delete_HostBindingHandler($event) { return ctx.onDelete($event); })("clone", function ContextListBindingDirective_clone_HostBindingHandler($event) { return ctx.onClone($event); })("create", function ContextListBindingDirective_create_HostBindingHandler($event) { return ctx.onCreate($event); })("filterPermissionsChanged", function ContextListBindingDirective_filterPermissionsChanged_HostBindingHandler() { return ctx.loadContexts(); })("showHiddenContexts", function ContextListBindingDirective_showHiddenContexts_HostBindingHandler() { return ctx.showHiddenContexts(); })("show", function ContextListBindingDirective_show_HostBindingHandler($event) { return ctx.onShowContext($event); })("hide", function ContextListBindingDirective_hide_HostBindingHandler($event) { return ctx.onHideContext($event); });
212
+ } } });
213
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ContextListBindingDirective, [{
214
+ type: Directive,
215
+ args: [{
216
+ selector: '[igoContextListBinding]'
217
+ }]
218
+ }], function () { return [{ type: i1.ContextListComponent, decorators: [{
219
+ type: Self
220
+ }] }, { type: i2.ContextService }, { type: i3.MapService }, { type: i4.LanguageService }, { type: i5.ConfirmDialogService }, { type: i4.MessageService }, { type: i6.AuthService }, { type: i4.StorageService }, { type: i0.ChangeDetectorRef }]; }, { onSelect: [{
221
+ type: HostListener,
222
+ args: ['select', ['$event']]
223
+ }], onEdit: [{
224
+ type: HostListener,
225
+ args: ['edit', ['$event']]
226
+ }], onSave: [{
227
+ type: HostListener,
228
+ args: ['save', ['$event']]
229
+ }], onFavorite: [{
230
+ type: HostListener,
231
+ args: ['favorite', ['$event']]
232
+ }], onManageTools: [{
233
+ type: HostListener,
234
+ args: ['manageTools', ['$event']]
235
+ }], onManagePermissions: [{
236
+ type: HostListener,
237
+ args: ['managePermissions', ['$event']]
238
+ }], onDelete: [{
239
+ type: HostListener,
240
+ args: ['delete', ['$event']]
241
+ }], onClone: [{
242
+ type: HostListener,
243
+ args: ['clone', ['$event']]
244
+ }], onCreate: [{
245
+ type: HostListener,
246
+ args: ['create', ['$event']]
247
+ }], loadContexts: [{
248
+ type: HostListener,
249
+ args: ['filterPermissionsChanged']
250
+ }], showHiddenContexts: [{
251
+ type: HostListener,
252
+ args: ['showHiddenContexts']
253
+ }], onShowContext: [{
254
+ type: HostListener,
255
+ args: ['show', ['$event']]
256
+ }], onHideContext: [{
257
+ type: HostListener,
258
+ args: ['hide', ['$event']]
259
+ }] }); })();
260
260
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1saXN0LWJpbmRpbmcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29udGV4dC9zcmMvbGliL2NvbnRleHQtbWFuYWdlci9jb250ZXh0LWxpc3QvY29udGV4dC1saXN0LWJpbmRpbmcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUdKLFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBbUI5QyxNQUFNLE9BQU8sMkJBQTJCO0lBb010QyxZQUNVLFNBQStCLEVBQy9CLGNBQThCLEVBQzlCLFVBQXNCLEVBQ3RCLGVBQWdDLEVBQ2hDLG9CQUEwQyxFQUMxQyxjQUE4QixFQUM5QixJQUFpQixFQUNqQixjQUE4QixFQUM5QixLQUF3QjtRQVB4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFFaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQXhNRCxRQUFRLENBQUMsT0FBZ0I7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFHRCxNQUFNLENBQUMsT0FBZ0I7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FB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XG4gIFNlbGYsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBIb3N0TGlzdGVuZXIsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlLCBMYW5ndWFnZVNlcnZpY2UsIFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ0BpZ28yL2F1dGgnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb21tb24nO1xuaW1wb3J0IHsgTWFwU2VydmljZSB9IGZyb20gJ0BpZ28yL2dlbyc7XG5cbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIERldGFpbGVkQ29udGV4dCxcbiAgQ29udGV4dHNMaXN0LFxuICBDb250ZXh0VXNlclBlcm1pc3Npb25cbn0gZnJvbSAnLi4vc2hhcmVkL2NvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZXh0TGlzdENvbXBvbmVudCB9IGZyb20gJy4vY29udGV4dC1saXN0LmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tpZ29Db250ZXh0TGlzdEJpbmRpbmddJ1xufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TGlzdEJpbmRpbmdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgY29tcG9uZW50OiBDb250ZXh0TGlzdENvbXBvbmVudDtcbiAgcHJpdmF0ZSBjb250ZXh0cyQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgc2VsZWN0ZWRDb250ZXh0JCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBkZWZhdWx0Q29udGV4dElkJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwcmV2aW91c01lc3NhZ2VJZDtcblxuICBASG9zdExpc3RlbmVyKCdzZWxlY3QnLCBbJyRldmVudCddKVxuICBvblNlbGVjdChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dChjb250ZXh0LnVyaSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdlZGl0JywgWyckZXZlbnQnXSlcbiAgb25FZGl0KGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRFZGl0ZWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3NhdmUnLCBbJyRldmVudCddKVxuICBvblNhdmUoY29udGV4dDogQ29udGV4dCkge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMubWFwU2VydmljZS5nZXRNYXAoKTtcbiAgICBjb25zdCBjb250ZXh0RnJvbU1hcCA9IHRoaXMuY29udGV4dFNlcnZpY2UuZ2V0Q29udGV4dEZyb21NYXAobWFwKTtcblxuICAgIGNvbnN0IG1zZ1N1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuc2F2ZU1zZycsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogY29udGV4dC50aXRsZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgdGl0bGUgPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5zYXZlVGl0bGUnXG4gICAgICApO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzKG1lc3NhZ2UsIHRpdGxlKTtcbiAgICB9O1xuXG4gICAgaWYgKGNvbnRleHQuaW1wb3J0ZWQpIHtcbiAgICAgIGNvbnRleHRGcm9tTWFwLnRpdGxlID0gY29udGV4dC50aXRsZTtcbiAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuZGVsZXRlKGNvbnRleHQuaWQsIHRydWUpO1xuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jcmVhdGUoY29udGV4dEZyb21NYXApLnN1YnNjcmliZSgoY29udGV4dENyZWF0ZWQpID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dChjb250ZXh0Q3JlYXRlZC51cmkpO1xuICAgICAgICBtc2dTdWNjZXNzKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VzOiBhbnkgPSB7XG4gICAgICBsYXllcnM6IGNvbnRleHRGcm9tTWFwLmxheWVycyxcbiAgICAgIG1hcDoge1xuICAgICAgICB2aWV3OiBjb250ZXh0RnJvbU1hcC5tYXAudmlld1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnVwZGF0ZShjb250ZXh0LmlkLCBjaGFuZ2VzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgbXNnU3VjY2VzcygpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZmF2b3JpdGUnLCBbJyRldmVudCddKVxuICBvbkZhdm9yaXRlKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBpZiAoIWNvbnRleHQuaWQpIHtcbiAgICAgIGNvbnRleHQuaWQgPSBjb250ZXh0LnVyaTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5zZXREZWZhdWx0KGNvbnRleHQuaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcmV2aW91c01lc3NhZ2VJZCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnJlbW92ZSh0aGlzLnByZXZpb3VzTWVzc2FnZUlkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuZGVmYXVsdENvbnRleHRJZCQubmV4dChjb250ZXh0LmlkKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5mYXZvcml0ZU1zZycsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogY29udGV4dC50aXRsZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgdGl0bGUgPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5mYXZvcml0ZVRpdGxlJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VPYmogPSB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MobWVzc2FnZSwgdGl0bGUpO1xuICAgICAgdGhpcy5wcmV2aW91c01lc3NhZ2VJZCA9IG1lc3NhZ2VPYmoudG9hc3RJZDtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbWFuYWdlVG9vbHMnLCBbJyRldmVudCddKVxuICBvbk1hbmFnZVRvb2xzKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRFZGl0ZWRDb250ZXh0KGNvbnRleHQudXJpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21hbmFnZVBlcm1pc3Npb25zJywgWyckZXZlbnQnXSlcbiAgb25NYW5hZ2VQZXJtaXNzaW9ucyhjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5sb2FkRWRpdGVkQ29udGV4dChjb250ZXh0LnVyaSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkZWxldGUnLCBbJyRldmVudCddKVxuICBvbkRlbGV0ZShjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIHRoaXMuY29uZmlybURpYWxvZ1NlcnZpY2VcbiAgICAgIC5vcGVuKFxuICAgICAgICB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmNvbnRleHQuY29udGV4dE1hbmFnZXIuZGlhbG9nLmNvbmZpcm1EZWxldGUnKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY29uZmlybSkgPT4ge1xuICAgICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2VcbiAgICAgICAgICAgIC5kZWxldGUoY29udGV4dC5pZCwgY29udGV4dC5pbXBvcnRlZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgJ2lnby5jb250ZXh0LmNvbnRleHRNYW5hZ2VyLmRpYWxvZy5kZWxldGVNc2cnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb250ZXh0LnRpdGxlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuZGVsZXRlVGl0bGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuaW5mbyhtZXNzYWdlLCB0aXRsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbG9uZScsIFsnJGV2ZW50J10pXG4gIG9uQ2xvbmUoY29udGV4dDogRGV0YWlsZWRDb250ZXh0KSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIHRpdGxlOiBjb250ZXh0LnRpdGxlICsgJy1jb3B5JyxcbiAgICAgIHVyaTogY29udGV4dC51cmkgKyAnLWNvcHknXG4gICAgfTtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNsb25lKGNvbnRleHQuaWQsIHByb3BlcnRpZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuY2xvbmVNc2cnLFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGNvbnRleHQudGl0bGVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uY29udGV4dC5jb250ZXh0TWFuYWdlci5kaWFsb2cuY2xvbmVUaXRsZSdcbiAgICAgICk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MobWVzc2FnZSwgdGl0bGUpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY3JlYXRlJywgWyckZXZlbnQnXSlcbiAgb25DcmVhdGUob3B0czogeyB0aXRsZTogc3RyaW5nOyBlbXB0eTogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgeyB0aXRsZSwgZW1wdHkgfSA9IG9wdHM7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dFNlcnZpY2UuZ2V0Q29udGV4dEZyb21NYXAoXG4gICAgICB0aGlzLmNvbXBvbmVudC5tYXAsXG4gICAgICBlbXB0eVxuICAgICk7XG4gICAgY29udGV4dC50aXRsZSA9IHRpdGxlO1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY3JlYXRlKGNvbnRleHQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCB0aXRsZUQgPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5jb250ZXh0LmJvb2ttYXJrQnV0dG9uLmRpYWxvZy5jcmVhdGVUaXRsZSdcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uY29udGV4dC5ib29rbWFya0J1dHRvbi5kaWFsb2cuY3JlYXRlTXNnJyxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBjb250ZXh0LnRpdGxlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MobWVzc2FnZSwgdGl0bGVEKTtcbiAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UubG9hZENvbnRleHQoY29udGV4dC51cmkpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZmlsdGVyUGVybWlzc2lvbnNDaGFuZ2VkJylcbiAgbG9hZENvbnRleHRzKCkge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gWydub25lJ107XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuY29tcG9uZW50LnBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAocC5jaGVja2VkID09PSB0cnVlIHx8IHAuaW5kZXRlcm1pbmF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHAubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50LnNob3dIaWRkZW5cbiAgICAgID8gdGhpcy5jb250ZXh0U2VydmljZS5sb2FkQ29udGV4dHMocGVybWlzc2lvbnMsIHRydWUpXG4gICAgICA6IHRoaXMuY29udGV4dFNlcnZpY2UubG9hZENvbnRleHRzKHBlcm1pc3Npb25zLCBmYWxzZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdzaG93SGlkZGVuQ29udGV4dHMnKVxuICBzaG93SGlkZGVuQ29udGV4dHMoKSB7XG4gICAgdGhpcy5jb21wb25lbnQuc2hvd0hpZGRlbiA9ICF0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdjb250ZXh0cy5zaG93SGlkZGVuJywgdGhpcy5jb21wb25lbnQuc2hvd0hpZGRlbik7XG4gICAgdGhpcy5sb2FkQ29udGV4dHMoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3Nob3cnLCBbJyRldmVudCddKVxuICBvblNob3dDb250ZXh0KGNvbnRleHQ6IERldGFpbGVkQ29udGV4dCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2Uuc2hvd0NvbnRleHQoY29udGV4dC5pZCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdoaWRlJywgWyckZXZlbnQnXSlcbiAgb25IaWRlQ29udGV4dChjb250ZXh0OiBEZXRhaWxlZENvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmhpZGVDb250ZXh0KGNvbnRleHQuaWQpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQFNlbGYoKSBjb21wb25lbnQ6IENvbnRleHRMaXN0Q29tcG9uZW50LFxuICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlybURpYWxvZ1NlcnZpY2U6IENvbmZpcm1EaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBPdmVycmlkZSBpbnB1dCBjb250ZXh0c1xuICAgIHRoaXMuY29tcG9uZW50LmNvbnRleHRzID0geyBvdXJzOiBbXSB9O1xuICAgIHRoaXMuY29tcG9uZW50LnNob3dIaWRkZW4gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChcbiAgICAgICdjb250ZXh0cy5zaG93SGlkZGVuJ1xuICAgICkgYXMgYm9vbGVhbjtcblxuICAgIHRoaXMuY29udGV4dHMkJCA9IHRoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dHMkLnN1YnNjcmliZSgoY29udGV4dHMpID0+XG4gICAgICB0aGlzLmhhbmRsZUNvbnRleHRzQ2hhbmdlKGNvbnRleHRzKVxuICAgICk7XG5cbiAgICB0aGlzLmRlZmF1bHRDb250ZXh0SWQkJCA9IHRoaXMuY29udGV4dFNlcnZpY2UuZGVmYXVsdENvbnRleHRJZCQuc3Vic2NyaWJlKFxuICAgICAgKGlkKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50LmRlZmF1bHRDb250ZXh0SWQgPSBpZDtcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IHN0b3JlZENvbnRleHRVcmkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnZmF2b3JpdGUuY29udGV4dC51cmknKSBhcyBzdHJpbmc7XG4gICAgaWYgKHN0b3JlZENvbnRleHRVcmkgJiYgIXRoaXMuYXV0aC5hdXRoZW50aWNhdGVkKSB7XG4gICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmRlZmF1bHRDb250ZXh0SWQkLm5leHQoc3RvcmVkQ29udGV4dFVyaSk7XG4gICAgfVxuXG4gICAgLy8gU2VlIGZlYXR1cmUtbGlzdC5jb21wb25lbnQgZm9yIGFuIGV4cGxhbmF0aW9uIGFib3V0IHRoZSBkZWJvdW5jZSB0aW1lXG4gICAgdGhpcy5zZWxlY3RlZENvbnRleHQkJCA9IHRoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dCRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApKVxuICAgICAgLnN1YnNjcmliZSgoY29udGV4dCkgPT4gKHRoaXMuY29tcG9uZW50LnNlbGVjdGVkQ29udGV4dCA9IGNvbnRleHQpKTtcblxuICAgIHRoaXMuYXV0aC5hdXRoZW50aWNhdGUkLnN1YnNjcmliZSgoYXV0aGVudGljYXRlKSA9PiB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuZ2V0UHJvZmlsQnlVc2VyKCkuc3Vic2NyaWJlKChwcm9maWxzKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQudXNlcnMgPSBwcm9maWxzO1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50LnBlcm1pc3Npb25zID0gW107XG4gICAgICAgICAgY29uc3QgcHJvZmlsc0FjYyA9IHRoaXMuY29tcG9uZW50LnVzZXJzLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcbiAgICAgICAgICAgIGFjYyA9IGFjYy5jb25jYXQoY3VyKTtcbiAgICAgICAgICAgIGFjYyA9IGN1ci5jaGlsZHMgPyBhY2MuY29uY2F0KGN1ci5jaGlsZHMpIDogYWNjO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcHJvZmlsc0FjYykge1xuICAgICAgICAgICAgY29uc3QgcGVybWlzc2lvbjogQ29udGV4dFVzZXJQZXJtaXNzaW9uID0ge1xuICAgICAgICAgICAgICBuYW1lOiB1c2VyLm5hbWUsXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICdjb250ZXh0cy5wZXJtaXNzaW9ucy4nICsgdXNlci5uYW1lXG4gICAgICAgICAgICAgICkgYXMgYm9vbGVhblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLmNoZWNrZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LnBlcm1pc3Npb25zLnB1c2gocGVybWlzc2lvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBbJ25vbmUnXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5jb21wb25lbnQucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIGlmIChwLmNoZWNrZWQgPT09IHRydWUgfHwgcC5pbmRldGVybWluYXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2gocC5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbXBvbmVudC5zaG93SGlkZGVuXG4gICAgICAgICAgICA/IHRoaXMuY29udGV4dFNlcnZpY2UubG9hZENvbnRleHRzKHBlcm1pc3Npb25zLCB0cnVlKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRleHRTZXJ2aWNlLmxvYWRDb250ZXh0cyhwZXJtaXNzaW9ucywgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY29udGV4dHMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb250ZXh0JCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRlZmF1bHRDb250ZXh0SWQkJC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb250ZXh0c0NoYW5nZShjb250ZXh0czogQ29udGV4dHNMaXN0KSB7XG4gICAgdGhpcy5jb21wb25lbnQuY29udGV4dHMgPSBjb250ZXh0cztcbiAgfVxufVxuIl19