@rapidmx/web-client 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +381 -381
- package/apps/admin/branding/index.tsx +39 -39
- package/apps/admin/data-requests/index.tsx +482 -482
- package/apps/admin/domains/[uid].tsx +166 -166
- package/apps/admin/escrow-scopes/[uid].tsx +350 -350
- package/apps/admin/index.tsx +129 -129
- package/apps/admin/mailboxes/[uid].tsx +271 -271
- package/apps/admin/mailboxes/new/index.tsx +30 -30
- package/apps/admin/plugins/index.tsx +15 -15
- package/apps/admin/retention-policy/index.tsx +39 -39
- package/apps/admin/signing-certificates/index.tsx +343 -343
- package/apps/escrow/audit-log/index.tsx +196 -196
- package/apps/escrow/matters/[uid].tsx +621 -621
- package/apps/shared/auth/adminAccess.ts +99 -99
- package/apps/shared/components/admin/diagnostics/HostCard.tsx +2 -0
- package/apps/shared/components/admin/diagnostics/PressureTiles.tsx +108 -0
- package/apps/shared/components/admin/diagnostics/PvcTable.tsx +20 -6
- package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +21 -2
- package/apps/shared/components/admin/layout/AdminShell.tsx +384 -384
- package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +238 -238
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +152 -152
- package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +194 -194
- package/apps/shared/components/admin/settings/BrandingForm.tsx +423 -423
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +119 -119
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +198 -198
- package/apps/shared/components/admin/settings/PluginsManager.tsx +2093 -1545
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +182 -182
- package/apps/shared/components/admin/settings/pluginPreferences.ts +34 -0
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +288 -288
- package/apps/shared/components/admin/setup/SetupWizard.tsx +446 -446
- package/apps/shared/components/admin/usePagedList.tsx +129 -129
- package/apps/shared/components/calendar/EventModal.tsx +206 -206
- package/apps/shared/components/calendar/MonthView.tsx +185 -185
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +227 -227
- package/apps/shared/components/calendar/SplitDayView.tsx +144 -144
- package/apps/shared/components/calendar/TimeGridView.tsx +246 -246
- package/apps/shared/components/calendar/allDay.ts +124 -124
- package/apps/shared/components/contacts/ContactForm.tsx +383 -383
- package/apps/shared/components/contacts/ContactsToolbar.tsx +103 -103
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +155 -155
- package/apps/shared/components/layout/AppShell.tsx +461 -461
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +398 -398
- package/apps/shared/components/layout/MailboxProvisioning.tsx +168 -168
- package/apps/shared/components/layout/ResponsiveToolbar.tsx +315 -315
- package/apps/shared/components/layout/ThemeSwitch.tsx +84 -84
- package/apps/shared/components/layout/UserMenu.tsx +439 -439
- package/apps/shared/components/mail/ConversationList.tsx +332 -323
- package/apps/shared/components/mail/ConversationThreadPane.tsx +613 -613
- package/apps/shared/components/mail/MailSelectionBar.tsx +240 -240
- package/apps/shared/components/mail/MenuButton.tsx +404 -404
- package/apps/shared/components/mail/MessageDetailPane.tsx +1757 -1757
- package/apps/shared/components/mail/compose/ComposeContext.tsx +312 -312
- package/apps/shared/components/mail/compose/ComposeToolbar.tsx +422 -422
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +1681 -1681
- package/apps/shared/components/mail/compose/RichTextEditor.tsx +147 -147
- package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -60
- package/apps/shared/components/mail/compose/quotedBody.ts +161 -161
- package/apps/shared/components/mail/listPreferences.ts +3 -3
- package/apps/shared/components/mail/reading/MessageMoreMenu.tsx +258 -258
- package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +79 -79
- package/apps/shared/components/mail/reading/messageExport.ts +59 -59
- package/apps/shared/components/mail/reading/printMessage.ts +99 -99
- package/apps/shared/components/mail/reading/useMessageActions.ts +443 -443
- package/apps/shared/components/mail/verificationSeals.ts +125 -125
- package/apps/shared/components/rules/RuleBuilder.tsx +311 -311
- package/apps/shared/components/settings/SigningCertificateCard.tsx +344 -344
- package/apps/shared/keyboard/GlobalShortcuts.tsx +51 -51
- package/apps/shared/keyboard/ShortcutProvider.tsx +62 -62
- package/apps/shared/keyboard/ShortcutsDialog.tsx +84 -84
- package/apps/shared/keyboard/dispatch.ts +124 -124
- package/apps/shared/keyboard/format.ts +89 -89
- package/apps/shared/keyboard/keymap.ts +114 -114
- package/apps/shared/keyboard/registry.ts +65 -65
- package/apps/shared/keyboard/targets.ts +79 -79
- package/apps/shared/mail/folderOfType.ts +49 -49
- package/apps/shared/mail/folderTree.ts +143 -143
- package/apps/shared/mail/listAllPages.ts +39 -39
- package/apps/shared/mail/newMailNotifications.ts +171 -171
- package/apps/shared/mail/outbox/sendJob.ts +445 -445
- package/apps/shared/mail/outbox/sendOutcomes.ts +155 -155
- package/apps/shared/mail/reportNotices.ts +66 -66
- package/apps/shared/mail/senderBlocking.ts +141 -141
- package/apps/shared/mail/useMailConnection.ts +205 -205
- package/apps/shared/mail/useMailLiveUpdates.ts +277 -277
- package/apps/shared/mail/useMailboxUpdateAccess.ts +60 -60
- package/apps/shared/mail/useMarkMessageRead.ts +47 -47
- package/apps/shared/mail/useNewMailNotifications.ts +178 -178
- package/apps/shared/notifications/store.ts +560 -560
- package/apps/shared/search/LocalIndexLifecycle.tsx +114 -114
- package/apps/shared/search/localIndexBuilder.ts +481 -481
- package/apps/shared/signing/enrollmentStorage.ts +33 -33
- package/apps/shared/signing/enrollmentTracker.ts +385 -385
- package/apps/shared/signing/enrollmentView.ts +251 -251
- package/apps/shared/signing/useNow.ts +19 -19
- package/apps/shared/signing/useSigningEnrollmentWatcher.ts +90 -90
- package/apps/shared/styles/app.css +396 -396
- package/apps/www/calendar/index.tsx +581 -581
- package/apps/www/contacts/[uid].tsx +112 -112
- package/apps/www/index.tsx +3012 -2962
- package/apps/www/messages/[uid].tsx +139 -139
- package/apps/www/settings/auto-reply/index.tsx +136 -136
- package/apps/www/settings/blocked-senders/index.tsx +303 -303
- package/apps/www/settings/encryption/index.tsx +1290 -1290
- package/apps/www/settings/filters/[uid].tsx +179 -179
- package/apps/www/settings/filters/index.tsx +105 -105
- package/apps/www/settings/filters/new/index.tsx +165 -165
- package/apps/www/settings/labels/index.tsx +207 -207
- package/apps/www/settings/privacy/index.tsx +495 -495
- package/apps/www/settings/profile/index.tsx +251 -251
- package/apps/www/settings/read-receipts/index.tsx +150 -150
- package/apps/www/settings/sharing/index.tsx +259 -259
- package/apps/www/settings/signatures/[uid].tsx +175 -175
- package/apps/www/settings/signatures/index.tsx +91 -91
- package/apps/www/settings/signatures/new/index.tsx +138 -138
- package/apps/www/tasks/index.tsx +654 -654
- package/dist/apps/shared/components/admin/diagnostics/HostCard.js +2 -1
- package/dist/apps/shared/components/admin/diagnostics/PressureTiles.d.ts +22 -0
- package/dist/apps/shared/components/admin/diagnostics/PressureTiles.js +52 -0
- package/dist/apps/shared/components/admin/diagnostics/PvcTable.js +9 -4
- package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.d.ts +35 -2
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +3 -3
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +328 -48
- package/dist/apps/shared/components/admin/settings/pluginPreferences.d.ts +2 -0
- package/dist/apps/shared/components/admin/settings/pluginPreferences.js +35 -0
- package/dist/apps/shared/components/mail/ConversationList.d.ts +10 -3
- package/dist/apps/shared/components/mail/ConversationList.js +9 -5
- package/dist/apps/shared/components/mail/listPreferences.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.js +11 -11
- package/dist/apps/shared/styles/app.css +396 -396
- package/dist/apps/www/index.js +51 -10
- package/package.json +2 -2
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { formatBytes, formatCores, formatPercent, NO_VALUE, percentOf } from "./format.js";
|
|
3
3
|
import { seriesOf } from "./metricsHistory.js";
|
|
4
4
|
import MetricTile from "./MetricTile.js";
|
|
5
|
+
import PressureTiles from "./PressureTiles.js";
|
|
5
6
|
import UsageMeter from "./UsageMeter.js";
|
|
6
7
|
const percentLabel = (value) => formatPercent(value);
|
|
7
8
|
/** `1.23, 0.98, 0.5`, or a dash for a load average the server left out. */
|
|
@@ -29,5 +30,5 @@ export default function HostCard({ host, history }) {
|
|
|
29
30
|
values: seriesOf(history, (sample) => percentOf(sample.host?.memoryUsedBytes, sample.host?.memoryTotalBytes)),
|
|
30
31
|
max: 100,
|
|
31
32
|
format: percentLabel,
|
|
32
|
-
} }), _jsx(MetricTile, { label: "Load average", value: formatLoad(host.loadAverage), detail: "1, 5 and 15 minutes" })] }), _jsx("h3", { className: "mt-4 mb-2 text-xs uppercase tracking-wide text-text-muted", children: "Disks" }), disks.length === 0 ? (_jsx("p", { className: "text-sm text-text-muted", children: "No disks were reported." })) : (_jsx("ul", { className: "grid grid-cols-1 gap-3 md:grid-cols-2", children: disks.map((disk) => (_jsx(DiskRow, { disk: disk }, disk.path))) }))] }))] }));
|
|
33
|
+
} }), _jsx(MetricTile, { label: "Load average", value: formatLoad(host.loadAverage), detail: "1, 5 and 15 minutes" })] }), _jsx(PressureTiles, { host: host, history: history }), _jsx("h3", { className: "mt-4 mb-2 text-xs uppercase tracking-wide text-text-muted", children: "Disks" }), disks.length === 0 ? (_jsx("p", { className: "text-sm text-text-muted", children: "No disks were reported." })) : (_jsx("ul", { className: "grid grid-cols-1 gap-3 md:grid-cols-2", children: disks.map((disk) => (_jsx(DiskRow, { disk: disk }, disk.path))) }))] }))] }));
|
|
33
34
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { DiagnosticsMetrics } from "./diagnosticsApi.js";
|
|
3
|
+
/** From this share of the last 10 seconds spent stalled, pressure is called elevated ... */
|
|
4
|
+
export declare const ELEVATED_PRESSURE_PERCENT = 10;
|
|
5
|
+
/** ... and from this, high. Kernel documentation treats a few percent as ordinary and tens of percent as a machine that is struggling. */
|
|
6
|
+
export declare const HIGH_PRESSURE_PERCENT = 30;
|
|
7
|
+
export type PressureLevel = "Low" | "Elevated" | "High";
|
|
8
|
+
/** Pressure in words, so that it is never only a number or a colour. */
|
|
9
|
+
export declare function pressureLevel(percent: number): PressureLevel;
|
|
10
|
+
type Host = NonNullable<DiagnosticsMetrics["host"]>;
|
|
11
|
+
export interface PressureTilesProps {
|
|
12
|
+
host: Host;
|
|
13
|
+
history: DiagnosticsMetrics[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* How stalled the node is (Linux pressure stall information: the share of recent time tasks spent waiting for memory, the disk or
|
|
17
|
+
* a CPU), and how much memory the hypervisor holds in the machine's balloon. Both explain a node that is slow while nothing on it
|
|
18
|
+
* uses much: a guest counts ballooned memory as used though no process holds it, and a machine short of memory stalls on the disk.
|
|
19
|
+
* Nothing is shown where the kernel gives no such figures.
|
|
20
|
+
*/
|
|
21
|
+
export default function PressureTiles({ host, history }: PressureTilesProps): React.JSX.Element | null;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { formatBytes, formatPercent, percentOf } from "./format.js";
|
|
3
|
+
import { seriesOf } from "./metricsHistory.js";
|
|
4
|
+
import MetricTile from "./MetricTile.js";
|
|
5
|
+
/** From this share of the last 10 seconds spent stalled, pressure is called elevated ... */
|
|
6
|
+
export const ELEVATED_PRESSURE_PERCENT = 10;
|
|
7
|
+
/** ... and from this, high. Kernel documentation treats a few percent as ordinary and tens of percent as a machine that is struggling. */
|
|
8
|
+
export const HIGH_PRESSURE_PERCENT = 30;
|
|
9
|
+
/** Pressure in words, so that it is never only a number or a colour. */
|
|
10
|
+
export function pressureLevel(percent) {
|
|
11
|
+
if (percent >= HIGH_PRESSURE_PERCENT) {
|
|
12
|
+
return "High";
|
|
13
|
+
}
|
|
14
|
+
return percent >= ELEVATED_PRESSURE_PERCENT ? "Elevated" : "Low";
|
|
15
|
+
}
|
|
16
|
+
const RESOURCES = [
|
|
17
|
+
{ key: "memory", label: "Memory pressure", waiting: "waiting for memory" },
|
|
18
|
+
{ key: "io", label: "I/O pressure", waiting: "waiting for the disk" },
|
|
19
|
+
{ key: "cpu", label: "CPU pressure", waiting: "waiting for a CPU" },
|
|
20
|
+
];
|
|
21
|
+
function PressureTile({ label, waiting, stall, history, resource }) {
|
|
22
|
+
const level = pressureLevel(stall.some.avg10);
|
|
23
|
+
return (_jsx(MetricTile, { label: label, value: formatPercent(stall.some.avg10), detail: `${level}: tasks ${waiting}, last 10 seconds`, history: {
|
|
24
|
+
values: seriesOf(history, (sample) => sample.host?.pressure?.[resource]?.some.avg10),
|
|
25
|
+
max: 100,
|
|
26
|
+
format: formatPercent,
|
|
27
|
+
}, children: _jsxs("div", { className: "mt-2 text-xs text-text-muted", children: ["Last minute ", formatPercent(stall.some.avg60), ", last 5 minutes ", formatPercent(stall.some.avg300), stall.full && ` · every task waiting: ${formatPercent(stall.full.avg10)}`] }) }));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* How stalled the node is (Linux pressure stall information: the share of recent time tasks spent waiting for memory, the disk or
|
|
31
|
+
* a CPU), and how much memory the hypervisor holds in the machine's balloon. Both explain a node that is slow while nothing on it
|
|
32
|
+
* uses much: a guest counts ballooned memory as used though no process holds it, and a machine short of memory stalls on the disk.
|
|
33
|
+
* Nothing is shown where the kernel gives no such figures.
|
|
34
|
+
*/
|
|
35
|
+
export default function PressureTiles({ host, history }) {
|
|
36
|
+
const tiles = RESOURCES.filter(({ key }) => host.pressure?.[key]);
|
|
37
|
+
const balloon = host.balloon;
|
|
38
|
+
if (tiles.length === 0 && !balloon) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const heldPercent = percentOf(balloon?.heldBytes, host.memoryTotalBytes);
|
|
42
|
+
return (_jsxs(_Fragment, { children: [_jsx("h3", { className: "mt-4 mb-2 text-xs uppercase tracking-wide text-text-muted", children: "Pressure" }), _jsxs("div", { className: "grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-4", children: [RESOURCES.map(({ key, label, waiting }) => {
|
|
43
|
+
const stall = host.pressure?.[key];
|
|
44
|
+
return stall && _jsx(PressureTile, { label: label, waiting: waiting, stall: stall, history: history, resource: key }, key);
|
|
45
|
+
}), balloon && (_jsx(MetricTile, { label: "Held by the hypervisor", value: formatBytes(balloon.heldBytes), detail: `of ${formatBytes(host.memoryTotalBytes)}`, usage: heldPercent === undefined
|
|
46
|
+
? undefined
|
|
47
|
+
: { percent: heldPercent, detail: `${formatBytes(balloon.heldBytes)} in the memory balloon`, flag: false }, history: {
|
|
48
|
+
values: seriesOf(history, (sample) => sample.host?.balloon?.heldBytes),
|
|
49
|
+
max: host.memoryTotalBytes,
|
|
50
|
+
format: formatBytes,
|
|
51
|
+
}, children: _jsxs("div", { className: "mt-2 text-xs text-text-muted", children: ["Memory the hypervisor has taken back through the balloon. It counts as used above though no process holds it.", " ", formatBytes(balloon.inflatedTotalBytes), " taken since the node booted."] }) }))] })] }));
|
|
52
|
+
}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { formatBytes, NO_VALUE, percentOf } from "./format.js";
|
|
3
3
|
import UsageMeter from "./UsageMeter.js";
|
|
4
|
-
const HEADINGS = ["Volume", "Phase", "Storage class", "
|
|
4
|
+
const HEADINGS = ["Volume", "Phase", "Storage class", "Allocated", "Usage"];
|
|
5
5
|
function Usage({ pvc }) {
|
|
6
6
|
if (!pvc.mountedByServer) {
|
|
7
7
|
return _jsx("span", { className: "text-text-muted", children: "Usage not available: not mounted in the server pod." });
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
// On the node's disk the filesystem's figures are the disk's, so only a measured directory says what the volume holds (an
|
|
10
|
+
// older server sent the disk's figures without saying so).
|
|
11
|
+
const own = pvc.sharesNodeDisk && pvc.measuredBy !== "directory" ? undefined : pvc.usedBytes;
|
|
12
|
+
const percent = percentOf(own, pvc.capacityBytes);
|
|
10
13
|
if (percent === undefined) {
|
|
11
|
-
return _jsx("span", { className: "text-text-muted", children:
|
|
14
|
+
return (_jsx("span", { className: "text-text-muted", children: pvc.sharesNodeDisk
|
|
15
|
+
? "Shares the node\u2019s disk, and what the volume holds could not be measured."
|
|
16
|
+
: "The server has no usage figures for this volume." }));
|
|
12
17
|
}
|
|
13
|
-
return (_jsxs("div", { children: [_jsx(UsageMeter, { label: `Usage of volume ${pvc.name}`, percent: percent, detail: `${formatBytes(
|
|
18
|
+
return (_jsxs("div", { children: [_jsx(UsageMeter, { label: `Usage of volume ${pvc.name}`, percent: percent, detail: `${pvc.usedPartial ? "At least " : ""}${formatBytes(own)} of ${formatBytes(pvc.capacityBytes)} allocated` }), pvc.usedPartial && (_jsx("p", { className: "mt-1 text-xs text-text-muted", children: "The volume is too large to measure completely, so this is a lower bound." })), pvc.sharesNodeDisk && (_jsxs("p", { className: "mt-1 text-xs text-text-muted", children: ["Measured from the volume\u2019s directory. It shares the node\u2019s disk, which has ", formatBytes(pvc.availableBytes), " free; the volume\u2019s allocation is not enforced."] }))] }));
|
|
14
19
|
}
|
|
15
20
|
/** The install's persistent volume claims, with a usage bar for the ones the server can measure. */
|
|
16
21
|
export default function PvcTable({ pvcs }) {
|
|
@@ -107,8 +107,35 @@ export interface DiagnosticsHostMetrics {
|
|
|
107
107
|
memoryTotalBytes: number;
|
|
108
108
|
memoryUsedBytes: number;
|
|
109
109
|
loadAverage: [number, number, number];
|
|
110
|
+
/**
|
|
111
|
+
* Memory the hypervisor holds in the machine's memory balloon. It counts in `memoryUsedBytes` (a guest sees ballooned memory
|
|
112
|
+
* as used) though no process holds it. Absent where no balloon has ever taken any.
|
|
113
|
+
*/
|
|
114
|
+
balloon?: {
|
|
115
|
+
heldBytes: number;
|
|
116
|
+
inflatedTotalBytes: number;
|
|
117
|
+
};
|
|
118
|
+
/** How stalled the node is waiting for memory, disk and CPU (Linux pressure stall information). Absent without kernel support. */
|
|
119
|
+
pressure?: {
|
|
120
|
+
memory?: DiagnosticsPressure;
|
|
121
|
+
io?: DiagnosticsPressure;
|
|
122
|
+
cpu?: DiagnosticsPressure;
|
|
123
|
+
};
|
|
110
124
|
disks: DiagnosticsDiskMetrics[];
|
|
111
125
|
}
|
|
126
|
+
/** The share (0 to 100) of the last 10, 60 and 300 seconds that tasks were stalled. `some`: at least one waited. `full`: every one did. */
|
|
127
|
+
export interface DiagnosticsPressure {
|
|
128
|
+
some: {
|
|
129
|
+
avg10: number;
|
|
130
|
+
avg60: number;
|
|
131
|
+
avg300: number;
|
|
132
|
+
};
|
|
133
|
+
full?: {
|
|
134
|
+
avg10: number;
|
|
135
|
+
avg60: number;
|
|
136
|
+
avg300: number;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
112
139
|
/** From the metrics API (metrics-server): absent when it is not installed. */
|
|
113
140
|
export interface DiagnosticsPodMetrics {
|
|
114
141
|
name: string;
|
|
@@ -117,8 +144,11 @@ export interface DiagnosticsPodMetrics {
|
|
|
117
144
|
memoryUsedBytes?: number;
|
|
118
145
|
}
|
|
119
146
|
/**
|
|
120
|
-
* `usedBytes
|
|
121
|
-
*
|
|
147
|
+
* `usedBytes` (what the volume holds) exists only for a volume the server pod mounts (`mountedByServer`), and `measuredBy`
|
|
148
|
+
* says how it was found: from the volume's own filesystem, or - when the volume is a directory of the node's disk
|
|
149
|
+
* (`sharesNodeDisk`, such as k3s's local-path), where the filesystem is the whole disk - by measuring the directory.
|
|
150
|
+
* `capacityBytes` is the volume's allocation, which a volume that shares the node's disk does not enforce; `availableBytes` is
|
|
151
|
+
* what is left of the filesystem it is on.
|
|
122
152
|
*/
|
|
123
153
|
export interface DiagnosticsPvcMetrics {
|
|
124
154
|
name: string;
|
|
@@ -128,6 +158,9 @@ export interface DiagnosticsPvcMetrics {
|
|
|
128
158
|
capacityBytes?: number;
|
|
129
159
|
usedBytes?: number;
|
|
130
160
|
availableBytes?: number;
|
|
161
|
+
measuredBy?: "filesystem" | "directory";
|
|
162
|
+
/** The directory could not be measured completely, so `usedBytes` is a lower bound. */
|
|
163
|
+
usedPartial?: boolean;
|
|
131
164
|
mountedByServer: boolean;
|
|
132
165
|
sharesNodeDisk?: boolean;
|
|
133
166
|
}
|
|
@@ -12,9 +12,9 @@ import CopyButton from "@rapidmx/react-shared/components/buttons/CopyButton.js";
|
|
|
12
12
|
const INPUT_CLASS = "w-full text-sm py-2 px-3 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary";
|
|
13
13
|
const MAX_UPLOAD_BYTES = 5 * 1024 * 1024;
|
|
14
14
|
/** A header that uses both variables - the snippet the Branding page offers to copy. */
|
|
15
|
-
export const HEADER_HTML_EXAMPLE = `<div style="display:flex; align-items:center; justify-content:space-between; padding:0.5rem 1rem">
|
|
16
|
-
<span>{APP_TITLE}</span>
|
|
17
|
-
<span>{USER_MENU}</span>
|
|
15
|
+
export const HEADER_HTML_EXAMPLE = `<div style="display:flex; align-items:center; justify-content:space-between; padding:0.5rem 1rem">
|
|
16
|
+
<span>{APP_TITLE}</span>
|
|
17
|
+
<span>{USER_MENU}</span>
|
|
18
18
|
</div>`;
|
|
19
19
|
/** SVG logo/icon uploads are refused (the server refuses them too): an SVG served from this origin can carry script. */
|
|
20
20
|
export function isSvgFile(file) {
|