@smartnet360/svelte-components 0.0.84 → 0.0.86
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/components/AntennaControls.svelte +1 -106
- package/dist/apps/antenna-pattern/components/AntennaDiagrams.svelte +0 -36
- package/dist/apps/antenna-pattern/components/AntennaSettingsModal.svelte +0 -2
- package/dist/apps/antenna-pattern/components/PlotlyRadarChart.svelte +0 -22
- package/dist/apps/antenna-pattern/components/chart-engines/PolarAreaChart.svelte +0 -2
- package/dist/apps/antenna-pattern/components/chart-engines/PolarBarChart.svelte +0 -2
- package/dist/apps/antenna-pattern/components/chart-engines/PolarLineChart.svelte +0 -2
- package/dist/apps/site-check/SiteCheck.svelte +60 -80
- package/dist/apps/site-check/data-loader.d.ts +9 -6
- package/dist/apps/site-check/data-loader.js +2 -11
- package/dist/apps/site-check/helper.d.ts +3 -2
- package/dist/apps/site-check/helper.js +7 -5
- package/dist/apps/site-check/index.d.ts +1 -1
- package/dist/apps/site-check/transforms.d.ts +4 -2
- package/dist/apps/site-check/transforms.js +49 -10
- package/dist/core/Charts/GlobalControls.svelte +0 -4
- package/dist/core/Desktop/Grid/ResizeHandle.svelte +0 -7
- package/dist/core/Desktop/Grid/resizeStore.js +0 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/map-v2/demo/DemoMap.svelte +0 -2
- package/dist/map-v2/demo/demo-cells.js +0 -1
- package/dist/map-v2/features/cells/layers/CellsLayer.svelte +7 -26
- package/dist/map-v2/features/cells/utils/cellTree.js +0 -29
- package/dist/map-v2/features/repeaters/layers/RepeaterLabelsLayer.svelte +3 -27
- package/dist/map-v2/features/repeaters/layers/RepeatersLayer.svelte +8 -25
- package/dist/map-v2/features/repeaters/utils/repeaterTree.js +0 -6
- package/dist/map-v2/features/sites/controls/SiteFilterControl.svelte +0 -8
- package/dist/map-v2/features/sites/utils/siteTreeUtils.js +0 -6
- package/dist/map-v3/core/components/Map.svelte +89 -0
- package/dist/map-v3/core/components/Map.svelte.d.ts +13 -0
- package/dist/map-v3/core/controls/FeatureSettingsControl.svelte +103 -0
- package/dist/map-v3/core/controls/FeatureSettingsControl.svelte.d.ts +15 -0
- package/dist/map-v3/core/controls/MapStyleControl.svelte +271 -0
- package/dist/map-v3/core/controls/MapStyleControl.svelte.d.ts +28 -0
- package/dist/map-v3/core/index.d.ts +3 -0
- package/dist/map-v3/core/index.js +3 -0
- package/dist/map-v3/core/stores/map.store.svelte.d.ts +8 -0
- package/dist/map-v3/core/stores/map.store.svelte.js +29 -0
- package/dist/map-v3/core/stores/viewport.store.svelte.d.ts +38 -0
- package/dist/map-v3/core/stores/viewport.store.svelte.js +107 -0
- package/dist/map-v3/demo/DemoMap.svelte +104 -0
- package/dist/map-v3/demo/DemoMap.svelte.d.ts +6 -0
- package/dist/map-v3/demo/demo-cells.d.ts +13 -0
- package/dist/map-v3/demo/demo-cells.js +130 -0
- package/dist/map-v3/demo/demo-data.d.ts +8 -0
- package/dist/map-v3/demo/demo-data.js +104 -0
- package/dist/map-v3/demo/demo-repeaters.d.ts +13 -0
- package/dist/map-v3/demo/demo-repeaters.js +73 -0
- package/dist/map-v3/features/cells/components/CellFilterControl.svelte +208 -0
- package/dist/map-v3/features/cells/components/CellFilterControl.svelte.d.ts +12 -0
- package/dist/map-v3/features/cells/components/CellSettingsPanel.svelte +229 -0
- package/dist/map-v3/features/cells/components/CellSettingsPanel.svelte.d.ts +7 -0
- package/dist/map-v3/features/cells/constants.d.ts +18 -0
- package/dist/map-v3/features/cells/constants.js +37 -0
- package/dist/map-v3/features/cells/layers/CellLabelsLayer.svelte +230 -0
- package/dist/map-v3/features/cells/layers/CellLabelsLayer.svelte.d.ts +11 -0
- package/dist/map-v3/features/cells/layers/CellsLayer.svelte +194 -0
- package/dist/map-v3/features/cells/layers/CellsLayer.svelte.d.ts +11 -0
- package/dist/map-v3/features/cells/layers/index.d.ts +2 -0
- package/dist/map-v3/features/cells/layers/index.js +2 -0
- package/dist/map-v3/features/cells/logic/geometry.d.ts +12 -0
- package/dist/map-v3/features/cells/logic/geometry.js +35 -0
- package/dist/map-v3/features/cells/logic/grouping.d.ts +18 -0
- package/dist/map-v3/features/cells/logic/grouping.js +30 -0
- package/dist/map-v3/features/cells/logic/tree-adapter.d.ts +11 -0
- package/dist/map-v3/features/cells/logic/tree-adapter.js +53 -0
- package/dist/map-v3/features/cells/stores/cell.data.svelte.d.ts +9 -0
- package/dist/map-v3/features/cells/stores/cell.data.svelte.js +16 -0
- package/dist/map-v3/features/cells/stores/cell.display.svelte.d.ts +25 -0
- package/dist/map-v3/features/cells/stores/cell.display.svelte.js +67 -0
- package/dist/map-v3/features/cells/stores/cell.registry.svelte.d.ts +23 -0
- package/dist/map-v3/features/cells/stores/cell.registry.svelte.js +68 -0
- package/dist/map-v3/features/cells/types.d.ts +62 -0
- package/dist/map-v3/features/cells/types.js +6 -0
- package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte +148 -0
- package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte.d.ts +12 -0
- package/dist/map-v3/features/repeaters/components/RepeaterSettingsPanel.svelte +209 -0
- package/dist/map-v3/features/repeaters/components/RepeaterSettingsPanel.svelte.d.ts +7 -0
- package/dist/map-v3/features/repeaters/layers/RepeaterLabelsLayer.svelte +177 -0
- package/dist/map-v3/features/repeaters/layers/RepeaterLabelsLayer.svelte.d.ts +11 -0
- package/dist/map-v3/features/repeaters/layers/RepeatersLayer.svelte +163 -0
- package/dist/map-v3/features/repeaters/layers/RepeatersLayer.svelte.d.ts +11 -0
- package/dist/map-v3/features/repeaters/logic/geometry.d.ts +3 -0
- package/dist/map-v3/features/repeaters/logic/geometry.js +23 -0
- package/dist/map-v3/features/repeaters/logic/grouping.d.ts +8 -0
- package/dist/map-v3/features/repeaters/logic/grouping.js +20 -0
- package/dist/map-v3/features/repeaters/logic/tree-adapter.d.ts +8 -0
- package/dist/map-v3/features/repeaters/logic/tree-adapter.js +43 -0
- package/dist/map-v3/features/repeaters/stores/repeater.data.svelte.d.ts +8 -0
- package/dist/map-v3/features/repeaters/stores/repeater.data.svelte.js +13 -0
- package/dist/map-v3/features/repeaters/stores/repeater.display.svelte.d.ts +21 -0
- package/dist/map-v3/features/repeaters/stores/repeater.display.svelte.js +64 -0
- package/dist/map-v3/features/repeaters/stores/repeater.registry.svelte.d.ts +23 -0
- package/dist/map-v3/features/repeaters/stores/repeater.registry.svelte.js +68 -0
- package/dist/map-v3/features/repeaters/types.d.ts +18 -0
- package/dist/map-v3/features/repeaters/types.js +1 -0
- package/dist/map-v3/features/sites/components/SiteFilterControl.svelte +119 -0
- package/dist/map-v3/features/sites/components/SiteFilterControl.svelte.d.ts +12 -0
- package/dist/map-v3/features/sites/components/SiteSettingsPanel.svelte +241 -0
- package/dist/map-v3/features/sites/components/SiteSettingsPanel.svelte.d.ts +7 -0
- package/dist/map-v3/features/sites/layers/SiteLabelsLayer.svelte +152 -0
- package/dist/map-v3/features/sites/layers/SiteLabelsLayer.svelte.d.ts +11 -0
- package/dist/map-v3/features/sites/layers/SitesLayer.svelte +132 -0
- package/dist/map-v3/features/sites/layers/SitesLayer.svelte.d.ts +11 -0
- package/dist/map-v3/features/sites/logic/tree-adapter.d.ts +9 -0
- package/dist/map-v3/features/sites/logic/tree-adapter.js +75 -0
- package/dist/map-v3/features/sites/stores/site.data.svelte.d.ts +8 -0
- package/dist/map-v3/features/sites/stores/site.data.svelte.js +40 -0
- package/dist/map-v3/features/sites/stores/site.display.svelte.d.ts +20 -0
- package/dist/map-v3/features/sites/stores/site.display.svelte.js +63 -0
- package/dist/map-v3/features/sites/stores/site.registry.svelte.d.ts +13 -0
- package/dist/map-v3/features/sites/stores/site.registry.svelte.js +83 -0
- package/dist/map-v3/features/sites/types.d.ts +12 -0
- package/dist/map-v3/features/sites/types.js +1 -0
- package/dist/map-v3/index.d.ts +26 -0
- package/dist/map-v3/index.js +31 -0
- package/dist/map-v3/shared/controls/MapControl.svelte +242 -0
- package/dist/map-v3/shared/controls/MapControl.svelte.d.ts +27 -0
- package/dist/map-v3/shared/index.d.ts +1 -0
- package/dist/map-v3/shared/index.js +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Viewport Store - Manages and persists map viewport state (center, zoom, pitch, bearing)
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Reactive state using Svelte 5 runes
|
|
6
|
+
* - Auto-persists to localStorage via $effect
|
|
7
|
+
* - Namespace isolation for multiple map instances
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_STATE = {
|
|
10
|
+
center: [0, 0],
|
|
11
|
+
zoom: 2,
|
|
12
|
+
bearing: 0,
|
|
13
|
+
pitch: 0
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Load viewport state from localStorage
|
|
17
|
+
*/
|
|
18
|
+
function loadViewportState(namespace, defaults) {
|
|
19
|
+
if (typeof window === 'undefined') {
|
|
20
|
+
return { ...DEFAULT_STATE, ...defaults };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const key = `${namespace}:viewport`;
|
|
24
|
+
const stored = localStorage.getItem(key);
|
|
25
|
+
if (stored) {
|
|
26
|
+
const parsed = JSON.parse(stored);
|
|
27
|
+
return {
|
|
28
|
+
center: parsed.center || defaults.center || DEFAULT_STATE.center,
|
|
29
|
+
zoom: parsed.zoom ?? defaults.zoom ?? DEFAULT_STATE.zoom,
|
|
30
|
+
bearing: parsed.bearing ?? defaults.bearing ?? DEFAULT_STATE.bearing,
|
|
31
|
+
pitch: parsed.pitch ?? defaults.pitch ?? DEFAULT_STATE.pitch
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.warn('Failed to load viewport state:', error);
|
|
37
|
+
}
|
|
38
|
+
return { ...DEFAULT_STATE, ...defaults };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Save viewport state to localStorage
|
|
42
|
+
*/
|
|
43
|
+
function saveViewportState(namespace, state) {
|
|
44
|
+
if (typeof window === 'undefined')
|
|
45
|
+
return;
|
|
46
|
+
try {
|
|
47
|
+
const key = `${namespace}:viewport`;
|
|
48
|
+
localStorage.setItem(key, JSON.stringify(state));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.warn('Failed to save viewport state:', error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a viewport store with persistence
|
|
56
|
+
*
|
|
57
|
+
* @param namespace - Unique identifier for localStorage key
|
|
58
|
+
* @param defaults - Default viewport values (used if no saved state exists)
|
|
59
|
+
* @returns ViewportStore instance
|
|
60
|
+
*/
|
|
61
|
+
export function createViewportStore(namespace, defaults = {}) {
|
|
62
|
+
// Load initial state
|
|
63
|
+
let state = $state(loadViewportState(namespace, defaults));
|
|
64
|
+
// Auto-save to localStorage on any change
|
|
65
|
+
$effect(() => {
|
|
66
|
+
saveViewportState(namespace, state);
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
// Getters
|
|
70
|
+
get center() { return state.center; },
|
|
71
|
+
get zoom() { return state.zoom; },
|
|
72
|
+
get bearing() { return state.bearing; },
|
|
73
|
+
get pitch() { return state.pitch; },
|
|
74
|
+
// Setters
|
|
75
|
+
setCenter(center) {
|
|
76
|
+
state.center = center;
|
|
77
|
+
},
|
|
78
|
+
setZoom(zoom) {
|
|
79
|
+
state.zoom = zoom;
|
|
80
|
+
},
|
|
81
|
+
setBearing(bearing) {
|
|
82
|
+
state.bearing = bearing;
|
|
83
|
+
},
|
|
84
|
+
setPitch(pitch) {
|
|
85
|
+
state.pitch = pitch;
|
|
86
|
+
},
|
|
87
|
+
// Bulk update (more efficient than individual setters)
|
|
88
|
+
updateViewport(updates) {
|
|
89
|
+
if (updates.center !== undefined)
|
|
90
|
+
state.center = updates.center;
|
|
91
|
+
if (updates.zoom !== undefined)
|
|
92
|
+
state.zoom = updates.zoom;
|
|
93
|
+
if (updates.bearing !== undefined)
|
|
94
|
+
state.bearing = updates.bearing;
|
|
95
|
+
if (updates.pitch !== undefined)
|
|
96
|
+
state.pitch = updates.pitch;
|
|
97
|
+
},
|
|
98
|
+
// Reset to defaults
|
|
99
|
+
reset() {
|
|
100
|
+
const resetState = { ...DEFAULT_STATE, ...defaults };
|
|
101
|
+
state.center = resetState.center;
|
|
102
|
+
state.zoom = resetState.zoom;
|
|
103
|
+
state.bearing = resetState.bearing;
|
|
104
|
+
state.pitch = resetState.pitch;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
import { Map, MapStyleControl } from '../core';
|
|
4
|
+
import { CellsLayer, CellLabelsLayer } from '../features/cells/layers';
|
|
5
|
+
import { createCellDataStore } from '../features/cells/stores/cell.data.svelte';
|
|
6
|
+
import { createCellRegistry } from '../features/cells/stores/cell.registry.svelte';
|
|
7
|
+
import { CellDisplayStore } from '../features/cells/stores/cell.display.svelte';
|
|
8
|
+
import FeatureSettingsControl from '../core/controls/FeatureSettingsControl.svelte';
|
|
9
|
+
import CellFilterControl from '../features/cells/components/CellFilterControl.svelte';
|
|
10
|
+
import { createRepeaterDataStore } from '../features/repeaters/stores/repeater.data.svelte';
|
|
11
|
+
import { createRepeaterRegistry } from '../features/repeaters/stores/repeater.registry.svelte';
|
|
12
|
+
import { RepeaterDisplayStore } from '../features/repeaters/stores/repeater.display.svelte';
|
|
13
|
+
import RepeaterFilterControl from '../features/repeaters/components/RepeaterFilterControl.svelte';
|
|
14
|
+
import RepeatersLayer from '../features/repeaters/layers/RepeatersLayer.svelte';
|
|
15
|
+
import RepeaterLabelsLayer from '../features/repeaters/layers/RepeaterLabelsLayer.svelte';
|
|
16
|
+
import { createSiteDataStore } from '../features/sites/stores/site.data.svelte';
|
|
17
|
+
import { createSiteDisplayStore } from '../features/sites/stores/site.display.svelte';
|
|
18
|
+
import SitesLayer from '../features/sites/layers/SitesLayer.svelte';
|
|
19
|
+
import SiteLabelsLayer from '../features/sites/layers/SiteLabelsLayer.svelte';
|
|
20
|
+
import SiteFilterControl from '../features/sites/components/SiteFilterControl.svelte';
|
|
21
|
+
import { createSiteRegistry } from '../features/sites/stores/site.registry.svelte';
|
|
22
|
+
import { demoCells } from './demo-cells';
|
|
23
|
+
import { demoRepeaters } from './demo-repeaters';
|
|
24
|
+
|
|
25
|
+
interface Props {
|
|
26
|
+
accessToken: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let { accessToken }: Props = $props();
|
|
30
|
+
|
|
31
|
+
// Initialize stores
|
|
32
|
+
const cellData = createCellDataStore();
|
|
33
|
+
const cellRegistry = createCellRegistry('demo-map');
|
|
34
|
+
const cellDisplay = new CellDisplayStore();
|
|
35
|
+
|
|
36
|
+
const siteData = createSiteDataStore(cellData);
|
|
37
|
+
const siteRegistry = createSiteRegistry('demo-map');
|
|
38
|
+
const siteDisplay = createSiteDisplayStore();
|
|
39
|
+
|
|
40
|
+
const repeaterData = createRepeaterDataStore();
|
|
41
|
+
const repeaterRegistry = createRepeaterRegistry('demo-map');
|
|
42
|
+
const repeaterDisplay = new RepeaterDisplayStore();
|
|
43
|
+
|
|
44
|
+
onMount(() => {
|
|
45
|
+
// Load dummy data
|
|
46
|
+
// Need to cast or map if types slightly differ, but they should match
|
|
47
|
+
cellData.setCells(demoCells as any);
|
|
48
|
+
repeaterData.setRepeaters(demoRepeaters);
|
|
49
|
+
});
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<div class="map-wrapper">
|
|
53
|
+
<Map
|
|
54
|
+
|
|
55
|
+
{accessToken}
|
|
56
|
+
center={[19.0402, 47.4979]}
|
|
57
|
+
zoom={13}
|
|
58
|
+
namespace="demo-map"
|
|
59
|
+
>
|
|
60
|
+
<MapStyleControl position="top-right" namespace="demo-map" />
|
|
61
|
+
|
|
62
|
+
<CellFilterControl
|
|
63
|
+
position="top-left"
|
|
64
|
+
dataStore={cellData}
|
|
65
|
+
registry={cellRegistry}
|
|
66
|
+
displayStore={cellDisplay}
|
|
67
|
+
/>
|
|
68
|
+
|
|
69
|
+
<SiteFilterControl
|
|
70
|
+
position="top-left"
|
|
71
|
+
dataStore={siteData}
|
|
72
|
+
registry={siteRegistry}
|
|
73
|
+
displayStore={siteDisplay}
|
|
74
|
+
/>
|
|
75
|
+
|
|
76
|
+
<RepeaterFilterControl
|
|
77
|
+
position="top-left"
|
|
78
|
+
dataStore={repeaterData}
|
|
79
|
+
registry={repeaterRegistry}
|
|
80
|
+
displayStore={repeaterDisplay}
|
|
81
|
+
/>
|
|
82
|
+
|
|
83
|
+
<FeatureSettingsControl
|
|
84
|
+
position="top-right"
|
|
85
|
+
cellDisplayStore={cellDisplay}
|
|
86
|
+
repeaterDisplayStore={repeaterDisplay}
|
|
87
|
+
siteDisplayStore={siteDisplay}
|
|
88
|
+
/>
|
|
89
|
+
|
|
90
|
+
<SitesLayer dataStore={siteData} displayStore={siteDisplay} registry={siteRegistry} />
|
|
91
|
+
<SiteLabelsLayer dataStore={siteData} displayStore={siteDisplay} registry={siteRegistry} />
|
|
92
|
+
<CellsLayer dataStore={cellData} registry={cellRegistry} displayStore={cellDisplay} />
|
|
93
|
+
<CellLabelsLayer dataStore={cellData} registry={cellRegistry} displayStore={cellDisplay} />
|
|
94
|
+
<RepeatersLayer dataStore={repeaterData} registry={repeaterRegistry} displayStore={repeaterDisplay} />
|
|
95
|
+
<RepeaterLabelsLayer dataStore={repeaterData} registry={repeaterRegistry} displayStore={repeaterDisplay} />
|
|
96
|
+
</Map>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<style>
|
|
100
|
+
.map-wrapper {
|
|
101
|
+
width: 100%;
|
|
102
|
+
height: 100%;
|
|
103
|
+
}
|
|
104
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Cell Data
|
|
3
|
+
*
|
|
4
|
+
* 100 sites across San Francisco Bay Area
|
|
5
|
+
* Each site has 3 sectors (azimuths: 0°, 120°, 240°)
|
|
6
|
+
* Each sector has 12 cells (all tech-band combinations)
|
|
7
|
+
* Total: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
|
|
8
|
+
*/
|
|
9
|
+
import type { Cell } from '../features/cells/types';
|
|
10
|
+
/**
|
|
11
|
+
* Generate demo cells: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
|
|
12
|
+
*/
|
|
13
|
+
export declare const demoCells: Cell[];
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Cell Data
|
|
3
|
+
*
|
|
4
|
+
* 100 sites across San Francisco Bay Area
|
|
5
|
+
* Each site has 3 sectors (azimuths: 0°, 120°, 240°)
|
|
6
|
+
* Each sector has 12 cells (all tech-band combinations)
|
|
7
|
+
* Total: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
|
|
8
|
+
*/
|
|
9
|
+
const BASE_LAT = 47.4979;
|
|
10
|
+
const BASE_LNG = 19.0402;
|
|
11
|
+
// Grid parameters for distributing sites
|
|
12
|
+
const NUM_SITES = 1700;
|
|
13
|
+
const GRID_SIZE = 10; // 10×10 grid
|
|
14
|
+
const LAT_SPACING = 0.01; // ~1.1 km spacing
|
|
15
|
+
const LNG_SPACING = 0.015; // ~1.1 km spacing (adjusted for longitude)
|
|
16
|
+
// Standard beamwidth for sectors
|
|
17
|
+
const BEAMWIDTH = 65;
|
|
18
|
+
// Cell tech-band definitions with proper fband format
|
|
19
|
+
const TECH_BANDS = [
|
|
20
|
+
// 2G bands
|
|
21
|
+
{ tech: '2G', band: '900', fband: 'GSM900' },
|
|
22
|
+
{ tech: '2G', band: '1800', fband: 'GSM1800' },
|
|
23
|
+
// 4G bands
|
|
24
|
+
{ tech: '4G', band: '700', fband: 'LTE700' },
|
|
25
|
+
{ tech: '4G', band: '800', fband: 'LTE800' },
|
|
26
|
+
{ tech: '4G', band: '900', fband: 'LTE900' },
|
|
27
|
+
{ tech: '4G', band: '1800', fband: 'LTE1800' },
|
|
28
|
+
{ tech: '4G', band: '2100', fband: 'LTE2100' },
|
|
29
|
+
{ tech: '4G', band: '2600', fband: 'LTE2600' },
|
|
30
|
+
// 5G bands
|
|
31
|
+
{ tech: '5G', band: '700', fband: '5G-700' },
|
|
32
|
+
{ tech: '5G', band: '2100', fband: '5G-2100' },
|
|
33
|
+
{ tech: '5G', band: '3500', fband: '5G-3500' }
|
|
34
|
+
];
|
|
35
|
+
// Three sector azimuths
|
|
36
|
+
const AZIMUTHS = [0, 120, 240];
|
|
37
|
+
// Status rotation for variety
|
|
38
|
+
const STATUSES = [
|
|
39
|
+
'On_Air',
|
|
40
|
+
'On_Air',
|
|
41
|
+
'On_Air',
|
|
42
|
+
'On_Air',
|
|
43
|
+
'On_Air_UNDER_CONSTRUCTION',
|
|
44
|
+
'On_Air_Locked',
|
|
45
|
+
'RF_Plan_Ready',
|
|
46
|
+
'RF_Plan_Ready',
|
|
47
|
+
'Re-Planned_RF_Plan_Ready',
|
|
48
|
+
'Tavlati_RF_Plan_Ready',
|
|
49
|
+
'On_Air',
|
|
50
|
+
'On_Air'
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* Generate demo cells: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
|
|
54
|
+
*/
|
|
55
|
+
export const demoCells = [];
|
|
56
|
+
let cellCounter = 1;
|
|
57
|
+
// Generate sites in a grid pattern
|
|
58
|
+
for (let siteIndex = 0; siteIndex < NUM_SITES; siteIndex++) {
|
|
59
|
+
const row = Math.floor(siteIndex / GRID_SIZE);
|
|
60
|
+
const col = siteIndex % GRID_SIZE;
|
|
61
|
+
// Calculate site position (centered grid around base location)
|
|
62
|
+
const siteLat = BASE_LAT + (row - GRID_SIZE / 2) * LAT_SPACING;
|
|
63
|
+
const siteLng = BASE_LNG + (col - GRID_SIZE / 2) * LNG_SPACING;
|
|
64
|
+
const siteId = `DEMO-SITE-${String(siteIndex + 1).padStart(3, '0')}`;
|
|
65
|
+
// Generate 3 sectors per site
|
|
66
|
+
AZIMUTHS.forEach((azimuth, sectorIndex) => {
|
|
67
|
+
// Generate 12 tech-bands per sector
|
|
68
|
+
TECH_BANDS.forEach((techBand, techIndex) => {
|
|
69
|
+
const cellId = `CELL-${String(cellCounter).padStart(4, '0')}`;
|
|
70
|
+
const status = STATUSES[techIndex];
|
|
71
|
+
demoCells.push({
|
|
72
|
+
// Core properties
|
|
73
|
+
id: cellId,
|
|
74
|
+
txId: `TX-${String(cellCounter).padStart(4, '0')}`,
|
|
75
|
+
cellID: cellId,
|
|
76
|
+
cellID2G: techBand.tech === '2G' ? cellId : '',
|
|
77
|
+
cellName: `${siteId} ${techBand.tech}${techBand.band} S${sectorIndex + 1}`,
|
|
78
|
+
siteId: siteId,
|
|
79
|
+
tech: techBand.tech,
|
|
80
|
+
fband: techBand.fband,
|
|
81
|
+
frq: techBand.band,
|
|
82
|
+
type: 'MACRO',
|
|
83
|
+
status: status,
|
|
84
|
+
onAirDate: '2024-01-15',
|
|
85
|
+
// 2G specific
|
|
86
|
+
bcch: techBand.tech === '2G' ? 100 + techIndex : 0,
|
|
87
|
+
ctrlid: techBand.tech === '2G' ? `CTRL-${cellId}` : '',
|
|
88
|
+
// 4G specific
|
|
89
|
+
dlEarfn: techBand.tech === '4G' ? 6200 + techIndex * 100 : 0,
|
|
90
|
+
// Physical properties
|
|
91
|
+
antenna: 'DEMO-ANTENNA-MODEL',
|
|
92
|
+
azimuth: azimuth,
|
|
93
|
+
height: 30, // 30 meters antenna height
|
|
94
|
+
electricalTilt: '3',
|
|
95
|
+
beamwidth: BEAMWIDTH,
|
|
96
|
+
latitude: siteLat,
|
|
97
|
+
longitude: siteLng,
|
|
98
|
+
dx: 0,
|
|
99
|
+
dy: 0,
|
|
100
|
+
siteLatitude: siteLat,
|
|
101
|
+
siteLongitude: siteLng,
|
|
102
|
+
// Planning
|
|
103
|
+
comment: `Demo ${techBand.tech} ${techBand.band} cell at azimuth ${azimuth}°`,
|
|
104
|
+
planner: 'Demo User',
|
|
105
|
+
// Atoll properties
|
|
106
|
+
atollETP: 43.0,
|
|
107
|
+
atollPW: 20.0,
|
|
108
|
+
atollRS: 500.0 + (techBand.band === '700' ? 200 : 0), // Lower freq = longer range
|
|
109
|
+
atollBW: parseFloat(techBand.band) / 100, // Simplified bandwidth
|
|
110
|
+
// Network properties
|
|
111
|
+
cellId3: `${cellId}-3G`,
|
|
112
|
+
nwtP1: 20,
|
|
113
|
+
nwtP2: 40,
|
|
114
|
+
pci1: (cellCounter % 504), // Physical Cell ID for LTE
|
|
115
|
+
nwtRS: 450.0,
|
|
116
|
+
nwtBW: 10.0,
|
|
117
|
+
// Other
|
|
118
|
+
other: {
|
|
119
|
+
demoCell: true,
|
|
120
|
+
siteNumber: siteIndex + 1,
|
|
121
|
+
sector: sectorIndex + 1,
|
|
122
|
+
techBandKey: `${techBand.tech}_${techBand.band}`,
|
|
123
|
+
gridPosition: { row, col }
|
|
124
|
+
},
|
|
125
|
+
customSubgroup: `Sector-${sectorIndex + 1}`
|
|
126
|
+
});
|
|
127
|
+
cellCounter++;
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo cellular data for testing map-v2 site feature
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Sample cellular sites (San Francisco area)
|
|
6
|
+
*/
|
|
7
|
+
export const demoSites = [
|
|
8
|
+
{
|
|
9
|
+
siteId: 'site-001',
|
|
10
|
+
siteName: 'Downtown Tower',
|
|
11
|
+
longitude: -122.4194,
|
|
12
|
+
latitude: 37.7749,
|
|
13
|
+
fbands: ['2100', '1800'],
|
|
14
|
+
techs: ['5G'],
|
|
15
|
+
provider: 'Verizon',
|
|
16
|
+
level1: 'Urban Macro',
|
|
17
|
+
level2: 'San Francisco',
|
|
18
|
+
cellCount: 3
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
siteId: 'site-002',
|
|
22
|
+
siteName: 'Financial District',
|
|
23
|
+
longitude: -122.4008,
|
|
24
|
+
latitude: 37.7946,
|
|
25
|
+
fbands: ['1800', '850'],
|
|
26
|
+
techs: ['LTE'],
|
|
27
|
+
provider: 'AT&T',
|
|
28
|
+
level1: 'Urban Macro',
|
|
29
|
+
level2: 'San Francisco',
|
|
30
|
+
cellCount: 3
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
siteId: 'site-003',
|
|
34
|
+
siteName: 'Mission Bay',
|
|
35
|
+
longitude: -122.3912,
|
|
36
|
+
latitude: 37.7699,
|
|
37
|
+
fbands: ['2600'],
|
|
38
|
+
techs: ['5G'],
|
|
39
|
+
provider: 'T-Mobile',
|
|
40
|
+
level1: 'Small Cell',
|
|
41
|
+
level2: 'San Francisco',
|
|
42
|
+
cellCount: 2
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
siteId: 'site-004',
|
|
46
|
+
siteName: 'Golden Gate Park',
|
|
47
|
+
longitude: -122.4862,
|
|
48
|
+
latitude: 37.7694,
|
|
49
|
+
fbands: ['850', '700'],
|
|
50
|
+
techs: ['LTE'],
|
|
51
|
+
provider: 'Verizon',
|
|
52
|
+
level1: 'Rural Macro',
|
|
53
|
+
level2: 'San Francisco',
|
|
54
|
+
cellCount: 3
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
siteId: 'site-005',
|
|
58
|
+
siteName: 'Presidio Heights',
|
|
59
|
+
longitude: -122.4545,
|
|
60
|
+
latitude: 37.7881,
|
|
61
|
+
fbands: ['2100', '850'],
|
|
62
|
+
techs: ['5G'],
|
|
63
|
+
provider: 'AT&T',
|
|
64
|
+
level1: 'Suburban Macro',
|
|
65
|
+
level2: 'San Francisco',
|
|
66
|
+
cellCount: 3
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
siteId: 'site-006',
|
|
70
|
+
siteName: 'Castro District',
|
|
71
|
+
longitude: -122.4352,
|
|
72
|
+
latitude: 37.7609,
|
|
73
|
+
fbands: ['1800'],
|
|
74
|
+
techs: ['LTE'],
|
|
75
|
+
provider: 'T-Mobile',
|
|
76
|
+
level1: 'Small Cell',
|
|
77
|
+
level2: 'San Francisco',
|
|
78
|
+
cellCount: 2
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
siteId: 'site-007',
|
|
82
|
+
siteName: 'Embarcadero',
|
|
83
|
+
longitude: -122.3959,
|
|
84
|
+
latitude: 37.7956,
|
|
85
|
+
fbands: ['2600', '2100'],
|
|
86
|
+
techs: ['5G'],
|
|
87
|
+
provider: 'Verizon',
|
|
88
|
+
level1: 'Urban Macro',
|
|
89
|
+
level2: 'San Francisco',
|
|
90
|
+
cellCount: 3
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
siteId: 'site-008',
|
|
94
|
+
siteName: 'Sunset District',
|
|
95
|
+
longitude: -122.4944,
|
|
96
|
+
latitude: 37.7599,
|
|
97
|
+
fbands: ['850', '700'],
|
|
98
|
+
techs: ['LTE'],
|
|
99
|
+
provider: 'AT&T',
|
|
100
|
+
level1: 'Suburban Macro',
|
|
101
|
+
level2: 'San Francisco',
|
|
102
|
+
cellCount: 3
|
|
103
|
+
}
|
|
104
|
+
];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Repeater Data
|
|
3
|
+
*
|
|
4
|
+
* 15 repeaters strategically placed near demo sites
|
|
5
|
+
* Mix of 2G, 4G, and 5G technologies across various frequency bands
|
|
6
|
+
* Fixed 30° beamwidth
|
|
7
|
+
*/
|
|
8
|
+
import type { Repeater } from '../features/repeaters/types';
|
|
9
|
+
/**
|
|
10
|
+
* Generate demo repeater data
|
|
11
|
+
* Creates 15 repeaters with various tech:fband combinations
|
|
12
|
+
*/
|
|
13
|
+
export declare const demoRepeaters: Repeater[];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo Repeater Data
|
|
3
|
+
*
|
|
4
|
+
* 15 repeaters strategically placed near demo sites
|
|
5
|
+
* Mix of 2G, 4G, and 5G technologies across various frequency bands
|
|
6
|
+
* Fixed 30° beamwidth
|
|
7
|
+
*/
|
|
8
|
+
const BASE_LAT = 47.4979;
|
|
9
|
+
const BASE_LNG = 19.0402;
|
|
10
|
+
// Repeater positions (distributed across demo area)
|
|
11
|
+
const REPEATER_POSITIONS = [
|
|
12
|
+
{ lat: BASE_LAT + 0.015, lng: BASE_LNG - 0.020 },
|
|
13
|
+
{ lat: BASE_LAT + 0.025, lng: BASE_LNG + 0.010 },
|
|
14
|
+
{ lat: BASE_LAT - 0.010, lng: BASE_LNG + 0.025 },
|
|
15
|
+
{ lat: BASE_LAT - 0.020, lng: BASE_LNG - 0.015 },
|
|
16
|
+
{ lat: BASE_LAT + 0.005, lng: BASE_LNG + 0.030 },
|
|
17
|
+
{ lat: BASE_LAT + 0.030, lng: BASE_LNG - 0.005 },
|
|
18
|
+
{ lat: BASE_LAT - 0.025, lng: BASE_LNG + 0.015 },
|
|
19
|
+
{ lat: BASE_LAT + 0.010, lng: BASE_LNG - 0.030 },
|
|
20
|
+
{ lat: BASE_LAT - 0.015, lng: BASE_LNG - 0.025 },
|
|
21
|
+
{ lat: BASE_LAT + 0.020, lng: BASE_LNG + 0.020 },
|
|
22
|
+
{ lat: BASE_LAT - 0.005, lng: BASE_LNG - 0.010 },
|
|
23
|
+
{ lat: BASE_LAT + 0.035, lng: BASE_LNG + 0.005 },
|
|
24
|
+
{ lat: BASE_LAT - 0.030, lng: BASE_LNG + 0.020 },
|
|
25
|
+
{ lat: BASE_LAT + 0.012, lng: BASE_LNG - 0.018 },
|
|
26
|
+
{ lat: BASE_LAT - 0.018, lng: BASE_LNG + 0.012 }
|
|
27
|
+
];
|
|
28
|
+
// Repeater tech-band combinations
|
|
29
|
+
const REPEATER_CONFIGS = [
|
|
30
|
+
// 2G repeaters
|
|
31
|
+
{ tech: '2G', fband: 'GSM900', azimuth: 45 },
|
|
32
|
+
{ tech: '2G', fband: 'GSM1800', azimuth: 180 },
|
|
33
|
+
{ tech: '2G', fband: 'GSM900', azimuth: 270 },
|
|
34
|
+
// 4G repeaters
|
|
35
|
+
{ tech: '4G', fband: 'LTE700', azimuth: 90 },
|
|
36
|
+
{ tech: '4G', fband: 'LTE800', azimuth: 225 },
|
|
37
|
+
{ tech: '4G', fband: 'LTE1800', azimuth: 135 },
|
|
38
|
+
{ tech: '4G', fband: 'LTE2100', azimuth: 315 },
|
|
39
|
+
{ tech: '4G', fband: 'LTE2600', azimuth: 60 },
|
|
40
|
+
// 5G repeaters
|
|
41
|
+
{ tech: '5G', fband: '5G-700', azimuth: 150 },
|
|
42
|
+
{ tech: '5G', fband: '5G-2100', azimuth: 210 },
|
|
43
|
+
{ tech: '5G', fband: '5G-3500', azimuth: 330 },
|
|
44
|
+
{ tech: '5G', fband: '5G-3500', azimuth: 0 },
|
|
45
|
+
{ tech: '5G', fband: '5G-2100', azimuth: 120 },
|
|
46
|
+
{ tech: '5G', fband: '5G-700', azimuth: 240 },
|
|
47
|
+
{ tech: '5G', fband: '5G-3500', azimuth: 180 }
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Generate demo repeater data
|
|
51
|
+
* Creates 15 repeaters with various tech:fband combinations
|
|
52
|
+
*/
|
|
53
|
+
export const demoRepeaters = REPEATER_POSITIONS.map((pos, idx) => {
|
|
54
|
+
const config = REPEATER_CONFIGS[idx];
|
|
55
|
+
const repeaterId = `REP-${String(idx + 1).padStart(3, '0')}`;
|
|
56
|
+
const donorCellId = `CELL-${String((idx * 7) % 100).padStart(3, '0')}`;
|
|
57
|
+
return {
|
|
58
|
+
repeaterId,
|
|
59
|
+
donorCellId,
|
|
60
|
+
donorCellName: `Cell-${config.tech}-${config.fband}-${idx + 1}`,
|
|
61
|
+
latitude: pos.lat,
|
|
62
|
+
longitude: pos.lng,
|
|
63
|
+
azimuth: config.azimuth,
|
|
64
|
+
beamwidth: 30, // Fixed 30° beamwidth
|
|
65
|
+
tech: config.tech,
|
|
66
|
+
fband: config.fband,
|
|
67
|
+
type: 'REPEATER',
|
|
68
|
+
height: 15 + (idx % 5) * 5, // Heights between 15-35m
|
|
69
|
+
factory_nbr: `FN-${String(1000 + idx).padStart(6, '0')}`,
|
|
70
|
+
provider: idx % 2 === 0 ? 'Operator-A' : 'Operator-B',
|
|
71
|
+
featureGroup: config.tech === '5G' ? 'High-Priority' : config.tech === '4G' ? 'Standard' : 'Legacy'
|
|
72
|
+
};
|
|
73
|
+
});
|