12d527aad6
Make designs (canvases) fully user-manageable: create with a chosen name and icon, rename, change icon, and delete. Replaces the hardcoded "New Electrical Design" button with a generic "New Canvas" flow. - Add Design.icon column + migration that backfills legacy rows (electrical -> zap, others -> dashboard) - DesignModal: name input + curated lucide icon picker (create + edit) - Sidebar switcher gains per-canvas edit/delete; delete guards the last canvas and confirms - designStore: addDesign/updateDesign/removeDesign with active reassignment - Fix data loss on design switch: abort load when the save fails and keep unsaved edits; skip the save-old step when the previous canvas was deleted - designsApi create/update carry icon; design_type kept for back-compat Tests: backend design CRUD (icon + cascade + last-canvas guard), designStore actions, designIcons resolver, DesignModal create/edit/validation. ha-relevant: yes
28 lines
625 B
Python
28 lines
625 B
Python
from datetime import datetime
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class DesignCreate(BaseModel):
|
|
name: str
|
|
icon: str = "dashboard"
|
|
# Vestigial: kept for backward compatibility. The UI no longer branches on it;
|
|
# the chosen icon now drives presentation. Defaults to a generic canvas.
|
|
design_type: str = "network"
|
|
|
|
|
|
class DesignUpdate(BaseModel):
|
|
name: str | None = None
|
|
icon: str | None = None
|
|
|
|
|
|
class DesignResponse(BaseModel):
|
|
id: str
|
|
name: str
|
|
design_type: str
|
|
icon: str | None = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|