@mytec: iter7 ready for test

This commit is contained in:
2026-01-30 13:06:31 +02:00
parent baebd29e1a
commit 3e1061e369
12 changed files with 592 additions and 39 deletions

View File

@@ -9,11 +9,15 @@ interface SettingsState {
terrainOpacity: number;
showGrid: boolean;
measurementMode: boolean;
showElevationInfo: boolean;
showElevationOverlay: boolean;
setTheme: (theme: Theme) => void;
setShowTerrain: (show: boolean) => void;
setTerrainOpacity: (opacity: number) => void;
setShowGrid: (show: boolean) => void;
setMeasurementMode: (mode: boolean) => void;
setShowElevationInfo: (show: boolean) => void;
setShowElevationOverlay: (show: boolean) => void;
}
function applyTheme(theme: Theme) {
@@ -35,6 +39,8 @@ export const useSettingsStore = create<SettingsState>()(
terrainOpacity: 0.5,
showGrid: false,
measurementMode: false,
showElevationInfo: false,
showElevationOverlay: false,
setTheme: (theme: Theme) => {
set({ theme });
applyTheme(theme);
@@ -43,6 +49,8 @@ export const useSettingsStore = create<SettingsState>()(
setTerrainOpacity: (opacity: number) => set({ terrainOpacity: opacity }),
setShowGrid: (show: boolean) => set({ showGrid: show }),
setMeasurementMode: (mode: boolean) => set({ measurementMode: mode }),
setShowElevationInfo: (show: boolean) => set({ showElevationInfo: show }),
setShowElevationOverlay: (show: boolean) => set({ showElevationOverlay: show }),
}),
{
name: 'rfcp-settings',

View File

@@ -26,6 +26,10 @@ interface SitesState {
// Multi-sector
cloneSiteAsSectors: (siteId: string, sectorCount: 2 | 3) => Promise<void>;
cloneSector: (siteId: string) => Promise<void>;
// Import/export
importSites: (sitesData: SiteFormData[]) => Promise<number>;
// Batch operations
toggleSiteSelection: (siteId: string) => void;
@@ -141,6 +145,42 @@ export const useSitesStore = create<SitesState>((set, get) => ({
}
},
// Clone a single sector: duplicate site with 30° azimuth offset
cloneSector: async (siteId: string) => {
const source = get().sites.find((s) => s.id === siteId);
if (!source) return;
const addSite = get().addSite;
const newAzimuth = ((source.azimuth ?? 0) + 30) % 360;
await addSite({
name: `${source.name}-clone`,
lat: source.lat,
lon: source.lon,
height: source.height,
power: source.power,
gain: source.gain,
frequency: source.frequency,
antennaType: source.antennaType,
azimuth: newAzimuth,
beamwidth: source.beamwidth,
color: '',
visible: true,
notes: source.notes ? `Clone of: ${source.notes}` : `Clone of ${source.name}`,
});
},
// Import sites from parsed data
importSites: async (sitesData: SiteFormData[]) => {
const addSite = get().addSite;
let count = 0;
for (const data of sitesData) {
await addSite(data);
count++;
}
return count;
},
// Batch operations
toggleSiteSelection: (siteId: string) => {
set((state) => {