quidproquo-web-admin 0.1.14 → 0.1.16
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/lib/commonjs/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.js +1 -0
- package/lib/commonjs/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.js.map +1 -1
- package/lib/commonjs/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js +1 -0
- package/lib/commonjs/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js.map +1 -1
- package/lib/commonjs/Maintenance/MaintenanceEditor.js +1 -1
- package/lib/commonjs/Maintenance/MaintenanceEditor.js.map +1 -1
- package/lib/esm/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.js +1 -0
- package/lib/esm/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.js.map +1 -1
- package/lib/esm/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js +1 -0
- package/lib/esm/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js.map +1 -1
- package/lib/esm/Maintenance/MaintenanceEditor.js +1 -1
- package/lib/esm/Maintenance/MaintenanceEditor.js.map +1 -1
- package/package.json +7 -7
|
@@ -4,6 +4,7 @@ const quidproquo_core_1 = require("quidproquo-core");
|
|
|
4
4
|
const coreGuidActionComponentMap = {
|
|
5
5
|
[quidproquo_core_1.GuidActionType.New]: ['askNewGuid'],
|
|
6
6
|
[quidproquo_core_1.GuidActionType.NewSortable]: ['askNewSortableGuid'],
|
|
7
|
+
[quidproquo_core_1.GuidActionType.NewSortableMany]: ['askNewSortableGuids', 'count'],
|
|
7
8
|
};
|
|
8
9
|
exports.default = coreGuidActionComponentMap;
|
|
9
10
|
//# sourceMappingURL=coreGuidActionComponentMap.js.map
|
package/lib/commonjs/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coreGuidActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.ts"],"names":[],"mappings":";;AAAA,qDAAiD;AAEjD,MAAM,0BAA0B,GAA6B;IAC3D,CAAC,gCAAc,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;IACpC,CAAC,gCAAc,CAAC,WAAW,CAAC,EAAE,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"coreGuidActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.ts"],"names":[],"mappings":";;AAAA,qDAAiD;AAEjD,MAAM,0BAA0B,GAA6B;IAC3D,CAAC,gCAAc,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;IACpC,CAAC,gCAAc,CAAC,WAAW,CAAC,EAAE,CAAC,oBAAoB,CAAC;IACpD,CAAC,gCAAc,CAAC,eAAe,CAAC,EAAE,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACnE,CAAC;AAEF,kBAAe,0BAA0B,CAAC","sourcesContent":["import { GuidActionType } from 'quidproquo-core';\n\nconst coreGuidActionComponentMap: Record<string, string[]> = {\n [GuidActionType.New]: ['askNewGuid'],\n [GuidActionType.NewSortable]: ['askNewSortableGuid'],\n [GuidActionType.NewSortableMany]: ['askNewSortableGuids', 'count'],\n};\n\nexport default coreGuidActionComponentMap;\n"]}
|
package/lib/commonjs/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js
CHANGED
|
@@ -5,6 +5,7 @@ const quidproquo_core_1 = require("quidproquo-core");
|
|
|
5
5
|
exports.coreKeyValueStoreActionComponentMap = {
|
|
6
6
|
[quidproquo_core_1.KeyValueStoreActionType.Query]: ['askKeyValueStoreQuery', 'keyValueStoreName', 'keyCondition', 'options'],
|
|
7
7
|
[quidproquo_core_1.KeyValueStoreActionType.Upsert]: ['askKeyValueStoreUpsert', 'keyValueStoreName', 'item', 'options'],
|
|
8
|
+
[quidproquo_core_1.KeyValueStoreActionType.UpsertMany]: ['askKeyValueStoreUpsertMany', 'keyValueStoreName', 'items', 'options'],
|
|
8
9
|
[quidproquo_core_1.KeyValueStoreActionType.Get]: ['askKeyValueStoreGet', 'keyValueStoreName', 'key', 'options'],
|
|
9
10
|
[quidproquo_core_1.KeyValueStoreActionType.GetAll]: ['askKeyValueStoreGetAll', 'keyValueStoreName', 'options'],
|
|
10
11
|
[quidproquo_core_1.KeyValueStoreActionType.Delete]: ['askKeyValueStoreDelete', 'keyValueStoreName', 'key', 'sortKey', 'options'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coreKeyValueStoreActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.ts"],"names":[],"mappings":";;;AAAA,qDAA0D;AAE7C,QAAA,mCAAmC,GAA6B;IAC3E,CAAC,yCAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,cAAc,EAAE,SAAS,CAAC;IAC1G,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,CAAC;IACpG,CAAC,yCAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,CAAC;IAC7F,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,CAAC;IAC5F,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IAC9G,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IACzH,CAAC,yCAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,CAAC;CAChH,CAAC;AAEF,kBAAe,2CAAmC,CAAC","sourcesContent":["import { KeyValueStoreActionType } from 'quidproquo-core';\n\nexport const coreKeyValueStoreActionComponentMap: Record<string, string[]> = {\n [KeyValueStoreActionType.Query]: ['askKeyValueStoreQuery', 'keyValueStoreName', 'keyCondition', 'options'],\n [KeyValueStoreActionType.Upsert]: ['askKeyValueStoreUpsert', 'keyValueStoreName', 'item', 'options'],\n [KeyValueStoreActionType.Get]: ['askKeyValueStoreGet', 'keyValueStoreName', 'key', 'options'],\n [KeyValueStoreActionType.GetAll]: ['askKeyValueStoreGetAll', 'keyValueStoreName', 'options'],\n [KeyValueStoreActionType.Delete]: ['askKeyValueStoreDelete', 'keyValueStoreName', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Update]: ['askKeyValueStoreUpdate', 'keyValueStoreName', 'updates', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Scan]: ['askKeyValueStoreScan', 'keyValueStoreName', 'filterCondition', 'nextPageKey'],\n};\n\nexport default coreKeyValueStoreActionComponentMap;\n"]}
|
|
1
|
+
{"version":3,"file":"coreKeyValueStoreActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.ts"],"names":[],"mappings":";;;AAAA,qDAA0D;AAE7C,QAAA,mCAAmC,GAA6B;IAC3E,CAAC,yCAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,cAAc,EAAE,SAAS,CAAC;IAC1G,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,CAAC;IACpG,CAAC,yCAAuB,CAAC,UAAU,CAAC,EAAE,CAAC,4BAA4B,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,CAAC;IAC7G,CAAC,yCAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,CAAC;IAC7F,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,CAAC;IAC5F,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IAC9G,CAAC,yCAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IACzH,CAAC,yCAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,CAAC;CAChH,CAAC;AAEF,kBAAe,2CAAmC,CAAC","sourcesContent":["import { KeyValueStoreActionType } from 'quidproquo-core';\n\nexport const coreKeyValueStoreActionComponentMap: Record<string, string[]> = {\n [KeyValueStoreActionType.Query]: ['askKeyValueStoreQuery', 'keyValueStoreName', 'keyCondition', 'options'],\n [KeyValueStoreActionType.Upsert]: ['askKeyValueStoreUpsert', 'keyValueStoreName', 'item', 'options'],\n [KeyValueStoreActionType.UpsertMany]: ['askKeyValueStoreUpsertMany', 'keyValueStoreName', 'items', 'options'],\n [KeyValueStoreActionType.Get]: ['askKeyValueStoreGet', 'keyValueStoreName', 'key', 'options'],\n [KeyValueStoreActionType.GetAll]: ['askKeyValueStoreGetAll', 'keyValueStoreName', 'options'],\n [KeyValueStoreActionType.Delete]: ['askKeyValueStoreDelete', 'keyValueStoreName', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Update]: ['askKeyValueStoreUpdate', 'keyValueStoreName', 'updates', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Scan]: ['askKeyValueStoreScan', 'keyValueStoreName', 'filterCondition', 'nextPageKey'],\n};\n\nexport default coreKeyValueStoreActionComponentMap;\n"]}
|
|
@@ -40,7 +40,7 @@ function MaintenanceEditor({ docId, onBack }) {
|
|
|
40
40
|
const [error, setError] = (0, react_1.useState)(null);
|
|
41
41
|
const [busy, setBusy] = (0, react_1.useState)(false);
|
|
42
42
|
const [dialog, setDialog] = (0, react_1.useState)({ kind: 'closed' });
|
|
43
|
-
const folded = (0, react_1.useMemo)(() => (events ? quidproquo_features_1.maintenanceEventDoc.fold(events) : null), [events]);
|
|
43
|
+
const folded = (0, react_1.useMemo)(() => (events ? quidproquo_features_1.maintenanceEventDoc.views.document.fold(events) : null), [events]);
|
|
44
44
|
const isClosed = (folded === null || folded === void 0 ? void 0 : folded.status) === quidproquo_features_1.EventDocStatus.Published;
|
|
45
45
|
(0, react_1.useEffect)(() => {
|
|
46
46
|
const load = () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaintenanceEditor.js","sourceRoot":"","sources":["../../../src/Maintenance/MaintenanceEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from 'quidproquo-core';\nimport {\n EventDocEffect,\n EventDocEvent,\n EventDocStatus,\n isMaintenancePubliclyVisible,\n MaintenanceEffect,\n maintenanceEventDoc,\n MaintenanceLevel,\n MaintenanceType,\n MaintenanceUpdateEntry,\n toMaintenancePublicState,\n} from 'quidproquo-features';\nimport { useAuthAccessToken, useBaseUrlResolvers } from 'quidproquo-web-react';\n\nimport { useEffect, useMemo, useState } from 'react';\nimport AddIcon from '@mui/icons-material/Add';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport EditIcon from '@mui/icons-material/Edit';\nimport EngineeringIcon from '@mui/icons-material/Engineering';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n CircularProgress,\n Divider,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\n\nimport { appendMaintenanceEvent, fetchMaintenanceEvents } from './logic';\nimport { MaintenanceUserPreview } from './MaintenanceUserPreview';\nimport { MaintenanceUpdateFormPrefill, MaintenanceUpdateFormValues, UpdateDialog } from './UpdateDialog';\n\ntype MaintenanceEditorProps = {\n docId: string;\n onBack: () => void;\n};\n\ntype DialogMode = { kind: 'closed' } | { kind: 'add' } | { kind: 'edit'; update: MaintenanceUpdateEntry } | { kind: 'reopen' };\n\n// One maintenance: a read-only header card with the CURRENT folded state, and\n// the update feed it derives from. The UPDATE is the only mutation — adding one\n// (prefilled from the last, ETA blank against the running clock) moves the whole\n// status; editing/deleting entries re-derives, so deleting the newest rolls the\n// card back. Closing publishes; reopening demands a fresh update (level resets\n// to Low in the prefill) so a maintenance closed at High never reopens locked.\nexport function MaintenanceEditor({ docId, onBack }: MaintenanceEditorProps) {\n const urlResolvers = useBaseUrlResolvers();\n const accessToken = useAuthAccessToken();\n\n const [events, setEvents] = useState<EventDocEvent[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [dialog, setDialog] = useState<DialogMode>({ kind: 'closed' });\n\n const folded = useMemo(() => (events ? maintenanceEventDoc.fold(events) : null), [events]);\n const isClosed = folded?.status === EventDocStatus.Published;\n\n useEffect(() => {\n const load = async () => {\n setError(null);\n try {\n setEvents(await fetchMaintenanceEvents(docId, urlResolvers.getApiUrl(), accessToken));\n } catch (loadError) {\n setError(`Failed to load maintenance: ${loadError}`);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [docId]);\n\n const applyEvent = async (type: string, data: unknown): Promise<boolean> => {\n setBusy(true);\n setError(null);\n try {\n const event = await appendMaintenanceEvent(docId, type, data, urlResolvers.getApiUrl(), accessToken);\n setEvents((prev) => (prev ? [...prev, event] : [event]));\n return true;\n } catch (appendError) {\n setError(`Failed to save change: ${appendError}`);\n return false;\n } finally {\n setBusy(false);\n }\n };\n\n if (!folded) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 6 }}>{error ? <Alert severity=\"error\">{error}</Alert> : <CircularProgress />}</Box>\n );\n }\n\n const updatesNewestFirst = [...folded.updates].reverse();\n const lastUpdate: Nullable<MaintenanceUpdateEntry> = folded.updates[folded.updates.length - 1] ?? null;\n\n const addPrefill: MaintenanceUpdateFormPrefill = {\n bannerText: folded.bannerText,\n reason: folded.reason,\n level: folded.level,\n maintenanceType: folded.maintenanceType,\n affectedServices: folded.affectedServices,\n internalNotes: '',\n };\n\n // Reopen is \"create from inside\": reason/type/services carry over for\n // convenience, but the level RESETS to Low and there is no running clock.\n const reopenPrefill: MaintenanceUpdateFormPrefill = {\n ...addPrefill,\n level: MaintenanceLevel.Low,\n };\n\n const onDialogSave = async (values: MaintenanceUpdateFormValues) => {\n if (dialog.kind === 'edit') {\n await applyEvent(MaintenanceEffect.EditUpdate, { updateId: dialog.update.id, ...values });\n } else if (dialog.kind === 'reopen') {\n const reopened = await applyEvent(EventDocEffect.CreateDraft, undefined);\n if (reopened) {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n } else {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n setDialog({ kind: 'closed' });\n };\n\n return (\n <Box sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton aria-label=\"Back to maintenance list\" onClick={onBack}>\n <ArrowBackIcon />\n </IconButton>\n <Typography color=\"text.secondary\" variant=\"body2\">\n Maintenance\n </Typography>\n </Box>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {/* 70/30: the editor on the left, the what-users-see mock on the right. */}\n <Box sx={{ display: 'flex', gap: 3, alignItems: 'flex-start' }}>\n <Box sx={{ flex: '1 1 70%', minWidth: 0, display: 'flex', flexDirection: 'column', gap: 2 }}>\n {/* The current folded state — read-only; it moves only via updates. */}\n <Paper sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 1.5 }} variant=\"outlined\">\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 2 }}>\n <EngineeringIcon color={isClosed ? 'disabled' : 'warning'} sx={{ fontSize: 40 }} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h5\">{folded.bannerText || folded.name}</Typography>\n {folded.reason && folded.reason !== folded.bannerText && (\n <Typography color=\"text.secondary\" variant=\"body2\">\n Latest: {folded.reason}\n </Typography>\n )}\n <Box sx={{ display: 'flex', gap: 1, mt: 1, flexWrap: 'wrap' }}>\n {isClosed ? <Chip label=\"Closed\" size=\"small\" /> : <Chip color=\"warning\" label=\"Active\" size=\"small\" />}\n <Chip\n color={\n folded.level === MaintenanceLevel.High && !isClosed ? 'error' : folded.level === MaintenanceLevel.Info ? 'info' : 'default'\n }\n label={\n folded.level === MaintenanceLevel.High\n ? 'High — UI locked'\n : folded.level === MaintenanceLevel.Info\n ? 'Info — banner'\n : folded.level === MaintenanceLevel.Internal\n ? 'Internal — hidden from users'\n : 'Low — banner only'\n }\n size=\"small\"\n variant={folded.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n <Chip label={folded.maintenanceType === MaintenanceType.Incident ? 'Incident' : 'Deploy'} size=\"small\" variant=\"outlined\" />\n {folded.etaEndsAt && <Chip label={`Ends ~${new Date(folded.etaEndsAt).toLocaleTimeString()}`} size=\"small\" variant=\"outlined\" />}\n <Chip\n label={folded.affectedServices ? `Affected: ${folded.affectedServices.join(', ')}` : 'All services'}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n {isClosed ? (\n <Button disabled={busy} onClick={() => setDialog({ kind: 'reopen' })} variant=\"contained\">\n Reopen maintenance\n </Button>\n ) : (\n <Button\n color=\"success\"\n disabled={busy}\n onClick={() => applyEvent(EventDocEffect.Publish, { effectiveFrom: new Date().toISOString() })}\n variant=\"contained\"\n >\n Close maintenance\n </Button>\n )}\n </Box>\n {lastUpdate?.internalNotes && (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n Internal: {lastUpdate.internalNotes}\n </Typography>\n )}\n </Paper>\n\n <Divider />\n\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography sx={{ flexGrow: 1 }} variant=\"h6\">\n Updates\n </Typography>\n <Button disabled={isClosed || busy} onClick={() => setDialog({ kind: 'add' })} startIcon={<AddIcon />} variant=\"outlined\">\n Add update\n </Button>\n </Box>\n\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Status</TableCell>\n <TableCell>Level</TableCell>\n <TableCell>ETA</TableCell>\n <TableCell>Internal notes</TableCell>\n <TableCell>Posted</TableCell>\n <TableCell align=\"right\">Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {updatesNewestFirst.map((update) => (\n <TableRow key={update.id} hover>\n <TableCell sx={{ maxWidth: 420 }}>{update.reason}</TableCell>\n <TableCell>\n <Chip\n color={update.level === MaintenanceLevel.High ? 'error' : update.level === MaintenanceLevel.Info ? 'info' : 'default'}\n label={update.level}\n size=\"small\"\n variant={update.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n </TableCell>\n <TableCell>{update.etaSetAt ? (update.etaDurationMins === null ? 'Cleared' : `${update.etaDurationMins}m`) : '—'}</TableCell>\n <TableCell sx={{ maxWidth: 360 }}>\n {update.internalNotes ? (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n {update.internalNotes}\n </Typography>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell sx={{ whiteSpace: 'nowrap' }}>\n {new Date(update.createdAt).toLocaleString()} — {update.createdByDisplayName}\n {update.updatedAt ? ' (edited)' : ''}\n </TableCell>\n <TableCell align=\"right\" sx={{ whiteSpace: 'nowrap' }}>\n {!isClosed && (\n <>\n <IconButton aria-label=\"Edit update\" disabled={busy} onClick={() => setDialog({ kind: 'edit', update })} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n aria-label=\"Delete update\"\n disabled={busy}\n onClick={() => applyEvent(MaintenanceEffect.RemoveUpdate, { updateId: update.id })}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </>\n )}\n </TableCell>\n </TableRow>\n ))}\n {folded.updates.length === 0 && (\n <TableRow>\n <TableCell colSpan={6}>\n <Typography color=\"text.secondary\" sx={{ p: 1 }} variant=\"body2\">\n No updates posted yet.\n </Typography>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </Box>\n\n <Box sx={{ flex: '0 0 30%', minWidth: 300 }}>\n <MaintenanceUserPreview publicState={toMaintenancePublicState(folded)} visible={isMaintenancePubliclyVisible(folded)} />\n </Box>\n </Box>\n\n <UpdateDialog\n busy={busy}\n confirmLabel={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Save update' : 'Add update'}\n currentEtaEndsAt={dialog.kind === 'reopen' ? null : folded.etaEndsAt}\n initialValues={\n dialog.kind === 'edit'\n ? {\n bannerText: dialog.update.bannerText,\n reason: dialog.update.reason,\n level: dialog.update.level,\n maintenanceType: dialog.update.maintenanceType,\n affectedServices: dialog.update.affectedServices,\n internalNotes: dialog.update.internalNotes,\n }\n : dialog.kind === 'reopen'\n ? reopenPrefill\n : addPrefill\n }\n onCancel={() => setDialog({ kind: 'closed' })}\n onSave={onDialogSave}\n open={dialog.kind !== 'closed'}\n title={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Edit update' : 'Add update'}\n />\n </Box>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MaintenanceEditor.js","sourceRoot":"","sources":["../../../src/Maintenance/MaintenanceEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from 'quidproquo-core';\nimport {\n EventDocEffect,\n EventDocEvent,\n EventDocStatus,\n isMaintenancePubliclyVisible,\n MaintenanceEffect,\n maintenanceEventDoc,\n MaintenanceLevel,\n MaintenanceType,\n MaintenanceUpdateEntry,\n toMaintenancePublicState,\n} from 'quidproquo-features';\nimport { useAuthAccessToken, useBaseUrlResolvers } from 'quidproquo-web-react';\n\nimport { useEffect, useMemo, useState } from 'react';\nimport AddIcon from '@mui/icons-material/Add';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport EditIcon from '@mui/icons-material/Edit';\nimport EngineeringIcon from '@mui/icons-material/Engineering';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n CircularProgress,\n Divider,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\n\nimport { appendMaintenanceEvent, fetchMaintenanceEvents } from './logic';\nimport { MaintenanceUserPreview } from './MaintenanceUserPreview';\nimport { MaintenanceUpdateFormPrefill, MaintenanceUpdateFormValues, UpdateDialog } from './UpdateDialog';\n\ntype MaintenanceEditorProps = {\n docId: string;\n onBack: () => void;\n};\n\ntype DialogMode = { kind: 'closed' } | { kind: 'add' } | { kind: 'edit'; update: MaintenanceUpdateEntry } | { kind: 'reopen' };\n\n// One maintenance: a read-only header card with the CURRENT folded state, and\n// the update feed it derives from. The UPDATE is the only mutation — adding one\n// (prefilled from the last, ETA blank against the running clock) moves the whole\n// status; editing/deleting entries re-derives, so deleting the newest rolls the\n// card back. Closing publishes; reopening demands a fresh update (level resets\n// to Low in the prefill) so a maintenance closed at High never reopens locked.\nexport function MaintenanceEditor({ docId, onBack }: MaintenanceEditorProps) {\n const urlResolvers = useBaseUrlResolvers();\n const accessToken = useAuthAccessToken();\n\n const [events, setEvents] = useState<EventDocEvent[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [dialog, setDialog] = useState<DialogMode>({ kind: 'closed' });\n\n const folded = useMemo(() => (events ? maintenanceEventDoc.views.document.fold(events) : null), [events]);\n const isClosed = folded?.status === EventDocStatus.Published;\n\n useEffect(() => {\n const load = async () => {\n setError(null);\n try {\n setEvents(await fetchMaintenanceEvents(docId, urlResolvers.getApiUrl(), accessToken));\n } catch (loadError) {\n setError(`Failed to load maintenance: ${loadError}`);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [docId]);\n\n const applyEvent = async (type: string, data: unknown): Promise<boolean> => {\n setBusy(true);\n setError(null);\n try {\n const event = await appendMaintenanceEvent(docId, type, data, urlResolvers.getApiUrl(), accessToken);\n setEvents((prev) => (prev ? [...prev, event] : [event]));\n return true;\n } catch (appendError) {\n setError(`Failed to save change: ${appendError}`);\n return false;\n } finally {\n setBusy(false);\n }\n };\n\n if (!folded) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 6 }}>{error ? <Alert severity=\"error\">{error}</Alert> : <CircularProgress />}</Box>\n );\n }\n\n const updatesNewestFirst = [...folded.updates].reverse();\n const lastUpdate: Nullable<MaintenanceUpdateEntry> = folded.updates[folded.updates.length - 1] ?? null;\n\n const addPrefill: MaintenanceUpdateFormPrefill = {\n bannerText: folded.bannerText,\n reason: folded.reason,\n level: folded.level,\n maintenanceType: folded.maintenanceType,\n affectedServices: folded.affectedServices,\n internalNotes: '',\n };\n\n // Reopen is \"create from inside\": reason/type/services carry over for\n // convenience, but the level RESETS to Low and there is no running clock.\n const reopenPrefill: MaintenanceUpdateFormPrefill = {\n ...addPrefill,\n level: MaintenanceLevel.Low,\n };\n\n const onDialogSave = async (values: MaintenanceUpdateFormValues) => {\n if (dialog.kind === 'edit') {\n await applyEvent(MaintenanceEffect.EditUpdate, { updateId: dialog.update.id, ...values });\n } else if (dialog.kind === 'reopen') {\n const reopened = await applyEvent(EventDocEffect.CreateDraft, undefined);\n if (reopened) {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n } else {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n setDialog({ kind: 'closed' });\n };\n\n return (\n <Box sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton aria-label=\"Back to maintenance list\" onClick={onBack}>\n <ArrowBackIcon />\n </IconButton>\n <Typography color=\"text.secondary\" variant=\"body2\">\n Maintenance\n </Typography>\n </Box>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {/* 70/30: the editor on the left, the what-users-see mock on the right. */}\n <Box sx={{ display: 'flex', gap: 3, alignItems: 'flex-start' }}>\n <Box sx={{ flex: '1 1 70%', minWidth: 0, display: 'flex', flexDirection: 'column', gap: 2 }}>\n {/* The current folded state — read-only; it moves only via updates. */}\n <Paper sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 1.5 }} variant=\"outlined\">\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 2 }}>\n <EngineeringIcon color={isClosed ? 'disabled' : 'warning'} sx={{ fontSize: 40 }} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h5\">{folded.bannerText || folded.name}</Typography>\n {folded.reason && folded.reason !== folded.bannerText && (\n <Typography color=\"text.secondary\" variant=\"body2\">\n Latest: {folded.reason}\n </Typography>\n )}\n <Box sx={{ display: 'flex', gap: 1, mt: 1, flexWrap: 'wrap' }}>\n {isClosed ? <Chip label=\"Closed\" size=\"small\" /> : <Chip color=\"warning\" label=\"Active\" size=\"small\" />}\n <Chip\n color={\n folded.level === MaintenanceLevel.High && !isClosed ? 'error' : folded.level === MaintenanceLevel.Info ? 'info' : 'default'\n }\n label={\n folded.level === MaintenanceLevel.High\n ? 'High — UI locked'\n : folded.level === MaintenanceLevel.Info\n ? 'Info — banner'\n : folded.level === MaintenanceLevel.Internal\n ? 'Internal — hidden from users'\n : 'Low — banner only'\n }\n size=\"small\"\n variant={folded.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n <Chip label={folded.maintenanceType === MaintenanceType.Incident ? 'Incident' : 'Deploy'} size=\"small\" variant=\"outlined\" />\n {folded.etaEndsAt && <Chip label={`Ends ~${new Date(folded.etaEndsAt).toLocaleTimeString()}`} size=\"small\" variant=\"outlined\" />}\n <Chip\n label={folded.affectedServices ? `Affected: ${folded.affectedServices.join(', ')}` : 'All services'}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n {isClosed ? (\n <Button disabled={busy} onClick={() => setDialog({ kind: 'reopen' })} variant=\"contained\">\n Reopen maintenance\n </Button>\n ) : (\n <Button\n color=\"success\"\n disabled={busy}\n onClick={() => applyEvent(EventDocEffect.Publish, { effectiveFrom: new Date().toISOString() })}\n variant=\"contained\"\n >\n Close maintenance\n </Button>\n )}\n </Box>\n {lastUpdate?.internalNotes && (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n Internal: {lastUpdate.internalNotes}\n </Typography>\n )}\n </Paper>\n\n <Divider />\n\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography sx={{ flexGrow: 1 }} variant=\"h6\">\n Updates\n </Typography>\n <Button disabled={isClosed || busy} onClick={() => setDialog({ kind: 'add' })} startIcon={<AddIcon />} variant=\"outlined\">\n Add update\n </Button>\n </Box>\n\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Status</TableCell>\n <TableCell>Level</TableCell>\n <TableCell>ETA</TableCell>\n <TableCell>Internal notes</TableCell>\n <TableCell>Posted</TableCell>\n <TableCell align=\"right\">Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {updatesNewestFirst.map((update) => (\n <TableRow key={update.id} hover>\n <TableCell sx={{ maxWidth: 420 }}>{update.reason}</TableCell>\n <TableCell>\n <Chip\n color={update.level === MaintenanceLevel.High ? 'error' : update.level === MaintenanceLevel.Info ? 'info' : 'default'}\n label={update.level}\n size=\"small\"\n variant={update.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n </TableCell>\n <TableCell>{update.etaSetAt ? (update.etaDurationMins === null ? 'Cleared' : `${update.etaDurationMins}m`) : '—'}</TableCell>\n <TableCell sx={{ maxWidth: 360 }}>\n {update.internalNotes ? (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n {update.internalNotes}\n </Typography>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell sx={{ whiteSpace: 'nowrap' }}>\n {new Date(update.createdAt).toLocaleString()} — {update.createdByDisplayName}\n {update.updatedAt ? ' (edited)' : ''}\n </TableCell>\n <TableCell align=\"right\" sx={{ whiteSpace: 'nowrap' }}>\n {!isClosed && (\n <>\n <IconButton aria-label=\"Edit update\" disabled={busy} onClick={() => setDialog({ kind: 'edit', update })} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n aria-label=\"Delete update\"\n disabled={busy}\n onClick={() => applyEvent(MaintenanceEffect.RemoveUpdate, { updateId: update.id })}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </>\n )}\n </TableCell>\n </TableRow>\n ))}\n {folded.updates.length === 0 && (\n <TableRow>\n <TableCell colSpan={6}>\n <Typography color=\"text.secondary\" sx={{ p: 1 }} variant=\"body2\">\n No updates posted yet.\n </Typography>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </Box>\n\n <Box sx={{ flex: '0 0 30%', minWidth: 300 }}>\n <MaintenanceUserPreview publicState={toMaintenancePublicState(folded)} visible={isMaintenancePubliclyVisible(folded)} />\n </Box>\n </Box>\n\n <UpdateDialog\n busy={busy}\n confirmLabel={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Save update' : 'Add update'}\n currentEtaEndsAt={dialog.kind === 'reopen' ? null : folded.etaEndsAt}\n initialValues={\n dialog.kind === 'edit'\n ? {\n bannerText: dialog.update.bannerText,\n reason: dialog.update.reason,\n level: dialog.update.level,\n maintenanceType: dialog.update.maintenanceType,\n affectedServices: dialog.update.affectedServices,\n internalNotes: dialog.update.internalNotes,\n }\n : dialog.kind === 'reopen'\n ? reopenPrefill\n : addPrefill\n }\n onCancel={() => setDialog({ kind: 'closed' })}\n onSave={onDialogSave}\n open={dialog.kind !== 'closed'}\n title={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Edit update' : 'Add update'}\n />\n </Box>\n );\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import { GuidActionType } from 'quidproquo-core';
|
|
|
2
2
|
const coreGuidActionComponentMap = {
|
|
3
3
|
[GuidActionType.New]: ['askNewGuid'],
|
|
4
4
|
[GuidActionType.NewSortable]: ['askNewSortableGuid'],
|
|
5
|
+
[GuidActionType.NewSortableMany]: ['askNewSortableGuids', 'count'],
|
|
5
6
|
};
|
|
6
7
|
export default coreGuidActionComponentMap;
|
|
7
8
|
//# sourceMappingURL=coreGuidActionComponentMap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coreGuidActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,0BAA0B,GAA6B;IAC3D,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;IACpC,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"coreGuidActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreGuidActionComponentMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,0BAA0B,GAA6B;IAC3D,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;IACpC,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,oBAAoB,CAAC;IACpD,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACnE,CAAC;AAEF,eAAe,0BAA0B,CAAC","sourcesContent":["import { GuidActionType } from 'quidproquo-core';\n\nconst coreGuidActionComponentMap: Record<string, string[]> = {\n [GuidActionType.New]: ['askNewGuid'],\n [GuidActionType.NewSortable]: ['askNewSortableGuid'],\n [GuidActionType.NewSortableMany]: ['askNewSortableGuids', 'count'],\n};\n\nexport default coreGuidActionComponentMap;\n"]}
|
package/lib/esm/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js
CHANGED
|
@@ -2,6 +2,7 @@ import { KeyValueStoreActionType } from 'quidproquo-core';
|
|
|
2
2
|
export const coreKeyValueStoreActionComponentMap = {
|
|
3
3
|
[KeyValueStoreActionType.Query]: ['askKeyValueStoreQuery', 'keyValueStoreName', 'keyCondition', 'options'],
|
|
4
4
|
[KeyValueStoreActionType.Upsert]: ['askKeyValueStoreUpsert', 'keyValueStoreName', 'item', 'options'],
|
|
5
|
+
[KeyValueStoreActionType.UpsertMany]: ['askKeyValueStoreUpsertMany', 'keyValueStoreName', 'items', 'options'],
|
|
5
6
|
[KeyValueStoreActionType.Get]: ['askKeyValueStoreGet', 'keyValueStoreName', 'key', 'options'],
|
|
6
7
|
[KeyValueStoreActionType.GetAll]: ['askKeyValueStoreGetAll', 'keyValueStoreName', 'options'],
|
|
7
8
|
[KeyValueStoreActionType.Delete]: ['askKeyValueStoreDelete', 'keyValueStoreName', 'key', 'sortKey', 'options'],
|
package/lib/esm/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coreKeyValueStoreActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,CAAC,MAAM,mCAAmC,GAA6B;IAC3E,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,cAAc,EAAE,SAAS,CAAC;IAC1G,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,CAAC;IACpG,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,CAAC;IAC7F,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,CAAC;IAC5F,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IAC9G,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IACzH,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,CAAC;CAChH,CAAC;AAEF,eAAe,mCAAmC,CAAC","sourcesContent":["import { KeyValueStoreActionType } from 'quidproquo-core';\n\nexport const coreKeyValueStoreActionComponentMap: Record<string, string[]> = {\n [KeyValueStoreActionType.Query]: ['askKeyValueStoreQuery', 'keyValueStoreName', 'keyCondition', 'options'],\n [KeyValueStoreActionType.Upsert]: ['askKeyValueStoreUpsert', 'keyValueStoreName', 'item', 'options'],\n [KeyValueStoreActionType.Get]: ['askKeyValueStoreGet', 'keyValueStoreName', 'key', 'options'],\n [KeyValueStoreActionType.GetAll]: ['askKeyValueStoreGetAll', 'keyValueStoreName', 'options'],\n [KeyValueStoreActionType.Delete]: ['askKeyValueStoreDelete', 'keyValueStoreName', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Update]: ['askKeyValueStoreUpdate', 'keyValueStoreName', 'updates', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Scan]: ['askKeyValueStoreScan', 'keyValueStoreName', 'filterCondition', 'nextPageKey'],\n};\n\nexport default coreKeyValueStoreActionComponentMap;\n"]}
|
|
1
|
+
{"version":3,"file":"coreKeyValueStoreActionComponentMap.js","sourceRoot":"","sources":["../../../../../../src/LogViewer/logic/actionComponentMap/core/coreKeyValueStoreActionComponentMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,CAAC,MAAM,mCAAmC,GAA6B;IAC3E,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,cAAc,EAAE,SAAS,CAAC;IAC1G,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,CAAC;IACpG,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC,4BAA4B,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,CAAC;IAC7G,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,CAAC;IAC7F,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,CAAC;IAC5F,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IAC9G,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IACzH,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,CAAC;CAChH,CAAC;AAEF,eAAe,mCAAmC,CAAC","sourcesContent":["import { KeyValueStoreActionType } from 'quidproquo-core';\n\nexport const coreKeyValueStoreActionComponentMap: Record<string, string[]> = {\n [KeyValueStoreActionType.Query]: ['askKeyValueStoreQuery', 'keyValueStoreName', 'keyCondition', 'options'],\n [KeyValueStoreActionType.Upsert]: ['askKeyValueStoreUpsert', 'keyValueStoreName', 'item', 'options'],\n [KeyValueStoreActionType.UpsertMany]: ['askKeyValueStoreUpsertMany', 'keyValueStoreName', 'items', 'options'],\n [KeyValueStoreActionType.Get]: ['askKeyValueStoreGet', 'keyValueStoreName', 'key', 'options'],\n [KeyValueStoreActionType.GetAll]: ['askKeyValueStoreGetAll', 'keyValueStoreName', 'options'],\n [KeyValueStoreActionType.Delete]: ['askKeyValueStoreDelete', 'keyValueStoreName', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Update]: ['askKeyValueStoreUpdate', 'keyValueStoreName', 'updates', 'key', 'sortKey', 'options'],\n [KeyValueStoreActionType.Scan]: ['askKeyValueStoreScan', 'keyValueStoreName', 'filterCondition', 'nextPageKey'],\n};\n\nexport default coreKeyValueStoreActionComponentMap;\n"]}
|
|
@@ -24,7 +24,7 @@ export function MaintenanceEditor({ docId, onBack }) {
|
|
|
24
24
|
const [error, setError] = useState(null);
|
|
25
25
|
const [busy, setBusy] = useState(false);
|
|
26
26
|
const [dialog, setDialog] = useState({ kind: 'closed' });
|
|
27
|
-
const folded = useMemo(() => (events ? maintenanceEventDoc.fold(events) : null), [events]);
|
|
27
|
+
const folded = useMemo(() => (events ? maintenanceEventDoc.views.document.fold(events) : null), [events]);
|
|
28
28
|
const isClosed = folded?.status === EventDocStatus.Published;
|
|
29
29
|
useEffect(() => {
|
|
30
30
|
const load = async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaintenanceEditor.js","sourceRoot":"","sources":["../../../src/Maintenance/MaintenanceEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from 'quidproquo-core';\nimport {\n EventDocEffect,\n EventDocEvent,\n EventDocStatus,\n isMaintenancePubliclyVisible,\n MaintenanceEffect,\n maintenanceEventDoc,\n MaintenanceLevel,\n MaintenanceType,\n MaintenanceUpdateEntry,\n toMaintenancePublicState,\n} from 'quidproquo-features';\nimport { useAuthAccessToken, useBaseUrlResolvers } from 'quidproquo-web-react';\n\nimport { useEffect, useMemo, useState } from 'react';\nimport AddIcon from '@mui/icons-material/Add';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport EditIcon from '@mui/icons-material/Edit';\nimport EngineeringIcon from '@mui/icons-material/Engineering';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n CircularProgress,\n Divider,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\n\nimport { appendMaintenanceEvent, fetchMaintenanceEvents } from './logic';\nimport { MaintenanceUserPreview } from './MaintenanceUserPreview';\nimport { MaintenanceUpdateFormPrefill, MaintenanceUpdateFormValues, UpdateDialog } from './UpdateDialog';\n\ntype MaintenanceEditorProps = {\n docId: string;\n onBack: () => void;\n};\n\ntype DialogMode = { kind: 'closed' } | { kind: 'add' } | { kind: 'edit'; update: MaintenanceUpdateEntry } | { kind: 'reopen' };\n\n// One maintenance: a read-only header card with the CURRENT folded state, and\n// the update feed it derives from. The UPDATE is the only mutation — adding one\n// (prefilled from the last, ETA blank against the running clock) moves the whole\n// status; editing/deleting entries re-derives, so deleting the newest rolls the\n// card back. Closing publishes; reopening demands a fresh update (level resets\n// to Low in the prefill) so a maintenance closed at High never reopens locked.\nexport function MaintenanceEditor({ docId, onBack }: MaintenanceEditorProps) {\n const urlResolvers = useBaseUrlResolvers();\n const accessToken = useAuthAccessToken();\n\n const [events, setEvents] = useState<EventDocEvent[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [dialog, setDialog] = useState<DialogMode>({ kind: 'closed' });\n\n const folded = useMemo(() => (events ? maintenanceEventDoc.fold(events) : null), [events]);\n const isClosed = folded?.status === EventDocStatus.Published;\n\n useEffect(() => {\n const load = async () => {\n setError(null);\n try {\n setEvents(await fetchMaintenanceEvents(docId, urlResolvers.getApiUrl(), accessToken));\n } catch (loadError) {\n setError(`Failed to load maintenance: ${loadError}`);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [docId]);\n\n const applyEvent = async (type: string, data: unknown): Promise<boolean> => {\n setBusy(true);\n setError(null);\n try {\n const event = await appendMaintenanceEvent(docId, type, data, urlResolvers.getApiUrl(), accessToken);\n setEvents((prev) => (prev ? [...prev, event] : [event]));\n return true;\n } catch (appendError) {\n setError(`Failed to save change: ${appendError}`);\n return false;\n } finally {\n setBusy(false);\n }\n };\n\n if (!folded) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 6 }}>{error ? <Alert severity=\"error\">{error}</Alert> : <CircularProgress />}</Box>\n );\n }\n\n const updatesNewestFirst = [...folded.updates].reverse();\n const lastUpdate: Nullable<MaintenanceUpdateEntry> = folded.updates[folded.updates.length - 1] ?? null;\n\n const addPrefill: MaintenanceUpdateFormPrefill = {\n bannerText: folded.bannerText,\n reason: folded.reason,\n level: folded.level,\n maintenanceType: folded.maintenanceType,\n affectedServices: folded.affectedServices,\n internalNotes: '',\n };\n\n // Reopen is \"create from inside\": reason/type/services carry over for\n // convenience, but the level RESETS to Low and there is no running clock.\n const reopenPrefill: MaintenanceUpdateFormPrefill = {\n ...addPrefill,\n level: MaintenanceLevel.Low,\n };\n\n const onDialogSave = async (values: MaintenanceUpdateFormValues) => {\n if (dialog.kind === 'edit') {\n await applyEvent(MaintenanceEffect.EditUpdate, { updateId: dialog.update.id, ...values });\n } else if (dialog.kind === 'reopen') {\n const reopened = await applyEvent(EventDocEffect.CreateDraft, undefined);\n if (reopened) {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n } else {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n setDialog({ kind: 'closed' });\n };\n\n return (\n <Box sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton aria-label=\"Back to maintenance list\" onClick={onBack}>\n <ArrowBackIcon />\n </IconButton>\n <Typography color=\"text.secondary\" variant=\"body2\">\n Maintenance\n </Typography>\n </Box>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {/* 70/30: the editor on the left, the what-users-see mock on the right. */}\n <Box sx={{ display: 'flex', gap: 3, alignItems: 'flex-start' }}>\n <Box sx={{ flex: '1 1 70%', minWidth: 0, display: 'flex', flexDirection: 'column', gap: 2 }}>\n {/* The current folded state — read-only; it moves only via updates. */}\n <Paper sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 1.5 }} variant=\"outlined\">\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 2 }}>\n <EngineeringIcon color={isClosed ? 'disabled' : 'warning'} sx={{ fontSize: 40 }} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h5\">{folded.bannerText || folded.name}</Typography>\n {folded.reason && folded.reason !== folded.bannerText && (\n <Typography color=\"text.secondary\" variant=\"body2\">\n Latest: {folded.reason}\n </Typography>\n )}\n <Box sx={{ display: 'flex', gap: 1, mt: 1, flexWrap: 'wrap' }}>\n {isClosed ? <Chip label=\"Closed\" size=\"small\" /> : <Chip color=\"warning\" label=\"Active\" size=\"small\" />}\n <Chip\n color={\n folded.level === MaintenanceLevel.High && !isClosed ? 'error' : folded.level === MaintenanceLevel.Info ? 'info' : 'default'\n }\n label={\n folded.level === MaintenanceLevel.High\n ? 'High — UI locked'\n : folded.level === MaintenanceLevel.Info\n ? 'Info — banner'\n : folded.level === MaintenanceLevel.Internal\n ? 'Internal — hidden from users'\n : 'Low — banner only'\n }\n size=\"small\"\n variant={folded.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n <Chip label={folded.maintenanceType === MaintenanceType.Incident ? 'Incident' : 'Deploy'} size=\"small\" variant=\"outlined\" />\n {folded.etaEndsAt && <Chip label={`Ends ~${new Date(folded.etaEndsAt).toLocaleTimeString()}`} size=\"small\" variant=\"outlined\" />}\n <Chip\n label={folded.affectedServices ? `Affected: ${folded.affectedServices.join(', ')}` : 'All services'}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n {isClosed ? (\n <Button disabled={busy} onClick={() => setDialog({ kind: 'reopen' })} variant=\"contained\">\n Reopen maintenance\n </Button>\n ) : (\n <Button\n color=\"success\"\n disabled={busy}\n onClick={() => applyEvent(EventDocEffect.Publish, { effectiveFrom: new Date().toISOString() })}\n variant=\"contained\"\n >\n Close maintenance\n </Button>\n )}\n </Box>\n {lastUpdate?.internalNotes && (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n Internal: {lastUpdate.internalNotes}\n </Typography>\n )}\n </Paper>\n\n <Divider />\n\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography sx={{ flexGrow: 1 }} variant=\"h6\">\n Updates\n </Typography>\n <Button disabled={isClosed || busy} onClick={() => setDialog({ kind: 'add' })} startIcon={<AddIcon />} variant=\"outlined\">\n Add update\n </Button>\n </Box>\n\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Status</TableCell>\n <TableCell>Level</TableCell>\n <TableCell>ETA</TableCell>\n <TableCell>Internal notes</TableCell>\n <TableCell>Posted</TableCell>\n <TableCell align=\"right\">Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {updatesNewestFirst.map((update) => (\n <TableRow key={update.id} hover>\n <TableCell sx={{ maxWidth: 420 }}>{update.reason}</TableCell>\n <TableCell>\n <Chip\n color={update.level === MaintenanceLevel.High ? 'error' : update.level === MaintenanceLevel.Info ? 'info' : 'default'}\n label={update.level}\n size=\"small\"\n variant={update.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n </TableCell>\n <TableCell>{update.etaSetAt ? (update.etaDurationMins === null ? 'Cleared' : `${update.etaDurationMins}m`) : '—'}</TableCell>\n <TableCell sx={{ maxWidth: 360 }}>\n {update.internalNotes ? (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n {update.internalNotes}\n </Typography>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell sx={{ whiteSpace: 'nowrap' }}>\n {new Date(update.createdAt).toLocaleString()} — {update.createdByDisplayName}\n {update.updatedAt ? ' (edited)' : ''}\n </TableCell>\n <TableCell align=\"right\" sx={{ whiteSpace: 'nowrap' }}>\n {!isClosed && (\n <>\n <IconButton aria-label=\"Edit update\" disabled={busy} onClick={() => setDialog({ kind: 'edit', update })} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n aria-label=\"Delete update\"\n disabled={busy}\n onClick={() => applyEvent(MaintenanceEffect.RemoveUpdate, { updateId: update.id })}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </>\n )}\n </TableCell>\n </TableRow>\n ))}\n {folded.updates.length === 0 && (\n <TableRow>\n <TableCell colSpan={6}>\n <Typography color=\"text.secondary\" sx={{ p: 1 }} variant=\"body2\">\n No updates posted yet.\n </Typography>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </Box>\n\n <Box sx={{ flex: '0 0 30%', minWidth: 300 }}>\n <MaintenanceUserPreview publicState={toMaintenancePublicState(folded)} visible={isMaintenancePubliclyVisible(folded)} />\n </Box>\n </Box>\n\n <UpdateDialog\n busy={busy}\n confirmLabel={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Save update' : 'Add update'}\n currentEtaEndsAt={dialog.kind === 'reopen' ? null : folded.etaEndsAt}\n initialValues={\n dialog.kind === 'edit'\n ? {\n bannerText: dialog.update.bannerText,\n reason: dialog.update.reason,\n level: dialog.update.level,\n maintenanceType: dialog.update.maintenanceType,\n affectedServices: dialog.update.affectedServices,\n internalNotes: dialog.update.internalNotes,\n }\n : dialog.kind === 'reopen'\n ? reopenPrefill\n : addPrefill\n }\n onCancel={() => setDialog({ kind: 'closed' })}\n onSave={onDialogSave}\n open={dialog.kind !== 'closed'}\n title={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Edit update' : 'Add update'}\n />\n </Box>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MaintenanceEditor.js","sourceRoot":"","sources":["../../../src/Maintenance/MaintenanceEditor.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,cAAc,EAEd,cAAc,EACd,4BAA4B,EAC5B,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EAEf,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,OAAO,MAAM,yBAAyB,CAAC;AAC9C,OAAO,aAAa,MAAM,+BAA+B,CAAC;AAC1D,OAAO,UAAU,MAAM,4BAA4B,CAAC;AACpD,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAChD,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EACL,KAAK,EACL,GAAG,EACH,MAAM,EACN,IAAI,EACJ,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,KAAK,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAA6D,YAAY,EAAE,MAAM,gBAAgB,CAAC;AASzG,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAA0B;IACzE,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IAEzC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyB,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1G,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC,SAAS,CAAC;IAE7D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,CAAC;gBACH,SAAS,CAAC,MAAM,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,QAAQ,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;QACP,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,IAAa,EAAoB,EAAE;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;YACrG,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,QAAQ,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,YAAG,KAAK,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,QAAQ,EAAC,OAAO,YAAE,KAAK,GAAS,CAAC,CAAC,CAAC,KAAC,gBAAgB,KAAG,GAAO,CAC7I,CAAC;IACJ,CAAC;IAED,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,MAAM,UAAU,GAAqC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IAEvG,MAAM,UAAU,GAAiC;QAC/C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,sEAAsE;IACtE,0EAA0E;IAC1E,MAAM,aAAa,GAAiC;QAClD,GAAG,UAAU;QACb,KAAK,EAAE,gBAAgB,CAAC,GAAG;KAC5B,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,MAAmC,EAAE,EAAE;QACjE,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,UAAU,CAAC,iBAAiB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACzE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aACjE,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aACxD,KAAC,UAAU,kBAAY,0BAA0B,EAAC,OAAO,EAAE,MAAM,YAC/D,KAAC,aAAa,KAAG,GACN,EACb,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,OAAO,EAAC,OAAO,4BAErC,IACT,EAEL,KAAK,IAAI,KAAC,KAAK,IAAC,QAAQ,EAAC,OAAO,YAAE,KAAK,GAAS,EAGjD,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,aAC5D,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAEzF,MAAC,KAAK,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAC,UAAU,aACzF,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,aAC5D,KAAC,eAAe,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAI,EACnF,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,aACtB,KAAC,UAAU,IAAC,OAAO,EAAC,IAAI,YAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,GAAc,EACvE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,IAAI,CACvD,MAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,OAAO,EAAC,OAAO,yBACvC,MAAM,CAAC,MAAM,IACX,CACd,EACD,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAC1D,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,GAAG,EACvG,KAAC,IAAI,IACH,KAAK,EACH,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAE7H,KAAK,EACH,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI;oEACpC,CAAC,CAAC,kBAAkB;oEACpB,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI;wEACtC,CAAC,CAAC,eAAe;wEACjB,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,QAAQ;4EAC1C,CAAC,CAAC,8BAA8B;4EAChC,CAAC,CAAC,mBAAmB,EAE7B,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GACvE,EACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,eAAe,KAAK,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,GAAG,EAC3H,MAAM,CAAC,SAAS,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,GAAG,EAChI,KAAC,IAAI,IACH,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EACnG,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,UAAU,GAClB,IACE,IACF,EACL,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,MAAM,IAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAC,WAAW,mCAEhF,CACV,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IACL,KAAK,EAAC,SAAS,EACf,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAC9F,OAAO,EAAC,WAAW,kCAGZ,CACV,IACG,EACL,UAAU,EAAE,aAAa,IAAI,CAC5B,MAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAC,OAAO,2BAClE,UAAU,CAAC,aAAa,IACxB,CACd,IACK,EAER,KAAC,OAAO,KAAG,EAEX,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAChD,KAAC,UAAU,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAC,IAAI,wBAEhC,EACb,KAAC,MAAM,IAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,KAAC,OAAO,KAAG,EAAE,OAAO,EAAC,UAAU,2BAEhH,IACL,EAEN,MAAC,KAAK,IAAC,IAAI,EAAC,OAAO,aACjB,KAAC,SAAS,cACR,MAAC,QAAQ,eACP,KAAC,SAAS,yBAAmB,EAC7B,KAAC,SAAS,wBAAkB,EAC5B,KAAC,SAAS,sBAAgB,EAC1B,KAAC,SAAS,iCAA2B,EACrC,KAAC,SAAS,yBAAmB,EAC7B,KAAC,SAAS,IAAC,KAAK,EAAC,OAAO,wBAAoB,IACnC,GACD,EACZ,MAAC,SAAS,eACP,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAClC,MAAC,QAAQ,IAAiB,KAAK,mBAC7B,KAAC,SAAS,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAG,MAAM,CAAC,MAAM,GAAa,EAC7D,KAAC,SAAS,cACR,KAAC,IAAI,IACH,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACrH,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GACvE,GACQ,EACZ,KAAC,SAAS,cAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAa,EAC7H,KAAC,SAAS,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAC7B,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CACtB,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAC,OAAO,YAC5E,MAAM,CAAC,aAAa,GACV,CACd,CAAC,CAAC,CAAC,CACF,GAAG,CACJ,GACS,EACZ,MAAC,SAAS,IAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,aACpC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,cAAK,MAAM,CAAC,oBAAoB,EAC3E,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAC1B,EACZ,KAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YAClD,CAAC,QAAQ,IAAI,CACZ,8BACE,KAAC,UAAU,kBAAY,aAAa,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAC,OAAO,YACnH,KAAC,QAAQ,IAAC,QAAQ,EAAC,OAAO,GAAG,GAClB,EACb,KAAC,UAAU,kBACE,eAAe,EAC1B,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAClF,IAAI,EAAC,OAAO,YAEZ,KAAC,UAAU,IAAC,QAAQ,EAAC,OAAO,GAAG,GACpB,IACZ,CACJ,GACS,KAxCC,MAAM,CAAC,EAAE,CAyCb,CACZ,CAAC,EACD,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAC9B,KAAC,QAAQ,cACP,KAAC,SAAS,IAAC,OAAO,EAAE,CAAC,YACnB,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAC,OAAO,uCAEnD,GACH,GACH,CACZ,IACS,IACN,IACJ,EAEN,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,YACzC,KAAC,sBAAsB,IAAC,WAAW,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,GAAI,GACpH,IACF,EAEN,KAAC,YAAY,IACX,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EACrH,gBAAgB,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EACpE,aAAa,EACX,MAAM,CAAC,IAAI,KAAK,MAAM;oBACpB,CAAC,CAAC;wBACE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;wBACpC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;wBAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;wBAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe;wBAC9C,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;wBAChD,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;qBAC3C;oBACH,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;wBACxB,CAAC,CAAC,aAAa;wBACf,CAAC,CAAC,UAAU,EAElB,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAC7C,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,EAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,GAC9G,IACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { Nullable } from 'quidproquo-core';\nimport {\n EventDocEffect,\n EventDocEvent,\n EventDocStatus,\n isMaintenancePubliclyVisible,\n MaintenanceEffect,\n maintenanceEventDoc,\n MaintenanceLevel,\n MaintenanceType,\n MaintenanceUpdateEntry,\n toMaintenancePublicState,\n} from 'quidproquo-features';\nimport { useAuthAccessToken, useBaseUrlResolvers } from 'quidproquo-web-react';\n\nimport { useEffect, useMemo, useState } from 'react';\nimport AddIcon from '@mui/icons-material/Add';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport EditIcon from '@mui/icons-material/Edit';\nimport EngineeringIcon from '@mui/icons-material/Engineering';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n CircularProgress,\n Divider,\n IconButton,\n Paper,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\n\nimport { appendMaintenanceEvent, fetchMaintenanceEvents } from './logic';\nimport { MaintenanceUserPreview } from './MaintenanceUserPreview';\nimport { MaintenanceUpdateFormPrefill, MaintenanceUpdateFormValues, UpdateDialog } from './UpdateDialog';\n\ntype MaintenanceEditorProps = {\n docId: string;\n onBack: () => void;\n};\n\ntype DialogMode = { kind: 'closed' } | { kind: 'add' } | { kind: 'edit'; update: MaintenanceUpdateEntry } | { kind: 'reopen' };\n\n// One maintenance: a read-only header card with the CURRENT folded state, and\n// the update feed it derives from. The UPDATE is the only mutation — adding one\n// (prefilled from the last, ETA blank against the running clock) moves the whole\n// status; editing/deleting entries re-derives, so deleting the newest rolls the\n// card back. Closing publishes; reopening demands a fresh update (level resets\n// to Low in the prefill) so a maintenance closed at High never reopens locked.\nexport function MaintenanceEditor({ docId, onBack }: MaintenanceEditorProps) {\n const urlResolvers = useBaseUrlResolvers();\n const accessToken = useAuthAccessToken();\n\n const [events, setEvents] = useState<EventDocEvent[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [dialog, setDialog] = useState<DialogMode>({ kind: 'closed' });\n\n const folded = useMemo(() => (events ? maintenanceEventDoc.views.document.fold(events) : null), [events]);\n const isClosed = folded?.status === EventDocStatus.Published;\n\n useEffect(() => {\n const load = async () => {\n setError(null);\n try {\n setEvents(await fetchMaintenanceEvents(docId, urlResolvers.getApiUrl(), accessToken));\n } catch (loadError) {\n setError(`Failed to load maintenance: ${loadError}`);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [docId]);\n\n const applyEvent = async (type: string, data: unknown): Promise<boolean> => {\n setBusy(true);\n setError(null);\n try {\n const event = await appendMaintenanceEvent(docId, type, data, urlResolvers.getApiUrl(), accessToken);\n setEvents((prev) => (prev ? [...prev, event] : [event]));\n return true;\n } catch (appendError) {\n setError(`Failed to save change: ${appendError}`);\n return false;\n } finally {\n setBusy(false);\n }\n };\n\n if (!folded) {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 6 }}>{error ? <Alert severity=\"error\">{error}</Alert> : <CircularProgress />}</Box>\n );\n }\n\n const updatesNewestFirst = [...folded.updates].reverse();\n const lastUpdate: Nullable<MaintenanceUpdateEntry> = folded.updates[folded.updates.length - 1] ?? null;\n\n const addPrefill: MaintenanceUpdateFormPrefill = {\n bannerText: folded.bannerText,\n reason: folded.reason,\n level: folded.level,\n maintenanceType: folded.maintenanceType,\n affectedServices: folded.affectedServices,\n internalNotes: '',\n };\n\n // Reopen is \"create from inside\": reason/type/services carry over for\n // convenience, but the level RESETS to Low and there is no running clock.\n const reopenPrefill: MaintenanceUpdateFormPrefill = {\n ...addPrefill,\n level: MaintenanceLevel.Low,\n };\n\n const onDialogSave = async (values: MaintenanceUpdateFormValues) => {\n if (dialog.kind === 'edit') {\n await applyEvent(MaintenanceEffect.EditUpdate, { updateId: dialog.update.id, ...values });\n } else if (dialog.kind === 'reopen') {\n const reopened = await applyEvent(EventDocEffect.CreateDraft, undefined);\n if (reopened) {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n } else {\n await applyEvent(MaintenanceEffect.AddUpdate, { updateId: crypto.randomUUID(), ...values });\n }\n setDialog({ kind: 'closed' });\n };\n\n return (\n <Box sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <IconButton aria-label=\"Back to maintenance list\" onClick={onBack}>\n <ArrowBackIcon />\n </IconButton>\n <Typography color=\"text.secondary\" variant=\"body2\">\n Maintenance\n </Typography>\n </Box>\n\n {error && <Alert severity=\"error\">{error}</Alert>}\n\n {/* 70/30: the editor on the left, the what-users-see mock on the right. */}\n <Box sx={{ display: 'flex', gap: 3, alignItems: 'flex-start' }}>\n <Box sx={{ flex: '1 1 70%', minWidth: 0, display: 'flex', flexDirection: 'column', gap: 2 }}>\n {/* The current folded state — read-only; it moves only via updates. */}\n <Paper sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 1.5 }} variant=\"outlined\">\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 2 }}>\n <EngineeringIcon color={isClosed ? 'disabled' : 'warning'} sx={{ fontSize: 40 }} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h5\">{folded.bannerText || folded.name}</Typography>\n {folded.reason && folded.reason !== folded.bannerText && (\n <Typography color=\"text.secondary\" variant=\"body2\">\n Latest: {folded.reason}\n </Typography>\n )}\n <Box sx={{ display: 'flex', gap: 1, mt: 1, flexWrap: 'wrap' }}>\n {isClosed ? <Chip label=\"Closed\" size=\"small\" /> : <Chip color=\"warning\" label=\"Active\" size=\"small\" />}\n <Chip\n color={\n folded.level === MaintenanceLevel.High && !isClosed ? 'error' : folded.level === MaintenanceLevel.Info ? 'info' : 'default'\n }\n label={\n folded.level === MaintenanceLevel.High\n ? 'High — UI locked'\n : folded.level === MaintenanceLevel.Info\n ? 'Info — banner'\n : folded.level === MaintenanceLevel.Internal\n ? 'Internal — hidden from users'\n : 'Low — banner only'\n }\n size=\"small\"\n variant={folded.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n <Chip label={folded.maintenanceType === MaintenanceType.Incident ? 'Incident' : 'Deploy'} size=\"small\" variant=\"outlined\" />\n {folded.etaEndsAt && <Chip label={`Ends ~${new Date(folded.etaEndsAt).toLocaleTimeString()}`} size=\"small\" variant=\"outlined\" />}\n <Chip\n label={folded.affectedServices ? `Affected: ${folded.affectedServices.join(', ')}` : 'All services'}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n {isClosed ? (\n <Button disabled={busy} onClick={() => setDialog({ kind: 'reopen' })} variant=\"contained\">\n Reopen maintenance\n </Button>\n ) : (\n <Button\n color=\"success\"\n disabled={busy}\n onClick={() => applyEvent(EventDocEffect.Publish, { effectiveFrom: new Date().toISOString() })}\n variant=\"contained\"\n >\n Close maintenance\n </Button>\n )}\n </Box>\n {lastUpdate?.internalNotes && (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n Internal: {lastUpdate.internalNotes}\n </Typography>\n )}\n </Paper>\n\n <Divider />\n\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography sx={{ flexGrow: 1 }} variant=\"h6\">\n Updates\n </Typography>\n <Button disabled={isClosed || busy} onClick={() => setDialog({ kind: 'add' })} startIcon={<AddIcon />} variant=\"outlined\">\n Add update\n </Button>\n </Box>\n\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Status</TableCell>\n <TableCell>Level</TableCell>\n <TableCell>ETA</TableCell>\n <TableCell>Internal notes</TableCell>\n <TableCell>Posted</TableCell>\n <TableCell align=\"right\">Actions</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {updatesNewestFirst.map((update) => (\n <TableRow key={update.id} hover>\n <TableCell sx={{ maxWidth: 420 }}>{update.reason}</TableCell>\n <TableCell>\n <Chip\n color={update.level === MaintenanceLevel.High ? 'error' : update.level === MaintenanceLevel.Info ? 'info' : 'default'}\n label={update.level}\n size=\"small\"\n variant={update.level === MaintenanceLevel.High ? 'filled' : 'outlined'}\n />\n </TableCell>\n <TableCell>{update.etaSetAt ? (update.etaDurationMins === null ? 'Cleared' : `${update.etaDurationMins}m`) : '—'}</TableCell>\n <TableCell sx={{ maxWidth: 360 }}>\n {update.internalNotes ? (\n <Typography color=\"text.secondary\" sx={{ fontStyle: 'italic' }} variant=\"body2\">\n {update.internalNotes}\n </Typography>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell sx={{ whiteSpace: 'nowrap' }}>\n {new Date(update.createdAt).toLocaleString()} — {update.createdByDisplayName}\n {update.updatedAt ? ' (edited)' : ''}\n </TableCell>\n <TableCell align=\"right\" sx={{ whiteSpace: 'nowrap' }}>\n {!isClosed && (\n <>\n <IconButton aria-label=\"Edit update\" disabled={busy} onClick={() => setDialog({ kind: 'edit', update })} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n aria-label=\"Delete update\"\n disabled={busy}\n onClick={() => applyEvent(MaintenanceEffect.RemoveUpdate, { updateId: update.id })}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </>\n )}\n </TableCell>\n </TableRow>\n ))}\n {folded.updates.length === 0 && (\n <TableRow>\n <TableCell colSpan={6}>\n <Typography color=\"text.secondary\" sx={{ p: 1 }} variant=\"body2\">\n No updates posted yet.\n </Typography>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </Box>\n\n <Box sx={{ flex: '0 0 30%', minWidth: 300 }}>\n <MaintenanceUserPreview publicState={toMaintenancePublicState(folded)} visible={isMaintenancePubliclyVisible(folded)} />\n </Box>\n </Box>\n\n <UpdateDialog\n busy={busy}\n confirmLabel={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Save update' : 'Add update'}\n currentEtaEndsAt={dialog.kind === 'reopen' ? null : folded.etaEndsAt}\n initialValues={\n dialog.kind === 'edit'\n ? {\n bannerText: dialog.update.bannerText,\n reason: dialog.update.reason,\n level: dialog.update.level,\n maintenanceType: dialog.update.maintenanceType,\n affectedServices: dialog.update.affectedServices,\n internalNotes: dialog.update.internalNotes,\n }\n : dialog.kind === 'reopen'\n ? reopenPrefill\n : addPrefill\n }\n onCancel={() => setDialog({ kind: 'closed' })}\n onSave={onDialogSave}\n open={dialog.kind !== 'closed'}\n title={dialog.kind === 'reopen' ? 'Reopen maintenance' : dialog.kind === 'edit' ? 'Edit update' : 'Add update'}\n />\n </Box>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quidproquo-web-admin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./lib/commonjs/index.js",
|
|
6
6
|
"module": "./lib/esm/index.js",
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"date-fns": "^2.30.0",
|
|
45
45
|
"dayjs": "^1.11.7",
|
|
46
46
|
"javascript-time-ago": "^2.5.9",
|
|
47
|
-
"quidproquo-core": "0.1.
|
|
48
|
-
"quidproquo-features": "0.1.
|
|
49
|
-
"quidproquo-tsconfig": "0.1.
|
|
50
|
-
"quidproquo-web": "0.1.
|
|
51
|
-
"quidproquo-web-react": "0.1.
|
|
52
|
-
"quidproquo-webserver": "0.1.
|
|
47
|
+
"quidproquo-core": "0.1.16",
|
|
48
|
+
"quidproquo-features": "0.1.16",
|
|
49
|
+
"quidproquo-tsconfig": "0.1.16",
|
|
50
|
+
"quidproquo-web": "0.1.16",
|
|
51
|
+
"quidproquo-web-react": "0.1.16",
|
|
52
|
+
"quidproquo-webserver": "0.1.16",
|
|
53
53
|
"react": ">=18.3.1",
|
|
54
54
|
"react-d3-tree": "^3.6.6",
|
|
55
55
|
"react-dom": "18.3.1",
|