@marinoscar/platform-web 0.1.0-next.19 → 0.1.0-next.21
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/CHANGELOG.md +21 -0
- package/README.md +5 -3
- package/dist/alerts/headless/client.d.ts +134 -0
- package/dist/alerts/headless/client.d.ts.map +1 -0
- package/dist/alerts/headless/client.js +105 -0
- package/dist/alerts/headless/client.js.map +1 -0
- package/dist/alerts/headless/format.d.ts +95 -0
- package/dist/alerts/headless/format.d.ts.map +1 -0
- package/dist/alerts/headless/format.js +164 -0
- package/dist/alerts/headless/format.js.map +1 -0
- package/dist/alerts/headless/hooks.d.ts +245 -0
- package/dist/alerts/headless/hooks.d.ts.map +1 -0
- package/dist/alerts/headless/hooks.js +315 -0
- package/dist/alerts/headless/hooks.js.map +1 -0
- package/dist/alerts/headless/index.d.ts +9 -0
- package/dist/alerts/headless/index.d.ts.map +1 -0
- package/dist/alerts/headless/index.js +9 -0
- package/dist/alerts/headless/index.js.map +1 -0
- package/dist/alerts/headless/rule-draft.d.ts +175 -0
- package/dist/alerts/headless/rule-draft.d.ts.map +1 -0
- package/dist/alerts/headless/rule-draft.js +261 -0
- package/dist/alerts/headless/rule-draft.js.map +1 -0
- package/dist/alerts/ui/AlertIncidentDrawer.d.ts +30 -0
- package/dist/alerts/ui/AlertIncidentDrawer.d.ts.map +1 -0
- package/dist/alerts/ui/AlertIncidentDrawer.js +33 -0
- package/dist/alerts/ui/AlertIncidentDrawer.js.map +1 -0
- package/dist/alerts/ui/AlertRuleDialog.d.ts +47 -0
- package/dist/alerts/ui/AlertRuleDialog.d.ts.map +1 -0
- package/dist/alerts/ui/AlertRuleDialog.js +124 -0
- package/dist/alerts/ui/AlertRuleDialog.js.map +1 -0
- package/dist/alerts/ui/AlertRuleTestResult.d.ts +23 -0
- package/dist/alerts/ui/AlertRuleTestResult.d.ts.map +1 -0
- package/dist/alerts/ui/AlertRuleTestResult.js +30 -0
- package/dist/alerts/ui/AlertRuleTestResult.js.map +1 -0
- package/dist/alerts/ui/AlertsPage.d.ts +41 -0
- package/dist/alerts/ui/AlertsPage.d.ts.map +1 -0
- package/dist/alerts/ui/AlertsPage.js +238 -0
- package/dist/alerts/ui/AlertsPage.js.map +1 -0
- package/dist/alerts/ui/FiringAlertsBanner.d.ts +28 -0
- package/dist/alerts/ui/FiringAlertsBanner.d.ts.map +1 -0
- package/dist/alerts/ui/FiringAlertsBanner.js +45 -0
- package/dist/alerts/ui/FiringAlertsBanner.js.map +1 -0
- package/dist/alerts/ui/copy.d.ts +15 -0
- package/dist/alerts/ui/copy.d.ts.map +1 -0
- package/dist/alerts/ui/copy.js +14 -0
- package/dist/alerts/ui/copy.js.map +1 -0
- package/dist/alerts/ui/index.d.ts +14 -0
- package/dist/alerts/ui/index.d.ts.map +1 -0
- package/dist/alerts/ui/index.js +12 -0
- package/dist/alerts/ui/index.js.map +1 -0
- package/dist/alerts/ui/parts.d.ts +26 -0
- package/dist/alerts/ui/parts.d.ts.map +1 -0
- package/dist/alerts/ui/parts.js +27 -0
- package/dist/alerts/ui/parts.js.map +1 -0
- package/dist/alerts/ui/settings.d.ts +27 -0
- package/dist/alerts/ui/settings.d.ts.map +1 -0
- package/dist/alerts/ui/settings.js +37 -0
- package/dist/alerts/ui/settings.js.map +1 -0
- package/dist/nodes/headless/api.d.ts +3 -1
- package/dist/nodes/headless/api.d.ts.map +1 -1
- package/dist/nodes/headless/api.js +22 -0
- package/dist/nodes/headless/api.js.map +1 -1
- package/dist/nodes/headless/index.d.ts +7 -2
- package/dist/nodes/headless/index.d.ts.map +1 -1
- package/dist/nodes/headless/index.js +4 -1
- package/dist/nodes/headless/index.js.map +1 -1
- package/dist/nodes/headless/node-events.d.ts +43 -0
- package/dist/nodes/headless/node-events.d.ts.map +1 -0
- package/dist/nodes/headless/node-events.js +150 -0
- package/dist/nodes/headless/node-events.js.map +1 -0
- package/dist/nodes/headless/power.d.ts +43 -0
- package/dist/nodes/headless/power.d.ts.map +1 -0
- package/dist/nodes/headless/power.js +74 -0
- package/dist/nodes/headless/power.js.map +1 -0
- package/dist/nodes/headless/types.d.ts +40 -3
- package/dist/nodes/headless/types.d.ts.map +1 -1
- package/dist/nodes/headless/types.js +1 -1
- package/dist/nodes/headless/types.js.map +1 -1
- package/dist/nodes/headless/use-node-events.d.ts +59 -0
- package/dist/nodes/headless/use-node-events.d.ts.map +1 -0
- package/dist/nodes/headless/use-node-events.js +159 -0
- package/dist/nodes/headless/use-node-events.js.map +1 -0
- package/dist/nodes/ui/NodeEventsTimeline.d.ts +39 -0
- package/dist/nodes/ui/NodeEventsTimeline.d.ts.map +1 -0
- package/dist/nodes/ui/NodeEventsTimeline.js +63 -0
- package/dist/nodes/ui/NodeEventsTimeline.js.map +1 -0
- package/dist/nodes/ui/NodePowerBadge.d.ts +27 -0
- package/dist/nodes/ui/NodePowerBadge.d.ts.map +1 -0
- package/dist/nodes/ui/NodePowerBadge.js +48 -0
- package/dist/nodes/ui/NodePowerBadge.js.map +1 -0
- package/dist/nodes/ui/NodeVitalsDialog.d.ts +11 -1
- package/dist/nodes/ui/NodeVitalsDialog.d.ts.map +1 -1
- package/dist/nodes/ui/NodeVitalsDialog.js +14 -5
- package/dist/nodes/ui/NodeVitalsDialog.js.map +1 -1
- package/dist/nodes/ui/WorkersPage.d.ts.map +1 -1
- package/dist/nodes/ui/WorkersPage.js +2 -1
- package/dist/nodes/ui/WorkersPage.js.map +1 -1
- package/dist/nodes/ui/workerVitals.d.ts +17 -1
- package/dist/nodes/ui/workerVitals.d.ts.map +1 -1
- package/dist/nodes/ui/workerVitals.js +43 -0
- package/dist/nodes/ui/workerVitals.js.map +1 -1
- package/dist/nodes/ui/workersTable.d.ts.map +1 -1
- package/dist/nodes/ui/workersTable.js +2 -1
- package/dist/nodes/ui/workersTable.js.map +1 -1
- package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +1 -1
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +11 -0
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -1
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +17 -2
- package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -1
- package/dist/webhooks/headless/client.d.ts +101 -0
- package/dist/webhooks/headless/client.d.ts.map +1 -0
- package/dist/webhooks/headless/client.js +105 -0
- package/dist/webhooks/headless/client.js.map +1 -0
- package/dist/webhooks/headless/event-selection.d.ts +119 -0
- package/dist/webhooks/headless/event-selection.d.ts.map +1 -0
- package/dist/webhooks/headless/event-selection.js +225 -0
- package/dist/webhooks/headless/event-selection.js.map +1 -0
- package/dist/webhooks/headless/format.d.ts +84 -0
- package/dist/webhooks/headless/format.d.ts.map +1 -0
- package/dist/webhooks/headless/format.js +142 -0
- package/dist/webhooks/headless/format.js.map +1 -0
- package/dist/webhooks/headless/hooks.d.ts +199 -0
- package/dist/webhooks/headless/hooks.d.ts.map +1 -0
- package/dist/webhooks/headless/hooks.js +249 -0
- package/dist/webhooks/headless/hooks.js.map +1 -0
- package/dist/webhooks/headless/index.d.ts +9 -0
- package/dist/webhooks/headless/index.d.ts.map +1 -0
- package/dist/webhooks/headless/index.js +9 -0
- package/dist/webhooks/headless/index.js.map +1 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts +32 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.js +64 -0
- package/dist/webhooks/ui/WebhookDeliveryDrawer.js.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.d.ts +21 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.js +96 -0
- package/dist/webhooks/ui/WebhookEndpointDetail.js.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.d.ts +39 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.js +79 -0
- package/dist/webhooks/ui/WebhookEndpointDialog.js.map +1 -0
- package/dist/webhooks/ui/WebhookEventPicker.d.ts +30 -0
- package/dist/webhooks/ui/WebhookEventPicker.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookEventPicker.js +33 -0
- package/dist/webhooks/ui/WebhookEventPicker.js.map +1 -0
- package/dist/webhooks/ui/WebhookSecretDialog.d.ts +27 -0
- package/dist/webhooks/ui/WebhookSecretDialog.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookSecretDialog.js +52 -0
- package/dist/webhooks/ui/WebhookSecretDialog.js.map +1 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.d.ts +18 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.js +40 -0
- package/dist/webhooks/ui/WebhookSignatureHelp.js.map +1 -0
- package/dist/webhooks/ui/WebhooksPage.d.ts +47 -0
- package/dist/webhooks/ui/WebhooksPage.d.ts.map +1 -0
- package/dist/webhooks/ui/WebhooksPage.js +172 -0
- package/dist/webhooks/ui/WebhooksPage.js.map +1 -0
- package/dist/webhooks/ui/copy.d.ts +24 -0
- package/dist/webhooks/ui/copy.d.ts.map +1 -0
- package/dist/webhooks/ui/copy.js +34 -0
- package/dist/webhooks/ui/copy.js.map +1 -0
- package/dist/webhooks/ui/index.d.ts +15 -0
- package/dist/webhooks/ui/index.d.ts.map +1 -0
- package/dist/webhooks/ui/index.js +12 -0
- package/dist/webhooks/ui/index.js.map +1 -0
- package/dist/webhooks/ui/parts.d.ts +25 -0
- package/dist/webhooks/ui/parts.d.ts.map +1 -0
- package/dist/webhooks/ui/parts.js +28 -0
- package/dist/webhooks/ui/parts.js.map +1 -0
- package/dist/webhooks/ui/settings.d.ts +58 -0
- package/dist/webhooks/ui/settings.d.ts.map +1 -0
- package/dist/webhooks/ui/settings.js +79 -0
- package/dist/webhooks/ui/settings.js.map +1 -0
- package/package.json +18 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-events.js","sourceRoot":"","sources":["../../../src/nodes/headless/node-events.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iEAAiE;AACjE,gFAAgF;AAChF,EAAE;AACF,yEAAyE;AACzE,iFAAiF;AACjF,oFAAoF;AACpF,uEAAuE;AACvE,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,2DAA2D;AAC3D,EAAE;AACF,iEAAiE;AACjE,gFAAgF;AAEhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,iEAAiE;AACjE,MAAM,iBAAiB,GAAqC,MAAM,CAAC,MAAM,CAAC;IACxE,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,sBAAsB;IAC/D,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,aAAa;IAC7C,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,kBAAkB;IACvD,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,mBAAmB;IACzD,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,oBAAoB;IACtD,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,gBAAgB;CAC9C,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,mEAAmE;AACnE,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAID,SAAS,UAAU,CAAC,KAA+B,EAAE,GAAW;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,kBAAkB,GAAqC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAEjI,SAAS,eAAe,CAAC,KAA4B;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC1D,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAC5C,CAAC;AAED,SAAS,SAAS,CAAC,KAAgB;IACjC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvH,OAAO,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA8C;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAEjD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,gBAAgB,CAAC,oBAAoB;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBACvD,MAAM,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/E,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5E,CAAC;YACD,MAAM;QACR,KAAK,gBAAgB,CAAC,WAAW,CAAC;QAClC,KAAK,gBAAgB,CAAC,gBAAgB,CAAC;QACvC,KAAK,gBAAgB,CAAC,iBAAiB;YACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9G,CAAC;YACD,MAAM;QACR,KAAK,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,cAAc,cAAc,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;YACzE,MAAM;QACR,CAAC;QACD,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACjD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;YAC/H,CAAC;YACD,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;YACrE,MAAM;QACR,CAAC;QACD;YACE,MAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;SACvI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { NodePower } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* At or under this battery charge the badge reads in the warning colour.
|
|
4
|
+
*
|
|
5
|
+
* @stability experimental
|
|
6
|
+
*/
|
|
7
|
+
export declare const NODE_BATTERY_WARNING_PERCENT = 20;
|
|
8
|
+
/**
|
|
9
|
+
* At or under this battery charge the badge reads in the error colour.
|
|
10
|
+
*
|
|
11
|
+
* @stability experimental
|
|
12
|
+
*/
|
|
13
|
+
export declare const NODE_BATTERY_CRITICAL_PERCENT = 10;
|
|
14
|
+
/**
|
|
15
|
+
* A node's power state, ready to draw.
|
|
16
|
+
*
|
|
17
|
+
* @stability experimental
|
|
18
|
+
*/
|
|
19
|
+
export interface NodePowerDescription {
|
|
20
|
+
/** Where power comes from (`unknown` is never described). */
|
|
21
|
+
source: 'ac' | 'battery';
|
|
22
|
+
/** Battery charge, rounded to a whole percent, or `null` when not reported. */
|
|
23
|
+
percent: number | null;
|
|
24
|
+
/** Whether the battery is charging, or `null` when not reported. */
|
|
25
|
+
charging: boolean | null;
|
|
26
|
+
/** `warning` at or under 20%, `error` at or under 10%, on battery only. */
|
|
27
|
+
level: 'normal' | 'warning' | 'error';
|
|
28
|
+
/** The short visible text: `42%`, `AC`. */
|
|
29
|
+
text: string;
|
|
30
|
+
/** The full sentence, the accessible label: "On battery, 42%, discharging". */
|
|
31
|
+
label: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The badge's words and level for a node's reported power, or `null` when
|
|
35
|
+
* there is nothing to draw (no report, or source `unknown`).
|
|
36
|
+
*
|
|
37
|
+
* @param power - `lastVitals.power`, if any.
|
|
38
|
+
* @returns the description, or `null`.
|
|
39
|
+
*
|
|
40
|
+
* @stability experimental
|
|
41
|
+
*/
|
|
42
|
+
export declare function describeNodePower(power: NodePower | null | undefined): NodePowerDescription | null;
|
|
43
|
+
//# sourceMappingURL=power.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/power.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACtC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,oBAAoB,GAAG,IAAI,CAkClG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// A node's power state, as the Worker Nodes page words it (issue #1045)
|
|
3
|
+
// =============================================================================
|
|
4
|
+
//
|
|
5
|
+
// A node on a laptop reports `vitals.power` (source, battery charge, charging);
|
|
6
|
+
// the fleet table shows a badge for it. This module is the badge's words and
|
|
7
|
+
// level, without markup: the UI draws the icon and the colour from the level,
|
|
8
|
+
// and the SAME sentence is its accessible label, so nothing rests on colour.
|
|
9
|
+
//
|
|
10
|
+
// Display only: a node on battery is not "unhealthy", and nothing here turns
|
|
11
|
+
// the reading into a health verdict (health is the API's, from the heartbeat).
|
|
12
|
+
// An `unknown` or absent source draws nothing: a desktop that cannot tell is not
|
|
13
|
+
// worth a badge on every row.
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* At or under this battery charge the badge reads in the warning colour.
|
|
17
|
+
*
|
|
18
|
+
* @stability experimental
|
|
19
|
+
*/
|
|
20
|
+
export const NODE_BATTERY_WARNING_PERCENT = 20;
|
|
21
|
+
/**
|
|
22
|
+
* At or under this battery charge the badge reads in the error colour.
|
|
23
|
+
*
|
|
24
|
+
* @stability experimental
|
|
25
|
+
*/
|
|
26
|
+
export const NODE_BATTERY_CRITICAL_PERCENT = 10;
|
|
27
|
+
/**
|
|
28
|
+
* The badge's words and level for a node's reported power, or `null` when
|
|
29
|
+
* there is nothing to draw (no report, or source `unknown`).
|
|
30
|
+
*
|
|
31
|
+
* @param power - `lastVitals.power`, if any.
|
|
32
|
+
* @returns the description, or `null`.
|
|
33
|
+
*
|
|
34
|
+
* @stability experimental
|
|
35
|
+
*/
|
|
36
|
+
export function describeNodePower(power) {
|
|
37
|
+
if (!power || typeof power !== 'object')
|
|
38
|
+
return null;
|
|
39
|
+
const percent = typeof power.batteryPercent === 'number' && Number.isFinite(power.batteryPercent)
|
|
40
|
+
? Math.round(Math.min(100, Math.max(0, power.batteryPercent)))
|
|
41
|
+
: null;
|
|
42
|
+
const charging = typeof power.charging === 'boolean' ? power.charging : null;
|
|
43
|
+
if (power.source === 'ac') {
|
|
44
|
+
const parts = ['On AC power'];
|
|
45
|
+
if (percent !== null)
|
|
46
|
+
parts.push(`battery ${percent}%`);
|
|
47
|
+
if (charging === true)
|
|
48
|
+
parts.push('charging');
|
|
49
|
+
return { source: 'ac', percent, charging, level: 'normal', text: 'AC', label: parts.join(', ') };
|
|
50
|
+
}
|
|
51
|
+
if (power.source !== 'battery')
|
|
52
|
+
return null;
|
|
53
|
+
const level = percent !== null && percent <= NODE_BATTERY_CRITICAL_PERCENT
|
|
54
|
+
? 'error'
|
|
55
|
+
: percent !== null && percent <= NODE_BATTERY_WARNING_PERCENT
|
|
56
|
+
? 'warning'
|
|
57
|
+
: 'normal';
|
|
58
|
+
const parts = ['On battery'];
|
|
59
|
+
if (percent !== null)
|
|
60
|
+
parts.push(`${percent}%`);
|
|
61
|
+
if (charging !== null)
|
|
62
|
+
parts.push(charging ? 'charging' : 'discharging');
|
|
63
|
+
if (power.lowPowerMode === true)
|
|
64
|
+
parts.push('low power mode');
|
|
65
|
+
return {
|
|
66
|
+
source: 'battery',
|
|
67
|
+
percent,
|
|
68
|
+
charging,
|
|
69
|
+
level,
|
|
70
|
+
text: percent !== null ? `${percent}%` : 'Battery',
|
|
71
|
+
label: parts.join(', '),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=power.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power.js","sourceRoot":"","sources":["../../../src/nodes/headless/power.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wEAAwE;AACxE,gFAAgF;AAChF,EAAE;AACF,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,iFAAiF;AACjF,8BAA8B;AAC9B,gFAAgF;AAIhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAsBhD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmC;IACnE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/E,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACnG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,KAAK,GACT,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,6BAA6B;QAC1D,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,4BAA4B;YAC3D,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,QAAQ,CAAC;IACjB,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7B,IAAI,OAAO,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9D,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,OAAO;QACP,QAAQ;QACR,KAAK;QACL,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS;QAClD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { z } from 'zod';
|
|
2
|
-
import type { AdminNode, AdminNodeCredential, NodeCredentialCreated, NodeHealth, NodeJobCounts, NodeOwner, NodeStatus, NodeVitals, NodeVitalsCounters, createNodeCredentialSchema } from '@marinoscar/platform-contract/nodes';
|
|
3
|
-
export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
|
|
4
|
-
export type { NodeCredentialCreated, NodeHealth, NodeJobCounts, NodeOwner, NodeStatus, NodeVitals, NodeVitalsCounters, };
|
|
2
|
+
import type { AdminNode, AdminNodeCredential, AdminNodeEvent, AdminNodeEventList, NodeCredentialCreated, NodeHealth, NodeHostVitals, NodeJobCounts, NodeOwner, NodePower, NodeStatus, NodeVitals, NodeVitalsCounters, createNodeCredentialSchema } from '@marinoscar/platform-contract/nodes';
|
|
3
|
+
export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_EVENT_TYPES, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
|
|
4
|
+
export type { NodeCredentialCreated, NodeHealth, NodeHostVitals, NodeJobCounts, NodeOwner, NodePower, NodeStatus, NodeVitals, NodeVitalsCounters, };
|
|
5
5
|
/**
|
|
6
6
|
* One node as `GET /api/admin/nodes` returns it (`AdminNodeDto`,
|
|
7
7
|
* `adminNodeSchema`).
|
|
@@ -9,6 +9,43 @@ export type { NodeCredentialCreated, NodeHealth, NodeJobCounts, NodeOwner, NodeS
|
|
|
9
9
|
* @stability experimental
|
|
10
10
|
*/
|
|
11
11
|
export type WorkerNode = AdminNode;
|
|
12
|
+
/**
|
|
13
|
+
* One stored node event as `GET /api/admin/nodes/:id/events` returns it
|
|
14
|
+
* (`adminNodeEventSchema`, #1045): a power change, a low battery, a wake from
|
|
15
|
+
* sleep, a low disk. `type` is an OPEN dotted string (`NODE_EVENT_TYPES` names
|
|
16
|
+
* the platform's own); `occurredAt` is the node's clock, `receivedAt` the server's.
|
|
17
|
+
*
|
|
18
|
+
* @stability experimental
|
|
19
|
+
*/
|
|
20
|
+
export type WorkerNodeEvent = AdminNodeEvent;
|
|
21
|
+
/**
|
|
22
|
+
* A page of node events (`adminNodeEventListSchema`), newest first.
|
|
23
|
+
*
|
|
24
|
+
* @stability experimental
|
|
25
|
+
*/
|
|
26
|
+
export type WorkerNodeEventList = AdminNodeEventList;
|
|
27
|
+
/**
|
|
28
|
+
* How loud a node event is: `info`, `warning` or `critical`.
|
|
29
|
+
*
|
|
30
|
+
* @stability experimental
|
|
31
|
+
*/
|
|
32
|
+
export type NodeEventSeverity = AdminNodeEvent['severity'];
|
|
33
|
+
/**
|
|
34
|
+
* The query `GET /api/admin/nodes/:id/events` takes. Every member optional; an absent
|
|
35
|
+
* one is left out of the query string (the API's defaults apply).
|
|
36
|
+
*
|
|
37
|
+
* @stability experimental
|
|
38
|
+
*/
|
|
39
|
+
export interface NodeEventsQuery {
|
|
40
|
+
/** 1-based page. */
|
|
41
|
+
page?: number;
|
|
42
|
+
/** Events per page. */
|
|
43
|
+
pageSize?: number;
|
|
44
|
+
/** Only events of this exact type (`power.battery_low`). */
|
|
45
|
+
type?: string;
|
|
46
|
+
/** Only events of this severity. */
|
|
47
|
+
severity?: NodeEventSeverity;
|
|
48
|
+
}
|
|
12
49
|
/**
|
|
13
50
|
* One credential as `GET /api/admin/nodes/credentials` returns it
|
|
14
51
|
* (`AdminNodeCredentialDto`, `adminNodeCredentialSchema`). No `token`, no hash;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,EAC3D,GAAG,GAAE,IAAiB,GACrB,oBAAoB,CAStB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,EAC3D,GAAG,GAAE,IAAiB,GACrB,oBAAoB,CAStB"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
// heartbeat against the `nodes.staleHeartbeatSeconds` system setting, which
|
|
20
20
|
// the browser does not read), so nothing in this slice recomputes it.
|
|
21
21
|
// =============================================================================
|
|
22
|
-
export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
|
|
22
|
+
export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_EVENT_TYPES, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
|
|
23
23
|
/**
|
|
24
24
|
* Whether a credential can still authenticate a node right now.
|
|
25
25
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,wFAAwF;AACxF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,eAAe;AACf,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,gFAAgF;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,wFAAwF;AACxF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,eAAe;AACf,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,gFAAgF;AAoBhF,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AAsF7C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA2D,EAC3D,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,0EAA0E;IAC1E,yEAAyE;IACzE,gDAAgD;IAChD,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACtF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One node's recent events (issue #1045): `GET /api/admin/nodes/:id/events`, newest
|
|
3
|
+
* first, with "load more".
|
|
4
|
+
*
|
|
5
|
+
* The same contract as the fleet hooks (`use-worker-nodes.ts`): every function
|
|
6
|
+
* resolves rather than throws, and a failure is a STRING the caller renders.
|
|
7
|
+
*
|
|
8
|
+
* The first page is asked for when the node or the filters change; `loadMore`
|
|
9
|
+
* appends the next page; `refresh` re-reads from the first page WITHOUT raising
|
|
10
|
+
* the loading flag (the list stays on screen). An event that arrives between a
|
|
11
|
+
* first page and a "load more" shifts the pages by one, so an appended page is
|
|
12
|
+
* de-duplicated by id rather than trusted to start where the last one ended.
|
|
13
|
+
*
|
|
14
|
+
* The query is read member by member (`page`, `pageSize`, `type`, `severity`),
|
|
15
|
+
* so an inline object literal does not re-fetch on every render.
|
|
16
|
+
*/
|
|
17
|
+
import type { NodesApi } from './api.js';
|
|
18
|
+
import type { NodeEventsQuery, WorkerNodeEvent } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* What {@link useNodeEvents} returns.
|
|
21
|
+
*
|
|
22
|
+
* @stability experimental
|
|
23
|
+
*/
|
|
24
|
+
export interface UseNodeEventsResult {
|
|
25
|
+
/** The events read so far, newest first; emptied on an error or with no node. */
|
|
26
|
+
events: WorkerNodeEvent[];
|
|
27
|
+
/** How many events the node has in total (for the filters), `0` before an answer. */
|
|
28
|
+
total: number;
|
|
29
|
+
/** Whether a further page exists. */
|
|
30
|
+
hasMore: boolean;
|
|
31
|
+
/** The first page is in flight. */
|
|
32
|
+
isLoading: boolean;
|
|
33
|
+
/** A `loadMore` page is in flight. */
|
|
34
|
+
isLoadingMore: boolean;
|
|
35
|
+
/** The last failure as a sentence, or `null`. */
|
|
36
|
+
error: string | null;
|
|
37
|
+
/** Re-read from the first page without raising the loading flag. */
|
|
38
|
+
refresh: () => Promise<void>;
|
|
39
|
+
/** Append the next page. A no-op while one is in flight or when there is none. */
|
|
40
|
+
loadMore: () => Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* `GET /api/admin/nodes/:id/events`: a node's events, newest first, page by page.
|
|
44
|
+
*
|
|
45
|
+
* @param nodeId - the node id, or `null` to ask for nothing.
|
|
46
|
+
* @param query - the first page, its size and the filters (every member optional).
|
|
47
|
+
* @param api - a client to use instead of the adapters' or the host's.
|
|
48
|
+
* @returns the events and their state.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```tsx
|
|
52
|
+
* const { events, hasMore, loadMore } = useNodeEvents(node.id, { pageSize: 20, severity: 'critical' });
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @extensionPoint hook
|
|
56
|
+
* @stability experimental
|
|
57
|
+
*/
|
|
58
|
+
export declare function useNodeEvents(nodeId: string | null, query?: NodeEventsQuery, api?: NodesApi): UseNodeEventsResult;
|
|
59
|
+
//# sourceMappingURL=use-node-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-node-events.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/use-node-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAExF;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,iDAAiD;IACjD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AA2BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAE,eAAoB,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,mBAAmB,CAqGrH"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One node's recent events (issue #1045): `GET /api/admin/nodes/:id/events`, newest
|
|
3
|
+
* first, with "load more".
|
|
4
|
+
*
|
|
5
|
+
* The same contract as the fleet hooks (`use-worker-nodes.ts`): every function
|
|
6
|
+
* resolves rather than throws, and a failure is a STRING the caller renders.
|
|
7
|
+
*
|
|
8
|
+
* The first page is asked for when the node or the filters change; `loadMore`
|
|
9
|
+
* appends the next page; `refresh` re-reads from the first page WITHOUT raising
|
|
10
|
+
* the loading flag (the list stays on screen). An event that arrives between a
|
|
11
|
+
* first page and a "load more" shifts the pages by one, so an appended page is
|
|
12
|
+
* de-duplicated by id rather than trusted to start where the last one ended.
|
|
13
|
+
*
|
|
14
|
+
* The query is read member by member (`page`, `pageSize`, `type`, `severity`),
|
|
15
|
+
* so an inline object literal does not re-fetch on every render.
|
|
16
|
+
*/
|
|
17
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
18
|
+
import { isPlatformApiError } from '../../core/index.js';
|
|
19
|
+
import { useIsMounted } from '../internal/use-is-mounted.js';
|
|
20
|
+
import { useNodesApi } from './adapters.js';
|
|
21
|
+
/**
|
|
22
|
+
* The page as the hook keeps it. A malformed answer (no `items` array: a
|
|
23
|
+
* transport that resolved nothing, an older server's unrelated body) reads as
|
|
24
|
+
* an empty page rather than crashing the dialog that shows it.
|
|
25
|
+
*/
|
|
26
|
+
function normalized(data) {
|
|
27
|
+
const items = data && Array.isArray(data.items) ? data.items : [];
|
|
28
|
+
const num = (value, fallback) => (typeof value === 'number' && Number.isFinite(value) ? value : fallback);
|
|
29
|
+
return {
|
|
30
|
+
items,
|
|
31
|
+
total: num(data?.total, items.length),
|
|
32
|
+
page: num(data?.page, 1),
|
|
33
|
+
pageSize: num(data?.pageSize, items.length),
|
|
34
|
+
totalPages: num(data?.totalPages, items.length > 0 ? 1 : 0),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function messageFor(err) {
|
|
38
|
+
if (isPlatformApiError(err)) {
|
|
39
|
+
if (err.status === 403)
|
|
40
|
+
return 'You do not have permission to view worker node events';
|
|
41
|
+
return err.message;
|
|
42
|
+
}
|
|
43
|
+
return 'Failed to load node events';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `GET /api/admin/nodes/:id/events`: a node's events, newest first, page by page.
|
|
47
|
+
*
|
|
48
|
+
* @param nodeId - the node id, or `null` to ask for nothing.
|
|
49
|
+
* @param query - the first page, its size and the filters (every member optional).
|
|
50
|
+
* @param api - a client to use instead of the adapters' or the host's.
|
|
51
|
+
* @returns the events and their state.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* const { events, hasMore, loadMore } = useNodeEvents(node.id, { pageSize: 20, severity: 'critical' });
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @extensionPoint hook
|
|
59
|
+
* @stability experimental
|
|
60
|
+
*/
|
|
61
|
+
export function useNodeEvents(nodeId, query = {}, api) {
|
|
62
|
+
const client = useNodesApi(api);
|
|
63
|
+
const { page: firstPage = 1, pageSize, type, severity } = query;
|
|
64
|
+
const [events, setEvents] = useState([]);
|
|
65
|
+
const [total, setTotal] = useState(0);
|
|
66
|
+
const [lastPage, setLastPage] = useState(0);
|
|
67
|
+
const [totalPages, setTotalPages] = useState(0);
|
|
68
|
+
const [isLoading, setIsLoading] = useState(nodeId !== null);
|
|
69
|
+
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
|
70
|
+
const [error, setError] = useState(null);
|
|
71
|
+
const isMounted = useIsMounted();
|
|
72
|
+
// Bumped by every first-page read, so a "load more" that settles after the
|
|
73
|
+
// node or the filters changed is dropped instead of appended to the new list.
|
|
74
|
+
const generation = useRef(0);
|
|
75
|
+
const loadingMore = useRef(false);
|
|
76
|
+
const pageQuery = useCallback((page) => ({
|
|
77
|
+
page,
|
|
78
|
+
...(pageSize !== undefined ? { pageSize } : {}),
|
|
79
|
+
...(type ? { type } : {}),
|
|
80
|
+
...(severity ? { severity } : {}),
|
|
81
|
+
}), [pageSize, type, severity]);
|
|
82
|
+
const load = useCallback(async (showLoading) => {
|
|
83
|
+
const run = ++generation.current;
|
|
84
|
+
if (nodeId === null) {
|
|
85
|
+
setEvents([]);
|
|
86
|
+
setTotal(0);
|
|
87
|
+
setLastPage(0);
|
|
88
|
+
setTotalPages(0);
|
|
89
|
+
setError(null);
|
|
90
|
+
setIsLoading(false);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (showLoading)
|
|
94
|
+
setIsLoading(true);
|
|
95
|
+
try {
|
|
96
|
+
const data = normalized(await client.listNodeEvents(nodeId, pageQuery(firstPage)));
|
|
97
|
+
if (isMounted() && run === generation.current) {
|
|
98
|
+
setEvents(data.items);
|
|
99
|
+
setTotal(data.total);
|
|
100
|
+
setLastPage(data.page);
|
|
101
|
+
setTotalPages(data.totalPages);
|
|
102
|
+
setError(null);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
if (isMounted() && run === generation.current) {
|
|
107
|
+
setError(messageFor(err));
|
|
108
|
+
setEvents([]);
|
|
109
|
+
setTotal(0);
|
|
110
|
+
setLastPage(0);
|
|
111
|
+
setTotalPages(0);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (isMounted() && showLoading && run === generation.current)
|
|
116
|
+
setIsLoading(false);
|
|
117
|
+
}
|
|
118
|
+
}, [client, nodeId, firstPage, pageQuery, isMounted]);
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
void load(true);
|
|
121
|
+
}, [load]);
|
|
122
|
+
const refresh = useCallback(async () => {
|
|
123
|
+
await load(false);
|
|
124
|
+
}, [load]);
|
|
125
|
+
const hasMore = nodeId !== null && lastPage > 0 && lastPage < totalPages;
|
|
126
|
+
const loadMore = useCallback(async () => {
|
|
127
|
+
if (nodeId === null || loadingMore.current || !(lastPage > 0 && lastPage < totalPages))
|
|
128
|
+
return;
|
|
129
|
+
const run = generation.current;
|
|
130
|
+
loadingMore.current = true;
|
|
131
|
+
setIsLoadingMore(true);
|
|
132
|
+
try {
|
|
133
|
+
const data = normalized(await client.listNodeEvents(nodeId, pageQuery(lastPage + 1)));
|
|
134
|
+
if (isMounted() && run === generation.current) {
|
|
135
|
+
setEvents((current) => {
|
|
136
|
+
const seen = new Set(current.map((event) => event.id));
|
|
137
|
+
return [...current, ...data.items.filter((event) => !seen.has(event.id))];
|
|
138
|
+
});
|
|
139
|
+
setTotal(data.total);
|
|
140
|
+
setLastPage(data.page);
|
|
141
|
+
setTotalPages(data.totalPages);
|
|
142
|
+
setError(null);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
// The events already shown stay: they are a history, not a verdict that
|
|
147
|
+
// a failed read would make wrong.
|
|
148
|
+
if (isMounted() && run === generation.current)
|
|
149
|
+
setError(messageFor(err));
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
loadingMore.current = false;
|
|
153
|
+
if (isMounted())
|
|
154
|
+
setIsLoadingMore(false);
|
|
155
|
+
}
|
|
156
|
+
}, [client, nodeId, lastPage, totalPages, pageQuery, isMounted]);
|
|
157
|
+
return { events, total, hasMore, isLoading, isLoadingMore, error, refresh, loadMore };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=use-node-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-node-events.js","sourceRoot":"","sources":["../../../src/nodes/headless/use-node-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node's recent events (issue #1045), the "Events" section of the node's
|
|
3
|
+
* detail dialog: newest first, a severity chip, the event's label, a one-line
|
|
4
|
+
* summary of its attributes, and when it happened (relative, with the absolute
|
|
5
|
+
* time on the node's clock and the server's receipt in the tooltip).
|
|
6
|
+
*
|
|
7
|
+
* Reads `GET /api/admin/nodes/:id/events` through `useNodeEvents`, page by page
|
|
8
|
+
* ("Load more"). Re-reads the first page when the page's poll ticks (`now`
|
|
9
|
+
* changes), but only while the first page is all that is shown: a poll must not
|
|
10
|
+
* throw away the pages an operator asked for.
|
|
11
|
+
*
|
|
12
|
+
* ACCESSIBILITY: a labelled list; severity is a word in a chip (the colour is
|
|
13
|
+
* the second cue); the relative time is a `<time>` with its ISO `dateTime`.
|
|
14
|
+
*/
|
|
15
|
+
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
|
|
16
|
+
import type { ChipProps } from '@mui/material';
|
|
17
|
+
import type { ReactElement } from 'react';
|
|
18
|
+
import type { NodeEventSeverity } from '../headless/index.js';
|
|
19
|
+
/** Events per page in the dialog. */
|
|
20
|
+
export declare const NODE_EVENTS_PAGE_SIZE = 20;
|
|
21
|
+
/** How each severity is drawn: a word, a colour, an icon. */
|
|
22
|
+
export declare const NODE_EVENT_SEVERITY_CHIPS: Record<NodeEventSeverity, {
|
|
23
|
+
label: string;
|
|
24
|
+
color: ChipProps['color'];
|
|
25
|
+
variant: ChipProps['variant'];
|
|
26
|
+
Icon: typeof InfoOutlinedIcon;
|
|
27
|
+
}>;
|
|
28
|
+
interface NodeEventsTimelineProps {
|
|
29
|
+
/** The node whose events to list. */
|
|
30
|
+
nodeId: string;
|
|
31
|
+
/** The page's render clock; a change re-reads the first page. */
|
|
32
|
+
now: Date;
|
|
33
|
+
/** Events per page. Default {@link NODE_EVENTS_PAGE_SIZE}. */
|
|
34
|
+
pageSize?: number;
|
|
35
|
+
}
|
|
36
|
+
/** The "Events" section of a node's detail dialog. */
|
|
37
|
+
export declare function NodeEventsTimeline({ nodeId, now, pageSize }: NodeEventsTimelineProps): ReactElement;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=NodeEventsTimeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeEventsTimeline.d.ts","sourceRoot":"","sources":["../../../src/nodes/ui/NodeEventsTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAGhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,sBAAsB,CAAC;AAG/E,qCAAqC;AACrC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,iBAAiB,EACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,gBAAgB,CAAA;CAAE,CAK3G,CAAC;AAwCF,UAAU,uBAAuB;IAC/B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,IAAI,CAAC;IACV,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAgC,EAAE,EAAE,uBAAuB,GAAG,YAAY,CAmE3H"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* A node's recent events (issue #1045), the "Events" section of the node's
|
|
4
|
+
* detail dialog: newest first, a severity chip, the event's label, a one-line
|
|
5
|
+
* summary of its attributes, and when it happened (relative, with the absolute
|
|
6
|
+
* time on the node's clock and the server's receipt in the tooltip).
|
|
7
|
+
*
|
|
8
|
+
* Reads `GET /api/admin/nodes/:id/events` through `useNodeEvents`, page by page
|
|
9
|
+
* ("Load more"). Re-reads the first page when the page's poll ticks (`now`
|
|
10
|
+
* changes), but only while the first page is all that is shown: a poll must not
|
|
11
|
+
* throw away the pages an operator asked for.
|
|
12
|
+
*
|
|
13
|
+
* ACCESSIBILITY: a labelled list; severity is a word in a chip (the colour is
|
|
14
|
+
* the second cue); the relative time is a `<time>` with its ISO `dateTime`.
|
|
15
|
+
*/
|
|
16
|
+
import ErrorOutlineIcon from '@mui/icons-material/ErrorOutlineOutlined';
|
|
17
|
+
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
|
|
18
|
+
import WarningAmberIcon from '@mui/icons-material/WarningAmber';
|
|
19
|
+
import { Alert, Box, Button, Chip, CircularProgress, Stack, Tooltip, Typography } from '@mui/material';
|
|
20
|
+
import { useEffect, useId, useRef } from 'react';
|
|
21
|
+
import { formatDateTime, nodeEventLabel, nodeEventSummary, useNodeEvents } from '../headless/index.js';
|
|
22
|
+
import { formatRelativeTime } from '../internal/relative-time.js';
|
|
23
|
+
/** Events per page in the dialog. */
|
|
24
|
+
export const NODE_EVENTS_PAGE_SIZE = 20;
|
|
25
|
+
/** How each severity is drawn: a word, a colour, an icon. */
|
|
26
|
+
export const NODE_EVENT_SEVERITY_CHIPS = {
|
|
27
|
+
info: { label: 'Info', color: 'default', variant: 'outlined', Icon: InfoOutlinedIcon },
|
|
28
|
+
warning: { label: 'Warning', color: 'warning', variant: 'filled', Icon: WarningAmberIcon },
|
|
29
|
+
critical: { label: 'Critical', color: 'error', variant: 'filled', Icon: ErrorOutlineIcon },
|
|
30
|
+
};
|
|
31
|
+
function severityChip(severity) {
|
|
32
|
+
// A severity the API does not know yet reads as info rather than crashing.
|
|
33
|
+
const spec = NODE_EVENT_SEVERITY_CHIPS[severity] ?? NODE_EVENT_SEVERITY_CHIPS.info;
|
|
34
|
+
const { Icon } = spec;
|
|
35
|
+
return (_jsx(Chip, { size: "small", label: spec.label, color: spec.color, variant: spec.variant, icon: _jsx(Icon, { fontSize: "small" }) }));
|
|
36
|
+
}
|
|
37
|
+
function EventRow({ event, now }) {
|
|
38
|
+
const summary = nodeEventSummary(event);
|
|
39
|
+
const absolute = `Occurred ${formatDateTime(event.occurredAt)} (node clock) · received ${formatDateTime(event.receivedAt)}`;
|
|
40
|
+
return (_jsxs(Box, { component: "li", "data-testid": `node-event-${event.id}`, sx: { py: 1, borderBottom: 1, borderColor: 'divider', '&:last-of-type': { borderBottom: 0 } }, children: [_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [severityChip(event.severity), _jsx(Typography, { variant: "body2", sx: { fontWeight: 600 }, children: nodeEventLabel(event.type) }), _jsx(Tooltip, { title: absolute, children: _jsx(Typography, { variant: "caption", color: "text.secondary", component: "time", dateTime: event.occurredAt, sx: { ml: 'auto' }, children: formatRelativeTime(event.occurredAt, now) }) })] }), summary && (_jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 0.25, overflowWrap: 'anywhere' }, children: summary }))] }));
|
|
41
|
+
}
|
|
42
|
+
/** The "Events" section of a node's detail dialog. */
|
|
43
|
+
export function NodeEventsTimeline({ nodeId, now, pageSize = NODE_EVENTS_PAGE_SIZE }) {
|
|
44
|
+
const headingId = useId();
|
|
45
|
+
const { events, total, hasMore, isLoading, isLoadingMore, error, refresh, loadMore } = useNodeEvents(nodeId, { pageSize });
|
|
46
|
+
// Follow the page's poll, but only while one page is shown (see the header).
|
|
47
|
+
// The latest `refresh` and page count are read through a ref at the tick, so
|
|
48
|
+
// the tick alone triggers the read.
|
|
49
|
+
const latest = useRef({ refresh, onlyFirstPage: true });
|
|
50
|
+
latest.current = { refresh, onlyFirstPage: events.length <= pageSize };
|
|
51
|
+
const firstTick = useRef(true);
|
|
52
|
+
const nowMs = now.getTime();
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (firstTick.current) {
|
|
55
|
+
firstTick.current = false;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (latest.current.onlyFirstPage)
|
|
59
|
+
void latest.current.refresh();
|
|
60
|
+
}, [nowMs]);
|
|
61
|
+
return (_jsxs(Box, { component: "section", "aria-labelledby": headingId, "data-testid": "node-events", children: [_jsx(Typography, { variant: "subtitle2", component: "h3", id: headingId, gutterBottom: true, children: "Events" }), isLoading && (_jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center' }, children: [_jsx(CircularProgress, { size: 16, "aria-label": "Loading events" }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: "Loading events\u2026" })] })), !isLoading && error && (_jsx(Alert, { severity: "error", sx: { mb: 1 }, children: error })), !isLoading && !error && events.length === 0 && (_jsx(Typography, { variant: "body2", color: "text.secondary", "data-testid": "node-events-empty", children: "This node has not reported any events. Nodes running an older CLI do not send them." })), !isLoading && events.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Box, { component: "ul", "aria-labelledby": headingId, sx: { listStyle: 'none', m: 0, p: 0 }, children: events.map((event) => (_jsx(EventRow, { event: event, now: now }, event.id))) }), _jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center', mt: 1 }, children: [_jsxs(Typography, { variant: "caption", color: "text.secondary", children: ["Showing ", events.length, " of ", total] }), hasMore && (_jsx(Button, { size: "small", onClick: () => void loadMore(), disabled: isLoadingMore, children: isLoadingMore ? 'Loading…' : 'Load more' }))] })] }))] }));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=NodeEventsTimeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeEventsTimeline.js","sourceRoot":"","sources":["../../../src/nodes/ui/NodeEventsTimeline.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node's power badge (issue #1045): a battery with its charge on battery, a
|
|
3
|
+
* plug on AC, nothing when the node did not say.
|
|
4
|
+
*
|
|
5
|
+
* The words come from `describeNodePower` (`/nodes/headless`); the badge only
|
|
6
|
+
* draws them. The charge is printed, the state is in the icon AND in the
|
|
7
|
+
* accessible label ("On battery, 42%, discharging"), and the colour (warning at
|
|
8
|
+
* 20% or under, error at 10% or under) is the secondary cue, never the only one.
|
|
9
|
+
*/
|
|
10
|
+
import type { ReactElement } from 'react';
|
|
11
|
+
import type { NodePower } from '../headless/index.js';
|
|
12
|
+
interface NodePowerBadgeProps {
|
|
13
|
+
/** `lastVitals.power`, if any. */
|
|
14
|
+
power: NodePower | null | undefined;
|
|
15
|
+
/** Dims the badge with the vitals of a node that is not healthy. */
|
|
16
|
+
stale?: boolean;
|
|
17
|
+
/** Beside a printed sentence: hidden from assistive technology, no tooltip. */
|
|
18
|
+
decorative?: boolean;
|
|
19
|
+
/** A test id for the badge's root. */
|
|
20
|
+
'data-testid'?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The badge, or `null` when there is nothing to draw (no report, `unknown`).
|
|
24
|
+
*/
|
|
25
|
+
export declare function NodePowerBadge({ power, stale, decorative, 'data-testid': testId, }: NodePowerBadgeProps): ReactElement | null;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=NodePowerBadge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodePowerBadge.d.ts","sourceRoot":"","sources":["../../../src/nodes/ui/NodePowerBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,UAAU,mBAAmB;IAC3B,kCAAkC;IAClC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAa,EACb,UAAkB,EAClB,aAAa,EAAE,MAAM,GACtB,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAsC3C"}
|