diff --git a/backend/devices/models.py b/backend/devices/models.py index b53c56e..8ded275 100644 --- a/backend/devices/models.py +++ b/backend/devices/models.py @@ -31,11 +31,11 @@ class DeviceTiers(str, Enum): class DeviceNetworkSettings(BaseModel): hostname: str = "" useStaticIP: bool = False - ipAddress: List[str] = [] - gateway: List[str] = [] - subnet: List[str] = [] - dns1: List[str] = [] - dns2: List[str] = [] + ipAddress: Any = [] + gateway: Any = [] + subnet: Any = [] + dns1: Any = [] + dns2: Any = [] class DeviceClockSettings(BaseModel): diff --git a/docker-compose.yml b/docker-compose.yml index d1e5f34..15f2b12 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: volumes: - ./backend:/app # Persistent data - lives outside the container - - ./data/database.db:/app/data/database.db + - ./data:/app/data - ./data/built_melodies:/app/storage/built_melodies - ./data/firmware:/app/storage/firmware - ./data/firebase-service-account.json:/app/firebase-service-account.json:ro diff --git a/frontend/src/components/SearchBar.jsx b/frontend/src/components/SearchBar.jsx index ccab05e..f9883cc 100644 --- a/frontend/src/components/SearchBar.jsx +++ b/frontend/src/components/SearchBar.jsx @@ -1,11 +1,11 @@ import { useState } from "react"; -export default function SearchBar({ onSearch, placeholder = "Search..." }) { +export default function SearchBar({ onSearch, placeholder = "Search...", style }) { const [value, setValue] = useState(""); - const handleSubmit = (e) => { - e.preventDefault(); - onSearch(value); + const handleChange = (e) => { + setValue(e.target.value); + onSearch(e.target.value); }; const handleClear = () => { @@ -14,36 +14,29 @@ export default function SearchBar({ onSearch, placeholder = "Search..." }) { }; return ( -
+ /> + {value && ( + + )} + ); } diff --git a/frontend/src/crm/customers/CustomerDetail.jsx b/frontend/src/crm/customers/CustomerDetail.jsx index ea10f9b..09a817d 100644 --- a/frontend/src/crm/customers/CustomerDetail.jsx +++ b/frontend/src/crm/customers/CustomerDetail.jsx @@ -1290,15 +1290,15 @@ export default function CustomerDetail() { >+
{entry.subject || {COMM_TYPE_LABELS[entry.type] || entry.type}}
{entry.body && ( -{entry.body}
+{entry.body}
)}- Welcome, {user?.name}.{" "} - {user?.role} -
+| Serial Number | -Status | -Owner | -Date | -
|---|---|---|---|
| - {item.serial_number} - | -
- |
- - {item.owner || "—"} - | -- {formatTs(item.updated_at)} - | -
| Time | -Admin | -Action | -Device | -Detail | -
|---|---|---|---|---|
| - {formatTs(entry.timestamp)} - | -- {entry.admin_user} - | -- {ACTION_LABELS[entry.action] || entry.action} - | -- {entry.serial_number - ? ( - - ) - : "—"} - | -- {entry.detail - ? (() => { - try { - const d = JSON.parse(entry.detail); - return Object.entries(d) - .filter(([, v]) => v !== null && v !== undefined) - .map(([k, v]) => `${k}: ${v}`) - .join(", "); - } catch { - return entry.detail; - } - })() - : "—"} - | -
+ + {user?.role} + + {dateStr} +
- Select a section from the sidebar to get started. -
+ {/* Live clock */} +| Serial | +Status | +Owner | +When | +
|---|
| Time | +User | +Action | +Device | +
|---|
No creators found
+ ) : ( + allCreators.map((creator) => ( + + )) + )} + {createdByFilter.length > 0 && ( +No creators found
- ) : ( - allCreators.map((creator) => ( - - )) - )} - {createdByFilter.length > 0 && ( -