diff --git a/src/shared/versions.js b/src/shared/versions.js index 4a767d0..4b00b42 100644 --- a/src/shared/versions.js +++ b/src/shared/versions.js @@ -1,6 +1,6 @@ export const HARBOR_VERSIONS = Object.freeze({ - macClient: '0.18.1', - gatewayClient: '0.19.1', + macClient: '0.18.2', + gatewayClient: '0.19.2', gatewayBackend: '0.19.0', }); diff --git a/src/web/components/ClientOverviewPage.jsx b/src/web/components/ClientOverviewPage.jsx index 2b19323..586c190 100644 --- a/src/web/components/ClientOverviewPage.jsx +++ b/src/web/components/ClientOverviewPage.jsx @@ -1426,25 +1426,6 @@ export function ClientOverviewPage({ - {isGateway &&
-
- Учтено Harbor - {formatByteString(globalTraffic?.totalBytes || '0')} -
-
- -
-
- {trafficSourceError - ? `Трафик не обновляется · последние данные ${trafficFreshness}` - : globalTraffic?.observedAt ? `Обновлено ${trafficFreshness}` : 'Ожидаем первые данные трафика'} -
-
} -
{!isGateway && ( @@ -1486,6 +1467,25 @@ export function ClientOverviewPage({
)} + {isGateway &&
+
+ Учтено Harbor + {formatByteString(globalTraffic?.totalBytes || '0')} +
+
+ +
+
+ {trafficSourceError + ? `Трафик не обновляется · последние данные ${trafficFreshness}` + : globalTraffic?.observedAt ? `Обновлено ${trafficFreshness}` : 'Ожидаем первые данные трафика'} +
+
} +
{ + const powerStart = overview.indexOf('
= 0 && trafficStart > powerStart, 'traffic summary follows the power section'); + assert.equal((powerPrefix.match(//g) || []).length, 'power section is closed before traffic summary'); + assert.equal((overview.match(/className="client-gateway-summary"/g) || []).length, 1); assert.doesNotMatch(overview, / assert.match(styles, /\.client-panel\.has-subscription \{[\s\S]*transform:\s*translateY\(-9vh\)/); assert.match(styles, /\.client-panel\.has-subscription \.client-power-section \{[\s\S]*height:\s*var\(--client-work-height\);[\s\S]*padding-top:\s*var\(--client-power-top\)/); assert.match(styles, /\.client-panel\.has-subscription \.client-form-content \{[\s\S]*padding-top:\s*var\(--client-power-top\)/); - assert.match(rule('.client-gateway-summary'), /width:\s*min\(300px, 100%\)/); - assert.doesNotMatch(rule('.client-gateway-summary'), /grid-column|justify-self|padding-right/); + assert.match(rule('.client-panel.is-gateway-home'), /grid-template-rows:\s*minmax\(0, 1fr\) auto[\s\S]*row-gap:\s*28px/); + assert.match(rule('.client-gateway-summary'), /grid-column:\s*1 \/ -1[\s\S]*grid-row:\s*2[\s\S]*justify-self:\s*center[\s\S]*width:\s*min\(480px, calc\(100% - 24px\)\)/); + assert.doesNotMatch(rule('.client-gateway-summary'), /background|border|box-shadow/); assert.match(rule('.client-gateway-route-slot'), /min-height:\s*16px[\s\S]*overflow:\s*hidden[\s\S]*text-overflow:\s*ellipsis[\s\S]*white-space:\s*nowrap/); assert.match(component, /client-panel\$\{showPower \? '' : ' is-setup'\}[\s\S]*is-gateway-home/); assert.match(component, /const showPower = isGateway \|\| \(hasSubscription && Boolean\(selectedServerId\)\)/); @@ -74,7 +75,7 @@ test('tablet and mobile regions use normal flow with viewport-safe widths', () = assert.match(responsive, /grid-template-columns:\s*minmax\(0, 1fr\)/); assert.match(responsive, /\.client-power-section,[\s\S]*\.client-form,[\s\S]*grid-column:\s*1/); assert.match(responsive, /\.client-power-section \{[\s\S]*order:\s*1/); - assert.doesNotMatch(responsive, /\.client-gateway-summary/); + assert.match(responsive, /\.client-gateway-summary \{[\s\S]*grid-row:\s*auto;[\s\S]*order:\s*2/); assert.match(responsive, /width:\s*min\(100%, 380px\)/); assert.match(responsive, /max-height:\s*none/); assert.match(responsive, /overflow-y:\s*visible/);