@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.
Files changed (85) hide show
  1. package/dist/apps/antenna-pattern/index.d.ts +1 -0
  2. package/dist/apps/antenna-pattern/index.js +1 -0
  3. package/dist/apps/antenna-pattern/utils/load-static-antennas.d.ts +17 -0
  4. package/dist/apps/antenna-pattern/utils/load-static-antennas.js +83 -0
  5. package/dist/apps/site-check/SiteCheck.svelte +13 -81
  6. package/dist/apps/site-check/SiteCheckControls.svelte +0 -7
  7. package/dist/apps/site-check/helper.js +0 -33
  8. package/dist/apps/site-check/transforms.js +15 -65
  9. package/dist/core/CellTable/CellTable.svelte +456 -0
  10. package/dist/core/CellTable/CellTable.svelte.d.ts +27 -0
  11. package/dist/core/CellTable/CellTablePanel.svelte +211 -0
  12. package/dist/core/CellTable/CellTablePanel.svelte.d.ts +49 -0
  13. package/dist/core/CellTable/CellTableToolbar.svelte +218 -0
  14. package/dist/core/CellTable/CellTableToolbar.svelte.d.ts +32 -0
  15. package/dist/core/CellTable/column-config.d.ts +63 -0
  16. package/dist/core/CellTable/column-config.js +465 -0
  17. package/dist/core/CellTable/index.d.ts +10 -0
  18. package/dist/core/CellTable/index.js +11 -0
  19. package/dist/core/CellTable/types.d.ts +166 -0
  20. package/dist/core/CellTable/types.js +6 -0
  21. package/dist/core/Charts/ChartCard.svelte +118 -31
  22. package/dist/core/Charts/ChartCard.svelte.d.ts +2 -0
  23. package/dist/core/Charts/ChartComponent.svelte +8 -31
  24. package/dist/core/Charts/data-processor.js +1 -19
  25. package/dist/core/CoverageMap/ai/AITools.d.ts +117 -0
  26. package/dist/core/CoverageMap/ai/AITools.js +380 -0
  27. package/dist/core/CoverageMap/core/CoverageCalculator.d.ts +138 -0
  28. package/dist/core/CoverageMap/core/CoverageCalculator.js +375 -0
  29. package/dist/core/CoverageMap/core/GridCalculator.d.ts +115 -0
  30. package/dist/core/CoverageMap/core/GridCalculator.js +484 -0
  31. package/dist/core/CoverageMap/core/PathLossModels.d.ts +253 -0
  32. package/dist/core/CoverageMap/core/PathLossModels.js +380 -0
  33. package/dist/core/CoverageMap/core/SignalProcessor.d.ts +288 -0
  34. package/dist/core/CoverageMap/core/SignalProcessor.js +424 -0
  35. package/dist/core/CoverageMap/data/AntennaStore.d.ts +165 -0
  36. package/dist/core/CoverageMap/data/AntennaStore.js +327 -0
  37. package/dist/core/CoverageMap/data/SiteStore.d.ts +155 -0
  38. package/dist/core/CoverageMap/data/SiteStore.js +355 -0
  39. package/dist/core/CoverageMap/index.d.ts +74 -0
  40. package/dist/core/CoverageMap/index.js +103 -0
  41. package/dist/core/CoverageMap/types.d.ts +252 -0
  42. package/dist/core/CoverageMap/types.js +7 -0
  43. package/dist/core/CoverageMap/utils/geoUtils.d.ts +223 -0
  44. package/dist/core/CoverageMap/utils/geoUtils.js +374 -0
  45. package/dist/core/CoverageMap/utils/rfUtils.d.ts +329 -0
  46. package/dist/core/CoverageMap/utils/rfUtils.js +434 -0
  47. package/dist/core/CoverageMap/visualization/ColorSchemes.d.ts +149 -0
  48. package/dist/core/CoverageMap/visualization/ColorSchemes.js +377 -0
  49. package/dist/core/TreeView/index.d.ts +4 -4
  50. package/dist/core/TreeView/index.js +5 -5
  51. package/dist/core/TreeView/tree-utils.d.ts +12 -0
  52. package/dist/core/TreeView/tree-utils.js +115 -6
  53. package/dist/core/TreeView/tree.store.svelte.d.ts +94 -0
  54. package/dist/core/TreeView/tree.store.svelte.js +274 -0
  55. package/dist/core/index.d.ts +1 -0
  56. package/dist/core/index.js +2 -0
  57. package/dist/map-v2/features/cells/controls/CellFilterControl.svelte +16 -27
  58. package/dist/map-v2/features/repeaters/controls/RepeaterFilterControl.svelte +33 -42
  59. package/dist/map-v2/features/sites/controls/SiteFilterControl.svelte +12 -19
  60. package/dist/map-v3/core/components/Map.svelte +4 -0
  61. package/dist/map-v3/core/stores/map.store.svelte.js +2 -0
  62. package/dist/map-v3/features/cells/components/CellFilterControl.svelte +24 -30
  63. package/dist/map-v3/features/coverage/index.d.ts +12 -0
  64. package/dist/map-v3/features/coverage/index.js +16 -0
  65. package/dist/map-v3/features/coverage/layers/CoverageLayer.svelte +198 -0
  66. package/dist/map-v3/features/coverage/layers/CoverageLayer.svelte.d.ts +10 -0
  67. package/dist/map-v3/features/coverage/logic/coloring.d.ts +28 -0
  68. package/dist/map-v3/features/coverage/logic/coloring.js +77 -0
  69. package/dist/map-v3/features/coverage/logic/geometry.d.ts +33 -0
  70. package/dist/map-v3/features/coverage/logic/geometry.js +112 -0
  71. package/dist/map-v3/features/coverage/stores/coverage.data.svelte.d.ts +46 -0
  72. package/dist/map-v3/features/coverage/stores/coverage.data.svelte.js +95 -0
  73. package/dist/map-v3/features/coverage/stores/coverage.display.svelte.d.ts +33 -0
  74. package/dist/map-v3/features/coverage/stores/coverage.display.svelte.js +90 -0
  75. package/dist/map-v3/features/coverage/types.d.ts +52 -0
  76. package/dist/map-v3/features/coverage/types.js +7 -0
  77. package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte +14 -20
  78. package/dist/map-v3/features/sites/components/SiteFilterControl.svelte +23 -33
  79. package/dist/map-v3/index.d.ts +4 -0
  80. package/dist/map-v3/index.js +5 -0
  81. package/package.json +4 -3
  82. package/dist/apps/site-check/transforms-old.d.ts +0 -56
  83. package/dist/apps/site-check/transforms-old.js +0 -273
  84. package/dist/core/TreeView/tree.store.d.ts +0 -10
  85. 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
+ }
@@ -0,0 +1,7 @@
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 {};
@@ -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/tree.store';
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 unsubscribe = treeStore.subscribe((val) => {
42
- let changes = 0;
43
- val.state.nodes.forEach((nodeState) => {
44
- if (nodeState.node.children && nodeState.node.children.length > 0) return;
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
- const groupId = nodeState.node.id;
47
- const isVisible = val.state.checkedPaths.has(nodeState.path);
48
-
49
- const currentStyle = registry.getStyle(groupId, '#000');
50
- if (currentStyle.visible !== isVisible) {
51
- registry.toggleVisibility(groupId);
52
- changes++;
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={$treeStore}>
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/tree.store';
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 unsubscribe = treeStore.subscribe((val) => {
38
- // Iterate all leaf nodes to sync visibility
39
-
40
- // Collect all site IDs from the tree
41
- const allSiteIds: string[] = [];
42
- const visibleSiteIds: string[] = [];
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
- if (val.state.checkedPaths.has(nodeState.path)) {
53
- visibleSiteIds.push(...siteIds);
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
- // Optimization: Check if anything actually changed
61
- let needsUpdate = false;
62
- // Simple check: if counts match, assume mostly correct, but better to check content
63
- // For now, just update. Registry handles diffing somewhat.
64
- registry.setVisible(visibleSiteIds, true);
65
- registry.setVisible(hiddenIds, false);
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
- return () => {
69
- unsubscribe();
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={$treeStore}>
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}
@@ -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';
@@ -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.102",
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;