From a552e55c294457bf534d2b43254e5e810dd7dedd Mon Sep 17 00:00:00 2001 From: core Date: Mon, 18 May 2026 01:05:34 +0500 Subject: [PATCH] add hAP ac2 --- deploy/quick.deploy | 3 + frontend/src/components/DeviceMockup.tsx | 148 ++++++++++++++++++++++- 2 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 deploy/quick.deploy diff --git a/deploy/quick.deploy b/deploy/quick.deploy new file mode 100644 index 0000000..c19e8c9 --- /dev/null +++ b/deploy/quick.deploy @@ -0,0 +1,3 @@ +sudo apt install docker-compose-v2 git -y +git clone https://git.core.uz/mikrotik/ROSzetta.git +sudo docker compose up -d --build \ No newline at end of file diff --git a/frontend/src/components/DeviceMockup.tsx b/frontend/src/components/DeviceMockup.tsx index b193ad3..6b51554 100644 --- a/frontend/src/components/DeviceMockup.tsx +++ b/frontend/src/components/DeviceMockup.tsx @@ -14,6 +14,11 @@ export interface DeviceMockupProps { const isHapAcLite = (b?: string | null): boolean => !!b && /h\s*A\s*P\s*ac\s*lite/i.test(b); +// hAP ac² (RBD52G-5HacD2HnD): отличаем по цифре «2» / «²» после «ac», +// чтобы случайно не перехватить hAP ac lite. +const isHapAc2 = (b?: string | null): boolean => + !!b && (/h\s*A\s*P\s*ac\s*[²2]/i.test(b) || /RBD52G/i.test(b)); + const isHapLike = (b?: string | null): boolean => !!b && /\bh\s*A\s*P\b/i.test(b); const isRb5009 = (b?: string | null): boolean => @@ -49,7 +54,13 @@ function portColor(it: InterfaceInfo | undefined): { fill: string; stroke: strin } export default function DeviceMockup({ boardName, interfaces }: DeviceMockupProps) { - if (isHapAcLite(boardName) || (isHapLike(boardName) && interfaces.filter((it) => /^ether/.test(it.name)).length === 5)) { + if (isHapAcLite(boardName)) { + return ; + } + if (isHapAc2(boardName)) { + return ; + } + if (isHapLike(boardName) && interfaces.filter((it) => /^ether/.test(it.name)).length === 5) { return ; } if (isRb5009(boardName)) { @@ -228,6 +239,141 @@ function HapAcLiteMockup({ interfaces }: { interfaces: InterfaceInfo[] }) { ); } +// --------- hAP ac² --------- +// Чёрный пластиковый корпус (RBD52G-5HacD2HnD). +// Слева: DC 12-28V, утопленная кнопка res/wps, индикаторы pwr / usr. +// Справа: 5 GigE портов — ether1 «Internet/PoE in», ether2..ether5 «LAN». +// PoE-out нет (в отличие от hAP ac lite). + +function HapAc2Mockup({ interfaces }: { interfaces: InterfaceInfo[] }) { + const ports = [ + { name: 'ether1', label: '1', accent: 'poe-in' as const }, + { name: 'ether2', label: '2', accent: null as const }, + { name: 'ether3', label: '3', accent: null as const }, + { name: 'ether4', label: '4', accent: null as const }, + { name: 'ether5', label: '5', accent: null as const }, + ]; + + // Соотношение фото задней панели ~4.3:1. При height: 62px ширина ≈ 268px. + const W = 1180, H = 274; + const bodyR = 20; + const portW = 130, portH = 130; + const portGap = 14; + const firstPortX = 410; + const portsTopY = 60; + const lanStartX = firstPortX + portW + portGap; + const lanSpanW = 4 * portW + 3 * portGap; + + return ( +
+
+ Лицевая панель hAP ac² · подсветка портов в реальном времени +
+
+ + {/* Чёрный пластиковый корпус */} + + {/* Утопленная плашка отсека (чуть темнее, со внутренней тенью обводки) */} + + + {/* DC разъём */} + + + DC + 12-28V + + {/* res/wps — утопленная кнопка */} + + + res/wps + + {/* pwr LED */} + + pwr + + {/* usr LED */} + + usr + + {/* Цифры над портами */} + {ports.map((p, i) => { + const x = firstPortX + i * (portW + portGap); + return ( + + {p.label} + + ); + })} + + {/* Порты */} + {ports.map((p, i) => { + const x = firstPortX + i * (portW + portGap); + const it = findPort(interfaces, p.name); + const col = portColor(it); + return ( + + {/* Металлический ободок RJ45 */} + + {/* Внутренний экран — закрашивается под статус */} + + {/* RJ45 «зубчики» */} + + + {/* LED-индикатор линка */} + + {/* Имя интерфейса под портом — мелким шрифтом, чтобы не сливалось с подписями групп */} + + {p.name} + + + {p.name} (порт {p.label}){p.accent === 'poe-in' ? ' · Internet / PoE in' : ' · LAN'} + {'\n'}статус: {col.label} + {it?.comment ? `\ncomment: ${it.comment}` : ''} + {it?.mac_address ? `\nmac: ${it.mac_address}` : ''} + + + ); + })} + + {/* Группа Internet/PoE in под портом 1 */} + + + + + Internet/PoE in + + + {/* Группа LAN под портами 2-5 */} + + + + + LAN + + +
+ +
+ ); +} + // --------- RB5009UG+S+ --------- // Чёрный корпус, 8 GigE портов (ether1..ether8) + 1 SFP+ (sfp-sfpplus1). // Слева: DC jack 12-57V, кнопка R (reset), USB 3.0 порт.