@burdenoff/microfe-bigconsole 2026.1011.10 → 2026.1012.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/README.md +19 -0
- package/dist/bigconsole/BigConsoleRoot.js +88 -82
- package/dist/bigconsole/BigConsoleRoutes.js +163 -136
- package/dist/bigconsole/assistant/assistantProduct.js +1 -4
- package/dist/bigconsole/assistant/pageContext.d.ts +0 -14
- package/dist/bigconsole/assistant/pageContext.js +1 -6
- package/dist/bigconsole/assistant/recordAdapters.js +26 -27
- package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +31 -31
- package/dist/bigconsole/components/common/index.d.ts +0 -1
- package/dist/bigconsole/components/common/index.js +0 -1
- package/dist/bigconsole/components/dashboard/CreateDashboardDialog.js +44 -44
- package/dist/bigconsole/components/dashboard/DashboardCanvas.js +36 -36
- package/dist/bigconsole/components/dashboard/DashboardToolbar.js +59 -59
- package/dist/bigconsole/components/dashboard/DrilldownBreadcrumb.js +58 -57
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterChip.js +30 -30
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterEditor.js +41 -41
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/FilterPresetSelector.js +34 -34
- package/dist/bigconsole/components/dashboard/GlobalFiltersBar/GlobalFiltersBar.js +34 -34
- package/dist/bigconsole/components/dashboard/ImportDashboardDialog.js +110 -110
- package/dist/bigconsole/components/dashboard/PublishToStoreDialog.js +21 -21
- package/dist/bigconsole/components/dashboard/SavedViewsDropdown/SavedViewsDropdown.js +46 -46
- package/dist/bigconsole/components/dashboard/ShareDialog/EmbedTab.js +164 -173
- package/dist/bigconsole/components/dashboard/ShareDialog/ShareDialog.js +101 -101
- package/dist/bigconsole/components/dashboard/TemplateInstallOptions.js +31 -31
- package/dist/bigconsole/components/dashboard/TemplateLayoutPreview.js +15 -15
- package/dist/bigconsole/components/dashboard/TemplatePicker/TemplatePicker.js +1 -1
- package/dist/bigconsole/components/dashboard/WidgetPalette.js +165 -163
- package/dist/bigconsole/components/datasink/AlertExecutionHistory.js +37 -37
- package/dist/bigconsole/components/datasink/AlertRuleEditor.js +66 -66
- package/dist/bigconsole/components/datasink/CacheTTLSelector.js +35 -35
- package/dist/bigconsole/components/datasink/DataSinkCard.js +50 -51
- package/dist/bigconsole/components/datasink/DataSinkDeleteDialog.js +18 -18
- package/dist/bigconsole/components/datasink/DataSinkRefreshDialog.js +20 -20
- package/dist/bigconsole/components/datasink/ImportDataGuideDialog.js +47 -47
- package/dist/bigconsole/components/datasink/ImportDataSinkDialog.js +91 -91
- package/dist/bigconsole/components/datasink/RefreshTypeSelector.js +35 -35
- package/dist/bigconsole/components/parser/DataSinkSelector.js +40 -40
- package/dist/bigconsole/components/parser/ImportParserDialog.js +120 -120
- package/dist/bigconsole/components/parser/ParserSelector.js +51 -51
- package/dist/bigconsole/components/pipeline/PipelineScopePicker.js +10 -10
- package/dist/bigconsole/components/preview/AiPreviewMiniPanel.js +76 -77
- package/dist/bigconsole/components/preview/AiPreviewPanel.js +95 -96
- package/dist/bigconsole/components/widgets/ActionConfigDialog.js +4 -4
- package/dist/bigconsole/components/widgets/DrilldownConfigPanel.js +93 -93
- package/dist/bigconsole/components/widgets/PropertiesPanel.js +499 -507
- package/dist/bigconsole/components/widgets/WidgetRegistry.js +0 -1
- package/dist/bigconsole/components/widgets/calendar/CalendarWidget.js +4 -4
- 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/custom/CustomWidget.js +73 -131
- 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/iframe-widget/IframeWidget.d.ts +28 -9
- package/dist/bigconsole/components/widgets/iframe-widget/IframeWidget.js +115 -42
- package/dist/bigconsole/components/widgets/iframe-widget/framePolicy.d.ts +20 -0
- package/dist/bigconsole/components/widgets/iframe-widget/framePolicy.js +10 -0
- package/dist/bigconsole/components/widgets/iframe-widget/index.d.ts +2 -1
- package/dist/bigconsole/components/widgets/iframe-widget/index.js +3 -2
- package/dist/bigconsole/components/widgets/kanban/KanbanWidget.js +4 -4
- 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/text-widget/TextWidget.js +110 -27
- package/dist/bigconsole/components/widgets/text-widget/textData.d.ts +6 -0
- package/dist/bigconsole/components/widgets/text-widget/textData.js +17 -14
- package/dist/bigconsole/components/widgets/webhook-config/WebhookConfigPanel.js +64 -64
- package/dist/bigconsole/components/workflow/WorkflowOpenGuard.js +15 -15
- package/dist/bigconsole/components/workflow/WorkflowSinkLinkForm.js +15 -15
- package/dist/bigconsole/context/BigConsoleContext.d.ts +10 -0
- package/dist/bigconsole/context/BigConsoleContext.js +47 -30
- package/dist/bigconsole/context/index.d.ts +1 -1
- package/dist/bigconsole/customWidget/CustomWidgetBuilderSheet.js +58 -49
- package/dist/bigconsole/customWidget/CustomWidgetProposalPanel.js +74 -72
- package/dist/bigconsole/customWidget/proposalPreview.d.ts +5 -0
- package/dist/bigconsole/customWidget/proposalPreview.js +31 -0
- package/dist/bigconsole/hooks/useDataSinkAlerts.d.ts +0 -23
- package/dist/bigconsole/hooks/useDataSinkAlerts.js +113 -138
- package/dist/bigconsole/hooks/useDataSinkOperations.d.ts +7 -0
- package/dist/bigconsole/hooks/useDataSinkOperations.js +109 -98
- package/dist/bigconsole/hooks/useDataSinkSubscription.js +0 -1
- package/dist/bigconsole/hooks/useDrilldown.js +68 -67
- package/dist/bigconsole/hooks/useExportDataSink.js +1 -1
- package/dist/bigconsole/hooks/useGlobalFilters.js +3 -3
- package/dist/bigconsole/hooks/useImportDataSink.js +102 -90
- package/dist/bigconsole/pages/AdminPage.js +130 -130
- package/dist/bigconsole/pages/DashboardBuilderPage.js +60 -72
- package/dist/bigconsole/pages/DashboardViewPage.js +235 -258
- package/dist/bigconsole/pages/DashboardsPage.js +221 -269
- package/dist/bigconsole/pages/DataParsersPage.js +157 -180
- package/dist/bigconsole/pages/DataSinkAlertsPage.js +55 -62
- package/dist/bigconsole/pages/DataSinkBuilderPage.js +318 -295
- package/dist/bigconsole/pages/DataSinkViewPage.js +256 -255
- package/dist/bigconsole/pages/DataSinksPage.js +216 -251
- package/dist/bigconsole/pages/DataSourcesPage.js +5 -5
- package/dist/bigconsole/pages/InsightsPage.js +265 -279
- package/dist/bigconsole/pages/OverviewPage.js +47 -47
- package/dist/bigconsole/pages/ParserBuilderPage.js +213 -229
- package/dist/bigconsole/pages/ParserViewPage.js +97 -97
- package/dist/bigconsole/pages/PipelineBuilderPage.js +214 -256
- package/dist/bigconsole/pages/PipelineViewPage.js +146 -146
- package/dist/bigconsole/pages/PipelinesPage.js +88 -107
- package/dist/bigconsole/pages/SettingsPage.js +173 -179
- package/dist/bigconsole/pages/WidgetDemoPage.js +42 -42
- package/dist/bigconsole/pages/WorkflowViewPage.js +1 -1
- package/dist/bigconsole/pages/WorkflowsPage.js +141 -141
- package/dist/bigconsole/providers/BigConsoleQuotaProvider.js +12 -12
- package/dist/bigconsole/renderers/adapters/AdaptiveCardRenderer.js +235 -122
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.d.ts +6 -1
- package/dist/bigconsole/renderers/adapters/BlockKitRenderer.js +151 -151
- package/dist/bigconsole/renderers/adapters/CustomRenderer.js +46 -46
- package/dist/bigconsole/renderers/adapters/adaptiveCardContent.d.ts +29 -0
- package/dist/bigconsole/renderers/adapters/adaptiveCardContent.js +51 -0
- package/dist/bigconsole/store/widgetStore.d.ts +0 -12
- package/dist/bigconsole/store/widgetStore.js +1 -3
- package/dist/bigconsole/types/index.d.ts +17 -2
- package/dist/bigconsole/utils/backendError.d.ts +0 -18
- package/dist/bigconsole/utils/dataSinkPayload.d.ts +48 -0
- package/dist/bigconsole/utils/dataSinkPayload.js +38 -0
- package/dist/bigconsole/utils/index.d.ts +2 -0
- package/dist/bigconsole/utils/safeUrl.d.ts +79 -0
- package/dist/bigconsole/utils/safeUrl.js +93 -0
- package/dist/bigconsole/utils/sanitizeHtml.d.ts +16 -0
- package/dist/bigconsole/utils/sanitizeHtml.js +67 -0
- package/dist/bigconsole/workflowOpen.js +14 -15
- package/dist/generated/wspace-operations.d.ts +138 -8
- package/dist/generated/wspace-operations.js +281 -240
- package/dist/node_modules/dompurify/dist/purify.es.js +800 -0
- package/package.json +9 -5
- package/dist/bigconsole/assistant/displayCopy.d.ts +0 -32
- package/dist/bigconsole/assistant/pageControls.d.ts +0 -81
- package/dist/bigconsole/assistant/pageControls.js +0 -169
- package/dist/bigconsole/assistant/previewControl.d.ts +0 -16
- package/dist/bigconsole/assistant/previewControl.js +0 -10
- package/dist/bigconsole/assistant/usePreviewControl.d.ts +0 -2
- package/dist/bigconsole/assistant/usePreviewControl.js +0 -20
- package/dist/bigconsole/components/common/SortBySelect.d.ts +0 -11
- package/dist/bigconsole/components/common/SortBySelect.js +0 -29
- package/dist/bigconsole/constants/backendErrors.js +0 -94
- package/dist/bigconsole/hooks/useDashboardLayoutBaseline.d.ts +0 -14
- package/dist/bigconsole/hooks/useDashboardLayoutBaseline.js +0 -32
- package/dist/bigconsole/utils/backendError.js +0 -42
- package/dist/bigconsole/utils/dashboardList.d.ts +0 -28
- package/dist/bigconsole/utils/dashboardList.js +0 -15
- package/dist/bigconsole/utils/dataSinkList.d.ts +0 -15
- package/dist/bigconsole/utils/dataSinkList.js +0 -15
- package/dist/bigconsole/utils/formDirty.d.ts +0 -82
- package/dist/bigconsole/utils/formDirty.js +0 -21
- package/dist/bigconsole/utils/insightsDraft.d.ts +0 -29
- package/dist/bigconsole/utils/insightsDraft.js +0 -8
- package/dist/bigconsole/utils/layoutBaseline.d.ts +0 -130
- package/dist/bigconsole/utils/layoutBaseline.js +0 -96
- package/dist/bigconsole/utils/listSort.d.ts +0 -80
- package/dist/bigconsole/utils/listSort.js +0 -85
- package/dist/bigconsole/utils/widgetFormDirty.d.ts +0 -16
- package/dist/bigconsole/utils/widgetFormDirty.js +0 -13
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DataSink, DataSinkSetupState, DataSinkStatus } from '../types';
|
|
2
|
-
import { ListSortValue } from './listSort';
|
|
3
|
-
|
|
4
|
-
export interface DataSinkRow {
|
|
5
|
-
dataSink: DataSink;
|
|
6
|
-
setupState: DataSinkSetupState;
|
|
7
|
-
}
|
|
8
|
-
export interface DataSinkListQuery {
|
|
9
|
-
setupState: 'all' | 'in_progress' | 'completed';
|
|
10
|
-
status: DataSinkStatus | null;
|
|
11
|
-
active: boolean | null;
|
|
12
|
-
search: string;
|
|
13
|
-
sort: ListSortValue;
|
|
14
|
-
}
|
|
15
|
-
export declare function selectDataSinks<T extends DataSinkRow>(rows: readonly T[], query: DataSinkListQuery): T[];
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { sortList as e } from "./listSort.js";
|
|
2
|
-
//#region src/bigconsole/utils/dataSinkList.ts
|
|
3
|
-
function t(t, n) {
|
|
4
|
-
let r = [...t];
|
|
5
|
-
if (n.setupState === "in_progress" ? r = r.filter((e) => e.setupState !== "completed") : n.setupState === "completed" && (r = r.filter((e) => e.setupState === "completed")), n.status !== null && (r = r.filter((e) => e.dataSink.status === n.status)), n.active !== null && (r = r.filter((e) => e.dataSink.isActive === n.active)), n.search.trim()) {
|
|
6
|
-
let e = n.search.toLowerCase();
|
|
7
|
-
r = r.filter((t) => t.dataSink.name?.toLowerCase().includes(e) || t.dataSink.key.toLowerCase().includes(e) || t.dataSink.description?.toLowerCase().includes(e));
|
|
8
|
-
}
|
|
9
|
-
return e(r, n.sort, {
|
|
10
|
-
name: (e) => e.dataSink.name || e.dataSink.key,
|
|
11
|
-
updatedAt: (e) => e.dataSink.updatedAt
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
//#endregion
|
|
15
|
-
export { t as selectDataSinks };
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Form dirty helpers (BOFF-8060, N3 leave guard).
|
|
3
|
-
*
|
|
4
|
-
* Pure functions, no React, so the "is this editor holding an unsaved draft"
|
|
5
|
-
* decision is testable without a DOM. Each editor keeps a baseline of the
|
|
6
|
-
* values it seeded or last saved, and reports `isDirty(current, baseline)` to
|
|
7
|
-
* `useUnsavedChanges`.
|
|
8
|
-
*
|
|
9
|
-
* Two rules keep the signal honest:
|
|
10
|
-
* - A missing baseline (`null`/`undefined`) is CLEAN. An editor whose seed has
|
|
11
|
-
* not landed yet has nothing to lose, and reporting dirty there would make a
|
|
12
|
-
* freshly opened page refuse the assistant's navigation.
|
|
13
|
-
* - Comparison is by value (stable JSON, sorted keys, `undefined` dropped), so
|
|
14
|
-
* object identity, key order and a refetch that returns equal data never
|
|
15
|
-
* count as an edit.
|
|
16
|
-
*/
|
|
17
|
-
/** JSON with object keys sorted at every depth, so key order never matters. */
|
|
18
|
-
export declare function stableStringify(value: unknown): string;
|
|
19
|
-
/**
|
|
20
|
-
* True when `current` differs by value from `baseline`. A missing baseline is
|
|
21
|
-
* clean (see the module note).
|
|
22
|
-
*/
|
|
23
|
-
export declare function isDirty(current: unknown, baseline: unknown): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Whether an edit form should be (re)seeded from the record the store now holds.
|
|
26
|
-
*
|
|
27
|
-
* A record can arrive twice: first as a partial list item (no expression, ttl, version), then as
|
|
28
|
-
* the full record after the detail fetch. The second arrival must refresh a form the person has
|
|
29
|
-
* not touched, otherwise the partial values would be saved over the stored ones. It must never
|
|
30
|
-
* overwrite an edit in progress.
|
|
31
|
-
* - `seededId`: the id of the record the form was last seeded from (null = never seeded);
|
|
32
|
-
* - `form` / `baseline`: the current form and the form as last seeded or saved.
|
|
33
|
-
* Seed when the record is a different one, or when the form still equals its baseline (a missing
|
|
34
|
-
* baseline counts as clean). Skip only when the same record is loaded and the form is dirty.
|
|
35
|
-
*/
|
|
36
|
-
export declare function shouldReseedForm(seededId: string | null, recordId: string, form: unknown, baseline: unknown): boolean;
|
|
37
|
-
/** A grid item: react-grid-layout names the id `i`, our own widgets use `id`. */
|
|
38
|
-
export type LayoutItem = {
|
|
39
|
-
readonly id: string;
|
|
40
|
-
readonly x: number;
|
|
41
|
-
readonly y: number;
|
|
42
|
-
readonly w: number;
|
|
43
|
-
readonly h: number;
|
|
44
|
-
} | {
|
|
45
|
-
readonly i: string;
|
|
46
|
-
readonly x: number;
|
|
47
|
-
readonly y: number;
|
|
48
|
-
readonly w: number;
|
|
49
|
-
readonly h: number;
|
|
50
|
-
};
|
|
51
|
-
/** Item id to `x,y,w,h`, keys in sorted order. */
|
|
52
|
-
export type NormalisedLayout = Readonly<Record<string, string>>;
|
|
53
|
-
/**
|
|
54
|
-
* Reduces a layout to the four numbers per item that a person can change by
|
|
55
|
-
* dragging or resizing. Array order, extra grid bookkeeping fields (`moved`,
|
|
56
|
-
* `static`, min/max) and item order never matter.
|
|
57
|
-
*/
|
|
58
|
-
export declare function normaliseLayout(items: readonly LayoutItem[]): NormalisedLayout;
|
|
59
|
-
type LayoutInput = readonly LayoutItem[] | NormalisedLayout;
|
|
60
|
-
/** True when the layout differs by value from the baseline. No baseline is clean. */
|
|
61
|
-
export declare function layoutDirty(current: LayoutInput, baseline: LayoutInput | null | undefined): boolean;
|
|
62
|
-
/**
|
|
63
|
-
* react-grid-layout fires `onLayoutChange` on mount and again whenever it
|
|
64
|
-
* compacts, with no person involved, so "a change event happened" is not a
|
|
65
|
-
* dirty signal. The baseline therefore FLOATS (follows every layout change)
|
|
66
|
-
* until the first user gesture (drag or resize stop), then FREEZES; from then on
|
|
67
|
-
* `layoutDirty(current, tracker.baseline)` is the answer. Reloading the
|
|
68
|
-
* dashboard or a successful save starts a fresh tracker; a failed save keeps
|
|
69
|
-
* the old one, so the draft stays dirty.
|
|
70
|
-
*/
|
|
71
|
-
export interface LayoutTracker {
|
|
72
|
-
readonly baseline: NormalisedLayout | null;
|
|
73
|
-
readonly frozen: boolean;
|
|
74
|
-
}
|
|
75
|
-
export declare const EMPTY_LAYOUT_TRACKER: LayoutTracker;
|
|
76
|
-
/** A fresh floating tracker, for after a load or a successful save. */
|
|
77
|
-
export declare function resetLayoutTracker(items: readonly LayoutItem[]): LayoutTracker;
|
|
78
|
-
/** A layout-change event: moves the baseline while floating, ignored once frozen. */
|
|
79
|
-
export declare function trackLayoutChange(tracker: LayoutTracker, items: readonly LayoutItem[]): LayoutTracker;
|
|
80
|
-
/** The first user gesture: stops the baseline following layout changes. */
|
|
81
|
-
export declare function freezeLayoutTracker(tracker: LayoutTracker): LayoutTracker;
|
|
82
|
-
export {};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
//#region src/bigconsole/utils/formDirty.ts
|
|
2
|
-
function e(e) {
|
|
3
|
-
return JSON.stringify(t(e));
|
|
4
|
-
}
|
|
5
|
-
function t(e) {
|
|
6
|
-
if (Array.isArray(e)) return e.map(t);
|
|
7
|
-
if (typeof e == "object" && e) {
|
|
8
|
-
let n = e, r = {};
|
|
9
|
-
for (let e of Object.keys(n).sort()) r[e] = t(n[e]);
|
|
10
|
-
return r;
|
|
11
|
-
}
|
|
12
|
-
return e;
|
|
13
|
-
}
|
|
14
|
-
function n(t, n) {
|
|
15
|
-
return n == null ? !1 : e(t) !== e(n);
|
|
16
|
-
}
|
|
17
|
-
function r(e, t, r, i) {
|
|
18
|
-
return e === t ? !n(r, i) : !0;
|
|
19
|
-
}
|
|
20
|
-
//#endregion
|
|
21
|
-
export { n as isDirty, r as shouldReseedForm };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Does the Insights page hold a description the person has typed and not submitted?
|
|
3
|
-
* (BOFF-8060, N3/N4 leave guard.)
|
|
4
|
-
*
|
|
5
|
-
* The page has two draft textareas: the "Describe your dashboard" prompt and the refine
|
|
6
|
-
* modal's "What should change?". Both are cleared by the page itself when their
|
|
7
|
-
* submission is accepted (and when the refine modal is reopened), so the last submitted
|
|
8
|
-
* value is always the empty string and "unsubmitted" reads as "non-empty". Pure
|
|
9
|
-
* functions, no React, so the rule is testable without a DOM.
|
|
10
|
-
*
|
|
11
|
-
* - Whitespace-only text is clean: the page will not submit it, and nothing is lost.
|
|
12
|
-
* - Text being submitted right now is clean: it already left the page (the mutation
|
|
13
|
-
* keeps running after the person navigates). If the submission fails the page keeps
|
|
14
|
-
* the text and clears the in-flight flag, so the draft reads dirty again.
|
|
15
|
-
* - The refine text only counts while the refine modal is open.
|
|
16
|
-
*/
|
|
17
|
-
export interface InsightsDraftState {
|
|
18
|
-
/** The "Describe your dashboard" textarea. */
|
|
19
|
-
readonly promptText: string;
|
|
20
|
-
/** A generation request for `promptText` is in flight. */
|
|
21
|
-
readonly isGenerating: boolean;
|
|
22
|
-
/** The refine modal is open. */
|
|
23
|
-
readonly refineOpen: boolean;
|
|
24
|
-
/** The refine modal's "What should change?" textarea. */
|
|
25
|
-
readonly refineText: string;
|
|
26
|
-
/** A refine request for the open generation is in flight. */
|
|
27
|
-
readonly refineBusy: boolean;
|
|
28
|
-
}
|
|
29
|
-
export declare function isInsightsDraftDirty(state: InsightsDraftState): boolean;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
//#region src/bigconsole/utils/insightsDraft.ts
|
|
2
|
-
var e = (e) => e.trim() !== "";
|
|
3
|
-
function t(t) {
|
|
4
|
-
let n = e(t.promptText) && !t.isGenerating, r = t.refineOpen && e(t.refineText) && !t.refineBusy;
|
|
5
|
-
return n || r;
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
export { t as isInsightsDraftDirty };
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dashboard layout baseline (BOFF-8060, N3/N4: the dashboard leave guard).
|
|
3
|
-
*
|
|
4
|
-
* The dashboard builder keeps moved and resized widgets only in the widget store
|
|
5
|
-
* until the toolbar Save runs (`DashboardBuilderPage.handleSave`, step 2). To tell
|
|
6
|
-
* the assistant "this editor holds unsaved work" the builder needs one honest
|
|
7
|
-
* boolean, and the store has none: `widgetStore.dirtyWidgetIds` is never marked and
|
|
8
|
-
* `dashboardStore.hasUnsavedChanges` is never cleared. This module is that boolean,
|
|
9
|
-
* as plain functions with no React, so it can be tested without a DOM.
|
|
10
|
-
*
|
|
11
|
-
* ★★ "A layout event happened" is NOT a dirty signal. Positions reach the store on
|
|
12
|
-
* load (`setWidgets`), when a widget is created or deleted, and when a save writes
|
|
13
|
-
* its own positions back, none of which is the person's work. Only a PERSON'S
|
|
14
|
-
* placement is. So the baseline FLOATS (it is re-taken on every observation)
|
|
15
|
-
* until the first placement by a person, and from then on it is FROZEN: it holds
|
|
16
|
-
* the last layout the server is known to have, and "dirty" means the current
|
|
17
|
-
* layout differs from it BY VALUE:
|
|
18
|
-
*
|
|
19
|
-
* load / refetch / add / delete / save write-back -> baseline follows, clean
|
|
20
|
-
* first drag, resize, or typed placement -> baseline freezes
|
|
21
|
-
* a drag that moves and moves back -> equal again, clean
|
|
22
|
-
* a successful save -> baseline = what was saved
|
|
23
|
-
* a failed save -> nothing happens, still dirty
|
|
24
|
-
*
|
|
25
|
-
* ★★ The "placement by a person" signal is `layoutEditRevision` on the widget
|
|
26
|
-
* store, a counter bumped by `updateWidgetPosition` and by nothing else. It is the
|
|
27
|
-
* ONE writer shared by the canvas (drag stop, resize stop) and the inspector's
|
|
28
|
-
* "Position & size" fields, so a placement typed into the inspector, which never
|
|
29
|
-
* touches the grid, freezes the baseline too. A signal taken from the grid alone
|
|
30
|
-
* would let a floating baseline silently absorb it.
|
|
31
|
-
*
|
|
32
|
-
* Every function here is pure. `useDashboardLayoutBaseline` is the React shell.
|
|
33
|
-
*/
|
|
34
|
-
/** One widget's grid cell, in grid units (columns / rows). */
|
|
35
|
-
export interface LayoutRect {
|
|
36
|
-
readonly x: number;
|
|
37
|
-
readonly y: number;
|
|
38
|
-
readonly w: number;
|
|
39
|
-
readonly h: number;
|
|
40
|
-
}
|
|
41
|
-
export interface LayoutItem extends LayoutRect {
|
|
42
|
-
readonly id: string;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Widget id -> cell, keys in sorted order. A `Map` (not a plain object) so an
|
|
46
|
-
* id such as `"1"` or `"__proto__"` is only ever a key.
|
|
47
|
-
*/
|
|
48
|
-
export type NormalisedLayout = ReadonlyMap<string, LayoutRect>;
|
|
49
|
-
interface PositionLike {
|
|
50
|
-
readonly x?: number | null;
|
|
51
|
-
readonly y?: number | null;
|
|
52
|
-
readonly width?: number | null;
|
|
53
|
-
readonly height?: number | null;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* What a widget must carry for its cell to be read. Structural, so the store's
|
|
57
|
-
* `Widget` satisfies it and a test can pass a plain object.
|
|
58
|
-
*/
|
|
59
|
-
export interface LayoutSourceWidget {
|
|
60
|
-
readonly id: string;
|
|
61
|
-
readonly position?: PositionLike | null;
|
|
62
|
-
readonly positionX?: number | null;
|
|
63
|
-
readonly positionY?: number | null;
|
|
64
|
-
readonly positionWidth?: number | null;
|
|
65
|
-
readonly positionHeight?: number | null;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* The cell a widget with no stored size falls back to. These mirror
|
|
69
|
-
* `DashboardGrid.widgetToLayout` exactly, so the baseline reads a widget the same
|
|
70
|
-
* way the grid draws it.
|
|
71
|
-
*/
|
|
72
|
-
export declare const DEFAULT_LAYOUT_CELL: LayoutRect;
|
|
73
|
-
/**
|
|
74
|
-
* Items -> a sorted `id -> x,y,w,h` map. Order of the input does not matter, a
|
|
75
|
-
* repeated id keeps the last one, and a non-finite number becomes 0 so a stray
|
|
76
|
-
* `NaN` (which is never equal to itself) cannot make a layout permanently dirty.
|
|
77
|
-
*/
|
|
78
|
-
export declare function normaliseLayout(items: Iterable<LayoutItem>): NormalisedLayout;
|
|
79
|
-
/** The widget store's widgets -> a normalised layout (every widget in the store, which is what Save sends). */
|
|
80
|
-
export declare function layoutFromWidgets(widgets: Iterable<LayoutSourceWidget>): NormalisedLayout;
|
|
81
|
-
/** The `{ id, position }` list `batchUpdatePositions` sends -> layout items (exactly what reached the server). */
|
|
82
|
-
export declare function layoutItemsFromPositionUpdates(updates: ReadonlyArray<{
|
|
83
|
-
readonly id: string;
|
|
84
|
-
readonly position: PositionLike;
|
|
85
|
-
}>): LayoutItem[];
|
|
86
|
-
/** Same widgets in the same cells (by value; key order and object identity are irrelevant). */
|
|
87
|
-
export declare function layoutEquals(a: NormalisedLayout, b: NormalisedLayout): boolean;
|
|
88
|
-
/**
|
|
89
|
-
* Does `current` differ from `baseline`? Different cells, a widget present on only
|
|
90
|
-
* one side, or both, all count. With no baseline there is nothing to differ from,
|
|
91
|
-
* so the answer is no: this never claims unsaved work it cannot point to.
|
|
92
|
-
*/
|
|
93
|
-
export declare function layoutDirty(current: NormalisedLayout, baseline: NormalisedLayout | null): boolean;
|
|
94
|
-
export interface LayoutBaselineState {
|
|
95
|
-
/** The layout the server is known to hold, or the last loaded one while floating. `null` until first observed. */
|
|
96
|
-
readonly baseline: NormalisedLayout | null;
|
|
97
|
-
/** True once a person has placed something since the baseline was taken. Frozen baselines do not follow the store. */
|
|
98
|
-
readonly frozen: boolean;
|
|
99
|
-
/** The last `layoutEditRevision` seen, to notice the next placement. `null` until first observed. */
|
|
100
|
-
readonly seenRevision: number | null;
|
|
101
|
-
}
|
|
102
|
-
export declare const INITIAL_LAYOUT_BASELINE: LayoutBaselineState;
|
|
103
|
-
export type LayoutBaselineAction =
|
|
104
|
-
/** The store changed (or the page mounted): here is the layout and the placement counter now. */
|
|
105
|
-
{
|
|
106
|
-
readonly type: 'observe';
|
|
107
|
-
readonly layout: NormalisedLayout;
|
|
108
|
-
readonly editRevision: number;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* The positions reached the server. `layout` is exactly what was sent;
|
|
112
|
-
* `editRevision` is the counter read BEFORE the request started, so a
|
|
113
|
-
* placement made while it was in flight is not mistaken for saved.
|
|
114
|
-
*/
|
|
115
|
-
| {
|
|
116
|
-
readonly type: 'saved';
|
|
117
|
-
readonly layout: NormalisedLayout;
|
|
118
|
-
readonly editRevision: number;
|
|
119
|
-
}
|
|
120
|
-
/** A different dashboard: forget everything. */
|
|
121
|
-
| {
|
|
122
|
-
readonly type: 'reset';
|
|
123
|
-
};
|
|
124
|
-
export declare function reduceLayoutBaseline(state: LayoutBaselineState, action: LayoutBaselineAction): LayoutBaselineState;
|
|
125
|
-
/**
|
|
126
|
-
* The one boolean the builder reports. A floating baseline is never dirty by
|
|
127
|
-
* definition: it follows the store, so whatever differs is not the person's work.
|
|
128
|
-
*/
|
|
129
|
-
export declare function isLayoutBaselineDirty(state: LayoutBaselineState, current: NormalisedLayout): boolean;
|
|
130
|
-
export {};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
//#region src/bigconsole/utils/layoutBaseline.ts
|
|
2
|
-
var e = {
|
|
3
|
-
x: 0,
|
|
4
|
-
y: 0,
|
|
5
|
-
w: 4,
|
|
6
|
-
h: 4
|
|
7
|
-
}, t = (e) => typeof e == "number" && Number.isFinite(e) ? e : void 0, n = (e) => Number.isFinite(e) ? e : 0;
|
|
8
|
-
function r(e, n, r) {
|
|
9
|
-
return t(e) ?? t(n) ?? r;
|
|
10
|
-
}
|
|
11
|
-
var i = (e, t) => e < t ? -1 : +(e > t);
|
|
12
|
-
function a(e) {
|
|
13
|
-
let t = /* @__PURE__ */ new Map();
|
|
14
|
-
for (let r of e) t.set(r.id, {
|
|
15
|
-
x: n(r.x),
|
|
16
|
-
y: n(r.y),
|
|
17
|
-
w: n(r.w),
|
|
18
|
-
h: n(r.h)
|
|
19
|
-
});
|
|
20
|
-
return new Map([...t.entries()].sort(([e], [t]) => i(e, t)));
|
|
21
|
-
}
|
|
22
|
-
function o(t) {
|
|
23
|
-
let n = [];
|
|
24
|
-
for (let i of t) n.push({
|
|
25
|
-
id: i.id,
|
|
26
|
-
x: r(i.position?.x, i.positionX, e.x),
|
|
27
|
-
y: r(i.position?.y, i.positionY, e.y),
|
|
28
|
-
w: r(i.position?.width, i.positionWidth, e.w),
|
|
29
|
-
h: r(i.position?.height, i.positionHeight, e.h)
|
|
30
|
-
});
|
|
31
|
-
return a(n);
|
|
32
|
-
}
|
|
33
|
-
function s(t) {
|
|
34
|
-
return t.map((t) => ({
|
|
35
|
-
id: t.id,
|
|
36
|
-
x: r(t.position.x, void 0, e.x),
|
|
37
|
-
y: r(t.position.y, void 0, e.y),
|
|
38
|
-
w: r(t.position.width, void 0, e.w),
|
|
39
|
-
h: r(t.position.height, void 0, e.h)
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
function c(e, t) {
|
|
43
|
-
if (e.size !== t.size) return !1;
|
|
44
|
-
for (let [n, r] of e) {
|
|
45
|
-
let e = t.get(n);
|
|
46
|
-
if (!e || r.x !== e.x || r.y !== e.y || r.w !== e.w || r.h !== e.h) return !1;
|
|
47
|
-
}
|
|
48
|
-
return !0;
|
|
49
|
-
}
|
|
50
|
-
function l(e, t) {
|
|
51
|
-
return t !== null && !c(e, t);
|
|
52
|
-
}
|
|
53
|
-
var u = {
|
|
54
|
-
baseline: null,
|
|
55
|
-
frozen: !1,
|
|
56
|
-
seenRevision: null
|
|
57
|
-
};
|
|
58
|
-
function d(e, t) {
|
|
59
|
-
switch (t.type) {
|
|
60
|
-
case "reset": return u;
|
|
61
|
-
case "observe": {
|
|
62
|
-
if (e.baseline === null) return {
|
|
63
|
-
baseline: t.layout,
|
|
64
|
-
frozen: !1,
|
|
65
|
-
seenRevision: t.editRevision
|
|
66
|
-
};
|
|
67
|
-
let n = t.editRevision !== e.seenRevision;
|
|
68
|
-
return e.frozen ? n ? {
|
|
69
|
-
...e,
|
|
70
|
-
seenRevision: t.editRevision
|
|
71
|
-
} : e : n ? {
|
|
72
|
-
baseline: e.baseline,
|
|
73
|
-
frozen: !0,
|
|
74
|
-
seenRevision: t.editRevision
|
|
75
|
-
} : c(t.layout, e.baseline) ? e : {
|
|
76
|
-
baseline: t.layout,
|
|
77
|
-
frozen: !1,
|
|
78
|
-
seenRevision: t.editRevision
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
case "saved": return e.baseline === null ? {
|
|
82
|
-
baseline: t.layout,
|
|
83
|
-
frozen: !1,
|
|
84
|
-
seenRevision: t.editRevision
|
|
85
|
-
} : {
|
|
86
|
-
baseline: t.layout,
|
|
87
|
-
frozen: e.seenRevision !== null && e.seenRevision > t.editRevision,
|
|
88
|
-
seenRevision: e.seenRevision
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function f(e, t) {
|
|
93
|
-
return e.frozen && l(t, e.baseline);
|
|
94
|
-
}
|
|
95
|
-
//#endregion
|
|
96
|
-
export { u as INITIAL_LAYOUT_BASELINE, f as isLayoutBaselineDirty, o as layoutFromWidgets, s as layoutItemsFromPositionUpdates, a as normaliseLayout, d as reduceLayoutBaseline };
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared "Sort by" model for BigConsole list pages (BOFF-8679).
|
|
3
|
-
*
|
|
4
|
-
* ★ One definition of the sort values, the comparator and the option labels, so
|
|
5
|
-
* the visible `SortBySelect`, the page's own list pipeline and the assistant's
|
|
6
|
-
* page-control adapter (`assistant/pageControls.ts`) cannot disagree: a person
|
|
7
|
-
* who picks "Name Z–A" from the menu and a person who says "sort by name
|
|
8
|
-
* descending" set the SAME state and get the SAME list.
|
|
9
|
-
*
|
|
10
|
-
* Pure: no React, no DOM, no i18n provider (labels come in through `Tr`).
|
|
11
|
-
*
|
|
12
|
-
* Only fields the list data really carries are offered:
|
|
13
|
-
* - Name: every dashboard has `name`; a data sink may have a null `name`, in
|
|
14
|
-
* which case its `key` is what the card and the table show, so that is what
|
|
15
|
-
* sorts.
|
|
16
|
-
* - Last updated: `updatedAt` on both. A row with no parseable date sorts last
|
|
17
|
-
* in both directions (it has no "age" to rank).
|
|
18
|
-
*/
|
|
19
|
-
export type ListSortValue = 'default' | 'name-asc' | 'name-desc' | 'updated-desc' | 'updated-asc';
|
|
20
|
-
export type ListSortField = 'name' | 'updated';
|
|
21
|
-
export type SortTr = (key: string, fallback: string) => string;
|
|
22
|
-
export interface ListSortOption {
|
|
23
|
-
value: ListSortValue;
|
|
24
|
-
label: string;
|
|
25
|
-
}
|
|
26
|
-
/** How a list item exposes the two sortable fields. */
|
|
27
|
-
export interface ListSortKeys<T> {
|
|
28
|
-
/** The text the row shows as its name. */
|
|
29
|
-
name: (item: T) => string;
|
|
30
|
-
/** ISO timestamp of the last update, if any. */
|
|
31
|
-
updatedAt: (item: T) => string | null | undefined;
|
|
32
|
-
}
|
|
33
|
-
/** The i18n key and English source of every label used by the control. */
|
|
34
|
-
export declare const LIST_SORT_COPY: {
|
|
35
|
-
readonly label: {
|
|
36
|
-
readonly key: "bigconsole.listSort.label";
|
|
37
|
-
readonly en: "Sort by";
|
|
38
|
-
};
|
|
39
|
-
readonly default: {
|
|
40
|
-
readonly key: "bigconsole.listSort.default";
|
|
41
|
-
readonly en: "Default order";
|
|
42
|
-
};
|
|
43
|
-
readonly nameAsc: {
|
|
44
|
-
readonly key: "bigconsole.listSort.nameAsc";
|
|
45
|
-
readonly en: "Name A–Z";
|
|
46
|
-
};
|
|
47
|
-
readonly nameDesc: {
|
|
48
|
-
readonly key: "bigconsole.listSort.nameDesc";
|
|
49
|
-
readonly en: "Name Z–A";
|
|
50
|
-
};
|
|
51
|
-
readonly updatedDesc: {
|
|
52
|
-
readonly key: "bigconsole.listSort.updatedDesc";
|
|
53
|
-
readonly en: "Last updated: newest";
|
|
54
|
-
};
|
|
55
|
-
readonly updatedAsc: {
|
|
56
|
-
readonly key: "bigconsole.listSort.updatedAsc";
|
|
57
|
-
readonly en: "Last updated: oldest";
|
|
58
|
-
};
|
|
59
|
-
readonly fieldName: {
|
|
60
|
-
readonly key: "bigconsole.listSort.field.name";
|
|
61
|
-
readonly en: "Name";
|
|
62
|
-
};
|
|
63
|
-
readonly fieldUpdated: {
|
|
64
|
-
readonly key: "bigconsole.listSort.field.updated";
|
|
65
|
-
readonly en: "Last updated";
|
|
66
|
-
};
|
|
67
|
-
};
|
|
68
|
-
/**
|
|
69
|
-
* The list ordered by `value`. `default` returns the items in the order given
|
|
70
|
-
* (the page's own default order, untouched). The sort is stable: rows that tie
|
|
71
|
-
* keep their incoming order, so a re-sort never shuffles equal rows.
|
|
72
|
-
*/
|
|
73
|
-
export declare function sortList<T>(items: readonly T[], value: ListSortValue, keys: ListSortKeys<T>): T[];
|
|
74
|
-
/**
|
|
75
|
-
* The options the visible control lists, in its words. `withDefault` adds the
|
|
76
|
-
* "Default order" entry for a page whose natural order is not one of the four
|
|
77
|
-
* (Dashboards: the server's order). A page whose default IS one of them
|
|
78
|
-
* (Data Sinks: newest first) omits it and starts on that value.
|
|
79
|
-
*/
|
|
80
|
-
export declare function listSortOptions(tr: SortTr, withDefault: boolean): ListSortOption[];
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
//#region src/bigconsole/utils/listSort.ts
|
|
2
|
-
var e = {
|
|
3
|
-
label: {
|
|
4
|
-
key: "bigconsole.listSort.label",
|
|
5
|
-
en: "Sort by"
|
|
6
|
-
},
|
|
7
|
-
default: {
|
|
8
|
-
key: "bigconsole.listSort.default",
|
|
9
|
-
en: "Default order"
|
|
10
|
-
},
|
|
11
|
-
nameAsc: {
|
|
12
|
-
key: "bigconsole.listSort.nameAsc",
|
|
13
|
-
en: "Name A–Z"
|
|
14
|
-
},
|
|
15
|
-
nameDesc: {
|
|
16
|
-
key: "bigconsole.listSort.nameDesc",
|
|
17
|
-
en: "Name Z–A"
|
|
18
|
-
},
|
|
19
|
-
updatedDesc: {
|
|
20
|
-
key: "bigconsole.listSort.updatedDesc",
|
|
21
|
-
en: "Last updated: newest"
|
|
22
|
-
},
|
|
23
|
-
updatedAsc: {
|
|
24
|
-
key: "bigconsole.listSort.updatedAsc",
|
|
25
|
-
en: "Last updated: oldest"
|
|
26
|
-
},
|
|
27
|
-
fieldName: {
|
|
28
|
-
key: "bigconsole.listSort.field.name",
|
|
29
|
-
en: "Name"
|
|
30
|
-
},
|
|
31
|
-
fieldUpdated: {
|
|
32
|
-
key: "bigconsole.listSort.field.updated",
|
|
33
|
-
en: "Last updated"
|
|
34
|
-
}
|
|
35
|
-
}, t = new Intl.Collator(void 0, {
|
|
36
|
-
sensitivity: "base",
|
|
37
|
-
numeric: !0
|
|
38
|
-
});
|
|
39
|
-
function n(e) {
|
|
40
|
-
if (!e) return null;
|
|
41
|
-
let t = new Date(e).getTime();
|
|
42
|
-
return Number.isNaN(t) ? null : t;
|
|
43
|
-
}
|
|
44
|
-
function r(e, r, i) {
|
|
45
|
-
let a = [...e];
|
|
46
|
-
switch (r) {
|
|
47
|
-
case "default": return a;
|
|
48
|
-
case "name-asc": return a.sort((e, n) => t.compare(i.name(e), i.name(n)));
|
|
49
|
-
case "name-desc": return a.sort((e, n) => t.compare(i.name(n), i.name(e)));
|
|
50
|
-
case "updated-desc":
|
|
51
|
-
case "updated-asc": {
|
|
52
|
-
let e = r === "updated-desc" ? -1 : 1;
|
|
53
|
-
return a.sort((t, r) => {
|
|
54
|
-
let a = n(i.updatedAt(t)), o = n(i.updatedAt(r));
|
|
55
|
-
return a === null && o === null ? 0 : a === null ? 1 : o === null ? -1 : (a - o) * e;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function i(t, n) {
|
|
61
|
-
let r = [
|
|
62
|
-
{
|
|
63
|
-
value: "name-asc",
|
|
64
|
-
label: t(e.nameAsc.key, e.nameAsc.en)
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
value: "name-desc",
|
|
68
|
-
label: t(e.nameDesc.key, e.nameDesc.en)
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
value: "updated-desc",
|
|
72
|
-
label: t(e.updatedDesc.key, e.updatedDesc.en)
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
value: "updated-asc",
|
|
76
|
-
label: t(e.updatedAsc.key, e.updatedAsc.en)
|
|
77
|
-
}
|
|
78
|
-
];
|
|
79
|
-
return n ? [{
|
|
80
|
-
value: "default",
|
|
81
|
-
label: t(e.default.key, e.default.en)
|
|
82
|
-
}, ...r] : r;
|
|
83
|
-
}
|
|
84
|
-
//#endregion
|
|
85
|
-
export { e as LIST_SORT_COPY, i as listSortOptions, r as sortList };
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/** True when `form` differs by value from `baseline`. Either side missing is clean. */
|
|
2
|
-
export declare function isWidgetFormEdited<T>(form: T | null | undefined, baseline: T | null | undefined): boolean;
|
|
3
|
-
/**
|
|
4
|
-
* Adds an inferred DataSink binding to a form that is bound to `parserId` and has none.
|
|
5
|
-
*
|
|
6
|
-
* The widget inspector infers an absent `dataSinkId` from the parser's input sink key once the
|
|
7
|
-
* parser resolves (AI-created widgets bind a parser without duplicating its input sink id). That
|
|
8
|
-
* is the panel filling in what the widget already means, not an edit by the person. It is
|
|
9
|
-
* applied to the form AND to the baseline with this one function, so the value compare of
|
|
10
|
-
* `isWidgetFormEdited` reads clean. Returns the same object when nothing applies, so a state
|
|
11
|
-
* updater using it does not trigger a re-render.
|
|
12
|
-
*/
|
|
13
|
-
export declare function withInferredDataSink<T extends {
|
|
14
|
-
parserId?: string | null;
|
|
15
|
-
dataSinkId?: string | null;
|
|
16
|
-
}>(form: T | null | undefined, parserId: string, dataSinkId: string): T | null;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { isDirty as e } from "./formDirty.js";
|
|
2
|
-
//#region src/bigconsole/utils/widgetFormDirty.ts
|
|
3
|
-
function t(t, n) {
|
|
4
|
-
return t == null || n == null ? !1 : e(t, n);
|
|
5
|
-
}
|
|
6
|
-
function n(e, t, n) {
|
|
7
|
-
return e == null ? null : e.parserId !== t || e.dataSinkId ? e : {
|
|
8
|
-
...e,
|
|
9
|
-
dataSinkId: n
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
export { t as isWidgetFormEdited, n as withInferredDataSink };
|