@mytec: 2nd iteration implemented for tests

This commit is contained in:
2026-01-30 08:39:49 +02:00
parent e59eb59525
commit d7f1204e35
6 changed files with 342 additions and 50 deletions

View File

@@ -13,6 +13,7 @@ interface SitesState {
selectedSiteId: string | null;
editingSiteId: string | null;
isPlacingMode: boolean;
selectedSiteIds: string[];
loadSites: () => Promise<void>;
addSite: (data: SiteFormData) => Promise<Site>;
@@ -22,6 +23,13 @@ interface SitesState {
setEditingSite: (id: string | null) => void;
togglePlacingMode: () => void;
setPlacingMode: (val: boolean) => void;
// Batch operations
toggleSiteSelection: (siteId: string) => void;
selectAllSites: () => void;
clearSelection: () => void;
batchUpdateHeight: (adjustment: number) => Promise<void>;
batchSetHeight: (height: number) => Promise<void>;
}
export const useSitesStore = create<SitesState>((set, get) => ({
@@ -29,6 +37,7 @@ export const useSitesStore = create<SitesState>((set, get) => ({
selectedSiteId: null,
editingSiteId: null,
isPlacingMode: false,
selectedSiteIds: [],
loadSites: async () => {
const dbSites = await db.sites.toArray();
@@ -96,4 +105,83 @@ export const useSitesStore = create<SitesState>((set, get) => ({
setEditingSite: (id: string | null) => set({ editingSiteId: id }),
togglePlacingMode: () => set((s) => ({ isPlacingMode: !s.isPlacingMode })),
setPlacingMode: (val: boolean) => set({ isPlacingMode: val }),
// Batch operations
toggleSiteSelection: (siteId: string) => {
set((state) => {
const isSelected = state.selectedSiteIds.includes(siteId);
return {
selectedSiteIds: isSelected
? state.selectedSiteIds.filter((id) => id !== siteId)
: [...state.selectedSiteIds, siteId],
};
});
},
selectAllSites: () => {
set((state) => ({
selectedSiteIds: state.sites.map((s) => s.id),
}));
},
clearSelection: () => {
set({ selectedSiteIds: [] });
},
batchUpdateHeight: async (adjustment: number) => {
const { sites, selectedSiteIds } = get();
const selectedSet = new Set(selectedSiteIds);
const now = new Date();
const updatedSites = sites.map((site) => {
if (!selectedSet.has(site.id)) return site;
return {
...site,
height: Math.max(1, Math.min(100, site.height + adjustment)),
updatedAt: now,
};
});
// Persist to IndexedDB
const toUpdate = updatedSites.filter((s) => selectedSet.has(s.id));
for (const site of toUpdate) {
await db.sites.put({
id: site.id,
data: JSON.stringify(site),
createdAt: site.createdAt.getTime(),
updatedAt: now.getTime(),
});
}
set({ sites: updatedSites });
},
batchSetHeight: async (height: number) => {
const { sites, selectedSiteIds } = get();
const selectedSet = new Set(selectedSiteIds);
const clampedHeight = Math.max(1, Math.min(100, height));
const now = new Date();
const updatedSites = sites.map((site) => {
if (!selectedSet.has(site.id)) return site;
return {
...site,
height: clampedHeight,
updatedAt: now,
};
});
// Persist to IndexedDB
const toUpdate = updatedSites.filter((s) => selectedSet.has(s.id));
for (const site of toUpdate) {
await db.sites.put({
id: site.id,
data: JSON.stringify(site),
createdAt: site.createdAt.getTime(),
updatedAt: now.getTime(),
});
}
set({ sites: updatedSites });
},
}));