react-semaphor 0.1.544 → 0.1.546
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/analytics-protocol/index.js +405 -441
- package/dist/assistant-context/index.js +1 -1
- package/dist/assistant-protocol/index.js +100 -76
- package/dist/brand-studio/index.js +5 -5
- package/dist/briefings/index.js +55 -52
- package/dist/chunks/{class-utils-Df1OVOT1.js → _commonjsHelpers-DimLPMtv.js} +124 -98
- package/dist/chunks/{add-to-dashboard-BuAqfA2Y.js → add-to-dashboard-BQRAAnc3.js} +55 -33
- package/dist/chunks/{analytics-base-schemas-BFAoRlkU.js → analytics-base-schemas-BKs3flFS.js} +2 -2
- package/dist/chunks/{assistant-chat-BNLkCDml.js → assistant-chat-BPXhulAx.js} +2792 -2562
- package/dist/chunks/{bookmark-state-CXw7lZ50.js → bookmark-state-C4vetoa0.js} +7 -8
- package/dist/chunks/column-catalog-BYnochWQ.js +3363 -0
- package/dist/chunks/comparison-window-caption-C2xF-eWw.js +1433 -0
- package/dist/chunks/{context-ClREvqCZ.js → context-BerEBuFR.js} +11 -6
- package/dist/chunks/custom-visual-inputs-CkJW9pBS.js +295 -0
- package/dist/chunks/{dashboard-g5a4DKWq.js → dashboard-C3CoKbGY.js} +1 -1
- package/dist/chunks/dashboard-briefing-launcher-Be4h-7My.js +3734 -0
- package/dist/chunks/dashboard-controls-bxPrlSyp.js +2307 -0
- package/dist/chunks/{dashboard-json-7qT9jmfL.js → dashboard-json-BrjxIiRt.js} +6 -6
- package/dist/chunks/document-dashboard-inputs-CRVHpIHp.js +3010 -0
- package/dist/chunks/{edit-dashboard-visual-BfJwnRIZ.js → edit-dashboard-visual-DYYYDjY6.js} +5986 -6063
- package/dist/chunks/{filter-value-text-CYsVYPuD.js → filter-value-text-Ddf55Ku1.js} +8 -8
- package/dist/chunks/global-date-filter-utils-9d6m9-FE.js +11859 -0
- package/dist/chunks/index-CtoK1Lgu.js +586 -0
- package/dist/chunks/{index-DkAyQvC6.js → index-DkQkMKa1.js} +385 -339
- package/dist/chunks/list-filter-DsaTbM3J.js +15 -0
- package/dist/chunks/matrix-analytical-definition-B9vW-osb.js +717 -0
- package/dist/chunks/{matrix-card-DjwWcCo8.js → matrix-card-LiMEipvq.js} +3 -3
- package/dist/chunks/{matrix-formatter-CxJLkztA.js → matrix-formatter-DWEeC0_c.js} +55 -55
- package/dist/chunks/{matrix-member-presentation-CQGdVks6.js → matrix-member-presentation-DqzG-UhQ.js} +1 -1
- package/dist/chunks/{matrix-operation-contract-8OIO4gob.js → matrix-operation-contract-D6vYkZK4.js} +72 -72
- package/dist/chunks/{metric-comparison-DEwi9uc2.js → metric-comparison-zpGw4lD6.js} +2 -2
- package/dist/chunks/normalize-dashboard-for-dirty-check-XKgH3GFX.js +119 -0
- package/dist/chunks/{pivot-header-presentation-DHcx1XGQ.js → pivot-header-presentation-CQnIDtUv.js} +1 -1
- package/dist/chunks/{pivot-result-identity-DJhXXcns.js → pivot-result-identity-C-Q1j1Wb.js} +1 -1
- package/dist/chunks/{pivot-result-lifecycle-DM4CyGKs.js → pivot-result-lifecycle-pwq3b7LC.js} +571 -380
- package/dist/chunks/{raw-temporal-contract-C51YG48G.js → raw-temporal-contract-WuXA8jBP.js} +1 -1
- package/dist/chunks/{raw-temporal-presentation-CLiVi90c.js → raw-temporal-presentation-CBzrDOjM.js} +8 -8
- package/dist/chunks/rendered-file-D8xEuVVx.js +108 -0
- package/dist/chunks/{report-preferences-dialog-Df7VpRVW.js → report-preferences-dialog-4QEZWe5U.js} +637 -610
- package/dist/chunks/{report-runtime-context-Dq8XyODK.js → report-runtime-context-hWiTCzFV.js} +2 -2
- package/dist/chunks/resolve-dashboard-input-context-UpK_LBpL.js +5677 -0
- package/dist/chunks/{saved-dashboard-context-B-mQ--nV.js → saved-dashboard-context-D_I3Lxk0.js} +184 -212
- package/dist/chunks/selection-filter-compiler-BKXmyLrS.js +79 -0
- package/dist/chunks/{selection-reducer-Dj_8xD69.js → selection-reducer-CJzkTZio.js} +15 -15
- package/dist/chunks/{semaphor-ready-indicator-DDAxk8us.js → semaphor-ready-indicator-4zpRHE-X.js} +56832 -59068
- package/dist/chunks/{shelf-drop-preview-context-BSRPwaED.js → shelf-drop-preview-context-Cfw7TRAx.js} +890 -871
- package/dist/chunks/{source-entity-resolution-BYn9giz3.js → source-entity-resolution-BIGRvtbG.js} +13 -13
- package/dist/chunks/{switch-C3jLxlG0.js → switch-CEBOR4n7.js} +47 -48
- package/dist/chunks/{table-export-sheet-CPfGAQ9X.js → table-export-sheet-4X9mAG3V.js} +1 -1
- package/dist/chunks/table-settings-CunhoDUi.js +605 -0
- package/dist/chunks/{temporal-bucket-D7NBrrtL.js → temporal-bucket-CQOSbv9-.js} +26 -26
- package/dist/chunks/{token-types-DBbZVQsm.js → token-types-BMqRmT-C.js} +1 -1
- package/dist/chunks/{use-create-flow-overlay-state-BxzFviM-.js → use-create-flow-overlay-state-DZBZiiD-.js} +83 -83
- package/dist/chunks/{validators-DMHTpf7a.js → validators-C-aOQlTB.js} +713 -658
- package/dist/dashboard/index.js +2 -2
- package/dist/dashboard-authoring/index.js +1800 -1135
- package/dist/data-app-sdk/index.js +6 -6
- package/dist/data-app-sdk-adapters/index.js +3 -3
- package/dist/data-app-sdk-validation/index.js +14 -14
- package/dist/format-utils/index.js +198 -187
- package/dist/index.js +359 -325
- package/dist/layouts/index.js +5 -242
- package/dist/report-runtime-context/index.js +2 -2
- package/dist/shared/index.js +4 -5
- package/dist/style.css +1 -1
- package/dist/surfboard/index.js +2 -2
- package/dist/types/briefings/attachment-outcomes.d.ts +1 -1
- package/dist/types/briefings/attachments.d.ts +33 -6
- package/dist/types/briefings/index.d.ts +6 -5
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/components/surfboard/arrange-layout-button.d.ts +8 -0
- package/dist/types/components/surfboard/filter/types.d.ts +0 -14
- package/dist/types/components/surfboard/screen-size-preview-button.d.ts +7 -0
- package/dist/types/index.js +6 -6
- package/dist/types/lib/charts/table-chart-types.d.ts +4 -0
- package/dist/types/lib/charts/types.d.ts +2 -2
- package/dist/types/lib/dashboard-inputs/dashboard-filter-mapping-authoring.d.ts +68 -82
- package/dist/types/lib/dashboard-inputs/dashboard-input-target-context.d.ts +0 -8
- package/dist/types/lib/dashboard-inputs/dashboard-input-values.d.ts +41 -1
- package/dist/types/lib/dashboard-inputs/filter-settings.d.ts +201 -0
- package/dist/types/lib/dashboard-inputs/prepare-loaded-dashboard.d.ts +15 -0
- package/dist/types/lib/dashboard-inputs/resolve-dashboard-input-context.d.ts +7 -2
- package/dist/types/lib/dashboard-inputs/resolve-selection-input.d.ts +1 -1
- package/dist/types/lib/dashboard-viewer/captured-runtime-values.d.ts +40 -0
- package/dist/types/lib/dashboard-viewer/compatibility-input-storage.d.ts +16 -16
- package/dist/types/lib/dashboard-viewer/viewer-state.d.ts +11 -9
- package/dist/types/lib/download-pdf.d.ts +75 -1
- package/dist/types/lib/hooks/use-date-filter.d.ts +5 -0
- package/dist/types/lib/hooks/use-text-filter.d.ts +5 -0
- package/dist/types/lib/matrix-table/matrix-delivery-policy.d.ts +5 -4
- package/dist/types/lib/matrix-table/matrix-editor.d.ts +52 -0
- package/dist/types/lib/query-context/assemble-card-query.d.ts +158 -0
- package/dist/types/lib/query-context/build-card-query-context.d.ts +3 -3
- package/dist/types/lib/query-context/build-dashboard-card-query-contract.d.ts +15 -6
- package/dist/types/lib/query-context/build-dashboard-execution-snapshot.d.ts +11 -13
- package/dist/types/lib/query-context/compile-dashboard-card-filters.d.ts +22 -12
- package/dist/types/lib/query-context/dashboard-filter-mapping-resolution.d.ts +69 -0
- package/dist/types/lib/stores/dashboard-store.d.ts +159 -56
- package/dist/types/lib/stores/editor-store.d.ts +0 -3
- package/dist/types/lib/types/common-types.d.ts +29 -6
- package/dist/types/lib/types/explorer-types.d.ts +10 -0
- package/dist/types/lib/types/semantic-types.d.ts +84 -0
- package/dist/types/lib/utils/build-saved-editor-card.d.ts +20 -0
- package/dist/types/lib/utils/card-type-change.d.ts +16 -0
- package/dist/types/lib/utils/field-availability-context.d.ts +25 -0
- package/dist/types/lib/utils/field-placement.d.ts +96 -0
- package/dist/types/lib/utils/field-state-calculator.d.ts +161 -0
- package/dist/types/lib/utils/qualified-entity-name.d.ts +2 -0
- package/dist/types/shared/analytics-protocol/field-provenance.d.ts +89 -0
- package/dist/types/shared/analytics-protocol/index.d.ts +2 -0
- package/dist/types/shared/analytics-protocol/query-policies.d.ts +52 -0
- package/dist/types/shared/analytics-protocol/time-window-schema.d.ts +1 -1
- package/dist/types/shared/analytics-protocol/time-window.d.ts +40 -1
- package/dist/types/shared/assistant-context/saved-dashboard-context.d.ts +8 -12
- package/dist/types/shared/assistant-protocol/answer-text.d.ts +20 -0
- package/dist/types/shared/assistant-protocol/context.d.ts +21 -21
- package/dist/types/shared/assistant-protocol/index.d.ts +1 -0
- package/dist/types/shared/assistant-protocol/limits.d.ts +6 -1
- package/dist/types/shared/assistant-protocol/parts.d.ts +43 -3
- package/dist/types/shared/assistant-protocol/request.d.ts +14 -2
- package/dist/types/shared/dashboard-authoring/calculated-field-identity.d.ts +3 -0
- package/dist/types/shared/dashboard-authoring/changes/card-query-part.d.ts +487 -0
- package/dist/types/shared/dashboard-authoring/changes/card-types.d.ts +34 -0
- package/dist/types/shared/dashboard-authoring/changes/dashboard-change.d.ts +7886 -0
- package/dist/types/shared/dashboard-authoring/changes/diagnostics.d.ts +43 -0
- package/dist/types/shared/dashboard-authoring/changes/read-card-query.d.ts +54 -0
- package/dist/types/shared/dashboard-authoring/changes/resolve-dashboard-changes.d.ts +89 -0
- package/dist/types/shared/dashboard-authoring/column-catalog.d.ts +32 -0
- package/dist/types/shared/dashboard-authoring/contracts.d.ts +0 -55
- package/dist/types/shared/dashboard-authoring/control-execution-contract.d.ts +16 -6
- package/dist/types/shared/dashboard-authoring/dashboard-card-source-index.d.ts +9 -1
- package/dist/types/shared/dashboard-authoring/dashboard-filter-mapping-contract.d.ts +7 -0
- package/dist/types/shared/dashboard-authoring/dashboard-input-scope.d.ts +118 -0
- package/dist/types/shared/dashboard-authoring/filter-applicability.d.ts +75 -0
- package/dist/types/shared/dashboard-authoring/filter-model/ad-hoc-filter-values.d.ts +10 -0
- package/dist/types/shared/dashboard-authoring/filter-model/filter-definitions.d.ts +29 -0
- package/dist/types/shared/dashboard-authoring/filter-model/filter-values.d.ts +58 -0
- package/dist/types/shared/dashboard-authoring/filter-model/index.d.ts +7 -0
- package/dist/types/shared/dashboard-authoring/filter-model/prototype-document-inputs.d.ts +15 -0
- package/dist/types/shared/dashboard-authoring/filter-model/read-dashboard-filter-model.d.ts +78 -0
- package/dist/types/shared/dashboard-authoring/filter-model/stored-dashboard.d.ts +18 -0
- package/dist/types/shared/dashboard-authoring/filter-model/toolbar-filter-reach.d.ts +23 -0
- package/dist/types/shared/dashboard-authoring/index.d.ts +20 -2
- package/dist/types/shared/dashboard-authoring/operations/apply-dashboard-operations.d.ts +10 -37
- package/dist/types/shared/dashboard-authoring/operations/operation-types.d.ts +189 -0
- package/dist/types/shared/dashboard-authoring/outline/outline-dashboard.d.ts +94 -0
- package/dist/types/shared/dashboard-authoring/outline/outline-filters.d.ts +78 -0
- package/dist/types/shared/dashboard-authoring/validators.d.ts +1 -2
- package/dist/types/shared/format-utils/exporters/index.d.ts +2 -0
- package/dist/types/shared/format-utils/exporters/rendered-file.d.ts +106 -0
- package/dist/types/shared/layouts/engine/grid.d.ts +25 -0
- package/dist/types/shared/layouts/engine/index.d.ts +4 -0
- package/dist/types/shared/layouts/engine/sheet-layout.d.ts +7 -0
- package/dist/types/shared/layouts/engine/types.d.ts +125 -0
- package/dist/types/shared/layouts/index.d.ts +1 -2
- package/package.json +2 -2
- package/dist/chunks/_commonjsHelpers-BkfeUUK-.js +0 -28
- package/dist/chunks/apply-dashboard-operations-Bz4n1Lq6.js +0 -2260
- package/dist/chunks/calendar-day-equality-BmJAWduY.js +0 -460
- package/dist/chunks/comparison-window-caption-BTkrN3W4.js +0 -1623
- package/dist/chunks/custom-visual-inputs-DUtpYZOk.js +0 -323
- package/dist/chunks/dashboard-briefing-launcher-DQ_8O_e2.js +0 -3725
- package/dist/chunks/dashboard-controls-8RyBTQUO.js +0 -2315
- package/dist/chunks/dashboard-filter-value-compatibility-CwQ_iSNb.js +0 -108
- package/dist/chunks/document-dashboard-inputs-BC6p-ESg.js +0 -8087
- package/dist/chunks/document-sheet-utils-Duo9uLoH.js +0 -3619
- package/dist/chunks/matrix-analytical-definition-C7Gb0e12.js +0 -117
- package/dist/chunks/normalize-dashboard-for-dirty-check-Bk3VYv_q.js +0 -67
- package/dist/chunks/numeric-presentation-DESvLiu9.js +0 -5227
- package/dist/chunks/sort-target-MT1WK1vX.js +0 -29
- package/dist/chunks/stable-serialize-CfqXeiBP.js +0 -6
- package/dist/chunks/table-settings-CLZocegs.js +0 -501
- package/dist/chunks/use-debounced-dirty-check-BwAbnX_5.js +0 -59
- package/dist/types/lib/dashboard-inputs/dashboard-filter-mapping-storage-transition.d.ts +0 -88
- package/dist/types/lib/dashboard-inputs/dashboard-input-scope.d.ts +0 -10
- package/dist/types/shared/dashboard-authoring/change-compiler.d.ts +0 -7
- package/dist/types/shared/dashboard-authoring/layout-compiler.d.ts +0 -2
- package/dist/types/shared/layouts/create-frame-layouts.d.ts +0 -27
- package/dist/types/shared/layouts/frame-layouts.d.ts +0 -23
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { TCard } from '../../../lib/types/common-types.js';
|
|
2
|
+
import { TChartType } from '../../../lib/charts/types.js';
|
|
3
|
+
import { CardConfig, DataSource, DetailField, Field, GroupByField, MetricField, SortByField } from '../../../lib/types/explorer-types.js';
|
|
4
|
+
import { MatrixConfig } from '../../analytics-protocol/matrix-definition-contract.js';
|
|
5
|
+
import { CardQueryForm } from './card-types.js';
|
|
6
|
+
import { CardQuery, FieldRef, MatrixColumns, MetricCardQuery, RecordsCardQuery } from './dashboard-change.js';
|
|
7
|
+
/**
|
|
8
|
+
* A card is two things: what it computes (its query part) and how it looks
|
|
9
|
+
* (everything else). `requery` replaces the first and carries the second, so
|
|
10
|
+
* a query change keeps every label, format and setting it doesn't name
|
|
11
|
+
* (MCP dashboard editing SPEC 3.4, DE-D38, DE-D51, DE-INV-11). A change to a
|
|
12
|
+
* stored card replaces only the parts of its query it states; every other
|
|
13
|
+
* part keeps its stored form byte for byte (DE-D61).
|
|
14
|
+
*/
|
|
15
|
+
export declare const CARD_QUERY_CONFIG_KEYS: readonly ["metricColumns", "groupByColumns", "pivotByColumns", "sortByColumns", "detailColumns", "queryBaseSource", "filters", "joinPlan", "rowLimit", "matrix"];
|
|
16
|
+
export type CardQueryConfigKey = (typeof CARD_QUERY_CONFIG_KEYS)[number];
|
|
17
|
+
/** A column's role and field identity, plus its position among columns of the same role and field. */
|
|
18
|
+
export type ColumnKey = {
|
|
19
|
+
role: 'metric' | 'group_by' | 'detail';
|
|
20
|
+
field: string;
|
|
21
|
+
ordinal: number;
|
|
22
|
+
};
|
|
23
|
+
export type CardQueryPart = {
|
|
24
|
+
/** The type this part was compiled for; must equal the card's type when applied. */
|
|
25
|
+
type: TChartType;
|
|
26
|
+
source: {
|
|
27
|
+
kind: 'semantic';
|
|
28
|
+
dataSource: DataSource;
|
|
29
|
+
connectionId: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'sql';
|
|
32
|
+
connectionId: string;
|
|
33
|
+
sql: string;
|
|
34
|
+
};
|
|
35
|
+
/** Only the query keys of CardConfig; undefined for SQL. */
|
|
36
|
+
config?: Pick<CardConfig, CardQueryConfigKey>;
|
|
37
|
+
/**
|
|
38
|
+
* Columns whose label the change stated (a field ref's label); those labels
|
|
39
|
+
* win over carried ones. For a Matrix, `metric` keys name measures and
|
|
40
|
+
* `group_by` keys name levels (`matrixColumnKeys`).
|
|
41
|
+
*/
|
|
42
|
+
statedLabels?: ColumnKey[];
|
|
43
|
+
/** What a change to a stored card states (DE-D61); absent, the part states everything. */
|
|
44
|
+
change?: QueryChange;
|
|
45
|
+
};
|
|
46
|
+
/** The parts of a card's query a `card.update` can state. */
|
|
47
|
+
export declare const QUERY_ASPECTS: readonly ["measures", "groupings", "columns", "filters", "order", "limit"];
|
|
48
|
+
export type QueryAspect = (typeof QUERY_ASPECTS)[number];
|
|
49
|
+
/**
|
|
50
|
+
* What a query change states differently from the card's read query.
|
|
51
|
+
* `requery` rebuilds only these aspects from the compiled part; every other
|
|
52
|
+
* part keeps its stored config byte for byte, and within a rebuilt aspect
|
|
53
|
+
* whatever the change left as it was keeps its stored form too. A part
|
|
54
|
+
* without one states everything: a new card, a new source or form, SQL.
|
|
55
|
+
*/
|
|
56
|
+
export type QueryChange = {
|
|
57
|
+
aspects: QueryAspect[];
|
|
58
|
+
/** Finer facts a structural control's override is checked against (`controlRefusal`). */
|
|
59
|
+
parts: {
|
|
60
|
+
/** A measure's stated aggregate differs from what it read, or a new measure states one. */
|
|
61
|
+
measureAggregates: boolean;
|
|
62
|
+
/** The dimensions (fields, in order) differ. */
|
|
63
|
+
dimensions: boolean;
|
|
64
|
+
/** The grouped date's grain differs. */
|
|
65
|
+
timeGrain: boolean;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Columns the change left exactly as they read (role, field, occurrence): in
|
|
69
|
+
* a rebuilt aspect each must come back as its stored column, else the reading
|
|
70
|
+
* didn't compile back to what the card stores and the change is refused.
|
|
71
|
+
*/
|
|
72
|
+
keptColumns: ColumnKey[];
|
|
73
|
+
/** Filters the change left as they were, by condition id: each keeps its stored condition. */
|
|
74
|
+
keptFilterIds: string[];
|
|
75
|
+
/** The change left the date window as it was: it keeps its stored condition. */
|
|
76
|
+
keptWindow: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* The stored card's order is a choice (its read query states `orderBy`).
|
|
79
|
+
* Otherwise it is the compiler's default or none, and a default follows the
|
|
80
|
+
* query: rebuilt when the measures, groupings, columns or limit change.
|
|
81
|
+
*/
|
|
82
|
+
orderChosen: boolean;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* The aspect that owns each query config key. `source` keys (the base source
|
|
86
|
+
* and joins, with the card's data source) follow the datasets the card's
|
|
87
|
+
* fields use; a Matrix is split by aspect inside its spec.
|
|
88
|
+
*/
|
|
89
|
+
export declare const QUERY_CONFIG_KEY_ASPECTS: {
|
|
90
|
+
readonly metricColumns: "measures";
|
|
91
|
+
readonly groupByColumns: "groupings";
|
|
92
|
+
readonly pivotByColumns: "groupings";
|
|
93
|
+
readonly detailColumns: "columns";
|
|
94
|
+
readonly filters: "filters";
|
|
95
|
+
readonly sortByColumns: "order";
|
|
96
|
+
readonly rowLimit: "limit";
|
|
97
|
+
readonly queryBaseSource: "source";
|
|
98
|
+
readonly joinPlan: "source";
|
|
99
|
+
readonly matrix: "matrix";
|
|
100
|
+
};
|
|
101
|
+
/** Deep equality of stored values, independent of key order; `undefined` and absent are equal. */
|
|
102
|
+
export declare function sameValue(left: unknown, right: unknown): boolean;
|
|
103
|
+
/** TCard: `query` keys are replaced by `requery`, `presentation` keys kept byte for byte. */
|
|
104
|
+
export declare const CARD_KEY_CLASSES: {
|
|
105
|
+
readonly id: "presentation";
|
|
106
|
+
readonly title: "presentation";
|
|
107
|
+
readonly tabTitle: "presentation";
|
|
108
|
+
readonly displayTab: "presentation";
|
|
109
|
+
readonly description: "presentation";
|
|
110
|
+
readonly info: "presentation";
|
|
111
|
+
readonly connectionId: "query";
|
|
112
|
+
readonly datamodelId: "presentation";
|
|
113
|
+
readonly type: "query";
|
|
114
|
+
readonly sql: "query";
|
|
115
|
+
readonly python: "query";
|
|
116
|
+
readonly dataSource: "query";
|
|
117
|
+
readonly config: "query";
|
|
118
|
+
readonly interactionConfig: "presentation";
|
|
119
|
+
readonly linkedSourceCardId: "presentation";
|
|
120
|
+
readonly linkedReferenceOverrides: "presentation";
|
|
121
|
+
readonly linkedInteractionTargetOverrides: "presentation";
|
|
122
|
+
readonly clickToFilter: "presentation";
|
|
123
|
+
readonly respondsToSelections: "presentation";
|
|
124
|
+
readonly linkedClickToFilterOverrides: "presentation";
|
|
125
|
+
readonly paginationConfig: "presentation";
|
|
126
|
+
readonly queryConfig: "presentation";
|
|
127
|
+
readonly customCfg: "presentation";
|
|
128
|
+
readonly preferences: "presentation";
|
|
129
|
+
readonly customCardPreferences: "presentation";
|
|
130
|
+
readonly lastSelectedDatabase: "presentation";
|
|
131
|
+
readonly lastSelectedDatamodelId: "presentation";
|
|
132
|
+
readonly lastSelectedSchema: "presentation";
|
|
133
|
+
readonly lastSelectedTable: "presentation";
|
|
134
|
+
readonly refreshInterval: "presentation";
|
|
135
|
+
readonly displayPreferences: "presentation";
|
|
136
|
+
readonly inlineFilters: "presentation";
|
|
137
|
+
readonly calculatedFields: "presentation";
|
|
138
|
+
readonly controls: "presentation";
|
|
139
|
+
readonly controlBindings: "presentation";
|
|
140
|
+
};
|
|
141
|
+
/** CardConfig: the query keys are `CARD_QUERY_CONFIG_KEYS`; the rest are kept. */
|
|
142
|
+
export declare const CARD_CONFIG_KEY_CLASSES: {
|
|
143
|
+
readonly matrix: "query";
|
|
144
|
+
readonly groupByColumns: "query";
|
|
145
|
+
readonly metricColumns: "query";
|
|
146
|
+
readonly pivotByColumns: "query";
|
|
147
|
+
readonly sortByColumns: "query";
|
|
148
|
+
readonly detailColumns: "query";
|
|
149
|
+
readonly queryBaseSource: "query";
|
|
150
|
+
readonly filters: "query";
|
|
151
|
+
readonly joinPlan: "query";
|
|
152
|
+
readonly rowLimit: "query";
|
|
153
|
+
readonly detailTableBackup: "presentation";
|
|
154
|
+
readonly summary: "presentation";
|
|
155
|
+
readonly rowAggregates: "presentation";
|
|
156
|
+
readonly columnAggregates: "presentation";
|
|
157
|
+
};
|
|
158
|
+
export declare const COLUMN_KEY_CLASSES: {
|
|
159
|
+
metric: {
|
|
160
|
+
readonly parameters: "query";
|
|
161
|
+
readonly aliasTemplate: "presentation";
|
|
162
|
+
readonly valueAliases: "presentation";
|
|
163
|
+
readonly isPreAggregated: "query";
|
|
164
|
+
readonly semanticAggregate: "query";
|
|
165
|
+
readonly effectiveAggregate: "query";
|
|
166
|
+
readonly aggregateSource: "query";
|
|
167
|
+
readonly comparison: "presentation";
|
|
168
|
+
readonly comparisonPolarity: "presentation";
|
|
169
|
+
readonly semanticComparisonPolarity: "query";
|
|
170
|
+
readonly id: "presentation";
|
|
171
|
+
readonly name: "query";
|
|
172
|
+
readonly label: "presentation";
|
|
173
|
+
readonly derivedLabel: "presentation";
|
|
174
|
+
readonly alias: "query";
|
|
175
|
+
readonly sourceField: "query";
|
|
176
|
+
readonly source: "query";
|
|
177
|
+
readonly qualifiedFieldName: "query";
|
|
178
|
+
readonly dataType: "query";
|
|
179
|
+
readonly nativeDataType: "query";
|
|
180
|
+
readonly description: "query";
|
|
181
|
+
readonly qualifiedEntityName: "query";
|
|
182
|
+
readonly dateFormat: "presentation";
|
|
183
|
+
readonly customFormat: "presentation";
|
|
184
|
+
readonly granularity: "query";
|
|
185
|
+
readonly entityId: "query";
|
|
186
|
+
readonly entityName: "query";
|
|
187
|
+
readonly entityType: "query";
|
|
188
|
+
readonly role: "query";
|
|
189
|
+
readonly expression: "query";
|
|
190
|
+
readonly calculatedFormula: "query";
|
|
191
|
+
readonly derivedField: "query";
|
|
192
|
+
readonly format: "presentation";
|
|
193
|
+
readonly semanticTemporalPresentation: "presentation";
|
|
194
|
+
readonly aggregate: "query";
|
|
195
|
+
readonly aggregateOrigin: "query";
|
|
196
|
+
readonly calculationRepresentation: "query";
|
|
197
|
+
readonly calculatedFieldOrigin: "query";
|
|
198
|
+
readonly labelOrigin: "presentation";
|
|
199
|
+
readonly formatOrigin: "presentation";
|
|
200
|
+
readonly fieldScope: "query";
|
|
201
|
+
};
|
|
202
|
+
group_by: {
|
|
203
|
+
readonly timeDrillPath: "presentation";
|
|
204
|
+
readonly id: "presentation";
|
|
205
|
+
readonly name: "query";
|
|
206
|
+
readonly label: "presentation";
|
|
207
|
+
readonly derivedLabel: "presentation";
|
|
208
|
+
readonly alias: "query";
|
|
209
|
+
readonly sourceField: "query";
|
|
210
|
+
readonly source: "query";
|
|
211
|
+
readonly qualifiedFieldName: "query";
|
|
212
|
+
readonly dataType: "query";
|
|
213
|
+
readonly nativeDataType: "query";
|
|
214
|
+
readonly description: "query";
|
|
215
|
+
readonly qualifiedEntityName: "query";
|
|
216
|
+
readonly dateFormat: "presentation";
|
|
217
|
+
readonly customFormat: "presentation";
|
|
218
|
+
readonly granularity: "query";
|
|
219
|
+
readonly entityId: "query";
|
|
220
|
+
readonly entityName: "query";
|
|
221
|
+
readonly entityType: "query";
|
|
222
|
+
readonly role: "query";
|
|
223
|
+
readonly expression: "query";
|
|
224
|
+
readonly calculatedFormula: "query";
|
|
225
|
+
readonly derivedField: "query";
|
|
226
|
+
readonly format: "presentation";
|
|
227
|
+
readonly semanticTemporalPresentation: "presentation";
|
|
228
|
+
readonly aggregate: "query";
|
|
229
|
+
readonly aggregateOrigin: "query";
|
|
230
|
+
readonly calculationRepresentation: "query";
|
|
231
|
+
readonly calculatedFieldOrigin: "query";
|
|
232
|
+
readonly labelOrigin: "presentation";
|
|
233
|
+
readonly formatOrigin: "presentation";
|
|
234
|
+
readonly fieldScope: "query";
|
|
235
|
+
};
|
|
236
|
+
detail: {
|
|
237
|
+
readonly id: "presentation";
|
|
238
|
+
readonly name: "query";
|
|
239
|
+
readonly label: "presentation";
|
|
240
|
+
readonly derivedLabel: "presentation";
|
|
241
|
+
readonly alias: "query";
|
|
242
|
+
readonly sourceField: "query";
|
|
243
|
+
readonly source: "query";
|
|
244
|
+
readonly qualifiedFieldName: "query";
|
|
245
|
+
readonly dataType: "query";
|
|
246
|
+
readonly nativeDataType: "query";
|
|
247
|
+
readonly description: "query";
|
|
248
|
+
readonly qualifiedEntityName: "query";
|
|
249
|
+
readonly dateFormat: "presentation";
|
|
250
|
+
readonly customFormat: "presentation";
|
|
251
|
+
readonly granularity: "query";
|
|
252
|
+
readonly entityId: "query";
|
|
253
|
+
readonly entityName: "query";
|
|
254
|
+
readonly entityType: "query";
|
|
255
|
+
readonly role: "query";
|
|
256
|
+
readonly expression: "query";
|
|
257
|
+
readonly calculatedFormula: "query";
|
|
258
|
+
readonly derivedField: "query";
|
|
259
|
+
readonly format: "presentation";
|
|
260
|
+
readonly semanticTemporalPresentation: "presentation";
|
|
261
|
+
readonly aggregate: "query";
|
|
262
|
+
readonly aggregateOrigin: "query";
|
|
263
|
+
readonly calculationRepresentation: "query";
|
|
264
|
+
readonly calculatedFieldOrigin: "query";
|
|
265
|
+
readonly labelOrigin: "presentation";
|
|
266
|
+
readonly formatOrigin: "presentation";
|
|
267
|
+
readonly fieldScope: "query";
|
|
268
|
+
};
|
|
269
|
+
sort: {
|
|
270
|
+
readonly direction: "query";
|
|
271
|
+
readonly id: "presentation";
|
|
272
|
+
readonly name: "query";
|
|
273
|
+
readonly label: "presentation";
|
|
274
|
+
readonly derivedLabel: "presentation";
|
|
275
|
+
readonly alias: "query";
|
|
276
|
+
readonly sourceField: "query";
|
|
277
|
+
readonly source: "query";
|
|
278
|
+
readonly qualifiedFieldName: "query";
|
|
279
|
+
readonly dataType: "query";
|
|
280
|
+
readonly nativeDataType: "query";
|
|
281
|
+
readonly description: "query";
|
|
282
|
+
readonly qualifiedEntityName: "query";
|
|
283
|
+
readonly dateFormat: "presentation";
|
|
284
|
+
readonly customFormat: "presentation";
|
|
285
|
+
readonly granularity: "query";
|
|
286
|
+
readonly entityId: "query";
|
|
287
|
+
readonly entityName: "query";
|
|
288
|
+
readonly entityType: "query";
|
|
289
|
+
readonly role: "query";
|
|
290
|
+
readonly expression: "query";
|
|
291
|
+
readonly calculatedFormula: "query";
|
|
292
|
+
readonly derivedField: "query";
|
|
293
|
+
readonly format: "presentation";
|
|
294
|
+
readonly semanticTemporalPresentation: "presentation";
|
|
295
|
+
readonly aggregate: "query";
|
|
296
|
+
readonly aggregateOrigin: "query";
|
|
297
|
+
readonly calculationRepresentation: "query";
|
|
298
|
+
readonly calculatedFieldOrigin: "query";
|
|
299
|
+
readonly labelOrigin: "presentation";
|
|
300
|
+
readonly formatOrigin: "presentation";
|
|
301
|
+
readonly fieldScope: "query";
|
|
302
|
+
};
|
|
303
|
+
pivot: {
|
|
304
|
+
readonly memberOrder: "presentation";
|
|
305
|
+
readonly id: "presentation";
|
|
306
|
+
readonly name: "query";
|
|
307
|
+
readonly label: "presentation";
|
|
308
|
+
readonly derivedLabel: "presentation";
|
|
309
|
+
readonly alias: "query";
|
|
310
|
+
readonly sourceField: "query";
|
|
311
|
+
readonly source: "query";
|
|
312
|
+
readonly qualifiedFieldName: "query";
|
|
313
|
+
readonly dataType: "query";
|
|
314
|
+
readonly nativeDataType: "query";
|
|
315
|
+
readonly description: "query";
|
|
316
|
+
readonly qualifiedEntityName: "query";
|
|
317
|
+
readonly dateFormat: "presentation";
|
|
318
|
+
readonly customFormat: "presentation";
|
|
319
|
+
readonly granularity: "query";
|
|
320
|
+
readonly entityId: "query";
|
|
321
|
+
readonly entityName: "query";
|
|
322
|
+
readonly entityType: "query";
|
|
323
|
+
readonly role: "query";
|
|
324
|
+
readonly expression: "query";
|
|
325
|
+
readonly calculatedFormula: "query";
|
|
326
|
+
readonly derivedField: "query";
|
|
327
|
+
readonly format: "presentation";
|
|
328
|
+
readonly semanticTemporalPresentation: "presentation";
|
|
329
|
+
readonly aggregate: "query";
|
|
330
|
+
readonly aggregateOrigin: "query";
|
|
331
|
+
readonly calculationRepresentation: "query";
|
|
332
|
+
readonly calculatedFieldOrigin: "query";
|
|
333
|
+
readonly labelOrigin: "presentation";
|
|
334
|
+
readonly formatOrigin: "presentation";
|
|
335
|
+
readonly fieldScope: "query";
|
|
336
|
+
};
|
|
337
|
+
};
|
|
338
|
+
/** Per column type, the attributes a paired column keeps (besides its id). */
|
|
339
|
+
export declare const COLUMN_PRESENTATION_KEYS: {
|
|
340
|
+
readonly metric: string[];
|
|
341
|
+
readonly group_by: string[];
|
|
342
|
+
readonly detail: string[];
|
|
343
|
+
};
|
|
344
|
+
type ColumnRole = ColumnKey['role'];
|
|
345
|
+
type Column = MetricField | GroupByField | DetailField;
|
|
346
|
+
/** The dataset a column's field belongs to: its semantic source, else its entity. */
|
|
347
|
+
export declare function columnDataset(field: Pick<Field, 'source' | 'entityName' | 'entityId'>): string;
|
|
348
|
+
/** A field's identity from its name and dataset: the one key columns and field refs are compared by. */
|
|
349
|
+
export declare function fieldIdentityKey(name: string, dataset: string): string;
|
|
350
|
+
/** A column's field identity: its name and dataset (never its label). */
|
|
351
|
+
export declare function columnFieldKey(field: Pick<Field, 'name' | 'source' | 'entityName' | 'entityId'>): string;
|
|
352
|
+
/**
|
|
353
|
+
* The field of a catalog named `name` on `dataset`: the dataset's own field
|
|
354
|
+
* first, so a domain calculated field of the same name (listed first in the
|
|
355
|
+
* editor's catalog) never stands in for it; else any field of that name.
|
|
356
|
+
*/
|
|
357
|
+
export declare function findCatalogField<T extends Pick<Field, 'name' | 'source' | 'entityName' | 'entityId'>>(fields: readonly T[], name: string, dataset: string): T | undefined;
|
|
358
|
+
export type ColumnPair = {
|
|
359
|
+
oldIndex: number;
|
|
360
|
+
newIndex: number;
|
|
361
|
+
pass: 1 | 2;
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* Pairs new columns with old ones of the same role: first the same field with
|
|
365
|
+
* the same aggregate or grain, in order; then the same field, in order (the
|
|
366
|
+
* aggregate or grain changed). Unpaired new columns are new; unpaired old
|
|
367
|
+
* columns are gone. Deterministic and total (S-INV-6a).
|
|
368
|
+
*/
|
|
369
|
+
export declare function matchColumns(role: ColumnRole, previous: readonly Column[], next: readonly Column[]): ColumnPair[];
|
|
370
|
+
/**
|
|
371
|
+
* Each item's ColumnKey: its role, its field key, and which occurrence of that
|
|
372
|
+
* field it is among every item of the list. Labels, pairing and sorts all name
|
|
373
|
+
* a column this way, so a repeated field (a sum and an average of one measure)
|
|
374
|
+
* is never confused with its other occurrence.
|
|
375
|
+
*/
|
|
376
|
+
export declare function occurrenceKeys<T>(role: ColumnRole, items: readonly T[], key: (item: T) => string): ColumnKey[];
|
|
377
|
+
/** The ColumnKey of each column in a list, in order. */
|
|
378
|
+
export declare function columnKeys(role: ColumnRole, columns: readonly Column[]): ColumnKey[];
|
|
379
|
+
/** A Matrix's levels (rows, then columns) and measures as ColumnKeys, in spec order. */
|
|
380
|
+
export declare function matrixColumnKeys(matrix: MatrixConfig): {
|
|
381
|
+
levels: ColumnKey[];
|
|
382
|
+
measures: ColumnKey[];
|
|
383
|
+
};
|
|
384
|
+
export declare const sameColumnKey: (left: ColumnKey, right: ColumnKey) => boolean;
|
|
385
|
+
/**
|
|
386
|
+
* The column a sort entry sorts by, by the one rule the query builder and the
|
|
387
|
+
* viewer resolve sorts with (`findSortTarget`), so what a card is read as
|
|
388
|
+
* sorting by is what its query sorts by.
|
|
389
|
+
*/
|
|
390
|
+
export declare function findSortedColumn(config: Pick<CardConfig, 'metricColumns' | 'groupByColumns' | 'detailColumns'>, sort: SortByField): Column | undefined;
|
|
391
|
+
/** A field ref's name. */
|
|
392
|
+
export declare function refName(ref: FieldRef): string;
|
|
393
|
+
/** A field ref's dataset: its own, else the query's base dataset. */
|
|
394
|
+
export declare function refDataset(ref: FieldRef, base: string): string;
|
|
395
|
+
/** A field ref's identity: its name and dataset, however the base dataset is written (`fieldIdentityKey`). */
|
|
396
|
+
export declare function refKey(ref: FieldRef, base: string): string;
|
|
397
|
+
/** A query's form: measures, records (columns) or SQL. */
|
|
398
|
+
export declare function queryForm(query: object | undefined): CardQueryForm | undefined;
|
|
399
|
+
/** Whether a column or Matrix level is the grouped date: a date-like field with a grain (one rule for every reader and writer). */
|
|
400
|
+
export declare function isGroupedDate(field: {
|
|
401
|
+
dataType?: string;
|
|
402
|
+
} | undefined, grain: string | undefined): boolean;
|
|
403
|
+
/** A label a change states, on the column it names. */
|
|
404
|
+
export type StatedLabel = {
|
|
405
|
+
key: ColumnKey;
|
|
406
|
+
label: string;
|
|
407
|
+
};
|
|
408
|
+
/**
|
|
409
|
+
* Every label a query states, each on its ColumnKey, counted over every ref
|
|
410
|
+
* of its role, labelled or not (group_by: the dimensions, then a grouped
|
|
411
|
+
* date), so a label on the second of two measures of one field lands on the
|
|
412
|
+
* second.
|
|
413
|
+
*/
|
|
414
|
+
export declare function statedLabelsOf(query: MetricCardQuery | RecordsCardQuery): StatedLabel[];
|
|
415
|
+
/** Whether a change rebuilds the columns of a role (else a label there is applied in place, `planCardLabels`). */
|
|
416
|
+
export declare function rebuildsRole(change: QueryChange | undefined, role: ColumnKey['role']): boolean;
|
|
417
|
+
/**
|
|
418
|
+
* What a patched query changes on the card it was read from, or undefined
|
|
419
|
+
* when it changes everything (a new source, form or SQL). An aspect changes
|
|
420
|
+
* when what it computes changes: field refs compare by identity (`refKey`)
|
|
421
|
+
* and stated aggregate, never by label, so a label alone changes no aspect
|
|
422
|
+
* and is applied to its column in place (`planCardLabels`), with nothing
|
|
423
|
+
* recompiled. The date field serves its grain and its window, so a new one
|
|
424
|
+
* belongs to whichever it serves (both when it serves neither).
|
|
425
|
+
*/
|
|
426
|
+
export declare function describeQueryChange(read: CardQuery, merged: CardQuery, readMatrix: MatrixColumns | undefined, matrix: MatrixColumns | undefined): QueryChange | undefined;
|
|
427
|
+
/** The label a card shows for the column a ColumnKey names (a Matrix level or measure through its presentation). */
|
|
428
|
+
export declare function labelAt(card: TCard, key: ColumnKey): string | undefined;
|
|
429
|
+
/**
|
|
430
|
+
* The card with each stated label on the column it names, written by the
|
|
431
|
+
* label owner (`withAuthoredLabel`; on a Matrix, its presentation labels),
|
|
432
|
+
* and the labels that changed anything. A sort entry that copies a relabelled
|
|
433
|
+
* column follows it. Nothing is recompiled: a label is presentation.
|
|
434
|
+
*/
|
|
435
|
+
export declare function planCardLabels(card: TCard, labels: readonly StatedLabel[]): {
|
|
436
|
+
card: TCard;
|
|
437
|
+
changed: StatedLabel[];
|
|
438
|
+
};
|
|
439
|
+
/** A paired column whose aggregate or grain changed kept a label that differs from the field's own. */
|
|
440
|
+
export type KeptLabel = {
|
|
441
|
+
label: string;
|
|
442
|
+
field: string;
|
|
443
|
+
role: ColumnRole;
|
|
444
|
+
};
|
|
445
|
+
export type CardRequery = {
|
|
446
|
+
ok: true;
|
|
447
|
+
card: TCard;
|
|
448
|
+
keptLabels: KeptLabel[];
|
|
449
|
+
/** Control bindings the change leaves without a target (a Matrix level or measure it removed), by control id. */
|
|
450
|
+
droppedBindings: string[];
|
|
451
|
+
} | {
|
|
452
|
+
ok: false;
|
|
453
|
+
code: 'query_type_mismatch' | 'query_invalid';
|
|
454
|
+
message: string;
|
|
455
|
+
}
|
|
456
|
+
/** The change would alter a part of the card it doesn't state (DE-D61); `parts` names them. */
|
|
457
|
+
| {
|
|
458
|
+
ok: false;
|
|
459
|
+
code: 'query_not_kept';
|
|
460
|
+
message: string;
|
|
461
|
+
parts: string[];
|
|
462
|
+
};
|
|
463
|
+
/**
|
|
464
|
+
* `requery`'s one owner: the reducer applies it and the resolver reads its
|
|
465
|
+
* kept labels for `label_kept_after_change`. Without a `change` (a new card,
|
|
466
|
+
* a new source or form) the query part replaces the card's query keys; every
|
|
467
|
+
* other card field and config key is kept, and each paired column keeps its
|
|
468
|
+
* id and presentation (S-INV-5). With one (DE-D61), only the aspects it
|
|
469
|
+
* states are rebuilt: the rest keep their stored config, a column the change
|
|
470
|
+
* left as it was keeps its stored form, sorts follow their columns, and the
|
|
471
|
+
* result is checked against the stored card, so a part the change doesn't
|
|
472
|
+
* state never changes.
|
|
473
|
+
*/
|
|
474
|
+
export declare function planCardRequery(card: TCard, part: CardQueryPart): CardRequery;
|
|
475
|
+
/**
|
|
476
|
+
* A change to a part of a chart or table that a control on it replaces at run
|
|
477
|
+
* time (`structuralControlOverride`) wouldn't take effect, so it is refused;
|
|
478
|
+
* every other part still changes (a measure added under an aggregation
|
|
479
|
+
* control, a dimension under a grain control). `relabelled` names the roles
|
|
480
|
+
* whose labels the change sets in place. A Matrix's controls each target one
|
|
481
|
+
* level or measure and are checked against it (`rebaseMatrix`). The resolver
|
|
482
|
+
* asks before compiling; `planCardRequery` asks again at apply.
|
|
483
|
+
*/
|
|
484
|
+
export declare function controlRefusal(card: TCard, change: QueryChange | undefined, relabelled?: readonly ColumnKey['role'][]): Extract<CardRequery, {
|
|
485
|
+
code: 'query_not_kept';
|
|
486
|
+
}> | undefined;
|
|
487
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { TChartType } from '../../../lib/charts/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The card types an agent may set, and their rules (MCP dashboard editing
|
|
4
|
+
* DE-D20, DE-D43). Public names are snake_case; each maps to one stored chart
|
|
5
|
+
* type. Every other chart type still has a public name, for reading.
|
|
6
|
+
*/
|
|
7
|
+
export declare const CARD_TYPES: readonly ["kpi", "bar", "line", "area", "pie", "table", "detail_table", "matrix"];
|
|
8
|
+
export type CardType = (typeof CARD_TYPES)[number];
|
|
9
|
+
/** The three query forms a card can be written in. */
|
|
10
|
+
export type CardQueryForm = 'measures' | 'records' | 'sql';
|
|
11
|
+
export type CardTypeRule = {
|
|
12
|
+
chartType: TChartType;
|
|
13
|
+
/** The query forms this type accepts. */
|
|
14
|
+
forms: readonly CardQueryForm[];
|
|
15
|
+
/** A measures query's measure count. */
|
|
16
|
+
measures?: {
|
|
17
|
+
min: number;
|
|
18
|
+
max?: number;
|
|
19
|
+
};
|
|
20
|
+
/** False when a measures query may not have dimensions. */
|
|
21
|
+
dimensions: boolean;
|
|
22
|
+
/** True when the change must say which fields run across the top (`matrix.columns`). */
|
|
23
|
+
matrixColumns: boolean;
|
|
24
|
+
};
|
|
25
|
+
export declare const CARD_TYPE_RULES: Record<CardType, CardTypeRule>;
|
|
26
|
+
export declare function isCardType(value: unknown): value is CardType;
|
|
27
|
+
/** The stored chart type of a settable card type. */
|
|
28
|
+
export declare function toChartType(type: CardType): TChartType;
|
|
29
|
+
/** Every chart type's public snake_case name (`detailTable` is `detail_table`, `matrixTable` is `matrix`). */
|
|
30
|
+
export declare function toPublicCardType(chartType: TChartType | string | undefined): string;
|
|
31
|
+
/** The settable card type a chart type is, or undefined when it is not one of the eight. */
|
|
32
|
+
export declare function settableCardType(chartType: TChartType | string | undefined): CardType | undefined;
|
|
33
|
+
/** A chart type as a sentence names it ("bar chart", "detail table", "KPI"). */
|
|
34
|
+
export declare function cardTypeSentenceName(chartType: TChartType | string | undefined): string;
|