@igo2/context 19.0.0-next.28 → 19.0.0-next.29

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.
@@ -1,14 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Optional, Injectable, Input, Component, NgModule, EventEmitter, Output, HostListener, Self, Directive, ChangeDetectionStrategy } from '@angular/core';
3
- import { NgIf, NgFor, AsyncPipe, NgClass, KeyValuePipe } from '@angular/common';
2
+ import { Inject, Injectable, Optional, Input, Component, NgModule, EventEmitter, Output, HostListener, Self, Directive, ChangeDetectionStrategy } from '@angular/core';
3
+ import { DOCUMENT, NgIf, NgFor, AsyncPipe, NgClass, KeyValuePipe } from '@angular/common';
4
4
  import * as i4$1 from '@angular/forms';
5
5
  import { Validators, FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
6
- import * as i4$2 from '@angular/material/button';
6
+ import * as i9 from '@angular/material/button';
7
7
  import { MatButtonModule } from '@angular/material/button';
8
8
  import * as i7 from '@angular/material/button-toggle';
9
9
  import { MatButtonToggleModule } from '@angular/material/button-toggle';
10
10
  import { MatOptionModule } from '@angular/material/core';
11
- import * as i12 from '@angular/material/divider';
12
11
  import { MatDividerModule } from '@angular/material/divider';
13
12
  import * as i6$1 from '@angular/material/form-field';
14
13
  import { MatFormFieldModule } from '@angular/material/form-field';
@@ -17,45 +16,46 @@ import { MatInputModule } from '@angular/material/input';
17
16
  import * as i11 from '@angular/material/select';
18
17
  import { MatSelectModule } from '@angular/material/select';
19
18
  import { SpinnerComponent } from '@igo2/common/spinner';
20
- import * as i1$1 from '@igo2/core/config';
19
+ import * as i1$2 from '@igo2/core/config';
21
20
  import * as i4 from '@igo2/core/language';
22
21
  import { IgoLanguageModule } from '@igo2/core/language';
23
22
  import * as i3 from '@igo2/core/message';
24
23
  import { BehaviorSubject, Subject, of, Observable, ReplaySubject, timer, EMPTY, combineLatest } from 'rxjs';
25
- import { skip, first, catchError, tap, map, mergeMap, debounceTime, take, debounce, filter } from 'rxjs/operators';
26
- import * as i1 from '@angular/common/http';
24
+ import { skip, first, catchError, tap, map, mergeMap, debounceTime, take, debounce, switchMap, filter } from 'rxjs/operators';
25
+ import * as i1$1 from '@angular/common/http';
26
+ import { HttpParams } from '@angular/common/http';
27
27
  import * as i2 from '@igo2/auth';
28
- import * as i8 from '@igo2/core/route';
28
+ import * as i1 from '@igo2/core/route';
29
29
  import * as i6 from '@igo2/core/storage';
30
- import * as i1$2 from '@igo2/geo';
31
- import { isLayerGroup, FeatureDataSource, featureRandomStyleFunction, featureRandomStyle, VectorLayer, ClusterDataSource, isLayerGroupOptions, sortLayersByZindex, isLayerItem, moveToOlFeatures, FeatureMotion, FeatureDetailsComponent } from '@igo2/geo';
30
+ import * as i1$3 from '@igo2/geo';
31
+ import { QueryFormat, isLayerGroupOptions, ID_GROUP_PREFIX, isLayerGroup, isLayerItem, getLayerOptionIdentifier, findParentId, generateIdFromSourceOptions, FeatureDataSource, featureRandomStyleFunction, featureRandomStyle, VectorLayer, ClusterDataSource, sortLayersByZindex, mergeLayersOptions, moveToOlFeatures, FeatureMotion, FeatureDetailsComponent } from '@igo2/geo';
32
32
  import { ObjectUtils, uuid, downloadContent } from '@igo2/utils';
33
33
  import GeoJSON from 'ol/format/GeoJSON';
34
34
  import olPoint from 'ol/geom/Point';
35
35
  import Cluster from 'ol/source/Cluster';
36
36
  import olVectorSource from 'ol/source/Vector';
37
+ import * as i8 from '@angular/material/autocomplete';
38
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
39
+ import * as i3$1 from '@angular/material/list';
40
+ import { MatListModule } from '@angular/material/list';
37
41
  import * as i7$2 from '@ngx-translate/core';
38
- import * as i1$3 from '@angular/cdk/clipboard';
42
+ import * as i1$4 from '@angular/cdk/clipboard';
39
43
  import * as i6$2 from '@angular/material/icon';
40
44
  import { MatIconModule } from '@angular/material/icon';
41
45
  import * as i5 from '@angular/material/tooltip';
42
46
  import { MatTooltipModule } from '@angular/material/tooltip';
43
- import * as i3$1 from '@angular/material/list';
44
- import { MatListModule } from '@angular/material/list';
45
47
  import { CollapseDirective, CollapsibleComponent } from '@igo2/common/collapsible';
46
48
  import { StopPropagationDirective } from '@igo2/common/stop-propagation';
47
49
  import * as i5$1 from '@igo2/common/confirm-dialog';
48
50
  import { ConfirmDialogService } from '@igo2/common/confirm-dialog';
49
51
  import * as i13 from '@angular/material/checkbox';
50
52
  import { MatCheckboxModule } from '@angular/material/checkbox';
51
- import * as i1$4 from '@angular/material/dialog';
53
+ import * as i1$5 from '@angular/material/dialog';
52
54
  import { MatDialogTitle, MatDialogContent, MatDialogActions } from '@angular/material/dialog';
53
- import * as i12$1 from '@angular/material/menu';
55
+ import * as i12 from '@angular/material/menu';
54
56
  import { MatMenuModule } from '@angular/material/menu';
55
57
  import { ActionStore, ActionbarMode, ActionbarComponent } from '@igo2/common/action';
56
58
  import { ListComponent, ListItemDirective } from '@igo2/common/list';
57
- import * as i8$1 from '@angular/material/autocomplete';
58
- import { MatAutocompleteModule } from '@angular/material/autocomplete';
59
59
  import * as i5$2 from '@angular/material/radio';
60
60
  import { MatRadioModule } from '@angular/material/radio';
61
61
  import * as i3$2 from '@igo2/core/media';
@@ -67,11 +67,1028 @@ import * as i2$1 from '@angular/material/tabs';
67
67
  import { MatTabsModule } from '@angular/material/tabs';
68
68
  import * as i2$2 from '@angular/material/sidenav';
69
69
  import { MatSidenavModule } from '@angular/material/sidenav';
70
- import * as i1$5 from '@angular/platform-browser';
70
+ import * as i1$6 from '@angular/platform-browser';
71
71
  import { getEntityTitle } from '@igo2/common/entity';
72
72
  import { FlexibleComponent } from '@igo2/common/flexible';
73
73
  import { PanelComponent } from '@igo2/common/panel';
74
74
 
75
+ const ServiceType = [
76
+ 'wms',
77
+ 'wmts',
78
+ 'arcgisrest',
79
+ 'imagearcgisrest',
80
+ 'tilearcgisrest'
81
+ ];
82
+ var ServiceTypeEnum;
83
+ (function (ServiceTypeEnum) {
84
+ ServiceTypeEnum[ServiceTypeEnum["wms"] = 0] = "wms";
85
+ ServiceTypeEnum[ServiceTypeEnum["wmts"] = 1] = "wmts";
86
+ ServiceTypeEnum[ServiceTypeEnum["arcgisrest"] = 2] = "arcgisrest";
87
+ ServiceTypeEnum[ServiceTypeEnum["imagearcgisrest"] = 3] = "imagearcgisrest";
88
+ ServiceTypeEnum[ServiceTypeEnum["tilearcgisrest"] = 4] = "tilearcgisrest";
89
+ })(ServiceTypeEnum || (ServiceTypeEnum = {}));
90
+ const BaseLayerParamsKeys = [
91
+ 'visible',
92
+ 'opacity',
93
+ 'zIndex',
94
+ 'parentId'
95
+ ];
96
+ const LayerParamsKeys = [
97
+ 'index',
98
+ 'names',
99
+ 'type',
100
+ 'version',
101
+ 'queryString',
102
+ ...BaseLayerParamsKeys
103
+ ];
104
+ const GroupParamsKeys = [
105
+ 'title',
106
+ 'id',
107
+ 'expanded',
108
+ ...BaseLayerParamsKeys
109
+ ];
110
+ const PositionParamsKeys = [
111
+ 'center',
112
+ 'zoom',
113
+ 'rotation',
114
+ 'projection'
115
+ ];
116
+ const SHARE_MAP_KEYS_DEFAULT_OPTIONS = {
117
+ context: 'ctx',
118
+ urls: 'urls',
119
+ position: 'pos',
120
+ layers: 'layers',
121
+ groups: 'groups',
122
+ center: 'ctr',
123
+ zoom: 'z',
124
+ projection: 'p',
125
+ rotation: 'r',
126
+ opacity: 'o'
127
+ };
128
+
129
+ function shareMapKeyDefs(options) {
130
+ return {
131
+ contextKey: options.context,
132
+ urlsKey: options.urls,
133
+ languageKey: options.languageKey,
134
+ pos: {
135
+ key: options.position,
136
+ params: {
137
+ zoom: {
138
+ key: options.zoom,
139
+ parse: (params) => parseIntergerParam(params, options.zoom)
140
+ },
141
+ center: {
142
+ key: '@',
143
+ parse: parseCenter,
144
+ stringify: stringifyCenter
145
+ },
146
+ rotation: {
147
+ key: options.rotation,
148
+ parse: (params) => parseRotation(params, options.rotation),
149
+ stringify: formatNumber
150
+ },
151
+ projection: {
152
+ key: options.projection,
153
+ parse: (params) => extractParam(params, options.projection)
154
+ }
155
+ }
156
+ },
157
+ layers: {
158
+ key: options.layers,
159
+ params: {
160
+ index: undefined,
161
+ names: {
162
+ key: 'n',
163
+ parse: (params) => extractParam(params, 'n'),
164
+ stringify: (value) => `[${value}]`
165
+ },
166
+ opacity: {
167
+ key: 'o',
168
+ parse: (params) => parseFloatParam(params, 'o')
169
+ },
170
+ visible: {
171
+ key: 'v',
172
+ parse: (params) => parseBooleanParam(params, 'v'),
173
+ stringify: stringifyBoolean
174
+ },
175
+ type: {
176
+ key: 't',
177
+ parse: (params) => parseLayerType(params, 't'),
178
+ stringify: stringifyType
179
+ },
180
+ zIndex: {
181
+ key: 'z',
182
+ parse: (params) => parseIntergerParam(params, 'z')
183
+ },
184
+ parentId: {
185
+ key: 'pid',
186
+ parse: (params) => extractParam(params, 'pid')
187
+ },
188
+ version: {
189
+ key: 'vrn',
190
+ parse: (params) => extractParam(params, 'vrn')
191
+ },
192
+ queryString: {
193
+ key: 'q',
194
+ parse: (params) => extractParam(params, 'q')
195
+ }
196
+ }
197
+ },
198
+ groups: {
199
+ key: options.groups,
200
+ params: {
201
+ id: {
202
+ key: 'id',
203
+ parse: (params) => extractIdParam(params, 'id')
204
+ },
205
+ parentId: {
206
+ key: 'pid',
207
+ parse: (params) => extractIdParam(params, 'pid')
208
+ },
209
+ title: { key: 't', parse: (params) => extractParam(params, 't') },
210
+ visible: {
211
+ key: 'v',
212
+ parse: (params) => parseBooleanParam(params, 'v'),
213
+ stringify: stringifyBoolean
214
+ },
215
+ opacity: {
216
+ key: 'o',
217
+ parse: (params) => parseFloatParam(params, 'o')
218
+ },
219
+ zIndex: {
220
+ key: 'z',
221
+ parse: (params) => parseIntergerParam(params, 'z')
222
+ },
223
+ expanded: {
224
+ key: 'e',
225
+ parse: (params) => parseBooleanParam(params, 'e'),
226
+ stringify: stringifyBoolean
227
+ }
228
+ }
229
+ }
230
+ };
231
+ }
232
+ function stringifyBoolean(value) {
233
+ return value ? '1' : '0';
234
+ }
235
+ function parseBoolean(params) {
236
+ return !!parseInt(params);
237
+ }
238
+ function stringifyType(value) {
239
+ return String(ServiceTypeEnum[value]);
240
+ }
241
+ function parseLayerType(params, key) {
242
+ const param = extractParam(params, key);
243
+ if (!param) {
244
+ return;
245
+ }
246
+ const type = Number(param);
247
+ return ServiceTypeEnum[type];
248
+ }
249
+ function stringifyCenter(values) {
250
+ return values.map(formatNumber).join(',');
251
+ }
252
+ function parseCenter(params) {
253
+ if (!params?.startsWith('@')) {
254
+ return;
255
+ }
256
+ const paramsSplitted = params.split(',');
257
+ const index = paramsSplitted.findIndex((param) => param.startsWith('@'));
258
+ return [
259
+ Number(paramsSplitted[index].slice(1)),
260
+ Number(paramsSplitted[index + 1])
261
+ ];
262
+ }
263
+ function parseRotation(params, key) {
264
+ const param = extractParam(params, key);
265
+ if (!param) {
266
+ return;
267
+ }
268
+ const degree = parseInteger(param);
269
+ return (degree * Math.PI) / 180;
270
+ }
271
+ function parseIntergerParam(params, key) {
272
+ const param = extractParam(params, key);
273
+ if (!param) {
274
+ return;
275
+ }
276
+ return parseInteger(param);
277
+ }
278
+ function parseBooleanParam(params, key) {
279
+ const param = extractParam(params, key);
280
+ if (!param) {
281
+ return;
282
+ }
283
+ return parseBoolean(param);
284
+ }
285
+ function parseFloatParam(params, key) {
286
+ const param = extractParam(params, key);
287
+ if (!param) {
288
+ return;
289
+ }
290
+ return parseFloat(param);
291
+ }
292
+ function extractParam(params, suffix) {
293
+ return params
294
+ ?.split(',')
295
+ .find((param) => param.endsWith(suffix))
296
+ ?.slice(0, -suffix.length);
297
+ }
298
+ function extractIdParam(params, suffix) {
299
+ const paramsSplited = params.split(',');
300
+ // Find the parameter that ends with exact id/pid and isn't part of another word
301
+ const param = paramsSplited.find((param) => {
302
+ const key = param.slice(-suffix.length);
303
+ if (key !== suffix) {
304
+ return false;
305
+ }
306
+ if (suffix === 'pid') {
307
+ return true;
308
+ }
309
+ const prefixChar = param.slice(-suffix.length - 1, -suffix.length);
310
+ return prefixChar !== 'p';
311
+ });
312
+ return param?.slice(0, -suffix.length);
313
+ }
314
+ function parseInteger(value) {
315
+ return parseInt(value, 10);
316
+ }
317
+ function formatNumber(value) {
318
+ return value.toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
319
+ }
320
+
321
+ function buildDataSourceOptions(type, url, layers, version) {
322
+ const isLayerType = [
323
+ 'wmts',
324
+ 'arcgisrest',
325
+ 'imagearcgisrest',
326
+ 'tilearcgisrest'
327
+ ].includes(type);
328
+ const arcgisClause = type === 'arcgisrest' ||
329
+ type === 'imagearcgisrest' ||
330
+ type === 'tilearcgisrest';
331
+ const params = type === 'wms' ? { LAYERS: layers.join(','), VERSION: version } : undefined;
332
+ const layer = isLayerType ? layers.join(',') : undefined;
333
+ const baseParams = {
334
+ type: type,
335
+ url,
336
+ params,
337
+ layer,
338
+ version: type === 'wmts' ? '1.0.0' : undefined
339
+ };
340
+ if (arcgisClause) {
341
+ return {
342
+ ...baseParams,
343
+ queryable: true,
344
+ queryFormat: QueryFormat.ESRIJSON
345
+ };
346
+ }
347
+ return baseParams;
348
+ }
349
+ function getFlattenOptions(options) {
350
+ return options.reduce((accumulator, option) => {
351
+ if (isLayerGroupOptions(option)) {
352
+ const children = option.children
353
+ ? getFlattenOptions(option.children)
354
+ : [];
355
+ accumulator.push(option, ...children);
356
+ }
357
+ else {
358
+ accumulator.push(option);
359
+ }
360
+ return accumulator;
361
+ }, []);
362
+ }
363
+ /**
364
+ * Checks if the provided query parameters contain legacy parameter pairs
365
+ * (e.g., layers and URLs) that indicate older configuration formats.
366
+ */
367
+ function hasLegacyParams(params, optionsLegacy) {
368
+ const { layersKey, wmsUrlKey, wmsLayersKey, wmtsUrlKey, wmtsLayersKey, arcgisUrlKey, arcgisLayersKey, iarcgisUrlKey, iarcgisLayersKey, tarcgisUrlKey, tarcgisLayersKey } = optionsLegacy;
369
+ // Define valid legacy parameter pairs
370
+ const legacyPairs = [
371
+ [layersKey, wmsUrlKey],
372
+ [wmsLayersKey, wmsUrlKey],
373
+ [wmtsLayersKey, wmtsUrlKey],
374
+ [arcgisLayersKey, arcgisUrlKey],
375
+ [iarcgisLayersKey, iarcgisUrlKey],
376
+ [tarcgisLayersKey, tarcgisUrlKey]
377
+ ].filter(([layer, url]) => layer && url);
378
+ // Check if any legacy pair exists in the query parameters
379
+ return legacyPairs.some(([layer, url]) => getParamValue(params, layer) && getParamValue(params, url));
380
+ }
381
+ function hasModernShareParams(params, keysDefinitions) {
382
+ const { urlsKey, layers, groups } = keysDefinitions;
383
+ const hasGroups = !!getParamValue(params, groups.key);
384
+ const hasLayers = !!getParamValue(params, layers.key);
385
+ const hasUrls = !!getParamValue(params, urlsKey);
386
+ return (hasLayers && hasUrls) || hasGroups;
387
+ }
388
+ function getParamValue(params, key) {
389
+ const value = params[key];
390
+ return value !== '' ? value : undefined;
391
+ }
392
+
393
+ class ShareMapEncoder {
394
+ SHARE_MAP_DEFS;
395
+ document;
396
+ context;
397
+ constructor(SHARE_MAP_DEFS, document) {
398
+ this.SHARE_MAP_DEFS = SHARE_MAP_DEFS;
399
+ this.document = document;
400
+ }
401
+ generateUrl(map, context, publicShareOption, language) {
402
+ this.context = context;
403
+ const querystring = publicShareOption.layerlistControls?.querystring ?? '';
404
+ const layers = [
405
+ map.layerController.baseLayer,
406
+ ...map.layerController.layersFlattened
407
+ ].filter(Boolean);
408
+ const queryUrl = this.buildQueryUrl(layers, querystring);
409
+ const urlBaseConfig = this.getBaseUrlConfig(map.viewController, language);
410
+ return queryUrl !== '' ? urlBaseConfig + '&' + queryUrl : urlBaseConfig;
411
+ }
412
+ /**
413
+ * Replaces local group IDs with unique IDs to avoid conflicts and have short URL.
414
+ * This is necessary for sharing the map context.
415
+ */
416
+ replaceGroupLocalIds(layers) {
417
+ const idMap = new Map();
418
+ const existingIds = new Set(layers.map((layer) => layer.id).filter(Boolean));
419
+ // eslint-disable-next-line prefer-const
420
+ let counter = 1;
421
+ layers.forEach((layer) => {
422
+ if (layer.id && layer.id.includes(ID_GROUP_PREFIX)) {
423
+ const newId = this.getUniqueId(existingIds, counter);
424
+ idMap.set(layer.id, String(newId));
425
+ layer.options.id = newId;
426
+ }
427
+ });
428
+ }
429
+ getUniqueId(existingIds, counter) {
430
+ while (existingIds.has(String(counter))) {
431
+ counter++;
432
+ }
433
+ existingIds.add(String(counter));
434
+ return counter;
435
+ }
436
+ getCurrentContext() {
437
+ return ObjectUtils.removeUndefined({
438
+ layers: this.context?.layers,
439
+ center: this.context?.map.view.center,
440
+ projection: this.context?.map.view.projection,
441
+ zoom: this.context?.map.view.zoom,
442
+ rotation: this.context?.map.view.rotation
443
+ });
444
+ }
445
+ /**
446
+ * Filters layers to include only LayerGroups or LayerItems with a valid ServiceType.
447
+ */
448
+ isLayerSharable(layers) {
449
+ return layers.filter((layer) => isLayerGroup(layer) ||
450
+ (isLayerItem(layer) &&
451
+ ServiceType.includes(layer.dataSource?.options?.type)));
452
+ }
453
+ /**
454
+ * Extracts only LayerGroup items from the filtered layers.
455
+ */
456
+ getLayerGroups(layers) {
457
+ return layers.filter(isLayerGroup);
458
+ }
459
+ /**
460
+ * Extracts only LayerItem items from the filtered layers.
461
+ */
462
+ getLayerItems(layers) {
463
+ return layers.filter(isLayerItem);
464
+ }
465
+ buildQueryUrl(layers, querystring) {
466
+ const layersSharable = this.isLayerSharable(layers);
467
+ const layersChanged = this.getFilteredMapLayers(layersSharable);
468
+ const groups = this.getLayerGroups(layersChanged);
469
+ this.replaceGroupLocalIds(groups);
470
+ const groupsQueryUrl = this.buildGroupsQueryUrl(groups);
471
+ const layersByService = this.generateLayersOptionsByService(this.getLayerItems(layersChanged), querystring);
472
+ const layersQueryUrl = this.buildLayersQueryUrl(layersByService);
473
+ return [layersQueryUrl, groupsQueryUrl].filter(Boolean).join('&');
474
+ }
475
+ /**
476
+ * Retrieves the current context layers and maps them by identifier.
477
+ */
478
+ getContextLayersMap() {
479
+ const ctxLayers = this.getCurrentContext()?.layers || [];
480
+ const ctxFlattened = getFlattenOptions(ctxLayers);
481
+ return new Map(ctxFlattened.map((lctx) => {
482
+ const identifier = getLayerOptionIdentifier(lctx);
483
+ return [identifier, lctx];
484
+ }));
485
+ }
486
+ /**
487
+ * Filters layers and context layers based on visibility, opacity, and expanded state.
488
+ */
489
+ getFilteredMapLayers(filteredLayers) {
490
+ const ctxLayersMap = this.getContextLayersMap();
491
+ return filteredLayers.filter((layer) => {
492
+ const mapLayerIdentifier = getLayerOptionIdentifier(layer.options);
493
+ if (!mapLayerIdentifier)
494
+ return false;
495
+ const ctxLayer = ctxLayersMap.get(mapLayerIdentifier);
496
+ if (!ctxLayer)
497
+ return true;
498
+ const visibilityChange = layer.visible !== (ctxLayer.visible ?? true);
499
+ const opacityChange = layer.opacity !== (ctxLayer.opacity ?? 1);
500
+ const layerParentId = this.getIdsNestedParent(layer)?.join('.');
501
+ const ctxParentId = ctxLayer.parentId ?? findParentId(this.context.layers, ctxLayer);
502
+ const parentIdChange = ctxParentId !== layerParentId;
503
+ let expandedChange = false;
504
+ let titleChange = false;
505
+ if (isLayerGroup(layer) && isLayerGroupOptions(ctxLayer)) {
506
+ // Check if the layer group was assign an local id
507
+ // If so, we don't support any change for this case
508
+ if (String(ctxLayer.id).includes(ID_GROUP_PREFIX)) {
509
+ return false;
510
+ }
511
+ expandedChange = (ctxLayer.expanded ?? false) !== layer.expanded;
512
+ titleChange = (ctxLayer.title ?? false) !== layer.title;
513
+ }
514
+ return (visibilityChange ||
515
+ opacityChange ||
516
+ expandedChange ||
517
+ titleChange ||
518
+ parentIdChange);
519
+ });
520
+ }
521
+ getIdsNestedParent(node, ids) {
522
+ if (!node.parent)
523
+ return ids;
524
+ if (node.parent) {
525
+ if (!ids) {
526
+ ids = [node.parent.id];
527
+ }
528
+ else {
529
+ ids.unshift(node.parent.id);
530
+ }
531
+ return this.getIdsNestedParent(node.parent, ids);
532
+ }
533
+ return ids;
534
+ }
535
+ generateLayersOptionsByService(layers, querystring) {
536
+ const layersByUrl = new Map();
537
+ layers.forEach((layer) => {
538
+ const [url, params] = this.generateLayerOption(layer, querystring);
539
+ if (!layersByUrl.has(url)) {
540
+ layersByUrl.set(url, [params]);
541
+ }
542
+ else {
543
+ layersByUrl.get(url).push(params);
544
+ }
545
+ });
546
+ return Array.from(layersByUrl.entries()).map(([url, layerParams], i) => {
547
+ layerParams.forEach((params) => {
548
+ params.index = i;
549
+ });
550
+ return [url, layerParams];
551
+ });
552
+ }
553
+ generateLayerOption(layer, querystring) {
554
+ const dataSourceOptions = layer.dataSource.options;
555
+ return [
556
+ this.concatUrlWithVersion(dataSourceOptions),
557
+ this.getLayerParams(layer, querystring)
558
+ ];
559
+ }
560
+ getLayerNames(dataSourceOptions) {
561
+ const type = dataSourceOptions.type.toLowerCase();
562
+ if (type === 'wms') {
563
+ const params = dataSourceOptions
564
+ .params;
565
+ return params.LAYERS;
566
+ }
567
+ return 'layer' in dataSourceOptions ? dataSourceOptions.layer : '';
568
+ }
569
+ getWmsVersion(dataSourceOptions) {
570
+ const params = dataSourceOptions?.params;
571
+ return params?.VERSION && params.VERSION !== '1.3.0'
572
+ ? params.VERSION
573
+ : undefined;
574
+ }
575
+ concatUrlWithVersion(dataSourceOptions) {
576
+ const url = dataSourceOptions.url;
577
+ if (dataSourceOptions.type.toLowerCase() === 'wms') {
578
+ const version = this.getWmsVersion(dataSourceOptions);
579
+ if (version) {
580
+ const operator = url.includes('?') ? '&' : '?';
581
+ const { version: versionDef } = this.SHARE_MAP_DEFS.layers.params;
582
+ return `${url}${operator}${versionDef.key}=${version}`;
583
+ }
584
+ }
585
+ return dataSourceOptions.url;
586
+ }
587
+ getLayerParams(layer, queryString) {
588
+ const dataSourceOptions = layer.dataSource.options;
589
+ return {
590
+ index: undefined,
591
+ names: this.getLayerNames(dataSourceOptions),
592
+ type: dataSourceOptions?.type,
593
+ opacity: this.getOpacity(layer.opacity),
594
+ parentId: layer.parent?.id,
595
+ visible: this.getVisibility(layer.visible),
596
+ zIndex: layer.zIndex,
597
+ queryString: this.getQueryString(dataSourceOptions?.type, queryString)
598
+ };
599
+ }
600
+ getOpacity(opacity) {
601
+ return opacity === 1 ? undefined : opacity;
602
+ }
603
+ getVisibility(visibility) {
604
+ return !!visibility;
605
+ }
606
+ getQueryString(type, queryString) {
607
+ return (type === 'wms' || type === 'wmts') && queryString !== ''
608
+ ? queryString
609
+ : undefined;
610
+ }
611
+ buildLayersQueryUrl(layersByService) {
612
+ if (layersByService.length === 0)
613
+ return undefined;
614
+ const { urlsKey, layers } = this.SHARE_MAP_DEFS;
615
+ const urls = layersByService.map(([url]) => url).join(',');
616
+ const layersWithParams = layersByService
617
+ .flatMap(([_, params]) => params.map((p) => this.stringifyLayerParams(p)))
618
+ .join(';');
619
+ return `${urlsKey}=${urls}&${layers.key}=${layersWithParams}`;
620
+ }
621
+ stringifyLayerParams(params) {
622
+ const { index, ...restParams } = params;
623
+ const stringifiedParams = this.stringifyDefinitions(restParams, this.SHARE_MAP_DEFS.layers.params);
624
+ return `${index},${stringifiedParams}`;
625
+ }
626
+ getBaseUrlConfig(viewController, language) {
627
+ const { pos, contextKey, languageKey } = this.SHARE_MAP_DEFS;
628
+ const href = this.document.location.href;
629
+ const baseUrl = this.sanitizeBaseUrl(href);
630
+ const params = [];
631
+ if (pos) {
632
+ const positionStringified = this.stringifyPosition(this.getPosition(viewController));
633
+ params.push(`${pos.key}=${positionStringified}`);
634
+ }
635
+ const contextUri = this.context?.uri;
636
+ if (contextUri)
637
+ params.push(`${contextKey}=${contextUri}`);
638
+ if (language && !baseUrl.includes(`${languageKey}=`))
639
+ params.push(`${languageKey}=${language}`);
640
+ return `${baseUrl}${params.join('&')}`;
641
+ }
642
+ sanitizeBaseUrl(baseUrl) {
643
+ if (!baseUrl.includes('?')) {
644
+ return `${baseUrl}?`;
645
+ }
646
+ const keys = this.extractKeys(this.SHARE_MAP_DEFS);
647
+ const [base, queryString] = baseUrl.split('?');
648
+ const params = new URLSearchParams(queryString);
649
+ keys.forEach((key) => {
650
+ params.delete(key);
651
+ });
652
+ const newQueryString = params.toString();
653
+ if (newQueryString !== '') {
654
+ return `${base}?${newQueryString}&`;
655
+ }
656
+ return `${base}?`;
657
+ }
658
+ extractKeys(defs) {
659
+ const keys = [];
660
+ for (const key in defs) {
661
+ if (Object.prototype.hasOwnProperty.call(defs, key)) {
662
+ const value = defs[key];
663
+ if (typeof value === 'string') {
664
+ keys.push(value);
665
+ }
666
+ else if (typeof value === 'object' && value !== null) {
667
+ keys.push(value.key);
668
+ }
669
+ }
670
+ }
671
+ return keys;
672
+ }
673
+ getPosition(viewController) {
674
+ return ObjectUtils.removeUndefined({
675
+ center: viewController.getCenter('EPSG:4326'),
676
+ zoom: this.getZoom(viewController),
677
+ rotation: this.getRotation(viewController),
678
+ projection: this.getProjection(viewController)
679
+ });
680
+ }
681
+ getProjection(viewController) {
682
+ const ctxProjection = this.getCurrentContext().projection;
683
+ const mapProjection = viewController.getOlProjection().getCode();
684
+ return ctxProjection === mapProjection ? undefined : mapProjection;
685
+ }
686
+ getZoom(viewController) {
687
+ const mapZoom = viewController.getZoom();
688
+ const ctxZoom = this.getCurrentContext().zoom;
689
+ return ctxZoom === mapZoom ? undefined : mapZoom;
690
+ }
691
+ getRotation(viewController) {
692
+ const rotationRadians = viewController.getRotation();
693
+ const rotationDegree = (rotationRadians * 180) / Math.PI;
694
+ const ctxRotation = this.getCurrentContext().rotation;
695
+ return rotationDegree === ctxRotation || rotationDegree === 0
696
+ ? undefined
697
+ : rotationDegree;
698
+ }
699
+ stringifyPosition(position) {
700
+ const definitions = this.SHARE_MAP_DEFS.pos.params;
701
+ const { center, ...restPosition } = position;
702
+ const stringifiedParams = this.stringifyDefinitions(restPosition, definitions);
703
+ const result = [
704
+ `${definitions.center.key}${definitions.center.stringify(center)}`,
705
+ stringifiedParams
706
+ ].filter(Boolean);
707
+ return result.join(',');
708
+ }
709
+ stringifyDefinitions(values, definitions) {
710
+ const result = Object.keys(ObjectUtils.removeUndefined(values))
711
+ .map((key) => {
712
+ const { key: defKey, stringify } = definitions[key];
713
+ const value = stringify ? stringify(values[key]) : values[key];
714
+ return `${value}${defKey}`;
715
+ })
716
+ .join(',');
717
+ return result === '' ? undefined : result;
718
+ }
719
+ buildGroupsQueryUrl(layers) {
720
+ if (layers.length === 0)
721
+ return undefined;
722
+ const { key } = this.SHARE_MAP_DEFS.groups;
723
+ const queryUrl = layers
724
+ .map((layer) => {
725
+ const params = this.getLayerGroupParams(layer);
726
+ return this.stringifyGroupParams(params);
727
+ })
728
+ .join(';');
729
+ return `${key}=${queryUrl}`;
730
+ }
731
+ getLayerGroupParams(layer) {
732
+ return {
733
+ id: layer.id,
734
+ title: layer.title,
735
+ zIndex: layer.zIndex,
736
+ parentId: layer.parent?.id,
737
+ visible: this.getVisibility(layer.visible),
738
+ opacity: this.getOpacity(layer.opacity),
739
+ expanded: layer.expanded
740
+ };
741
+ }
742
+ stringifyGroupParams(params) {
743
+ return this.stringifyDefinitions(params, this.SHARE_MAP_DEFS.groups.params);
744
+ }
745
+ }
746
+
747
+ class ShareMapLegacyParser {
748
+ options;
749
+ constructor(options) {
750
+ this.options = options;
751
+ }
752
+ parseUrl(params) {
753
+ const layerOptions = ServiceType.flatMap((type) => this.readLayersQueryParamsByType(params, type)).filter(Boolean);
754
+ return layerOptions;
755
+ }
756
+ parsePosition(params) {
757
+ const center = params[this.options.centerKey];
758
+ const projection = params[this.options.projectionKey];
759
+ const zoom = params[this.options.zoomKey];
760
+ const rotation = params[this.options.rotationKey];
761
+ return ObjectUtils.removeUndefined({
762
+ center: center?.split(',').map(Number),
763
+ projection,
764
+ zoom: zoom ? Number(zoom) : undefined,
765
+ rotation: rotation ? Number(rotation) : undefined
766
+ });
767
+ }
768
+ readLayersQueryParamsByType(params, type) {
769
+ const [nameParamLayersKey, urlsKey] = this.getQueryKeyByType(params, type);
770
+ if (!nameParamLayersKey || !urlsKey) {
771
+ return undefined;
772
+ }
773
+ const layersByService = params[nameParamLayersKey].split('),(');
774
+ const urls = params[urlsKey].split(',');
775
+ return urls
776
+ .map((urlSrc, index) => {
777
+ // Sanitize URL and extract version
778
+ const [url, version] = this.sanitizeUrl(urlSrc);
779
+ const layersConfig = this.extractLayersByService(this.removeParenthesis(layersByService[index]));
780
+ // Generate layer options for the current service
781
+ return this.extractLayersOptions(layersConfig, url, type, version, params);
782
+ })
783
+ .flat();
784
+ }
785
+ getQueryKeyByType(params, type) {
786
+ let nameParamLayersKey;
787
+ let urlsKey;
788
+ const { layersKey, wmsUrlKey, wmsLayersKey, wmtsUrlKey, wmtsLayersKey, arcgisUrlKey, arcgisLayersKey, iarcgisUrlKey, iarcgisLayersKey, tarcgisUrlKey, tarcgisLayersKey } = this.options;
789
+ switch (type) {
790
+ case 'wms':
791
+ if ((params[layersKey] || params[wmsLayersKey]) && params[wmsUrlKey]) {
792
+ urlsKey = wmsUrlKey;
793
+ nameParamLayersKey = params[wmsLayersKey] ? wmsLayersKey : layersKey;
794
+ }
795
+ break;
796
+ case 'wmts':
797
+ if (params[wmtsLayersKey] && params[wmtsUrlKey]) {
798
+ urlsKey = wmtsUrlKey;
799
+ nameParamLayersKey = wmtsLayersKey;
800
+ }
801
+ break;
802
+ case 'arcgisrest':
803
+ if (params[arcgisLayersKey] && params[arcgisUrlKey]) {
804
+ urlsKey = arcgisUrlKey;
805
+ nameParamLayersKey = arcgisLayersKey;
806
+ }
807
+ break;
808
+ case 'imagearcgisrest':
809
+ if (params[iarcgisLayersKey] && params[iarcgisUrlKey]) {
810
+ urlsKey = iarcgisUrlKey;
811
+ nameParamLayersKey = iarcgisLayersKey;
812
+ }
813
+ break;
814
+ case 'tilearcgisrest':
815
+ if (params[tarcgisLayersKey] && params[tarcgisUrlKey]) {
816
+ urlsKey = tarcgisUrlKey;
817
+ nameParamLayersKey = tarcgisLayersKey;
818
+ }
819
+ break;
820
+ }
821
+ if (!nameParamLayersKey || !urlsKey) {
822
+ return [undefined, undefined];
823
+ }
824
+ return [nameParamLayersKey, urlsKey];
825
+ }
826
+ sanitizeUrl(url) {
827
+ const version = this.getQueryParam('version', url.toLocaleLowerCase()) || undefined;
828
+ if (version) {
829
+ const versionRegex = new RegExp(`[?&]version=${version}`, 'i');
830
+ url = url.replace(versionRegex, '').replace(/[?&]$/, '');
831
+ }
832
+ if (url.endsWith('?')) {
833
+ url = url.substring(0, url.length - 1);
834
+ }
835
+ return [url, version];
836
+ }
837
+ getQueryParam(name, url) {
838
+ let paramValue;
839
+ if (url.includes('?')) {
840
+ const httpParams = new HttpParams({ fromString: url.split('?')[1] });
841
+ paramValue = httpParams.get(name);
842
+ }
843
+ return paramValue;
844
+ }
845
+ extractLayersByService(layersByService) {
846
+ if (!layersByService.includes(':igoz')) {
847
+ return [
848
+ {
849
+ layers: layersByService.split(','),
850
+ zIndex: null
851
+ }
852
+ ];
853
+ }
854
+ const layers = layersByService.match(/([^(),:]+(?:,[^(),:]+)*(:[^(),:]+(?:[:][^(),:]+)*)?)/g);
855
+ return layers.map((layer) => {
856
+ const [names, zIndex] = layer.split(':igoz');
857
+ return {
858
+ layers: names.split(','),
859
+ zIndex: parseInt(zIndex)
860
+ };
861
+ });
862
+ }
863
+ removeParenthesis(value) {
864
+ if (value.startsWith('(')) {
865
+ value = value.substr(1);
866
+ }
867
+ if (value.endsWith(')')) {
868
+ value = value.slice(0, -1);
869
+ }
870
+ return value;
871
+ }
872
+ extractLayersOptions(layersConfig, url, type, version, params) {
873
+ return layersConfig.map((layerConfig) => {
874
+ const sourceOptions = buildDataSourceOptions(type, url, layerConfig.layers, version);
875
+ const id = generateIdFromSourceOptions(sourceOptions);
876
+ const visible = this.computeLayerVisibilityFromUrl(params, id);
877
+ return ObjectUtils.removeUndefined({
878
+ id,
879
+ visible: visible,
880
+ zIndex: layerConfig.zIndex,
881
+ sourceOptions
882
+ });
883
+ });
884
+ }
885
+ computeLayerVisibilityFromUrl(params, currentLayerid) {
886
+ const queryParams = params;
887
+ let visible = true;
888
+ if (!queryParams || !currentLayerid) {
889
+ return visible;
890
+ }
891
+ let visibleOnLayersParams = '';
892
+ let visibleOffLayersParams = '';
893
+ let visiblelayers = [];
894
+ let invisiblelayers = [];
895
+ if (queryParams['visiblelayers']) {
896
+ visibleOnLayersParams = queryParams['visiblelayers'];
897
+ }
898
+ if (queryParams['invisiblelayers']) {
899
+ visibleOffLayersParams = queryParams['invisiblelayers'];
900
+ }
901
+ /* This order is important because to control whichever
902
+ the order of * param. First whe open and close everything.*/
903
+ if (visibleOnLayersParams === '*') {
904
+ visible = true;
905
+ }
906
+ if (visibleOffLayersParams === '*') {
907
+ visible = false;
908
+ }
909
+ // After, managing named layer by id (context.json OR id from datasource)
910
+ visiblelayers = visibleOnLayersParams.split(',');
911
+ invisiblelayers = visibleOffLayersParams.split(',');
912
+ if (visiblelayers.indexOf(currentLayerid) > -1 ||
913
+ visiblelayers.indexOf(currentLayerid.toString()) > -1) {
914
+ visible = true;
915
+ }
916
+ if (invisiblelayers.indexOf(currentLayerid) > -1 ||
917
+ invisiblelayers.indexOf(currentLayerid.toString()) > -1) {
918
+ visible = false;
919
+ }
920
+ return visible;
921
+ }
922
+ }
923
+
924
+ class ShareMapParser {
925
+ keysDefinitions;
926
+ legacyOptions;
927
+ legacy;
928
+ constructor(keysDefinitions, legacyOptions) {
929
+ this.keysDefinitions = keysDefinitions;
930
+ this.legacyOptions = legacyOptions;
931
+ this.legacy = new ShareMapLegacyParser(legacyOptions);
932
+ }
933
+ parseLayers(params) {
934
+ if (!hasModernShareParams(params, this.keysDefinitions) &&
935
+ hasLegacyParams(params, this.legacyOptions)) {
936
+ return this.legacy.parseUrl(params);
937
+ }
938
+ const { urlsKey, layers: layersDef, groups: groupsDef } = this.keysDefinitions;
939
+ const layersArray = this.splitParam(getParamValue(params, layersDef.key), ';');
940
+ const urlsArray = this.splitParam(getParamValue(params, urlsKey), ',');
941
+ const groupsArray = this.splitParam(getParamValue(params, groupsDef.key), ';');
942
+ const groupsOptions = groupsArray.map((layer) => this.parseGroup(layer));
943
+ const layersOptions = layersArray
944
+ .map((layer) => this.parseLayer(layer, urlsArray))
945
+ .filter(Boolean);
946
+ return [...groupsOptions, ...layersOptions];
947
+ }
948
+ splitParam(value, delimiter) {
949
+ return value ? value.split(delimiter) : [];
950
+ }
951
+ parsePosition(params) {
952
+ const position = params[this.keysDefinitions.pos.key];
953
+ if (!position) {
954
+ return this.legacy.parsePosition(params);
955
+ }
956
+ const { center, zoom, rotation, projection } = this.keysDefinitions.pos.params;
957
+ return ObjectUtils.removeUndefined({
958
+ center: center.parse(position),
959
+ zoom: zoom.parse(position),
960
+ rotation: rotation.parse(position),
961
+ projection: projection.parse(position)
962
+ });
963
+ }
964
+ parseLayer(layer, urls) {
965
+ const urlIndex = this.extractUrlIndex(layer);
966
+ if (urlIndex === undefined)
967
+ return undefined;
968
+ const layerNames = this.extractLayerNames(layer);
969
+ if (layerNames === undefined)
970
+ return undefined;
971
+ const { zIndex, visibility, type, opacity, parentId } = this.extractLayerProperties(layer);
972
+ const url = urls[urlIndex];
973
+ const version = this.extractVersionFromUrl(url);
974
+ const sourceOptions = buildDataSourceOptions(type, url, layerNames, version);
975
+ return ObjectUtils.removeUndefined({
976
+ sourceOptions,
977
+ visible: visibility,
978
+ zIndex,
979
+ opacity,
980
+ parentId
981
+ });
982
+ }
983
+ parseGroup(properties) {
984
+ const { params } = this.keysDefinitions.groups;
985
+ return ObjectUtils.removeUndefined({
986
+ id: params.id.parse(properties),
987
+ title: params.title.parse(properties),
988
+ zIndex: params.zIndex.parse(properties),
989
+ visible: params.visible.parse(properties),
990
+ opacity: params.opacity.parse(properties),
991
+ parentId: params.parentId.parse(properties),
992
+ expanded: params.expanded.parse(properties),
993
+ type: 'group'
994
+ });
995
+ }
996
+ extractVersionFromUrl(url) {
997
+ const versionDef = this.keysDefinitions.layers.params.version;
998
+ return versionDef.parse(url);
999
+ }
1000
+ extractUrlIndex(layer) {
1001
+ const { index } = this.keysDefinitions.layers.params;
1002
+ const regex = index ? new RegExp(`([\\d.]+)${index}`) : /([\d.]+)/;
1003
+ const match = layer.match(regex);
1004
+ return match ? parseInt(match[1], 10) : undefined;
1005
+ }
1006
+ extractLayerNames(layer) {
1007
+ const { names } = this.keysDefinitions.layers.params;
1008
+ const pattern = new RegExp(`\\[.*?\\]${names.key}`, 'g');
1009
+ const matches = layer.match(pattern);
1010
+ if (!matches)
1011
+ return undefined;
1012
+ return matches
1013
+ .map((match) => match.slice(1, -`]${names.key}`.length))
1014
+ .join('\n')
1015
+ .split(',');
1016
+ }
1017
+ extractLayerProperties(properties) {
1018
+ const { params } = this.keysDefinitions.layers;
1019
+ return {
1020
+ zIndex: params.zIndex.parse(properties),
1021
+ visibility: params.visible.parse(properties),
1022
+ type: params.type.parse(properties),
1023
+ opacity: params.opacity.parse(properties),
1024
+ parentId: params.parentId.parse(properties)
1025
+ };
1026
+ }
1027
+ }
1028
+
1029
+ class ShareMapService {
1030
+ routeService;
1031
+ document;
1032
+ language = '';
1033
+ options;
1034
+ optionsLegacy;
1035
+ keysDefinitions;
1036
+ encoder;
1037
+ parser;
1038
+ constructor(routeService, document) {
1039
+ this.routeService = routeService;
1040
+ this.document = document;
1041
+ this.options = SHARE_MAP_KEYS_DEFAULT_OPTIONS;
1042
+ this.optionsLegacy = this.routeService.legacyOptions;
1043
+ this.keysDefinitions = shareMapKeyDefs({
1044
+ ...SHARE_MAP_KEYS_DEFAULT_OPTIONS,
1045
+ languageKey: this.routeService.options.languageKey
1046
+ });
1047
+ this.encoder = new ShareMapEncoder(this.keysDefinitions, document);
1048
+ this.parser = new ShareMapParser(this.keysDefinitions, this.routeService.legacyOptions);
1049
+ this.routeService.queryParams.subscribe((params) => {
1050
+ const language = this.options.languageKey;
1051
+ if (params[language]) {
1052
+ this.language = params[language];
1053
+ }
1054
+ });
1055
+ }
1056
+ getContext(params) {
1057
+ return (params[this.options.context] ?? params[this.optionsLegacy.contextKey]);
1058
+ }
1059
+ getZoom(params) {
1060
+ return this.parser.parsePosition(params).zoom;
1061
+ }
1062
+ getUrlWithApi(formValues) {
1063
+ const loc = this.document.location;
1064
+ const origin = loc.origin;
1065
+ const pathname = loc.pathname;
1066
+ return this.language
1067
+ ? `${origin + pathname}?context=${formValues.uri}&lang=${this.language}`
1068
+ : `${origin + pathname}?context=${formValues.uri}`;
1069
+ }
1070
+ hasPositionParams(params) {
1071
+ const { projectionKey, rotationKey, zoomKey, centerKey } = this.optionsLegacy;
1072
+ const { pos } = this.keysDefinitions;
1073
+ return Boolean(params[pos.key] ||
1074
+ params[projectionKey] ||
1075
+ params[rotationKey] ||
1076
+ params[zoomKey] ||
1077
+ params[centerKey]);
1078
+ }
1079
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapService, deps: [{ token: i1.RouteService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
1080
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapService, providedIn: 'root' });
1081
+ }
1082
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapService, decorators: [{
1083
+ type: Injectable,
1084
+ args: [{
1085
+ providedIn: 'root'
1086
+ }]
1087
+ }], ctorParameters: () => [{ type: i1.RouteService }, { type: Document, decorators: [{
1088
+ type: Inject,
1089
+ args: [DOCUMENT]
1090
+ }] }] });
1091
+
75
1092
  var TypePermission;
76
1093
  (function (TypePermission) {
77
1094
  TypePermission[TypePermission["null"] = 0] = "null";
@@ -93,6 +1110,7 @@ class ContextService {
93
1110
  messageService;
94
1111
  storageService;
95
1112
  exportService;
1113
+ shareMapService;
96
1114
  route;
97
1115
  context$ = new BehaviorSubject(undefined);
98
1116
  contexts$ = new BehaviorSubject({ ours: [] });
@@ -116,7 +1134,7 @@ class ContextService {
116
1134
  this._defaultContextUri = uri;
117
1135
  }
118
1136
  _defaultContextUri;
119
- constructor(http, authService, languageService, config, messageService, storageService, exportService, route) {
1137
+ constructor(http, authService, languageService, config, messageService, storageService, exportService, shareMapService, route) {
120
1138
  this.http = http;
121
1139
  this.authService = authService;
122
1140
  this.languageService = languageService;
@@ -124,6 +1142,7 @@ class ContextService {
124
1142
  this.messageService = messageService;
125
1143
  this.storageService = storageService;
126
1144
  this.exportService = exportService;
1145
+ this.shareMapService = shareMapService;
127
1146
  this.route = route;
128
1147
  this.options = Object.assign({
129
1148
  basePath: 'contexts',
@@ -131,7 +1150,6 @@ class ContextService {
131
1150
  defaultContextUri: '_default'
132
1151
  }, this.config.getConfig('context'));
133
1152
  this.baseUrl = this.options.url ?? '';
134
- this.readParamsFromRoute();
135
1153
  if (this.authService.hasAuthService) {
136
1154
  this.authService.logged$.subscribe((logged) => {
137
1155
  if (logged) {
@@ -343,9 +1361,9 @@ class ContextService {
343
1361
  this.loadContext(this.defaultContextUri);
344
1362
  }
345
1363
  };
346
- if (this.route && this.route.options.contextKey) {
1364
+ if (this.route) {
347
1365
  this.route.queryParams.pipe(debounceTime(100)).subscribe((params) => {
348
- const contextParam = params[this.route.options.contextKey];
1366
+ const contextParam = this.shareMapService.getContext(params);
349
1367
  let direct = false;
350
1368
  if (contextParam) {
351
1369
  this.defaultContextUri = contextParam;
@@ -568,28 +1586,6 @@ class ContextService {
568
1586
  getContextLayers(map) {
569
1587
  return map.layerController.treeLayers;
570
1588
  }
571
- readParamsFromRoute() {
572
- if (!this.route) {
573
- return;
574
- }
575
- this.route.queryParams.subscribe((params) => {
576
- const centerKey = this.route.options.centerKey;
577
- if (centerKey && params[centerKey]) {
578
- const centerParams = params[centerKey];
579
- this.mapViewFromRoute.center = centerParams.split(',').map(Number);
580
- }
581
- const projectionKey = this.route.options.projectionKey;
582
- if (projectionKey && params[projectionKey]) {
583
- const projectionParam = params[projectionKey];
584
- this.mapViewFromRoute.projection = projectionParam;
585
- }
586
- const zoomKey = this.route.options.zoomKey;
587
- if (zoomKey && params[zoomKey]) {
588
- const zoomParam = params[zoomKey];
589
- this.mapViewFromRoute.zoom = Number(zoomParam);
590
- }
591
- });
592
- }
593
1589
  getPath(file) {
594
1590
  const basePath = this.options.basePath.replace(/\/$/, '');
595
1591
  return `${basePath}/${file}`;
@@ -663,7 +1659,7 @@ class ContextService {
663
1659
  }
664
1660
  return found;
665
1661
  }
666
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextService, deps: [{ token: i1.HttpClient }, { token: i2.AuthService }, { token: i4.LanguageService }, { token: i1$1.ConfigService }, { token: i3.MessageService }, { token: i6.StorageService }, { token: i1$2.ExportService }, { token: i8.RouteService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
1662
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextService, deps: [{ token: i1$1.HttpClient }, { token: i2.AuthService }, { token: i4.LanguageService }, { token: i1$2.ConfigService }, { token: i3.MessageService }, { token: i6.StorageService }, { token: i1$3.ExportService }, { token: ShareMapService }, { token: i1.RouteService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
667
1663
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextService, providedIn: 'root' });
668
1664
  }
669
1665
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextService, decorators: [{
@@ -671,7 +1667,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
671
1667
  args: [{
672
1668
  providedIn: 'root'
673
1669
  }]
674
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.AuthService }, { type: i4.LanguageService }, { type: i1$1.ConfigService }, { type: i3.MessageService }, { type: i6.StorageService }, { type: i1$2.ExportService }, { type: i8.RouteService, decorators: [{
1670
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2.AuthService }, { type: i4.LanguageService }, { type: i1$2.ConfigService }, { type: i3.MessageService }, { type: i6.StorageService }, { type: i1$3.ExportService }, { type: ShareMapService }, { type: i1.RouteService, decorators: [{
675
1671
  type: Optional
676
1672
  }] }] });
677
1673
 
@@ -981,7 +1977,7 @@ class ContextImportService {
981
1977
  const context = JSON.parse(data);
982
1978
  return context;
983
1979
  }
984
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportService, deps: [{ token: i1$1.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
1980
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportService, deps: [{ token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
985
1981
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportService, providedIn: 'root' });
986
1982
  }
987
1983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportService, decorators: [{
@@ -989,7 +1985,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
989
1985
  args: [{
990
1986
  providedIn: 'root'
991
1987
  }]
992
- }], ctorParameters: () => [{ type: i1$1.ConfigService }] });
1988
+ }], ctorParameters: () => [{ type: i1$2.ConfigService }] });
993
1989
 
994
1990
  class ContextImportExportComponent {
995
1991
  contextImportService;
@@ -1085,8 +2081,8 @@ class ContextImportExportComponent {
1085
2081
  onImportExportChange(event) {
1086
2082
  this.activeImportExport = event.value;
1087
2083
  }
1088
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportExportComponent, deps: [{ token: ContextImportService }, { token: ContextExportService }, { token: i3.MessageService }, { token: i4$1.UntypedFormBuilder }, { token: i1$1.ConfigService }, { token: ContextService }], target: i0.ɵɵFactoryTarget.Component });
1089
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextImportExportComponent, isStandalone: true, selector: "igo-context-import-export", inputs: { map: "map" }, ngImport: i0, template: "<div class=\"import-export-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeImportExport\"\n (change)=\"onImportExportChange($event)\"\n >\n <mat-button-toggle [value]=\"'import'\">\n {{ 'igo.geo.importExportForm.importTabTitle' | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{ 'igo.geo.importExportForm.exportTabTitle' | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<div *ngIf=\"activeImportExport === 'import'\">\n <form class=\"igo-form\">\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n [disabled]=\"loading$ | async\"\n >\n {{ 'igo.geo.importExportForm.importButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($any($event.target).files)\"\n />\n </div>\n </form>\n <section class=\"mat-typography\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n </ul>\n </section>\n</div>\n\n<form\n class=\"igo-form\"\n *ngIf=\"activeImportExport === 'export'\"\n [formGroup]=\"form\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>{{\n 'igo.context.contextImportExport.export.exportContextName' | translate\n }}</mat-label>\n <input formControlName=\"name\" matInput [value]=\"\" />\n </mat-form-field>\n </div>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.context.contextImportExport.export.exportPlaceHolder' | translate\n }}</mat-label>\n <mat-select formControlName=\"layers\" multiple>\n <mat-option [value]=\"1\" (click)=\"selectAll(e)\" #e>\n {{\n 'igo.context.contextImportExport.export.exportSelectAll' | translate\n }}\n </mat-option>\n <mat-divider></mat-divider>\n <mat-option\n *ngFor=\"let layer of userControlledLayerList\"\n [value]=\"layer\"\n >{{ layer.title }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\"\n >\n {{ 'igo.geo.importExportForm.exportButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n</form>\n", styles: [".import-export-toggle{padding:10px;text-align:center}.import-export-toggle mat-button-toggle-group{width:100%}.import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}.igo-input-container{padding:10px}.igo-input-container mat-form-field{width:100%}h4{padding:0 5px}.igo-form{padding:15px 5px}.igo-form-button-group{text-align:center;padding-top:10px}igo-spinner{position:absolute;padding-left:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i7.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: SpinnerComponent, selector: "igo-spinner", inputs: ["shown"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2084
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportExportComponent, deps: [{ token: ContextImportService }, { token: ContextExportService }, { token: i3.MessageService }, { token: i4$1.UntypedFormBuilder }, { token: i1$2.ConfigService }, { token: ContextService }], target: i0.ɵɵFactoryTarget.Component });
2085
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextImportExportComponent, isStandalone: true, selector: "igo-context-import-export", inputs: { map: "map" }, ngImport: i0, template: "<div class=\"import-export-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeImportExport\"\n (change)=\"onImportExportChange($event)\"\n >\n <mat-button-toggle [value]=\"'import'\">\n {{ 'igo.geo.importExportForm.importTabTitle' | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{ 'igo.geo.importExportForm.exportTabTitle' | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<div *ngIf=\"activeImportExport === 'import'\">\n <form class=\"igo-form\">\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n [disabled]=\"loading$ | async\"\n >\n {{ 'igo.geo.importExportForm.importButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($any($event.target).files)\"\n />\n </div>\n </form>\n <section class=\"mat-typography\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n </ul>\n </section>\n</div>\n\n<form\n class=\"igo-form\"\n *ngIf=\"activeImportExport === 'export'\"\n [formGroup]=\"form\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>{{\n 'igo.context.contextImportExport.export.exportContextName' | translate\n }}</mat-label>\n <input formControlName=\"name\" matInput [value]=\"\" />\n </mat-form-field>\n </div>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.context.contextImportExport.export.exportPlaceHolder' | translate\n }}</mat-label>\n <mat-select formControlName=\"layers\" multiple>\n <mat-option [value]=\"1\" (click)=\"selectAll(e)\" #e>\n {{\n 'igo.context.contextImportExport.export.exportSelectAll' | translate\n }}\n </mat-option>\n <mat-divider></mat-divider>\n <mat-option\n *ngFor=\"let layer of userControlledLayerList\"\n [value]=\"layer\"\n >{{ layer.title }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\"\n >\n {{ 'igo.geo.importExportForm.exportButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n</form>\n", styles: [".import-export-toggle{padding:10px;text-align:center}.import-export-toggle mat-button-toggle-group{width:100%}.import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}.igo-input-container{padding:10px}.igo-input-container mat-form-field{width:100%}h4{padding:0 5px}.igo-form{padding:15px 5px}.igo-form-button-group{text-align:center;padding-top:10px}igo-spinner{position:absolute;padding-left:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i7.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: SpinnerComponent, selector: "igo-spinner", inputs: ["shown"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
1090
2086
  }
1091
2087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextImportExportComponent, decorators: [{
1092
2088
  type: Component,
@@ -1106,7 +2102,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
1106
2102
  AsyncPipe,
1107
2103
  IgoLanguageModule
1108
2104
  ], template: "<div class=\"import-export-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"activeImportExport\"\n (change)=\"onImportExportChange($event)\"\n >\n <mat-button-toggle [value]=\"'import'\">\n {{ 'igo.geo.importExportForm.importTabTitle' | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{ 'igo.geo.importExportForm.exportTabTitle' | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<div *ngIf=\"activeImportExport === 'import'\">\n <form class=\"igo-form\">\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n [disabled]=\"loading$ | async\"\n >\n {{ 'igo.geo.importExportForm.importButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($any($event.target).files)\"\n />\n </div>\n </form>\n <section class=\"mat-typography\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n </ul>\n </section>\n</div>\n\n<form\n class=\"igo-form\"\n *ngIf=\"activeImportExport === 'export'\"\n [formGroup]=\"form\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>{{\n 'igo.context.contextImportExport.export.exportContextName' | translate\n }}</mat-label>\n <input formControlName=\"name\" matInput [value]=\"\" />\n </mat-form-field>\n </div>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.context.contextImportExport.export.exportPlaceHolder' | translate\n }}</mat-label>\n <mat-select formControlName=\"layers\" multiple>\n <mat-option [value]=\"1\" (click)=\"selectAll(e)\" #e>\n {{\n 'igo.context.contextImportExport.export.exportSelectAll' | translate\n }}\n </mat-option>\n <mat-divider></mat-divider>\n <mat-option\n *ngFor=\"let layer of userControlledLayerList\"\n [value]=\"layer\"\n >{{ layer.title }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\"\n >\n {{ 'igo.geo.importExportForm.exportButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n</form>\n", styles: [".import-export-toggle{padding:10px;text-align:center}.import-export-toggle mat-button-toggle-group{width:100%}.import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}.igo-input-container{padding:10px}.igo-input-container mat-form-field{width:100%}h4{padding:0 5px}.igo-form{padding:15px 5px}.igo-form-button-group{text-align:center;padding-top:10px}igo-spinner{position:absolute;padding-left:10px}\n"] }]
1109
- }], ctorParameters: () => [{ type: ContextImportService }, { type: ContextExportService }, { type: i3.MessageService }, { type: i4$1.UntypedFormBuilder }, { type: i1$1.ConfigService }, { type: ContextService }], propDecorators: { map: [{
2105
+ }], ctorParameters: () => [{ type: ContextImportService }, { type: ContextExportService }, { type: i3.MessageService }, { type: i4$1.UntypedFormBuilder }, { type: i1$2.ConfigService }, { type: ContextService }], propDecorators: { map: [{
1110
2106
  type: Input
1111
2107
  }] } });
1112
2108
 
@@ -1200,8 +2196,8 @@ class ContextFormComponent {
1200
2196
  uri: [uri || ' ']
1201
2197
  });
1202
2198
  }
1203
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextFormComponent, deps: [{ token: i1$3.Clipboard }, { token: i4$1.UntypedFormBuilder }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component });
1204
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextFormComponent, isStandalone: true, selector: "igo-context-form", inputs: { btnSubmitText: "btnSubmitText", context: "context", disabled: "disabled" }, outputs: { submitForm: "submitForm", clone: "clone", delete: "delete" }, ngImport: i0, template: "<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleFormSubmit(form.value)\"\n>\n <mat-form-field class=\"full-width\">\n <input\n matInput\n required\n maxlength=\"128\"\n [placeholder]=\"'igo.context.contextManager.form.title' | translate\"\n formControlName=\"title\"\n />\n <mat-error>\n {{ 'igo.context.contextManager.form.titleRequired' | translate }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field id=\"uriInput\" class=\"full-width\">\n <span *ngIf=\"prefix\" class=\"prefix\">{{ prefix }}-</span>\n <span class=\"fieldWrapper\">\n <input\n matInput\n maxlength=\"64\"\n floatLabel=\"always\"\n [placeholder]=\"'igo.context.contextManager.form.uri' | translate\"\n formControlName=\"uri\"\n />\n </span>\n </mat-form-field>\n\n <button\n id=\"copyButton\"\n type=\"button\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.contextManager.form.copy' | translate\"\n color=\"primary\"\n (click)=\"copyTextToClipboard()\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"submit\"\n [disabled]=\"!form.valid || disabled\"\n >\n {{ 'igo.context.contextManager.form.edit' | translate }}\n </button>\n </div>\n</form>\n", styles: ["form{margin:10px}.full-width{width:100%}#uriInput .fieldWrapper{display:block;overflow:hidden}#uriInput .prefix{float:left}#copyButton{width:24px;float:right;position:relative;top:-58px;left:5px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2199
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextFormComponent, deps: [{ token: i1$4.Clipboard }, { token: i4$1.UntypedFormBuilder }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component });
2200
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextFormComponent, isStandalone: true, selector: "igo-context-form", inputs: { btnSubmitText: "btnSubmitText", context: "context", disabled: "disabled" }, outputs: { submitForm: "submitForm", clone: "clone", delete: "delete" }, ngImport: i0, template: "<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleFormSubmit(form.value)\"\n>\n <mat-form-field class=\"full-width\">\n <input\n matInput\n required\n maxlength=\"128\"\n [placeholder]=\"'igo.context.contextManager.form.title' | translate\"\n formControlName=\"title\"\n />\n <mat-error>\n {{ 'igo.context.contextManager.form.titleRequired' | translate }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field id=\"uriInput\" class=\"full-width\">\n <span *ngIf=\"prefix\" class=\"prefix\">{{ prefix }}-</span>\n <span class=\"fieldWrapper\">\n <input\n matInput\n maxlength=\"64\"\n floatLabel=\"always\"\n [placeholder]=\"'igo.context.contextManager.form.uri' | translate\"\n formControlName=\"uri\"\n />\n </span>\n </mat-form-field>\n\n <button\n id=\"copyButton\"\n type=\"button\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.contextManager.form.copy' | translate\"\n color=\"primary\"\n (click)=\"copyTextToClipboard()\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"submit\"\n [disabled]=\"!form.valid || disabled\"\n >\n {{ 'igo.context.contextManager.form.edit' | translate }}\n </button>\n </div>\n</form>\n", styles: ["form{margin:10px}.full-width{width:100%}#uriInput .fieldWrapper{display:block;overflow:hidden}#uriInput .prefix{float:left}#copyButton{width:24px;float:right;position:relative;top:-58px;left:5px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
1205
2201
  }
1206
2202
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextFormComponent, decorators: [{
1207
2203
  type: Component,
@@ -1216,7 +2212,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
1216
2212
  MatIconModule,
1217
2213
  IgoLanguageModule
1218
2214
  ], template: "<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleFormSubmit(form.value)\"\n>\n <mat-form-field class=\"full-width\">\n <input\n matInput\n required\n maxlength=\"128\"\n [placeholder]=\"'igo.context.contextManager.form.title' | translate\"\n formControlName=\"title\"\n />\n <mat-error>\n {{ 'igo.context.contextManager.form.titleRequired' | translate }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field id=\"uriInput\" class=\"full-width\">\n <span *ngIf=\"prefix\" class=\"prefix\">{{ prefix }}-</span>\n <span class=\"fieldWrapper\">\n <input\n matInput\n maxlength=\"64\"\n floatLabel=\"always\"\n [placeholder]=\"'igo.context.contextManager.form.uri' | translate\"\n formControlName=\"uri\"\n />\n </span>\n </mat-form-field>\n\n <button\n id=\"copyButton\"\n type=\"button\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.contextManager.form.copy' | translate\"\n color=\"primary\"\n (click)=\"copyTextToClipboard()\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"submit\"\n [disabled]=\"!form.valid || disabled\"\n >\n {{ 'igo.context.contextManager.form.edit' | translate }}\n </button>\n </div>\n</form>\n", styles: ["form{margin:10px}.full-width{width:100%}#uriInput .fieldWrapper{display:block;overflow:hidden}#uriInput .prefix{float:left}#copyButton{width:24px;float:right;position:relative;top:-58px;left:5px}\n"] }]
1219
- }], ctorParameters: () => [{ type: i1$3.Clipboard }, { type: i4$1.UntypedFormBuilder }, { type: i3.MessageService }], propDecorators: { btnSubmitText: [{
2215
+ }], ctorParameters: () => [{ type: i1$4.Clipboard }, { type: i4$1.UntypedFormBuilder }, { type: i3.MessageService }], propDecorators: { btnSubmitText: [{
1220
2216
  type: Input
1221
2217
  }], context: [{
1222
2218
  type: Input
@@ -1340,7 +2336,7 @@ class ContextItemComponent {
1340
2336
  this.favorite.emit(context);
1341
2337
  }
1342
2338
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextItemComponent, deps: [{ token: i2.AuthService }, { token: i6.StorageService }], target: i0.ɵɵFactoryTarget.Component });
1343
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextItemComponent, isStandalone: true, selector: "igo-context-item", inputs: { showFavorite: "showFavorite", context: "context", default: "default", selected: "selected" }, outputs: { edit: "edit", delete: "delete", save: "save", clone: "clone", hide: "hide", show: "show", favorite: "favorite", managePermissions: "managePermissions", manageTools: "manageTools" }, ngImport: i0, template: "<mat-list-item\n class=\"mat-list-item\"\n [ngClass]=\"{ 'mat-list-item-light': hidden }\"\n>\n <button\n *ngIf=\"auth.authenticated\"\n matListItemAvatar\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"\n auth.authenticated\n ? ('igo.context.contextManager.favorite' | translate)\n : ''\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon *ngIf=\"!context.iconImage\">{{\n context.icon\n ? context.icon\n : context.scope === 'public'\n ? 'public'\n : 'star'\n }}</mat-icon>\n <img *ngIf=\"context.iconImage\" [src]=\"context.iconImage\" />\n </button>\n <button\n matListItemAvatar\n *ngIf=\"!auth.authenticated && showFavorite\"\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"'igo.context.contextManager.favorite' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon>star</mat-icon>\n </button>\n <span matListItemTitle>{{ context.title }}</span>\n\n <div\n *ngIf=\"auth.authenticated\"\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n collapsed &&\n selected &&\n (context.permission === typePermission[typePermission.write] ||\n context.imported)\n \"\n class=\"save-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.save' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"save.emit(context)\"\n >\n <mat-icon>save</mat-icon>\n </button>\n\n <div #actions class=\"igo-actions-expand-container\">\n <button\n *ngIf=\"canShare && !context.imported\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.managePermissions' | translate\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"managePermissions.emit(context)\"\n >\n <mat-icon>manage_accounts</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.imported\"\n class=\"clone-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.clone' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"clone.emit(context)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] &&\n !context.imported\n \"\n class=\"edit-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.edit' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"edit.emit(context)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.hide' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"hide.emit(context)\"\n >\n <mat-icon>visibility</mat-icon>\n </button>\n\n <button\n *ngIf=\"context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.show' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"show.emit(context)\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] ||\n context.imported\n \"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.context.contextManager.delete' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"delete.emit(context)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <button\n class=\"actions-button\"\n mat-icon-button\n igoCollapse\n [color]=\"color\"\n [target]=\"actions\"\n [collapsed]=\"collapsed\"\n (click)=\"collapsed = !collapsed\"\n >\n <mat-icon>more_horiz</mat-icon>\n </button>\n </div>\n</mat-list-item>\n", styles: [":host{overflow:hidden}:host .igo-actions-container{flex-shrink:0}:host .igo-actions-expand-container{display:inline-flex}:host mat-icon.disabled{color:#00000061}:host button[matlistitemavatar]{margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3$1.MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "directive", type: i3$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i3$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: CollapseDirective, selector: "[igoCollapse]", inputs: ["target", "collapsed"], outputs: ["toggle"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2339
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextItemComponent, isStandalone: true, selector: "igo-context-item", inputs: { showFavorite: "showFavorite", context: "context", default: "default", selected: "selected" }, outputs: { edit: "edit", delete: "delete", save: "save", clone: "clone", hide: "hide", show: "show", favorite: "favorite", managePermissions: "managePermissions", manageTools: "manageTools" }, ngImport: i0, template: "<mat-list-item\n class=\"mat-list-item\"\n [ngClass]=\"{ 'mat-list-item-light': hidden }\"\n>\n <button\n *ngIf=\"auth.authenticated\"\n matListItemAvatar\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"\n auth.authenticated\n ? ('igo.context.contextManager.favorite' | translate)\n : ''\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon *ngIf=\"!context.iconImage\">{{\n context.icon\n ? context.icon\n : context.scope === 'public'\n ? 'public'\n : 'star'\n }}</mat-icon>\n <img *ngIf=\"context.iconImage\" [src]=\"context.iconImage\" />\n </button>\n <button\n matListItemAvatar\n *ngIf=\"!auth.authenticated && showFavorite\"\n mat-icon-button\n igoStopPropagation\n [matTooltip]=\"'igo.context.contextManager.favorite' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"default ? 'primary' : 'default'\"\n (click)=\"favoriteClick(context)\"\n >\n <mat-icon>star</mat-icon>\n </button>\n <span matListItemTitle>{{ context.title }}</span>\n\n <div\n *ngIf=\"auth.authenticated\"\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n collapsed &&\n selected &&\n (context.permission === typePermission[typePermission.write] ||\n context.imported)\n \"\n class=\"save-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.save' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"save.emit(context)\"\n >\n <mat-icon>save</mat-icon>\n </button>\n\n <div #actions class=\"igo-actions-expand-container\">\n <button\n *ngIf=\"canShare && !context.imported\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.managePermissions' | translate\n \"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"managePermissions.emit(context)\"\n >\n <mat-icon>manage_accounts</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.imported\"\n class=\"clone-button\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.clone' | translate\"\n matTooltipShowDelay=\"500\"\n [color]=\"color\"\n (click)=\"clone.emit(context)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] &&\n !context.imported\n \"\n class=\"edit-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.edit' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"edit.emit(context)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n\n <button\n *ngIf=\"!context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.hide' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"hide.emit(context)\"\n >\n <mat-icon>visibility</mat-icon>\n </button>\n\n <button\n *ngIf=\"context.hidden && !context.imported\"\n class=\"hide-button\"\n mat-icon-button\n [color]=\"color\"\n [matTooltip]=\"'igo.context.contextManager.show' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"show.emit(context)\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n\n <button\n *ngIf=\"\n context.permission === typePermission[typePermission.write] ||\n context.imported\n \"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.context.contextManager.delete' | translate\"\n matTooltipShowDelay=\"500\"\n (click)=\"delete.emit(context)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <button\n class=\"actions-button\"\n mat-icon-button\n igoCollapse\n [color]=\"color\"\n [target]=\"actions\"\n [collapsed]=\"collapsed\"\n (click)=\"collapsed = !collapsed\"\n >\n <mat-icon>more_horiz</mat-icon>\n </button>\n </div>\n</mat-list-item>\n", styles: [":host{overflow:hidden}:host .igo-actions-container{flex-shrink:0}:host .igo-actions-expand-container{display:inline-flex}:host mat-icon.disabled{color:#00000061}:host button[matlistitemavatar]{margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3$1.MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "directive", type: i3$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i3$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: CollapseDirective, selector: "[igoCollapse]", inputs: ["target", "collapsed"], outputs: ["toggle"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1344
2340
  }
1345
2341
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextItemComponent, decorators: [{
1346
2342
  type: Component,
@@ -1389,8 +2385,8 @@ class BookmarkDialogComponent {
1389
2385
  constructor(dialogRef) {
1390
2386
  this.dialogRef = dialogRef;
1391
2387
  }
1392
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookmarkDialogComponent, deps: [{ token: i1$4.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
1393
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: BookmarkDialogComponent, isStandalone: true, selector: "igo-bookmark-dialog", ngImport: i0, template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.bookmarkButton.dialog.title' | translate }}\n</h1>\n<div mat-dialog-content class=\"mat-typography\">\n <mat-form-field>\n <input\n matInput\n required\n autocomplete=\"off\"\n maxlength=\"128\"\n [placeholder]=\"\n 'igo.context.bookmarkButton.dialog.placeholder' | translate\n \"\n [(ngModel)]=\"title\"\n />\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!title\"\n (click)=\"dialogRef.close(title)\"\n >\n {{ 'igo.common.confirmDialog.confirmBtn' | translate }}\n </button>\n <button mat-button (click)=\"dialogRef.close(false)\">\n {{ 'igo.common.confirmDialog.cancelBtn' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2388
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookmarkDialogComponent, deps: [{ token: i1$5.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
2389
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: BookmarkDialogComponent, isStandalone: true, selector: "igo-bookmark-dialog", ngImport: i0, template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.bookmarkButton.dialog.title' | translate }}\n</h1>\n<div mat-dialog-content class=\"mat-typography\">\n <mat-form-field>\n <input\n matInput\n required\n autocomplete=\"off\"\n maxlength=\"128\"\n [placeholder]=\"\n 'igo.context.bookmarkButton.dialog.placeholder' | translate\n \"\n [(ngModel)]=\"title\"\n />\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!title\"\n (click)=\"dialogRef.close(title)\"\n >\n {{ 'igo.common.confirmDialog.confirmBtn' | translate }}\n </button>\n <button mat-button (click)=\"dialogRef.close(false)\">\n {{ 'igo.common.confirmDialog.cancelBtn' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
1394
2390
  }
1395
2391
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookmarkDialogComponent, decorators: [{
1396
2392
  type: Component,
@@ -1404,7 +2400,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
1404
2400
  MatButtonModule,
1405
2401
  IgoLanguageModule
1406
2402
  ], template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.bookmarkButton.dialog.title' | translate }}\n</h1>\n<div mat-dialog-content class=\"mat-typography\">\n <mat-form-field>\n <input\n matInput\n required\n autocomplete=\"off\"\n maxlength=\"128\"\n [placeholder]=\"\n 'igo.context.bookmarkButton.dialog.placeholder' | translate\n \"\n [(ngModel)]=\"title\"\n />\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!title\"\n (click)=\"dialogRef.close(title)\"\n >\n {{ 'igo.common.confirmDialog.confirmBtn' | translate }}\n </button>\n <button mat-button (click)=\"dialogRef.close(false)\">\n {{ 'igo.common.confirmDialog.cancelBtn' | translate }}\n </button>\n</div>\n" }]
1407
- }], ctorParameters: () => [{ type: i1$4.MatDialogRef }] });
2403
+ }], ctorParameters: () => [{ type: i1$5.MatDialogRef }] });
1408
2404
 
1409
2405
  var ContextListControlsEnum;
1410
2406
  (function (ContextListControlsEnum) {
@@ -1732,8 +2728,8 @@ class ContextListComponent {
1732
2728
  context.hidden = false;
1733
2729
  this.show.emit(context);
1734
2730
  }
1735
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextListComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.ConfigService }, { token: i2.AuthService }, { token: i1$4.MatDialog }, { token: i4.LanguageService }, { token: i6.StorageService }], target: i0.ɵɵFactoryTarget.Component });
1736
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextListComponent, isStandalone: true, selector: "igo-context-list", inputs: { contexts: "contexts", selectedContext: "selectedContext", map: "map", defaultContextId: "defaultContextId", term: "term" }, outputs: { select: "select", unselect: "unselect", edit: "edit", delete: "delete", save: "save", clone: "clone", create: "create", hide: "hide", show: "show", showHiddenContexts: "showHiddenContexts", favorite: "favorite", managePermissions: "managePermissions", manageTools: "manageTools", filterPermissionsChanged: "filterPermissionsChanged" }, ngImport: i0, template: "<igo-list [navigation]=\"true\">\n <div class=\"context-filter-container\">\n <mat-form-field *ngIf=\"showFilter()\" floatLabel=\"always\">\n <mat-label>{{\n 'igo.context.contextManager.filterPlaceHolder' | translate\n }}</mat-label>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"\n 'igo.context.contextManager.filterPlaceHolder' | translate\n \"\n [(ngModel)]=\"term\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"clear-button\"\n *ngIf=\"term.length\"\n aria-label=\"Clear\"\n color=\"warn\"\n (click)=\"clearFilter()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div class=\"actions-container\">\n <button\n class=\"sort-alpha\"\n [class.--active]=\"sortedAlpha\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.sortAlphabetically' | translate\n \"\n matTooltipShowDelay=\"500\"\n (click)=\"toggleSort()\"\n >\n <mat-icon color=\"primary\">sort_by_alpha</mat-icon>\n </button>\n\n <igo-actionbar\n *ngIf=\"auth.authenticated && contextConfigs\"\n class=\"add-context-button\"\n [iconColor]=\"color\"\n [store]=\"actionStore\"\n [withIcon]=\"true\"\n icon=\"add\"\n [withTitle]=\"actionbarMode === 'overlay'\"\n [horizontal]=\"false\"\n [mode]=\"actionbarMode\"\n >\n </igo-actionbar>\n\n <button\n *ngIf=\"auth.authenticated && contextConfigs\"\n class=\"users-filter\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.filterUser' | translate\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"accountMenu\"\n >\n <mat-icon color=\"primary\">filter_alt</mat-icon>\n </button>\n <mat-menu #accountMenu=\"matMenu\">\n <ng-container *ngFor=\"let user of users\">\n <button\n *ngIf=\"!user.childs; else withSubMenu\"\n mat-menu-item\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(user).checked\"\n [indeterminate]=\"getPermission(user).indeterminate\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(user)\"\n >\n </mat-checkbox>\n <span>{{ user.title }}</span>\n </button>\n <ng-template #withSubMenu>\n <button\n mat-menu-item\n [matMenuTriggerFor]=\"subAccountMenu\"\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(user).checked\"\n [indeterminate]=\"getPermission(user).indeterminate\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(user)\"\n >\n </mat-checkbox>\n <span>{{ user.title }}</span>\n </button>\n\n <mat-menu #subAccountMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let child of user.childs\"\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(child).checked\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(child, user)\"\n >\n {{ child.title }}\n </mat-checkbox>\n </button>\n </mat-menu>\n </ng-template>\n </ng-container>\n\n <button mat-menu-item class=\"profil-menu\">\n <mat-checkbox\n [checked]=\"showHidden\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"showHiddenContexts.emit()\"\n >\n </mat-checkbox>\n <span>\n {{ 'igo.context.contextManager.showHidden' | translate }}\n </span>\n </button>\n </mat-menu>\n </div>\n </div>\n\n <ng-template\n ngFor\n let-groupContexts\n [ngForOf]=\"$any(contexts$ | async) | keyvalue\"\n >\n <igo-collapsible\n *ngIf=\"$any(groupContexts).value.length && auth.authenticated\"\n [title]=\"titleMapping[$any(groupContexts).key] | translate\"\n [collapsed]=\"$any(collapsed[titleMapping[$any(groupContexts).key]])\"\n (toggle)=\"collapsed[titleMapping[$any(groupContexts).key]] = $any($event)\"\n >\n <ng-template ngFor let-context [ngForOf]=\"$any(groupContexts).value\">\n <igo-context-item\n igoListItem\n color=\"accent\"\n [selected]=\"selectedContext && selectedContext.uri === context.uri\"\n [context]=\"context\"\n [default]=\"\n context.id &&\n this.defaultContextId &&\n this.defaultContextId === context.id\n \"\n (edit)=\"edit.emit(context)\"\n (delete)=\"delete.emit(context)\"\n (clone)=\"clone.emit(context)\"\n (save)=\"save.emit(context)\"\n (hide)=\"hideContext(context)\"\n (show)=\"showContext(context)\"\n (favorite)=\"favorite.emit(context)\"\n (manageTools)=\"manageTools.emit(context)\"\n (managePermissions)=\"managePermissions.emit(context)\"\n (select)=\"select.emit(context)\"\n (unselect)=\"unselect.emit(context)\"\n >\n </igo-context-item>\n </ng-template>\n </igo-collapsible>\n\n <ng-template\n *ngIf=\"$any(groupContexts).value.length && !auth.authenticated\"\n ngFor\n let-context\n [ngForOf]=\"$any(groupContexts).value\"\n >\n <igo-context-item\n igoListItem\n color=\"accent\"\n [showFavorite]=\"\n configService.getConfig('favoriteContext4NonAuthenticated')\n \"\n [selected]=\"selectedContext && selectedContext.uri === context.uri\"\n [context]=\"context\"\n [default]=\"\n contextConfigs\n ? defaultContextId === context.id\n : defaultContextId === context.uri\n \"\n (favorite)=\"favorite.emit(context)\"\n (select)=\"select.emit(context)\"\n (unselect)=\"unselect.emit(context)\"\n >\n </igo-context-item>\n </ng-template>\n </ng-template>\n\n <div *ngIf=\"isEmpty\" class=\"no-result\">\n {{ 'igo.context.contextManager.noResult' | translate }}\n </div>\n</igo-list>\n", styles: [":host ::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.context-filter-container{display:flex;align-items:center;padding:8px 4px}.context-filter-container mat-form-field{flex:1}.sort-alpha.--active mat-icon{color:red}.context-filter-min-width{width:calc(100% - 135px);margin:5px;padding-left:6px}.profil-menu{padding-left:8px}.profil-menu mat-checkbox{margin-right:8px}.add-context-button{margin:0;width:40px;display:inline-flex;overflow:hidden}.actions-container{margin-left:4px}.no-result{padding:16px}\n"], dependencies: [{ kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ActionbarComponent, selector: "igo-actionbar", inputs: ["store", "mode", "withToggleButton", "horizontal", "color", "iconColor", "withTitle", "withTooltip", "scrollActive", "withIcon", "icon", "xPosition", "yPosition", "overlayClass"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: CollapsibleComponent, selector: "igo-collapsible", inputs: ["title", "collapsed"], outputs: ["toggle"] }, { kind: "component", type: ContextItemComponent, selector: "igo-context-item", inputs: ["showFavorite", "context", "default", "selected"], outputs: ["edit", "delete", "save", "clone", "hide", "show", "favorite", "managePermissions", "manageTools"] }, { kind: "directive", type: ListItemDirective, selector: "[igoListItem]", inputs: ["color", "focused", "selected", "disabled"], outputs: ["beforeSelect", "beforeFocus", "beforeUnselect", "beforeUnfocus", "beforeDisable", "beforeEnable", "focus", "unfocus", "select", "unselect", "disable", "enable"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2731
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextListComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$2.ConfigService }, { token: i2.AuthService }, { token: i1$5.MatDialog }, { token: i4.LanguageService }, { token: i6.StorageService }], target: i0.ɵɵFactoryTarget.Component });
2732
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextListComponent, isStandalone: true, selector: "igo-context-list", inputs: { contexts: "contexts", selectedContext: "selectedContext", map: "map", defaultContextId: "defaultContextId", term: "term" }, outputs: { select: "select", unselect: "unselect", edit: "edit", delete: "delete", save: "save", clone: "clone", create: "create", hide: "hide", show: "show", showHiddenContexts: "showHiddenContexts", favorite: "favorite", managePermissions: "managePermissions", manageTools: "manageTools", filterPermissionsChanged: "filterPermissionsChanged" }, ngImport: i0, template: "<igo-list [navigation]=\"true\">\n <div class=\"context-filter-container\">\n <mat-form-field *ngIf=\"showFilter()\" floatLabel=\"always\">\n <mat-label>{{\n 'igo.context.contextManager.filterPlaceHolder' | translate\n }}</mat-label>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"\n 'igo.context.contextManager.filterPlaceHolder' | translate\n \"\n [(ngModel)]=\"term\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"clear-button\"\n *ngIf=\"term.length\"\n aria-label=\"Clear\"\n color=\"warn\"\n (click)=\"clearFilter()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div class=\"actions-container\">\n <button\n class=\"sort-alpha\"\n [class.--active]=\"sortedAlpha\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.sortAlphabetically' | translate\n \"\n matTooltipShowDelay=\"500\"\n (click)=\"toggleSort()\"\n >\n <mat-icon color=\"primary\">sort_by_alpha</mat-icon>\n </button>\n\n <igo-actionbar\n *ngIf=\"auth.authenticated && contextConfigs\"\n class=\"add-context-button\"\n [iconColor]=\"color\"\n [store]=\"actionStore\"\n [withIcon]=\"true\"\n icon=\"add\"\n [withTitle]=\"actionbarMode === 'overlay'\"\n [horizontal]=\"false\"\n [mode]=\"actionbarMode\"\n >\n </igo-actionbar>\n\n <button\n *ngIf=\"auth.authenticated && contextConfigs\"\n class=\"users-filter\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.filterUser' | translate\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"accountMenu\"\n >\n <mat-icon color=\"primary\">filter_alt</mat-icon>\n </button>\n <mat-menu #accountMenu=\"matMenu\">\n <ng-container *ngFor=\"let user of users\">\n <button\n *ngIf=\"!user.childs; else withSubMenu\"\n mat-menu-item\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(user).checked\"\n [indeterminate]=\"getPermission(user).indeterminate\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(user)\"\n >\n </mat-checkbox>\n <span>{{ user.title }}</span>\n </button>\n <ng-template #withSubMenu>\n <button\n mat-menu-item\n [matMenuTriggerFor]=\"subAccountMenu\"\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(user).checked\"\n [indeterminate]=\"getPermission(user).indeterminate\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(user)\"\n >\n </mat-checkbox>\n <span>{{ user.title }}</span>\n </button>\n\n <mat-menu #subAccountMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let child of user.childs\"\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(child).checked\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(child, user)\"\n >\n {{ child.title }}\n </mat-checkbox>\n </button>\n </mat-menu>\n </ng-template>\n </ng-container>\n\n <button mat-menu-item class=\"profil-menu\">\n <mat-checkbox\n [checked]=\"showHidden\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"showHiddenContexts.emit()\"\n >\n </mat-checkbox>\n <span>\n {{ 'igo.context.contextManager.showHidden' | translate }}\n </span>\n </button>\n </mat-menu>\n </div>\n </div>\n\n <ng-template\n ngFor\n let-groupContexts\n [ngForOf]=\"$any(contexts$ | async) | keyvalue\"\n >\n <igo-collapsible\n *ngIf=\"$any(groupContexts).value.length && auth.authenticated\"\n [title]=\"titleMapping[$any(groupContexts).key] | translate\"\n [collapsed]=\"$any(collapsed[titleMapping[$any(groupContexts).key]])\"\n (toggle)=\"collapsed[titleMapping[$any(groupContexts).key]] = $any($event)\"\n >\n <ng-template ngFor let-context [ngForOf]=\"$any(groupContexts).value\">\n <igo-context-item\n igoListItem\n color=\"accent\"\n [selected]=\"selectedContext && selectedContext.uri === context.uri\"\n [context]=\"context\"\n [default]=\"\n context.id &&\n this.defaultContextId &&\n this.defaultContextId === context.id\n \"\n (edit)=\"edit.emit(context)\"\n (delete)=\"delete.emit(context)\"\n (clone)=\"clone.emit(context)\"\n (save)=\"save.emit(context)\"\n (hide)=\"hideContext(context)\"\n (show)=\"showContext(context)\"\n (favorite)=\"favorite.emit(context)\"\n (manageTools)=\"manageTools.emit(context)\"\n (managePermissions)=\"managePermissions.emit(context)\"\n (select)=\"select.emit(context)\"\n (unselect)=\"unselect.emit(context)\"\n >\n </igo-context-item>\n </ng-template>\n </igo-collapsible>\n\n <ng-template\n *ngIf=\"$any(groupContexts).value.length && !auth.authenticated\"\n ngFor\n let-context\n [ngForOf]=\"$any(groupContexts).value\"\n >\n <igo-context-item\n igoListItem\n color=\"accent\"\n [showFavorite]=\"\n configService.getConfig('favoriteContext4NonAuthenticated')\n \"\n [selected]=\"selectedContext && selectedContext.uri === context.uri\"\n [context]=\"context\"\n [default]=\"\n contextConfigs\n ? defaultContextId === context.id\n : defaultContextId === context.uri\n \"\n (favorite)=\"favorite.emit(context)\"\n (select)=\"select.emit(context)\"\n (unselect)=\"unselect.emit(context)\"\n >\n </igo-context-item>\n </ng-template>\n </ng-template>\n\n <div *ngIf=\"isEmpty\" class=\"no-result\">\n {{ 'igo.context.contextManager.noResult' | translate }}\n </div>\n</igo-list>\n", styles: [":host ::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.context-filter-container{display:flex;align-items:center;padding:8px 4px}.context-filter-container mat-form-field{flex:1}.sort-alpha.--active mat-icon{color:red}.context-filter-min-width{width:calc(100% - 135px);margin:5px;padding-left:6px}.profil-menu{padding-left:8px}.profil-menu mat-checkbox{margin-right:8px}.add-context-button{margin:0;width:40px;display:inline-flex;overflow:hidden}.actions-container{margin-left:4px}.no-result{padding:16px}\n"], dependencies: [{ kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ActionbarComponent, selector: "igo-actionbar", inputs: ["store", "mode", "withToggleButton", "horizontal", "color", "iconColor", "withTitle", "withTooltip", "scrollActive", "withIcon", "icon", "xPosition", "yPosition", "overlayClass"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: CollapsibleComponent, selector: "igo-collapsible", inputs: ["title", "collapsed"], outputs: ["toggle"] }, { kind: "component", type: ContextItemComponent, selector: "igo-context-item", inputs: ["showFavorite", "context", "default", "selected"], outputs: ["edit", "delete", "save", "clone", "hide", "show", "favorite", "managePermissions", "manageTools"] }, { kind: "directive", type: ListItemDirective, selector: "[igoListItem]", inputs: ["color", "focused", "selected", "disabled"], outputs: ["beforeSelect", "beforeFocus", "beforeUnselect", "beforeUnfocus", "beforeDisable", "beforeEnable", "focus", "unfocus", "select", "unselect", "disable", "enable"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1737
2733
  }
1738
2734
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextListComponent, decorators: [{
1739
2735
  type: Component,
@@ -1757,7 +2753,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
1757
2753
  KeyValuePipe,
1758
2754
  IgoLanguageModule
1759
2755
  ], template: "<igo-list [navigation]=\"true\">\n <div class=\"context-filter-container\">\n <mat-form-field *ngIf=\"showFilter()\" floatLabel=\"always\">\n <mat-label>{{\n 'igo.context.contextManager.filterPlaceHolder' | translate\n }}</mat-label>\n <input\n matInput\n type=\"text\"\n [placeholder]=\"\n 'igo.context.contextManager.filterPlaceHolder' | translate\n \"\n [(ngModel)]=\"term\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"clear-button\"\n *ngIf=\"term.length\"\n aria-label=\"Clear\"\n color=\"warn\"\n (click)=\"clearFilter()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div class=\"actions-container\">\n <button\n class=\"sort-alpha\"\n [class.--active]=\"sortedAlpha\"\n mat-icon-button\n [matTooltip]=\"\n 'igo.context.contextManager.sortAlphabetically' | translate\n \"\n matTooltipShowDelay=\"500\"\n (click)=\"toggleSort()\"\n >\n <mat-icon color=\"primary\">sort_by_alpha</mat-icon>\n </button>\n\n <igo-actionbar\n *ngIf=\"auth.authenticated && contextConfigs\"\n class=\"add-context-button\"\n [iconColor]=\"color\"\n [store]=\"actionStore\"\n [withIcon]=\"true\"\n icon=\"add\"\n [withTitle]=\"actionbarMode === 'overlay'\"\n [horizontal]=\"false\"\n [mode]=\"actionbarMode\"\n >\n </igo-actionbar>\n\n <button\n *ngIf=\"auth.authenticated && contextConfigs\"\n class=\"users-filter\"\n mat-icon-button\n [matTooltip]=\"'igo.context.contextManager.filterUser' | translate\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"accountMenu\"\n >\n <mat-icon color=\"primary\">filter_alt</mat-icon>\n </button>\n <mat-menu #accountMenu=\"matMenu\">\n <ng-container *ngFor=\"let user of users\">\n <button\n *ngIf=\"!user.childs; else withSubMenu\"\n mat-menu-item\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(user).checked\"\n [indeterminate]=\"getPermission(user).indeterminate\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(user)\"\n >\n </mat-checkbox>\n <span>{{ user.title }}</span>\n </button>\n <ng-template #withSubMenu>\n <button\n mat-menu-item\n [matMenuTriggerFor]=\"subAccountMenu\"\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(user).checked\"\n [indeterminate]=\"getPermission(user).indeterminate\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(user)\"\n >\n </mat-checkbox>\n <span>{{ user.title }}</span>\n </button>\n\n <mat-menu #subAccountMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let child of user.childs\"\n class=\"profil-menu\"\n >\n <mat-checkbox\n [checked]=\"getPermission(child).checked\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"handleToggleCategory(child, user)\"\n >\n {{ child.title }}\n </mat-checkbox>\n </button>\n </mat-menu>\n </ng-template>\n </ng-container>\n\n <button mat-menu-item class=\"profil-menu\">\n <mat-checkbox\n [checked]=\"showHidden\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"showHiddenContexts.emit()\"\n >\n </mat-checkbox>\n <span>\n {{ 'igo.context.contextManager.showHidden' | translate }}\n </span>\n </button>\n </mat-menu>\n </div>\n </div>\n\n <ng-template\n ngFor\n let-groupContexts\n [ngForOf]=\"$any(contexts$ | async) | keyvalue\"\n >\n <igo-collapsible\n *ngIf=\"$any(groupContexts).value.length && auth.authenticated\"\n [title]=\"titleMapping[$any(groupContexts).key] | translate\"\n [collapsed]=\"$any(collapsed[titleMapping[$any(groupContexts).key]])\"\n (toggle)=\"collapsed[titleMapping[$any(groupContexts).key]] = $any($event)\"\n >\n <ng-template ngFor let-context [ngForOf]=\"$any(groupContexts).value\">\n <igo-context-item\n igoListItem\n color=\"accent\"\n [selected]=\"selectedContext && selectedContext.uri === context.uri\"\n [context]=\"context\"\n [default]=\"\n context.id &&\n this.defaultContextId &&\n this.defaultContextId === context.id\n \"\n (edit)=\"edit.emit(context)\"\n (delete)=\"delete.emit(context)\"\n (clone)=\"clone.emit(context)\"\n (save)=\"save.emit(context)\"\n (hide)=\"hideContext(context)\"\n (show)=\"showContext(context)\"\n (favorite)=\"favorite.emit(context)\"\n (manageTools)=\"manageTools.emit(context)\"\n (managePermissions)=\"managePermissions.emit(context)\"\n (select)=\"select.emit(context)\"\n (unselect)=\"unselect.emit(context)\"\n >\n </igo-context-item>\n </ng-template>\n </igo-collapsible>\n\n <ng-template\n *ngIf=\"$any(groupContexts).value.length && !auth.authenticated\"\n ngFor\n let-context\n [ngForOf]=\"$any(groupContexts).value\"\n >\n <igo-context-item\n igoListItem\n color=\"accent\"\n [showFavorite]=\"\n configService.getConfig('favoriteContext4NonAuthenticated')\n \"\n [selected]=\"selectedContext && selectedContext.uri === context.uri\"\n [context]=\"context\"\n [default]=\"\n contextConfigs\n ? defaultContextId === context.id\n : defaultContextId === context.uri\n \"\n (favorite)=\"favorite.emit(context)\"\n (select)=\"select.emit(context)\"\n (unselect)=\"unselect.emit(context)\"\n >\n </igo-context-item>\n </ng-template>\n </ng-template>\n\n <div *ngIf=\"isEmpty\" class=\"no-result\">\n {{ 'igo.context.contextManager.noResult' | translate }}\n </div>\n</igo-list>\n", styles: [":host ::ng-deep mat-form-field .mat-mdc-form-field-subscript-wrapper{display:none}.context-filter-container{display:flex;align-items:center;padding:8px 4px}.context-filter-container mat-form-field{flex:1}.sort-alpha.--active mat-icon{color:red}.context-filter-min-width{width:calc(100% - 135px);margin:5px;padding-left:6px}.profil-menu{padding-left:8px}.profil-menu mat-checkbox{margin-right:8px}.add-context-button{margin:0;width:40px;display:inline-flex;overflow:hidden}.actions-container{margin-left:4px}.no-result{padding:16px}\n"] }]
1760
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.ConfigService }, { type: i2.AuthService }, { type: i1$4.MatDialog }, { type: i4.LanguageService }, { type: i6.StorageService }], propDecorators: { contexts: [{
2756
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$2.ConfigService }, { type: i2.AuthService }, { type: i1$5.MatDialog }, { type: i4.LanguageService }, { type: i6.StorageService }], propDecorators: { contexts: [{
1761
2757
  type: Input
1762
2758
  }], selectedContext: [{
1763
2759
  type: Input
@@ -1984,7 +2980,7 @@ class ContextListBindingDirective {
1984
2980
  handleContextsChange(contexts) {
1985
2981
  this.component.contexts = contexts;
1986
2982
  }
1987
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextListBindingDirective, deps: [{ token: ContextListComponent, self: true }, { token: ContextService }, { token: i1$2.MapService }, { token: i4.LanguageService }, { token: i5$1.ConfirmDialogService }, { token: i3.MessageService }, { token: i2.AuthService }, { token: i6.StorageService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
2983
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextListBindingDirective, deps: [{ token: ContextListComponent, self: true }, { token: ContextService }, { token: i1$3.MapService }, { token: i4.LanguageService }, { token: i5$1.ConfirmDialogService }, { token: i3.MessageService }, { token: i2.AuthService }, { token: i6.StorageService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
1988
2984
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: ContextListBindingDirective, isStandalone: true, selector: "[igoContextListBinding]", host: { listeners: { "select": "onSelect($event)", "edit": "onEdit($event)", "save": "onSave($event)", "favorite": "onFavorite($event)", "manageTools": "onManageTools($event)", "managePermissions": "onManagePermissions($event)", "delete": "onDelete($event)", "clone": "onClone($event)", "create": "onCreate($event)", "filterPermissionsChanged": "loadContexts()", "showHiddenContexts": "showHiddenContexts()", "show": "onShowContext($event)", "hide": "onHideContext($event)" } }, providers: [ConfirmDialogService], ngImport: i0 });
1989
2985
  }
1990
2986
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextListBindingDirective, decorators: [{
@@ -1996,7 +2992,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
1996
2992
  }]
1997
2993
  }], ctorParameters: () => [{ type: ContextListComponent, decorators: [{
1998
2994
  type: Self
1999
- }] }, { type: ContextService }, { type: i1$2.MapService }, { type: i4.LanguageService }, { type: i5$1.ConfirmDialogService }, { type: i3.MessageService }, { type: i2.AuthService }, { type: i6.StorageService }, { type: i0.ChangeDetectorRef }], propDecorators: { onSelect: [{
2995
+ }] }, { type: ContextService }, { type: i1$3.MapService }, { type: i4.LanguageService }, { type: i5$1.ConfirmDialogService }, { type: i3.MessageService }, { type: i2.AuthService }, { type: i6.StorageService }, { type: i0.ChangeDetectorRef }], propDecorators: { onSelect: [{
2000
2996
  type: HostListener,
2001
2997
  args: ['select', ['$event']]
2002
2998
  }], onEdit: [{
@@ -2135,8 +3131,8 @@ class ContextPermissionsComponent {
2135
3131
  typePermission: this.form.value.typePermission
2136
3132
  });
2137
3133
  }
2138
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextPermissionsComponent, deps: [{ token: i4$1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.AuthService }, { token: i1$1.ConfigService }], target: i0.ɵɵFactoryTarget.Component });
2139
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextPermissionsComponent, isStandalone: true, selector: "igo-context-permissions", inputs: { context: "context", permissions: "permissions" }, outputs: { addPermission: "addPermission", removePermission: "removePermission", scopeChanged: "scopeChanged" }, ngImport: i0, template: "<div *ngIf=\"context\">\n <div *ngIf=\"!canWrite\" class=\"scopeForm\">\n <h4>{{ 'igo.context.permission.readOnlyTitle' | translate }}</h4>\n <p>{{ 'igo.context.permission.readOnlyMsg' | translate }}</p>\n </div>\n\n <div *ngIf=\"canWrite\" class=\"scopeForm\">\n <mat-radio-group\n [(ngModel)]=\"context.scope\"\n (change)=\"scopeChanged.emit(context)\"\n >\n <mat-radio-button value=\"private\">\n {{ 'igo.context.permission.scope.private' | translate }}\n </mat-radio-button>\n <mat-radio-button value=\"protected\">\n {{ 'igo.context.permission.scope.shared' | translate }}\n </mat-radio-button>\n <mat-radio-button *ngIf=\"authService.isAdmin\" value=\"public\">\n {{ 'igo.context.permission.scope.public' | translate }}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <form\n *ngIf=\"context.scope !== 'private' && canWrite\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleFormSubmit(form.value)\"\n >\n <mat-form-field class=\"full-width\">\n <input\n matInput\n required\n [placeholder]=\"'igo.context.permission.user' | translate\"\n [formControl]=\"formControl\"\n [matAutocomplete]=\"auto\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onProfilSelected($event.option.value)\"\n [displayWith]=\"displayFn\"\n >\n <mat-option *ngFor=\"let profil of this.profils\" [value]=\"profil\">\n {{ profil.title }}<br />\n <small class=\"mat-typography\">{{ profil.name }}</small>\n </mat-option>\n </mat-autocomplete>\n <mat-error>\n {{ 'igo.context.permission.profilRequired' | translate }}\n </mat-error>\n </mat-form-field>\n\n <mat-radio-group formControlName=\"typePermission\">\n <mat-radio-button value=\"read\">\n {{ 'igo.context.permission.read' | translate }}\n </mat-radio-button>\n <mat-radio-button value=\"write\">\n {{ 'igo.context.permission.write' | translate }}\n </mat-radio-button>\n </mat-radio-group>\n\n <div class=\"igo-form-button-group\">\n <button mat-raised-button type=\"submit\" [disabled]=\"!form.valid\">\n {{ 'igo.context.permission.addBtn' | translate }}\n </button>\n </div>\n </form>\n\n <igo-list *ngIf=\"permissions && context.scope !== 'private'\">\n <ng-template ngFor let-groupPermissions [ngForOf]=\"permissions | keyvalue\">\n <igo-collapsible\n *ngIf=\"groupPermissions.value.length\"\n [title]=\"'igo.context.permission.' + groupPermissions.key | translate\"\n >\n <ng-template ngFor let-permission [ngForOf]=\"groupPermissions.value\">\n <mat-list-item>\n <mat-icon matListItemIcon>person</mat-icon>\n <h4 matListItemTitle>\n {{ permission.profilTitle }}\n <small class=\"mat-typography\">{{ permission.profil }}</small>\n </h4>\n\n <div\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n canWrite ||\n permission.profil === authService.decodeToken().user.sourceId\n \"\n mat-icon-button\n [matTooltip]=\"'igo.context.permission.delete' | translate\"\n matTooltipShowDelay=\"500\"\n color=\"warn\"\n (click)=\"removePermission.emit(permission)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </mat-list-item>\n </ng-template>\n </igo-collapsible>\n </ng-template>\n </igo-list>\n</div>\n", styles: [":host{margin:10px}.full-width{width:100%}mat-radio-button{padding:14px 14px 14px 0}.scopeForm,form{padding:5px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i5$2.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i5$2.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i8$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i8$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "component", type: CollapsibleComponent, selector: "igo-collapsible", inputs: ["title", "collapsed"], outputs: ["toggle"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3$1.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i3$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i3$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextPermissionsComponent, deps: [{ token: i4$1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i1$1.HttpClient }, { token: i2.AuthService }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component });
3135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ContextPermissionsComponent, isStandalone: true, selector: "igo-context-permissions", inputs: { context: "context", permissions: "permissions" }, outputs: { addPermission: "addPermission", removePermission: "removePermission", scopeChanged: "scopeChanged" }, ngImport: i0, template: "<div *ngIf=\"context\">\n <div *ngIf=\"!canWrite\" class=\"scopeForm\">\n <h4>{{ 'igo.context.permission.readOnlyTitle' | translate }}</h4>\n <p>{{ 'igo.context.permission.readOnlyMsg' | translate }}</p>\n </div>\n\n <div *ngIf=\"canWrite\" class=\"scopeForm\">\n <mat-radio-group\n [(ngModel)]=\"context.scope\"\n (change)=\"scopeChanged.emit(context)\"\n >\n <mat-radio-button value=\"private\">\n {{ 'igo.context.permission.scope.private' | translate }}\n </mat-radio-button>\n <mat-radio-button value=\"protected\">\n {{ 'igo.context.permission.scope.shared' | translate }}\n </mat-radio-button>\n <mat-radio-button *ngIf=\"authService.isAdmin\" value=\"public\">\n {{ 'igo.context.permission.scope.public' | translate }}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <form\n *ngIf=\"context.scope !== 'private' && canWrite\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleFormSubmit(form.value)\"\n >\n <mat-form-field class=\"full-width\">\n <input\n matInput\n required\n [placeholder]=\"'igo.context.permission.user' | translate\"\n [formControl]=\"formControl\"\n [matAutocomplete]=\"auto\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onProfilSelected($event.option.value)\"\n [displayWith]=\"displayFn\"\n >\n <mat-option *ngFor=\"let profil of this.profils\" [value]=\"profil\">\n {{ profil.title }}<br />\n <small class=\"mat-typography\">{{ profil.name }}</small>\n </mat-option>\n </mat-autocomplete>\n <mat-error>\n {{ 'igo.context.permission.profilRequired' | translate }}\n </mat-error>\n </mat-form-field>\n\n <mat-radio-group formControlName=\"typePermission\">\n <mat-radio-button value=\"read\">\n {{ 'igo.context.permission.read' | translate }}\n </mat-radio-button>\n <mat-radio-button value=\"write\">\n {{ 'igo.context.permission.write' | translate }}\n </mat-radio-button>\n </mat-radio-group>\n\n <div class=\"igo-form-button-group\">\n <button mat-raised-button type=\"submit\" [disabled]=\"!form.valid\">\n {{ 'igo.context.permission.addBtn' | translate }}\n </button>\n </div>\n </form>\n\n <igo-list *ngIf=\"permissions && context.scope !== 'private'\">\n <ng-template ngFor let-groupPermissions [ngForOf]=\"permissions | keyvalue\">\n <igo-collapsible\n *ngIf=\"groupPermissions.value.length\"\n [title]=\"'igo.context.permission.' + groupPermissions.key | translate\"\n >\n <ng-template ngFor let-permission [ngForOf]=\"groupPermissions.value\">\n <mat-list-item>\n <mat-icon matListItemIcon>person</mat-icon>\n <h4 matListItemTitle>\n {{ permission.profilTitle }}\n <small class=\"mat-typography\">{{ permission.profil }}</small>\n </h4>\n\n <div\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n canWrite ||\n permission.profil === authService.decodeToken().user.sourceId\n \"\n mat-icon-button\n [matTooltip]=\"'igo.context.permission.delete' | translate\"\n matTooltipShowDelay=\"500\"\n color=\"warn\"\n (click)=\"removePermission.emit(permission)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </mat-list-item>\n </ng-template>\n </igo-collapsible>\n </ng-template>\n </igo-list>\n</div>\n", styles: [":host{margin:10px}.full-width{width:100%}mat-radio-button{padding:14px 14px 14px 0}.scopeForm,form{padding:5px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i5$2.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i5$2.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i8.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i8.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "component", type: CollapsibleComponent, selector: "igo-collapsible", inputs: ["title", "collapsed"], outputs: ["toggle"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$1.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3$1.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i3$1.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i3$1.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2140
3136
  }
2141
3137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ContextPermissionsComponent, decorators: [{
2142
3138
  type: Component,
@@ -2160,7 +3156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2160
3156
  KeyValuePipe,
2161
3157
  IgoLanguageModule
2162
3158
  ], template: "<div *ngIf=\"context\">\n <div *ngIf=\"!canWrite\" class=\"scopeForm\">\n <h4>{{ 'igo.context.permission.readOnlyTitle' | translate }}</h4>\n <p>{{ 'igo.context.permission.readOnlyMsg' | translate }}</p>\n </div>\n\n <div *ngIf=\"canWrite\" class=\"scopeForm\">\n <mat-radio-group\n [(ngModel)]=\"context.scope\"\n (change)=\"scopeChanged.emit(context)\"\n >\n <mat-radio-button value=\"private\">\n {{ 'igo.context.permission.scope.private' | translate }}\n </mat-radio-button>\n <mat-radio-button value=\"protected\">\n {{ 'igo.context.permission.scope.shared' | translate }}\n </mat-radio-button>\n <mat-radio-button *ngIf=\"authService.isAdmin\" value=\"public\">\n {{ 'igo.context.permission.scope.public' | translate }}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <form\n *ngIf=\"context.scope !== 'private' && canWrite\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleFormSubmit(form.value)\"\n >\n <mat-form-field class=\"full-width\">\n <input\n matInput\n required\n [placeholder]=\"'igo.context.permission.user' | translate\"\n [formControl]=\"formControl\"\n [matAutocomplete]=\"auto\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onProfilSelected($event.option.value)\"\n [displayWith]=\"displayFn\"\n >\n <mat-option *ngFor=\"let profil of this.profils\" [value]=\"profil\">\n {{ profil.title }}<br />\n <small class=\"mat-typography\">{{ profil.name }}</small>\n </mat-option>\n </mat-autocomplete>\n <mat-error>\n {{ 'igo.context.permission.profilRequired' | translate }}\n </mat-error>\n </mat-form-field>\n\n <mat-radio-group formControlName=\"typePermission\">\n <mat-radio-button value=\"read\">\n {{ 'igo.context.permission.read' | translate }}\n </mat-radio-button>\n <mat-radio-button value=\"write\">\n {{ 'igo.context.permission.write' | translate }}\n </mat-radio-button>\n </mat-radio-group>\n\n <div class=\"igo-form-button-group\">\n <button mat-raised-button type=\"submit\" [disabled]=\"!form.valid\">\n {{ 'igo.context.permission.addBtn' | translate }}\n </button>\n </div>\n </form>\n\n <igo-list *ngIf=\"permissions && context.scope !== 'private'\">\n <ng-template ngFor let-groupPermissions [ngForOf]=\"permissions | keyvalue\">\n <igo-collapsible\n *ngIf=\"groupPermissions.value.length\"\n [title]=\"'igo.context.permission.' + groupPermissions.key | translate\"\n >\n <ng-template ngFor let-permission [ngForOf]=\"groupPermissions.value\">\n <mat-list-item>\n <mat-icon matListItemIcon>person</mat-icon>\n <h4 matListItemTitle>\n {{ permission.profilTitle }}\n <small class=\"mat-typography\">{{ permission.profil }}</small>\n </h4>\n\n <div\n matListItemMeta\n igoStopPropagation\n class=\"igo-actions-container\"\n >\n <button\n *ngIf=\"\n canWrite ||\n permission.profil === authService.decodeToken().user.sourceId\n \"\n mat-icon-button\n [matTooltip]=\"'igo.context.permission.delete' | translate\"\n matTooltipShowDelay=\"500\"\n color=\"warn\"\n (click)=\"removePermission.emit(permission)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </mat-list-item>\n </ng-template>\n </igo-collapsible>\n </ng-template>\n </igo-list>\n</div>\n", styles: [":host{margin:10px}.full-width{width:100%}mat-radio-button{padding:14px 14px 14px 0}.scopeForm,form{padding:5px}\n"] }]
2163
- }], ctorParameters: () => [{ type: i4$1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.AuthService }, { type: i1$1.ConfigService }], propDecorators: { context: [{
3159
+ }], ctorParameters: () => [{ type: i4$1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i1$1.HttpClient }, { type: i2.AuthService }, { type: i1$2.ConfigService }], propDecorators: { context: [{
2164
3160
  type: Input
2165
3161
  }], permissions: [{
2166
3162
  type: Input
@@ -2278,37 +3274,31 @@ class LayerContextDirective {
2278
3274
  configService;
2279
3275
  styleListService;
2280
3276
  styleService;
2281
- route;
3277
+ shareMapService;
2282
3278
  context$$;
2283
3279
  queryParams;
2284
3280
  contextLayers = [];
2285
3281
  removeLayersOnContextChange = true;
3282
+ contextLayersLoaded = new EventEmitter();
2286
3283
  get map() {
2287
3284
  return this.component.map;
2288
3285
  }
2289
- constructor(component, contextService, layerService, configService, styleListService, styleService, route) {
3286
+ constructor(component, contextService, layerService, configService, styleListService, styleService, shareMapService) {
2290
3287
  this.component = component;
2291
3288
  this.contextService = contextService;
2292
3289
  this.layerService = layerService;
2293
3290
  this.configService = configService;
2294
3291
  this.styleListService = styleListService;
2295
3292
  this.styleService = styleService;
2296
- this.route = route;
3293
+ this.shareMapService = shareMapService;
2297
3294
  }
2298
3295
  ngOnInit() {
2299
- this.context$$ = this.contextService.context$
2300
- .pipe(filter((context) => context !== undefined))
3296
+ this.context$$ = this.shareMapService.routeService.queryParams
3297
+ .pipe(switchMap((params) => {
3298
+ this.queryParams = params ?? {};
3299
+ return this.contextService.context$.pipe(filter((context) => context !== undefined));
3300
+ }))
2301
3301
  .subscribe((context) => this.handleContextChange(context));
2302
- if (this.route &&
2303
- this.route.options.visibleOnLayersKey &&
2304
- this.route.options.visibleOffLayersKey &&
2305
- this.route.options.contextKey) {
2306
- this.route.queryParams
2307
- .pipe(first((params) => !ObjectUtils.isEmpty(params)))
2308
- .subscribe((params) => {
2309
- this.queryParams = params;
2310
- });
2311
- }
2312
3302
  }
2313
3303
  ngOnDestroy() {
2314
3304
  this.context$$.unsubscribe();
@@ -2317,6 +3307,14 @@ class LayerContextDirective {
2317
3307
  if (context.layers === undefined) {
2318
3308
  return;
2319
3309
  }
3310
+ /**
3311
+ * Assign an id to each layer group if it doesn't have one.
3312
+ * This is needed to be able to detect layer groups in the context that doesn't have and id and be able to ignore them in the share
3313
+ */
3314
+ if (context.layers?.length) {
3315
+ addIdToGroups(context.layers);
3316
+ }
3317
+ const contextLayers = this.handleContextWithSharedUrl(ObjectUtils.copyDeep(context));
2320
3318
  if (this.removeLayersOnContextChange === true) {
2321
3319
  this.map.layerController.reset();
2322
3320
  }
@@ -2327,7 +3325,7 @@ class LayerContextDirective {
2327
3325
  this.layerService.unavailableLayers = [];
2328
3326
  const importExportOptions = this.configService.getConfig('importExport');
2329
3327
  this.layerService
2330
- .createLayers(context.layers, context.uri)
3328
+ .createLayers(contextLayers, context.uri)
2331
3329
  .subscribe((layers) => {
2332
3330
  this.handleAddLayers(layers);
2333
3331
  if (context.extraFeatures) {
@@ -2340,6 +3338,7 @@ class LayerContextDirective {
2340
3338
  }
2341
3339
  });
2342
3340
  }
3341
+ this.contextLayersLoaded.emit(true);
2343
3342
  });
2344
3343
  if (this.configService.getConfig('importExport.allowToStoreLayer', false)) {
2345
3344
  this.layerService
@@ -2348,20 +3347,6 @@ class LayerContextDirective {
2348
3347
  .subscribe((layers) => this.handleAddLayers(layers));
2349
3348
  }
2350
3349
  }
2351
- getFlattenOptions(options) {
2352
- return options.reduce((accumulator, option) => {
2353
- if (isLayerGroupOptions(option)) {
2354
- const children = option.children
2355
- ? this.getFlattenOptions(option.children)
2356
- : [];
2357
- accumulator.push(option, ...children);
2358
- }
2359
- else {
2360
- accumulator.push(option);
2361
- }
2362
- return accumulator;
2363
- }, []);
2364
- }
2365
3350
  handleAddLayers(layers) {
2366
3351
  const layersFiltrered = layers
2367
3352
  .filter((layer) => layer)
@@ -2381,21 +3366,19 @@ class LayerContextDirective {
2381
3366
  if (!params || !currentLayerid) {
2382
3367
  return visible;
2383
3368
  }
2384
- const contextParams = params[this.route.options.contextKey];
3369
+ const contextParams = this.shareMapService.getContext(params);
2385
3370
  if (contextParams === currentContext || !contextParams) {
2386
3371
  let visibleOnLayersParams = '';
2387
3372
  let visibleOffLayersParams = '';
2388
3373
  let visiblelayers = [];
2389
3374
  let invisiblelayers = [];
2390
- if (this.route.options.visibleOnLayersKey &&
2391
- params[this.route.options.visibleOnLayersKey]) {
2392
- visibleOnLayersParams =
2393
- params[this.route.options.visibleOnLayersKey];
3375
+ const visibleOnLayers = params[this.shareMapService.routeService.options.visibleOnLayersKey];
3376
+ const visibleOffLayers = params[this.shareMapService.routeService.options.visibleOffLayersKey];
3377
+ if (visibleOnLayers) {
3378
+ visibleOnLayersParams = visibleOnLayers;
2394
3379
  }
2395
- if (this.route.options.visibleOffLayersKey &&
2396
- params[this.route.options.visibleOffLayersKey]) {
2397
- visibleOffLayersParams =
2398
- params[this.route.options.visibleOffLayersKey];
3380
+ if (visibleOffLayers) {
3381
+ visibleOffLayersParams = visibleOffLayers;
2399
3382
  }
2400
3383
  /* This order is important because to control whichever
2401
3384
  the order of * param. First whe open and close everything.*/
@@ -2419,37 +3402,69 @@ class LayerContextDirective {
2419
3402
  }
2420
3403
  return visible;
2421
3404
  }
2422
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LayerContextDirective, deps: [{ token: i1$2.MapBrowserComponent }, { token: ContextService }, { token: i1$2.LayerService }, { token: i1$1.ConfigService }, { token: i1$2.StyleListService }, { token: i1$2.StyleService }, { token: i8.RouteService, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
2423
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: LayerContextDirective, isStandalone: true, selector: "[igoLayerContext]", inputs: { removeLayersOnContextChange: "removeLayersOnContextChange" }, ngImport: i0 });
3405
+ handleContextWithSharedUrl(context) {
3406
+ if (!this.queryParams ||
3407
+ (!hasLegacyParams(this.queryParams, this.shareMapService.optionsLegacy) &&
3408
+ !hasModernShareParams(this.queryParams, this.shareMapService.keysDefinitions))) {
3409
+ return context.layers;
3410
+ }
3411
+ const { layers, uri } = context;
3412
+ const contextValue = this.shareMapService.getContext(this.queryParams);
3413
+ if (!contextValue || contextValue === uri) {
3414
+ const layersOptions = this.shareMapService.parser.parseLayers(this.queryParams);
3415
+ if (layersOptions.length) {
3416
+ return mergeLayersOptions([...layers], layersOptions);
3417
+ }
3418
+ }
3419
+ return layers;
3420
+ }
3421
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LayerContextDirective, deps: [{ token: i1$3.MapBrowserComponent }, { token: ContextService }, { token: i1$3.LayerService }, { token: i1$2.ConfigService }, { token: i1$3.StyleListService }, { token: i1$3.StyleService }, { token: ShareMapService }], target: i0.ɵɵFactoryTarget.Directive });
3422
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: LayerContextDirective, isStandalone: true, selector: "[igoLayerContext]", inputs: { removeLayersOnContextChange: "removeLayersOnContextChange" }, outputs: { contextLayersLoaded: "contextLayersLoaded" }, ngImport: i0 });
2424
3423
  }
2425
3424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LayerContextDirective, decorators: [{
2426
3425
  type: Directive,
2427
3426
  args: [{
2428
- selector: '[igoLayerContext]',
2429
- standalone: true
3427
+ selector: '[igoLayerContext]'
2430
3428
  }]
2431
- }], ctorParameters: () => [{ type: i1$2.MapBrowserComponent }, { type: ContextService }, { type: i1$2.LayerService }, { type: i1$1.ConfigService }, { type: i1$2.StyleListService }, { type: i1$2.StyleService }, { type: i8.RouteService, decorators: [{
2432
- type: Optional
2433
- }] }], propDecorators: { removeLayersOnContextChange: [{
3429
+ }], ctorParameters: () => [{ type: i1$3.MapBrowserComponent }, { type: ContextService }, { type: i1$3.LayerService }, { type: i1$2.ConfigService }, { type: i1$3.StyleListService }, { type: i1$3.StyleService }, { type: ShareMapService }], propDecorators: { removeLayersOnContextChange: [{
2434
3430
  type: Input
3431
+ }], contextLayersLoaded: [{
3432
+ type: Output
2435
3433
  }] } });
3434
+ /** Recursive */
3435
+ function addIdToGroups(layerOptions) {
3436
+ for (const options of layerOptions) {
3437
+ if (isLayerGroupOptions(options) && !options.id) {
3438
+ options.id = ID_GROUP_PREFIX + uuid();
3439
+ if (Array.isArray(options.children)) {
3440
+ addIdToGroups(options.children);
3441
+ }
3442
+ }
3443
+ }
3444
+ }
2436
3445
 
2437
3446
  class MapContextDirective {
2438
3447
  contextService;
2439
3448
  mediaService;
3449
+ shareMapService;
2440
3450
  component;
2441
3451
  context$$;
2442
3452
  get map() {
2443
3453
  return this.component.map;
2444
3454
  }
2445
- constructor(component, contextService, mediaService) {
3455
+ queryParams;
3456
+ constructor(component, contextService, mediaService, shareMapService) {
2446
3457
  this.contextService = contextService;
2447
3458
  this.mediaService = mediaService;
3459
+ this.shareMapService = shareMapService;
2448
3460
  this.component = component;
2449
3461
  }
2450
3462
  ngOnInit() {
2451
- this.context$$ = this.contextService.context$
2452
- .pipe(filter((context) => context !== undefined))
3463
+ this.context$$ = this.shareMapService.routeService.queryParams
3464
+ .pipe(switchMap((params) => {
3465
+ this.queryParams = params ?? {};
3466
+ return this.contextService.context$.pipe(filter((context) => context !== undefined));
3467
+ }))
2453
3468
  .subscribe((context) => this.handleContextChange(context));
2454
3469
  }
2455
3470
  ngOnDestroy() {
@@ -2460,9 +3475,15 @@ class MapContextDirective {
2460
3475
  return;
2461
3476
  }
2462
3477
  const viewContext = context.map.view;
2463
- if (!this.component.view ||
3478
+ const shouldOverrideView = !this.component.view ||
2464
3479
  viewContext.keepCurrentView !== true ||
2465
- context.map.view.projection !== this.map.projection) {
3480
+ context.map.view.projection !== this.map.projection;
3481
+ if (this.shareMapService.hasPositionParams(this.queryParams) &&
3482
+ shouldOverrideView) {
3483
+ const positions = this.shareMapService.parser.parsePosition(this.queryParams);
3484
+ this.component.view = { ...viewContext, ...positions };
3485
+ }
3486
+ else if (shouldOverrideView) {
2466
3487
  this.component.view = viewContext;
2467
3488
  }
2468
3489
  if (this.component.map.geolocationController) {
@@ -2482,16 +3503,15 @@ class MapContextDirective {
2482
3503
  this.component.controls = controlsContext;
2483
3504
  }
2484
3505
  }
2485
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: MapContextDirective, deps: [{ token: i1$2.MapBrowserComponent }, { token: ContextService }, { token: i3$2.MediaService }], target: i0.ɵɵFactoryTarget.Directive });
3506
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: MapContextDirective, deps: [{ token: i1$3.MapBrowserComponent }, { token: ContextService }, { token: i3$2.MediaService }, { token: ShareMapService }], target: i0.ɵɵFactoryTarget.Directive });
2486
3507
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: MapContextDirective, isStandalone: true, selector: "[igoMapContext]", ngImport: i0 });
2487
3508
  }
2488
3509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: MapContextDirective, decorators: [{
2489
3510
  type: Directive,
2490
3511
  args: [{
2491
- selector: '[igoMapContext]',
2492
- standalone: true
3512
+ selector: '[igoMapContext]'
2493
3513
  }]
2494
- }], ctorParameters: () => [{ type: i1$2.MapBrowserComponent }, { type: ContextService }, { type: i3$2.MediaService }] });
3514
+ }], ctorParameters: () => [{ type: i1$3.MapBrowserComponent }, { type: ContextService }, { type: i3$2.MediaService }, { type: ShareMapService }] });
2495
3515
 
2496
3516
  /**
2497
3517
  * @deprecated import the components/directives directly or CONTEXT_MANAGER_DIRECTIVES for the set
@@ -2597,13 +3617,13 @@ class BookmarkButtonComponent {
2597
3617
  }
2598
3618
  });
2599
3619
  }
2600
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookmarkButtonComponent, deps: [{ token: i1$4.MatDialog }, { token: ContextService }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component });
2601
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: BookmarkButtonComponent, isStandalone: true, selector: "igo-bookmark-button", inputs: { map: "map", color: "color" }, ngImport: i0, template: "<div class=\"igo-bookmark-button-container\">\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.bookmarkButton.create' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"createContext()\"\n >\n <mat-icon>star</mat-icon>\n </button>\n</div>\n", styles: [":host button{border-radius:0!important}:host button .mat-ripple,:host button .mdc-icon-button__ripple{border-radius:0!important}:host .igo-bookmark-button-container{width:40px}:host .igo-bookmark-button-container button{background-color:#fff}:host .igo-bookmark-button-container button:hover{background-color:#efefef}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3620
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookmarkButtonComponent, deps: [{ token: i1$5.MatDialog }, { token: ContextService }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component });
3621
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: BookmarkButtonComponent, isStandalone: true, selector: "igo-bookmark-button", inputs: { map: "map", color: "color" }, ngImport: i0, template: "<div class=\"igo-bookmark-button-container\">\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.bookmarkButton.create' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"createContext()\"\n >\n <mat-icon>star</mat-icon>\n </button>\n</div>\n", styles: [":host button{border-radius:0!important}:host button .mat-ripple,:host button .mdc-icon-button__ripple{border-radius:0!important}:host .igo-bookmark-button-container{width:40px}:host .igo-bookmark-button-container button{background-color:#fff}:host .igo-bookmark-button-container button:hover{background-color:#efefef}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2602
3622
  }
2603
3623
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookmarkButtonComponent, decorators: [{
2604
3624
  type: Component,
2605
3625
  args: [{ selector: 'igo-bookmark-button', imports: [MatButtonModule, MatTooltipModule, MatIconModule, IgoLanguageModule], template: "<div class=\"igo-bookmark-button-container\">\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.bookmarkButton.create' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"createContext()\"\n >\n <mat-icon>star</mat-icon>\n </button>\n</div>\n", styles: [":host button{border-radius:0!important}:host button .mat-ripple,:host button .mdc-icon-button__ripple{border-radius:0!important}:host .igo-bookmark-button-container{width:40px}:host .igo-bookmark-button-container button{background-color:#fff}:host .igo-bookmark-button-container button:hover{background-color:#efefef}\n"] }]
2606
- }], ctorParameters: () => [{ type: i1$4.MatDialog }, { type: ContextService }, { type: i3.MessageService }], propDecorators: { map: [{
3626
+ }], ctorParameters: () => [{ type: i1$5.MatDialog }, { type: ContextService }, { type: i3.MessageService }], propDecorators: { map: [{
2607
3627
  type: Input
2608
3628
  }], color: [{
2609
3629
  type: Input
@@ -2615,8 +3635,8 @@ class PoiDialogComponent {
2615
3635
  constructor(dialogRef) {
2616
3636
  this.dialogRef = dialogRef;
2617
3637
  }
2618
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiDialogComponent, deps: [{ token: i1$4.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
2619
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: PoiDialogComponent, isStandalone: true, selector: "igo-poi-dialog", ngImport: i0, template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.poiButton.dialog.title' | translate }}\n</h1>\n<div mat-dialog-content>\n <mat-form-field>\n <input\n matInput\n required\n autocomplete=\"off\"\n [placeholder]=\"'igo.context.poiButton.dialog.placeholder' | translate\"\n [(ngModel)]=\"title\"\n />\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!title\"\n (click)=\"dialogRef.close(title)\"\n >\n {{ 'igo.common.confirmDialog.confirmBtn' | translate }}\n </button>\n <button mat-button (click)=\"dialogRef.close(false)\">\n {{ 'igo.common.confirmDialog.cancelBtn' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3638
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiDialogComponent, deps: [{ token: i1$5.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
3639
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: PoiDialogComponent, isStandalone: true, selector: "igo-poi-dialog", ngImport: i0, template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.poiButton.dialog.title' | translate }}\n</h1>\n<div mat-dialog-content>\n <mat-form-field>\n <input\n matInput\n required\n autocomplete=\"off\"\n [placeholder]=\"'igo.context.poiButton.dialog.placeholder' | translate\"\n [(ngModel)]=\"title\"\n />\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!title\"\n (click)=\"dialogRef.close(title)\"\n >\n {{ 'igo.common.confirmDialog.confirmBtn' | translate }}\n </button>\n <button mat-button (click)=\"dialogRef.close(false)\">\n {{ 'igo.common.confirmDialog.cancelBtn' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2620
3640
  }
2621
3641
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiDialogComponent, decorators: [{
2622
3642
  type: Component,
@@ -2630,7 +3650,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2630
3650
  MatButtonModule,
2631
3651
  IgoLanguageModule
2632
3652
  ], template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.poiButton.dialog.title' | translate }}\n</h1>\n<div mat-dialog-content>\n <mat-form-field>\n <input\n matInput\n required\n autocomplete=\"off\"\n [placeholder]=\"'igo.context.poiButton.dialog.placeholder' | translate\"\n [(ngModel)]=\"title\"\n />\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!title\"\n (click)=\"dialogRef.close(title)\"\n >\n {{ 'igo.common.confirmDialog.confirmBtn' | translate }}\n </button>\n <button mat-button (click)=\"dialogRef.close(false)\">\n {{ 'igo.common.confirmDialog.cancelBtn' | translate }}\n </button>\n</div>\n" }]
2633
- }], ctorParameters: () => [{ type: i1$4.MatDialogRef }] });
3653
+ }], ctorParameters: () => [{ type: i1$5.MatDialogRef }] });
2634
3654
 
2635
3655
  class PoiService {
2636
3656
  http;
@@ -2656,12 +3676,12 @@ class PoiService {
2656
3676
  const url = this.baseUrl + '/pois';
2657
3677
  return this.http.post(url, context);
2658
3678
  }
2659
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiService, deps: [{ token: i1.HttpClient }, { token: i1$1.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
3679
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiService, deps: [{ token: i1$1.HttpClient }, { token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
2660
3680
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiService });
2661
3681
  }
2662
3682
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiService, decorators: [{
2663
3683
  type: Injectable
2664
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i1$1.ConfigService }] });
3684
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i1$2.ConfigService }] });
2665
3685
 
2666
3686
  class PoiButtonComponent {
2667
3687
  dialog;
@@ -2769,8 +3789,8 @@ class PoiButtonComponent {
2769
3789
  easing: oleasing.easeOut
2770
3790
  });
2771
3791
  }
2772
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiButtonComponent, deps: [{ token: i1$4.MatDialog }, { token: i2.AuthService }, { token: PoiService }, { token: i3.MessageService }, { token: i4.LanguageService }, { token: i5$1.ConfirmDialogService }], target: i0.ɵɵFactoryTarget.Component });
2773
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: PoiButtonComponent, isStandalone: true, selector: "igo-poi-button", inputs: { map: "map", color: "color" }, providers: [PoiService], ngImport: i0, template: "<mat-select\n [placeholder]=\"'igo.context.poiButton.placeholder' | translate\"\n floatPlaceholder=\"never\"\n>\n <mat-option (click)=\"createPoi()\" class=\"poi-option\">\n <div class=\"titlePoi\">\n {{ 'igo.context.poiButton.create' | translate }}\n </div>\n <button\n igoStopPropagation\n mat-icon-button\n color=\"primary\"\n (click)=\"createPoi()\"\n >\n <mat-icon>add-circle</mat-icon>\n </button>\n </mat-option>\n <mat-divider></mat-divider>\n <mat-option\n *ngFor=\"let poi of pois\"\n class=\"poi-option\"\n [value]=\"poi.id\"\n (click)=\"zoomOnPoi(poi.id)\"\n >\n <div class=\"titlePoi\">{{ poi.title }}</div>\n <button\n mat-icon-button\n igoStopPropagation\n color=\"warn\"\n (click)=\"deletePoi(poi)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </mat-option>\n</mat-select>\n", styles: [":host{background-color:#fff;padding:0 8px;height:100%}mat-select{width:150px;height:100%}mat-select ::ng-deep .mat-mdc-select-trigger{height:100%}::ng-deep .poi-option .mdc-list-item__primary-text{display:flex;justify-content:space-between;align-items:center;flex:1;overflow:visible}::ng-deep .poi-option button{margin-right:-16px}\n"], dependencies: [{ kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3792
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiButtonComponent, deps: [{ token: i1$5.MatDialog }, { token: i2.AuthService }, { token: PoiService }, { token: i3.MessageService }, { token: i4.LanguageService }, { token: i5$1.ConfirmDialogService }], target: i0.ɵɵFactoryTarget.Component });
3793
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: PoiButtonComponent, isStandalone: true, selector: "igo-poi-button", inputs: { map: "map", color: "color" }, providers: [PoiService], ngImport: i0, template: "<mat-select\n [placeholder]=\"'igo.context.poiButton.placeholder' | translate\"\n floatPlaceholder=\"never\"\n>\n <mat-option (click)=\"createPoi()\" class=\"poi-option\">\n <div class=\"titlePoi\">\n {{ 'igo.context.poiButton.create' | translate }}\n </div>\n <button\n igoStopPropagation\n mat-icon-button\n color=\"primary\"\n (click)=\"createPoi()\"\n >\n <mat-icon>add-circle</mat-icon>\n </button>\n </mat-option>\n <mat-divider></mat-divider>\n <mat-option\n *ngFor=\"let poi of pois\"\n class=\"poi-option\"\n [value]=\"poi.id\"\n (click)=\"zoomOnPoi(poi.id)\"\n >\n <div class=\"titlePoi\">{{ poi.title }}</div>\n <button\n mat-icon-button\n igoStopPropagation\n color=\"warn\"\n (click)=\"deletePoi(poi)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </mat-option>\n</mat-select>\n", styles: [":host{background-color:#fff;padding:0 8px;height:100%}mat-select{width:150px;height:100%}mat-select ::ng-deep .mat-mdc-select-trigger{height:100%}::ng-deep .poi-option .mdc-list-item__primary-text{display:flex;justify-content:space-between;align-items:center;flex:1;overflow:visible}::ng-deep .poi-option button{margin-right:-16px}\n"], dependencies: [{ kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2774
3794
  }
2775
3795
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PoiButtonComponent, decorators: [{
2776
3796
  type: Component,
@@ -2784,7 +3804,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2784
3804
  NgFor,
2785
3805
  IgoLanguageModule
2786
3806
  ], providers: [PoiService], template: "<mat-select\n [placeholder]=\"'igo.context.poiButton.placeholder' | translate\"\n floatPlaceholder=\"never\"\n>\n <mat-option (click)=\"createPoi()\" class=\"poi-option\">\n <div class=\"titlePoi\">\n {{ 'igo.context.poiButton.create' | translate }}\n </div>\n <button\n igoStopPropagation\n mat-icon-button\n color=\"primary\"\n (click)=\"createPoi()\"\n >\n <mat-icon>add-circle</mat-icon>\n </button>\n </mat-option>\n <mat-divider></mat-divider>\n <mat-option\n *ngFor=\"let poi of pois\"\n class=\"poi-option\"\n [value]=\"poi.id\"\n (click)=\"zoomOnPoi(poi.id)\"\n >\n <div class=\"titlePoi\">{{ poi.title }}</div>\n <button\n mat-icon-button\n igoStopPropagation\n color=\"warn\"\n (click)=\"deletePoi(poi)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </mat-option>\n</mat-select>\n", styles: [":host{background-color:#fff;padding:0 8px;height:100%}mat-select{width:150px;height:100%}mat-select ::ng-deep .mat-mdc-select-trigger{height:100%}::ng-deep .poi-option .mdc-list-item__primary-text{display:flex;justify-content:space-between;align-items:center;flex:1;overflow:visible}::ng-deep .poi-option button{margin-right:-16px}\n"] }]
2787
- }], ctorParameters: () => [{ type: i1$4.MatDialog }, { type: i2.AuthService }, { type: PoiService }, { type: i3.MessageService }, { type: i4.LanguageService }, { type: i5$1.ConfirmDialogService }], propDecorators: { map: [{
3807
+ }], ctorParameters: () => [{ type: i1$5.MatDialog }, { type: i2.AuthService }, { type: PoiService }, { type: i3.MessageService }, { type: i4.LanguageService }, { type: i5$1.ConfirmDialogService }], propDecorators: { map: [{
2788
3808
  type: Input
2789
3809
  }], color: [{
2790
3810
  type: Input
@@ -2823,8 +3843,8 @@ class UserDialogComponent {
2823
3843
  clearPreferences() {
2824
3844
  this.storageService.clear();
2825
3845
  }
2826
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: UserDialogComponent, deps: [{ token: i1$4.MatDialogRef }, { token: i2.AuthService }, { token: i6.StorageService }], target: i0.ɵɵFactoryTarget.Component });
2827
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: UserDialogComponent, isStandalone: true, selector: "igo-user-dialog", ngImport: i0, template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.userButton.infoTitle' | translate }}\n</h1>\n<div mat-dialog-content class=\"mat-typography\">\n <p>\n {{ 'igo.context.userButton.dialog.user' | translate }}: {{ user.sourceId }}\n </p>\n <p>\n {{ 'igo.context.userButton.dialog.email' | translate }}: {{ user.email }}\n </p>\n <p>{{ 'igo.context.userButton.dialog.expiration' | translate }}: {{ exp }}</p>\n <button mat-stroked-button color=\"primary\" (click)=\"clearPreferences()\">\n {{ 'igo.context.userButton.dialog.clearPreferences' | translate }}\n </button>\n <br />\n</div>\n<div mat-dialog-actions style=\"justify-content: center\">\n <button mat-raised-button color=\"primary\" (click)=\"dialogRef.close(false)\">\n OK\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3846
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: UserDialogComponent, deps: [{ token: i1$5.MatDialogRef }, { token: i2.AuthService }, { token: i6.StorageService }], target: i0.ɵɵFactoryTarget.Component });
3847
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: UserDialogComponent, isStandalone: true, selector: "igo-user-dialog", ngImport: i0, template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.userButton.infoTitle' | translate }}\n</h1>\n<div mat-dialog-content class=\"mat-typography\">\n <p>\n {{ 'igo.context.userButton.dialog.user' | translate }}: {{ user.sourceId }}\n </p>\n <p>\n {{ 'igo.context.userButton.dialog.email' | translate }}: {{ user.email }}\n </p>\n <p>{{ 'igo.context.userButton.dialog.expiration' | translate }}: {{ exp }}</p>\n <button mat-stroked-button color=\"primary\" (click)=\"clearPreferences()\">\n {{ 'igo.context.userButton.dialog.clearPreferences' | translate }}\n </button>\n <br />\n</div>\n<div mat-dialog-actions style=\"justify-content: center\">\n <button mat-raised-button color=\"primary\" (click)=\"dialogRef.close(false)\">\n OK\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
2828
3848
  }
2829
3849
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: UserDialogComponent, decorators: [{
2830
3850
  type: Component,
@@ -2835,7 +3855,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2835
3855
  MatDialogActions,
2836
3856
  IgoLanguageModule
2837
3857
  ], template: "<h1 mat-dialog-title class=\"mat-typography\">\n {{ 'igo.context.userButton.infoTitle' | translate }}\n</h1>\n<div mat-dialog-content class=\"mat-typography\">\n <p>\n {{ 'igo.context.userButton.dialog.user' | translate }}: {{ user.sourceId }}\n </p>\n <p>\n {{ 'igo.context.userButton.dialog.email' | translate }}: {{ user.email }}\n </p>\n <p>{{ 'igo.context.userButton.dialog.expiration' | translate }}: {{ exp }}</p>\n <button mat-stroked-button color=\"primary\" (click)=\"clearPreferences()\">\n {{ 'igo.context.userButton.dialog.clearPreferences' | translate }}\n </button>\n <br />\n</div>\n<div mat-dialog-actions style=\"justify-content: center\">\n <button mat-raised-button color=\"primary\" (click)=\"dialogRef.close(false)\">\n OK\n </button>\n</div>\n" }]
2838
- }], ctorParameters: () => [{ type: i1$4.MatDialogRef }, { type: i2.AuthService }, { type: i6.StorageService }] });
3858
+ }], ctorParameters: () => [{ type: i1$5.MatDialogRef }, { type: i2.AuthService }, { type: i6.StorageService }] });
2839
3859
 
2840
3860
  class UserButtonComponent {
2841
3861
  dialog;
@@ -2880,8 +3900,8 @@ class UserButtonComponent {
2880
3900
  infoUser() {
2881
3901
  this.dialog.open(UserDialogComponent, { disableClose: false });
2882
3902
  }
2883
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: UserButtonComponent, deps: [{ token: i1$4.MatDialog }, { token: i1$1.ConfigService }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Component });
2884
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: UserButtonComponent, isStandalone: true, selector: "igo-user-button", inputs: { map: "map", color: "color" }, ngImport: i0, template: "<div *ngIf=\"visible\" class=\"igo-user-button-container\">\n <div\n class=\"igo-user-button-more-container\"\n [@userButtonState]=\"expand ? 'expand' : 'collapse'\"\n >\n <igo-poi-button *ngIf=\"hasApi\" [color]=\"color\" [map]=\"map\"></igo-poi-button>\n\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.userButton.infoTitle' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"infoUser()\"\n >\n <mat-icon>info</mat-icon>\n </button>\n\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.userButton.logout' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"logout()\"\n >\n <mat-icon>power_settings_new</mat-icon>\n </button>\n </div>\n\n <button\n mat-icon-button\n [color]=\"auth.authenticated ? color : 'warn'\"\n (click)=\"accountClick()\"\n >\n <mat-icon>account_box</mat-icon>\n </button>\n</div>\n", styles: [":host button{border-radius:0!important}:host button .mat-ripple,:host button .mdc-icon-button__ripple{border-radius:0!important}:host .igo-user-button-container{display:flex;gap:4px}:host .igo-user-button-container button{background-color:#fff}:host .igo-user-button-container button:hover{background-color:#efefef}:host .igo-user-button-more-container{display:flex;gap:4px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PoiButtonComponent, selector: "igo-poi-button", inputs: ["map", "color"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }], animations: [userButtonSlideInOut()] });
3903
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: UserButtonComponent, deps: [{ token: i1$5.MatDialog }, { token: i1$2.ConfigService }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Component });
3904
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: UserButtonComponent, isStandalone: true, selector: "igo-user-button", inputs: { map: "map", color: "color" }, ngImport: i0, template: "<div *ngIf=\"visible\" class=\"igo-user-button-container\">\n <div\n class=\"igo-user-button-more-container\"\n [@userButtonState]=\"expand ? 'expand' : 'collapse'\"\n >\n <igo-poi-button *ngIf=\"hasApi\" [color]=\"color\" [map]=\"map\"></igo-poi-button>\n\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.userButton.infoTitle' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"infoUser()\"\n >\n <mat-icon>info</mat-icon>\n </button>\n\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.userButton.logout' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"logout()\"\n >\n <mat-icon>power_settings_new</mat-icon>\n </button>\n </div>\n\n <button\n mat-icon-button\n [color]=\"auth.authenticated ? color : 'warn'\"\n (click)=\"accountClick()\"\n >\n <mat-icon>account_box</mat-icon>\n </button>\n</div>\n", styles: [":host button{border-radius:0!important}:host button .mat-ripple,:host button .mdc-icon-button__ripple{border-radius:0!important}:host .igo-user-button-container{display:flex;gap:4px}:host .igo-user-button-container button{background-color:#fff}:host .igo-user-button-container button:hover{background-color:#efefef}:host .igo-user-button-more-container{display:flex;gap:4px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PoiButtonComponent, selector: "igo-poi-button", inputs: ["map", "color"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }], animations: [userButtonSlideInOut()] });
2885
3905
  }
2886
3906
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: UserButtonComponent, decorators: [{
2887
3907
  type: Component,
@@ -2893,7 +3913,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2893
3913
  MatIconModule,
2894
3914
  IgoLanguageModule
2895
3915
  ], template: "<div *ngIf=\"visible\" class=\"igo-user-button-container\">\n <div\n class=\"igo-user-button-more-container\"\n [@userButtonState]=\"expand ? 'expand' : 'collapse'\"\n >\n <igo-poi-button *ngIf=\"hasApi\" [color]=\"color\" [map]=\"map\"></igo-poi-button>\n\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.userButton.infoTitle' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"infoUser()\"\n >\n <mat-icon>info</mat-icon>\n </button>\n\n <button\n mat-icon-button\n [matTooltip]=\"'igo.context.userButton.logout' | translate\"\n matTooltipPosition=\"above\"\n [color]=\"color\"\n (click)=\"logout()\"\n >\n <mat-icon>power_settings_new</mat-icon>\n </button>\n </div>\n\n <button\n mat-icon-button\n [color]=\"auth.authenticated ? color : 'warn'\"\n (click)=\"accountClick()\"\n >\n <mat-icon>account_box</mat-icon>\n </button>\n</div>\n", styles: [":host button{border-radius:0!important}:host button .mat-ripple,:host button .mdc-icon-button__ripple{border-radius:0!important}:host .igo-user-button-container{display:flex;gap:4px}:host .igo-user-button-container button{background-color:#fff}:host .igo-user-button-container button:hover{background-color:#efefef}:host .igo-user-button-more-container{display:flex;gap:4px}\n"] }]
2896
- }], ctorParameters: () => [{ type: i1$4.MatDialog }, { type: i1$1.ConfigService }, { type: i2.AuthService }], propDecorators: { map: [{
3916
+ }], ctorParameters: () => [{ type: i1$5.MatDialog }, { type: i1$2.ConfigService }, { type: i2.AuthService }], propDecorators: { map: [{
2897
3917
  type: Input
2898
3918
  }], color: [{
2899
3919
  type: Input
@@ -2940,221 +3960,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2940
3960
  }]
2941
3961
  }] });
2942
3962
 
2943
- class ShareMapService {
2944
- contextService;
2945
- route;
2946
- language = '';
2947
- constructor(contextService, route) {
2948
- this.contextService = contextService;
2949
- this.route = route;
2950
- this.route.queryParams.subscribe((params) => {
2951
- if (params['lang']) {
2952
- this.language = params['lang'];
2953
- }
2954
- });
2955
- }
2956
- getUrlWithApi(formValues) {
2957
- return this.language
2958
- ? `${location.origin + location.pathname}?context=${formValues.uri}&lang=${this.language}`
2959
- : `${location.origin + location.pathname}?context=${formValues.uri}`;
2960
- }
2961
- createContextShared(map, formValues) {
2962
- const context = this.contextService.getContextFromMap(map);
2963
- context.scope = 'public';
2964
- context.title = formValues.title;
2965
- context.uri = formValues.uri;
2966
- return this.contextService.create(context);
2967
- }
2968
- updateContextShared(map, formValues, id) {
2969
- const context = this.contextService.getContextFromMap(map);
2970
- return this.contextService.update(id, {
2971
- title: formValues.title,
2972
- map: context.map
2973
- });
2974
- }
2975
- getUrlWithoutApi(map, publicShareOption) {
2976
- if (!this.route ||
2977
- !this.route.options.visibleOnLayersKey ||
2978
- !this.route.options.visibleOffLayersKey ||
2979
- !map.viewController.getZoom()) {
2980
- return;
2981
- }
2982
- const llc = publicShareOption.layerlistControls.querystring;
2983
- let visibleKey = this.route.options.visibleOnLayersKey;
2984
- let invisibleKey = this.route.options.visibleOffLayersKey;
2985
- const layers = map.layerController.all.filter((layer) => isLayerItem(layer));
2986
- const visibleLayers = layers.filter((lay) => lay.visible && !lay.isIgoInternalLayer);
2987
- const invisibleLayers = layers.filter((lay) => !lay.visible && !lay.isIgoInternalLayer);
2988
- if (visibleLayers.length === 0) {
2989
- visibleKey = '';
2990
- }
2991
- if (invisibleLayers.length === 0) {
2992
- invisibleKey = '';
2993
- }
2994
- let layersUrl = '';
2995
- let layersToLoop = [];
2996
- if (visibleLayers.length > invisibleLayers.length) {
2997
- layersUrl = `${visibleKey}=*&${invisibleKey}=`;
2998
- layersToLoop = invisibleLayers;
2999
- }
3000
- else {
3001
- layersUrl = `${invisibleKey}=*&${visibleKey}=`;
3002
- layersToLoop = visibleLayers;
3003
- }
3004
- for (const layer of layersToLoop) {
3005
- if (layer.id) {
3006
- layersUrl += layer.id + ',';
3007
- }
3008
- }
3009
- const contextLayersID = [];
3010
- const contextLayers = this.contextService.context$.value.layers;
3011
- for (const contextLayer of contextLayers) {
3012
- if (typeof contextLayer.id !== 'undefined' ||
3013
- typeof contextLayer.source !== 'undefined') {
3014
- contextLayersID.push(contextLayer.id || contextLayer.source.id);
3015
- }
3016
- }
3017
- const addedLayersQueryParamsWms = this.makeLayersByService(layers, contextLayersID, 'wms');
3018
- const addedLayersQueryParamsWmts = this.makeLayersByService(layers, contextLayersID, 'wmts');
3019
- const addedLayersQueryParamsArcgisRest = this.makeLayersByService(layers, contextLayersID, 'arcgisrest');
3020
- const addedLayersQueryParamsImageArcgisRest = this.makeLayersByService(layers, contextLayersID, 'imagearcgisrest');
3021
- const addedLayersQueryParamsTileArcgisRest = this.makeLayersByService(layers, contextLayersID, 'tilearcgisrest');
3022
- layersUrl = layersUrl.substr(0, layersUrl.length - 1);
3023
- const zoomKey = this.route.options.zoomKey;
3024
- const centerKey = this.route.options.centerKey;
3025
- const contextKey = this.route.options.contextKey;
3026
- const zoom = `${zoomKey}=${map.viewController.getZoom()}`;
3027
- const arrayCenter = map.viewController.getCenter('EPSG:4326') || [];
3028
- const long = arrayCenter[0].toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
3029
- const lat = arrayCenter[1].toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
3030
- const center = `${centerKey}=${long},${lat}`.replace(/.00000/g, '');
3031
- let context = '';
3032
- if (this.contextService.context$.value) {
3033
- context = `${contextKey}=${this.contextService.context$.value.uri}`;
3034
- }
3035
- let url = this.language
3036
- ? `${location.origin}${location.pathname}?${context}&${zoom}&${center}&${layersUrl}&${llc}&${addedLayersQueryParamsWms}&${llc}&${addedLayersQueryParamsWmts}&${addedLayersQueryParamsArcgisRest}&${addedLayersQueryParamsImageArcgisRest}&${addedLayersQueryParamsTileArcgisRest}&lang=${this.language}`
3037
- : `${location.origin}${location.pathname}?${context}&${zoom}&${center}&${layersUrl}&${llc}&${addedLayersQueryParamsWms}&${llc}&${addedLayersQueryParamsWmts}&${addedLayersQueryParamsArcgisRest}&${addedLayersQueryParamsImageArcgisRest}&${addedLayersQueryParamsTileArcgisRest}`;
3038
- for (let i = 0; i < 5; i++) {
3039
- url = url.replace(/&&/g, '&');
3040
- url = url.endsWith('&') ? url.slice(0, -1) : url;
3041
- }
3042
- url = url.endsWith('&') ? url.slice(0, -1) : url;
3043
- url = url.replace('?&wm', '&wm');
3044
- url = url.replace('?&', '?');
3045
- return url;
3046
- }
3047
- makeLayersByService(layers, contextLayersID, typeService) {
3048
- const addedLayersByService = [];
3049
- for (const layer of layers.filter((l) => l.dataSource.options?.type === typeService)) {
3050
- if (contextLayersID.indexOf(layer.id) === -1) {
3051
- let linkUrl = encodeURIComponent(layer.dataSource.options.url);
3052
- let addedLayer = '';
3053
- let layerVersion;
3054
- switch (layer.dataSource.options.type.toLowerCase()) {
3055
- case 'wms': {
3056
- const datasourceOptions = layer.dataSource
3057
- .options;
3058
- addedLayer = encodeURIComponent(datasourceOptions.params.LAYERS);
3059
- layerVersion =
3060
- datasourceOptions.params.VERSION === '1.3.0'
3061
- ? layerVersion
3062
- : datasourceOptions.params.VERSION;
3063
- break;
3064
- }
3065
- case 'wmts':
3066
- case 'arcgisrest':
3067
- case 'imagearcgisrest':
3068
- case 'tilearcgisrest':
3069
- addedLayer = encodeURIComponent(layer.dataSource.options.layer);
3070
- break;
3071
- }
3072
- const addedLayerPosition = `${addedLayer}:igoz${layer.zIndex}`;
3073
- let version = '';
3074
- if (layerVersion) {
3075
- const operator = layer.dataSource.options.url.indexOf('?') === -1
3076
- ? '?'
3077
- : '&';
3078
- version = encodeURIComponent(`${operator}VERSION=${layerVersion}`);
3079
- }
3080
- linkUrl = `${linkUrl}${version}`;
3081
- if (!addedLayersByService.find((definedUrl) => definedUrl.url === linkUrl)) {
3082
- addedLayersByService.push({
3083
- url: linkUrl,
3084
- layers: [addedLayerPosition]
3085
- });
3086
- }
3087
- else {
3088
- addedLayersByService.forEach((service) => {
3089
- if (service.url === linkUrl) {
3090
- service.layers.push(addedLayerPosition);
3091
- }
3092
- });
3093
- }
3094
- }
3095
- }
3096
- let addedLayersQueryParams = '';
3097
- if (addedLayersByService.length >= 1) {
3098
- let linkUrlKey;
3099
- let layersKey;
3100
- /*
3101
- const linkUrlKey = (typeService === 'wms') ? this.route.options.wmsUrlKey :
3102
- (typeService === 'wmts') ? this.route.options.wmtsUrlKey : '' ;
3103
- const layersKey = (typeService === 'wms') ? this.route.options.wmsLayersKey :
3104
- (typeService === 'wmts') ? this.route.options.wmtsLayersKey : '' ;
3105
- */
3106
- switch (typeService.toLowerCase()) {
3107
- case 'wms':
3108
- linkUrlKey = this.route.options.wmsUrlKey;
3109
- layersKey = this.route.options.wmsLayersKey;
3110
- break;
3111
- case 'wmts':
3112
- linkUrlKey = this.route.options.wmtsUrlKey;
3113
- layersKey = this.route.options.wmtsLayersKey;
3114
- break;
3115
- case 'arcgisrest':
3116
- linkUrlKey = this.route.options.arcgisUrlKey;
3117
- layersKey = this.route.options.arcgisLayersKey;
3118
- break;
3119
- case 'imagearcgisrest':
3120
- linkUrlKey = this.route.options.iarcgisUrlKey;
3121
- layersKey = this.route.options.iarcgisLayersKey;
3122
- break;
3123
- case 'tilearcgisrest':
3124
- linkUrlKey = this.route.options.tarcgisUrlKey;
3125
- layersKey = this.route.options.tarcgisLayersKey;
3126
- break;
3127
- default:
3128
- linkUrlKey = '';
3129
- layersKey = '';
3130
- }
3131
- let linkUrlQueryParams = '';
3132
- let layersQueryParams = '';
3133
- addedLayersByService.forEach((service) => {
3134
- linkUrlQueryParams += `${service.url},`;
3135
- layersQueryParams += `(${service.layers.join(',')}),`;
3136
- });
3137
- linkUrlQueryParams = linkUrlQueryParams.endsWith(',')
3138
- ? linkUrlQueryParams.slice(0, -1)
3139
- : linkUrlQueryParams;
3140
- layersQueryParams = layersQueryParams.endsWith(',')
3141
- ? layersQueryParams.slice(0, -1)
3142
- : layersQueryParams;
3143
- addedLayersQueryParams = `${linkUrlKey}=${linkUrlQueryParams}&${layersKey}=${layersQueryParams}`;
3144
- }
3145
- return addedLayersQueryParams;
3146
- }
3147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapService, deps: [{ token: ContextService }, { token: i8.RouteService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
3148
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapService, providedIn: 'root' });
3149
- }
3150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapService, decorators: [{
3151
- type: Injectable,
3152
- args: [{
3153
- providedIn: 'root'
3154
- }]
3155
- }], ctorParameters: () => [{ type: ContextService }, { type: i8.RouteService, decorators: [{
3156
- type: Optional
3157
- }] }] });
3963
+ const CONTEXT_MANAGER_DIRECTIVES = [
3964
+ ContextListComponent,
3965
+ ContextListBindingDirective,
3966
+ ContextItemComponent,
3967
+ ContextFormComponent,
3968
+ ContextEditComponent,
3969
+ ContextEditBindingDirective,
3970
+ ContextPermissionsComponent,
3971
+ ContextPermissionsBindingDirective,
3972
+ MapContextDirective,
3973
+ LayerContextDirective
3974
+ ];
3158
3975
 
3159
3976
  class ShareMapApiComponent {
3160
3977
  clipboard;
@@ -3163,18 +3980,20 @@ class ShareMapApiComponent {
3163
3980
  auth;
3164
3981
  shareMapService;
3165
3982
  formBuilder;
3983
+ contextService;
3166
3984
  form;
3167
3985
  map;
3168
3986
  url;
3169
3987
  userId;
3170
3988
  idContextShared;
3171
- constructor(clipboard, languageService, messageService, auth, shareMapService, formBuilder) {
3989
+ constructor(clipboard, languageService, messageService, auth, shareMapService, formBuilder, contextService) {
3172
3990
  this.clipboard = clipboard;
3173
3991
  this.languageService = languageService;
3174
3992
  this.messageService = messageService;
3175
3993
  this.auth = auth;
3176
3994
  this.shareMapService = shareMapService;
3177
3995
  this.formBuilder = formBuilder;
3996
+ this.contextService = contextService;
3178
3997
  }
3179
3998
  ngOnInit() {
3180
3999
  this.auth.authenticate$.subscribe(() => {
@@ -3187,7 +4006,7 @@ class ShareMapApiComponent {
3187
4006
  const inputs = Object.assign({}, values);
3188
4007
  inputs.uri = this.userId ? `${this.userId}-${values.uri}` : values.uri;
3189
4008
  this.url = this.shareMapService.getUrlWithApi(inputs);
3190
- this.shareMapService.createContextShared(this.map, inputs).subscribe((rep) => {
4009
+ this.createContextShared(this.map, inputs).subscribe((rep) => {
3191
4010
  this.idContextShared = rep.id;
3192
4011
  this.messageService.success('igo.context.contextManager.dialog.saveMsg', 'igo.context.contextManager.dialog.saveTitle', undefined, { value: inputs.title });
3193
4012
  }, (err) => {
@@ -3198,9 +4017,7 @@ class ShareMapApiComponent {
3198
4017
  updateContextShared(values = {}) {
3199
4018
  const inputs = Object.assign({}, values);
3200
4019
  inputs.uri = this.userId ? `${this.userId}-${values.uri}` : values.uri;
3201
- this.shareMapService
3202
- .updateContextShared(this.map, inputs, this.idContextShared)
3203
- .subscribe(() => {
4020
+ this._updateContextShared(this.map, inputs, this.idContextShared).subscribe(() => {
3204
4021
  this.messageService.success('igo.context.contextManager.dialog.saveMsg', 'igo.context.contextManager.dialog.saveTitle', undefined, { value: inputs.title });
3205
4022
  }, (err) => {
3206
4023
  err.error.title = this.languageService.translate.instant('igo.context.shareMap.errorTitle');
@@ -3223,8 +4040,22 @@ class ShareMapApiComponent {
3223
4040
  uri: [id]
3224
4041
  });
3225
4042
  }
3226
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapApiComponent, deps: [{ token: i1$3.Clipboard }, { token: i4.LanguageService }, { token: i3.MessageService }, { token: i2.AuthService }, { token: ShareMapService }, { token: i4$1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component });
3227
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ShareMapApiComponent, isStandalone: true, selector: "igo-share-map-api", inputs: { map: "map" }, ngImport: i0, template: "<form class=\"igo-form\" [formGroup]=\"form\" (ngSubmit)=\"createUrl(form.value)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <input\n matInput\n required\n [placeholder]=\"'igo.context.contextManager.form.title' | translate\"\n formControlName=\"title\"\n />\n <mat-error>\n {{ 'igo.context.contextManager.form.titleRequired' | translate }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div id=\"uriInput\" class=\"igo-input-container\">\n <mat-form-field>\n <span *ngIf=\"userId\" class=\"prefix\">{{ userId }}-</span>\n <span class=\"fieldWrapper\">\n <input\n matInput\n required\n [readonly]=\"!userId\"\n [placeholder]=\"'igo.context.contextManager.form.uri' | translate\"\n formControlName=\"uri\"\n />\n </span>\n <mat-error>\n {{ 'igo.context.contextManager.form.uriRequired' | translate }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n *ngIf=\"!url\"\n mat-raised-button\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ 'igo.context.shareMap.button' | translate }}\n </button>\n <button\n *ngIf=\"url\"\n mat-raised-button\n type=\"button\"\n (click)=\"updateContextShared(form.value)\"\n >\n {{ 'igo.context.shareMap.refreshBtn' | translate }}\n </button>\n </div>\n</form>\n\n<div *ngIf=\"url\" class=\"igo-input-container linkToShare\">\n <mat-form-field>\n <textarea\n #textArea\n matInput\n readonly\n rows=\"3\"\n class=\"textAreaWithButton\"\n [placeholder]=\"'igo.context.shareMap.placeholderLink' | translate\"\n [value]=\"url\"\n ></textarea>\n <button\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.shareMap.copy' | translate\"\n color=\"primary\"\n (click)=\"copyTextToClipboard(textArea)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n <div></div>\n</div>\n", styles: ["@charset \"UTF-8\";mat-form-field{width:100%}#uriInput .fieldWrapper{display:block;overflow:hidden}#uriInput .prefix{float:left}.linkToShare\\a0 {padding:25px 5px 5px}.linkToShare\\a0 textarea{resize:none;width:100%;line-height:1.3;height:40px;overflow-y:hidden;word-wrap:normal;word-break:break-all}.linkToShare\\a0 textarea.textAreaWithButton{width:calc(100% - 60px)}.linkToShare\\a0 mat-form-field>button{float:right;margin:-10px 0}.igo-form{padding:20px 5px 5px}.igo-form-button-group{text-align:center;padding-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
4043
+ createContextShared(map, formValues) {
4044
+ const context = this.contextService.getContextFromMap(map);
4045
+ context.scope = 'public';
4046
+ context.title = formValues.title;
4047
+ context.uri = formValues.uri;
4048
+ return this.contextService.create(context);
4049
+ }
4050
+ _updateContextShared(map, formValues, id) {
4051
+ const context = this.contextService.getContextFromMap(map);
4052
+ return this.contextService.update(id, {
4053
+ title: formValues.title,
4054
+ map: context.map
4055
+ });
4056
+ }
4057
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapApiComponent, deps: [{ token: i1$4.Clipboard }, { token: i4.LanguageService }, { token: i3.MessageService }, { token: i2.AuthService }, { token: ShareMapService }, { token: i4$1.UntypedFormBuilder }, { token: ContextService }], target: i0.ɵɵFactoryTarget.Component });
4058
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ShareMapApiComponent, isStandalone: true, selector: "igo-share-map-api", inputs: { map: "map" }, ngImport: i0, template: "<form class=\"igo-form\" [formGroup]=\"form\" (ngSubmit)=\"createUrl(form.value)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <input\n matInput\n required\n [placeholder]=\"'igo.context.contextManager.form.title' | translate\"\n formControlName=\"title\"\n />\n <mat-error>\n {{ 'igo.context.contextManager.form.titleRequired' | translate }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div id=\"uriInput\" class=\"igo-input-container\">\n <mat-form-field>\n <span *ngIf=\"userId\" class=\"prefix\">{{ userId }}-</span>\n <span class=\"fieldWrapper\">\n <input\n matInput\n required\n [readonly]=\"!userId\"\n [placeholder]=\"'igo.context.contextManager.form.uri' | translate\"\n formControlName=\"uri\"\n />\n </span>\n <mat-error>\n {{ 'igo.context.contextManager.form.uriRequired' | translate }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n *ngIf=\"!url\"\n mat-raised-button\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ 'igo.context.shareMap.button' | translate }}\n </button>\n <button\n *ngIf=\"url\"\n mat-raised-button\n type=\"button\"\n (click)=\"updateContextShared(form.value)\"\n >\n {{ 'igo.context.shareMap.refreshBtn' | translate }}\n </button>\n </div>\n</form>\n\n<div *ngIf=\"url\" class=\"igo-input-container linkToShare\">\n <mat-form-field>\n <textarea\n #textArea\n matInput\n readonly\n rows=\"3\"\n class=\"textAreaWithButton\"\n [placeholder]=\"'igo.context.shareMap.placeholderLink' | translate\"\n [value]=\"url\"\n ></textarea>\n <button\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.shareMap.copy' | translate\"\n color=\"primary\"\n (click)=\"copyTextToClipboard(textArea)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n <div></div>\n</div>\n", styles: ["@charset \"UTF-8\";mat-form-field{width:100%}#uriInput .fieldWrapper{display:block;overflow:hidden}#uriInput .prefix{float:left}.linkToShare\\a0 {padding:25px 5px 5px}.linkToShare\\a0 textarea{resize:none;width:100%;line-height:1.3;height:40px;overflow-y:hidden;word-wrap:normal;word-break:break-all}.linkToShare\\a0 textarea.textAreaWithButton{width:calc(100% - 60px)}.linkToShare\\a0 mat-form-field>button{float:right;margin:-10px 0}.igo-form{padding:20px 5px 5px}.igo-form-button-group{text-align:center;padding-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3228
4059
  }
3229
4060
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapApiComponent, decorators: [{
3230
4061
  type: Component,
@@ -3239,7 +4070,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
3239
4070
  MatIconModule,
3240
4071
  IgoLanguageModule
3241
4072
  ], template: "<form class=\"igo-form\" [formGroup]=\"form\" (ngSubmit)=\"createUrl(form.value)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <input\n matInput\n required\n [placeholder]=\"'igo.context.contextManager.form.title' | translate\"\n formControlName=\"title\"\n />\n <mat-error>\n {{ 'igo.context.contextManager.form.titleRequired' | translate }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div id=\"uriInput\" class=\"igo-input-container\">\n <mat-form-field>\n <span *ngIf=\"userId\" class=\"prefix\">{{ userId }}-</span>\n <span class=\"fieldWrapper\">\n <input\n matInput\n required\n [readonly]=\"!userId\"\n [placeholder]=\"'igo.context.contextManager.form.uri' | translate\"\n formControlName=\"uri\"\n />\n </span>\n <mat-error>\n {{ 'igo.context.contextManager.form.uriRequired' | translate }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n *ngIf=\"!url\"\n mat-raised-button\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ 'igo.context.shareMap.button' | translate }}\n </button>\n <button\n *ngIf=\"url\"\n mat-raised-button\n type=\"button\"\n (click)=\"updateContextShared(form.value)\"\n >\n {{ 'igo.context.shareMap.refreshBtn' | translate }}\n </button>\n </div>\n</form>\n\n<div *ngIf=\"url\" class=\"igo-input-container linkToShare\">\n <mat-form-field>\n <textarea\n #textArea\n matInput\n readonly\n rows=\"3\"\n class=\"textAreaWithButton\"\n [placeholder]=\"'igo.context.shareMap.placeholderLink' | translate\"\n [value]=\"url\"\n ></textarea>\n <button\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.shareMap.copy' | translate\"\n color=\"primary\"\n (click)=\"copyTextToClipboard(textArea)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n <div></div>\n</div>\n", styles: ["@charset \"UTF-8\";mat-form-field{width:100%}#uriInput .fieldWrapper{display:block;overflow:hidden}#uriInput .prefix{float:left}.linkToShare\\a0 {padding:25px 5px 5px}.linkToShare\\a0 textarea{resize:none;width:100%;line-height:1.3;height:40px;overflow-y:hidden;word-wrap:normal;word-break:break-all}.linkToShare\\a0 textarea.textAreaWithButton{width:calc(100% - 60px)}.linkToShare\\a0 mat-form-field>button{float:right;margin:-10px 0}.igo-form{padding:20px 5px 5px}.igo-form-button-group{text-align:center;padding-top:10px}\n"] }]
3242
- }], ctorParameters: () => [{ type: i1$3.Clipboard }, { type: i4.LanguageService }, { type: i3.MessageService }, { type: i2.AuthService }, { type: ShareMapService }, { type: i4$1.UntypedFormBuilder }], propDecorators: { map: [{
4073
+ }], ctorParameters: () => [{ type: i1$4.Clipboard }, { type: i4.LanguageService }, { type: i3.MessageService }, { type: i2.AuthService }, { type: ShareMapService }, { type: i4$1.UntypedFormBuilder }, { type: ContextService }], propDecorators: { map: [{
3243
4074
  type: Input
3244
4075
  }] } });
3245
4076
 
@@ -3247,37 +4078,45 @@ class ShareMapUrlComponent {
3247
4078
  clipboard;
3248
4079
  messageService;
3249
4080
  shareMapService;
4081
+ contextService;
3250
4082
  cdRef;
4083
+ route;
3251
4084
  mapState$$;
3252
4085
  map;
3253
4086
  url;
3254
4087
  publicShareOption = {
3255
4088
  layerlistControls: { querystring: '' }
3256
4089
  };
3257
- constructor(clipboard, messageService, shareMapService, cdRef) {
4090
+ language;
4091
+ constructor(clipboard, messageService, shareMapService, contextService, cdRef, route) {
3258
4092
  this.clipboard = clipboard;
3259
4093
  this.messageService = messageService;
3260
4094
  this.shareMapService = shareMapService;
4095
+ this.contextService = contextService;
3261
4096
  this.cdRef = cdRef;
4097
+ this.route = route;
4098
+ this.route.queryParams.subscribe((params) => {
4099
+ const lang = params[this.route.options.languageKey];
4100
+ if (lang) {
4101
+ this.language = lang;
4102
+ }
4103
+ });
3262
4104
  }
3263
4105
  ngOnInit() {
3264
- this.resetUrl();
4106
+ this.generateUrl();
3265
4107
  this.mapState$$ = combineLatest([
3266
4108
  this.map.viewController.state$,
3267
4109
  this.map.status$
3268
4110
  ]).subscribe(() => {
3269
- this.resetUrl();
4111
+ this.generateUrl();
3270
4112
  this.cdRef.detectChanges();
3271
4113
  });
3272
4114
  }
3273
- ngAfterViewInit() {
3274
- this.resetUrl();
3275
- }
3276
4115
  ngOnDestroy() {
3277
- this.mapState$$.unsubscribe();
4116
+ this.mapState$$?.unsubscribe();
3278
4117
  }
3279
- resetUrl() {
3280
- this.url = this.shareMapService.getUrlWithoutApi(this.map, this.publicShareOption);
4118
+ generateUrl() {
4119
+ this.url = this.shareMapService.encoder.generateUrl(this.map, this.contextService.context$.value, this.publicShareOption, this.language);
3281
4120
  }
3282
4121
  copyTextToClipboard(textArea) {
3283
4122
  const successful = this.clipboard.copy(textArea.value);
@@ -3285,8 +4124,8 @@ class ShareMapUrlComponent {
3285
4124
  this.messageService.success('igo.context.shareMap.dialog.copyMsg', 'igo.context.shareMap.dialog.copyTitle');
3286
4125
  }
3287
4126
  }
3288
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapUrlComponent, deps: [{ token: i1$3.Clipboard }, { token: i3.MessageService }, { token: ShareMapService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
3289
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ShareMapUrlComponent, isStandalone: true, selector: "igo-share-map-url", inputs: { map: "map" }, ngImport: i0, template: "<div class=\"igo-input-container linkToShare\">\n <mat-form-field>\n <textarea\n #textArea\n matInput\n readonly\n rows=\"3\"\n [placeholder]=\"'igo.context.shareMap.placeholderLink' | translate\"\n [value]=\"url\"\n ></textarea>\n </mat-form-field>\n\n <div class=\"igo-form-button-group\">\n <button mat-raised-button (click)=\"copyTextToClipboard(textArea)\">\n <mat-icon>content_copy</mat-icon>\n {{ 'igo.context.shareMap.copy' | translate }}\n </button>\n </div>\n <div>\n <br />\n <section class=\"mat-typography\">\n <div\n *ngIf=\"('igo.context.shareMap.htmlClarifications' | translate) === ''\"\n >\n <h4 *ngIf=\"('igo.context.shareMap.included' | translate) !== ''\">\n {{ 'igo.context.shareMap.included' | translate }}\n </h4>\n <ul>\n <li *ngIf=\"('igo.context.shareMap.context' | translate) !== ''\">\n {{ 'igo.context.shareMap.context' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.center' | translate) !== ''\">\n {{ 'igo.context.shareMap.center' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.zoom' | translate) !== ''\">\n {{ 'igo.context.shareMap.zoom' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.addedLayers' | translate) !== ''\">\n {{ 'igo.context.shareMap.addedLayers' | translate }}\n </li>\n <li\n *ngIf=\"('igo.context.shareMap.visibleInvisible' | translate) !== ''\"\n >\n {{ 'igo.context.shareMap.visibleInvisible' | translate }}\n </li>\n </ul>\n\n <h4 *ngIf=\"('igo.context.shareMap.excluded' | translate) !== ''\">\n {{ 'igo.context.shareMap.excluded' | translate }}\n </h4>\n <ul>\n <li *ngIf=\"('igo.context.shareMap.order' | translate) !== ''\">\n {{ 'igo.context.shareMap.order' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.opacity' | translate) !== ''\">\n {{ 'igo.context.shareMap.opacity' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.filterOgc' | translate) !== ''\">\n {{ 'igo.context.shareMap.filterOgc' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.filterTime' | translate) !== ''\">\n {{ 'igo.context.shareMap.filterTime' | translate }}\n </li>\n </ul>\n </div>\n <igo-custom-html\n class=\"shareCustomPadding\"\n *ngIf=\"('igo.context.shareMap.htmlClarifications' | translate) !== ''\"\n class=\"mat-typography\"\n [html]=\"'igo.context.shareMap.htmlClarifications' | translate\"\n >\n </igo-custom-html>\n </section>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";mat-form-field{width:100%}.linkToShare\\a0 {padding:25px 5px 5px}.linkToShare\\a0 textarea{resize:none;width:100%;line-height:1.3;height:40px;overflow-y:hidden;word-wrap:normal;word-break:break-all}.linkToShare\\a0 textarea.textAreaWithButton{width:calc(100% - 60px)}.linkToShare\\a0 mat-form-field>button{float:right;margin:-10px 0}.igo-form-button-group{text-align:center;padding-top:10px}igo-custom-html.shareCustomPadding{padding:0}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CustomHtmlComponent, selector: "igo-custom-html", inputs: ["html"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
4127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapUrlComponent, deps: [{ token: i1$4.Clipboard }, { token: i3.MessageService }, { token: ShareMapService }, { token: ContextService }, { token: i0.ChangeDetectorRef }, { token: i1.RouteService }], target: i0.ɵɵFactoryTarget.Component });
4128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ShareMapUrlComponent, isStandalone: true, selector: "igo-share-map-url", inputs: { map: "map" }, ngImport: i0, template: "<div class=\"igo-input-container linkToShare\">\n <mat-form-field>\n <textarea\n #textArea\n matInput\n readonly\n rows=\"3\"\n [placeholder]=\"'igo.context.shareMap.placeholderLink' | translate\"\n [value]=\"url\"\n ></textarea>\n </mat-form-field>\n\n <div class=\"igo-form-button-group\">\n <button mat-raised-button (click)=\"copyTextToClipboard(textArea)\">\n <mat-icon>content_copy</mat-icon>\n {{ 'igo.context.shareMap.copy' | translate }}\n </button>\n </div>\n <div>\n <br />\n <section class=\"mat-typography\">\n <div\n *ngIf=\"('igo.context.shareMap.htmlClarifications' | translate) === ''\"\n >\n <h4 *ngIf=\"('igo.context.shareMap.included' | translate) !== ''\">\n {{ 'igo.context.shareMap.included' | translate }}\n </h4>\n <ul>\n <li *ngIf=\"('igo.context.shareMap.context' | translate) !== ''\">\n {{ 'igo.context.shareMap.context' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.center' | translate) !== ''\">\n {{ 'igo.context.shareMap.center' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.zoom' | translate) !== ''\">\n {{ 'igo.context.shareMap.zoom' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.addedLayers' | translate) !== ''\">\n {{ 'igo.context.shareMap.addedLayers' | translate }}\n </li>\n <li\n *ngIf=\"('igo.context.shareMap.visibleInvisible' | translate) !== ''\"\n >\n {{ 'igo.context.shareMap.visibleInvisible' | translate }}\n </li>\n </ul>\n\n <h4 *ngIf=\"('igo.context.shareMap.excluded' | translate) !== ''\">\n {{ 'igo.context.shareMap.excluded' | translate }}\n </h4>\n <ul>\n <li *ngIf=\"('igo.context.shareMap.order' | translate) !== ''\">\n {{ 'igo.context.shareMap.order' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.opacity' | translate) !== ''\">\n {{ 'igo.context.shareMap.opacity' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.filterOgc' | translate) !== ''\">\n {{ 'igo.context.shareMap.filterOgc' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.filterTime' | translate) !== ''\">\n {{ 'igo.context.shareMap.filterTime' | translate }}\n </li>\n </ul>\n </div>\n <igo-custom-html\n class=\"shareCustomPadding\"\n *ngIf=\"('igo.context.shareMap.htmlClarifications' | translate) !== ''\"\n class=\"mat-typography\"\n [html]=\"'igo.context.shareMap.htmlClarifications' | translate\"\n >\n </igo-custom-html>\n </section>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";mat-form-field{width:100%}.linkToShare\\a0 {padding:25px 5px 5px}.linkToShare\\a0 textarea{resize:none;width:100%;line-height:1.3;height:40px;overflow-y:hidden;word-wrap:normal;word-break:break-all}.linkToShare\\a0 textarea.textAreaWithButton{width:calc(100% - 60px)}.linkToShare\\a0 mat-form-field>button{float:right;margin:-10px 0}.igo-form-button-group{text-align:center;padding-top:10px}igo-custom-html.shareCustomPadding{padding:0}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CustomHtmlComponent, selector: "igo-custom-html", inputs: ["html"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3290
4129
  }
3291
4130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapUrlComponent, decorators: [{
3292
4131
  type: Component,
@@ -3299,7 +4138,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
3299
4138
  CustomHtmlComponent,
3300
4139
  IgoLanguageModule
3301
4140
  ], template: "<div class=\"igo-input-container linkToShare\">\n <mat-form-field>\n <textarea\n #textArea\n matInput\n readonly\n rows=\"3\"\n [placeholder]=\"'igo.context.shareMap.placeholderLink' | translate\"\n [value]=\"url\"\n ></textarea>\n </mat-form-field>\n\n <div class=\"igo-form-button-group\">\n <button mat-raised-button (click)=\"copyTextToClipboard(textArea)\">\n <mat-icon>content_copy</mat-icon>\n {{ 'igo.context.shareMap.copy' | translate }}\n </button>\n </div>\n <div>\n <br />\n <section class=\"mat-typography\">\n <div\n *ngIf=\"('igo.context.shareMap.htmlClarifications' | translate) === ''\"\n >\n <h4 *ngIf=\"('igo.context.shareMap.included' | translate) !== ''\">\n {{ 'igo.context.shareMap.included' | translate }}\n </h4>\n <ul>\n <li *ngIf=\"('igo.context.shareMap.context' | translate) !== ''\">\n {{ 'igo.context.shareMap.context' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.center' | translate) !== ''\">\n {{ 'igo.context.shareMap.center' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.zoom' | translate) !== ''\">\n {{ 'igo.context.shareMap.zoom' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.addedLayers' | translate) !== ''\">\n {{ 'igo.context.shareMap.addedLayers' | translate }}\n </li>\n <li\n *ngIf=\"('igo.context.shareMap.visibleInvisible' | translate) !== ''\"\n >\n {{ 'igo.context.shareMap.visibleInvisible' | translate }}\n </li>\n </ul>\n\n <h4 *ngIf=\"('igo.context.shareMap.excluded' | translate) !== ''\">\n {{ 'igo.context.shareMap.excluded' | translate }}\n </h4>\n <ul>\n <li *ngIf=\"('igo.context.shareMap.order' | translate) !== ''\">\n {{ 'igo.context.shareMap.order' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.opacity' | translate) !== ''\">\n {{ 'igo.context.shareMap.opacity' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.filterOgc' | translate) !== ''\">\n {{ 'igo.context.shareMap.filterOgc' | translate }}\n </li>\n <li *ngIf=\"('igo.context.shareMap.filterTime' | translate) !== ''\">\n {{ 'igo.context.shareMap.filterTime' | translate }}\n </li>\n </ul>\n </div>\n <igo-custom-html\n class=\"shareCustomPadding\"\n *ngIf=\"('igo.context.shareMap.htmlClarifications' | translate) !== ''\"\n class=\"mat-typography\"\n [html]=\"'igo.context.shareMap.htmlClarifications' | translate\"\n >\n </igo-custom-html>\n </section>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";mat-form-field{width:100%}.linkToShare\\a0 {padding:25px 5px 5px}.linkToShare\\a0 textarea{resize:none;width:100%;line-height:1.3;height:40px;overflow-y:hidden;word-wrap:normal;word-break:break-all}.linkToShare\\a0 textarea.textAreaWithButton{width:calc(100% - 60px)}.linkToShare\\a0 mat-form-field>button{float:right;margin:-10px 0}.igo-form-button-group{text-align:center;padding-top:10px}igo-custom-html.shareCustomPadding{padding:0}\n"] }]
3302
- }], ctorParameters: () => [{ type: i1$3.Clipboard }, { type: i3.MessageService }, { type: ShareMapService }, { type: i0.ChangeDetectorRef }], propDecorators: { map: [{
4141
+ }], ctorParameters: () => [{ type: i1$4.Clipboard }, { type: i3.MessageService }, { type: ShareMapService }, { type: ContextService }, { type: i0.ChangeDetectorRef }, { type: i1.RouteService }], propDecorators: { map: [{
3303
4142
  type: Input
3304
4143
  }] } });
3305
4144
 
@@ -3311,7 +4150,7 @@ class ShareMapComponent {
3311
4150
  this.config = config;
3312
4151
  this.hasApi = this.config.getConfig('context.url') ? true : false;
3313
4152
  }
3314
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapComponent, deps: [{ token: i1$1.ConfigService }], target: i0.ɵɵFactoryTarget.Component });
4153
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapComponent, deps: [{ token: i1$2.ConfigService }], target: i0.ɵɵFactoryTarget.Component });
3315
4154
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: ShareMapComponent, isStandalone: true, selector: "igo-share-map", inputs: { map: "map" }, ngImport: i0, template: "<mat-tab-group *ngIf=\"hasApi\">\n <mat-tab [label]=\"'igo.context.shareMap.shareWithApi' | translate\">\n <igo-share-map-api [map]=\"map\"></igo-share-map-api>\n </mat-tab>\n <mat-tab [label]=\"'igo.context.shareMap.shareWithUrl' | translate\">\n <igo-share-map-url [map]=\"map\"></igo-share-map-url>\n </mat-tab>\n</mat-tab-group>\n\n<igo-share-map-url *ngIf=\"!hasApi\" [map]=\"map\"></igo-share-map-url>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2$1.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: ShareMapApiComponent, selector: "igo-share-map-api", inputs: ["map"] }, { kind: "component", type: ShareMapUrlComponent, selector: "igo-share-map-url", inputs: ["map"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3316
4155
  }
3317
4156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ShareMapComponent, decorators: [{
@@ -3323,7 +4162,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
3323
4162
  ShareMapUrlComponent,
3324
4163
  IgoLanguageModule
3325
4164
  ], template: "<mat-tab-group *ngIf=\"hasApi\">\n <mat-tab [label]=\"'igo.context.shareMap.shareWithApi' | translate\">\n <igo-share-map-api [map]=\"map\"></igo-share-map-api>\n </mat-tab>\n <mat-tab [label]=\"'igo.context.shareMap.shareWithUrl' | translate\">\n <igo-share-map-url [map]=\"map\"></igo-share-map-url>\n </mat-tab>\n</mat-tab-group>\n\n<igo-share-map-url *ngIf=\"!hasApi\" [map]=\"map\"></igo-share-map-url>\n" }]
3326
- }], ctorParameters: () => [{ type: i1$1.ConfigService }], propDecorators: { map: [{
4165
+ }], ctorParameters: () => [{ type: i1$2.ConfigService }], propDecorators: { map: [{
3327
4166
  type: Input
3328
4167
  }] } });
3329
4168
 
@@ -3425,8 +4264,8 @@ class SidenavComponent {
3425
4264
  this.topPanelState = 'initial';
3426
4265
  }
3427
4266
  }
3428
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SidenavComponent, deps: [{ token: i1$5.Title }], target: i0.ɵɵFactoryTarget.Component });
3429
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: SidenavComponent, isStandalone: true, selector: "igo-sidenav", inputs: { map: "map", opened: "opened", feature: "feature", tool: "tool", media: "media", title: "title" }, ngImport: i0, template: "<mat-sidenav #sidenav igoSidenavShim mode=\"side\" [opened]=\"opened\">\n <div class=\"igo-sidenav-content\">\n <igo-flexible\n #topPanel\n initial=\"50%\"\n initialMobile=\"100%\"\n expanded=\"calc(100% - 58px)\"\n [state]=\"topPanelState\"\n >\n <div class=\"igo-content\">\n <igo-panel [title]=\"tool ? (tool.title | translate) : title\">\n <button\n mat-icon-button\n panelLeftButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.goBack' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.mainMenu' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n </igo-panel>\n </div>\n\n <div igoFlexibleFill class=\"igo-content\">\n <igo-panel [title]=\"featureTitle\" *ngIf=\"feature && media !== 'mobile'\">\n <button\n mat-icon-button\n panelLeftButton\n class=\"igo-icon-button\"\n (click)=\"toggleTopPanel()\"\n >\n <mat-icon>{{\n ['collapsed', 'initial'].indexOf(topPanel.state) >= 0\n ? 'arrow_downward'\n : 'arrow_upward'\n }}</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n class=\"igo-icon-button\"\n (click)=\"zoomToFeatureExtent()\"\n *ngIf=\"feature.geometry\"\n >\n <mat-icon>zoom_in</mat-icon>\n </button>\n\n <igo-feature-details\n [feature]=\"feature\"\n *ngIf=\"['collapsed', 'initial'].indexOf(topPanel.state) >= 0\"\n >\n </igo-feature-details>\n </igo-panel>\n </div>\n </igo-flexible>\n </div>\n</mat-sidenav>\n", styles: [":host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}:host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{border-top-width:1px;border-top-style:solid;border-top-color:#0003}mat-sidenav{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd}:host{background-color:#fff}:host ::ng-deep mat-sidenav{z-index:3!important}mat-sidenav{width:400px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){mat-sidenav{width:calc(100% - 45px)}}.igo-sidenav-content{margin-top:50px;height:calc(100% - 50px)}igo-feature-details ::ng-deep table{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i2$2.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: FlexibleComponent, selector: "igo-flexible", inputs: ["initial", "collapsed", "expanded", "initialMobile", "collapsedMobile", "expandedMobile", "direction", "state"] }, { kind: "component", type: PanelComponent, selector: "igo-panel", inputs: ["title", "withHeader", "cursorPointer"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: FeatureDetailsComponent, selector: "igo-feature-details", inputs: ["source", "map", "toolbox", "feature"], outputs: ["routeEvent", "selectFeature", "htmlDisplayEvent"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
4267
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SidenavComponent, deps: [{ token: i1$6.Title }], target: i0.ɵɵFactoryTarget.Component });
4268
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: SidenavComponent, isStandalone: true, selector: "igo-sidenav", inputs: { map: "map", opened: "opened", feature: "feature", tool: "tool", media: "media", title: "title" }, ngImport: i0, template: "<mat-sidenav #sidenav igoSidenavShim mode=\"side\" [opened]=\"opened\">\n <div class=\"igo-sidenav-content\">\n <igo-flexible\n #topPanel\n initial=\"50%\"\n initialMobile=\"100%\"\n expanded=\"calc(100% - 58px)\"\n [state]=\"topPanelState\"\n >\n <div class=\"igo-content\">\n <igo-panel [title]=\"tool ? (tool.title | translate) : title\">\n <button\n mat-icon-button\n panelLeftButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.goBack' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.mainMenu' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n </igo-panel>\n </div>\n\n <div igoFlexibleFill class=\"igo-content\">\n <igo-panel [title]=\"featureTitle\" *ngIf=\"feature && media !== 'mobile'\">\n <button\n mat-icon-button\n panelLeftButton\n class=\"igo-icon-button\"\n (click)=\"toggleTopPanel()\"\n >\n <mat-icon>{{\n ['collapsed', 'initial'].indexOf(topPanel.state) >= 0\n ? 'arrow_downward'\n : 'arrow_upward'\n }}</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n class=\"igo-icon-button\"\n (click)=\"zoomToFeatureExtent()\"\n *ngIf=\"feature.geometry\"\n >\n <mat-icon>zoom_in</mat-icon>\n </button>\n\n <igo-feature-details\n [feature]=\"feature\"\n *ngIf=\"['collapsed', 'initial'].indexOf(topPanel.state) >= 0\"\n >\n </igo-feature-details>\n </igo-panel>\n </div>\n </igo-flexible>\n </div>\n</mat-sidenav>\n", styles: [":host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}:host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{border-top-width:1px;border-top-style:solid;border-top-color:#0003}mat-sidenav{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd}:host{background-color:#fff}:host ::ng-deep mat-sidenav{z-index:3!important}mat-sidenav{width:400px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){mat-sidenav{width:calc(100% - 45px)}}.igo-sidenav-content{margin-top:50px;height:calc(100% - 50px)}igo-feature-details ::ng-deep table{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i2$2.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: FlexibleComponent, selector: "igo-flexible", inputs: ["initial", "collapsed", "expanded", "initialMobile", "collapsedMobile", "expandedMobile", "direction", "state"] }, { kind: "component", type: PanelComponent, selector: "igo-panel", inputs: ["title", "withHeader", "cursorPointer"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: FeatureDetailsComponent, selector: "igo-feature-details", inputs: ["source", "map", "toolbox", "feature"], outputs: ["routeEvent", "selectFeature", "htmlDisplayEvent"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i7$2.TranslatePipe, name: "translate" }] });
3430
4269
  }
3431
4270
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SidenavComponent, decorators: [{
3432
4271
  type: Component,
@@ -3441,7 +4280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
3441
4280
  FeatureDetailsComponent,
3442
4281
  IgoLanguageModule
3443
4282
  ], template: "<mat-sidenav #sidenav igoSidenavShim mode=\"side\" [opened]=\"opened\">\n <div class=\"igo-sidenav-content\">\n <igo-flexible\n #topPanel\n initial=\"50%\"\n initialMobile=\"100%\"\n expanded=\"calc(100% - 58px)\"\n [state]=\"topPanelState\"\n >\n <div class=\"igo-content\">\n <igo-panel [title]=\"tool ? (tool.title | translate) : title\">\n <button\n mat-icon-button\n panelLeftButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.goBack' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.mainMenu' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n </igo-panel>\n </div>\n\n <div igoFlexibleFill class=\"igo-content\">\n <igo-panel [title]=\"featureTitle\" *ngIf=\"feature && media !== 'mobile'\">\n <button\n mat-icon-button\n panelLeftButton\n class=\"igo-icon-button\"\n (click)=\"toggleTopPanel()\"\n >\n <mat-icon>{{\n ['collapsed', 'initial'].indexOf(topPanel.state) >= 0\n ? 'arrow_downward'\n : 'arrow_upward'\n }}</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n class=\"igo-icon-button\"\n (click)=\"zoomToFeatureExtent()\"\n *ngIf=\"feature.geometry\"\n >\n <mat-icon>zoom_in</mat-icon>\n </button>\n\n <igo-feature-details\n [feature]=\"feature\"\n *ngIf=\"['collapsed', 'initial'].indexOf(topPanel.state) >= 0\"\n >\n </igo-feature-details>\n </igo-panel>\n </div>\n </igo-flexible>\n </div>\n</mat-sidenav>\n", styles: [":host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}:host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{border-top-width:1px;border-top-style:solid;border-top-color:#0003}mat-sidenav{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd}:host{background-color:#fff}:host ::ng-deep mat-sidenav{z-index:3!important}mat-sidenav{width:400px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){mat-sidenav{width:calc(100% - 45px)}}.igo-sidenav-content{margin-top:50px;height:calc(100% - 50px)}igo-feature-details ::ng-deep table{width:100%}\n"] }]
3444
- }], ctorParameters: () => [{ type: i1$5.Title }], propDecorators: { map: [{
4283
+ }], ctorParameters: () => [{ type: i1$6.Title }], propDecorators: { map: [{
3445
4284
  type: Input
3446
4285
  }], opened: [{
3447
4286
  type: Input
@@ -3511,19 +4350,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
3511
4350
  }]
3512
4351
  }] });
3513
4352
 
3514
- const CONTEXT_MANAGER_DIRECTIVES = [
3515
- ContextListComponent,
3516
- ContextListBindingDirective,
3517
- ContextItemComponent,
3518
- ContextFormComponent,
3519
- ContextEditComponent,
3520
- ContextEditBindingDirective,
3521
- ContextPermissionsComponent,
3522
- ContextPermissionsBindingDirective,
3523
- MapContextDirective,
3524
- LayerContextDirective
3525
- ];
3526
-
3527
4353
  const CONTEXT_MAP_BUTTON_DIRECTIVES = [
3528
4354
  BookmarkButtonComponent,
3529
4355
  BookmarkDialogComponent,
@@ -3539,5 +4365,5 @@ const CONTEXT_MAP_BUTTON_DIRECTIVES = [
3539
4365
  * Generated bundle index. Do not edit.
3540
4366
  */
3541
4367
 
3542
- export { BookmarkButtonComponent, BookmarkDialogComponent, CONTEXT_MANAGER_DIRECTIVES, CONTEXT_MAP_BUTTON_DIRECTIVES, ContextEditBindingDirective, ContextEditComponent, ContextExportService, ContextFormComponent, ContextImportExportComponent, ContextImportService, ContextItemComponent, ContextListBindingDirective, ContextListComponent, ContextPermissionsBindingDirective, ContextPermissionsComponent, ContextService, ExportError, ExportInvalidFileError, ExportNothingToExportError, IgoContextImportExportModule, IgoContextManagerModule, IgoContextMapButtonModule, IgoContextModule, IgoShareMapModule, IgoSidenavModule, ImportError, ImportInvalidFileError, ImportNothingToImportError, ImportSRSError, ImportSizeError, ImportUnreadableFileError, LayerContextDirective, MapContextDirective, PoiButtonComponent, PoiDialogComponent, PoiService, SHARE_MAP_DIRECTIVES, Scope, ShareMapApiComponent, ShareMapComponent, ShareMapService, ShareMapUrlComponent, SidenavComponent, TypePermission, UserButtonComponent, UserDialogComponent, addContextToContextList, addImportedFeaturesStyledToMap, addImportedFeaturesToMap, computeLayerTitleFromFile, getFileExtension, handleFileExportError, handleFileExportSuccess, handleFileImportError, handleFileImportSuccess, handleInvalidFileImportError, handleNothingToExportError, handleNothingToImportError, handleSizeFileImportError, handleUnreadbleFileImportError };
4368
+ export { BookmarkButtonComponent, BookmarkDialogComponent, CONTEXT_MANAGER_DIRECTIVES, CONTEXT_MAP_BUTTON_DIRECTIVES, ContextEditBindingDirective, ContextEditComponent, ContextExportService, ContextFormComponent, ContextImportExportComponent, ContextImportService, ContextItemComponent, ContextListBindingDirective, ContextListComponent, ContextPermissionsBindingDirective, ContextPermissionsComponent, ContextService, ExportError, ExportInvalidFileError, ExportNothingToExportError, GroupParamsKeys, IgoContextImportExportModule, IgoContextManagerModule, IgoContextMapButtonModule, IgoContextModule, IgoShareMapModule, IgoSidenavModule, ImportError, ImportInvalidFileError, ImportNothingToImportError, ImportSRSError, ImportSizeError, ImportUnreadableFileError, LayerContextDirective, LayerParamsKeys, MapContextDirective, PoiButtonComponent, PoiDialogComponent, PoiService, SHARE_MAP_DIRECTIVES, SHARE_MAP_KEYS_DEFAULT_OPTIONS, Scope, ServiceType, ServiceTypeEnum, ShareMapApiComponent, ShareMapComponent, ShareMapLegacyParser, ShareMapService, ShareMapUrlComponent, SidenavComponent, TypePermission, UserButtonComponent, UserDialogComponent, addContextToContextList, addImportedFeaturesStyledToMap, addImportedFeaturesToMap, buildDataSourceOptions, computeLayerTitleFromFile, getFileExtension, getFlattenOptions, getParamValue, handleFileExportError, handleFileExportSuccess, handleFileImportError, handleFileImportSuccess, handleInvalidFileImportError, handleNothingToExportError, handleNothingToImportError, handleSizeFileImportError, handleUnreadbleFileImportError, hasLegacyParams, hasModernShareParams };
3543
4369
  //# sourceMappingURL=igo2-context.mjs.map