update: CRM customers, orders, device detail, and status system changes

- CustomerList, CustomerForm, CustomerDetail: various updates
- Orders: removed OrderDetail and OrderForm, updated OrderList and index
- DeviceDetail: updates
- index.css: added new styles
- CRM_STATUS_SYSTEM_PLAN.md: new planning document
- Added customer-status assets and CustomerDetail subfolder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-25 10:39:38 +02:00
parent fee686a9f3
commit 5d8ef96d4c
33 changed files with 3699 additions and 1455 deletions

View File

@@ -368,11 +368,11 @@ function LocationModal({ open, onClose, onSaved, device, coords, id }) {
setSaving(true);
const latNum = parseFloat(lat);
const lngNum = parseFloat(lng);
const coordStr = (!isNaN(latNum) && !isNaN(lngNum))
? `${Math.abs(latNum).toFixed(7)}° ${latNum >= 0 ? "N" : "S"}, ${Math.abs(lngNum).toFixed(7)}° ${lngNum >= 0 ? "E" : "W"}`
: device?.device_location_coordinates || "";
const coordPayload = (!isNaN(latNum) && !isNaN(lngNum))
? { lat: latNum, lng: lngNum }
: (device?.device_location_coordinates || null);
try {
await api.put(`/devices/${id}`, { device_location: locName, device_location_coordinates: coordStr });
await api.put(`/devices/${id}`, { device_location: locName, device_location_coordinates: coordPayload });
await onSaved();
onClose();
} finally { setSaving(false); }
@@ -1408,11 +1408,21 @@ function playbackPlaceholderForId(seedValue) {
function parseCoordinates(coordStr) {
if (!coordStr) return null;
// Support plain { lat, lng } objects (from API returning GeoPoint as dict)
if (typeof coordStr === "object" && coordStr !== null) {
const lat = parseFloat(coordStr.lat ?? coordStr.latitude);
const lng = parseFloat(coordStr.lng ?? coordStr.longitude);
if (!isNaN(lat) && !isNaN(lng)) return { lat, lng };
return null;
}
const numbers = coordStr.match(/-?\d+(?:\.\d+)?/g);
if (numbers && numbers.length >= 2) {
const lat = parseFloat(numbers[0]);
const lng = parseFloat(numbers[1]);
let lat = parseFloat(numbers[0]);
let lng = parseFloat(numbers[1]);
if (!isNaN(lat) && !isNaN(lng)) {
// Restore sign from direction letters (legacy string format)
if (/\bS\b/.test(coordStr)) lat = -Math.abs(lat);
if (/\bW\b/.test(coordStr)) lng = -Math.abs(lng);
return { lat, lng };
}
}