diff --git a/src/shared/versions.ts b/src/shared/versions.ts
index 60f6293..0e320ed 100644
--- a/src/shared/versions.ts
+++ b/src/shared/versions.ts
@@ -1,6 +1,6 @@
export const HARBOR_VERSIONS = Object.freeze({
- macClient: '0.24.0',
- gatewayClient: '0.25.0',
+ macClient: '0.24.1',
+ gatewayClient: '0.25.1',
gatewayBackend: '0.25.0',
});
diff --git a/src/web/features/devices/DevicesPanel.tsx b/src/web/features/devices/DevicesPanel.tsx
index ae4e3c0..fb3ac1a 100644
--- a/src/web/features/devices/DevicesPanel.tsx
+++ b/src/web/features/devices/DevicesPanel.tsx
@@ -387,6 +387,7 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) {
const groupStart = group !== previousGroup;
const hasName = Boolean(device.alias || device.hostname);
const title = device.alias || device.hostname || device.ip || 'Неизвестное устройство';
+ const identityTooltipId = `device-identity-${device.id}`;
const editing = editingId === device.id;
const saving = savingId === device.id;
const seen = formatLastSeen(device.lastSeenAt);
@@ -452,7 +453,7 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) {
}
-
+
{editing ? (
setAlias(event.target.value)}
@@ -470,9 +472,10 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) {
}}
/>
) : hasName && }
{(hasName || (editing && Boolean(alias))) && device.ip && ·}
@@ -480,8 +483,10 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) {
className={`client-device-ip${copied ? feedback.failed ? ' is-copy-error' : ' is-copied' : ''}`}
type="button"
aria-label={`Скопировать IP ${device.ip} устройства ${title}`}
+ aria-describedby={identityTooltipId}
onClick={() => copyDeviceIp(device)}
>{device.ip} : !hasName && !editing && Неизвестное устройство}
+ Hostname: {device.hostname || '—'} · MAC: {device.mac}
{!hasName && !editing &&