@mytec: 2nd iteration implemented for tests
This commit is contained in:
@@ -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 });
|
||||
},
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user