@burdenoff/microfe-bigconsole 2026.924.2 → 2026.925.1
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/dist/bigconsole/BigConsoleRoot.js +94 -84
- package/dist/bigconsole/BigConsoleRoot.js.map +1 -1
- package/dist/bigconsole/BigConsoleRoutes.js +137 -138
- package/dist/bigconsole/BigConsoleRoutes.js.map +1 -1
- package/dist/bigconsole/assistant/previewController.js +7 -7
- package/dist/bigconsole/components/DrilldownDashboardRenderer.js +17 -17
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +32 -32
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +52 -52
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +7 -7
- package/dist/bigconsole/components/dashboard/DashboardStatusPill.js +53 -0
- package/dist/bigconsole/components/dashboard/DashboardStatusPill.js.map +1 -0
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +60 -60
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +21 -21
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +36 -36
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +38 -38
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js.map +1 -1
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +121 -121
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js.map +1 -1
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +22 -22
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +53 -53
- package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +47 -47
- package/dist/bigconsole/components/dashboard/index.js +1 -0
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
- package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js +30 -29
- package/dist/bigconsole/components/datasink/DataSinkStatusBadge.js.map +1 -1
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +48 -48
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +126 -114
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js.map +1 -1
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
- package/dist/bigconsole/components/overview/DashboardGuide.js +214 -0
- package/dist/bigconsole/components/overview/DashboardGuide.js.map +1 -0
- package/dist/bigconsole/components/overview/DataHealthCard.js +97 -0
- package/dist/bigconsole/components/overview/DataHealthCard.js.map +1 -0
- package/dist/bigconsole/components/overview/OverviewQuickActions.js +32 -0
- package/dist/bigconsole/components/overview/OverviewQuickActions.js.map +1 -0
- package/dist/bigconsole/components/overview/OverviewStatCard.js +57 -0
- package/dist/bigconsole/components/overview/OverviewStatCard.js.map +1 -0
- package/dist/bigconsole/components/overview/RecentDashboardsPanel.js +107 -0
- package/dist/bigconsole/components/overview/RecentDashboardsPanel.js.map +1 -0
- package/dist/bigconsole/components/overview/dashboardGuideSteps.js +119 -0
- package/dist/bigconsole/components/overview/dashboardGuideSteps.js.map +1 -0
- package/dist/bigconsole/components/overview/index.js +8 -0
- package/dist/bigconsole/components/overview/overviewModel.js +119 -0
- package/dist/bigconsole/components/overview/overviewModel.js.map +1 -0
- package/dist/bigconsole/components/overview/useOverviewData.js +48 -0
- package/dist/bigconsole/components/overview/useOverviewData.js.map +1 -0
- package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
- package/dist/bigconsole/components/parser/ImportParserDialog.js +127 -127
- package/dist/bigconsole/components/parser/ImportParserDialog.js.map +1 -1
- package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
- package/dist/bigconsole/components/preview/AiPreviewContent.js +5 -5
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +32 -32
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +37 -37
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +13 -13
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +70 -70
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +28 -28
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +25 -25
- package/dist/bigconsole/components/widgets/chart/ChartConfig.js +48 -48
- package/dist/bigconsole/components/widgets/comments/WidgetComments.js +46 -46
- package/dist/bigconsole/components/widgets/event-logs/EventLogViewer.js +61 -61
- package/dist/bigconsole/components/widgets/form/FormWidget.js +36 -36
- package/dist/bigconsole/components/widgets/gauge/GaugeConfig.js +42 -42
- package/dist/bigconsole/components/widgets/heatmap/HeatmapConfig.js +25 -25
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +21 -21
- package/dist/bigconsole/components/widgets/list/ListConfig.js +30 -30
- package/dist/bigconsole/components/widgets/metric-card/MetricCardConfig.js +38 -38
- package/dist/bigconsole/components/widgets/metric-card/SparklineChart.js +9 -9
- package/dist/bigconsole/components/widgets/metric-card/TrendIndicator.js +9 -9
- package/dist/bigconsole/components/widgets/pivot-table/PivotTableWidget.js +49 -49
- package/dist/bigconsole/components/widgets/progress/ProgressConfig.js +39 -39
- package/dist/bigconsole/components/widgets/table/TableConfig.js +73 -73
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +10 -10
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +68 -68
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js.map +1 -1
- package/dist/bigconsole/hooks/useDataSinkOperations.js +92 -89
- package/dist/bigconsole/hooks/useDataSinkOperations.js.map +1 -1
- package/dist/bigconsole/hooks/useImportDataSink.js +96 -91
- package/dist/bigconsole/hooks/useImportDataSink.js.map +1 -1
- package/dist/bigconsole/pages/AdminPage.js +136 -136
- package/dist/bigconsole/pages/DashboardBuilderPage.js +10 -10
- package/dist/bigconsole/pages/DashboardViewPage.js +61 -61
- package/dist/bigconsole/pages/DashboardViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DashboardsPage.js +327 -348
- package/dist/bigconsole/pages/DashboardsPage.js.map +1 -1
- package/dist/bigconsole/pages/DataParsersPage.js +5 -5
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +82 -80
- package/dist/bigconsole/pages/DataSinkBuilderPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinkViewPage.js +83 -83
- package/dist/bigconsole/pages/DataSinkViewPage.js.map +1 -1
- package/dist/bigconsole/pages/DataSinksPage.js +11 -11
- package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
- package/dist/bigconsole/pages/InsightsPage.js +315 -315
- package/dist/bigconsole/pages/InsightsPage.js.map +1 -1
- package/dist/bigconsole/pages/OverviewPage.js +244 -0
- package/dist/bigconsole/pages/OverviewPage.js.map +1 -0
- package/dist/bigconsole/pages/ParserBuilderPage.js +5 -5
- package/dist/bigconsole/pages/ParserViewPage.js +98 -98
- package/dist/bigconsole/pages/ParserViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelineBuilderPage.js +8 -8
- package/dist/bigconsole/pages/PipelineViewPage.js +46 -46
- package/dist/bigconsole/pages/PipelineViewPage.js.map +1 -1
- package/dist/bigconsole/pages/PipelinesPage.js +80 -80
- package/dist/bigconsole/pages/PipelinesPage.js.map +1 -1
- package/dist/bigconsole/pages/SettingsPage.js +70 -70
- package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
- package/dist/bigconsole/pages/WorkflowViewPage.js +200 -200
- package/dist/bigconsole/pages/WorkflowViewPage.js.map +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +78 -78
- package/dist/bigconsole/pages/WorkflowsPage.js.map +1 -1
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +36 -35
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js.map +1 -1
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +34 -34
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +79 -79
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
- package/dist/bigconsole/utils/createDialogParam.js +14 -0
- package/dist/bigconsole/utils/createDialogParam.js.map +1 -0
- package/dist/bigconsole/utils/quota.js +51 -23
- package/dist/bigconsole/utils/quota.js.map +1 -1
- package/dist/generated/global-operations.js +1 -1
- package/dist/generated/wspace-operations.js +285 -222
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/shared/hooks/useTr.js +10 -7
- package/dist/shared/hooks/useTr.js.map +1 -1
- package/package.json +1 -1
- package/dist/bigconsole/pages/HomePage.js +0 -318
- package/dist/bigconsole/pages/HomePage.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overviewModel.js","names":[],"sources":["../../../../src/bigconsole/components/overview/overviewModel.ts"],"sourcesContent":["/**\n * Overview model — pure data shaping for the BigConsole Overview page.\n *\n * No React, no Apollo: everything here takes the GraphQL `data` shapes (or\n * `undefined` while a section is loading / not permitted) and returns what the\n * page renders. Structural input types keep this module independent of the\n * generated operation types so it is unit-testable without codegen.\n */\n\nimport type { DashboardListStatus } from '../../hooks/useDashboardOperations';\n\n// ============================================================================\n// Limits\n// ============================================================================\n\n/** Recent dashboards requested for the emphasis panel. */\nexport const RECENT_DASHBOARDS_LIMIT = 5;\n\n/** Errored / stale sinks requested per status for the data health card. */\nexport const DATA_HEALTH_ROW_LIMIT = 5;\n\n// ============================================================================\n// Input shapes (structural subsets of the generated query types)\n// ============================================================================\n\nexport interface OverviewDashboardNode {\n id: string;\n name: string;\n description?: string | null;\n status: string;\n widgetCount: number;\n updatedAt: string;\n}\n\nexport interface OverviewDashboardsData {\n listDashboards: {\n totalCount: number;\n edges: Array<{ node: OverviewDashboardNode }>;\n };\n}\n\nexport interface OverviewDataSinkNode {\n id: string;\n name?: string | null;\n key: string;\n lastRefreshedAt?: string | null;\n}\n\ninterface CountOnlyConnection {\n totalCount: number;\n}\n\ninterface DataSinkNodeConnection extends CountOnlyConnection {\n edges: Array<{ node: OverviewDataSinkNode }>;\n}\n\nexport interface OverviewDataSinksData {\n all: CountOnlyConnection;\n ready: CountOnlyConnection;\n errored: DataSinkNodeConnection;\n stale: DataSinkNodeConnection;\n}\n\n// ============================================================================\n// Dashboards\n// ============================================================================\n\nexport interface RecentDashboard {\n id: string;\n name: string;\n description: string | null;\n status: DashboardListStatus;\n widgetCount: number;\n updatedAt: string;\n}\n\nexport interface DashboardsSummary {\n /** Total dashboards the caller can read; `undefined` until loaded. */\n total: number | undefined;\n /** Most recently updated dashboards, newest first. */\n recent: RecentDashboard[];\n /** The dashboard the guide deep-links into (newest), if any. */\n latest: RecentDashboard | null;\n}\n\n/** Normalise the API enum to the list-status union the UI renders. */\nexport function toDashboardListStatus(status: string | null | undefined): DashboardListStatus {\n switch (status) {\n case 'PUBLISHED':\n return 'PUBLISHED';\n case 'ARCHIVED':\n return 'ARCHIVED';\n default:\n return 'DRAFT';\n }\n}\n\nexport function summarizeDashboards(data: OverviewDashboardsData | null | undefined): DashboardsSummary {\n if (!data) {\n return { total: undefined, recent: [], latest: null };\n }\n\n const recent = data.listDashboards.edges.slice(0, RECENT_DASHBOARDS_LIMIT).map(({ node }) => ({\n id: node.id,\n name: node.name,\n description: node.description?.trim() ? node.description.trim() : null,\n status: toDashboardListStatus(node.status),\n widgetCount: Math.max(0, node.widgetCount ?? 0),\n updatedAt: node.updatedAt,\n }));\n\n return {\n total: data.listDashboards.totalCount,\n recent,\n latest: recent[0] ?? null,\n };\n}\n\n// ============================================================================\n// Data sinks\n// ============================================================================\n\nexport type DataSinkAttentionStatus = 'error' | 'stale';\n\nexport interface DataSinkHealthRow {\n id: string;\n /** Display name — the sink name, or its key when the name is empty. */\n name: string;\n status: DataSinkAttentionStatus;\n lastRefreshedAt: string | null;\n}\n\nexport interface DataSinkSummary {\n /** Total data sinks; `undefined` until loaded. */\n total: number | undefined;\n /** Sinks in the `ready` state; `undefined` until loaded. */\n ready: number | undefined;\n /** Errored + stale sinks; `undefined` until loaded. */\n attentionCount: number | undefined;\n /**\n * Rows for the health card: errored sinks, then stale ones. Each status\n * contributes at most `limit` sinks in server order (by key); within a\n * status the rows are shown oldest refresh first.\n */\n rows: DataSinkHealthRow[];\n /** Sinks needing attention that are not listed in `rows`. */\n hiddenCount: number;\n}\n\nfunction toTimestamp(value: string | null): number {\n if (!value) return Number.NEGATIVE_INFINITY;\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed;\n}\n\nfunction toHealthRows(connection: DataSinkNodeConnection, status: DataSinkAttentionStatus): DataSinkHealthRow[] {\n return connection.edges\n .map(({ node }) => ({\n id: node.id,\n name: node.name?.trim() ? node.name.trim() : node.key,\n status,\n lastRefreshedAt: node.lastRefreshedAt ?? null,\n }))\n .sort((a, b) => toTimestamp(a.lastRefreshedAt) - toTimestamp(b.lastRefreshedAt));\n}\n\nexport function summarizeDataSinks(\n data: OverviewDataSinksData | null | undefined,\n limit: number = DATA_HEALTH_ROW_LIMIT\n): DataSinkSummary {\n if (!data) {\n return { total: undefined, ready: undefined, attentionCount: undefined, rows: [], hiddenCount: 0 };\n }\n\n const attentionCount = data.errored.totalCount + data.stale.totalCount;\n const seen = new Set<string>();\n const rows = [...toHealthRows(data.errored, 'error'), ...toHealthRows(data.stale, 'stale')]\n .filter((row) => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n })\n .slice(0, Math.max(0, limit));\n\n return {\n total: data.all.totalCount,\n ready: data.ready.totalCount,\n attentionCount,\n rows,\n hiddenCount: Math.max(0, attentionCount - rows.length),\n };\n}\n\n// ============================================================================\n// Guide default state\n// ============================================================================\n\nexport interface GuideDefaultInput {\n permissionsLoading: boolean;\n dashboardsAllowed: boolean;\n dashboardsLoading: boolean;\n dashboardsTotal: number | undefined;\n dashboardsFailed: boolean;\n}\n\n/**\n * Decide whether the dashboard guide starts expanded.\n *\n * Returns `null` while the answer is still unknown (permissions or the first\n * dashboards response pending) so the page can keep the guide collapsed\n * without flashing. Once known: expanded for a workspace with no dashboards,\n * or when the caller cannot see dashboards / the query failed (the guide is the\n * most useful thing on the page then); collapsed otherwise.\n */\nexport function resolveGuideDefaultExpanded(input: GuideDefaultInput): boolean | null {\n if (input.permissionsLoading) return null;\n if (!input.dashboardsAllowed || input.dashboardsFailed) return true;\n if (input.dashboardsTotal === undefined) return input.dashboardsLoading ? null : true;\n return input.dashboardsTotal === 0;\n}\n\n// ============================================================================\n// Relative time\n// ============================================================================\n\nexport type RelativeTime =\n { unit: 'justNow' } | { unit: 'minutes' | 'hours' | 'days'; count: number } | { unit: 'date'; date: Date };\n\nconst MINUTE_MS = 60_000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Bucket a timestamp relative to `now` (future timestamps read as \"just now\"). */\nexport function toRelativeTime(iso: string, now: Date): RelativeTime | null {\n const time = Date.parse(iso);\n if (Number.isNaN(time)) return null;\n\n const diff = now.getTime() - time;\n if (diff < MINUTE_MS) return { unit: 'justNow' };\n if (diff < HOUR_MS) return { unit: 'minutes', count: Math.floor(diff / MINUTE_MS) };\n if (diff < DAY_MS) return { unit: 'hours', count: Math.floor(diff / HOUR_MS) };\n if (diff < 7 * DAY_MS) return { unit: 'days', count: Math.floor(diff / DAY_MS) };\n return { unit: 'date', date: new Date(time) };\n}\n\nexport type OverviewTranslate = (key: string, fallback: string, params?: Record<string, string | number>) => string;\n\nfunction relativeTimeFormatter(locale: string): Intl.RelativeTimeFormat {\n try {\n return new Intl.RelativeTimeFormat(locale, { numeric: 'always', style: 'short' });\n } catch {\n // Unknown locale tag — fall back to the runtime default.\n return new Intl.RelativeTimeFormat(undefined, { numeric: 'always', style: 'short' });\n }\n}\n\nfunction dateFormatter(locale: string, includeYear: boolean): Intl.DateTimeFormat {\n const options: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric',\n year: includeYear ? 'numeric' : undefined,\n };\n try {\n return new Intl.DateTimeFormat(locale, options);\n } catch {\n return new Intl.DateTimeFormat(undefined, options);\n }\n}\n\n/**\n * Human \"updated …\" text for a timestamp, meant to be embedded mid-sentence\n * (\"Updated {{time}}\"): relative for the last week, a short locale date after\n * that. Relative values use `Intl.RelativeTimeFormat`, so plural forms are\n * correct in every locale. Returns `null` for an unparseable timestamp.\n */\nexport function formatRelativeTime(iso: string, now: Date, tr: OverviewTranslate, locale: string): string | null {\n const relative = toRelativeTime(iso, now);\n if (!relative) return null;\n\n switch (relative.unit) {\n case 'justNow':\n return tr('bigconsole.overview.time.justNow', 'just now');\n case 'minutes':\n return relativeTimeFormatter(locale).format(-relative.count, 'minute');\n case 'hours':\n return relativeTimeFormatter(locale).format(-relative.count, 'hour');\n case 'days':\n return relativeTimeFormatter(locale).format(-relative.count, 'day');\n case 'date':\n return dateFormatter(locale, relative.date.getFullYear() !== now.getFullYear()).format(relative.date);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useBigConsoleOverviewDashboardsQuery as e, useBigConsoleOverviewDataSinksQuery as t } from "../../../generated/wspace-operations.js";
|
|
2
|
+
import { BIGCONSOLE_PERMISSIONS as n } from "../../../constants/permissions.js";
|
|
3
|
+
import "./overviewModel.js";
|
|
4
|
+
import { useCallback as r } from "react";
|
|
5
|
+
import { usePermissions as i } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
6
|
+
//#region src/bigconsole/components/overview/useOverviewData.ts
|
|
7
|
+
function a() {}
|
|
8
|
+
function o() {
|
|
9
|
+
let { hasPermission: o, isLoading: s } = i(), c = !s && o(n.DASHBOARD_READ), l = !s && o(n.DATASINK_READ), u = e({
|
|
10
|
+
variables: { first: 5 },
|
|
11
|
+
skip: !c,
|
|
12
|
+
fetchPolicy: "cache-and-network",
|
|
13
|
+
notifyOnNetworkStatusChange: !0
|
|
14
|
+
}), d = t({
|
|
15
|
+
variables: { attentionFirst: 5 },
|
|
16
|
+
skip: !l,
|
|
17
|
+
fetchPolicy: "cache-and-network",
|
|
18
|
+
notifyOnNetworkStatusChange: !0
|
|
19
|
+
}), { refetch: f } = u, { refetch: p } = d, m = r(() => {
|
|
20
|
+
c && f().catch(a);
|
|
21
|
+
}, [c, f]), h = r(() => {
|
|
22
|
+
l && p().catch(a);
|
|
23
|
+
}, [l, p]), g = r(() => {
|
|
24
|
+
m(), h();
|
|
25
|
+
}, [m, h]);
|
|
26
|
+
return {
|
|
27
|
+
permissionsLoading: s,
|
|
28
|
+
dashboards: {
|
|
29
|
+
allowed: c,
|
|
30
|
+
data: c ? u.data : void 0,
|
|
31
|
+
loading: c && u.loading,
|
|
32
|
+
error: c ? u.error : void 0,
|
|
33
|
+
refetch: m
|
|
34
|
+
},
|
|
35
|
+
dataSinks: {
|
|
36
|
+
allowed: l,
|
|
37
|
+
data: l ? d.data : void 0,
|
|
38
|
+
loading: l && d.loading,
|
|
39
|
+
error: l ? d.error : void 0,
|
|
40
|
+
refetch: h
|
|
41
|
+
},
|
|
42
|
+
refetchAll: g
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { o as useOverviewData };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=useOverviewData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOverviewData.js","names":[],"sources":["../../../../src/bigconsole/components/overview/useOverviewData.ts"],"sourcesContent":["/**\n * useOverviewData Hook\n *\n * Loads the BigConsole Overview's two data sections — dashboards and data\n * sinks — each as its own operation gated on its own read permission.\n *\n * Why two operations: the gateway checks `@rbac` per top-level field and rejects\n * the entire operation when any check fails, so a combined query would blank\n * every section (and raise a permission toast) for a user who can read\n * dashboards but not data sinks. Queries skip until the permission set has\n * resolved; both fire in the same render and share one batched POST to the\n * workspace gateway.\n */\n\nimport { useCallback } from 'react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { BIGCONSOLE_PERMISSIONS } from '../../../constants/permissions';\nimport {\n useBigConsoleOverviewDashboardsQuery,\n useBigConsoleOverviewDataSinksQuery,\n type BigConsoleOverviewDashboardsQuery,\n type BigConsoleOverviewDataSinksQuery,\n} from '../../../generated/wspace-operations';\nimport { DATA_HEALTH_ROW_LIMIT, RECENT_DASHBOARDS_LIMIT } from './overviewModel';\n\nexport interface OverviewSectionState<TData> {\n /** The caller holds the read permission for this section. */\n allowed: boolean;\n data: TData | undefined;\n /** A request (initial load or refetch) is in flight. */\n loading: boolean;\n error: { message: string } | undefined;\n refetch: () => void;\n}\n\nexport interface UseOverviewDataResult {\n permissionsLoading: boolean;\n dashboards: OverviewSectionState<BigConsoleOverviewDashboardsQuery>;\n dataSinks: OverviewSectionState<BigConsoleOverviewDataSinksQuery>;\n /** Refetch every permitted section (the page's Refresh action). */\n refetchAll: () => void;\n}\n\nfunction ignoreRefetchRejection(): void {\n // A failed refetch is surfaced through the query's `error` state; nothing\n // else to do with the rejected promise.\n}\n\nexport function useOverviewData(): UseOverviewDataResult {\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const canReadDashboards = !permissionsLoading && hasPermission(BIGCONSOLE_PERMISSIONS.DASHBOARD_READ);\n const canReadDataSinks = !permissionsLoading && hasPermission(BIGCONSOLE_PERMISSIONS.DATASINK_READ);\n\n const dashboardsQuery = useBigConsoleOverviewDashboardsQuery({\n variables: { first: RECENT_DASHBOARDS_LIMIT },\n skip: !canReadDashboards,\n fetchPolicy: 'cache-and-network',\n notifyOnNetworkStatusChange: true,\n });\n\n const dataSinksQuery = useBigConsoleOverviewDataSinksQuery({\n variables: { attentionFirst: DATA_HEALTH_ROW_LIMIT },\n skip: !canReadDataSinks,\n fetchPolicy: 'cache-and-network',\n notifyOnNetworkStatusChange: true,\n });\n\n const { refetch: refetchDashboardsQuery } = dashboardsQuery;\n const { refetch: refetchDataSinksQuery } = dataSinksQuery;\n\n const refetchDashboards = useCallback(() => {\n if (!canReadDashboards) return;\n refetchDashboardsQuery().catch(ignoreRefetchRejection);\n }, [canReadDashboards, refetchDashboardsQuery]);\n\n const refetchDataSinks = useCallback(() => {\n if (!canReadDataSinks) return;\n refetchDataSinksQuery().catch(ignoreRefetchRejection);\n }, [canReadDataSinks, refetchDataSinksQuery]);\n\n const refetchAll = useCallback(() => {\n refetchDashboards();\n refetchDataSinks();\n }, [refetchDashboards, refetchDataSinks]);\n\n return {\n permissionsLoading,\n dashboards: {\n allowed: canReadDashboards,\n data: canReadDashboards ? dashboardsQuery.data : undefined,\n loading: canReadDashboards && dashboardsQuery.loading,\n error: canReadDashboards ? dashboardsQuery.error : undefined,\n refetch: refetchDashboards,\n },\n dataSinks: {\n allowed: canReadDataSinks,\n data: canReadDataSinks ? dataSinksQuery.data : undefined,\n loading: canReadDataSinks && dataSinksQuery.loading,\n error: canReadDataSinks ? dataSinksQuery.error : undefined,\n refetch: refetchDataSinks,\n },\n refetchAll,\n };\n}\n"],"mappings":";;;;;;AA2CA,SAAS,IAA+B;AAKxC,SAAgB,IAAyC;CACvD,IAAM,EAAE,kBAAe,WAAW,MAAuB,GAAgB,EACnE,IAAoB,CAAC,KAAsB,EAAc,EAAuB,eAAe,EAC/F,IAAmB,CAAC,KAAsB,EAAc,EAAuB,cAAc,EAE7F,IAAkB,EAAqC;EAC3D,WAAW,EAAE,OAAA,GAAgC;EAC7C,MAAM,CAAC;EACP,aAAa;EACb,6BAA6B;EAC9B,CAAC,EAEI,IAAiB,EAAoC;EACzD,WAAW,EAAE,gBAAA,GAAuC;EACpD,MAAM,CAAC;EACP,aAAa;EACb,6BAA6B;EAC9B,CAAC,EAEI,EAAE,SAAS,MAA2B,GACtC,EAAE,SAAS,MAA0B,GAErC,IAAoB,QAAkB;AACrC,OACL,GAAwB,CAAC,MAAM,EAAuB;IACrD,CAAC,GAAmB,EAAuB,CAAC,EAEzC,IAAmB,QAAkB;AACpC,OACL,GAAuB,CAAC,MAAM,EAAuB;IACpD,CAAC,GAAkB,EAAsB,CAAC,EAEvC,IAAa,QAAkB;AAEnC,EADA,GAAmB,EACnB,GAAkB;IACjB,CAAC,GAAmB,EAAiB,CAAC;AAEzC,QAAO;EACL;EACA,YAAY;GACV,SAAS;GACT,MAAM,IAAoB,EAAgB,OAAO,KAAA;GACjD,SAAS,KAAqB,EAAgB;GAC9C,OAAO,IAAoB,EAAgB,QAAQ,KAAA;GACnD,SAAS;GACV;EACD,WAAW;GACT,SAAS;GACT,MAAM,IAAmB,EAAe,OAAO,KAAA;GAC/C,SAAS,KAAoB,EAAe;GAC5C,OAAO,IAAmB,EAAe,QAAQ,KAAA;GACjD,SAAS;GACV;EACD;EACD"}
|
|
@@ -6,8 +6,8 @@ import n from "../../hooks/useDataSinkOperations.js";
|
|
|
6
6
|
import r from "../datasink/DataSinkStatusBadge.js";
|
|
7
7
|
import { Fragment as i, memo as a, useCallback as o, useMemo as s, useState as c } from "react";
|
|
8
8
|
import { Plus as l } from "lucide-react";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
10
|
+
import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
11
|
//#region src/bigconsole/components/parser/DataSinkSelector.tsx
|
|
12
12
|
var p = "sticky top-0 z-[1] bg-bg-sunken px-3 py-1.5 border-y border-[var(--color-border-default)]", m = "text-xs font-semibold uppercase tracking-wide text-text-secondary";
|
|
13
13
|
function h(e, t) {
|
|
@@ -20,19 +20,19 @@ function h(e, t) {
|
|
|
20
20
|
let o = Math.floor(a / 24);
|
|
21
21
|
return o < 7 ? t("bigconsole.parsers.dataSinkSelector.relativeTime.daysAgo", "{{days}}d ago", { days: o }) : n.toLocaleDateString();
|
|
22
22
|
}
|
|
23
|
-
var g = ({ className: e }) => /* @__PURE__ */
|
|
23
|
+
var g = ({ className: e }) => /* @__PURE__ */ u("svg", {
|
|
24
24
|
className: e,
|
|
25
25
|
fill: "none",
|
|
26
26
|
stroke: "currentColor",
|
|
27
27
|
viewBox: "0 0 24 24",
|
|
28
|
-
children: /* @__PURE__ */
|
|
28
|
+
children: /* @__PURE__ */ u("path", {
|
|
29
29
|
strokeLinecap: "round",
|
|
30
30
|
strokeLinejoin: "round",
|
|
31
31
|
strokeWidth: 2,
|
|
32
32
|
d: "M19 9l-7 7-7-7"
|
|
33
33
|
})
|
|
34
34
|
}), _ = a(function({ value: a, onChange: _, filterStatus: v, placeholder: y, disabled: b = !1, error: x = !1, errorMessage: S }) {
|
|
35
|
-
let { t: C } =
|
|
35
|
+
let { t: C } = f(), [w, T] = c(!1), [E, D] = c(""), O = y ?? C("bigconsole.parsers.dataSinkSelector.placeholder", "Select a data source..."), k = e(), { dataSinks: A, loading: j, fetchDataSinks: M } = n({ skipFetch: !1 }), N = s(() => A.filter((e) => {
|
|
36
36
|
if (v && e.status !== v) return !1;
|
|
37
37
|
if (E) {
|
|
38
38
|
let t = E.toLowerCase();
|
|
@@ -58,10 +58,10 @@ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
|
|
|
58
58
|
}, []), R = o(() => {
|
|
59
59
|
T(!1), window.open(k("/datasinks/new"), "_blank", "noopener,noreferrer");
|
|
60
60
|
}, [k]);
|
|
61
|
-
return /* @__PURE__ */
|
|
61
|
+
return /* @__PURE__ */ d("div", {
|
|
62
62
|
className: "relative",
|
|
63
63
|
children: [
|
|
64
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ d("button", {
|
|
65
65
|
type: "button",
|
|
66
66
|
onClick: I,
|
|
67
67
|
disabled: b,
|
|
@@ -80,40 +80,40 @@ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
|
|
|
80
80
|
${x ? "border-status-error-border" : "border-[var(--color-border-default)]"}
|
|
81
81
|
${w ? "border-action-primary-bg ring-2 ring-action-primary-bg/20" : ""}
|
|
82
82
|
`,
|
|
83
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ u("div", {
|
|
84
84
|
className: "flex-1 min-w-0",
|
|
85
|
-
children: P ? /* @__PURE__ */
|
|
85
|
+
children: P ? /* @__PURE__ */ d("div", {
|
|
86
86
|
className: "flex min-w-0 items-center gap-2",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
87
|
+
children: [/* @__PURE__ */ u(r, {
|
|
88
88
|
status: P.status,
|
|
89
89
|
size: "sm",
|
|
90
90
|
showIcon: !1
|
|
91
|
-
}), /* @__PURE__ */
|
|
91
|
+
}), /* @__PURE__ */ u("span", {
|
|
92
92
|
className: "text-sm text-text-primary truncate",
|
|
93
93
|
children: P.name || P.key
|
|
94
94
|
})]
|
|
95
|
-
}) : /* @__PURE__ */
|
|
95
|
+
}) : /* @__PURE__ */ u("span", {
|
|
96
96
|
className: "text-sm text-text-muted",
|
|
97
97
|
children: O
|
|
98
98
|
})
|
|
99
|
-
}), /* @__PURE__ */
|
|
99
|
+
}), /* @__PURE__ */ u(g, {
|
|
100
100
|
"aria-hidden": "true",
|
|
101
101
|
className: `w-4 h-4 shrink-0 text-text-secondary motion-safe:transition-transform ${w ? "transform rotate-180" : ""}`
|
|
102
102
|
})]
|
|
103
103
|
}),
|
|
104
|
-
x && S && /* @__PURE__ */
|
|
104
|
+
x && S && /* @__PURE__ */ u("p", {
|
|
105
105
|
className: "mt-1 text-xs text-status-error-text",
|
|
106
106
|
children: S
|
|
107
107
|
}),
|
|
108
|
-
w && /* @__PURE__ */
|
|
108
|
+
w && /* @__PURE__ */ d(i, { children: [/* @__PURE__ */ u("div", {
|
|
109
109
|
className: "fixed inset-0 z-10",
|
|
110
110
|
onClick: L
|
|
111
|
-
}), /* @__PURE__ */
|
|
111
|
+
}), /* @__PURE__ */ d("div", {
|
|
112
112
|
className: "absolute left-0 right-0 top-full mt-1 z-20 bg-bg-surface border border-[var(--color-border-default)] rounded-md shadow-lg max-h-80 flex flex-col overflow-hidden",
|
|
113
113
|
children: [
|
|
114
|
-
/* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ u("div", {
|
|
115
115
|
className: "p-2 border-b border-[var(--color-border-default)]",
|
|
116
|
-
children: /* @__PURE__ */
|
|
116
|
+
children: /* @__PURE__ */ u("input", {
|
|
117
117
|
type: "text",
|
|
118
118
|
"aria-label": C("bigconsole.parsers.dataSinkSelector.searchPlaceholder", "Search data sources..."),
|
|
119
119
|
placeholder: C("bigconsole.parsers.dataSinkSelector.searchPlaceholder", "Search data sources..."),
|
|
@@ -122,16 +122,16 @@ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
|
|
|
122
122
|
className: "\n w-full min-w-0 min-h-control-md px-3 py-2\n bg-bg-sunken\n border border-[var(--color-border-default)]\n rounded-md\n text-sm text-text-primary\n placeholder:text-text-muted\n focus:outline-none\n focus:border-action-primary-bg\n focus:ring-2\n focus:ring-action-primary-bg/20\n "
|
|
123
123
|
})
|
|
124
124
|
}),
|
|
125
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ u("div", {
|
|
126
126
|
className: "overflow-y-auto flex-1",
|
|
127
|
-
children: j ? /* @__PURE__ */
|
|
127
|
+
children: j ? /* @__PURE__ */ u("div", {
|
|
128
128
|
className: "p-4 text-center text-sm text-text-secondary",
|
|
129
129
|
children: C("bigconsole.parsers.dataSinkSelector.loading", "Loading data sources...")
|
|
130
|
-
}) : N.length === 0 ? /* @__PURE__ */
|
|
130
|
+
}) : N.length === 0 ? /* @__PURE__ */ u("div", {
|
|
131
131
|
className: "p-4 text-center text-sm text-text-secondary",
|
|
132
132
|
children: E ? C("bigconsole.parsers.dataSinkSelector.emptySearch", "No matching data sources found") : C("bigconsole.parsers.dataSinkSelector.empty", "No data sources available")
|
|
133
|
-
}) : /* @__PURE__ */
|
|
134
|
-
/* @__PURE__ */
|
|
133
|
+
}) : /* @__PURE__ */ d(i, { children: [
|
|
134
|
+
/* @__PURE__ */ u("button", {
|
|
135
135
|
type: "button",
|
|
136
136
|
onClick: () => F(null),
|
|
137
137
|
className: `
|
|
@@ -142,19 +142,19 @@ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
|
|
|
142
142
|
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
|
|
143
143
|
${a === null ? "bg-action-primary-bg/10 text-action-primary-bg" : "text-text-secondary"}
|
|
144
144
|
`,
|
|
145
|
-
children: /* @__PURE__ */
|
|
145
|
+
children: /* @__PURE__ */ u("span", {
|
|
146
146
|
className: "italic",
|
|
147
147
|
children: C("bigconsole.parsers.dataSinkSelector.none", "None")
|
|
148
148
|
})
|
|
149
149
|
}),
|
|
150
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ u("div", {
|
|
151
151
|
className: p,
|
|
152
|
-
children: /* @__PURE__ */
|
|
152
|
+
children: /* @__PURE__ */ u("span", {
|
|
153
153
|
className: m,
|
|
154
154
|
children: "Data Sources"
|
|
155
155
|
})
|
|
156
156
|
}),
|
|
157
|
-
N.map((e) => /* @__PURE__ */
|
|
157
|
+
N.map((e) => /* @__PURE__ */ u("button", {
|
|
158
158
|
type: "button",
|
|
159
159
|
onClick: () => F(e.key),
|
|
160
160
|
className: `
|
|
@@ -166,38 +166,38 @@ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
|
|
|
166
166
|
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface
|
|
167
167
|
${a === e.key ? "bg-action-primary-bg/10" : ""}
|
|
168
168
|
`,
|
|
169
|
-
children: /* @__PURE__ */
|
|
169
|
+
children: /* @__PURE__ */ u("div", {
|
|
170
170
|
className: "flex items-start justify-between gap-2",
|
|
171
|
-
children: /* @__PURE__ */
|
|
171
|
+
children: /* @__PURE__ */ d("div", {
|
|
172
172
|
className: "flex-1 min-w-0",
|
|
173
173
|
children: [
|
|
174
|
-
/* @__PURE__ */
|
|
174
|
+
/* @__PURE__ */ d("div", {
|
|
175
175
|
className: "flex min-w-0 items-center gap-2 mb-1",
|
|
176
|
-
children: [/* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ u(r, {
|
|
177
177
|
status: e.status,
|
|
178
178
|
size: "sm",
|
|
179
179
|
showIcon: !1
|
|
180
|
-
}), /* @__PURE__ */
|
|
180
|
+
}), /* @__PURE__ */ u("span", {
|
|
181
181
|
className: "text-sm font-medium text-text-primary truncate",
|
|
182
182
|
children: e.name || e.key
|
|
183
183
|
})]
|
|
184
184
|
}),
|
|
185
|
-
e.description && /* @__PURE__ */
|
|
185
|
+
e.description && /* @__PURE__ */ u("p", {
|
|
186
186
|
className: "text-xs text-text-secondary line-clamp-1 mb-1",
|
|
187
187
|
children: e.description
|
|
188
188
|
}),
|
|
189
|
-
/* @__PURE__ */
|
|
189
|
+
/* @__PURE__ */ d("div", {
|
|
190
190
|
className: "flex min-w-0 flex-wrap items-center gap-x-2 text-xs text-text-muted",
|
|
191
191
|
children: [
|
|
192
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ u("span", {
|
|
193
193
|
className: "min-w-0 truncate font-mono",
|
|
194
194
|
children: C("bigconsole.parsers.dataSinkSelector.keyLabel", "key: {{key}}", { key: e.key })
|
|
195
195
|
}),
|
|
196
|
-
/* @__PURE__ */
|
|
196
|
+
/* @__PURE__ */ u("span", {
|
|
197
197
|
"aria-hidden": "true",
|
|
198
198
|
children: "•"
|
|
199
199
|
}),
|
|
200
|
-
/* @__PURE__ */
|
|
200
|
+
/* @__PURE__ */ u("span", {
|
|
201
201
|
className: "truncate",
|
|
202
202
|
children: C("bigconsole.parsers.dataSinkSelector.refreshedLabel", "Refreshed: {{time}}", { time: h(e.lastRefreshedAt, C) })
|
|
203
203
|
})
|
|
@@ -209,13 +209,13 @@ var g = ({ className: e }) => /* @__PURE__ */ d("svg", {
|
|
|
209
209
|
}, e.id))
|
|
210
210
|
] })
|
|
211
211
|
}),
|
|
212
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ u("div", {
|
|
213
213
|
className: "p-2 border-t border-border-default",
|
|
214
|
-
children: /* @__PURE__ */
|
|
214
|
+
children: /* @__PURE__ */ d("button", {
|
|
215
215
|
type: "button",
|
|
216
216
|
onClick: R,
|
|
217
217
|
className: "\n w-full flex items-center gap-2\n px-3 py-2\n text-sm font-medium text-action-primary-bg\n rounded-md\n hover:bg-action-primary-bg/10\n transition-colors\n ",
|
|
218
|
-
children: [/* @__PURE__ */
|
|
218
|
+
children: [/* @__PURE__ */ u(l, { className: "w-4 h-4" }), C("bigconsole.parsers.dataSinkSelector.createNew", "Create new data source")]
|
|
219
219
|
})
|
|
220
220
|
})
|
|
221
221
|
]
|