@smartnet360/svelte-components 0.0.101 → 0.0.103
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/dist/apps/antenna-pattern/index.d.ts +1 -0
- package/dist/apps/antenna-pattern/index.js +1 -0
- package/dist/apps/antenna-pattern/utils/load-static-antennas.d.ts +17 -0
- package/dist/apps/antenna-pattern/utils/load-static-antennas.js +83 -0
- package/dist/apps/site-check/SiteCheck.svelte +4 -6
- package/dist/core/Charts/ChartCard.svelte +122 -12
- package/dist/core/Charts/ChartCard.svelte.d.ts +2 -0
- package/dist/core/Charts/ChartComponent.svelte +8 -6
- package/dist/core/CoverageMap/ai/AITools.d.ts +117 -0
- package/dist/core/CoverageMap/ai/AITools.js +380 -0
- package/dist/core/CoverageMap/core/CoverageCalculator.d.ts +138 -0
- package/dist/core/CoverageMap/core/CoverageCalculator.js +375 -0
- package/dist/core/CoverageMap/core/GridCalculator.d.ts +115 -0
- package/dist/core/CoverageMap/core/GridCalculator.js +484 -0
- package/dist/core/CoverageMap/core/PathLossModels.d.ts +253 -0
- package/dist/core/CoverageMap/core/PathLossModels.js +380 -0
- package/dist/core/CoverageMap/core/SignalProcessor.d.ts +288 -0
- package/dist/core/CoverageMap/core/SignalProcessor.js +424 -0
- package/dist/core/CoverageMap/data/AntennaStore.d.ts +165 -0
- package/dist/core/CoverageMap/data/AntennaStore.js +327 -0
- package/dist/core/CoverageMap/data/SiteStore.d.ts +155 -0
- package/dist/core/CoverageMap/data/SiteStore.js +355 -0
- package/dist/core/CoverageMap/index.d.ts +74 -0
- package/dist/core/CoverageMap/index.js +103 -0
- package/dist/core/CoverageMap/types.d.ts +252 -0
- package/dist/core/CoverageMap/types.js +7 -0
- package/dist/core/CoverageMap/utils/geoUtils.d.ts +223 -0
- package/dist/core/CoverageMap/utils/geoUtils.js +374 -0
- package/dist/core/CoverageMap/utils/rfUtils.d.ts +329 -0
- package/dist/core/CoverageMap/utils/rfUtils.js +434 -0
- package/dist/core/CoverageMap/visualization/ColorSchemes.d.ts +149 -0
- package/dist/core/CoverageMap/visualization/ColorSchemes.js +377 -0
- package/dist/core/TreeView/index.d.ts +4 -4
- package/dist/core/TreeView/index.js +5 -5
- package/dist/core/TreeView/tree-utils.d.ts +12 -0
- package/dist/core/TreeView/tree-utils.js +115 -6
- package/dist/core/TreeView/tree.store.svelte.d.ts +94 -0
- package/dist/core/TreeView/tree.store.svelte.js +274 -0
- package/dist/map-v2/features/cells/controls/CellFilterControl.svelte +16 -27
- package/dist/map-v2/features/cells/utils/cellGeoJSON.js +1 -0
- package/dist/map-v2/features/repeaters/controls/RepeaterFilterControl.svelte +33 -42
- package/dist/map-v2/features/sites/controls/SiteFilterControl.svelte +12 -19
- package/dist/map-v3/core/components/Map.svelte +4 -0
- package/dist/map-v3/core/stores/map.store.svelte.js +2 -0
- package/dist/map-v3/demo/DemoMap.svelte +31 -5
- package/dist/map-v3/demo/demo-cells.js +51 -22
- package/dist/map-v3/features/cells/components/CellFilterControl.svelte +24 -30
- package/dist/map-v3/features/cells/layers/CellsLayer.svelte +29 -9
- package/dist/map-v3/features/cells/logic/geometry.js +3 -0
- package/dist/map-v3/features/cells/stores/cell.data.svelte.d.ts +27 -0
- package/dist/map-v3/features/cells/stores/cell.data.svelte.js +65 -0
- package/dist/map-v3/features/coverage/index.d.ts +12 -0
- package/dist/map-v3/features/coverage/index.js +16 -0
- package/dist/map-v3/features/coverage/layers/CoverageLayer.svelte +198 -0
- package/dist/map-v3/features/coverage/layers/CoverageLayer.svelte.d.ts +10 -0
- package/dist/map-v3/features/coverage/logic/coloring.d.ts +28 -0
- package/dist/map-v3/features/coverage/logic/coloring.js +77 -0
- package/dist/map-v3/features/coverage/logic/geometry.d.ts +33 -0
- package/dist/map-v3/features/coverage/logic/geometry.js +112 -0
- package/dist/map-v3/features/coverage/stores/coverage.data.svelte.d.ts +46 -0
- package/dist/map-v3/features/coverage/stores/coverage.data.svelte.js +95 -0
- package/dist/map-v3/features/coverage/stores/coverage.display.svelte.d.ts +33 -0
- package/dist/map-v3/features/coverage/stores/coverage.display.svelte.js +90 -0
- package/dist/map-v3/features/coverage/types.d.ts +52 -0
- package/dist/map-v3/features/coverage/types.js +7 -0
- package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte +14 -20
- package/dist/map-v3/features/selection/components/FeatureSelectionControl.svelte +82 -65
- package/dist/map-v3/features/selection/components/FeatureSelectionControl.svelte.d.ts +5 -9
- package/dist/map-v3/features/selection/index.d.ts +1 -2
- package/dist/map-v3/features/selection/index.js +0 -1
- package/dist/map-v3/features/selection/stores/selection.store.svelte.d.ts +44 -15
- package/dist/map-v3/features/selection/stores/selection.store.svelte.js +163 -40
- package/dist/map-v3/features/selection/types.d.ts +4 -2
- package/dist/map-v3/features/sites/components/SiteFilterControl.svelte +23 -33
- package/dist/map-v3/index.d.ts +4 -0
- package/dist/map-v3/index.js +5 -0
- package/package.json +2 -2
- package/dist/core/TreeView/tree.store.d.ts +0 -10
- package/dist/core/TreeView/tree.store.js +0 -320
- package/dist/map-v3/features/selection/layers/SelectionHighlightLayers.svelte +0 -209
- package/dist/map-v3/features/selection/layers/SelectionHighlightLayers.svelte.d.ts +0 -13
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
* Feature Selection Store - Svelte 5 Runes Implementation
|
|
3
3
|
*
|
|
4
4
|
* Manages selection of map features (cells, sites) with click detection.
|
|
5
|
+
* Supports multi-cell selection based on site/sector hierarchy.
|
|
5
6
|
*/
|
|
6
7
|
export class FeatureSelectionStore {
|
|
7
8
|
selectedFeatures = $state([]);
|
|
9
|
+
selectedCellNames = $state(new Set()); // Track all selected cell names
|
|
8
10
|
map = $state(null);
|
|
11
|
+
cellDataStore = null;
|
|
9
12
|
selectionMode = $state(false);
|
|
10
|
-
idProperty = $state('
|
|
13
|
+
idProperty = $state('site'); // 'cell', 'sector', or 'site'
|
|
11
14
|
queryLayers = $state([
|
|
12
15
|
'cells-layer',
|
|
13
16
|
'sites-layer'
|
|
@@ -22,7 +25,13 @@ export class FeatureSelectionStore {
|
|
|
22
25
|
this.setupClickHandler();
|
|
23
26
|
}
|
|
24
27
|
/**
|
|
25
|
-
* Set
|
|
28
|
+
* Set the cell data store for lookup maps
|
|
29
|
+
*/
|
|
30
|
+
setCellDataStore(dataStore) {
|
|
31
|
+
this.cellDataStore = dataStore;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Set which property to use as the ID (selection mode)
|
|
26
35
|
*/
|
|
27
36
|
setIdProperty(property) {
|
|
28
37
|
this.idProperty = property;
|
|
@@ -55,13 +64,16 @@ export class FeatureSelectionStore {
|
|
|
55
64
|
if (features && features.length > 0) {
|
|
56
65
|
// Get the topmost feature with an id
|
|
57
66
|
for (const feature of features) {
|
|
58
|
-
// Use the configured property as the ID
|
|
59
|
-
const featureId = feature.properties?.[this.idProperty] || feature.id;
|
|
60
|
-
const siteId = feature.properties?.siteId;
|
|
61
67
|
const cellName = feature.properties?.cellName;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
const siteId = feature.properties?.siteId;
|
|
69
|
+
if (cellName && this.cellDataStore) {
|
|
70
|
+
this.handleCellClick(cellName, feature.layer?.id, feature.properties || undefined);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
else if (siteId) {
|
|
74
|
+
// Fallback for site clicks (if sites layer exists)
|
|
75
|
+
this.handleSiteClick(siteId, feature.layer?.id, feature.properties || undefined);
|
|
76
|
+
break;
|
|
65
77
|
}
|
|
66
78
|
}
|
|
67
79
|
}
|
|
@@ -69,64 +81,156 @@ export class FeatureSelectionStore {
|
|
|
69
81
|
this.map.on('click', this.clickHandler);
|
|
70
82
|
}
|
|
71
83
|
/**
|
|
72
|
-
*
|
|
84
|
+
* Handle click on a cell - expand to site/sector based on mode
|
|
73
85
|
*/
|
|
74
|
-
|
|
75
|
-
this.
|
|
86
|
+
handleCellClick(cellName, layerId, properties) {
|
|
87
|
+
if (!this.cellDataStore)
|
|
88
|
+
return;
|
|
89
|
+
console.log('[Selection] Clicked cell:', cellName, 'Mode:', this.idProperty);
|
|
90
|
+
let cellNamesToSelect = [];
|
|
91
|
+
let selectionId;
|
|
92
|
+
switch (this.idProperty) {
|
|
93
|
+
case 'site': {
|
|
94
|
+
// Select all cells in the site (first 4 digits)
|
|
95
|
+
const siteId = this.cellDataStore.getSiteIdFromCellName(cellName);
|
|
96
|
+
cellNamesToSelect = this.cellDataStore.getCellsBySiteId(siteId);
|
|
97
|
+
selectionId = siteId;
|
|
98
|
+
console.log('[Selection] Site mode - selecting', cellNamesToSelect.length, 'cells for site', siteId);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case 'sector': {
|
|
102
|
+
// Select all cells in the sector (first 5 digits)
|
|
103
|
+
const sectorId = this.cellDataStore.getSectorIdFromCellName(cellName);
|
|
104
|
+
cellNamesToSelect = this.cellDataStore.getCellsBySectorId(sectorId);
|
|
105
|
+
selectionId = sectorId;
|
|
106
|
+
console.log('[Selection] Sector mode - selecting', cellNamesToSelect.length, 'cells for sector', sectorId);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 'cell':
|
|
110
|
+
default: {
|
|
111
|
+
// Select just this cell
|
|
112
|
+
cellNamesToSelect = [cellName];
|
|
113
|
+
selectionId = cellName;
|
|
114
|
+
console.log('[Selection] Cell mode - selecting 1 cell');
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Toggle the selection group
|
|
119
|
+
this.toggleGroupSelection(selectionId, cellNamesToSelect, layerId, properties);
|
|
76
120
|
}
|
|
77
121
|
/**
|
|
78
|
-
*
|
|
122
|
+
* Handle click on a site marker (if sites layer exists)
|
|
79
123
|
*/
|
|
80
|
-
|
|
81
|
-
this.
|
|
124
|
+
handleSiteClick(siteId, layerId, properties) {
|
|
125
|
+
if (!this.cellDataStore)
|
|
126
|
+
return;
|
|
127
|
+
// Always select all cells in the site when clicking site marker
|
|
128
|
+
const cellNamesToSelect = this.cellDataStore.getCellsBySiteId(siteId);
|
|
129
|
+
this.toggleGroupSelection(siteId, cellNamesToSelect, layerId, properties);
|
|
82
130
|
}
|
|
83
131
|
/**
|
|
84
|
-
* Toggle a
|
|
132
|
+
* Toggle a group of cells (site or sector)
|
|
85
133
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
134
|
+
toggleGroupSelection(groupId, cellNames, layerId, properties) {
|
|
135
|
+
// Check if this group is already selected
|
|
136
|
+
const isSelected = this.selectedFeatures.some(f => f.id === groupId);
|
|
137
|
+
if (isSelected) {
|
|
138
|
+
// Remove the group
|
|
139
|
+
this.selectedFeatures = this.selectedFeatures.filter(f => f.id !== groupId);
|
|
140
|
+
// Remove all cell names from the set
|
|
141
|
+
cellNames.forEach(name => this.selectedCellNames.delete(name));
|
|
91
142
|
}
|
|
92
143
|
else {
|
|
93
|
-
// Add
|
|
94
|
-
this.selectedFeatures.push({
|
|
144
|
+
// Add the group
|
|
145
|
+
this.selectedFeatures.push({
|
|
146
|
+
id: groupId,
|
|
147
|
+
layerId,
|
|
148
|
+
properties,
|
|
149
|
+
cellNames // Store which cells belong to this group
|
|
150
|
+
});
|
|
151
|
+
// Add all cell names to the set
|
|
152
|
+
cellNames.forEach(name => this.selectedCellNames.add(name));
|
|
95
153
|
}
|
|
154
|
+
// Update feature-state for all affected cells
|
|
155
|
+
this.updateFeatureStates(cellNames, !isSelected);
|
|
96
156
|
// Trigger callback
|
|
97
157
|
if (this.onSelectionChange) {
|
|
98
158
|
this.onSelectionChange(this.selectedFeatures);
|
|
99
159
|
}
|
|
100
160
|
}
|
|
101
161
|
/**
|
|
102
|
-
*
|
|
162
|
+
* Update Mapbox feature-state for cells
|
|
103
163
|
*/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
164
|
+
updateFeatureStates(cellNames, selected) {
|
|
165
|
+
if (!this.map || !this.cellDataStore)
|
|
166
|
+
return;
|
|
167
|
+
console.log('[Selection] Updating feature-state for', cellNames.length, 'cells, selected:', selected);
|
|
168
|
+
const startTime = performance.now();
|
|
169
|
+
let successCount = 0;
|
|
170
|
+
let failCount = 0;
|
|
171
|
+
for (const cellName of cellNames) {
|
|
172
|
+
const numericId = this.cellDataStore.getNumericId(cellName);
|
|
173
|
+
if (numericId !== undefined) {
|
|
174
|
+
try {
|
|
175
|
+
this.map.setFeatureState({ source: 'cells-source', id: numericId }, { selected });
|
|
176
|
+
successCount++;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.error('[Selection] Failed to set feature-state for', cellName, numericId, error);
|
|
180
|
+
failCount++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
console.warn('[Selection] No numeric ID found for cell:', cellName);
|
|
185
|
+
failCount++;
|
|
110
186
|
}
|
|
111
187
|
}
|
|
188
|
+
const endTime = performance.now();
|
|
189
|
+
console.log('[Selection] Feature-state update complete:', successCount, 'success,', failCount, 'failed in', (endTime - startTime).toFixed(2), 'ms');
|
|
112
190
|
}
|
|
113
191
|
/**
|
|
114
|
-
*
|
|
192
|
+
* Enable selection mode
|
|
115
193
|
*/
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
194
|
+
enableSelectionMode() {
|
|
195
|
+
this.selectionMode = true;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Disable selection mode
|
|
199
|
+
*/
|
|
200
|
+
disableSelectionMode() {
|
|
201
|
+
this.selectionMode = false;
|
|
124
202
|
}
|
|
125
203
|
/**
|
|
126
204
|
* Clear all selections
|
|
127
205
|
*/
|
|
128
206
|
clearSelection() {
|
|
207
|
+
// Clear feature-state for all currently selected cells
|
|
208
|
+
if (this.map && this.cellDataStore) {
|
|
209
|
+
for (const cellName of this.selectedCellNames) {
|
|
210
|
+
const numericId = this.cellDataStore.getNumericId(cellName);
|
|
211
|
+
if (numericId !== undefined) {
|
|
212
|
+
this.map.setFeatureState({ source: 'cells-source', id: numericId }, { selected: false });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
129
216
|
this.selectedFeatures = [];
|
|
217
|
+
this.selectedCellNames.clear();
|
|
218
|
+
if (this.onSelectionChange) {
|
|
219
|
+
this.onSelectionChange(this.selectedFeatures);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Remove a selection group by ID
|
|
224
|
+
*/
|
|
225
|
+
removeFeatureSelection(id) {
|
|
226
|
+
const feature = this.selectedFeatures.find(f => f.id === id);
|
|
227
|
+
if (feature && feature.cellNames) {
|
|
228
|
+
// Clear feature-state for cells in this group
|
|
229
|
+
this.updateFeatureStates(feature.cellNames, false);
|
|
230
|
+
// Remove cell names from set
|
|
231
|
+
feature.cellNames.forEach(name => this.selectedCellNames.delete(name));
|
|
232
|
+
}
|
|
233
|
+
this.selectedFeatures = this.selectedFeatures.filter(f => f.id !== id);
|
|
130
234
|
if (this.onSelectionChange) {
|
|
131
235
|
this.onSelectionChange(this.selectedFeatures);
|
|
132
236
|
}
|
|
@@ -138,11 +242,17 @@ export class FeatureSelectionStore {
|
|
|
138
242
|
return this.selectedFeatures;
|
|
139
243
|
}
|
|
140
244
|
/**
|
|
141
|
-
* Get selected
|
|
245
|
+
* Get selected group IDs (site/sector/cell IDs)
|
|
142
246
|
*/
|
|
143
247
|
getSelectedIds() {
|
|
144
248
|
return this.selectedFeatures.map(f => f.id);
|
|
145
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Get all selected cell names (flattened from all groups)
|
|
252
|
+
*/
|
|
253
|
+
getSelectedCellNames() {
|
|
254
|
+
return Array.from(this.selectedCellNames);
|
|
255
|
+
}
|
|
146
256
|
/**
|
|
147
257
|
* Check if a feature is selected
|
|
148
258
|
*/
|
|
@@ -150,11 +260,23 @@ export class FeatureSelectionStore {
|
|
|
150
260
|
return this.selectedFeatures.some(f => f.id === id);
|
|
151
261
|
}
|
|
152
262
|
/**
|
|
153
|
-
*
|
|
263
|
+
* Check if a specific cell is selected
|
|
264
|
+
*/
|
|
265
|
+
isCellSelected(cellName) {
|
|
266
|
+
return this.selectedCellNames.has(cellName);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get selection count (number of groups, not individual cells)
|
|
154
270
|
*/
|
|
155
271
|
get count() {
|
|
156
272
|
return this.selectedFeatures.length;
|
|
157
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Get total number of selected cells
|
|
276
|
+
*/
|
|
277
|
+
get cellCount() {
|
|
278
|
+
return this.selectedCellNames.size;
|
|
279
|
+
}
|
|
158
280
|
/**
|
|
159
281
|
* Cleanup - remove event handlers
|
|
160
282
|
*/
|
|
@@ -164,6 +286,7 @@ export class FeatureSelectionStore {
|
|
|
164
286
|
}
|
|
165
287
|
this.clearSelection();
|
|
166
288
|
this.map = null;
|
|
289
|
+
this.cellDataStore = null;
|
|
167
290
|
}
|
|
168
291
|
}
|
|
169
292
|
/**
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
* Feature Selection - Type Definitions
|
|
3
3
|
*/
|
|
4
4
|
export interface SelectedFeature {
|
|
5
|
-
/** Feature identifier */
|
|
5
|
+
/** Feature identifier (can be site ID, sector ID, or cell name) */
|
|
6
6
|
id: string;
|
|
7
7
|
/** Optional site ID */
|
|
8
8
|
siteId?: string;
|
|
9
|
-
/** Optional cell name */
|
|
9
|
+
/** Optional cell name (for single cell selections) */
|
|
10
10
|
cellName?: string;
|
|
11
|
+
/** Array of cell names (for site/sector selections) */
|
|
12
|
+
cellNames?: string[];
|
|
11
13
|
/** Layer ID where feature was selected from */
|
|
12
14
|
layerId?: string;
|
|
13
15
|
/** Feature properties */
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { untrack } from 'svelte';
|
|
3
3
|
import { MapControl } from '../../../shared';
|
|
4
|
-
import { createTreeStore } from '../../../../core/TreeView
|
|
5
|
-
import TreeView from '../../../../core/TreeView/TreeView.svelte';
|
|
4
|
+
import { createTreeStore, TreeView } from '../../../../core/TreeView';
|
|
6
5
|
import type { SiteDataStore } from '../stores/site.data.svelte';
|
|
7
6
|
import type { SiteRegistry } from '../stores/site.registry.svelte';
|
|
8
7
|
import type { SiteDisplayStore } from '../stores/site.display.svelte';
|
|
@@ -34,40 +33,31 @@
|
|
|
34
33
|
|
|
35
34
|
// Sync Tree Selection -> Site Registry Visibility
|
|
36
35
|
$effect(() => {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
val.state.nodes.forEach((nodeState) => {
|
|
45
|
-
// Check if it's a leaf node (Level 2 group)
|
|
46
|
-
if (nodeState.node.children && nodeState.node.children.length > 0) return;
|
|
47
|
-
|
|
48
|
-
// It's a leaf (Level 2 group)
|
|
49
|
-
const siteIds = nodeState.node.metadata?.siteIds || [];
|
|
50
|
-
allSiteIds.push(...siteIds);
|
|
36
|
+
const val = treeStore;
|
|
37
|
+
// Iterate all leaf nodes to sync visibility
|
|
38
|
+
|
|
39
|
+
// Collect all site IDs from the tree
|
|
40
|
+
const allSiteIds: string[] = [];
|
|
41
|
+
const visibleSiteIds: string[] = [];
|
|
51
42
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// Update registry
|
|
58
|
-
const hiddenIds = allSiteIds.filter(id => !visibleSiteIds.includes(id));
|
|
43
|
+
val.state.nodes.forEach((nodeState) => {
|
|
44
|
+
// Check if it's a leaf node (Level 2 group)
|
|
45
|
+
if (nodeState.node.children && nodeState.node.children.length > 0) return;
|
|
59
46
|
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
47
|
+
// It's a leaf (Level 2 group)
|
|
48
|
+
const siteIds = nodeState.node.metadata?.siteIds || [];
|
|
49
|
+
allSiteIds.push(...siteIds);
|
|
50
|
+
|
|
51
|
+
if (val.state.checkedPaths.has(nodeState.path)) {
|
|
52
|
+
visibleSiteIds.push(...siteIds);
|
|
53
|
+
}
|
|
66
54
|
});
|
|
67
55
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
56
|
+
// Update registry
|
|
57
|
+
const hiddenIds = allSiteIds.filter(id => !visibleSiteIds.includes(id));
|
|
58
|
+
|
|
59
|
+
registry.setVisible(visibleSiteIds, true);
|
|
60
|
+
registry.setVisible(hiddenIds, false);
|
|
71
61
|
});
|
|
72
62
|
|
|
73
63
|
function handleColorChange(node: any, event: Event) {
|
|
@@ -106,7 +96,7 @@
|
|
|
106
96
|
{dataStore.sites.length} Sites
|
|
107
97
|
</div> -->
|
|
108
98
|
<div class="border rounded bg-white" style="max-height: 400px; overflow-y: auto;">
|
|
109
|
-
<TreeView showControls={false} store={
|
|
99
|
+
<TreeView showControls={false} store={treeStore}>
|
|
110
100
|
{#snippet children({ node, state })}
|
|
111
101
|
<!-- Color Picker (Only for leaves / Level 2) -->
|
|
112
102
|
{#if !node.children || node.children.length === 0}
|
package/dist/map-v3/index.d.ts
CHANGED
|
@@ -25,6 +25,10 @@ export * from './features/sites/stores/site.data.svelte';
|
|
|
25
25
|
export * from './features/sites/stores/site.display.svelte';
|
|
26
26
|
export * from './features/sites/stores/site.registry.svelte';
|
|
27
27
|
export * from './features/selection';
|
|
28
|
+
export * from './features/coverage/types';
|
|
29
|
+
export { default as CoverageLayer } from './features/coverage/layers/CoverageLayer.svelte';
|
|
30
|
+
export * from './features/coverage/stores/coverage.data.svelte';
|
|
31
|
+
export * from './features/coverage/stores/coverage.display.svelte';
|
|
28
32
|
export { default as DemoMap } from './demo/DemoMap.svelte';
|
|
29
33
|
export { demoCells } from './demo/demo-cells';
|
|
30
34
|
export { demoRepeaters } from './demo/demo-repeaters';
|
package/dist/map-v3/index.js
CHANGED
|
@@ -31,6 +31,11 @@ export * from './features/sites/stores/site.display.svelte';
|
|
|
31
31
|
export * from './features/sites/stores/site.registry.svelte';
|
|
32
32
|
// Features - Selection
|
|
33
33
|
export * from './features/selection';
|
|
34
|
+
// Features - Coverage
|
|
35
|
+
export * from './features/coverage/types';
|
|
36
|
+
export { default as CoverageLayer } from './features/coverage/layers/CoverageLayer.svelte';
|
|
37
|
+
export * from './features/coverage/stores/coverage.data.svelte';
|
|
38
|
+
export * from './features/coverage/stores/coverage.display.svelte';
|
|
34
39
|
// Demo
|
|
35
40
|
export { default as DemoMap } from './demo/DemoMap.svelte';
|
|
36
41
|
export { demoCells } from './demo/demo-cells';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartnet360/svelte-components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.103",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite dev",
|
|
6
6
|
"build": "vite build && npm run prepack",
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
+
"@deck.gl/mapbox": "^9.2.2",
|
|
35
36
|
"@turf/turf": "^7.2.0",
|
|
36
37
|
"bootstrap": "^5.2.3",
|
|
37
38
|
"deck.gl": "^9.1.0",
|
|
38
|
-
"@deck.gl/mapbox": "^9.2.2",
|
|
39
39
|
"dexie": "^4.0.11",
|
|
40
40
|
"mapbox-gl": "^3.0.0",
|
|
41
41
|
"plotly.js-dist-min": "^3.1.0",
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree Store
|
|
3
|
-
* Svelte writable store for managing tree state with persistence
|
|
4
|
-
*/
|
|
5
|
-
import { type Writable } from 'svelte/store';
|
|
6
|
-
import type { TreeConfig, TreeStoreValue } from './tree.model';
|
|
7
|
-
/**
|
|
8
|
-
* Create a tree store with state management and persistence
|
|
9
|
-
*/
|
|
10
|
-
export declare function createTreeStore<T = any>(config: TreeConfig<T>): Writable<TreeStoreValue>;
|