@smartnet360/svelte-components 0.0.102 → 0.0.104
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 +13 -81
- package/dist/apps/site-check/SiteCheckControls.svelte +0 -7
- package/dist/apps/site-check/helper.js +0 -33
- package/dist/apps/site-check/transforms.js +15 -65
- package/dist/core/CellTable/CellTable.svelte +456 -0
- package/dist/core/CellTable/CellTable.svelte.d.ts +27 -0
- package/dist/core/CellTable/CellTablePanel.svelte +211 -0
- package/dist/core/CellTable/CellTablePanel.svelte.d.ts +49 -0
- package/dist/core/CellTable/CellTableToolbar.svelte +218 -0
- package/dist/core/CellTable/CellTableToolbar.svelte.d.ts +32 -0
- package/dist/core/CellTable/column-config.d.ts +63 -0
- package/dist/core/CellTable/column-config.js +465 -0
- package/dist/core/CellTable/index.d.ts +10 -0
- package/dist/core/CellTable/index.js +11 -0
- package/dist/core/CellTable/types.d.ts +166 -0
- package/dist/core/CellTable/types.js +6 -0
- package/dist/core/Charts/ChartCard.svelte +118 -31
- package/dist/core/Charts/ChartCard.svelte.d.ts +2 -0
- package/dist/core/Charts/ChartComponent.svelte +8 -31
- package/dist/core/Charts/data-processor.js +1 -19
- 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/core/index.d.ts +1 -0
- package/dist/core/index.js +2 -0
- package/dist/map-v2/features/cells/controls/CellFilterControl.svelte +16 -27
- 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/features/cells/components/CellFilterControl.svelte +24 -30
- 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/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 +4 -3
- package/dist/apps/site-check/transforms-old.d.ts +0 -56
- package/dist/apps/site-check/transforms-old.js +0 -273
- package/dist/core/TreeView/tree.store.d.ts +0 -10
- package/dist/core/TreeView/tree.store.js +0 -320
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Data Store
|
|
3
|
+
*
|
|
4
|
+
* Self-contained store for coverage calculation data and state.
|
|
5
|
+
* Zero dependencies on cells/sites features - fully encapsulated.
|
|
6
|
+
*/
|
|
7
|
+
import { CoverageCalculator } from '../../../../core/CoverageMap';
|
|
8
|
+
export class CoverageDataStore {
|
|
9
|
+
// State
|
|
10
|
+
result = $state(null);
|
|
11
|
+
calculating = $state(false);
|
|
12
|
+
progress = $state(0);
|
|
13
|
+
progressStage = $state('');
|
|
14
|
+
error = $state(null);
|
|
15
|
+
// Calculator instance (reusable)
|
|
16
|
+
calculator;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.calculator = new CoverageCalculator();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculate coverage prediction
|
|
22
|
+
* @param config - Complete RF configuration
|
|
23
|
+
*/
|
|
24
|
+
async calculateCoverage(config) {
|
|
25
|
+
this.calculating = true;
|
|
26
|
+
this.progress = 0;
|
|
27
|
+
this.progressStage = 'Initializing';
|
|
28
|
+
this.error = null;
|
|
29
|
+
this.result = null;
|
|
30
|
+
try {
|
|
31
|
+
// Progress callback to update UI
|
|
32
|
+
const progressCallback = (update) => {
|
|
33
|
+
const cellsProcessed = update.cellsProcessed ?? 0;
|
|
34
|
+
const totalCells = update.totalCells ?? 1;
|
|
35
|
+
this.progress = Math.round((cellsProcessed / totalCells) * 100);
|
|
36
|
+
this.progressStage = update.stage;
|
|
37
|
+
console.log(`[CoverageDataStore] ${update.stage}: ${this.progress}%`);
|
|
38
|
+
};
|
|
39
|
+
// Calculate
|
|
40
|
+
console.log('[CoverageDataStore] Starting calculation with config:', config);
|
|
41
|
+
this.result = await this.calculator.calculate(config, progressCallback);
|
|
42
|
+
console.log('[CoverageDataStore] Calculation complete:', this.result);
|
|
43
|
+
this.progress = 100;
|
|
44
|
+
this.progressStage = 'Complete';
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.error('[CoverageDataStore] Calculation failed:', err);
|
|
48
|
+
this.error = err instanceof Error ? err.message : 'Unknown calculation error';
|
|
49
|
+
this.result = null;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
this.calculating = false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear current coverage data
|
|
57
|
+
*/
|
|
58
|
+
clearCoverage() {
|
|
59
|
+
this.result = null;
|
|
60
|
+
this.progress = 0;
|
|
61
|
+
this.progressStage = '';
|
|
62
|
+
this.error = null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get grid cells for rendering
|
|
66
|
+
* Returns null if no result available
|
|
67
|
+
*/
|
|
68
|
+
get gridCells() {
|
|
69
|
+
return this.result?.grid.cells ?? null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get coverage statistics
|
|
73
|
+
*/
|
|
74
|
+
get stats() {
|
|
75
|
+
return this.result?.grid.stats ?? null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get coverage configuration used
|
|
79
|
+
*/
|
|
80
|
+
get config() {
|
|
81
|
+
return this.result?.config ?? null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if results are available
|
|
85
|
+
*/
|
|
86
|
+
get hasResults() {
|
|
87
|
+
return this.result !== null && this.result.grid.cells.length > 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Factory function to create coverage data store
|
|
92
|
+
*/
|
|
93
|
+
export function createCoverageDataStore() {
|
|
94
|
+
return new CoverageDataStore();
|
|
95
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Display Store
|
|
3
|
+
*
|
|
4
|
+
* Controls visualization settings for coverage layer.
|
|
5
|
+
* Follows Map V3 pattern with localStorage persistence.
|
|
6
|
+
*/
|
|
7
|
+
import type { CoverageColorScheme } from '../types';
|
|
8
|
+
export declare class CoverageDisplayStore {
|
|
9
|
+
key: string;
|
|
10
|
+
visible: boolean;
|
|
11
|
+
opacity: number;
|
|
12
|
+
colorScheme: CoverageColorScheme;
|
|
13
|
+
showLegend: boolean;
|
|
14
|
+
showLabels: boolean;
|
|
15
|
+
minSignalThreshold: number;
|
|
16
|
+
maxSignalThreshold: number;
|
|
17
|
+
zIndex: number;
|
|
18
|
+
constructor();
|
|
19
|
+
private loadFromStorage;
|
|
20
|
+
private saveToStorage;
|
|
21
|
+
/**
|
|
22
|
+
* Reset to defaults
|
|
23
|
+
*/
|
|
24
|
+
reset(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Toggle visibility
|
|
27
|
+
*/
|
|
28
|
+
toggle(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Factory function to create coverage display store
|
|
32
|
+
*/
|
|
33
|
+
export declare function createCoverageDisplayStore(): CoverageDisplayStore;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Display Store
|
|
3
|
+
*
|
|
4
|
+
* Controls visualization settings for coverage layer.
|
|
5
|
+
* Follows Map V3 pattern with localStorage persistence.
|
|
6
|
+
*/
|
|
7
|
+
import { browser } from '$app/environment';
|
|
8
|
+
export class CoverageDisplayStore {
|
|
9
|
+
key = 'map-v3-coverage-display';
|
|
10
|
+
// Visibility
|
|
11
|
+
visible = $state(true);
|
|
12
|
+
// Visual styling
|
|
13
|
+
opacity = $state(0.6);
|
|
14
|
+
colorScheme = $state('heatmap');
|
|
15
|
+
showLegend = $state(true);
|
|
16
|
+
showLabels = $state(false);
|
|
17
|
+
// Signal filtering (dBm)
|
|
18
|
+
minSignalThreshold = $state(-115); // Don't render below this
|
|
19
|
+
maxSignalThreshold = $state(-40); // Cap display at this
|
|
20
|
+
// Layer order
|
|
21
|
+
zIndex = $state(100); // Below cells/sites typically
|
|
22
|
+
constructor() {
|
|
23
|
+
if (browser) {
|
|
24
|
+
this.loadFromStorage();
|
|
25
|
+
// Auto-save on changes
|
|
26
|
+
$effect(() => {
|
|
27
|
+
this.saveToStorage();
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
loadFromStorage() {
|
|
32
|
+
const saved = localStorage.getItem(this.key);
|
|
33
|
+
if (saved) {
|
|
34
|
+
try {
|
|
35
|
+
const parsed = JSON.parse(saved);
|
|
36
|
+
this.visible = parsed.visible ?? true;
|
|
37
|
+
this.opacity = parsed.opacity ?? 0.6;
|
|
38
|
+
this.colorScheme = parsed.colorScheme ?? 'heatmap';
|
|
39
|
+
this.showLegend = parsed.showLegend ?? true;
|
|
40
|
+
this.showLabels = parsed.showLabels ?? false;
|
|
41
|
+
this.minSignalThreshold = parsed.minSignalThreshold ?? -115;
|
|
42
|
+
this.maxSignalThreshold = parsed.maxSignalThreshold ?? -40;
|
|
43
|
+
this.zIndex = parsed.zIndex ?? 100;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error('[CoverageDisplayStore] Failed to load settings', e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
saveToStorage() {
|
|
51
|
+
if (!browser)
|
|
52
|
+
return;
|
|
53
|
+
const data = {
|
|
54
|
+
visible: this.visible,
|
|
55
|
+
opacity: this.opacity,
|
|
56
|
+
colorScheme: this.colorScheme,
|
|
57
|
+
showLegend: this.showLegend,
|
|
58
|
+
showLabels: this.showLabels,
|
|
59
|
+
minSignalThreshold: this.minSignalThreshold,
|
|
60
|
+
maxSignalThreshold: this.maxSignalThreshold,
|
|
61
|
+
zIndex: this.zIndex
|
|
62
|
+
};
|
|
63
|
+
localStorage.setItem(this.key, JSON.stringify(data));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reset to defaults
|
|
67
|
+
*/
|
|
68
|
+
reset() {
|
|
69
|
+
this.visible = true;
|
|
70
|
+
this.opacity = 0.6;
|
|
71
|
+
this.colorScheme = 'heatmap';
|
|
72
|
+
this.showLegend = true;
|
|
73
|
+
this.showLabels = false;
|
|
74
|
+
this.minSignalThreshold = -115;
|
|
75
|
+
this.maxSignalThreshold = -40;
|
|
76
|
+
this.zIndex = 100;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Toggle visibility
|
|
80
|
+
*/
|
|
81
|
+
toggle() {
|
|
82
|
+
this.visible = !this.visible;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Factory function to create coverage display store
|
|
87
|
+
*/
|
|
88
|
+
export function createCoverageDisplayStore() {
|
|
89
|
+
return new CoverageDisplayStore();
|
|
90
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Feature - Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Fully encapsulated coverage prediction and visualization types.
|
|
5
|
+
* Zero dependencies on cells/sites features - works standalone.
|
|
6
|
+
*/
|
|
7
|
+
export type { CoverageResult, GridCell, CoverageGrid, CoverageStats, SignalQuality, SiteConfiguration, SectorConfig, PathLossModel, ProgressCallback, CoverageConfig, RFParameters, GridSettings, SignalThresholds, AntennaPattern } from '../../../core/CoverageMap';
|
|
8
|
+
/**
|
|
9
|
+
* Color scheme options for coverage visualization
|
|
10
|
+
*/
|
|
11
|
+
export type CoverageColorScheme = 'heatmap' | 'quality' | 'viridis' | 'plasma' | 'categorical';
|
|
12
|
+
/**
|
|
13
|
+
* Signal strength range for filtering/coloring
|
|
14
|
+
*/
|
|
15
|
+
export interface SignalRange {
|
|
16
|
+
min: number;
|
|
17
|
+
max: number;
|
|
18
|
+
label: string;
|
|
19
|
+
color: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Coverage layer display configuration
|
|
23
|
+
*/
|
|
24
|
+
export interface CoverageDisplayConfig {
|
|
25
|
+
visible: boolean;
|
|
26
|
+
opacity: number;
|
|
27
|
+
colorScheme: CoverageColorScheme;
|
|
28
|
+
showLegend: boolean;
|
|
29
|
+
showLabels: boolean;
|
|
30
|
+
minSignalThreshold: number;
|
|
31
|
+
maxSignalThreshold: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* GeoJSON feature properties for grid cells
|
|
35
|
+
*/
|
|
36
|
+
export interface CoverageFeatureProperties {
|
|
37
|
+
signal: number;
|
|
38
|
+
quality: string;
|
|
39
|
+
color: string;
|
|
40
|
+
lat: number;
|
|
41
|
+
lon: number;
|
|
42
|
+
distance: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Optional helper to convert Cell to RFConfiguration
|
|
46
|
+
* Only needed if integrating with cells feature
|
|
47
|
+
*/
|
|
48
|
+
export interface CellToRFConfigOptions {
|
|
49
|
+
defaultTxPower?: number;
|
|
50
|
+
defaultFrequency?: number;
|
|
51
|
+
defaultHeight?: number;
|
|
52
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { onDestroy, 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 { RepeaterDataStore } from '../stores/repeater.data.svelte';
|
|
7
6
|
import type { RepeaterRegistry } from '../stores/repeater.registry.svelte';
|
|
8
7
|
import type { RepeaterDisplayStore } from '../stores/repeater.display.svelte';
|
|
@@ -38,25 +37,20 @@
|
|
|
38
37
|
});
|
|
39
38
|
|
|
40
39
|
$effect(() => {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
const val = treeStore;
|
|
41
|
+
let changes = 0;
|
|
42
|
+
val.state.nodes.forEach((nodeState) => {
|
|
43
|
+
if (nodeState.node.children && nodeState.node.children.length > 0) return;
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
45
|
+
const groupId = nodeState.node.id;
|
|
46
|
+
const isVisible = val.state.checkedPaths.has(nodeState.path);
|
|
47
|
+
|
|
48
|
+
const currentStyle = registry.getStyle(groupId, '#000');
|
|
49
|
+
if (currentStyle.visible !== isVisible) {
|
|
50
|
+
registry.toggleVisibility(groupId);
|
|
51
|
+
changes++;
|
|
52
|
+
}
|
|
55
53
|
});
|
|
56
|
-
|
|
57
|
-
return () => {
|
|
58
|
-
unsubscribe();
|
|
59
|
-
};
|
|
60
54
|
});
|
|
61
55
|
|
|
62
56
|
function handleColorChange(groupId: string, event: Event) {
|
|
@@ -124,7 +118,7 @@
|
|
|
124
118
|
|
|
125
119
|
<div class="card-body p-0 overflow-auto" style="max-height: 400px;">
|
|
126
120
|
<div class="p-2">
|
|
127
|
-
<TreeView showControls={false} store={
|
|
121
|
+
<TreeView showControls={false} store={treeStore}>
|
|
128
122
|
{#snippet children({ node })}
|
|
129
123
|
<div class="d-flex align-items-center justify-content-between w-100">
|
|
130
124
|
|
|
@@ -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.104",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite dev",
|
|
6
6
|
"build": "vite build && npm run prepack",
|
|
@@ -32,14 +32,15 @@
|
|
|
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",
|
|
42
|
-
"svelte": "^5.0.0"
|
|
42
|
+
"svelte": "^5.0.0",
|
|
43
|
+
"tabulator-tables": "^6.3.1"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@eslint/compat": "^1.2.5",
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Data Transforms for Site Check Component
|
|
3
|
-
* Converts raw CSV data to TreeView nodes and Chart configurations
|
|
4
|
-
*/
|
|
5
|
-
import type { TreeNode } from '../../core/TreeView';
|
|
6
|
-
import type { KPI, CellStylingConfig } from '../../core/Charts';
|
|
7
|
-
import type { CellTrafficRecord } from './data-loader';
|
|
8
|
-
/**
|
|
9
|
-
* Extract band from cell name using regex pattern matching
|
|
10
|
-
* @param cellName - Cell name like "LTE700_1", "NR3500_2", etc.
|
|
11
|
-
* @returns Band string like "LTE700", "NR3500" or null if not found
|
|
12
|
-
* @deprecated Use the band field from CellTrafficRecord instead
|
|
13
|
-
*/
|
|
14
|
-
export declare function extractBandFromCell(cellName: string): string | null;
|
|
15
|
-
/**
|
|
16
|
-
* Get frequency order for a band (for sorting)
|
|
17
|
-
* @param band - Band string like "LTE700", "NR3500"
|
|
18
|
-
* @returns Frequency number or high value for unknown bands
|
|
19
|
-
*/
|
|
20
|
-
export declare function getBandFrequency(band: string | null): number;
|
|
21
|
-
/**
|
|
22
|
-
* Sort items by band frequency using actual band data from records
|
|
23
|
-
* @param items - Array of [cellName, record] tuples
|
|
24
|
-
* @returns Sorted array (ascending frequency order)
|
|
25
|
-
*/
|
|
26
|
-
export declare function sortCellsByBandFrequency(items: [string, CellTrafficRecord][]): [string, CellTrafficRecord][];
|
|
27
|
-
/**
|
|
28
|
-
* Build hierarchical tree structure: Site → Sector (Azimuth) → Cell (Band)
|
|
29
|
-
*/
|
|
30
|
-
export declare function buildTreeNodes(data: CellTrafficRecord[]): TreeNode[];
|
|
31
|
-
/**
|
|
32
|
-
* Filter chart data based on selected tree paths
|
|
33
|
-
* Only include cells that are checked in the tree
|
|
34
|
-
*/
|
|
35
|
-
export declare function filterChartData(data: CellTrafficRecord[], checkedPaths: Set<string>): CellTrafficRecord[];
|
|
36
|
-
/**
|
|
37
|
-
* Transform data for chart component consumption
|
|
38
|
-
* Pivots data so each cell becomes its own KPI column
|
|
39
|
-
* Transforms from long format (many rows per cell) to wide format (one column per cell)
|
|
40
|
-
*
|
|
41
|
-
* @param data - Filtered cell traffic records
|
|
42
|
-
* @param baseMetrics - Array of metric names to pivot (e.g., ['dlGBytes', 'ulGBytes'])
|
|
43
|
-
*/
|
|
44
|
-
export declare function transformChartData(data: CellTrafficRecord[], baseMetrics: string[]): any[];
|
|
45
|
-
/**
|
|
46
|
-
* Apply cell styling based on band and sector
|
|
47
|
-
* Modifies KPI objects to include color (from band) and lineStyle (from sector)
|
|
48
|
-
* Updates KPI name to format: Band_Azimuth°
|
|
49
|
-
*
|
|
50
|
-
* @param metricName - Base metric name (e.g., 'dlGBytes')
|
|
51
|
-
* @param cellRecord - Cell traffic record with band, sector, azimuth metadata
|
|
52
|
-
* @param unit - Unit string for the metric
|
|
53
|
-
* @param stylingConfig - Optional cell styling configuration (band colors, sector line styles)
|
|
54
|
-
* @returns Styled KPI object
|
|
55
|
-
*/
|
|
56
|
-
export declare function createStyledKPI(metricName: string, cellRecord: CellTrafficRecord, unit: string, stylingConfig?: CellStylingConfig): KPI;
|