@neo-maps/leaflet-layer-panel 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +19 -0
- package/src/index.d.ts +7 -0
- package/src/index.js +8 -0
- package/src/index.js.map +1 -0
- package/src/lib/events.d.ts +6 -0
- package/src/lib/events.js +13 -0
- package/src/lib/events.js.map +1 -0
- package/src/lib/layer-loader.d.ts +12 -0
- package/src/lib/layer-loader.js +43 -0
- package/src/lib/layer-loader.js.map +1 -0
- package/src/lib/layer-manager.d.ts +4 -0
- package/src/lib/layer-manager.js +52 -0
- package/src/lib/layer-manager.js.map +1 -0
- package/src/lib/layer-panel-core.d.ts +38 -0
- package/src/lib/layer-panel-core.js +240 -0
- package/src/lib/layer-panel-core.js.map +1 -0
- package/src/lib/map-engine.d.ts +16 -0
- package/src/lib/map-engine.js +28 -0
- package/src/lib/map-engine.js.map +1 -0
- package/src/lib/models.d.ts +168 -0
- package/src/lib/models.js +2 -0
- package/src/lib/models.js.map +1 -0
- package/src/lib/store.d.ts +10 -0
- package/src/lib/store.js +23 -0
- package/src/lib/store.js.map +1 -0
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@neo-maps/leaflet-layer-panel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./index.d.ts",
|
|
13
|
+
"import": "./index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"types": "./src/index.d.ts",
|
|
17
|
+
"module": "./src/index.js",
|
|
18
|
+
"main": "./src/index.js"
|
|
19
|
+
}
|
package/src/index.d.ts
ADDED
package/src/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './lib/events';
|
|
2
|
+
export * from './lib/layer-loader';
|
|
3
|
+
export * from './lib/layer-manager';
|
|
4
|
+
export * from './lib/layer-panel-core';
|
|
5
|
+
export * from './lib/map-engine';
|
|
6
|
+
export * from './lib/models';
|
|
7
|
+
export * from './lib/store';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LayerPanelEvent, LayerPanelState, Listener, UnsubscribeFn } from './models';
|
|
2
|
+
export declare class LayerPanelEventBus {
|
|
3
|
+
private readonly listeners;
|
|
4
|
+
emit(event: LayerPanelEvent, state: LayerPanelState): void;
|
|
5
|
+
subscribe(listener: Listener): UnsubscribeFn;
|
|
6
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class LayerPanelEventBus {
|
|
2
|
+
listeners = new Set();
|
|
3
|
+
emit(event, state) {
|
|
4
|
+
for (const listener of this.listeners) {
|
|
5
|
+
listener(event, state);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
subscribe(listener) {
|
|
9
|
+
this.listeners.add(listener);
|
|
10
|
+
return () => this.listeners.delete(listener);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/events.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IACZ,SAAS,GAAG,IAAI,GAAG,EAAY,CAAC;IAEjD,IAAI,CAAC,KAAsB,EAAE,KAAsB;QACjD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LayerItem, LayerLoaderResult, LayerLoaderStrategy } from './models';
|
|
2
|
+
export declare class GeoJsonLayerLoader implements LayerLoaderStrategy {
|
|
3
|
+
canLoad(layer: LayerItem): boolean;
|
|
4
|
+
load(layer: LayerItem, signal?: AbortSignal): Promise<LayerLoaderResult>;
|
|
5
|
+
}
|
|
6
|
+
export declare class LayerLoader {
|
|
7
|
+
private readonly cacheEnabled;
|
|
8
|
+
private readonly cache;
|
|
9
|
+
private readonly strategies;
|
|
10
|
+
constructor(strategies?: readonly LayerLoaderStrategy[] | undefined, cacheEnabled?: boolean);
|
|
11
|
+
load(layer: LayerItem, signal?: AbortSignal): Promise<LayerLoaderResult>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export class GeoJsonLayerLoader {
|
|
2
|
+
canLoad(layer) {
|
|
3
|
+
return layer.type === 'geojson' && typeof layer.url === 'string' && layer.url.length > 0;
|
|
4
|
+
}
|
|
5
|
+
async load(layer, signal) {
|
|
6
|
+
if (!layer.url) {
|
|
7
|
+
throw new Error(`Layer "${layer.id}" does not define a URL.`);
|
|
8
|
+
}
|
|
9
|
+
const response = await fetch(layer.url, {
|
|
10
|
+
signal,
|
|
11
|
+
headers: { Accept: 'application/geo+json, application/json' }
|
|
12
|
+
});
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
throw new Error(`Failed to load layer "${layer.id}": ${response.status}`);
|
|
15
|
+
}
|
|
16
|
+
return { layer: (await response.json()) };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class LayerLoader {
|
|
20
|
+
cacheEnabled;
|
|
21
|
+
cache = new Map();
|
|
22
|
+
strategies;
|
|
23
|
+
constructor(strategies = undefined, cacheEnabled = true) {
|
|
24
|
+
this.cacheEnabled = cacheEnabled;
|
|
25
|
+
this.strategies = strategies ?? [new GeoJsonLayerLoader()];
|
|
26
|
+
}
|
|
27
|
+
async load(layer, signal) {
|
|
28
|
+
const cached = this.cache.get(layer.id);
|
|
29
|
+
if (cached && this.cacheEnabled) {
|
|
30
|
+
return cached;
|
|
31
|
+
}
|
|
32
|
+
const strategy = this.strategies.find((candidate) => candidate.canLoad(layer));
|
|
33
|
+
if (!strategy) {
|
|
34
|
+
return { layer: layer.layer };
|
|
35
|
+
}
|
|
36
|
+
const result = await strategy.load(layer, signal);
|
|
37
|
+
if (this.cacheEnabled) {
|
|
38
|
+
this.cache.set(layer.id, result);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=layer-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-loader.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/layer-loader.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAC,KAAgB;QACtB,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAgB,EAAE,MAAoB;QAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,0BAA0B,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACtC,MAAM;YACN,OAAO,EAAE,EAAE,MAAM,EAAE,wCAAwC,EAAE;SAC9D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,EAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,EAAE,CAAC;IACvD,CAAC;CACF;AAED,MAAM,OAAO,WAAW;IAMH;IALF,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC7C,UAAU,CAAiC;IAE5D,YACE,aAAyD,SAAS,EACjD,eAAe,IAAI;QAAnB,iBAAY,GAAZ,YAAY,CAAO;QAEpC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAgB,EAAE,MAAoB;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LayerGroup, LayerItem, LayerPanelState, LayerRecord } from './models';
|
|
2
|
+
export declare function createInitialState(groups: readonly LayerGroup[]): LayerPanelState;
|
|
3
|
+
export declare function normalizeLayer(layer: LayerItem): LayerRecord;
|
|
4
|
+
export declare function clampOpacity(value: number): number;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function createInitialState(groups) {
|
|
2
|
+
const layers = {};
|
|
3
|
+
const layerOrder = [];
|
|
4
|
+
const expandedGroups = {};
|
|
5
|
+
let activeBaseLayerId;
|
|
6
|
+
const visit = (group) => {
|
|
7
|
+
expandedGroups[group.id] = group.expanded ?? false;
|
|
8
|
+
for (const layer of group.layers) {
|
|
9
|
+
const record = normalizeLayer(layer);
|
|
10
|
+
if (record.kind === 'base' && record.visible) {
|
|
11
|
+
if (activeBaseLayerId) {
|
|
12
|
+
layers[record.id] = { ...record, visible: false };
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
activeBaseLayerId = record.id;
|
|
16
|
+
layers[record.id] = record;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
layers[record.id] = record;
|
|
21
|
+
}
|
|
22
|
+
if (record.kind !== 'base') {
|
|
23
|
+
layerOrder.push(record.id);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
for (const child of group.children ?? []) {
|
|
27
|
+
visit(child);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
for (const group of groups) {
|
|
31
|
+
visit(group);
|
|
32
|
+
}
|
|
33
|
+
return { layers, groups, expandedGroups, activeBaseLayerId, layerOrder, search: '', errors: {} };
|
|
34
|
+
}
|
|
35
|
+
export function normalizeLayer(layer) {
|
|
36
|
+
return {
|
|
37
|
+
...layer,
|
|
38
|
+
kind: layer.kind ?? 'overlay',
|
|
39
|
+
visible: layer.visible ?? false,
|
|
40
|
+
opacity: clampOpacity(layer.opacity ?? 1),
|
|
41
|
+
loading: false,
|
|
42
|
+
loaded: Boolean(layer.layer),
|
|
43
|
+
resolvedLayer: layer.layer
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function clampOpacity(value) {
|
|
47
|
+
if (!Number.isFinite(value)) {
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
return Math.min(1, Math.max(0, value));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=layer-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-manager.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/layer-manager.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,MAA6B;IAC9D,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,cAAc,GAA4B,EAAE,CAAC;IACnD,IAAI,iBAAqC,CAAC;IAE1C,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAQ,EAAE;QACxC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC7C,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;gBAC7B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;YAC7B,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACzC,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAgB;IAC7C,OAAO;QACL,GAAG,KAAK;QACR,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK;QAC/B,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACzC,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,aAAa,EAAE,KAAK,CAAC,KAAK;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { LayerLoader } from './layer-loader';
|
|
2
|
+
import { MapEngine } from './map-engine';
|
|
3
|
+
import type { LayerItem, LayerPanelConfig, LayerPanelState, Listener, UnsubscribeFn } from './models';
|
|
4
|
+
export declare class LayerPanelCore {
|
|
5
|
+
private readonly events;
|
|
6
|
+
private readonly store;
|
|
7
|
+
private readonly loader;
|
|
8
|
+
private readonly mapEngine;
|
|
9
|
+
constructor(config: LayerPanelConfig, dependencies?: {
|
|
10
|
+
readonly loader?: LayerLoader;
|
|
11
|
+
readonly mapEngine?: MapEngine;
|
|
12
|
+
});
|
|
13
|
+
getState(): LayerPanelState;
|
|
14
|
+
addLayer(layer: LayerItem): void;
|
|
15
|
+
removeLayer(id: string): void;
|
|
16
|
+
toggleLayer(id: string): void;
|
|
17
|
+
setLayerVisible(id: string, active: boolean): void;
|
|
18
|
+
setBaseLayer(id: string): void;
|
|
19
|
+
setLayerVisibilityMany(ids: readonly string[], active: boolean): void;
|
|
20
|
+
setOpacity(id: string, value: number): void;
|
|
21
|
+
reorderLayer(layerId: string, targetLayerId: string): void;
|
|
22
|
+
moveLayerUp(layerId: string): void;
|
|
23
|
+
moveLayerDown(layerId: string): void;
|
|
24
|
+
setLayerOrder(layerOrder: readonly string[]): void;
|
|
25
|
+
private moveLayerBy;
|
|
26
|
+
expandGroup(id: string): void;
|
|
27
|
+
collapseGroup(id: string): void;
|
|
28
|
+
expandGroups(ids: readonly string[]): void;
|
|
29
|
+
collapseGroups(ids: readonly string[]): void;
|
|
30
|
+
setSearch(search: string): void;
|
|
31
|
+
subscribe(listener: Listener): UnsubscribeFn;
|
|
32
|
+
subscribeState(listener: (state: LayerPanelState) => void): UnsubscribeFn;
|
|
33
|
+
private setGroupExpanded;
|
|
34
|
+
private setGroupsExpanded;
|
|
35
|
+
private loadLayer;
|
|
36
|
+
private emit;
|
|
37
|
+
private syncInitialVisibleLayers;
|
|
38
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { LayerPanelEventBus } from './events';
|
|
2
|
+
import { clampOpacity, createInitialState, normalizeLayer } from './layer-manager';
|
|
3
|
+
import { LayerLoader } from './layer-loader';
|
|
4
|
+
import { MapEngine } from './map-engine';
|
|
5
|
+
import { LayerPanelStore } from './store';
|
|
6
|
+
export class LayerPanelCore {
|
|
7
|
+
events = new LayerPanelEventBus();
|
|
8
|
+
store;
|
|
9
|
+
loader;
|
|
10
|
+
mapEngine;
|
|
11
|
+
constructor(config, dependencies = {}) {
|
|
12
|
+
this.store = new LayerPanelStore(createInitialState(config.groups));
|
|
13
|
+
this.loader = dependencies.loader ?? new LayerLoader(undefined, config.options?.cacheLoadedLayers ?? true);
|
|
14
|
+
this.mapEngine = dependencies.mapEngine ?? new MapEngine();
|
|
15
|
+
this.syncInitialVisibleLayers();
|
|
16
|
+
}
|
|
17
|
+
getState() {
|
|
18
|
+
return this.store.snapshot();
|
|
19
|
+
}
|
|
20
|
+
addLayer(layer) {
|
|
21
|
+
const record = normalizeLayer(layer);
|
|
22
|
+
const state = this.store.update((current) => ({
|
|
23
|
+
...current,
|
|
24
|
+
layers: { ...current.layers, [record.id]: record },
|
|
25
|
+
layerOrder: record.kind === 'base' ? current.layerOrder : [...current.layerOrder, record.id]
|
|
26
|
+
}));
|
|
27
|
+
this.emit({ type: 'layer:added', payload: { layer: record } }, state);
|
|
28
|
+
}
|
|
29
|
+
removeLayer(id) {
|
|
30
|
+
const existing = this.store.snapshot().layers[id];
|
|
31
|
+
if (!existing) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const state = this.store.update((current) => {
|
|
35
|
+
const { [id]: _removed, ...layers } = current.layers;
|
|
36
|
+
return { ...current, layers, layerOrder: current.layerOrder.filter((layerId) => layerId !== id) };
|
|
37
|
+
});
|
|
38
|
+
void this.mapEngine.remove(existing);
|
|
39
|
+
this.emit({ type: 'layer:removed', payload: { layerId: id } }, state);
|
|
40
|
+
}
|
|
41
|
+
toggleLayer(id) {
|
|
42
|
+
const layer = this.store.snapshot().layers[id];
|
|
43
|
+
if (!layer) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.setLayerVisible(id, !layer.visible);
|
|
47
|
+
}
|
|
48
|
+
setLayerVisible(id, active) {
|
|
49
|
+
const layer = this.store.snapshot().layers[id];
|
|
50
|
+
if (!layer || layer.visible === active) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (layer.kind === 'base' && active) {
|
|
54
|
+
this.setBaseLayer(id);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const next = { ...layer, visible: active };
|
|
58
|
+
const state = this.store.update((current) => ({
|
|
59
|
+
...current,
|
|
60
|
+
layers: { ...current.layers, [id]: next }
|
|
61
|
+
}));
|
|
62
|
+
this.emit({ type: 'layer:toggled', payload: { layerId: id, active } }, state);
|
|
63
|
+
void this.mapEngine.setVisible(next, active);
|
|
64
|
+
if (active && layer.url && !layer.loaded && !layer.loading) {
|
|
65
|
+
void this.loadLayer(id);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
setBaseLayer(id) {
|
|
69
|
+
const target = this.store.snapshot().layers[id];
|
|
70
|
+
if (!target || target.kind !== 'base') {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const previousLayers = this.store.snapshot().layers;
|
|
74
|
+
const nextLayers = Object.fromEntries(Object.entries(previousLayers).map(([layerId, layer]) => [
|
|
75
|
+
layerId,
|
|
76
|
+
layer.kind === 'base' ? { ...layer, visible: layerId === id } : layer
|
|
77
|
+
]));
|
|
78
|
+
const state = this.store.update((current) => ({
|
|
79
|
+
...current,
|
|
80
|
+
activeBaseLayerId: id,
|
|
81
|
+
layers: nextLayers
|
|
82
|
+
}));
|
|
83
|
+
for (const layer of Object.values(nextLayers)) {
|
|
84
|
+
if (layer.kind === 'base') {
|
|
85
|
+
void this.mapEngine.setVisible(layer, layer.id === id);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.emit({ type: 'base-layer:changed', payload: { layerId: id } }, state);
|
|
89
|
+
}
|
|
90
|
+
setLayerVisibilityMany(ids, active) {
|
|
91
|
+
for (const id of ids) {
|
|
92
|
+
this.setLayerVisible(id, active);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
setOpacity(id, value) {
|
|
96
|
+
const layer = this.store.snapshot().layers[id];
|
|
97
|
+
if (!layer) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const opacity = clampOpacity(value);
|
|
101
|
+
const next = { ...layer, opacity };
|
|
102
|
+
const state = this.store.update((current) => ({
|
|
103
|
+
...current,
|
|
104
|
+
layers: { ...current.layers, [id]: next }
|
|
105
|
+
}));
|
|
106
|
+
void this.mapEngine.setOpacity(next, opacity);
|
|
107
|
+
this.emit({ type: 'layer:opacity-changed', payload: { layerId: id, opacity } }, state);
|
|
108
|
+
}
|
|
109
|
+
reorderLayer(layerId, targetLayerId) {
|
|
110
|
+
if (layerId === targetLayerId) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const currentOrder = this.store.snapshot().layerOrder;
|
|
114
|
+
if (!currentOrder.includes(layerId) || !currentOrder.includes(targetLayerId)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const withoutDragged = currentOrder.filter((id) => id !== layerId);
|
|
118
|
+
const targetIndex = withoutDragged.indexOf(targetLayerId);
|
|
119
|
+
const layerOrder = [
|
|
120
|
+
...withoutDragged.slice(0, targetIndex),
|
|
121
|
+
layerId,
|
|
122
|
+
...withoutDragged.slice(targetIndex)
|
|
123
|
+
];
|
|
124
|
+
this.setLayerOrder(layerOrder);
|
|
125
|
+
}
|
|
126
|
+
moveLayerUp(layerId) {
|
|
127
|
+
this.moveLayerBy(layerId, -1);
|
|
128
|
+
}
|
|
129
|
+
moveLayerDown(layerId) {
|
|
130
|
+
this.moveLayerBy(layerId, 1);
|
|
131
|
+
}
|
|
132
|
+
setLayerOrder(layerOrder) {
|
|
133
|
+
const overlayIds = new Set(Object.values(this.store.snapshot().layers)
|
|
134
|
+
.filter((layer) => layer.kind !== 'base')
|
|
135
|
+
.map((layer) => layer.id));
|
|
136
|
+
const nextOrder = [...new Set(layerOrder)].filter((id) => overlayIds.has(id));
|
|
137
|
+
for (const id of overlayIds) {
|
|
138
|
+
if (!nextOrder.includes(id)) {
|
|
139
|
+
nextOrder.push(id);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const state = this.store.update((current) => ({ ...current, layerOrder: nextOrder }));
|
|
143
|
+
void this.mapEngine.setLayerOrder(nextOrder);
|
|
144
|
+
this.emit({ type: 'layer:order-changed', payload: { layerOrder: nextOrder } }, state);
|
|
145
|
+
}
|
|
146
|
+
moveLayerBy(layerId, direction) {
|
|
147
|
+
const currentOrder = [...this.store.snapshot().layerOrder];
|
|
148
|
+
const index = currentOrder.indexOf(layerId);
|
|
149
|
+
const nextIndex = index + direction;
|
|
150
|
+
if (index < 0 || nextIndex < 0 || nextIndex >= currentOrder.length) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
[currentOrder[index], currentOrder[nextIndex]] = [currentOrder[nextIndex], currentOrder[index]];
|
|
154
|
+
this.setLayerOrder(currentOrder);
|
|
155
|
+
}
|
|
156
|
+
expandGroup(id) {
|
|
157
|
+
this.setGroupExpanded(id, true);
|
|
158
|
+
}
|
|
159
|
+
collapseGroup(id) {
|
|
160
|
+
this.setGroupExpanded(id, false);
|
|
161
|
+
}
|
|
162
|
+
expandGroups(ids) {
|
|
163
|
+
this.setGroupsExpanded(ids, true);
|
|
164
|
+
}
|
|
165
|
+
collapseGroups(ids) {
|
|
166
|
+
this.setGroupsExpanded(ids, false);
|
|
167
|
+
}
|
|
168
|
+
setSearch(search) {
|
|
169
|
+
const state = this.store.update((current) => ({ ...current, search }));
|
|
170
|
+
this.emit({ type: 'state:changed', payload: state }, state);
|
|
171
|
+
}
|
|
172
|
+
subscribe(listener) {
|
|
173
|
+
return this.events.subscribe(listener);
|
|
174
|
+
}
|
|
175
|
+
subscribeState(listener) {
|
|
176
|
+
return this.store.subscribe(listener);
|
|
177
|
+
}
|
|
178
|
+
setGroupExpanded(groupId, expanded) {
|
|
179
|
+
const state = this.store.update((current) => ({
|
|
180
|
+
...current,
|
|
181
|
+
expandedGroups: { ...current.expandedGroups, [groupId]: expanded }
|
|
182
|
+
}));
|
|
183
|
+
this.emit({ type: 'group:expanded', payload: { groupId, expanded } }, state);
|
|
184
|
+
}
|
|
185
|
+
setGroupsExpanded(groupIds, expanded) {
|
|
186
|
+
const uniqueGroupIds = [...new Set(groupIds)];
|
|
187
|
+
if (uniqueGroupIds.length === 0) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const state = this.store.update((current) => ({
|
|
191
|
+
...current,
|
|
192
|
+
expandedGroups: uniqueGroupIds.reduce((expandedGroups, groupId) => ({ ...expandedGroups, [groupId]: expanded }), current.expandedGroups)
|
|
193
|
+
}));
|
|
194
|
+
for (const groupId of uniqueGroupIds) {
|
|
195
|
+
this.emit({ type: 'group:expanded', payload: { groupId, expanded } }, state);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async loadLayer(id) {
|
|
199
|
+
const layer = this.store.snapshot().layers[id];
|
|
200
|
+
if (!layer) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
let state = this.store.update((current) => ({
|
|
204
|
+
...current,
|
|
205
|
+
layers: { ...current.layers, [id]: { ...layer, loading: true, error: undefined } }
|
|
206
|
+
}));
|
|
207
|
+
this.emit({ type: 'layer:loading', payload: { layerId: id } }, state);
|
|
208
|
+
try {
|
|
209
|
+
const result = await this.loader.load(layer);
|
|
210
|
+
const loaded = { ...layer, loading: false, loaded: true, resolvedLayer: result.layer };
|
|
211
|
+
state = this.store.update((current) => ({
|
|
212
|
+
...current,
|
|
213
|
+
layers: { ...current.layers, [id]: loaded }
|
|
214
|
+
}));
|
|
215
|
+
await this.mapEngine.add(loaded);
|
|
216
|
+
this.emit({ type: 'layer:loaded', payload: { layerId: id, layer: result.layer } }, state);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
const message = error instanceof Error ? error.message : 'Unknown layer loading error';
|
|
220
|
+
state = this.store.update((current) => ({
|
|
221
|
+
...current,
|
|
222
|
+
errors: { ...current.errors, [id]: message },
|
|
223
|
+
layers: { ...current.layers, [id]: { ...layer, loading: false, error: message } }
|
|
224
|
+
}));
|
|
225
|
+
this.emit({ type: 'layer:failed', payload: { layerId: id, error: message } }, state);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
emit(event, state) {
|
|
229
|
+
this.events.emit(event, state);
|
|
230
|
+
}
|
|
231
|
+
syncInitialVisibleLayers() {
|
|
232
|
+
for (const layer of Object.values(this.store.snapshot().layers)) {
|
|
233
|
+
if (layer.visible) {
|
|
234
|
+
void this.mapEngine.setVisible(layer, true);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
void this.mapEngine.setLayerOrder(this.store.snapshot().layerOrder);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=layer-panel-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-panel-core.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/layer-panel-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LayerAdapter, LayerRecord } from './models';
|
|
2
|
+
export declare class NullLayerAdapter implements LayerAdapter {
|
|
3
|
+
setVisible(): void;
|
|
4
|
+
setOpacity(): void;
|
|
5
|
+
addLayer(): void;
|
|
6
|
+
removeLayer(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare class MapEngine {
|
|
9
|
+
private readonly adapter;
|
|
10
|
+
constructor(adapter?: LayerAdapter);
|
|
11
|
+
add(layer: LayerRecord): Promise<void>;
|
|
12
|
+
remove(layer: LayerRecord): Promise<void>;
|
|
13
|
+
setVisible(layer: LayerRecord, visible: boolean): Promise<void>;
|
|
14
|
+
setOpacity(layer: LayerRecord, opacity: number): Promise<void>;
|
|
15
|
+
setLayerOrder(layerOrder: readonly string[]): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class NullLayerAdapter {
|
|
2
|
+
setVisible() { }
|
|
3
|
+
setOpacity() { }
|
|
4
|
+
addLayer() { }
|
|
5
|
+
removeLayer() { }
|
|
6
|
+
}
|
|
7
|
+
export class MapEngine {
|
|
8
|
+
adapter;
|
|
9
|
+
constructor(adapter = new NullLayerAdapter()) {
|
|
10
|
+
this.adapter = adapter;
|
|
11
|
+
}
|
|
12
|
+
async add(layer) {
|
|
13
|
+
await this.adapter.addLayer(layer);
|
|
14
|
+
}
|
|
15
|
+
async remove(layer) {
|
|
16
|
+
await this.adapter.removeLayer(layer);
|
|
17
|
+
}
|
|
18
|
+
async setVisible(layer, visible) {
|
|
19
|
+
await this.adapter.setVisible(layer, visible);
|
|
20
|
+
}
|
|
21
|
+
async setOpacity(layer, opacity) {
|
|
22
|
+
await this.adapter.setOpacity(layer, opacity);
|
|
23
|
+
}
|
|
24
|
+
async setLayerOrder(layerOrder) {
|
|
25
|
+
await this.adapter.setLayerOrder?.(layerOrder);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=map-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-engine.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/map-engine.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAC3B,UAAU,KAAU,CAAC;IACrB,UAAU,KAAU,CAAC;IACrB,QAAQ,KAAU,CAAC;IACnB,WAAW,KAAU,CAAC;CACvB;AAED,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,UAAwB,IAAI,gBAAgB,EAAE;QAA9C,YAAO,GAAP,OAAO,CAAuC;IAAG,CAAC;IAE/E,KAAK,CAAC,GAAG,CAAC,KAAkB;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAkB,EAAE,OAAgB;QACnD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAkB,EAAE,OAAe;QAClD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAA6B;QAC/C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
export type LayerType = 'geojson' | 'tile' | 'wms' | 'marker';
|
|
2
|
+
export type LayerKind = 'base' | 'overlay';
|
|
3
|
+
export type LayerPanelDensity = 'comfortable' | 'compact';
|
|
4
|
+
export type LayerVisibilityControl = 'eye' | 'checkbox';
|
|
5
|
+
export type BaseLayerControl = 'select' | 'radio' | 'hidden';
|
|
6
|
+
export type LayerPanelLayout = 'sidebar' | 'floating';
|
|
7
|
+
export type LayerOrderingControl = 'buttons' | 'drag' | 'both';
|
|
8
|
+
export type LayerOrderingMode = 'inline' | 'dedicated-view';
|
|
9
|
+
export interface LayerPanelConfig {
|
|
10
|
+
readonly groups: readonly LayerGroup[];
|
|
11
|
+
readonly options?: PanelOptions;
|
|
12
|
+
readonly ui?: LayerPanelUiConfig;
|
|
13
|
+
}
|
|
14
|
+
export interface PanelOptions {
|
|
15
|
+
readonly lazyLoad?: boolean;
|
|
16
|
+
readonly cacheLoadedLayers?: boolean;
|
|
17
|
+
readonly urlSync?: boolean;
|
|
18
|
+
readonly persistState?: boolean;
|
|
19
|
+
readonly initialSearch?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface LayerPanelUiConfig {
|
|
22
|
+
readonly showSearch?: boolean;
|
|
23
|
+
readonly showOpacity?: boolean;
|
|
24
|
+
readonly showGlobalVisibilityActions?: boolean;
|
|
25
|
+
readonly showGroupExpansionAction?: boolean;
|
|
26
|
+
readonly enableOrdering?: boolean;
|
|
27
|
+
readonly orderingControl?: LayerOrderingControl;
|
|
28
|
+
readonly orderingMode?: LayerOrderingMode;
|
|
29
|
+
readonly visibilityControl?: LayerVisibilityControl;
|
|
30
|
+
readonly baseLayerControl?: BaseLayerControl;
|
|
31
|
+
readonly density?: LayerPanelDensity;
|
|
32
|
+
readonly layout?: LayerPanelLayout;
|
|
33
|
+
readonly width?: string;
|
|
34
|
+
readonly maxWidth?: string;
|
|
35
|
+
readonly height?: string;
|
|
36
|
+
readonly maxHeight?: string;
|
|
37
|
+
readonly labels?: LayerPanelLabels;
|
|
38
|
+
}
|
|
39
|
+
export interface LayerPanelLabels {
|
|
40
|
+
readonly subtitle?: string;
|
|
41
|
+
readonly searchPlaceholder?: string;
|
|
42
|
+
readonly baseLayer?: string;
|
|
43
|
+
readonly opacity?: string;
|
|
44
|
+
readonly showAll?: string;
|
|
45
|
+
readonly hideAll?: string;
|
|
46
|
+
readonly expandAll?: string;
|
|
47
|
+
readonly collapseAll?: string;
|
|
48
|
+
readonly editOrder?: string;
|
|
49
|
+
readonly finishEditOrder?: string;
|
|
50
|
+
readonly orderViewTitle?: string;
|
|
51
|
+
readonly backToLayers?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface LayerGroup {
|
|
54
|
+
readonly id: string;
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly icon?: string;
|
|
57
|
+
readonly expanded?: boolean;
|
|
58
|
+
readonly children?: readonly LayerGroup[];
|
|
59
|
+
readonly layers: readonly LayerItem[];
|
|
60
|
+
}
|
|
61
|
+
export interface LayerItem {
|
|
62
|
+
readonly id: string;
|
|
63
|
+
readonly name: string;
|
|
64
|
+
readonly type: LayerType;
|
|
65
|
+
readonly layer?: unknown;
|
|
66
|
+
readonly url?: string;
|
|
67
|
+
readonly icon?: string;
|
|
68
|
+
readonly kind?: LayerKind;
|
|
69
|
+
readonly visible?: boolean;
|
|
70
|
+
readonly opacity?: number;
|
|
71
|
+
readonly minZoom?: number;
|
|
72
|
+
readonly maxZoom?: number;
|
|
73
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
74
|
+
}
|
|
75
|
+
export interface LayerRecord extends LayerItem {
|
|
76
|
+
readonly kind: LayerKind;
|
|
77
|
+
readonly visible: boolean;
|
|
78
|
+
readonly opacity: number;
|
|
79
|
+
readonly loading: boolean;
|
|
80
|
+
readonly loaded: boolean;
|
|
81
|
+
readonly error?: string;
|
|
82
|
+
readonly resolvedLayer?: unknown;
|
|
83
|
+
}
|
|
84
|
+
export interface LayerPanelState {
|
|
85
|
+
readonly layers: Readonly<Record<string, LayerRecord>>;
|
|
86
|
+
readonly groups: readonly LayerGroup[];
|
|
87
|
+
readonly expandedGroups: Readonly<Record<string, boolean>>;
|
|
88
|
+
readonly activeBaseLayerId?: string;
|
|
89
|
+
readonly layerOrder: readonly string[];
|
|
90
|
+
readonly search: string;
|
|
91
|
+
readonly errors: Readonly<Record<string, string>>;
|
|
92
|
+
}
|
|
93
|
+
export type Listener = (event: LayerPanelEvent, state: LayerPanelState) => void;
|
|
94
|
+
export type UnsubscribeFn = () => void;
|
|
95
|
+
export type LayerPanelEvent = {
|
|
96
|
+
readonly type: 'layer:added';
|
|
97
|
+
readonly payload: {
|
|
98
|
+
readonly layer: LayerRecord;
|
|
99
|
+
};
|
|
100
|
+
} | {
|
|
101
|
+
readonly type: 'layer:removed';
|
|
102
|
+
readonly payload: {
|
|
103
|
+
readonly layerId: string;
|
|
104
|
+
};
|
|
105
|
+
} | {
|
|
106
|
+
readonly type: 'layer:toggled';
|
|
107
|
+
readonly payload: {
|
|
108
|
+
readonly layerId: string;
|
|
109
|
+
readonly active: boolean;
|
|
110
|
+
};
|
|
111
|
+
} | {
|
|
112
|
+
readonly type: 'base-layer:changed';
|
|
113
|
+
readonly payload: {
|
|
114
|
+
readonly layerId: string;
|
|
115
|
+
};
|
|
116
|
+
} | {
|
|
117
|
+
readonly type: 'layer:opacity-changed';
|
|
118
|
+
readonly payload: {
|
|
119
|
+
readonly layerId: string;
|
|
120
|
+
readonly opacity: number;
|
|
121
|
+
};
|
|
122
|
+
} | {
|
|
123
|
+
readonly type: 'layer:order-changed';
|
|
124
|
+
readonly payload: {
|
|
125
|
+
readonly layerOrder: readonly string[];
|
|
126
|
+
};
|
|
127
|
+
} | {
|
|
128
|
+
readonly type: 'layer:loading';
|
|
129
|
+
readonly payload: {
|
|
130
|
+
readonly layerId: string;
|
|
131
|
+
};
|
|
132
|
+
} | {
|
|
133
|
+
readonly type: 'layer:loaded';
|
|
134
|
+
readonly payload: {
|
|
135
|
+
readonly layerId: string;
|
|
136
|
+
layer: unknown;
|
|
137
|
+
};
|
|
138
|
+
} | {
|
|
139
|
+
readonly type: 'layer:failed';
|
|
140
|
+
readonly payload: {
|
|
141
|
+
readonly layerId: string;
|
|
142
|
+
readonly error: string;
|
|
143
|
+
};
|
|
144
|
+
} | {
|
|
145
|
+
readonly type: 'group:expanded';
|
|
146
|
+
readonly payload: {
|
|
147
|
+
readonly groupId: string;
|
|
148
|
+
readonly expanded: boolean;
|
|
149
|
+
};
|
|
150
|
+
} | {
|
|
151
|
+
readonly type: 'state:changed';
|
|
152
|
+
readonly payload: LayerPanelState;
|
|
153
|
+
};
|
|
154
|
+
export interface LayerAdapter {
|
|
155
|
+
setVisible(layer: LayerRecord, visible: boolean): void | Promise<void>;
|
|
156
|
+
setOpacity(layer: LayerRecord, opacity: number): void | Promise<void>;
|
|
157
|
+
addLayer(layer: LayerRecord): void | Promise<void>;
|
|
158
|
+
removeLayer(layer: LayerRecord): void | Promise<void>;
|
|
159
|
+
setLayerOrder?(layerOrder: readonly string[]): void | Promise<void>;
|
|
160
|
+
}
|
|
161
|
+
export interface LayerLoaderResult {
|
|
162
|
+
readonly layer: unknown;
|
|
163
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
164
|
+
}
|
|
165
|
+
export interface LayerLoaderStrategy {
|
|
166
|
+
canLoad(layer: LayerItem): boolean;
|
|
167
|
+
load(layer: LayerItem, signal?: AbortSignal): Promise<LayerLoaderResult>;
|
|
168
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/models.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LayerPanelState } from './models';
|
|
2
|
+
export type StateSubscriber = (state: LayerPanelState) => void;
|
|
3
|
+
export declare class LayerPanelStore {
|
|
4
|
+
private state;
|
|
5
|
+
private readonly subscribers;
|
|
6
|
+
constructor(initialState: LayerPanelState);
|
|
7
|
+
snapshot(): LayerPanelState;
|
|
8
|
+
update(project: (state: LayerPanelState) => LayerPanelState): LayerPanelState;
|
|
9
|
+
subscribe(subscriber: StateSubscriber): () => void;
|
|
10
|
+
}
|
package/src/lib/store.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class LayerPanelStore {
|
|
2
|
+
state;
|
|
3
|
+
subscribers = new Set();
|
|
4
|
+
constructor(initialState) {
|
|
5
|
+
this.state = initialState;
|
|
6
|
+
}
|
|
7
|
+
snapshot() {
|
|
8
|
+
return this.state;
|
|
9
|
+
}
|
|
10
|
+
update(project) {
|
|
11
|
+
this.state = project(this.state);
|
|
12
|
+
for (const subscriber of this.subscribers) {
|
|
13
|
+
subscriber(this.state);
|
|
14
|
+
}
|
|
15
|
+
return this.state;
|
|
16
|
+
}
|
|
17
|
+
subscribe(subscriber) {
|
|
18
|
+
this.subscribers.add(subscriber);
|
|
19
|
+
subscriber(this.state);
|
|
20
|
+
return () => this.subscribers.delete(subscriber);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/store.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,eAAe;IAClB,KAAK,CAAkB;IACd,WAAW,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE1D,YAAY,YAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,OAAoD;QACzD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,UAA2B;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;CACF"}
|