@mytec: iter6 ready for test
This commit is contained in:
@@ -7,9 +7,13 @@ interface SettingsState {
|
||||
theme: Theme;
|
||||
showTerrain: boolean;
|
||||
terrainOpacity: number;
|
||||
showGrid: boolean;
|
||||
measurementMode: boolean;
|
||||
setTheme: (theme: Theme) => void;
|
||||
setShowTerrain: (show: boolean) => void;
|
||||
setTerrainOpacity: (opacity: number) => void;
|
||||
setShowGrid: (show: boolean) => void;
|
||||
setMeasurementMode: (mode: boolean) => void;
|
||||
}
|
||||
|
||||
function applyTheme(theme: Theme) {
|
||||
@@ -29,12 +33,16 @@ export const useSettingsStore = create<SettingsState>()(
|
||||
theme: 'system' as Theme,
|
||||
showTerrain: false,
|
||||
terrainOpacity: 0.5,
|
||||
showGrid: false,
|
||||
measurementMode: false,
|
||||
setTheme: (theme: Theme) => {
|
||||
set({ theme });
|
||||
applyTheme(theme);
|
||||
},
|
||||
setShowTerrain: (show: boolean) => set({ showTerrain: show }),
|
||||
setTerrainOpacity: (opacity: number) => set({ terrainOpacity: opacity }),
|
||||
setShowGrid: (show: boolean) => set({ showGrid: show }),
|
||||
setMeasurementMode: (mode: boolean) => set({ measurementMode: mode }),
|
||||
}),
|
||||
{
|
||||
name: 'rfcp-settings',
|
||||
|
||||
@@ -24,6 +24,9 @@ interface SitesState {
|
||||
togglePlacingMode: () => void;
|
||||
setPlacingMode: (val: boolean) => void;
|
||||
|
||||
// Multi-sector
|
||||
cloneSiteAsSectors: (siteId: string, sectorCount: 2 | 3) => Promise<void>;
|
||||
|
||||
// Batch operations
|
||||
toggleSiteSelection: (siteId: string) => void;
|
||||
selectAllSites: () => void;
|
||||
@@ -106,6 +109,38 @@ export const useSitesStore = create<SitesState>((set, get) => ({
|
||||
togglePlacingMode: () => set((s) => ({ isPlacingMode: !s.isPlacingMode })),
|
||||
setPlacingMode: (val: boolean) => set({ isPlacingMode: val }),
|
||||
|
||||
// Multi-sector: clone a site into 2 or 3 co-located sector sites
|
||||
cloneSiteAsSectors: async (siteId: string, sectorCount: 2 | 3) => {
|
||||
const source = get().sites.find((s) => s.id === siteId);
|
||||
if (!source) return;
|
||||
|
||||
const spacing = 360 / sectorCount;
|
||||
const addSite = get().addSite;
|
||||
|
||||
for (let i = 0; i < sectorCount; i++) {
|
||||
const azimuth = Math.round(i * spacing) % 360;
|
||||
const label = sectorCount === 2
|
||||
? ['Alpha', 'Beta'][i]
|
||||
: ['Alpha', 'Beta', 'Gamma'][i];
|
||||
|
||||
await addSite({
|
||||
name: `${source.name}-${label}`,
|
||||
lat: source.lat,
|
||||
lon: source.lon,
|
||||
height: source.height,
|
||||
power: source.power,
|
||||
gain: source.gain >= 15 ? source.gain : 18, // sector gain default
|
||||
frequency: source.frequency,
|
||||
antennaType: 'sector',
|
||||
azimuth,
|
||||
beamwidth: sectorCount === 2 ? 90 : 65,
|
||||
color: '',
|
||||
visible: true,
|
||||
notes: `Sector ${i + 1} (${label}) of ${source.name}`,
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// Batch operations
|
||||
toggleSiteSelection: (siteId: string) => {
|
||||
set((state) => {
|
||||
|
||||
Reference in New Issue
Block a user