react-semaphor 0.1.325 → 0.1.327
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.cjs +1 -1
- package/dist/analytics-protocol/index.js +260 -226
- package/dist/brand-studio/index.cjs +2 -2
- package/dist/brand-studio/index.js +7 -6
- package/dist/chunks/{braces-ZjRH2Kl7.js → braces-B6qRDu1H.js} +1 -1
- package/dist/chunks/{braces-C7BeIXvM.js → braces-BGWZEnQJ.js} +1 -1
- package/dist/chunks/{calendar-preferences-dialog-DHhT6Sja.js → calendar-preferences-dialog-CjwbE_82.js} +6 -5
- package/dist/chunks/calendar-preferences-dialog-fkLUMJyR.js +1 -0
- package/dist/chunks/{chevrons-up-down-CA-XvN1o.js → chevrons-up-down-BpsogQvv.js} +1 -1
- package/dist/chunks/{chevrons-up-down-Cuilz9aY.js → chevrons-up-down-xG-bVFD9.js} +1 -1
- package/dist/chunks/{dashboard-briefing-launcher-DZiFMK8I.js → dashboard-briefing-launcher-Co57xBfS.js} +2 -2
- package/dist/chunks/{dashboard-briefing-launcher-BzIxRlzW.js → dashboard-briefing-launcher-Cy1nWZRW.js} +714 -719
- package/dist/chunks/{dashboard-controls-DVwsWny9.js → dashboard-controls-BWnVEFJq.js} +10 -9
- package/dist/chunks/{dashboard-controls-BX693lE0.js → dashboard-controls-C7rOGZO-.js} +1 -1
- package/dist/chunks/{dashboard-json-D15C_I9e.js → dashboard-json-BpRNSsF3.js} +7 -6
- package/dist/chunks/dashboard-json-DBPMknGo.js +1 -0
- package/dist/chunks/date-formatter-B4EBSe9C.js +1 -0
- package/dist/chunks/date-formatter-CzcPZx39.js +416 -0
- package/dist/chunks/edit-dashboard-visual-B2vkIKEa.js +178 -0
- package/dist/chunks/{edit-dashboard-visual-wQyJEcVH.js → edit-dashboard-visual-CYf26co_.js} +8243 -7784
- package/dist/chunks/index-BD90s-wf.js +1309 -0
- package/dist/chunks/index-BxM99sFL.js +1 -0
- package/dist/chunks/index-CuHybtft.js +51 -0
- package/dist/chunks/{index-CffvIaZO.js → index-DTlbYpxd.js} +29440 -28968
- package/dist/chunks/{palette-D96DOM7E.js → palette-CSF7IVJn.js} +1 -1
- package/dist/chunks/{palette-CanPG11m.js → palette-CWgEPBoG.js} +1 -1
- package/dist/chunks/{resource-management-panel-DlnrD0y-.js → resource-management-panel-D6nbfJY3.js} +1 -1
- package/dist/chunks/{resource-management-panel-CLoO2DL3.js → resource-management-panel-D893Onv8.js} +6 -5
- package/dist/chunks/{save-CqrBQKG6.js → save-CtQbSub2.js} +1 -1
- package/dist/chunks/{save-DxkSzUTZ.js → save-DRdFKF57.js} +1 -1
- package/dist/chunks/switch-DJJJD_g1.js +168 -0
- package/dist/chunks/{switch-Deo2Ltmj.js → switch-DKf6vHfP.js} +2222 -2228
- package/dist/chunks/{use-create-flow-overlay-state-DocFanjO.js → use-create-flow-overlay-state-C4LgoK8q.js} +1 -1
- package/dist/chunks/{use-create-flow-overlay-state-DsPoCfMu.js → use-create-flow-overlay-state-p21zs2p6.js} +29 -28
- package/dist/chunks/{use-visual-utils-BdO22fQZ.js → use-visual-utils-BKBua6o4.js} +2 -2
- package/dist/chunks/{use-visual-utils-DSbXQQD1.js → use-visual-utils-BqWm0QeW.js} +1 -1
- package/dist/chunks/validators-DDAweCzB.js +371 -0
- package/dist/chunks/validators-odlRJblR.js +2 -0
- package/dist/dashboard/index.cjs +1 -1
- package/dist/dashboard/index.js +1 -1
- package/dist/dashboard-authoring/index.cjs +3 -3
- package/dist/dashboard-authoring/index.js +919 -507
- package/dist/data-app-sdk/index.cjs +1 -0
- package/dist/data-app-sdk/index.js +512 -0
- package/dist/format-utils/index.cjs +4 -4
- package/dist/format-utils/index.js +22 -21
- package/dist/index.cjs +1 -1
- package/dist/index.js +141 -140
- package/dist/style.css +1 -1
- package/dist/surfboard/index.cjs +1 -1
- package/dist/surfboard/index.js +2 -2
- package/dist/types/analytics-protocol.d.ts +326 -2
- package/dist/types/dashboard-authoring.d.ts +102 -3
- package/dist/types/dashboard.d.ts +23 -3
- package/dist/types/data-app-sdk.d.ts +379 -0
- package/dist/types/format-utils.d.ts +25 -0
- package/dist/types/main.d.ts +182 -12
- package/dist/types/shared.d.ts +18 -2
- package/dist/types/surfboard.d.ts +23 -3
- package/dist/types/types.d.ts +38 -4
- package/package.json +6 -1
- package/dist/chunks/calendar-preferences-dialog-BxeROxyq.js +0 -1
- package/dist/chunks/dashboard-json-DxNEFM-p.js +0 -1
- package/dist/chunks/date-formatter-D9Bvw5Qk.js +0 -1
- package/dist/chunks/date-formatter-DyIOb6uC.js +0 -333
- package/dist/chunks/edit-dashboard-visual-90_qEgRc.js +0 -178
- package/dist/chunks/index-YTk9Hab2.js +0 -1303
- package/dist/chunks/switch-BXICAlvS.js +0 -168
|
@@ -1,407 +1,687 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const
|
|
1
|
+
import { a as be, v as Ie } from "../chunks/validators-DDAweCzB.js";
|
|
2
|
+
const ge = [
|
|
3
3
|
"lg",
|
|
4
4
|
"md",
|
|
5
5
|
"sm",
|
|
6
6
|
"xs",
|
|
7
7
|
"xxs"
|
|
8
|
-
],
|
|
9
|
-
function
|
|
10
|
-
return
|
|
8
|
+
], M = 10;
|
|
9
|
+
function _(e) {
|
|
10
|
+
return e && typeof e == "object" ? e : null;
|
|
11
|
+
}
|
|
12
|
+
function k(e) {
|
|
13
|
+
return typeof e == "string" ? e : null;
|
|
14
|
+
}
|
|
15
|
+
function ye(e) {
|
|
16
|
+
var t, n, r;
|
|
17
|
+
return !!(e && typeof e == "object") && (((t = _(e)) == null ? void 0 : t.kind) === "semantic" || ((n = _(e)) == null ? void 0 : n.kind) === "physical" || ((r = _(e)) == null ? void 0 : r.kind) === "sql");
|
|
18
|
+
}
|
|
19
|
+
function N(e) {
|
|
20
|
+
return ye(e) ? e.kind === "semantic" ? !!(e.domainId && e.datasetName) : e.kind === "physical" ? !!(e.connectionId && e.tableName) : !1 : !1;
|
|
21
|
+
}
|
|
22
|
+
function ee(e) {
|
|
23
|
+
return e.kind === "semantic" ? [
|
|
24
|
+
"semantic",
|
|
25
|
+
e.domainId,
|
|
26
|
+
e.datasetId || "",
|
|
27
|
+
e.datasetName
|
|
28
|
+
].join(":") : e.kind === "physical" ? [
|
|
29
|
+
"physical",
|
|
30
|
+
e.connectionId,
|
|
31
|
+
e.databaseName || "",
|
|
32
|
+
e.schemaName || "",
|
|
33
|
+
e.tableName
|
|
34
|
+
].join(":") : ["sql", e.connectionId, e.sql].join(":");
|
|
35
|
+
}
|
|
36
|
+
function O(e, t) {
|
|
37
|
+
return e.domainId !== t.domainId ? !1 : e.datasetId && t.datasetId ? e.datasetId === t.datasetId : e.datasetName === t.datasetName;
|
|
38
|
+
}
|
|
39
|
+
function ae(e, t) {
|
|
40
|
+
return e.kind === "semantic" && t.kind === "semantic" ? O(e, t) : ee(e) === ee(t);
|
|
41
|
+
}
|
|
42
|
+
function _e(e, t) {
|
|
43
|
+
return e.kind !== "semantic" || t.kind !== "semantic" ? e : {
|
|
44
|
+
...e,
|
|
45
|
+
datasetId: e.datasetId || t.datasetId,
|
|
46
|
+
label: e.label || t.label,
|
|
47
|
+
connectionId: e.connectionId || t.connectionId
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function q(e) {
|
|
51
|
+
const t = [];
|
|
52
|
+
for (const n of e) {
|
|
53
|
+
const r = t.findIndex(
|
|
54
|
+
(i) => ae(i, n)
|
|
55
|
+
);
|
|
56
|
+
r === -1 ? t.push(n) : t[r] = _e(
|
|
57
|
+
t[r],
|
|
58
|
+
n
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
return t;
|
|
62
|
+
}
|
|
63
|
+
function wt(e) {
|
|
64
|
+
return q(e)[0];
|
|
65
|
+
}
|
|
66
|
+
function z(e, t) {
|
|
67
|
+
return e.kind !== "semantic" || e.connectionId || (t == null ? void 0 : t.kind) !== "semantic" || !O(e, t) || !t.connectionId ? e : { ...e, connectionId: t.connectionId };
|
|
68
|
+
}
|
|
69
|
+
function L(e) {
|
|
70
|
+
return N(e) ? e : void 0;
|
|
71
|
+
}
|
|
72
|
+
function te(e, t) {
|
|
73
|
+
if (!(e.kind !== "semantic" || e.connectionId))
|
|
74
|
+
return t.find(
|
|
75
|
+
(n) => (n == null ? void 0 : n.kind) === "semantic" && O(e, n) && !!n.connectionId
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
function v(e, t) {
|
|
79
|
+
const n = L(e == null ? void 0 : e.source);
|
|
80
|
+
return n ? z(n, t) : void 0;
|
|
81
|
+
}
|
|
82
|
+
function we({
|
|
83
|
+
explicitSource: e,
|
|
84
|
+
field: t,
|
|
85
|
+
defaultSource: n,
|
|
86
|
+
fallbackSources: r
|
|
87
|
+
}) {
|
|
88
|
+
const i = [n, ...r || []], a = L(e), s = a ? z(
|
|
89
|
+
a,
|
|
90
|
+
te(a, i)
|
|
91
|
+
) : void 0;
|
|
92
|
+
if (s)
|
|
93
|
+
return s;
|
|
94
|
+
if (e !== void 0)
|
|
95
|
+
return;
|
|
96
|
+
const d = v(t, n), o = d ? z(
|
|
97
|
+
d,
|
|
98
|
+
te(d, i)
|
|
99
|
+
) : void 0;
|
|
100
|
+
if (o)
|
|
101
|
+
return o;
|
|
102
|
+
if ((t == null ? void 0 : t.source) === void 0)
|
|
103
|
+
return L(n);
|
|
104
|
+
}
|
|
105
|
+
function ve(e, t) {
|
|
106
|
+
if (!(e != null && e.name) || !(t != null && t.name) || e.name !== t.name)
|
|
107
|
+
return !1;
|
|
108
|
+
const n = v(e), r = v(t);
|
|
109
|
+
return !n || !r ? !0 : ae(n, r);
|
|
110
|
+
}
|
|
111
|
+
function A(e) {
|
|
112
|
+
var t;
|
|
113
|
+
return k((t = _(e)) == null ? void 0 : t.kind);
|
|
114
|
+
}
|
|
115
|
+
function ie(e) {
|
|
116
|
+
var t, n;
|
|
117
|
+
return A(e) !== "semantic" ? null : ((n = k((t = _(e)) == null ? void 0 : t.domainId)) == null ? void 0 : n.trim()) || null;
|
|
118
|
+
}
|
|
119
|
+
function ke(e) {
|
|
120
|
+
var t;
|
|
121
|
+
return A(e) !== "semantic" ? null : k((t = _(e)) == null ? void 0 : t.datasetName);
|
|
122
|
+
}
|
|
123
|
+
function Se(e) {
|
|
124
|
+
var t;
|
|
125
|
+
return A(e) !== "semantic" ? null : k((t = _(e)) == null ? void 0 : t.datasetId);
|
|
126
|
+
}
|
|
127
|
+
function Ae(e) {
|
|
128
|
+
var t;
|
|
129
|
+
return A(e) !== "physical" ? null : k((t = _(e)) == null ? void 0 : t.connectionId);
|
|
130
|
+
}
|
|
131
|
+
function Ce(e) {
|
|
132
|
+
var t;
|
|
133
|
+
return A(e) !== "physical" ? null : k((t = _(e)) == null ? void 0 : t.tableName);
|
|
134
|
+
}
|
|
135
|
+
function xe(e) {
|
|
136
|
+
var t;
|
|
137
|
+
return A(e) !== "physical" ? "" : k((t = _(e)) == null ? void 0 : t.databaseName) || "";
|
|
138
|
+
}
|
|
139
|
+
function De(e) {
|
|
140
|
+
var t;
|
|
141
|
+
return A(e) !== "physical" ? "" : k((t = _(e)) == null ? void 0 : t.schemaName) || "";
|
|
142
|
+
}
|
|
143
|
+
function Fe(e) {
|
|
144
|
+
if (e.analyticsIntent && typeof e.analyticsIntent == "object" && "source" in e.analyticsIntent)
|
|
145
|
+
return e.analyticsIntent.source;
|
|
146
|
+
}
|
|
147
|
+
function Ne({
|
|
148
|
+
datasets: e,
|
|
149
|
+
requireAtLeastOne: t
|
|
150
|
+
}) {
|
|
151
|
+
if (t && e.length < 1)
|
|
152
|
+
return { ok: !1, issue: "invalid_dataset_count" };
|
|
153
|
+
if (e.length <= 1)
|
|
154
|
+
return { ok: !0 };
|
|
155
|
+
const n = e.map(ie), r = new Set(n.filter(Boolean));
|
|
156
|
+
return n.some((i) => !i) || r.size !== 1 ? { ok: !1, issue: "invalid_multi_dataset_scope" } : { ok: !0 };
|
|
157
|
+
}
|
|
158
|
+
function W(e, t) {
|
|
159
|
+
if (!t)
|
|
160
|
+
return !1;
|
|
161
|
+
if (t.kind === "semantic") {
|
|
162
|
+
const n = Se(e);
|
|
163
|
+
return ie(e) === t.domainId ? n && t.datasetId ? n === t.datasetId : ke(e) === t.datasetName : !1;
|
|
164
|
+
}
|
|
165
|
+
return t.kind === "physical" ? Ae(e) === t.connectionId && Ce(e) === t.tableName && xe(e) === (t.databaseName || "") && De(e) === (t.schemaName || "") : !1;
|
|
166
|
+
}
|
|
167
|
+
function vt(e, t) {
|
|
168
|
+
return e.find(
|
|
169
|
+
(n) => W(n, t)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
function u(e, t, n) {
|
|
173
|
+
return n ? { code: e, message: t, cardId: n } : { code: e, message: t };
|
|
11
174
|
}
|
|
12
175
|
function $(e) {
|
|
13
176
|
const t = /* @__PURE__ */ new Set();
|
|
14
|
-
for (const
|
|
15
|
-
if (t.has(
|
|
16
|
-
return
|
|
17
|
-
t.add(
|
|
177
|
+
for (const n of e) {
|
|
178
|
+
if (t.has(n))
|
|
179
|
+
return n;
|
|
180
|
+
t.add(n);
|
|
18
181
|
}
|
|
19
182
|
return null;
|
|
20
183
|
}
|
|
21
|
-
function
|
|
22
|
-
|
|
184
|
+
function se({
|
|
185
|
+
card: e,
|
|
186
|
+
datasets: t,
|
|
187
|
+
errors: n
|
|
188
|
+
}) {
|
|
189
|
+
if (e.type === "text")
|
|
190
|
+
return;
|
|
191
|
+
const r = Fe(e);
|
|
192
|
+
if (!r) {
|
|
193
|
+
if (t.length <= 1)
|
|
194
|
+
return;
|
|
195
|
+
n.push(
|
|
196
|
+
u(
|
|
197
|
+
"missing_card_analytics_source",
|
|
198
|
+
"Multi-dataset dashboard cards must include analytics intent with a source so the materializer can choose the correct dataset.",
|
|
199
|
+
e.id
|
|
200
|
+
)
|
|
201
|
+
);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
t.some((i) => W(i, r)) || n.push(
|
|
205
|
+
u(
|
|
206
|
+
"invalid_card_analytics_source",
|
|
207
|
+
"Dashboard cards with an explicit analytics source must use one of the selected datasets.",
|
|
208
|
+
e.id
|
|
209
|
+
)
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
function Te(e) {
|
|
213
|
+
var t;
|
|
214
|
+
return e ? [
|
|
215
|
+
(t = e.dateFieldRef) == null ? void 0 : t.source,
|
|
216
|
+
...Array.isArray(e.dimensionRefs) ? e.dimensionRefs.map((n) => n.source) : []
|
|
217
|
+
].filter(
|
|
218
|
+
(n) => !!n
|
|
219
|
+
) : [];
|
|
220
|
+
}
|
|
221
|
+
function oe({
|
|
222
|
+
card: e,
|
|
223
|
+
datasets: t,
|
|
224
|
+
errors: n
|
|
225
|
+
}) {
|
|
226
|
+
if (e.type !== "text") {
|
|
227
|
+
for (const r of Te(e.query))
|
|
228
|
+
if (r && !t.some(
|
|
229
|
+
(i) => W(i, r)
|
|
230
|
+
)) {
|
|
231
|
+
n.push(
|
|
232
|
+
u(
|
|
233
|
+
"invalid_card_query_source",
|
|
234
|
+
"Dashboard card query field references must use one of the selected datasets.",
|
|
235
|
+
e.id
|
|
236
|
+
)
|
|
237
|
+
);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function $e(e, t) {
|
|
243
|
+
return e.length === t.length && e.every((n, r) => n === t[r]);
|
|
244
|
+
}
|
|
245
|
+
function de({
|
|
246
|
+
card: e,
|
|
247
|
+
errors: t
|
|
248
|
+
}) {
|
|
249
|
+
if (e.type === "text" || !e.query)
|
|
250
|
+
return;
|
|
251
|
+
const { dateField: n, dateFieldRef: r, dimensions: i, dimensionRefs: a } = e.query;
|
|
252
|
+
if (r && r.name !== n) {
|
|
253
|
+
t.push(
|
|
254
|
+
u(
|
|
255
|
+
"invalid_card_query_ref",
|
|
256
|
+
"Dashboard card source-aware date field reference must match the query date field.",
|
|
257
|
+
e.id
|
|
258
|
+
)
|
|
259
|
+
);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (!Array.isArray(a))
|
|
263
|
+
return;
|
|
264
|
+
const s = Array.isArray(i) ? i : [], d = a.map((o) => o.name);
|
|
265
|
+
$e(d, s) || t.push(
|
|
266
|
+
u(
|
|
267
|
+
"invalid_card_query_ref",
|
|
268
|
+
"Dashboard card source-aware dimension references must match the query dimensions.",
|
|
269
|
+
e.id
|
|
270
|
+
)
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
function ce({
|
|
274
|
+
datasets: e,
|
|
275
|
+
errors: t,
|
|
276
|
+
requireAtLeastOne: n
|
|
277
|
+
}) {
|
|
278
|
+
const r = Ne({
|
|
279
|
+
datasets: e,
|
|
280
|
+
requireAtLeastOne: n
|
|
281
|
+
});
|
|
282
|
+
if (!r.ok) {
|
|
283
|
+
if (r.issue === "invalid_dataset_count") {
|
|
284
|
+
t.push(
|
|
285
|
+
u(
|
|
286
|
+
"invalid_dataset_count",
|
|
287
|
+
"Dashboard authoring requires at least one selected dataset."
|
|
288
|
+
)
|
|
289
|
+
);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
t.push(
|
|
293
|
+
u(
|
|
294
|
+
"invalid_multi_dataset_scope",
|
|
295
|
+
"Multi-dataset dashboard authoring is limited to semantic datasets from one domain."
|
|
296
|
+
)
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function Me(e) {
|
|
301
|
+
var m, w;
|
|
23
302
|
const t = [];
|
|
24
303
|
if (!e || typeof e != "object")
|
|
25
304
|
return {
|
|
26
305
|
ok: !1,
|
|
27
306
|
errors: [
|
|
28
|
-
|
|
307
|
+
u(
|
|
29
308
|
"invalid_plan",
|
|
30
309
|
"Dashboard plan must be a structured object."
|
|
31
310
|
)
|
|
32
311
|
],
|
|
33
312
|
warnings: []
|
|
34
313
|
};
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const i = Array.isArray(
|
|
38
|
-
i.length !== 1 && t.push(
|
|
39
|
-
|
|
40
|
-
"invalid_dataset_count",
|
|
41
|
-
"MVP dashboard authoring requires exactly one selected dataset."
|
|
42
|
-
)
|
|
43
|
-
), r.length !== 1 && t.push(
|
|
44
|
-
f(
|
|
314
|
+
const n = e, r = [...n.warnings || []];
|
|
315
|
+
n.version !== 1 && t.push(u("invalid_version", "Dashboard plan version must be 1.")), (m = n.title) != null && m.trim() || t.push(u("missing_title", "Dashboard plan needs a title."));
|
|
316
|
+
const i = Array.isArray(n.datasets) ? n.datasets : [], a = Array.isArray(n.sheets) ? n.sheets : [];
|
|
317
|
+
ce({ datasets: i, errors: t, requireAtLeastOne: !0 }), a.length !== 1 && t.push(
|
|
318
|
+
u(
|
|
45
319
|
"invalid_sheet_count",
|
|
46
320
|
"MVP dashboard authoring creates exactly one dashboard sheet."
|
|
47
321
|
)
|
|
48
322
|
);
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
323
|
+
const s = a[0];
|
|
324
|
+
s && s.kind !== "dashboard" && t.push(
|
|
325
|
+
u("invalid_sheet_kind", 'Generated sheet must use kind "dashboard".')
|
|
52
326
|
);
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
327
|
+
const d = (s == null ? void 0 : s.cards) || [];
|
|
328
|
+
d.length > M && t.push(
|
|
329
|
+
u(
|
|
56
330
|
"too_many_cards",
|
|
57
|
-
`Generated dashboards can contain at most ${
|
|
331
|
+
`Generated dashboards can contain at most ${M} cards.`
|
|
58
332
|
)
|
|
59
333
|
);
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
334
|
+
const o = $(d.map((l) => l.id));
|
|
335
|
+
o && t.push(
|
|
336
|
+
u("duplicate_card_id", `Duplicate generated card id: ${o}.`)
|
|
63
337
|
);
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
338
|
+
const f = $(d.map((l) => l.frameId));
|
|
339
|
+
f && t.push(
|
|
340
|
+
u(
|
|
67
341
|
"duplicate_frame_id",
|
|
68
|
-
`Duplicate generated frame id: ${
|
|
342
|
+
`Duplicate generated frame id: ${f}.`
|
|
69
343
|
)
|
|
70
344
|
);
|
|
71
|
-
for (const
|
|
72
|
-
(
|
|
73
|
-
|
|
345
|
+
for (const l of d)
|
|
346
|
+
(w = l.title) != null && w.trim() || t.push(u("missing_card_title", "Card title is required.", l.id)), l.type === "custom" && t.push(
|
|
347
|
+
u(
|
|
74
348
|
"custom_visual_out_of_scope",
|
|
75
349
|
"Whole-dashboard authoring supports built-in visual types only.",
|
|
76
|
-
|
|
350
|
+
l.id
|
|
77
351
|
)
|
|
78
|
-
),
|
|
79
|
-
|
|
352
|
+
), l.type !== "text" && !l.query && r.push(
|
|
353
|
+
u(
|
|
80
354
|
"missing_query_intent",
|
|
81
355
|
"Non-text card has no query intent and may be skipped by the app layer.",
|
|
82
|
-
|
|
356
|
+
l.id
|
|
83
357
|
)
|
|
84
|
-
);
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
358
|
+
), se({ card: l, datasets: i, errors: t }), de({ card: l, errors: t }), oe({ card: l, datasets: i, errors: t });
|
|
359
|
+
const p = Array.isArray(n.filterInputs) ? n.filterInputs : [], I = p.map((l) => l.id), y = $(I);
|
|
360
|
+
y && t.push(
|
|
361
|
+
u(
|
|
88
362
|
"duplicate_input_id",
|
|
89
|
-
`Duplicate dashboard input id: ${
|
|
363
|
+
`Duplicate dashboard input id: ${y}.`
|
|
90
364
|
)
|
|
91
365
|
);
|
|
92
|
-
const
|
|
366
|
+
const c = p.map((l) => l.variableName).filter(Boolean) || [], b = $(c);
|
|
93
367
|
b && t.push(
|
|
94
|
-
|
|
368
|
+
u(
|
|
95
369
|
"duplicate_input_variable",
|
|
96
370
|
`Duplicate dashboard input variable name: ${b}.`
|
|
97
371
|
)
|
|
98
372
|
);
|
|
99
|
-
const
|
|
100
|
-
for (const
|
|
101
|
-
|
|
102
|
-
|
|
373
|
+
const S = Array.isArray(n.calculatedFields) ? n.calculatedFields : [];
|
|
374
|
+
for (const l of S)
|
|
375
|
+
l.scope === "domain" && l.reuseOnly !== !0 && t.push(
|
|
376
|
+
u(
|
|
103
377
|
"domain_calculated_field_create_out_of_scope",
|
|
104
|
-
`Creating domain calculated field "${
|
|
378
|
+
`Creating domain calculated field "${l.name}" is outside MVP.`
|
|
105
379
|
)
|
|
106
380
|
);
|
|
107
|
-
return { ok: t.length === 0, errors: t, warnings:
|
|
381
|
+
return { ok: t.length === 0, errors: t, warnings: r };
|
|
108
382
|
}
|
|
109
|
-
function
|
|
110
|
-
var
|
|
383
|
+
function qe(e) {
|
|
384
|
+
var s;
|
|
111
385
|
const t = [];
|
|
112
386
|
if (!e || typeof e != "object")
|
|
113
387
|
return {
|
|
114
388
|
ok: !1,
|
|
115
389
|
errors: [
|
|
116
|
-
|
|
390
|
+
u(
|
|
117
391
|
"invalid_change_plan",
|
|
118
392
|
"Dashboard change plan must be a structured object."
|
|
119
393
|
)
|
|
120
394
|
],
|
|
121
395
|
warnings: []
|
|
122
396
|
};
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
), (
|
|
127
|
-
|
|
128
|
-
);
|
|
129
|
-
const i = Array.isArray(a.datasets) ? a.datasets : [], r = Array.isArray(a.operations) ? a.operations : [];
|
|
130
|
-
i.length > 1 && t.push(
|
|
131
|
-
f(
|
|
132
|
-
"invalid_dataset_count",
|
|
133
|
-
"MVP dashboard refinement can ground new AI operations in at most one selected dataset."
|
|
134
|
-
)
|
|
397
|
+
const n = e, r = [...n.warnings || []];
|
|
398
|
+
n.version !== 1 && t.push(
|
|
399
|
+
u("invalid_version", "Dashboard change plan version must be 1.")
|
|
400
|
+
), (s = n.dashboardId) != null && s.trim() || t.push(
|
|
401
|
+
u("missing_dashboard_id", "Dashboard change plan needs a dashboard id.")
|
|
135
402
|
);
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
403
|
+
const i = Array.isArray(n.datasets) ? n.datasets : [], a = Array.isArray(n.operations) ? n.operations : [];
|
|
404
|
+
ce({ datasets: i, errors: t, requireAtLeastOne: !1 });
|
|
405
|
+
for (const d of a) {
|
|
406
|
+
if (d.kind === "unsupported") {
|
|
407
|
+
r.push(
|
|
408
|
+
u("unsupported_operation", d.reason || d.requestedAction)
|
|
140
409
|
);
|
|
141
410
|
continue;
|
|
142
411
|
}
|
|
143
|
-
|
|
144
|
-
|
|
412
|
+
d.kind === "addCard" && d.card.type === "custom" && t.push(
|
|
413
|
+
u(
|
|
145
414
|
"custom_visual_out_of_scope",
|
|
146
415
|
"Whole-dashboard authoring supports built-in visual types only.",
|
|
147
|
-
|
|
416
|
+
d.card.id
|
|
148
417
|
)
|
|
149
|
-
),
|
|
150
|
-
|
|
418
|
+
), d.kind === "addCard" && (se({
|
|
419
|
+
card: d.card,
|
|
420
|
+
datasets: i,
|
|
421
|
+
errors: t
|
|
422
|
+
}), de({
|
|
423
|
+
card: d.card,
|
|
424
|
+
errors: t
|
|
425
|
+
}), oe({
|
|
426
|
+
card: d.card,
|
|
427
|
+
datasets: i,
|
|
428
|
+
errors: t
|
|
429
|
+
})), d.kind === "addCalculatedField" && d.field.scope === "domain" && d.field.reuseOnly !== !0 && t.push(
|
|
430
|
+
u(
|
|
151
431
|
"domain_calculated_field_create_out_of_scope",
|
|
152
|
-
`Creating domain calculated field "${
|
|
432
|
+
`Creating domain calculated field "${d.field.name}" is outside MVP.`
|
|
153
433
|
)
|
|
154
434
|
);
|
|
155
435
|
}
|
|
156
|
-
return { ok: t.length === 0, errors: t, warnings:
|
|
436
|
+
return { ok: t.length === 0, errors: t, warnings: r };
|
|
157
437
|
}
|
|
158
|
-
const
|
|
438
|
+
const Re = {
|
|
159
439
|
lg: 48,
|
|
160
440
|
md: 36,
|
|
161
441
|
sm: 24,
|
|
162
442
|
xs: 12,
|
|
163
443
|
xxs: 6
|
|
164
444
|
};
|
|
165
|
-
function
|
|
166
|
-
let
|
|
167
|
-
return e.map((
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
const
|
|
171
|
-
i:
|
|
172
|
-
x:
|
|
173
|
-
y:
|
|
174
|
-
w:
|
|
175
|
-
h:
|
|
176
|
-
minW: Math.min(
|
|
177
|
-
minH:
|
|
445
|
+
function Pe(e, t) {
|
|
446
|
+
let n = 0, r = 0, i = 0;
|
|
447
|
+
return e.map((a) => {
|
|
448
|
+
const s = Math.min(a.w, t);
|
|
449
|
+
n > 0 && n + s > t && (n = 0, r += i, i = 0);
|
|
450
|
+
const d = {
|
|
451
|
+
i: a.frameId,
|
|
452
|
+
x: n,
|
|
453
|
+
y: r,
|
|
454
|
+
w: s,
|
|
455
|
+
h: a.h,
|
|
456
|
+
minW: Math.min(a.minW, t),
|
|
457
|
+
minH: a.minH,
|
|
178
458
|
static: !1
|
|
179
459
|
};
|
|
180
|
-
return
|
|
460
|
+
return n += s, i = Math.max(i, a.h), d;
|
|
181
461
|
});
|
|
182
462
|
}
|
|
183
|
-
function
|
|
184
|
-
const t = [...e].sort((
|
|
185
|
-
return { kpis:
|
|
463
|
+
function Be(e) {
|
|
464
|
+
const t = [...e].sort((o, f) => o.priority - f.priority), n = t.filter((o) => o.role === "kpi"), r = t.filter((o) => o.role === "chart"), i = t.filter((o) => o.role === "table"), a = t.filter((o) => o.role === "text"), s = a.slice(0, 1), d = a.slice(s.length);
|
|
465
|
+
return { kpis: n, introText: s, charts: r, tables: i, supportingText: d };
|
|
186
466
|
}
|
|
187
|
-
function
|
|
188
|
-
return t === "xxs" || t === "xs" ?
|
|
467
|
+
function Ve(e, t, n) {
|
|
468
|
+
return t === "xxs" || t === "xs" ? n : t === "sm" ? Math.min(12, n) : t === "md" ? e <= 1 || e === 2 ? 18 : 12 : e <= 1 || e === 2 ? 24 : e === 3 ? 16 : 12;
|
|
189
469
|
}
|
|
190
|
-
function
|
|
191
|
-
return
|
|
470
|
+
function ze(e, t, n, r) {
|
|
471
|
+
return n === "xxs" || n === "xs" || n === "sm" || n === "md" || t === 1 || t % 2 === 1 && e === 0 ? r : r / 2;
|
|
192
472
|
}
|
|
193
|
-
function
|
|
194
|
-
const { item: t, band:
|
|
195
|
-
return
|
|
473
|
+
function Le(e) {
|
|
474
|
+
const { item: t, band: n, index: r, bandCount: i, breakpoint: a, columns: s } = e;
|
|
475
|
+
return n === "kpi" ? {
|
|
196
476
|
...t,
|
|
197
|
-
band:
|
|
198
|
-
w:
|
|
477
|
+
band: n,
|
|
478
|
+
w: Ve(i, a, s),
|
|
199
479
|
h: 15,
|
|
200
|
-
minW: Math.min(6,
|
|
480
|
+
minW: Math.min(6, s),
|
|
201
481
|
minH: 12
|
|
202
|
-
} :
|
|
482
|
+
} : n === "table" ? {
|
|
203
483
|
...t,
|
|
204
|
-
band:
|
|
205
|
-
w:
|
|
206
|
-
h:
|
|
207
|
-
minW: Math.min(12,
|
|
484
|
+
band: n,
|
|
485
|
+
w: s,
|
|
486
|
+
h: a === "xxs" || a === "xs" ? 34 : 38,
|
|
487
|
+
minW: Math.min(12, s),
|
|
208
488
|
minH: 18
|
|
209
|
-
} :
|
|
489
|
+
} : n === "introText" ? {
|
|
210
490
|
...t,
|
|
211
|
-
band:
|
|
212
|
-
w:
|
|
213
|
-
h:
|
|
214
|
-
minW: Math.min(12,
|
|
491
|
+
band: n,
|
|
492
|
+
w: s,
|
|
493
|
+
h: a === "xxs" || a === "xs" ? 12 : 10,
|
|
494
|
+
minW: Math.min(12, s),
|
|
215
495
|
minH: 8
|
|
216
|
-
} :
|
|
496
|
+
} : n === "supportingText" ? {
|
|
217
497
|
...t,
|
|
218
|
-
band:
|
|
219
|
-
w:
|
|
220
|
-
h:
|
|
221
|
-
minW: Math.min(12,
|
|
498
|
+
band: n,
|
|
499
|
+
w: a === "lg" ? s / 2 : s,
|
|
500
|
+
h: a === "xxs" || a === "xs" ? 12 : 10,
|
|
501
|
+
minW: Math.min(12, s),
|
|
222
502
|
minH: 8
|
|
223
503
|
} : {
|
|
224
504
|
...t,
|
|
225
|
-
band:
|
|
226
|
-
w:
|
|
227
|
-
h:
|
|
228
|
-
minW: Math.min(12,
|
|
505
|
+
band: n,
|
|
506
|
+
w: ze(r, i, a, s),
|
|
507
|
+
h: a === "xxs" || a === "xs" ? 28 : 30,
|
|
508
|
+
minW: Math.min(12, s),
|
|
229
509
|
minH: 16
|
|
230
510
|
};
|
|
231
511
|
}
|
|
232
|
-
function
|
|
512
|
+
function D(e, t, n, r) {
|
|
233
513
|
return e.map(
|
|
234
|
-
(i,
|
|
514
|
+
(i, a) => Le({
|
|
235
515
|
item: i,
|
|
236
516
|
band: t,
|
|
237
|
-
index:
|
|
517
|
+
index: a,
|
|
238
518
|
bandCount: e.length,
|
|
239
|
-
breakpoint:
|
|
240
|
-
columns:
|
|
519
|
+
breakpoint: n,
|
|
520
|
+
columns: r
|
|
241
521
|
})
|
|
242
522
|
);
|
|
243
523
|
}
|
|
244
|
-
function
|
|
245
|
-
const t =
|
|
524
|
+
function E(e) {
|
|
525
|
+
const t = Be(e);
|
|
246
526
|
return Object.fromEntries(
|
|
247
|
-
|
|
248
|
-
const
|
|
249
|
-
...
|
|
250
|
-
...
|
|
251
|
-
...
|
|
252
|
-
...
|
|
253
|
-
...
|
|
527
|
+
ge.map((n) => {
|
|
528
|
+
const r = Re[n], i = [
|
|
529
|
+
...D(t.introText, "introText", n, r),
|
|
530
|
+
...D(t.kpis, "kpi", n, r),
|
|
531
|
+
...D(t.charts, "chart", n, r),
|
|
532
|
+
...D(t.tables, "table", n, r),
|
|
533
|
+
...D(t.supportingText, "supportingText", n, r)
|
|
254
534
|
];
|
|
255
|
-
return [
|
|
535
|
+
return [n, Pe(i, r)];
|
|
256
536
|
})
|
|
257
537
|
);
|
|
258
538
|
}
|
|
259
|
-
function
|
|
539
|
+
function je(e) {
|
|
260
540
|
const t = String(e || "").trim().toLowerCase();
|
|
261
541
|
return t.includes("date") || t.includes("time") || t.includes("timestamp") ? "date" : t.includes("int") || t.includes("float") || t.includes("double") || t.includes("decimal") || t.includes("numeric") || t.includes("number") || t.includes("currency") || t.includes("percent") ? "number" : t.includes("bool") ? "boolean" : "string";
|
|
262
542
|
}
|
|
263
|
-
function
|
|
543
|
+
function Oe(e) {
|
|
264
544
|
return !!(e && typeof e == "object" && !Array.isArray(e));
|
|
265
545
|
}
|
|
266
|
-
function
|
|
267
|
-
return
|
|
546
|
+
function We(e) {
|
|
547
|
+
return Oe(e) && typeof e.filterId == "string" && typeof e.operation == "string" && Array.isArray(e.values);
|
|
268
548
|
}
|
|
269
|
-
function
|
|
549
|
+
function Ee(e) {
|
|
270
550
|
return e.filter(
|
|
271
551
|
(t) => typeof t == "string" || typeof t == "number"
|
|
272
552
|
);
|
|
273
553
|
}
|
|
274
|
-
function
|
|
554
|
+
function He(e) {
|
|
275
555
|
return e.filter(
|
|
276
556
|
(t) => t instanceof Date || typeof t == "string"
|
|
277
557
|
);
|
|
278
558
|
}
|
|
279
|
-
function
|
|
559
|
+
function H(e, t) {
|
|
280
560
|
if (t === void 0)
|
|
281
561
|
return;
|
|
282
|
-
const
|
|
283
|
-
if (
|
|
562
|
+
const n = je(e.dataType), r = e.operation || "in";
|
|
563
|
+
if (We(t))
|
|
284
564
|
return {
|
|
285
565
|
...t,
|
|
286
566
|
filterId: e.id,
|
|
287
567
|
name: t.name || e.column,
|
|
288
|
-
valueType:
|
|
568
|
+
valueType: n,
|
|
289
569
|
dataType: e.dataType,
|
|
290
570
|
fieldMeta: e.fieldMeta,
|
|
291
571
|
semanticContext: e.semanticContext
|
|
292
572
|
};
|
|
293
|
-
if (
|
|
573
|
+
if (r === "is null" || r === "is not null")
|
|
294
574
|
return {
|
|
295
575
|
filterId: e.id,
|
|
296
576
|
name: e.column,
|
|
297
|
-
operation:
|
|
298
|
-
valueType:
|
|
577
|
+
operation: r,
|
|
578
|
+
valueType: n,
|
|
299
579
|
values: [],
|
|
300
580
|
dataType: e.dataType,
|
|
301
581
|
fieldMeta: e.fieldMeta,
|
|
302
582
|
semanticContext: e.semanticContext
|
|
303
583
|
};
|
|
304
|
-
const i = Array.isArray(t) ? t : [t],
|
|
305
|
-
if (
|
|
584
|
+
const i = Array.isArray(t) ? t : [t], a = n === "date" ? He(i) : Ee(i);
|
|
585
|
+
if (a.length !== 0 && !((r === "between" || r === "not between") && a.length < 2))
|
|
306
586
|
return {
|
|
307
587
|
filterId: e.id,
|
|
308
588
|
name: e.column,
|
|
309
|
-
operation:
|
|
310
|
-
valueType:
|
|
311
|
-
values:
|
|
589
|
+
operation: r,
|
|
590
|
+
valueType: n,
|
|
591
|
+
values: a,
|
|
312
592
|
dataType: e.dataType,
|
|
313
593
|
fieldMeta: e.fieldMeta,
|
|
314
594
|
semanticContext: e.semanticContext
|
|
315
595
|
};
|
|
316
596
|
}
|
|
317
|
-
function
|
|
318
|
-
return
|
|
597
|
+
function Ge(e, t, n) {
|
|
598
|
+
return n ? { code: e, message: t, cardId: n } : { code: e, message: t };
|
|
319
599
|
}
|
|
320
|
-
function
|
|
321
|
-
const
|
|
322
|
-
(i) => i.scope === "card" && i.targetCardId ===
|
|
600
|
+
function Ue(e, t, n) {
|
|
601
|
+
const r = (t || []).filter(
|
|
602
|
+
(i) => i.scope === "card" && i.targetCardId === n
|
|
323
603
|
).map((i) => i.field).filter(Boolean);
|
|
324
|
-
return
|
|
604
|
+
return r.length === 0 ? e : {
|
|
325
605
|
...e,
|
|
326
606
|
calculatedFields: [
|
|
327
607
|
...e.calculatedFields || [],
|
|
328
|
-
...
|
|
608
|
+
...r
|
|
329
609
|
]
|
|
330
610
|
};
|
|
331
611
|
}
|
|
332
|
-
function
|
|
612
|
+
function Ke(e) {
|
|
333
613
|
const t = {};
|
|
334
614
|
return {
|
|
335
|
-
inputs: (e.filterInputs || []).map((
|
|
336
|
-
const
|
|
337
|
-
|
|
338
|
-
|
|
615
|
+
inputs: (e.filterInputs || []).map((r, i) => {
|
|
616
|
+
const a = H(
|
|
617
|
+
r.filter,
|
|
618
|
+
r.defaultValue
|
|
339
619
|
);
|
|
340
|
-
return
|
|
620
|
+
return a && (t.shared ?? (t.shared = {}), t.shared[r.id] = {
|
|
341
621
|
status: "set",
|
|
342
622
|
value: {
|
|
343
623
|
kind: "filter",
|
|
344
|
-
filterValue:
|
|
624
|
+
filterValue: a
|
|
345
625
|
}
|
|
346
626
|
}), {
|
|
347
|
-
id:
|
|
627
|
+
id: r.id,
|
|
348
628
|
kind: "filter",
|
|
349
|
-
label:
|
|
350
|
-
variableName:
|
|
351
|
-
scope:
|
|
629
|
+
label: r.label,
|
|
630
|
+
variableName: r.variableName,
|
|
631
|
+
scope: r.scope || { kind: "allSheets", sheetKinds: ["dashboard"] },
|
|
352
632
|
runtimeScope: "shared",
|
|
353
633
|
presentation: {
|
|
354
634
|
placement: "toolbar",
|
|
355
635
|
order: i
|
|
356
636
|
},
|
|
357
637
|
exports: ["label", "value", "start", "end", "range"],
|
|
358
|
-
filter:
|
|
638
|
+
filter: r.filter
|
|
359
639
|
};
|
|
360
640
|
}),
|
|
361
641
|
defaultInputValues: t.shared && Object.keys(t.shared).length > 0 ? t : void 0
|
|
362
642
|
};
|
|
363
643
|
}
|
|
364
|
-
function
|
|
365
|
-
var
|
|
366
|
-
const t =
|
|
644
|
+
function kt(e) {
|
|
645
|
+
var I, y;
|
|
646
|
+
const t = Me(e.plan);
|
|
367
647
|
if (!t.ok)
|
|
368
648
|
throw new Error(
|
|
369
|
-
t.errors.map((
|
|
649
|
+
t.errors.map((c) => c.message).join(`
|
|
370
650
|
`) || "Dashboard plan is invalid."
|
|
371
651
|
);
|
|
372
|
-
const
|
|
373
|
-
e.cardArtifacts.map((
|
|
374
|
-
),
|
|
375
|
-
for (const
|
|
376
|
-
const b =
|
|
652
|
+
const n = e.plan.sheets[0], r = [...t.warnings], i = [], a = new Map(
|
|
653
|
+
e.cardArtifacts.map((c) => [c.planCardId, c])
|
|
654
|
+
), s = [];
|
|
655
|
+
for (const c of n.cards) {
|
|
656
|
+
const b = a.get(c.id);
|
|
377
657
|
if (!b) {
|
|
378
|
-
const
|
|
658
|
+
const m = Ge(
|
|
379
659
|
"missing_card_artifact",
|
|
380
|
-
`Card "${
|
|
381
|
-
|
|
660
|
+
`Card "${c.title}" was skipped because no generated artifact was supplied.`,
|
|
661
|
+
c.id
|
|
382
662
|
);
|
|
383
|
-
i.push(
|
|
663
|
+
i.push(m);
|
|
384
664
|
continue;
|
|
385
665
|
}
|
|
386
|
-
|
|
387
|
-
const
|
|
666
|
+
r.push(...b.warnings || []);
|
|
667
|
+
const S = Ue(
|
|
388
668
|
b.card,
|
|
389
669
|
e.plan.calculatedFields,
|
|
390
|
-
|
|
670
|
+
c.id
|
|
391
671
|
);
|
|
392
|
-
|
|
393
|
-
id:
|
|
394
|
-
cards: [
|
|
395
|
-
activeCardId:
|
|
672
|
+
s.push({
|
|
673
|
+
id: c.frameId,
|
|
674
|
+
cards: [S],
|
|
675
|
+
activeCardId: S.id
|
|
396
676
|
});
|
|
397
677
|
}
|
|
398
|
-
if (
|
|
678
|
+
if (s.length === 0)
|
|
399
679
|
throw new Error("Dashboard plan did not produce any persistable cards.");
|
|
400
|
-
const { inputs:
|
|
401
|
-
|
|
402
|
-
frameId:
|
|
403
|
-
priority:
|
|
404
|
-
role:
|
|
680
|
+
const { inputs: d, defaultInputValues: o } = Ke(e.plan), f = E(
|
|
681
|
+
n.cards.filter((c) => s.some((b) => b.id === c.frameId)).map((c) => ({
|
|
682
|
+
frameId: c.frameId,
|
|
683
|
+
priority: c.priority,
|
|
684
|
+
role: c.role
|
|
405
685
|
}))
|
|
406
686
|
);
|
|
407
687
|
return { dashboard: {
|
|
@@ -410,291 +690,273 @@ function qe(e) {
|
|
|
410
690
|
description: e.plan.description || "",
|
|
411
691
|
sheets: [
|
|
412
692
|
{
|
|
413
|
-
id:
|
|
693
|
+
id: n.id,
|
|
414
694
|
kind: "dashboard",
|
|
415
|
-
title:
|
|
416
|
-
description:
|
|
417
|
-
frames:
|
|
418
|
-
layouts:
|
|
419
|
-
calculatedFields: (
|
|
695
|
+
title: n.title,
|
|
696
|
+
description: n.description,
|
|
697
|
+
frames: s,
|
|
698
|
+
layouts: f,
|
|
699
|
+
calculatedFields: (I = e.plan.calculatedFields) == null ? void 0 : I.filter((c) => c.scope === "sheet" && c.field).map((c) => c.field)
|
|
420
700
|
}
|
|
421
701
|
],
|
|
422
|
-
calculatedFields: (
|
|
423
|
-
inputs:
|
|
424
|
-
...
|
|
425
|
-
}, warnings:
|
|
702
|
+
calculatedFields: (y = e.plan.calculatedFields) == null ? void 0 : y.filter((c) => c.scope === "dashboard" && c.field).map((c) => c.field),
|
|
703
|
+
inputs: d,
|
|
704
|
+
...o ? { defaultInputValues: o } : {}
|
|
705
|
+
}, warnings: r, skippedOperations: i };
|
|
426
706
|
}
|
|
427
|
-
function
|
|
428
|
-
return
|
|
707
|
+
function C(e, t, n) {
|
|
708
|
+
return n ? { code: e, message: t, cardId: n } : { code: e, message: t };
|
|
429
709
|
}
|
|
430
|
-
function
|
|
710
|
+
function Qe(e) {
|
|
431
711
|
return JSON.parse(JSON.stringify(e));
|
|
432
712
|
}
|
|
433
|
-
function
|
|
713
|
+
function Je(e) {
|
|
434
714
|
var t;
|
|
435
715
|
return (t = e.sheets) == null ? void 0 : t.find(
|
|
436
|
-
(
|
|
716
|
+
(n) => (n.kind || "dashboard") === "dashboard"
|
|
437
717
|
);
|
|
438
718
|
}
|
|
439
|
-
function
|
|
440
|
-
var
|
|
441
|
-
for (const
|
|
442
|
-
for (const i of
|
|
443
|
-
const
|
|
444
|
-
if (
|
|
445
|
-
return { sheet:
|
|
719
|
+
function P(e, t) {
|
|
720
|
+
var n;
|
|
721
|
+
for (const r of e.sheets || [])
|
|
722
|
+
for (const i of r.frames || []) {
|
|
723
|
+
const a = (n = i.cards) == null ? void 0 : n.find((s) => s.id === t);
|
|
724
|
+
if (a)
|
|
725
|
+
return { sheet: r, frame: i, card: a };
|
|
446
726
|
}
|
|
447
727
|
return null;
|
|
448
728
|
}
|
|
449
|
-
function
|
|
450
|
-
var
|
|
451
|
-
const t = (
|
|
729
|
+
function le(e) {
|
|
730
|
+
var n, r;
|
|
731
|
+
const t = (r = (n = e.cards) == null ? void 0 : n[0]) == null ? void 0 : r.type;
|
|
452
732
|
return t === "kpi" ? "kpi" : t === "table" || t === "detailTable" || t === "pivotTable" ? "table" : t === "text" ? "text" : "chart";
|
|
453
733
|
}
|
|
454
|
-
function
|
|
734
|
+
function Xe(e) {
|
|
455
735
|
var t;
|
|
456
736
|
return new Map(
|
|
457
|
-
(((t = e.layouts) == null ? void 0 : t.lg) || []).map((
|
|
737
|
+
(((t = e.layouts) == null ? void 0 : t.lg) || []).map((n, r) => [n.i, r])
|
|
458
738
|
);
|
|
459
739
|
}
|
|
460
|
-
function
|
|
461
|
-
const
|
|
462
|
-
|
|
740
|
+
function ue(e, t = /* @__PURE__ */ new Map()) {
|
|
741
|
+
const n = Xe(e), r = Math.max(
|
|
742
|
+
n.size,
|
|
463
743
|
t.size
|
|
464
744
|
), i = (e.frames || []).map(
|
|
465
|
-
(
|
|
466
|
-
frameId:
|
|
467
|
-
role:
|
|
468
|
-
priority: t.get(
|
|
745
|
+
(a, s) => ({
|
|
746
|
+
frameId: a.id,
|
|
747
|
+
role: le(a),
|
|
748
|
+
priority: t.get(a.id) ?? n.get(a.id) ?? r + s
|
|
469
749
|
})
|
|
470
750
|
);
|
|
471
|
-
e.layouts =
|
|
751
|
+
e.layouts = E(i);
|
|
472
752
|
}
|
|
473
|
-
function
|
|
753
|
+
function Ye(e) {
|
|
474
754
|
return Object.values(e.layouts || {}).some((t) => t.length > 0);
|
|
475
755
|
}
|
|
476
|
-
function
|
|
477
|
-
if (!
|
|
478
|
-
|
|
756
|
+
function Ze(e, t) {
|
|
757
|
+
if (!Ye(e)) {
|
|
758
|
+
ue(e);
|
|
479
759
|
return;
|
|
480
760
|
}
|
|
481
|
-
const
|
|
482
|
-
{ frameId: t.id, role:
|
|
761
|
+
const n = E([
|
|
762
|
+
{ frameId: t.id, role: le(t), priority: 0 }
|
|
483
763
|
]);
|
|
484
764
|
e.layouts ?? (e.layouts = {});
|
|
485
|
-
for (const [
|
|
486
|
-
const
|
|
487
|
-
if (
|
|
765
|
+
for (const [r, i] of Object.entries(n)) {
|
|
766
|
+
const a = e.layouts[r] || [];
|
|
767
|
+
if (a.some((o) => o.i === t.id))
|
|
488
768
|
continue;
|
|
489
|
-
const
|
|
490
|
-
if (!
|
|
769
|
+
const s = i[0];
|
|
770
|
+
if (!s)
|
|
491
771
|
continue;
|
|
492
|
-
const
|
|
493
|
-
(
|
|
772
|
+
const d = a.reduce(
|
|
773
|
+
(o, f) => Math.max(o, f.y + f.h),
|
|
494
774
|
0
|
|
495
775
|
);
|
|
496
|
-
e.layouts[
|
|
497
|
-
...
|
|
498
|
-
{ ...
|
|
776
|
+
e.layouts[r] = [
|
|
777
|
+
...a,
|
|
778
|
+
{ ...s, y: d }
|
|
499
779
|
];
|
|
500
780
|
}
|
|
501
781
|
}
|
|
502
|
-
function
|
|
503
|
-
var
|
|
504
|
-
const
|
|
782
|
+
function et(e, t) {
|
|
783
|
+
var r;
|
|
784
|
+
const n = H(
|
|
505
785
|
t.filter,
|
|
506
786
|
t.defaultValue
|
|
507
787
|
);
|
|
508
|
-
|
|
788
|
+
n && (e.defaultInputValues ?? (e.defaultInputValues = {}), (r = e.defaultInputValues).shared ?? (r.shared = {}), e.defaultInputValues.shared[t.id] = {
|
|
509
789
|
status: "set",
|
|
510
790
|
value: {
|
|
511
791
|
kind: "filter",
|
|
512
|
-
filterValue:
|
|
792
|
+
filterValue: n
|
|
513
793
|
}
|
|
514
794
|
});
|
|
515
795
|
}
|
|
516
|
-
function
|
|
517
|
-
var
|
|
518
|
-
const t =
|
|
796
|
+
function St(e) {
|
|
797
|
+
var d;
|
|
798
|
+
const t = qe(e.changePlan);
|
|
519
799
|
if (!t.ok)
|
|
520
800
|
throw new Error(
|
|
521
|
-
t.errors.map((
|
|
801
|
+
t.errors.map((o) => o.message).join(`
|
|
522
802
|
`) || "Dashboard change plan is invalid."
|
|
523
803
|
);
|
|
524
|
-
const
|
|
525
|
-
e.cardArtifacts.map((
|
|
526
|
-
),
|
|
527
|
-
if (!
|
|
804
|
+
const n = Qe(e.dashboard), r = [...t.warnings], i = [], a = new Map(
|
|
805
|
+
e.cardArtifacts.map((o) => [o.planCardId, o])
|
|
806
|
+
), s = Je(n);
|
|
807
|
+
if (!s)
|
|
528
808
|
throw new Error("Dashboard has no editable dashboard sheet.");
|
|
529
|
-
|
|
530
|
-
for (const
|
|
531
|
-
switch (
|
|
809
|
+
s.frames ?? (s.frames = []);
|
|
810
|
+
for (const o of e.changePlan.operations)
|
|
811
|
+
switch (o.kind) {
|
|
532
812
|
case "addCard": {
|
|
533
|
-
if ((
|
|
534
|
-
(
|
|
813
|
+
if ((s.frames || []).reduce(
|
|
814
|
+
(y, c) => {
|
|
535
815
|
var b;
|
|
536
|
-
return
|
|
816
|
+
return y + (((b = c.cards) == null ? void 0 : b.length) || 0);
|
|
537
817
|
},
|
|
538
818
|
0
|
|
539
|
-
) >=
|
|
819
|
+
) >= M) {
|
|
540
820
|
i.push(
|
|
541
|
-
|
|
821
|
+
C(
|
|
542
822
|
"generated_card_limit_reached",
|
|
543
|
-
`MVP AI refinement is capped at ${
|
|
544
|
-
|
|
823
|
+
`MVP AI refinement is capped at ${M} cards.`,
|
|
824
|
+
o.card.id
|
|
545
825
|
)
|
|
546
826
|
);
|
|
547
827
|
break;
|
|
548
828
|
}
|
|
549
|
-
const
|
|
550
|
-
if (!
|
|
829
|
+
const p = a.get(o.card.id);
|
|
830
|
+
if (!p) {
|
|
551
831
|
i.push(
|
|
552
|
-
|
|
832
|
+
C(
|
|
553
833
|
"missing_card_artifact",
|
|
554
|
-
`Card "${
|
|
555
|
-
|
|
834
|
+
`Card "${o.card.title}" was skipped because no generated artifact was supplied.`,
|
|
835
|
+
o.card.id
|
|
556
836
|
)
|
|
557
837
|
);
|
|
558
838
|
break;
|
|
559
839
|
}
|
|
560
|
-
const
|
|
561
|
-
id:
|
|
562
|
-
cards: [
|
|
563
|
-
activeCardId:
|
|
840
|
+
const I = {
|
|
841
|
+
id: o.card.frameId,
|
|
842
|
+
cards: [p.card],
|
|
843
|
+
activeCardId: p.card.id
|
|
564
844
|
};
|
|
565
|
-
|
|
845
|
+
s.frames.push(I), Ze(s, I);
|
|
566
846
|
break;
|
|
567
847
|
}
|
|
568
848
|
case "addFilterInput": {
|
|
569
|
-
|
|
570
|
-
const
|
|
571
|
-
id:
|
|
849
|
+
n.inputs ?? (n.inputs = []);
|
|
850
|
+
const f = {
|
|
851
|
+
id: o.input.id,
|
|
572
852
|
kind: "filter",
|
|
573
|
-
label:
|
|
574
|
-
variableName:
|
|
575
|
-
scope:
|
|
853
|
+
label: o.input.label,
|
|
854
|
+
variableName: o.input.variableName,
|
|
855
|
+
scope: o.input.scope || {
|
|
576
856
|
kind: "allSheets",
|
|
577
857
|
sheetKinds: ["dashboard"]
|
|
578
858
|
},
|
|
579
859
|
runtimeScope: "shared",
|
|
580
860
|
presentation: {
|
|
581
861
|
placement: "toolbar",
|
|
582
|
-
order:
|
|
862
|
+
order: n.inputs.length
|
|
583
863
|
},
|
|
584
864
|
exports: ["label", "value", "start", "end", "range"],
|
|
585
|
-
filter:
|
|
865
|
+
filter: o.input.filter
|
|
586
866
|
};
|
|
587
|
-
|
|
867
|
+
n.inputs.push(f), et(n, o.input);
|
|
588
868
|
break;
|
|
589
869
|
}
|
|
590
870
|
case "addCalculatedField": {
|
|
591
|
-
if (
|
|
592
|
-
|
|
593
|
-
else if (
|
|
594
|
-
|
|
595
|
-
else if (
|
|
596
|
-
const
|
|
597
|
-
|
|
598
|
-
|
|
871
|
+
if (o.field.scope === "dashboard" && o.field.field)
|
|
872
|
+
n.calculatedFields ?? (n.calculatedFields = []), n.calculatedFields.push(o.field.field);
|
|
873
|
+
else if (o.field.scope === "sheet" && o.field.field)
|
|
874
|
+
s.calculatedFields ?? (s.calculatedFields = []), s.calculatedFields.push(o.field.field);
|
|
875
|
+
else if (o.field.scope === "card" && o.field.field) {
|
|
876
|
+
const f = o.field.targetCardId ? P(n, o.field.targetCardId) : null;
|
|
877
|
+
f ? ((d = f.card).calculatedFields ?? (d.calculatedFields = []), f.card.calculatedFields.push(o.field.field)) : i.push(
|
|
878
|
+
C(
|
|
599
879
|
"missing_calculated_field_target",
|
|
600
|
-
`Calculated field "${
|
|
880
|
+
`Calculated field "${o.field.name}" needs a valid target card.`
|
|
601
881
|
)
|
|
602
882
|
);
|
|
603
883
|
}
|
|
604
884
|
break;
|
|
605
885
|
}
|
|
606
886
|
case "renameCard": {
|
|
607
|
-
const
|
|
608
|
-
if (!
|
|
887
|
+
const f = P(n, o.cardId);
|
|
888
|
+
if (!f) {
|
|
609
889
|
i.push(
|
|
610
|
-
|
|
890
|
+
C(
|
|
611
891
|
"card_not_found",
|
|
612
|
-
`Card "${
|
|
613
|
-
|
|
892
|
+
`Card "${o.cardId}" could not be renamed because it was not found.`,
|
|
893
|
+
o.cardId
|
|
614
894
|
)
|
|
615
895
|
);
|
|
616
896
|
break;
|
|
617
897
|
}
|
|
618
|
-
|
|
898
|
+
f.card.title = o.title, o.description !== void 0 && (f.card.description = o.description);
|
|
619
899
|
break;
|
|
620
900
|
}
|
|
621
901
|
case "reorderCards": {
|
|
622
|
-
const
|
|
623
|
-
for (let
|
|
624
|
-
const
|
|
625
|
-
|
|
902
|
+
const f = /* @__PURE__ */ new Map();
|
|
903
|
+
for (let p = 0; p < o.cardIds.length; p += 1) {
|
|
904
|
+
const I = o.cardIds[p], y = P(n, I);
|
|
905
|
+
y && f.set(y.frame.id, p);
|
|
626
906
|
}
|
|
627
|
-
|
|
907
|
+
ue(s, f);
|
|
628
908
|
break;
|
|
629
909
|
}
|
|
630
910
|
case "reuseCalculatedField":
|
|
631
|
-
|
|
632
|
-
|
|
911
|
+
r.push(
|
|
912
|
+
C(
|
|
633
913
|
"reused_calculated_field",
|
|
634
|
-
`Calculated field "${
|
|
914
|
+
`Calculated field "${o.fieldId}" is reused by reference.`
|
|
635
915
|
)
|
|
636
916
|
);
|
|
637
917
|
break;
|
|
638
918
|
case "unsupported":
|
|
639
919
|
i.push(
|
|
640
|
-
|
|
920
|
+
C("unsupported_operation", o.reason || o.requestedAction)
|
|
641
921
|
);
|
|
642
922
|
break;
|
|
643
923
|
}
|
|
644
|
-
return { dashboard:
|
|
924
|
+
return { dashboard: n, warnings: r, skippedOperations: i };
|
|
645
925
|
}
|
|
646
|
-
function
|
|
647
|
-
return
|
|
926
|
+
function g(e, t, n) {
|
|
927
|
+
return n ? { code: e, message: t, cardId: n } : { code: e, message: t };
|
|
648
928
|
}
|
|
649
|
-
function
|
|
929
|
+
function F(e, t) {
|
|
650
930
|
return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || t;
|
|
651
931
|
}
|
|
652
|
-
function
|
|
932
|
+
function fe(e, t) {
|
|
653
933
|
if (!t.has(e))
|
|
654
934
|
return t.add(e), e;
|
|
655
|
-
let
|
|
656
|
-
for (; t.has(
|
|
657
|
-
|
|
658
|
-
return t.add(
|
|
659
|
-
}
|
|
660
|
-
function ve(e) {
|
|
661
|
-
return e.kind === "semantic" ? [
|
|
662
|
-
"semantic",
|
|
663
|
-
e.domainId,
|
|
664
|
-
e.datasetId || "",
|
|
665
|
-
e.datasetName,
|
|
666
|
-
e.connectionId || ""
|
|
667
|
-
].join(":") : e.kind === "physical" ? [
|
|
668
|
-
"physical",
|
|
669
|
-
e.connectionId,
|
|
670
|
-
e.databaseName || "",
|
|
671
|
-
e.schemaName || "",
|
|
672
|
-
e.tableName
|
|
673
|
-
].join(":") : ["sql", e.connectionId, e.sql].join(":");
|
|
935
|
+
let n = 2, r = `${e}-${n}`;
|
|
936
|
+
for (; t.has(r); )
|
|
937
|
+
n += 1, r = `${e}-${n}`;
|
|
938
|
+
return t.add(r), r;
|
|
674
939
|
}
|
|
675
940
|
function x(e) {
|
|
676
941
|
return !!(e && typeof e == "object");
|
|
677
942
|
}
|
|
678
|
-
function
|
|
679
|
-
return x(e) && (e.kind === "semantic" || e.kind === "physical" || e.kind === "sql");
|
|
680
|
-
}
|
|
681
|
-
function K(e) {
|
|
943
|
+
function me(e) {
|
|
682
944
|
return Array.isArray(e.inputs) ? e.inputs.filter(
|
|
683
945
|
(t) => x(t) && typeof t.id == "string"
|
|
684
946
|
) : [];
|
|
685
947
|
}
|
|
686
|
-
function
|
|
948
|
+
function G(e) {
|
|
687
949
|
return Array.isArray(e.sections) ? e.sections.filter(
|
|
688
950
|
(t) => x(t)
|
|
689
951
|
) : [];
|
|
690
952
|
}
|
|
691
|
-
function
|
|
953
|
+
function U(e) {
|
|
692
954
|
return Array.isArray(e.views) ? e.views.filter(
|
|
693
955
|
(t) => x(t)
|
|
694
956
|
) : [];
|
|
695
957
|
}
|
|
696
|
-
function
|
|
697
|
-
return e.kind === "semantic" ? {
|
|
958
|
+
function tt(e) {
|
|
959
|
+
return N(e) ? e.kind === "semantic" ? {
|
|
698
960
|
kind: "semantic",
|
|
699
961
|
domainId: e.domainId,
|
|
700
962
|
datasetName: e.datasetName,
|
|
@@ -708,64 +970,193 @@ function xe(e) {
|
|
|
708
970
|
schemaName: e.schemaName,
|
|
709
971
|
tableName: e.tableName,
|
|
710
972
|
label: e.label
|
|
711
|
-
} : null;
|
|
973
|
+
} : null : null;
|
|
712
974
|
}
|
|
713
|
-
function
|
|
714
|
-
|
|
975
|
+
function B(e) {
|
|
976
|
+
if (!Array.isArray(e))
|
|
977
|
+
return [];
|
|
978
|
+
const t = [];
|
|
979
|
+
for (const n of e) {
|
|
980
|
+
const r = v(n);
|
|
981
|
+
r && t.push(r);
|
|
982
|
+
}
|
|
983
|
+
return t;
|
|
715
984
|
}
|
|
716
|
-
function
|
|
985
|
+
function nt(e) {
|
|
986
|
+
if (!e)
|
|
987
|
+
return [];
|
|
717
988
|
const t = [];
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
989
|
+
if (N(e.source) && t.push(e.source), e.kind === "metric") {
|
|
990
|
+
const r = v(e.dateField);
|
|
991
|
+
r && t.push(r), t.push(...B(e.dimensions));
|
|
992
|
+
} else if (e.kind === "records") {
|
|
993
|
+
const r = v(e.dateField);
|
|
994
|
+
r && t.push(r), t.push(...B(e.fields));
|
|
995
|
+
} else if (e.kind === "inputOptions") {
|
|
996
|
+
const r = v(e.field);
|
|
997
|
+
r && t.push(r);
|
|
998
|
+
} else e.kind === "sql" && t.push(...B(e.fields));
|
|
999
|
+
const n = "inputs" in e && Array.isArray(e.inputs) ? e.inputs : [];
|
|
1000
|
+
for (const r of n) {
|
|
1001
|
+
const i = v(r.field);
|
|
1002
|
+
i && t.push(i);
|
|
1003
|
+
}
|
|
725
1004
|
return t;
|
|
726
1005
|
}
|
|
727
|
-
function
|
|
728
|
-
const
|
|
729
|
-
for (const
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
1006
|
+
function rt(e) {
|
|
1007
|
+
const t = [];
|
|
1008
|
+
for (const n of me(e)) {
|
|
1009
|
+
N(n.source) && t.push(n.source);
|
|
1010
|
+
const r = v(n.field);
|
|
1011
|
+
r && t.push(r);
|
|
1012
|
+
}
|
|
1013
|
+
for (const n of G(e))
|
|
1014
|
+
for (const r of U(n))
|
|
1015
|
+
t.push(...nt(r.analytics));
|
|
1016
|
+
return t;
|
|
1017
|
+
}
|
|
1018
|
+
function at(e) {
|
|
1019
|
+
var n;
|
|
1020
|
+
const t = [];
|
|
1021
|
+
for (const r of G(e))
|
|
1022
|
+
for (const i of U(r))
|
|
1023
|
+
N((n = i.analytics) == null ? void 0 : n.source) && t.push(i.analytics.source);
|
|
1024
|
+
return t;
|
|
1025
|
+
}
|
|
1026
|
+
function it(e, t) {
|
|
1027
|
+
const n = q(e).map(tt).filter((a) => !!a);
|
|
1028
|
+
if (n.length === 0)
|
|
1029
|
+
return t.push(
|
|
1030
|
+
g(
|
|
1031
|
+
"missing_materializable_dataset",
|
|
1032
|
+
"No semantic or physical source could be converted into the current dashboard authoring dataset reference."
|
|
1033
|
+
)
|
|
1034
|
+
), [];
|
|
1035
|
+
const r = n.every((a) => a.kind === "semantic"), i = Array.from(
|
|
1036
|
+
new Set(
|
|
1037
|
+
n.filter((a) => a.kind === "semantic").map((a) => a.domainId)
|
|
736
1038
|
)
|
|
737
|
-
)
|
|
738
|
-
|
|
1039
|
+
);
|
|
1040
|
+
return n.length > 1 && (!r || i.length !== 1) ? (t.push(
|
|
1041
|
+
g(
|
|
739
1042
|
"multiple_datasets_out_of_scope",
|
|
740
|
-
"The
|
|
1043
|
+
"The dashboard authoring compiler supports multiple datasets only within one semantic domain; using the first source and deferring the rest."
|
|
741
1044
|
)
|
|
742
|
-
), [n[0]]);
|
|
1045
|
+
), [n[0]]) : n;
|
|
743
1046
|
}
|
|
744
|
-
function
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
1047
|
+
function st(e, t) {
|
|
1048
|
+
const n = G(e), r = me(e), i = q(rt(e)), a = q(
|
|
1049
|
+
at(e)
|
|
1050
|
+
);
|
|
1051
|
+
return {
|
|
1052
|
+
sections: n,
|
|
1053
|
+
inputs: r,
|
|
1054
|
+
sources: i,
|
|
1055
|
+
primarySources: a,
|
|
1056
|
+
defaultSource: a.length === 1 ? a[0] : void 0,
|
|
1057
|
+
datasets: it(i, t)
|
|
1058
|
+
};
|
|
749
1059
|
}
|
|
750
|
-
function
|
|
751
|
-
|
|
1060
|
+
function ot(e) {
|
|
1061
|
+
return pe(e).map((t) => t.name).filter(Boolean);
|
|
1062
|
+
}
|
|
1063
|
+
function pe(e) {
|
|
1064
|
+
return (Array.isArray(e.fields) ? e.fields : []).filter(
|
|
1065
|
+
(t) => !ve(t, e.dateField)
|
|
1066
|
+
);
|
|
1067
|
+
}
|
|
1068
|
+
function dt(e) {
|
|
1069
|
+
const t = Array.isArray(e.metrics) ? e.metrics.filter(
|
|
1070
|
+
(n) => typeof n == "string" && n.trim().length > 0
|
|
1071
|
+
) : [];
|
|
1072
|
+
return Array.from(
|
|
1073
|
+
new Set(
|
|
1074
|
+
[e.metric, ...t].filter(
|
|
1075
|
+
(n) => typeof n == "string" && n.trim().length > 0
|
|
1076
|
+
)
|
|
1077
|
+
)
|
|
1078
|
+
);
|
|
1079
|
+
}
|
|
1080
|
+
function ct(e) {
|
|
1081
|
+
return x(e) && typeof e.name == "string" && e.name.trim().length > 0;
|
|
1082
|
+
}
|
|
1083
|
+
function lt(e) {
|
|
1084
|
+
if (!Array.isArray(e.dimensions))
|
|
1085
|
+
return;
|
|
1086
|
+
const t = e.dimensions.filter(ct).map((n) => n.name);
|
|
1087
|
+
return t.length ? t : void 0;
|
|
1088
|
+
}
|
|
1089
|
+
function ne(e) {
|
|
1090
|
+
return e === "hour" ? "day" : e;
|
|
1091
|
+
}
|
|
1092
|
+
function j(e, t = {}) {
|
|
1093
|
+
var n, r;
|
|
1094
|
+
if (e != null && e.name) {
|
|
1095
|
+
if (((n = e.source) == null ? void 0 : n.kind) === "semantic")
|
|
1096
|
+
return !e.source.domainId || !e.source.datasetName ? void 0 : {
|
|
1097
|
+
name: e.name,
|
|
1098
|
+
source: {
|
|
1099
|
+
kind: "semantic",
|
|
1100
|
+
domainId: e.source.domainId,
|
|
1101
|
+
datasetName: e.source.datasetName,
|
|
1102
|
+
datasetId: e.source.datasetId,
|
|
1103
|
+
label: e.source.label,
|
|
1104
|
+
connectionId: e.source.connectionId
|
|
1105
|
+
}
|
|
1106
|
+
};
|
|
1107
|
+
if (((r = e.source) == null ? void 0 : r.kind) === "physical")
|
|
1108
|
+
return !e.source.connectionId || !e.source.tableName ? void 0 : {
|
|
1109
|
+
name: e.name,
|
|
1110
|
+
source: {
|
|
1111
|
+
kind: "physical",
|
|
1112
|
+
connectionId: e.source.connectionId,
|
|
1113
|
+
tableName: e.source.tableName,
|
|
1114
|
+
databaseName: e.source.databaseName,
|
|
1115
|
+
schemaName: e.source.schemaName,
|
|
1116
|
+
label: e.source.label
|
|
1117
|
+
}
|
|
1118
|
+
};
|
|
1119
|
+
if (!(e.source !== void 0 || !t.includeUnsourced))
|
|
1120
|
+
return { name: e.name };
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
function re(e) {
|
|
1124
|
+
if (!Array.isArray(e))
|
|
1125
|
+
return;
|
|
1126
|
+
const t = e.map((n) => j(n, { includeUnsourced: !0 })).filter(Boolean);
|
|
1127
|
+
if (t.length === e.length)
|
|
1128
|
+
return t.some((n) => n.source) ? t : void 0;
|
|
1129
|
+
}
|
|
1130
|
+
function ut(e) {
|
|
1131
|
+
var t, n;
|
|
752
1132
|
if (e) {
|
|
753
1133
|
if (e.kind === "metric")
|
|
754
1134
|
return {
|
|
755
1135
|
metric: e.metric,
|
|
756
|
-
|
|
1136
|
+
metrics: dt(e),
|
|
1137
|
+
dateField: (t = e.dateField) == null ? void 0 : t.name,
|
|
1138
|
+
dateFieldRef: j(e.dateField),
|
|
1139
|
+
timeGrain: ne(e.timeGrain),
|
|
1140
|
+
dimensions: lt(e),
|
|
1141
|
+
dimensionRefs: re(e.dimensions),
|
|
1142
|
+
limit: e.limit
|
|
757
1143
|
};
|
|
758
1144
|
if (e.kind === "records")
|
|
759
1145
|
return {
|
|
760
1146
|
metrics: e.measures,
|
|
761
|
-
dateField: (
|
|
762
|
-
|
|
763
|
-
|
|
1147
|
+
dateField: (n = e.dateField) == null ? void 0 : n.name,
|
|
1148
|
+
dateFieldRef: j(e.dateField),
|
|
1149
|
+
timeGrain: ne(e.timeGrain),
|
|
1150
|
+
dimensions: ot(e),
|
|
1151
|
+
dimensionRefs: re(pe(e)),
|
|
764
1152
|
limit: e.limit
|
|
765
1153
|
};
|
|
766
1154
|
}
|
|
767
1155
|
}
|
|
768
|
-
function
|
|
1156
|
+
function ft(e) {
|
|
1157
|
+
return e && Ie(e).ok ? e : void 0;
|
|
1158
|
+
}
|
|
1159
|
+
function mt(e) {
|
|
769
1160
|
var t;
|
|
770
1161
|
switch ((t = e.presentation) == null ? void 0 : t.kind) {
|
|
771
1162
|
case "kpi":
|
|
@@ -784,11 +1175,11 @@ function Se(e) {
|
|
|
784
1175
|
return null;
|
|
785
1176
|
}
|
|
786
1177
|
}
|
|
787
|
-
function
|
|
788
|
-
var t,
|
|
789
|
-
return ((t = e.presentation) == null ? void 0 : t.kind) === "kpi" ? "kpi" : ((
|
|
1178
|
+
function pt(e) {
|
|
1179
|
+
var t, n, r;
|
|
1180
|
+
return ((t = e.presentation) == null ? void 0 : t.kind) === "kpi" ? "kpi" : ((n = e.presentation) == null ? void 0 : n.kind) === "table" ? "table" : ((r = e.presentation) == null ? void 0 : r.kind) === "text" ? "text" : "chart";
|
|
790
1181
|
}
|
|
791
|
-
function
|
|
1182
|
+
function ht(e) {
|
|
792
1183
|
switch (e) {
|
|
793
1184
|
case "not_in":
|
|
794
1185
|
return "not in";
|
|
@@ -798,98 +1189,103 @@ function $e(e) {
|
|
|
798
1189
|
return e || "in";
|
|
799
1190
|
}
|
|
800
1191
|
}
|
|
801
|
-
function
|
|
1192
|
+
function bt(e) {
|
|
802
1193
|
return x(e.field) ? e.field.dataType === "datetime" ? "date" : e.field.dataType || "string" : "string";
|
|
803
1194
|
}
|
|
804
|
-
function
|
|
1195
|
+
function It(e) {
|
|
805
1196
|
if (!(!e || e.kind !== "physical"))
|
|
806
1197
|
return [e.databaseName, e.schemaName, e.tableName].filter(Boolean).join(".");
|
|
807
1198
|
}
|
|
808
|
-
function
|
|
1199
|
+
function gt(e, t, n, r, i, a) {
|
|
809
1200
|
if (e.kind !== "filter")
|
|
810
|
-
return
|
|
811
|
-
|
|
1201
|
+
return a.push(
|
|
1202
|
+
g(
|
|
812
1203
|
"control_inputs_deferred",
|
|
813
1204
|
`Control input "${e.label}" is represented in the protocol but not yet materialized by the dashboard authoring adapter.`
|
|
814
1205
|
)
|
|
815
1206
|
), null;
|
|
816
1207
|
if (!x(e.field) || typeof e.field.name != "string")
|
|
817
|
-
return
|
|
818
|
-
|
|
1208
|
+
return a.push(
|
|
1209
|
+
g(
|
|
819
1210
|
"filter_requires_field",
|
|
820
1211
|
`Filter "${e.label || e.id}" needs a field before the dashboard compiler can materialize it.`
|
|
821
1212
|
)
|
|
822
1213
|
), null;
|
|
823
|
-
const
|
|
1214
|
+
const s = we({
|
|
1215
|
+
explicitSource: e.source,
|
|
1216
|
+
field: e.field,
|
|
1217
|
+
defaultSource: t,
|
|
1218
|
+
fallbackSources: n
|
|
1219
|
+
}), d = (s == null ? void 0 : s.kind) === "semantic" || (s == null ? void 0 : s.kind) === "physical" ? s.connectionId : void 0;
|
|
824
1220
|
if (!d)
|
|
825
|
-
return
|
|
826
|
-
|
|
1221
|
+
return a.push(
|
|
1222
|
+
g(
|
|
827
1223
|
"filter_requires_connection_id",
|
|
828
1224
|
`Filter "${e.label}" needs a source connectionId before the dashboard compiler can materialize it.`
|
|
829
1225
|
)
|
|
830
1226
|
), null;
|
|
831
|
-
const
|
|
832
|
-
id: `filter-${
|
|
833
|
-
|
|
834
|
-
|
|
1227
|
+
const p = {
|
|
1228
|
+
id: `filter-${fe(
|
|
1229
|
+
F(e.id, e.field.name),
|
|
1230
|
+
i
|
|
835
1231
|
)}`,
|
|
836
1232
|
variableName: e.id,
|
|
837
1233
|
connectionId: d,
|
|
838
1234
|
title: e.label,
|
|
839
1235
|
column: e.field.name,
|
|
840
|
-
dataType:
|
|
841
|
-
qualifiedTableName:
|
|
1236
|
+
dataType: bt(e),
|
|
1237
|
+
qualifiedTableName: It(s),
|
|
842
1238
|
sql: "",
|
|
843
|
-
operation:
|
|
1239
|
+
operation: ht(e.operator),
|
|
844
1240
|
type: e.multi === !1 ? "single" : "multiple",
|
|
845
1241
|
location: "dashboard",
|
|
846
1242
|
displayMode: "toolbar",
|
|
847
|
-
fieldMeta: (
|
|
1243
|
+
fieldMeta: (s == null ? void 0 : s.kind) === "semantic" ? {
|
|
848
1244
|
name: e.field.name,
|
|
849
1245
|
qualifiedFieldName: e.field.name,
|
|
850
1246
|
dataType: e.field.dataType,
|
|
851
1247
|
role: e.field.role === "measure" ? "metric" : "groupby"
|
|
852
1248
|
} : void 0,
|
|
853
|
-
semanticContext: (
|
|
854
|
-
semanticDomainId:
|
|
855
|
-
connectionId:
|
|
1249
|
+
semanticContext: (s == null ? void 0 : s.kind) === "semantic" ? {
|
|
1250
|
+
semanticDomainId: s.domainId,
|
|
1251
|
+
connectionId: s.connectionId
|
|
856
1252
|
} : void 0
|
|
857
1253
|
};
|
|
858
1254
|
return {
|
|
859
1255
|
id: e.id,
|
|
860
1256
|
label: e.label,
|
|
861
1257
|
variableName: e.id,
|
|
862
|
-
scope:
|
|
863
|
-
filter:
|
|
864
|
-
defaultValue:
|
|
865
|
-
|
|
1258
|
+
scope: r,
|
|
1259
|
+
filter: p,
|
|
1260
|
+
defaultValue: H(
|
|
1261
|
+
p,
|
|
866
1262
|
e.defaultValue
|
|
867
1263
|
)
|
|
868
1264
|
};
|
|
869
1265
|
}
|
|
870
1266
|
function V(e) {
|
|
871
|
-
const t = [],
|
|
872
|
-
for (const
|
|
873
|
-
const i = e.viewIdToCardId.get(
|
|
874
|
-
i ? t.push(i) :
|
|
1267
|
+
const t = [], n = [];
|
|
1268
|
+
for (const r of e.viewIds) {
|
|
1269
|
+
const i = e.viewIdToCardId.get(r);
|
|
1270
|
+
i ? t.push(i) : n.push(r);
|
|
875
1271
|
}
|
|
876
|
-
return
|
|
877
|
-
|
|
1272
|
+
return n.length > 0 && e.warnings.push(
|
|
1273
|
+
g(
|
|
878
1274
|
"input_scope_view_not_found",
|
|
879
|
-
`Filter "${e.inputLabel}" referenced unknown view ids: ${
|
|
1275
|
+
`Filter "${e.inputLabel}" referenced unknown view ids: ${n.join(", ")}.`
|
|
880
1276
|
)
|
|
881
1277
|
), Array.from(new Set(t));
|
|
882
1278
|
}
|
|
883
|
-
function
|
|
884
|
-
var
|
|
1279
|
+
function yt(e) {
|
|
1280
|
+
var r, i;
|
|
885
1281
|
if (!e.protocolScope) {
|
|
886
|
-
const
|
|
887
|
-
return
|
|
1282
|
+
const a = Array.from(new Set(e.boundCardIds));
|
|
1283
|
+
return a.length > 0 && a.length < e.allCardIds.length ? { kind: "cards", cardIds: a } : void 0;
|
|
888
1284
|
}
|
|
889
1285
|
if (e.protocolScope.level === "dashboard") {
|
|
890
|
-
if (!((
|
|
1286
|
+
if (!((r = e.protocolScope.excludeViewIds) != null && r.length))
|
|
891
1287
|
return;
|
|
892
|
-
const
|
|
1288
|
+
const a = new Set(
|
|
893
1289
|
V({
|
|
894
1290
|
inputLabel: e.inputLabel,
|
|
895
1291
|
viewIds: e.protocolScope.excludeViewIds,
|
|
@@ -899,34 +1295,34 @@ function Ve(e) {
|
|
|
899
1295
|
);
|
|
900
1296
|
return {
|
|
901
1297
|
kind: "cards",
|
|
902
|
-
cardIds: e.allCardIds.filter((
|
|
1298
|
+
cardIds: e.allCardIds.filter((s) => !a.has(s))
|
|
903
1299
|
};
|
|
904
1300
|
}
|
|
905
1301
|
if (e.protocolScope.level === "view") {
|
|
906
|
-
const
|
|
1302
|
+
const a = V({
|
|
907
1303
|
inputLabel: e.inputLabel,
|
|
908
1304
|
viewIds: e.protocolScope.viewIds,
|
|
909
1305
|
viewIdToCardId: e.viewIdToCardId,
|
|
910
1306
|
warnings: e.warnings
|
|
911
1307
|
});
|
|
912
|
-
return
|
|
913
|
-
|
|
1308
|
+
return a.length === 0 ? (e.warnings.push(
|
|
1309
|
+
g(
|
|
914
1310
|
"input_scope_has_no_materialized_cards",
|
|
915
1311
|
`Filter "${e.inputLabel}" was deferred because its view scope does not match any materialized cards.`
|
|
916
1312
|
)
|
|
917
|
-
), null) : { kind: "cards", cardIds:
|
|
1313
|
+
), null) : { kind: "cards", cardIds: a };
|
|
918
1314
|
}
|
|
919
1315
|
const t = e.sectionIdToCardIds.get(e.protocolScope.sectionId) || [];
|
|
920
1316
|
if (t.length === 0)
|
|
921
1317
|
return e.warnings.push(
|
|
922
|
-
|
|
1318
|
+
g(
|
|
923
1319
|
"input_scope_section_not_found",
|
|
924
1320
|
`Filter "${e.inputLabel}" was deferred because section "${e.protocolScope.sectionId}" does not match any materialized cards.`
|
|
925
1321
|
)
|
|
926
1322
|
), null;
|
|
927
1323
|
if (!((i = e.protocolScope.excludeViewIds) != null && i.length))
|
|
928
1324
|
return { kind: "cards", cardIds: t };
|
|
929
|
-
const
|
|
1325
|
+
const n = new Set(
|
|
930
1326
|
V({
|
|
931
1327
|
inputLabel: e.inputLabel,
|
|
932
1328
|
viewIds: e.protocolScope.excludeViewIds,
|
|
@@ -936,112 +1332,128 @@ function Ve(e) {
|
|
|
936
1332
|
);
|
|
937
1333
|
return {
|
|
938
1334
|
kind: "cards",
|
|
939
|
-
cardIds: t.filter((
|
|
1335
|
+
cardIds: t.filter((a) => !n.has(a))
|
|
940
1336
|
};
|
|
941
1337
|
}
|
|
942
|
-
function
|
|
943
|
-
var
|
|
944
|
-
const t = [],
|
|
945
|
-
for (const
|
|
946
|
-
t.push(
|
|
947
|
-
for (const
|
|
948
|
-
t.push(
|
|
949
|
-
const
|
|
950
|
-
let
|
|
951
|
-
for (const [
|
|
952
|
-
const
|
|
953
|
-
|
|
954
|
-
for (const [
|
|
955
|
-
const
|
|
956
|
-
h.id || `${
|
|
957
|
-
`card-${
|
|
1338
|
+
function At(e) {
|
|
1339
|
+
var c, b, S;
|
|
1340
|
+
const t = [], n = be(e);
|
|
1341
|
+
for (const m of n.warnings)
|
|
1342
|
+
t.push(g(m.code, m.message));
|
|
1343
|
+
for (const m of n.errors)
|
|
1344
|
+
t.push(g(m.code, m.message));
|
|
1345
|
+
const r = st(e, t), i = [], a = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Set(), f = /* @__PURE__ */ new Set();
|
|
1346
|
+
let p = 0;
|
|
1347
|
+
for (const [m, w] of r.sections.entries()) {
|
|
1348
|
+
const l = typeof w.title == "string" ? w.title : `Section ${m + 1}`, K = w.id || F(l, `section-${m + 1}`);
|
|
1349
|
+
s.set(K, []);
|
|
1350
|
+
for (const [Q, h] of U(w).entries()) {
|
|
1351
|
+
const J = mt(h), R = F(
|
|
1352
|
+
h.id || `${l}-${h.title || `View ${Q + 1}`}`,
|
|
1353
|
+
`card-${m + 1}-${Q + 1}`
|
|
958
1354
|
);
|
|
959
|
-
if (!
|
|
1355
|
+
if (!J) {
|
|
960
1356
|
t.push(
|
|
961
|
-
|
|
1357
|
+
g(
|
|
962
1358
|
"unsupported_presentation",
|
|
963
|
-
`Dashboard presentation "${((
|
|
964
|
-
`card-${
|
|
1359
|
+
`Dashboard presentation "${((c = h.presentation) == null ? void 0 : c.kind) || "unknown"}" is not supported by the dashboard authoring adapter.`,
|
|
1360
|
+
`card-${R}`
|
|
965
1361
|
)
|
|
966
1362
|
);
|
|
967
1363
|
continue;
|
|
968
1364
|
}
|
|
969
|
-
if (((
|
|
1365
|
+
if (((b = h.analytics) == null ? void 0 : b.kind) === "sql") {
|
|
970
1366
|
t.push(
|
|
971
|
-
|
|
1367
|
+
g(
|
|
972
1368
|
"sql_intent_deferred",
|
|
973
1369
|
"SQL analytics intent is valid protocol, but the current dashboard authoring adapter only materializes semantic and physical config-card intents.",
|
|
974
|
-
`card-${
|
|
1370
|
+
`card-${R}`
|
|
975
1371
|
)
|
|
976
1372
|
);
|
|
977
1373
|
continue;
|
|
978
1374
|
}
|
|
979
|
-
const
|
|
980
|
-
h.id &&
|
|
981
|
-
const
|
|
982
|
-
for (const
|
|
983
|
-
const
|
|
984
|
-
|
|
1375
|
+
const X = fe(R, o), T = `card-${X}`;
|
|
1376
|
+
h.id && a.set(h.id, T), (S = s.get(K)) == null || S.push(T);
|
|
1377
|
+
const he = h.analytics && "inputs" in h.analytics ? h.analytics.inputs : void 0;
|
|
1378
|
+
for (const Y of he || []) {
|
|
1379
|
+
const Z = d.get(Y.inputId) || [];
|
|
1380
|
+
Z.push(T), d.set(Y.inputId, Z);
|
|
985
1381
|
}
|
|
986
|
-
|
|
1382
|
+
i.push({
|
|
987
1383
|
id: T,
|
|
988
|
-
frameId: `frame-${
|
|
1384
|
+
frameId: `frame-${X}`,
|
|
989
1385
|
title: h.title,
|
|
990
1386
|
description: h.description,
|
|
991
|
-
type:
|
|
992
|
-
role:
|
|
993
|
-
priority:
|
|
994
|
-
section:
|
|
995
|
-
query:
|
|
1387
|
+
type: J,
|
|
1388
|
+
role: pt(h),
|
|
1389
|
+
priority: p,
|
|
1390
|
+
section: l,
|
|
1391
|
+
query: ut(h.analytics),
|
|
1392
|
+
analyticsIntent: ft(h.analytics),
|
|
996
1393
|
text: h.text
|
|
997
|
-
}),
|
|
1394
|
+
}), p += 1;
|
|
998
1395
|
}
|
|
999
1396
|
}
|
|
1000
|
-
const
|
|
1001
|
-
const
|
|
1002
|
-
protocolScope:
|
|
1003
|
-
inputLabel:
|
|
1004
|
-
allCardIds:
|
|
1005
|
-
boundCardIds:
|
|
1006
|
-
viewIdToCardId:
|
|
1007
|
-
sectionIdToCardIds:
|
|
1397
|
+
const I = r.inputs.map((m) => {
|
|
1398
|
+
const w = yt({
|
|
1399
|
+
protocolScope: m.scope,
|
|
1400
|
+
inputLabel: m.label,
|
|
1401
|
+
allCardIds: i.map((l) => l.id),
|
|
1402
|
+
boundCardIds: d.get(m.id) || [],
|
|
1403
|
+
viewIdToCardId: a,
|
|
1404
|
+
sectionIdToCardIds: s,
|
|
1008
1405
|
warnings: t
|
|
1009
1406
|
});
|
|
1010
|
-
return
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1407
|
+
return w === null ? null : gt(
|
|
1408
|
+
m,
|
|
1409
|
+
r.defaultSource,
|
|
1410
|
+
r.sources,
|
|
1411
|
+
w,
|
|
1412
|
+
f,
|
|
1015
1413
|
t
|
|
1016
1414
|
);
|
|
1017
|
-
}).filter((
|
|
1415
|
+
}).filter((m) => !!m);
|
|
1018
1416
|
return { plan: {
|
|
1019
1417
|
version: 1,
|
|
1020
|
-
id: `plan-${
|
|
1418
|
+
id: `plan-${F(e.title, "dashboard")}`,
|
|
1021
1419
|
title: e.title,
|
|
1022
1420
|
description: e.description,
|
|
1023
|
-
datasets: r,
|
|
1421
|
+
datasets: r.datasets,
|
|
1024
1422
|
sheets: [
|
|
1025
1423
|
{
|
|
1026
|
-
id: `sheet-${
|
|
1424
|
+
id: `sheet-${F(e.title, "dashboard")}`,
|
|
1027
1425
|
title: e.title,
|
|
1028
1426
|
description: e.description,
|
|
1029
1427
|
kind: "dashboard",
|
|
1030
|
-
cards:
|
|
1428
|
+
cards: i
|
|
1031
1429
|
}
|
|
1032
1430
|
],
|
|
1033
|
-
filterInputs:
|
|
1431
|
+
filterInputs: I.length ? I : void 0,
|
|
1034
1432
|
warnings: t.length ? t : void 0,
|
|
1035
|
-
unresolvedRequests:
|
|
1433
|
+
unresolvedRequests: n.ok ? void 0 : n.errors.map((m) => m.message)
|
|
1036
1434
|
}, warnings: t };
|
|
1037
1435
|
}
|
|
1038
1436
|
export {
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1437
|
+
ge as DASHBOARD_AUTHORING_BREAKPOINTS,
|
|
1438
|
+
M as DASHBOARD_AUTHORING_MAX_GENERATED_CARDS,
|
|
1439
|
+
St as applyDashboardChangePlan,
|
|
1440
|
+
kt as compileDashboardFromPlan,
|
|
1441
|
+
E as compileResponsiveDashboardLayouts,
|
|
1442
|
+
W as dashboardAuthoringDatasetMatchesSource,
|
|
1443
|
+
ve as dashboardAuthoringFieldsReferToSameTarget,
|
|
1444
|
+
v as dashboardAuthoringSourceFromField,
|
|
1445
|
+
ee as dashboardAuthoringSourceKey,
|
|
1446
|
+
ae as dashboardAuthoringSourcesReferToSameDataset,
|
|
1447
|
+
At as dashboardPlanFromSemaphorDashboardIntent,
|
|
1448
|
+
vt as findDashboardAuthoringDatasetForSource,
|
|
1449
|
+
Fe as getDashboardAuthoringCardSource,
|
|
1450
|
+
N as isMaterializableDashboardAuthoringSource,
|
|
1451
|
+
ye as isSemaphorSourceRef,
|
|
1452
|
+
q as mergeDashboardAuthoringSources,
|
|
1453
|
+
_e as preferDashboardAuthoringSourceMetadata,
|
|
1454
|
+
wt as preferredDashboardAuthoringSource,
|
|
1455
|
+
we as resolveDashboardAuthoringSource,
|
|
1456
|
+
Ne as validateDashboardAuthoringDatasetScope,
|
|
1457
|
+
qe as validateDashboardChangePlan,
|
|
1458
|
+
Me as validateDashboardPlan
|
|
1047
1459
|
};
|