@datarecce/ui 0.1.22 → 0.1.24
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/{RecceCheckContext-DNKi97uE.js → RecceCheckContext-Cb41gigE.js} +4 -3
- package/dist/RecceCheckContext-Cb41gigE.js.map +1 -0
- package/dist/{RecceCheckContext-BETsmiD5.mjs → RecceCheckContext-CzsuuXxT.mjs} +4 -3
- package/dist/RecceCheckContext-CzsuuXxT.mjs.map +1 -0
- package/dist/api.d.mts +2 -2
- package/dist/api.d.ts +2 -2
- package/dist/api.js +12 -37
- package/dist/api.mjs +3 -29
- package/dist/{components-C735_oqD.mjs → components-BHxcVq0D.mjs} +1353 -69
- package/dist/components-BHxcVq0D.mjs.map +1 -0
- package/dist/{components-DeA4kqxK.js → components-Bmc5X473.js} +1557 -248
- package/dist/components-Bmc5X473.js.map +1 -0
- package/dist/components.d.mts +2 -2
- package/dist/components.d.ts +2 -2
- package/dist/components.js +8 -4
- package/dist/components.mjs +5 -5
- package/dist/{hooks-Ba-AoxcK.mjs → hooks-B0XGswIh.mjs} +3 -3
- package/dist/{hooks-Ba-AoxcK.mjs.map → hooks-B0XGswIh.mjs.map} +1 -1
- package/dist/{hooks-D6xvNXEc.js → hooks-C99PZcmB.js} +3 -3
- package/dist/{hooks-D6xvNXEc.js.map → hooks-C99PZcmB.js.map} +1 -1
- package/dist/hooks.d.mts +2 -2
- package/dist/hooks.d.ts +2 -2
- package/dist/hooks.js +4 -3
- package/dist/hooks.mjs +4 -4
- package/dist/{index-Sj_wOmNH.d.mts → index-04n48ic2.d.mts} +129 -105
- package/dist/index-04n48ic2.d.mts.map +1 -0
- package/dist/{index-DYduBYD8.d.ts → index-CgyLTrll.d.ts} +129 -105
- package/dist/index-CgyLTrll.d.ts.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +20 -14
- package/dist/index.mjs +7 -7
- package/dist/{state-BjKRZMwY.js → state-Ct-DP81O.js} +108 -79
- package/dist/state-Ct-DP81O.js.map +1 -0
- package/dist/{state-BySLlIE7.mjs → state-CwepO01b.mjs} +91 -80
- package/dist/state-CwepO01b.mjs.map +1 -0
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/{user-Dt_n5IJX.js → version-BgsW-hXj.js} +50 -10
- package/dist/version-BgsW-hXj.js.map +1 -0
- package/dist/version-Bz2CiMHD.mjs +93 -0
- package/dist/version-Bz2CiMHD.mjs.map +1 -0
- package/package.json +5 -4
- package/dist/RecceCheckContext-BETsmiD5.mjs.map +0 -1
- package/dist/RecceCheckContext-DNKi97uE.js.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/api.mjs.map +0 -1
- package/dist/components-C735_oqD.mjs.map +0 -1
- package/dist/components-DeA4kqxK.js.map +0 -1
- package/dist/index-DYduBYD8.d.ts.map +0 -1
- package/dist/index-Sj_wOmNH.d.mts.map +0 -1
- package/dist/state-BjKRZMwY.js.map +0 -1
- package/dist/state-BySLlIE7.mjs.map +0 -1
- package/dist/user-BHOgMaBf.mjs +0 -65
- package/dist/user-BHOgMaBf.mjs.map +0 -1
- package/dist/user-Dt_n5IJX.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
const require_state = require('./state-
|
|
2
|
+
const require_state = require('./state-Ct-DP81O.js');
|
|
3
3
|
const require_urls = require('./urls-SazAekCZ.js');
|
|
4
|
-
const
|
|
5
|
-
const require_RecceCheckContext = require('./RecceCheckContext-
|
|
4
|
+
const require_version = require('./version-BgsW-hXj.js');
|
|
5
|
+
const require_RecceCheckContext = require('./RecceCheckContext-Cb41gigE.js');
|
|
6
6
|
const require_tooltipMessage = require('./tooltipMessage-Dbi1kkfi.js');
|
|
7
7
|
let _mui_material_CssBaseline = require("@mui/material/CssBaseline");
|
|
8
8
|
_mui_material_CssBaseline = require_state.__toESM(_mui_material_CssBaseline);
|
|
@@ -50,6 +50,8 @@ _mui_material_DialogTitle = require_state.__toESM(_mui_material_DialogTitle);
|
|
|
50
50
|
let _mui_material_IconButton = require("@mui/material/IconButton");
|
|
51
51
|
_mui_material_IconButton = require_state.__toESM(_mui_material_IconButton);
|
|
52
52
|
let react_icons_io5 = require("react-icons/io5");
|
|
53
|
+
let next_link = require("next/link");
|
|
54
|
+
next_link = require_state.__toESM(next_link);
|
|
53
55
|
let _mui_material_Checkbox = require("@mui/material/Checkbox");
|
|
54
56
|
_mui_material_Checkbox = require_state.__toESM(_mui_material_Checkbox);
|
|
55
57
|
let _mui_material_FormControlLabel = require("@mui/material/FormControlLabel");
|
|
@@ -63,8 +65,10 @@ _mui_material_MenuItem = require_state.__toESM(_mui_material_MenuItem);
|
|
|
63
65
|
let react_icons_vsc = require("react-icons/vsc");
|
|
64
66
|
let _mui_material_Tooltip = require("@mui/material/Tooltip");
|
|
65
67
|
_mui_material_Tooltip = require_state.__toESM(_mui_material_Tooltip);
|
|
68
|
+
let usehooks_ts = require("usehooks-ts");
|
|
66
69
|
let _mui_material_ListSubheader = require("@mui/material/ListSubheader");
|
|
67
70
|
_mui_material_ListSubheader = require_state.__toESM(_mui_material_ListSubheader);
|
|
71
|
+
let next_navigation = require("next/navigation");
|
|
68
72
|
let _mui_material_Link = require("@mui/material/Link");
|
|
69
73
|
_mui_material_Link = require_state.__toESM(_mui_material_Link);
|
|
70
74
|
let _mui_material_Popover = require("@mui/material/Popover");
|
|
@@ -1351,9 +1355,9 @@ var require_embed_resources = /* @__PURE__ */ require_state.__commonJSMin(((expo
|
|
|
1351
1355
|
var preferredFontFormat = _a.preferredFontFormat;
|
|
1352
1356
|
return !preferredFontFormat ? str : str.replace(FONT_SRC_REGEX, function(match) {
|
|
1353
1357
|
while (true) {
|
|
1354
|
-
var _a$1 = URL_WITH_FORMAT_REGEX.exec(match) || [], src = _a$1[0], format$
|
|
1355
|
-
if (!format$
|
|
1356
|
-
if (format$
|
|
1358
|
+
var _a$1 = URL_WITH_FORMAT_REGEX.exec(match) || [], src = _a$1[0], format$4 = _a$1[2];
|
|
1359
|
+
if (!format$4) return "";
|
|
1360
|
+
if (format$4 === preferredFontFormat) return "src: ".concat(src, ";");
|
|
1357
1361
|
}
|
|
1358
1362
|
});
|
|
1359
1363
|
}
|
|
@@ -2288,7 +2292,7 @@ const getHTMLElementFromRef = (refCurrent) => {
|
|
|
2288
2292
|
};
|
|
2289
2293
|
const IGNORE_SCREENSHOT_CLASS = "ignore-screenshot";
|
|
2290
2294
|
const highlightBoxShadow = "rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px";
|
|
2291
|
-
function useCopyToClipboard({ renderLibrary = "html2canvas", imageType = "png", backgroundColor = null, boardEffect = true, shadowEffect = false, borderStyle = `solid 1px ${require_state.colors.neutral[300]}`, borderRadius = "10px", onSuccess, onError, ignoreElements }) {
|
|
2295
|
+
function useCopyToClipboard$1({ renderLibrary = "html2canvas", imageType = "png", backgroundColor = null, boardEffect = true, shadowEffect = false, borderStyle = `solid 1px ${require_state.colors.neutral[300]}`, borderRadius = "10px", onSuccess, onError, ignoreElements }) {
|
|
2292
2296
|
const [status, setStatus] = (0, react.useState)("idle");
|
|
2293
2297
|
const ref = (0, react.useRef)(null);
|
|
2294
2298
|
const { onOpen, setImgBlob, ImageDownloadModal } = useImageDownloadModal();
|
|
@@ -2389,7 +2393,7 @@ function useCopyToClipboard({ renderLibrary = "html2canvas", imageType = "png",
|
|
|
2389
2393
|
}
|
|
2390
2394
|
function useCopyToClipboardButton(options) {
|
|
2391
2395
|
const { successToast, failToast } = require_state.useClipBoardToast();
|
|
2392
|
-
const { isLoading, copyToClipboard, ImageDownloadModal, ref } = useCopyToClipboard({
|
|
2396
|
+
const { isLoading, copyToClipboard, ImageDownloadModal, ref } = useCopyToClipboard$1({
|
|
2393
2397
|
imageType: "png",
|
|
2394
2398
|
shadowEffect: true,
|
|
2395
2399
|
backgroundColor: options?.backgroundColor ?? require_state.colors.neutral[100],
|
|
@@ -2543,13 +2547,14 @@ function useImageDownloadModal() {
|
|
|
2543
2547
|
//#endregion
|
|
2544
2548
|
//#region recce-source/js/src/lib/hooks/useRun.tsx
|
|
2545
2549
|
const useRun = (runId) => {
|
|
2550
|
+
const { apiClient } = require_state.useApiConfig();
|
|
2546
2551
|
const [isRunning, setIsRunning] = (0, react.useState)(false);
|
|
2547
2552
|
const [aborting, setAborting] = (0, react.useState)(false);
|
|
2548
2553
|
const [, refetchRunsAggregated] = require_state.useRunsAggregated();
|
|
2549
2554
|
const { error, data: run } = (0, _tanstack_react_query.useQuery)({
|
|
2550
2555
|
queryKey: require_state.cacheKeys.run(runId ?? ""),
|
|
2551
2556
|
queryFn: async () => {
|
|
2552
|
-
return await require_state.waitRun(runId ?? "", isRunning ? 2 : 0);
|
|
2557
|
+
return await require_state.waitRun(runId ?? "", isRunning ? 2 : 0, apiClient);
|
|
2553
2558
|
},
|
|
2554
2559
|
enabled: !!runId,
|
|
2555
2560
|
refetchInterval: isRunning ? 50 : false,
|
|
@@ -2573,8 +2578,8 @@ const useRun = (runId) => {
|
|
|
2573
2578
|
const onCancel = (0, react.useCallback)(async () => {
|
|
2574
2579
|
setAborting(true);
|
|
2575
2580
|
if (!runId) return;
|
|
2576
|
-
await require_state.cancelRun(runId);
|
|
2577
|
-
}, [runId]);
|
|
2581
|
+
await require_state.cancelRun(runId, apiClient);
|
|
2582
|
+
}, [runId, apiClient]);
|
|
2578
2583
|
let RunResultView;
|
|
2579
2584
|
if (run && require_state.runTypeHasRef(run.type)) RunResultView = require_state.findByRunType(run.type).RunResultView;
|
|
2580
2585
|
return {
|
|
@@ -4452,7 +4457,7 @@ const useLineageViewContextMenu = () => {
|
|
|
4452
4457
|
//#endregion
|
|
4453
4458
|
//#region recce-source/js/src/components/lineage/LineageViewNotification.tsx
|
|
4454
4459
|
function LineageViewNotification({ notification, type }) {
|
|
4455
|
-
const notificationKey =
|
|
4460
|
+
const notificationKey = require_version.sessionStorageKeys.lineageNotificationDismissed;
|
|
4456
4461
|
const [visible, setVisible] = (0, react.useState)(() => {
|
|
4457
4462
|
return sessionStorage.getItem(notificationKey) !== "true";
|
|
4458
4463
|
});
|
|
@@ -6312,6 +6317,7 @@ const QueryForm = ({ defaultPrimaryKeys, onPrimaryKeysChange, ...props }) => {
|
|
|
6312
6317
|
//#region recce-source/js/src/components/AuthModal/AuthModal.tsx
|
|
6313
6318
|
function AuthModal({ handleParentClose, parentOpen = false, ignoreCookie = false, variant = "auth" }) {
|
|
6314
6319
|
const { authed } = require_state.useRecceInstanceContext();
|
|
6320
|
+
const { apiClient } = require_state.useApiConfig();
|
|
6315
6321
|
const [open, setOpen] = (0, react.useState)(parentOpen || !authed);
|
|
6316
6322
|
const authStateCookieValue = js_cookie.default.get("authState") ?? "pending";
|
|
6317
6323
|
const [authState, setAuthState] = (0, react.useState)(ignoreCookie ? "pending" : authStateCookieValue);
|
|
@@ -6394,7 +6400,7 @@ function AuthModal({ handleParentClose, parentOpen = false, ignoreCookie = false
|
|
|
6394
6400
|
},
|
|
6395
6401
|
onClick: async () => {
|
|
6396
6402
|
setAuthState("authenticating");
|
|
6397
|
-
const { connection_url } = await
|
|
6403
|
+
const { connection_url } = await require_version.connectToCloud(apiClient);
|
|
6398
6404
|
window.open(connection_url, "_blank");
|
|
6399
6405
|
},
|
|
6400
6406
|
children: [
|
|
@@ -7080,6 +7086,7 @@ function AddToCheckButton({ runId, viewOptions }) {
|
|
|
7080
7086
|
const { error, run } = useRun(runId);
|
|
7081
7087
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
7082
7088
|
const [, setLocation] = require_state.useAppLocation();
|
|
7089
|
+
const { apiClient } = require_state.useApiConfig();
|
|
7083
7090
|
const checkId = run?.check_id;
|
|
7084
7091
|
const handleGoToCheck = (0, react.useCallback)(() => {
|
|
7085
7092
|
if (!checkId) return;
|
|
@@ -7087,14 +7094,15 @@ function AddToCheckButton({ runId, viewOptions }) {
|
|
|
7087
7094
|
}, [checkId, setLocation]);
|
|
7088
7095
|
const handleAddToChecklist = (0, react.useCallback)(async () => {
|
|
7089
7096
|
if (!runId) return;
|
|
7090
|
-
const check = await require_state.createCheckByRun(runId, viewOptions);
|
|
7097
|
+
const check = await require_state.createCheckByRun(runId, viewOptions, apiClient);
|
|
7091
7098
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
7092
7099
|
setLocation(`/checks/?id=${check.check_id}`);
|
|
7093
7100
|
}, [
|
|
7094
7101
|
runId,
|
|
7095
7102
|
setLocation,
|
|
7096
7103
|
queryClient,
|
|
7097
|
-
viewOptions
|
|
7104
|
+
viewOptions,
|
|
7105
|
+
apiClient
|
|
7098
7106
|
]);
|
|
7099
7107
|
if (featureToggles.disableUpdateChecklist) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {});
|
|
7100
7108
|
if (run?.check_id) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
@@ -7252,15 +7260,16 @@ function SandboxView({ isOpen, onClose, current }) {
|
|
|
7252
7260
|
const { showRunId, clearRunResult } = require_state.useRecceActionContext();
|
|
7253
7261
|
const { primaryKeys, setPrimaryKeys } = require_RecceCheckContext.useRecceQueryContext();
|
|
7254
7262
|
const { data: flags, isLoading } = require_state.useRecceServerFlag();
|
|
7263
|
+
const { apiClient } = require_state.useApiConfig();
|
|
7255
7264
|
const queryFn = async () => {
|
|
7256
7265
|
const sqlTemplate = modifiedCode;
|
|
7257
7266
|
const { run_id } = await require_state.submitQueryDiff({
|
|
7258
7267
|
current_model: current?.name ?? "",
|
|
7259
7268
|
primary_keys: primaryKeys,
|
|
7260
7269
|
sql_template: sqlTemplate
|
|
7261
|
-
}, { nowait: true });
|
|
7270
|
+
}, { nowait: true }, apiClient);
|
|
7262
7271
|
showRunId(run_id);
|
|
7263
|
-
return await require_state.waitRun(run_id);
|
|
7272
|
+
return await require_state.waitRun(run_id, void 0, apiClient);
|
|
7264
7273
|
};
|
|
7265
7274
|
const { mutate: runQuery, isPending } = (0, _tanstack_react_query.useMutation)({
|
|
7266
7275
|
mutationFn: queryFn,
|
|
@@ -7286,7 +7295,7 @@ function SandboxView({ isOpen, onClose, current }) {
|
|
|
7286
7295
|
}
|
|
7287
7296
|
});
|
|
7288
7297
|
const { feedbackToast, closeToast } = useFeedbackCollectionToast({
|
|
7289
|
-
feedbackId:
|
|
7298
|
+
feedbackId: require_version.localStorageKeys.previewChangeFeedbackID,
|
|
7290
7299
|
description: "Enjoy preview change?",
|
|
7291
7300
|
onFeedbackSubmit: (feedback) => {
|
|
7292
7301
|
switch (feedback) {
|
|
@@ -7315,7 +7324,7 @@ function SandboxView({ isOpen, onClose, current }) {
|
|
|
7315
7324
|
externalLinkText: "Give us feedback"
|
|
7316
7325
|
});
|
|
7317
7326
|
const { guideToast: prepareEnvToast, closeGuideToast } = useGuideToast({
|
|
7318
|
-
guideId:
|
|
7327
|
+
guideId: require_version.localStorageKeys.prepareEnvGuideID,
|
|
7319
7328
|
description: "Want to compare data changes with production data?",
|
|
7320
7329
|
externalLink: "https://docs.datarecce.io/get-started/#prepare-dbt-artifacts",
|
|
7321
7330
|
externalLinkText: "Learn how.",
|
|
@@ -7738,12 +7747,17 @@ function ExploreChangeMenuButton({ node, baseColumns, currentColumns, disableRea
|
|
|
7738
7747
|
const { envInfo, isActionAvailable } = require_state.useLineageGraphContext();
|
|
7739
7748
|
const { featureToggles } = require_state.useRecceInstanceContext();
|
|
7740
7749
|
const { primaryKey } = require_state.useModelColumns_default(node.data.name);
|
|
7750
|
+
const { apiClient } = require_state.useApiConfig();
|
|
7741
7751
|
const metadataOnly = featureToggles.mode === "metadata only";
|
|
7742
7752
|
const isAddedOrRemoved = node.data.changeStatus === "added" || node.data.changeStatus === "removed";
|
|
7743
7753
|
const addSchemaCheck = (0, react.useCallback)(async () => {
|
|
7744
7754
|
const nodeId = node.id;
|
|
7745
|
-
setLocation(`/checks/?id=${(await
|
|
7746
|
-
}, [
|
|
7755
|
+
setLocation(`/checks/?id=${(await require_version.createSchemaDiffCheck({ node_id: nodeId }, apiClient)).check_id}`);
|
|
7756
|
+
}, [
|
|
7757
|
+
node,
|
|
7758
|
+
setLocation,
|
|
7759
|
+
apiClient
|
|
7760
|
+
]);
|
|
7747
7761
|
const formattedColumns = formatSelectColumns(baseColumns, currentColumns);
|
|
7748
7762
|
let query = `select * from {{ ref("${node.data.name}") }}`;
|
|
7749
7763
|
if (formattedColumns.length) query = `select \n ${formattedColumns.join("\n ")}\nfrom {{ ref("${node.data.name}") }}`;
|
|
@@ -8210,6 +8224,7 @@ const initValue = {
|
|
|
8210
8224
|
actions: {}
|
|
8211
8225
|
};
|
|
8212
8226
|
const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onActionCompleted }) => {
|
|
8227
|
+
const { apiClient } = require_state.useApiConfig();
|
|
8213
8228
|
const actionState = (0, react.useRef)({ ...initValue }).current;
|
|
8214
8229
|
const { showRunId } = require_state.useRecceActionContext();
|
|
8215
8230
|
const submitRunForNodes = async (type, skip, getParams) => {
|
|
@@ -8239,12 +8254,12 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
|
|
|
8239
8254
|
}
|
|
8240
8255
|
const params = getParams(candidates);
|
|
8241
8256
|
try {
|
|
8242
|
-
const { run_id } = await require_state.submitRun(type, params, { nowait: true });
|
|
8257
|
+
const { run_id } = await require_state.submitRun(type, params, { nowait: true }, apiClient);
|
|
8243
8258
|
showRunId(run_id);
|
|
8244
8259
|
actionState.currentRun = { run_id };
|
|
8245
8260
|
actionState.total = 1;
|
|
8246
8261
|
for (;;) {
|
|
8247
|
-
const run = await require_state.waitRun(run_id, 2);
|
|
8262
|
+
const run = await require_state.waitRun(run_id, 2, apiClient);
|
|
8248
8263
|
actionState.currentRun = run;
|
|
8249
8264
|
const status = run.error ? "failure" : run.result ? "success" : "running";
|
|
8250
8265
|
for (const node of candidates) {
|
|
@@ -8293,7 +8308,7 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
|
|
|
8293
8308
|
};
|
|
8294
8309
|
onActionNodeUpdated(node);
|
|
8295
8310
|
} else try {
|
|
8296
|
-
const { run_id } = await require_state.submitRun(type, params, { nowait: true });
|
|
8311
|
+
const { run_id } = await require_state.submitRun(type, params, { nowait: true }, apiClient);
|
|
8297
8312
|
actionState.currentRun = { run_id };
|
|
8298
8313
|
actions[node.id] = {
|
|
8299
8314
|
mode,
|
|
@@ -8301,7 +8316,7 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
|
|
|
8301
8316
|
};
|
|
8302
8317
|
onActionNodeUpdated(node);
|
|
8303
8318
|
for (;;) {
|
|
8304
|
-
const run = await require_state.waitRun(run_id, 2);
|
|
8319
|
+
const run = await require_state.waitRun(run_id, 2, apiClient);
|
|
8305
8320
|
actionState.currentRun = run;
|
|
8306
8321
|
const status = run.error ? "failure" : run.result ? "success" : "running";
|
|
8307
8322
|
actions[node.id] = {
|
|
@@ -8387,17 +8402,17 @@ const useMultiNodesAction = (nodes, { onActionStarted, onActionNodeUpdated, onAc
|
|
|
8387
8402
|
});
|
|
8388
8403
|
};
|
|
8389
8404
|
const addLineageDiffCheck = async () => {
|
|
8390
|
-
return await require_state.createLineageDiffCheck({ node_ids: nodes.map((node) => node.id) });
|
|
8405
|
+
return await require_state.createLineageDiffCheck({ node_ids: nodes.map((node) => node.id) }, apiClient);
|
|
8391
8406
|
};
|
|
8392
8407
|
const addSchemaDiffCheck = async () => {
|
|
8393
8408
|
let check;
|
|
8394
|
-
if (nodes.length === 1) check = await
|
|
8395
|
-
else check = await
|
|
8409
|
+
if (nodes.length === 1) check = await require_version.createSchemaDiffCheck({ node_id: nodes[0].id }, apiClient);
|
|
8410
|
+
else check = await require_version.createSchemaDiffCheck({ node_id: nodes.map((node) => node.id) }, apiClient);
|
|
8396
8411
|
return check;
|
|
8397
8412
|
};
|
|
8398
8413
|
const cancel = async () => {
|
|
8399
8414
|
actionState.status = "canceling";
|
|
8400
|
-
if (actionState.currentRun?.run_id) await require_state.cancelRun(actionState.currentRun.run_id);
|
|
8415
|
+
if (actionState.currentRun?.run_id) await require_state.cancelRun(actionState.currentRun.run_id, apiClient);
|
|
8401
8416
|
};
|
|
8402
8417
|
const reset = () => {
|
|
8403
8418
|
Object.assign(actionState, initValue);
|
|
@@ -8460,10 +8475,11 @@ const useNavToCheck = () => {
|
|
|
8460
8475
|
};
|
|
8461
8476
|
function PrivateLineageView({ interactive = false, ...props }, ref) {
|
|
8462
8477
|
const { isDark } = useThemeColors();
|
|
8478
|
+
const { apiClient } = require_state.useApiConfig();
|
|
8463
8479
|
const reactFlow = (0, _xyflow_react.useReactFlow)();
|
|
8464
8480
|
const refResize = (0, react.useRef)(null);
|
|
8465
8481
|
const { successToast, failToast } = require_state.useClipBoardToast();
|
|
8466
|
-
const { copyToClipboard, ImageDownloadModal, ref: refReactFlow } = useCopyToClipboard({
|
|
8482
|
+
const { copyToClipboard, ImageDownloadModal, ref: refReactFlow } = useCopyToClipboard$1({
|
|
8467
8483
|
renderLibrary: "html-to-image",
|
|
8468
8484
|
imageType: "png",
|
|
8469
8485
|
shadowEffect: true,
|
|
@@ -8507,7 +8523,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
|
|
|
8507
8523
|
}, []);
|
|
8508
8524
|
const cllHistory = (0, react.useRef)([]).current;
|
|
8509
8525
|
const [cll, setCll] = (0, react.useState)(void 0);
|
|
8510
|
-
const actionGetCll = (0, _tanstack_react_query.useMutation)({ mutationFn: require_state.getCll });
|
|
8526
|
+
const actionGetCll = (0, _tanstack_react_query.useMutation)({ mutationFn: (input) => require_state.getCll(input, apiClient) });
|
|
8511
8527
|
const [nodeColumnSetMap, setNodeColumSetMap] = (0, react.useState)({});
|
|
8512
8528
|
const findNodeByName = (0, react.useCallback)((name) => {
|
|
8513
8529
|
return nodes.filter(require_state.isLineageGraphNode).find((n) => n.data.name === name);
|
|
@@ -8605,20 +8621,20 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
|
|
|
8605
8621
|
...props.viewOptions
|
|
8606
8622
|
};
|
|
8607
8623
|
try {
|
|
8608
|
-
filteredNodeIds$1 = (await
|
|
8624
|
+
filteredNodeIds$1 = (await require_version.select({
|
|
8609
8625
|
select: newViewOptions.select,
|
|
8610
8626
|
exclude: newViewOptions.exclude,
|
|
8611
8627
|
packages: newViewOptions.packages,
|
|
8612
8628
|
view_mode: newViewOptions.view_mode
|
|
8613
|
-
})).nodes;
|
|
8629
|
+
}, apiClient)).nodes;
|
|
8614
8630
|
} catch (_$1) {
|
|
8615
8631
|
newViewOptions.view_mode = "all";
|
|
8616
|
-
filteredNodeIds$1 = (await
|
|
8632
|
+
filteredNodeIds$1 = (await require_version.select({
|
|
8617
8633
|
select: newViewOptions.select,
|
|
8618
8634
|
exclude: newViewOptions.exclude,
|
|
8619
8635
|
packages: newViewOptions.packages,
|
|
8620
8636
|
view_mode: newViewOptions.view_mode
|
|
8621
|
-
})).nodes;
|
|
8637
|
+
}, apiClient)).nodes;
|
|
8622
8638
|
}
|
|
8623
8639
|
setViewOptions(newViewOptions);
|
|
8624
8640
|
}
|
|
@@ -8734,12 +8750,12 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
|
|
|
8734
8750
|
if (!lineageGraph) return;
|
|
8735
8751
|
if (viewOptions.select !== newViewOptions.select || viewOptions.exclude !== newViewOptions.exclude || viewOptions.packages !== newViewOptions.packages || viewOptions.view_mode !== newViewOptions.view_mode) {
|
|
8736
8752
|
try {
|
|
8737
|
-
const result = await
|
|
8753
|
+
const result = await require_version.select({
|
|
8738
8754
|
select: newViewOptions.select,
|
|
8739
8755
|
exclude: newViewOptions.exclude,
|
|
8740
8756
|
packages: newViewOptions.packages,
|
|
8741
8757
|
view_mode: newViewOptions.view_mode
|
|
8742
|
-
});
|
|
8758
|
+
}, apiClient);
|
|
8743
8759
|
newViewOptions = {
|
|
8744
8760
|
...newViewOptions,
|
|
8745
8761
|
column_level_lineage: void 0
|
|
@@ -9021,7 +9037,7 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
|
|
|
9021
9037
|
selected: "multi"
|
|
9022
9038
|
});
|
|
9023
9039
|
} else if (!focusedNode) {
|
|
9024
|
-
check = await require_state.createLineageDiffCheck(viewOptions);
|
|
9040
|
+
check = await require_state.createLineageDiffCheck(viewOptions, apiClient);
|
|
9025
9041
|
require_state.trackMultiNodesAction({
|
|
9026
9042
|
type: "lineage_diff",
|
|
9027
9043
|
selected: "none"
|
|
@@ -9041,18 +9057,18 @@ function PrivateLineageView({ interactive = false, ...props }, ref) {
|
|
|
9041
9057
|
});
|
|
9042
9058
|
}
|
|
9043
9059
|
} else if (focusedNode) {
|
|
9044
|
-
check = await
|
|
9060
|
+
check = await require_version.createSchemaDiffCheck({ node_id: focusedNode.id }, apiClient);
|
|
9045
9061
|
require_state.trackMultiNodesAction({
|
|
9046
9062
|
type: "schema_diff",
|
|
9047
9063
|
selected: "single"
|
|
9048
9064
|
});
|
|
9049
9065
|
} else {
|
|
9050
|
-
check = await
|
|
9066
|
+
check = await require_version.createSchemaDiffCheck({
|
|
9051
9067
|
select: viewOptions.select,
|
|
9052
9068
|
exclude: viewOptions.exclude,
|
|
9053
9069
|
packages: viewOptions.packages,
|
|
9054
9070
|
view_mode: viewOptions.view_mode
|
|
9055
|
-
});
|
|
9071
|
+
}, apiClient);
|
|
9056
9072
|
require_state.trackMultiNodesAction({
|
|
9057
9073
|
type: "schema_diff",
|
|
9058
9074
|
selected: "none"
|
|
@@ -9388,6 +9404,7 @@ const QueryPage = () => {
|
|
|
9388
9404
|
if (envInfo?.adapterType === "sqlmesh" && _sqlQuery === require_RecceCheckContext.defaultSqlQuery) sqlQuery = `select * from db.mymodel`;
|
|
9389
9405
|
if (featureToggles.mode === "read only") sqlQuery = `--- Would like to do query here? Book a demo with us at ${require_urls.RECCE_SUPPORT_CALENDAR_URL}\n${sqlQuery}`;
|
|
9390
9406
|
const { showRunId } = require_state.useRecceActionContext();
|
|
9407
|
+
const { apiClient } = require_state.useApiConfig();
|
|
9391
9408
|
const queryFn = async (type) => {
|
|
9392
9409
|
function queryFactory(type$1) {
|
|
9393
9410
|
switch (type$1) {
|
|
@@ -9405,9 +9422,9 @@ const QueryPage = () => {
|
|
|
9405
9422
|
params.primary_keys = primaryKeys;
|
|
9406
9423
|
if (isCustomQueries) params.base_sql_template = baseSqlQuery;
|
|
9407
9424
|
}
|
|
9408
|
-
const { run_id } = await runFn(params, options);
|
|
9425
|
+
const { run_id } = await runFn(params, options, apiClient);
|
|
9409
9426
|
showRunId(run_id);
|
|
9410
|
-
return await require_state.waitRun(run_id);
|
|
9427
|
+
return await require_state.waitRun(run_id, void 0, apiClient);
|
|
9411
9428
|
};
|
|
9412
9429
|
const { mutate: runQuery, isPending } = (0, _tanstack_react_query.useMutation)({ mutationFn: queryFn });
|
|
9413
9430
|
const currentSchema = (0, react.useMemo)(() => {
|
|
@@ -9562,9 +9579,10 @@ const ChecklistItem = ({ check, selected, onSelect, onMarkAsApproved }) => {
|
|
|
9562
9579
|
const isDark = (0, _mui_material_styles.useTheme)().palette.mode === "dark";
|
|
9563
9580
|
const { featureToggles } = require_state.useRecceInstanceContext();
|
|
9564
9581
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
9582
|
+
const { apiClient } = require_state.useApiConfig();
|
|
9565
9583
|
const checkId = check.check_id;
|
|
9566
9584
|
const { mutate } = (0, _tanstack_react_query.useMutation)({
|
|
9567
|
-
mutationFn: (check$1) => require_state.updateCheck(checkId, check$1),
|
|
9585
|
+
mutationFn: (check$1) => require_state.updateCheck(checkId, check$1, apiClient),
|
|
9568
9586
|
onSuccess: async () => {
|
|
9569
9587
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
|
|
9570
9588
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
@@ -9636,8 +9654,9 @@ const CheckList = ({ checks, selectedItem, onCheckSelected, onChecksReordered })
|
|
|
9636
9654
|
const [open, setOpen] = (0, react.useState)(false);
|
|
9637
9655
|
const [pendingApprovalCheckId, setPendingApprovalCheckId] = (0, react.useState)(null);
|
|
9638
9656
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
9657
|
+
const { apiClient } = require_state.useApiConfig();
|
|
9639
9658
|
const { mutate: markCheckedByID } = (0, _tanstack_react_query.useMutation)({
|
|
9640
|
-
mutationFn: (checkId) => require_state.updateCheck(checkId, { is_checked: true }),
|
|
9659
|
+
mutationFn: (checkId) => require_state.updateCheck(checkId, { is_checked: true }, apiClient),
|
|
9641
9660
|
onSuccess: async (_$1, checkId) => {
|
|
9642
9661
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
|
|
9643
9662
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
@@ -9794,20 +9813,22 @@ const CheckList = ({ checks, selectedItem, onCheckSelected, onChecksReordered })
|
|
|
9794
9813
|
* List all events for a check in chronological order.
|
|
9795
9814
|
*
|
|
9796
9815
|
* @param checkId - The check ID
|
|
9816
|
+
* @param client - Optional axios instance for API configuration
|
|
9797
9817
|
* @returns Promise resolving to array of CheckEvent objects
|
|
9798
9818
|
*/
|
|
9799
|
-
async function listCheckEvents(checkId) {
|
|
9800
|
-
return (await
|
|
9819
|
+
async function listCheckEvents(checkId, client = require_state.axiosClient) {
|
|
9820
|
+
return (await client.get(`/api/checks/${checkId}/events`)).data;
|
|
9801
9821
|
}
|
|
9802
9822
|
/**
|
|
9803
9823
|
* Create a new comment on a check.
|
|
9804
9824
|
*
|
|
9805
9825
|
* @param checkId - The check ID
|
|
9806
9826
|
* @param content - The comment content (plain text for now, markdown later)
|
|
9827
|
+
* @param client - Optional axios instance for API configuration
|
|
9807
9828
|
* @returns Promise resolving to the created CheckEvent
|
|
9808
9829
|
*/
|
|
9809
|
-
async function createComment(checkId, content) {
|
|
9810
|
-
return (await
|
|
9830
|
+
async function createComment(checkId, content, client = require_state.axiosClient) {
|
|
9831
|
+
return (await client.post(`/api/checks/${checkId}/events`, { content })).data;
|
|
9811
9832
|
}
|
|
9812
9833
|
/**
|
|
9813
9834
|
* Update an existing comment.
|
|
@@ -9816,10 +9837,11 @@ async function createComment(checkId, content) {
|
|
|
9816
9837
|
* @param checkId - The check ID
|
|
9817
9838
|
* @param eventId - The event ID of the comment to update
|
|
9818
9839
|
* @param content - The new comment content
|
|
9840
|
+
* @param client - Optional axios instance for API configuration
|
|
9819
9841
|
* @returns Promise resolving to the updated CheckEvent
|
|
9820
9842
|
*/
|
|
9821
|
-
async function updateComment(checkId, eventId, content) {
|
|
9822
|
-
return (await
|
|
9843
|
+
async function updateComment(checkId, eventId, content, client = require_state.axiosClient) {
|
|
9844
|
+
return (await client.patch(`/api/checks/${checkId}/events/${eventId}`, { content })).data;
|
|
9823
9845
|
}
|
|
9824
9846
|
/**
|
|
9825
9847
|
* Delete a comment (soft delete).
|
|
@@ -9827,10 +9849,11 @@ async function updateComment(checkId, eventId, content) {
|
|
|
9827
9849
|
*
|
|
9828
9850
|
* @param checkId - The check ID
|
|
9829
9851
|
* @param eventId - The event ID of the comment to delete
|
|
9852
|
+
* @param client - Optional axios instance for API configuration
|
|
9830
9853
|
* @returns Promise resolving when deletion is complete
|
|
9831
9854
|
*/
|
|
9832
|
-
async function deleteComment(checkId, eventId) {
|
|
9833
|
-
await
|
|
9855
|
+
async function deleteComment(checkId, eventId, client = require_state.axiosClient) {
|
|
9856
|
+
await client.delete(`/api/checks/${checkId}/events/${eventId}`);
|
|
9834
9857
|
}
|
|
9835
9858
|
/**
|
|
9836
9859
|
* Get the appropriate icon name for an event type.
|
|
@@ -9860,27 +9883,28 @@ const POLLING_INTERVAL = 1e4;
|
|
|
9860
9883
|
function useCheckEvents(checkId, options = {}) {
|
|
9861
9884
|
const { enabled = true } = options;
|
|
9862
9885
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
9886
|
+
const { apiClient } = require_state.useApiConfig();
|
|
9863
9887
|
const { data: events, isLoading, error, refetch } = (0, _tanstack_react_query.useQuery)({
|
|
9864
9888
|
queryKey: require_state.cacheKeys.checkEvents(checkId),
|
|
9865
|
-
queryFn: () => listCheckEvents(checkId),
|
|
9889
|
+
queryFn: () => listCheckEvents(checkId, apiClient),
|
|
9866
9890
|
enabled,
|
|
9867
9891
|
refetchInterval: POLLING_INTERVAL,
|
|
9868
9892
|
refetchIntervalInBackground: false
|
|
9869
9893
|
});
|
|
9870
9894
|
const createCommentMutation = (0, _tanstack_react_query.useMutation)({
|
|
9871
|
-
mutationFn: (content) => createComment(checkId, content),
|
|
9895
|
+
mutationFn: (content) => createComment(checkId, content, apiClient),
|
|
9872
9896
|
onSuccess: async () => {
|
|
9873
9897
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checkEvents(checkId) });
|
|
9874
9898
|
}
|
|
9875
9899
|
});
|
|
9876
9900
|
const updateCommentMutation = (0, _tanstack_react_query.useMutation)({
|
|
9877
|
-
mutationFn: ({ eventId, content }) => updateComment(checkId, eventId, content),
|
|
9901
|
+
mutationFn: ({ eventId, content }) => updateComment(checkId, eventId, content, apiClient),
|
|
9878
9902
|
onSuccess: async () => {
|
|
9879
9903
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checkEvents(checkId) });
|
|
9880
9904
|
}
|
|
9881
9905
|
});
|
|
9882
9906
|
const deleteCommentMutation = (0, _tanstack_react_query.useMutation)({
|
|
9883
|
-
mutationFn: (eventId) => deleteComment(checkId, eventId),
|
|
9907
|
+
mutationFn: (eventId) => deleteComment(checkId, eventId, apiClient),
|
|
9884
9908
|
onSuccess: async () => {
|
|
9885
9909
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checkEvents(checkId) });
|
|
9886
9910
|
}
|
|
@@ -10391,7 +10415,7 @@ function UserAvatar({ event }) {
|
|
|
10391
10415
|
const userId = actor.user_id?.toString();
|
|
10392
10416
|
const { data: avatarUrl } = (0, _tanstack_react_query.useQuery)({
|
|
10393
10417
|
queryKey: ["github-avatar", userId],
|
|
10394
|
-
queryFn: () => userId ?
|
|
10418
|
+
queryFn: () => userId ? require_version.fetchGitHubAvatar(userId) : Promise.resolve(null),
|
|
10395
10419
|
enabled: !!userId,
|
|
10396
10420
|
retry: false,
|
|
10397
10421
|
staleTime: 300 * 1e3
|
|
@@ -10737,10 +10761,11 @@ function TimelineEvent({ event, currentUserId, onEdit, onDelete }) {
|
|
|
10737
10761
|
*/
|
|
10738
10762
|
function CheckTimeline({ checkId }) {
|
|
10739
10763
|
const isDark = (0, _mui_material_styles.useTheme)().palette.mode === "dark";
|
|
10764
|
+
const { apiClient } = require_state.useApiConfig();
|
|
10740
10765
|
const { events, isLoading, error, createComment: createComment$1, isCreatingComment, updateComment: updateComment$1, deleteComment: deleteComment$1 } = useCheckEvents(checkId);
|
|
10741
10766
|
const { data: currentUser } = (0, _tanstack_react_query.useQuery)({
|
|
10742
10767
|
queryKey: require_state.cacheKeys.user(),
|
|
10743
|
-
queryFn:
|
|
10768
|
+
queryFn: () => require_version.fetchUser(apiClient),
|
|
10744
10769
|
retry: false
|
|
10745
10770
|
});
|
|
10746
10771
|
const handleCreateComment = (content) => {
|
|
@@ -11125,16 +11150,17 @@ const NodelistItem = ({ node, selected, onSelect, schemaChanged, isDark }) => {
|
|
|
11125
11150
|
};
|
|
11126
11151
|
function PrivateSchemaDiffView({ check }, ref) {
|
|
11127
11152
|
const isDark = (0, _mui_material_styles.useTheme)().palette.mode === "dark";
|
|
11153
|
+
const { apiClient } = require_state.useApiConfig();
|
|
11128
11154
|
const { lineageGraph } = require_state.useLineageGraphContext();
|
|
11129
11155
|
const params = check.params;
|
|
11130
11156
|
const { isLoading, error, data } = (0, _tanstack_react_query.useQuery)({
|
|
11131
11157
|
queryKey: [...require_state.cacheKeys.check(check.check_id), "select"],
|
|
11132
|
-
queryFn: async () =>
|
|
11158
|
+
queryFn: async () => require_version.select({
|
|
11133
11159
|
select: params.select,
|
|
11134
11160
|
exclude: params.exclude,
|
|
11135
11161
|
packages: params.packages,
|
|
11136
11162
|
view_mode: params.view_mode
|
|
11137
|
-
}),
|
|
11163
|
+
}, apiClient),
|
|
11138
11164
|
refetchOnMount: true,
|
|
11139
11165
|
enabled: !params.node_id
|
|
11140
11166
|
});
|
|
@@ -11246,6 +11272,7 @@ const SchemaDiffView = (0, react.forwardRef)(PrivateSchemaDiffView);
|
|
|
11246
11272
|
function CheckDetail({ checkId, refreshCheckList }) {
|
|
11247
11273
|
const theme = (0, _mui_material_styles.useTheme)();
|
|
11248
11274
|
const isDark = theme.palette.mode === "dark";
|
|
11275
|
+
const { apiClient } = require_state.useApiConfig();
|
|
11249
11276
|
const { featureToggles, sessionId } = require_state.useRecceInstanceContext();
|
|
11250
11277
|
const { setLatestSelectedCheckId } = require_RecceCheckContext.useRecceCheckContext();
|
|
11251
11278
|
const { cloudMode } = require_state.useLineageGraphContext();
|
|
@@ -11261,7 +11288,7 @@ function CheckDetail({ checkId, refreshCheckList }) {
|
|
|
11261
11288
|
const menuOpen = Boolean(menuAnchorEl);
|
|
11262
11289
|
const { isLoading, error, data: check } = (0, _tanstack_react_query.useQuery)({
|
|
11263
11290
|
queryKey: require_state.cacheKeys.check(checkId),
|
|
11264
|
-
queryFn: async () => require_state.getCheck(checkId),
|
|
11291
|
+
queryFn: async () => require_state.getCheck(checkId, apiClient),
|
|
11265
11292
|
refetchOnMount: true
|
|
11266
11293
|
});
|
|
11267
11294
|
const trackedRunId = submittedRunId ?? check?.last_run?.run_id;
|
|
@@ -11273,14 +11300,14 @@ function CheckDetail({ checkId, refreshCheckList }) {
|
|
|
11273
11300
|
const isPresetCheck = check?.is_preset ?? false;
|
|
11274
11301
|
const lineageViewRef = (0, react.useRef)(null);
|
|
11275
11302
|
const { mutate } = (0, _tanstack_react_query.useMutation)({
|
|
11276
|
-
mutationFn: (check$1) => require_state.updateCheck(checkId, check$1),
|
|
11303
|
+
mutationFn: (check$1) => require_state.updateCheck(checkId, check$1, apiClient),
|
|
11277
11304
|
onSuccess: async () => {
|
|
11278
11305
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
|
|
11279
11306
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
11280
11307
|
}
|
|
11281
11308
|
});
|
|
11282
11309
|
const { mutate: handleDelete } = (0, _tanstack_react_query.useMutation)({
|
|
11283
|
-
mutationFn: () => require_state.deleteCheck(checkId),
|
|
11310
|
+
mutationFn: () => require_state.deleteCheck(checkId, apiClient),
|
|
11284
11311
|
onSuccess: async () => {
|
|
11285
11312
|
setLatestSelectedCheckId("");
|
|
11286
11313
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
@@ -11290,7 +11317,7 @@ function CheckDetail({ checkId, refreshCheckList }) {
|
|
|
11290
11317
|
const { mutate: handleMarkAsPresetCheck, isPending: isMarkingAsPreset } = (0, _tanstack_react_query.useMutation)({
|
|
11291
11318
|
mutationFn: async () => {
|
|
11292
11319
|
if (!check) throw new Error("Check not found");
|
|
11293
|
-
return await require_state.markAsPresetCheck(checkId);
|
|
11320
|
+
return await require_state.markAsPresetCheck(checkId, apiClient);
|
|
11294
11321
|
},
|
|
11295
11322
|
onSuccess: async () => {
|
|
11296
11323
|
successToast("Check marked as preset successfully");
|
|
@@ -11302,20 +11329,21 @@ function CheckDetail({ checkId, refreshCheckList }) {
|
|
|
11302
11329
|
});
|
|
11303
11330
|
const handleRerun = (0, react.useCallback)(async () => {
|
|
11304
11331
|
if (!check?.type) return;
|
|
11305
|
-
setSubmittedRunId((await require_state.submitRunFromCheck(checkId, { nowait: true })).run_id);
|
|
11332
|
+
setSubmittedRunId((await require_state.submitRunFromCheck(checkId, { nowait: true }, apiClient)).run_id);
|
|
11306
11333
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.check(checkId) });
|
|
11307
11334
|
if (refreshCheckList) refreshCheckList();
|
|
11308
11335
|
}, [
|
|
11309
11336
|
check,
|
|
11310
11337
|
checkId,
|
|
11311
11338
|
queryClient,
|
|
11312
|
-
refreshCheckList
|
|
11339
|
+
refreshCheckList,
|
|
11340
|
+
apiClient
|
|
11313
11341
|
]);
|
|
11314
11342
|
const handleCancel = (0, react.useCallback)(async () => {
|
|
11315
11343
|
setAborting(true);
|
|
11316
11344
|
if (!trackedRunId) return;
|
|
11317
|
-
return await require_state.cancelRun(trackedRunId);
|
|
11318
|
-
}, [trackedRunId]);
|
|
11345
|
+
return await require_state.cancelRun(trackedRunId, apiClient);
|
|
11346
|
+
}, [trackedRunId, apiClient]);
|
|
11319
11347
|
const handleCopy = async () => {
|
|
11320
11348
|
if (!check) return;
|
|
11321
11349
|
const markdown = buildMarkdown(check);
|
|
@@ -11820,8 +11848,9 @@ function buildBody(check) {
|
|
|
11820
11848
|
const CheckEmptyState = () => {
|
|
11821
11849
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
11822
11850
|
const [, setLocation] = require_state.useAppLocation();
|
|
11851
|
+
const { apiClient } = require_state.useApiConfig();
|
|
11823
11852
|
const { mutate: createSchemaCheck, isPending } = (0, _tanstack_react_query.useMutation)({
|
|
11824
|
-
mutationFn: () =>
|
|
11853
|
+
mutationFn: () => require_version.createSchemaDiffCheck({ select: "state:modified" }, apiClient),
|
|
11825
11854
|
onSuccess: async (check) => {
|
|
11826
11855
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
11827
11856
|
setLocation(`/checks/?id=${check.check_id}`);
|
|
@@ -11904,9 +11933,10 @@ const CheckEmptyState = () => {
|
|
|
11904
11933
|
//#endregion
|
|
11905
11934
|
//#region recce-source/js/src/components/run/RunPage.tsx
|
|
11906
11935
|
const RunPage = ({ runId }) => {
|
|
11936
|
+
const { apiClient } = require_state.useApiConfig();
|
|
11907
11937
|
const { error, data: run } = (0, _tanstack_react_query.useQuery)({
|
|
11908
11938
|
queryKey: require_state.cacheKeys.run(runId),
|
|
11909
|
-
queryFn: async () => require_state.waitRun(runId)
|
|
11939
|
+
queryFn: async () => require_state.waitRun(runId, void 0, apiClient)
|
|
11910
11940
|
});
|
|
11911
11941
|
let RunResultView;
|
|
11912
11942
|
if (run && require_state.runTypeHasRef(run.type)) RunResultView = require_state.findByRunType(run.type).RunResultView;
|
|
@@ -11921,10 +11951,11 @@ const RunPage = ({ runId }) => {
|
|
|
11921
11951
|
//#region recce-source/js/src/components/run/RunList.tsx
|
|
11922
11952
|
const RunListItem = ({ run, isSelected, onSelectRun, onAddToChecklist, onGoToCheck }) => {
|
|
11923
11953
|
const { featureToggles } = require_state.useRecceInstanceContext();
|
|
11954
|
+
const { apiClient } = require_state.useApiConfig();
|
|
11924
11955
|
const { data: fetchedRun } = (0, _tanstack_react_query.useQuery)({
|
|
11925
11956
|
queryKey: require_state.cacheKeys.run(run.run_id),
|
|
11926
11957
|
queryFn: async () => {
|
|
11927
|
-
return await require_state.waitRun(run.run_id);
|
|
11958
|
+
return await require_state.waitRun(run.run_id, void 0, apiClient);
|
|
11928
11959
|
},
|
|
11929
11960
|
enabled: run.status === "running",
|
|
11930
11961
|
retry: false
|
|
@@ -12028,10 +12059,11 @@ const DateSegmentItem = ({ runAt }) => {
|
|
|
12028
12059
|
};
|
|
12029
12060
|
const RunList = () => {
|
|
12030
12061
|
const { closeHistory } = require_state.useRecceActionContext();
|
|
12062
|
+
const { apiClient } = require_state.useApiConfig();
|
|
12031
12063
|
const { data: runs, isLoading } = (0, _tanstack_react_query.useQuery)({
|
|
12032
12064
|
queryKey: require_state.cacheKeys.runs(),
|
|
12033
12065
|
queryFn: async () => {
|
|
12034
|
-
return await require_state.listRuns();
|
|
12066
|
+
return await require_state.listRuns(apiClient);
|
|
12035
12067
|
},
|
|
12036
12068
|
retry: false
|
|
12037
12069
|
});
|
|
@@ -12095,6 +12127,7 @@ const RunList = () => {
|
|
|
12095
12127
|
function DateDividedRunHistoryItem({ run, previousDate }) {
|
|
12096
12128
|
const [, setLocation] = require_state.useAppLocation();
|
|
12097
12129
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
12130
|
+
const { apiClient } = require_state.useApiConfig();
|
|
12098
12131
|
const { showRunId, runId } = require_state.useRecceActionContext();
|
|
12099
12132
|
const currentDate = new Date(run.run_at).toDateString();
|
|
12100
12133
|
const shouldRenderDateSegment = previousDate != null && previousDate !== currentDate;
|
|
@@ -12103,10 +12136,14 @@ function DateDividedRunHistoryItem({ run, previousDate }) {
|
|
|
12103
12136
|
showRunId(runId$1, false);
|
|
12104
12137
|
};
|
|
12105
12138
|
const handleAddToChecklist = (0, react.useCallback)(async (clickedRunId) => {
|
|
12106
|
-
const check = await require_state.createCheckByRun(clickedRunId);
|
|
12139
|
+
const check = await require_state.createCheckByRun(clickedRunId, void 0, apiClient);
|
|
12107
12140
|
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
12108
12141
|
setLocation(`/checks/?id=${check.check_id}`);
|
|
12109
|
-
}, [
|
|
12142
|
+
}, [
|
|
12143
|
+
setLocation,
|
|
12144
|
+
queryClient,
|
|
12145
|
+
apiClient
|
|
12146
|
+
]);
|
|
12110
12147
|
const handleGoToCheck = (0, react.useCallback)((checkId) => {
|
|
12111
12148
|
require_state.trackHistoryAction({ name: "go_to_check" });
|
|
12112
12149
|
setLocation(`/checks/?id=${checkId}`);
|
|
@@ -12471,6 +12508,125 @@ function SummaryView() {
|
|
|
12471
12508
|
}) });
|
|
12472
12509
|
}
|
|
12473
12510
|
|
|
12511
|
+
//#endregion
|
|
12512
|
+
//#region recce-source/js/src/components/app/AvatarDropdown.tsx
|
|
12513
|
+
function AvatarDropdown() {
|
|
12514
|
+
const { apiClient } = require_state.useApiConfig();
|
|
12515
|
+
const { data: user, isLoading, error } = (0, _tanstack_react_query.useQuery)({
|
|
12516
|
+
queryKey: require_state.cacheKeys.user(),
|
|
12517
|
+
queryFn: () => require_version.fetchUser(apiClient),
|
|
12518
|
+
retry: false
|
|
12519
|
+
});
|
|
12520
|
+
const { data: avatarUrl } = (0, _tanstack_react_query.useQuery)({
|
|
12521
|
+
queryKey: ["github-avatar", user?.id],
|
|
12522
|
+
queryFn: () => user ? require_version.fetchGitHubAvatar(user.id) : Promise.resolve(null),
|
|
12523
|
+
enabled: !!user?.id && user.login_type === "github",
|
|
12524
|
+
retry: false,
|
|
12525
|
+
staleTime: 300 * 1e3
|
|
12526
|
+
});
|
|
12527
|
+
const [anchorEl, setAnchorEl] = (0, react.useState)(null);
|
|
12528
|
+
const open = Boolean(anchorEl);
|
|
12529
|
+
const handleClick = (event) => {
|
|
12530
|
+
setAnchorEl(event.currentTarget);
|
|
12531
|
+
};
|
|
12532
|
+
const handleClose = () => {
|
|
12533
|
+
setAnchorEl(null);
|
|
12534
|
+
};
|
|
12535
|
+
const showUserInfo = !isLoading && !error && user;
|
|
12536
|
+
const getInitials = (name) => {
|
|
12537
|
+
if (!name) return "U";
|
|
12538
|
+
return name.charAt(0).toUpperCase();
|
|
12539
|
+
};
|
|
12540
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12541
|
+
onClick: handleClick,
|
|
12542
|
+
sx: {
|
|
12543
|
+
width: 32,
|
|
12544
|
+
height: 32,
|
|
12545
|
+
borderRadius: "50%",
|
|
12546
|
+
bgcolor: "background.paper",
|
|
12547
|
+
color: "primary.main",
|
|
12548
|
+
display: "flex",
|
|
12549
|
+
alignItems: "center",
|
|
12550
|
+
justifyContent: "center",
|
|
12551
|
+
cursor: "pointer"
|
|
12552
|
+
},
|
|
12553
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, { size: 16 })
|
|
12554
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Avatar.default, {
|
|
12555
|
+
onClick: handleClick,
|
|
12556
|
+
src: avatarUrl || void 0,
|
|
12557
|
+
sx: {
|
|
12558
|
+
width: 28,
|
|
12559
|
+
height: 28,
|
|
12560
|
+
cursor: "pointer",
|
|
12561
|
+
outline: "1px solid white",
|
|
12562
|
+
fontSize: "0.875rem"
|
|
12563
|
+
},
|
|
12564
|
+
children: getInitials(user?.login)
|
|
12565
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Menu.default, {
|
|
12566
|
+
anchorEl,
|
|
12567
|
+
open,
|
|
12568
|
+
onClose: handleClose,
|
|
12569
|
+
slotProps: { paper: { sx: {
|
|
12570
|
+
bgcolor: "background.paper",
|
|
12571
|
+
borderColor: "divider",
|
|
12572
|
+
boxShadow: 3,
|
|
12573
|
+
minWidth: 180
|
|
12574
|
+
} } },
|
|
12575
|
+
children: [
|
|
12576
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
12577
|
+
sx: {
|
|
12578
|
+
px: 2,
|
|
12579
|
+
py: 1.5
|
|
12580
|
+
},
|
|
12581
|
+
children: [
|
|
12582
|
+
isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
12583
|
+
sx: {
|
|
12584
|
+
display: "flex",
|
|
12585
|
+
alignItems: "center",
|
|
12586
|
+
gap: 1
|
|
12587
|
+
},
|
|
12588
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12589
|
+
variant: "body2",
|
|
12590
|
+
color: "text.primary",
|
|
12591
|
+
children: "Loading..."
|
|
12592
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, { size: 16 })]
|
|
12593
|
+
}),
|
|
12594
|
+
error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12595
|
+
variant: "caption",
|
|
12596
|
+
color: "error",
|
|
12597
|
+
children: "Failed to load user information"
|
|
12598
|
+
}),
|
|
12599
|
+
showUserInfo && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12600
|
+
variant: "body2",
|
|
12601
|
+
fontWeight: "600",
|
|
12602
|
+
color: "text.primary",
|
|
12603
|
+
children: user.login
|
|
12604
|
+
}), user.email && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12605
|
+
variant: "caption",
|
|
12606
|
+
color: "text.secondary",
|
|
12607
|
+
children: user.email
|
|
12608
|
+
})] })
|
|
12609
|
+
]
|
|
12610
|
+
}),
|
|
12611
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Divider.default, {}),
|
|
12612
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_MenuItem.default, {
|
|
12613
|
+
onClick: () => {
|
|
12614
|
+
window.open("https://cloud.datarecce.io/", "_blank");
|
|
12615
|
+
handleClose();
|
|
12616
|
+
},
|
|
12617
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemIcon.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_fa.FaCloud, {}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemText.default, { children: "Recce Cloud" })]
|
|
12618
|
+
}),
|
|
12619
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_MenuItem.default, {
|
|
12620
|
+
onClick: () => {
|
|
12621
|
+
window.open(require_urls.RECCE_SUPPORT_CALENDAR_URL, "_blank");
|
|
12622
|
+
handleClose();
|
|
12623
|
+
},
|
|
12624
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemIcon.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_fa.FaUser, {}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_ListItemText.default, { children: "Get live support" })]
|
|
12625
|
+
})
|
|
12626
|
+
]
|
|
12627
|
+
})] });
|
|
12628
|
+
}
|
|
12629
|
+
|
|
12474
12630
|
//#endregion
|
|
12475
12631
|
//#region recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx
|
|
12476
12632
|
/**
|
|
@@ -12508,178 +12664,1325 @@ function IdleTimeoutBadge() {
|
|
|
12508
12664
|
}
|
|
12509
12665
|
|
|
12510
12666
|
//#endregion
|
|
12511
|
-
|
|
12512
|
-
|
|
12513
|
-
|
|
12514
|
-
|
|
12515
|
-
|
|
12516
|
-
|
|
12517
|
-
|
|
12518
|
-
|
|
12519
|
-
|
|
12520
|
-
|
|
12521
|
-
|
|
12522
|
-
|
|
12523
|
-
|
|
12524
|
-
|
|
12525
|
-
|
|
12526
|
-
|
|
12527
|
-
|
|
12528
|
-
|
|
12529
|
-
|
|
12530
|
-
|
|
12531
|
-
|
|
12532
|
-
|
|
12533
|
-
|
|
12534
|
-
|
|
12535
|
-
|
|
12536
|
-
|
|
12537
|
-
|
|
12538
|
-
|
|
12539
|
-
|
|
12540
|
-
|
|
12541
|
-
|
|
12542
|
-
|
|
12543
|
-
|
|
12544
|
-
|
|
12545
|
-
|
|
12546
|
-
|
|
12547
|
-
|
|
12548
|
-
|
|
12549
|
-
|
|
12550
|
-
|
|
12551
|
-
|
|
12552
|
-
|
|
12553
|
-
|
|
12554
|
-
|
|
12555
|
-
|
|
12556
|
-
|
|
12557
|
-
|
|
12558
|
-
});
|
|
12559
|
-
|
|
12560
|
-
|
|
12561
|
-
|
|
12562
|
-
|
|
12563
|
-
|
|
12564
|
-
});
|
|
12565
|
-
|
|
12566
|
-
|
|
12567
|
-
|
|
12568
|
-
|
|
12569
|
-
|
|
12570
|
-
|
|
12571
|
-
|
|
12572
|
-
|
|
12573
|
-
|
|
12574
|
-
|
|
12575
|
-
|
|
12576
|
-
|
|
12577
|
-
|
|
12578
|
-
|
|
12579
|
-
|
|
12580
|
-
|
|
12581
|
-
|
|
12582
|
-
|
|
12583
|
-
|
|
12584
|
-
|
|
12585
|
-
|
|
12586
|
-
|
|
12587
|
-
|
|
12588
|
-
|
|
12589
|
-
|
|
12590
|
-
|
|
12591
|
-
|
|
12592
|
-
|
|
12593
|
-
|
|
12594
|
-
|
|
12595
|
-
|
|
12596
|
-
|
|
12597
|
-
|
|
12598
|
-
|
|
12599
|
-
|
|
12600
|
-
}
|
|
12601
|
-
|
|
12602
|
-
|
|
12603
|
-
|
|
12604
|
-
|
|
12605
|
-
|
|
12606
|
-
})
|
|
12607
|
-
|
|
12608
|
-
|
|
12609
|
-
|
|
12610
|
-
|
|
12611
|
-
|
|
12612
|
-
}
|
|
12613
|
-
|
|
12614
|
-
|
|
12615
|
-
|
|
12616
|
-
|
|
12617
|
-
|
|
12618
|
-
|
|
12619
|
-
|
|
12620
|
-
|
|
12621
|
-
|
|
12622
|
-
|
|
12623
|
-
|
|
12624
|
-
|
|
12625
|
-
|
|
12626
|
-
|
|
12627
|
-
|
|
12628
|
-
|
|
12629
|
-
|
|
12630
|
-
|
|
12631
|
-
|
|
12632
|
-
|
|
12633
|
-
|
|
12634
|
-
|
|
12635
|
-
|
|
12636
|
-
|
|
12637
|
-
|
|
12638
|
-
|
|
12639
|
-
|
|
12640
|
-
|
|
12641
|
-
|
|
12642
|
-
|
|
12643
|
-
|
|
12644
|
-
|
|
12645
|
-
|
|
12646
|
-
|
|
12647
|
-
|
|
12648
|
-
})
|
|
12649
|
-
|
|
12650
|
-
|
|
12651
|
-
|
|
12652
|
-
|
|
12653
|
-
|
|
12654
|
-
|
|
12655
|
-
|
|
12656
|
-
|
|
12657
|
-
|
|
12658
|
-
|
|
12659
|
-
|
|
12660
|
-
|
|
12661
|
-
|
|
12662
|
-
|
|
12663
|
-
|
|
12664
|
-
|
|
12665
|
-
|
|
12666
|
-
|
|
12667
|
-
|
|
12668
|
-
|
|
12669
|
-
|
|
12670
|
-
|
|
12671
|
-
|
|
12672
|
-
|
|
12673
|
-
|
|
12674
|
-
|
|
12675
|
-
|
|
12676
|
-
|
|
12677
|
-
|
|
12678
|
-
|
|
12679
|
-
|
|
12680
|
-
|
|
12681
|
-
|
|
12682
|
-
|
|
12667
|
+
//#region recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx
|
|
12668
|
+
/**
|
|
12669
|
+
* Display Mode Toggle - switches between light and dark themes
|
|
12670
|
+
*
|
|
12671
|
+
* Uses next-themes to persist the user's preference.
|
|
12672
|
+
* Default is light theme, with future support for system preference.
|
|
12673
|
+
*/
|
|
12674
|
+
function DisplayModeToggle() {
|
|
12675
|
+
const { setTheme, resolvedTheme } = (0, next_themes.useTheme)();
|
|
12676
|
+
const [mounted, setMounted] = (0, react.useState)(false);
|
|
12677
|
+
(0, react.useEffect)(() => {
|
|
12678
|
+
setMounted(true);
|
|
12679
|
+
}, []);
|
|
12680
|
+
const toggleTheme = () => {
|
|
12681
|
+
setTheme(resolvedTheme === "dark" ? "light" : "dark");
|
|
12682
|
+
};
|
|
12683
|
+
if (!mounted) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
12684
|
+
size: "small",
|
|
12685
|
+
sx: {
|
|
12686
|
+
color: "rgba(255, 255, 255, 0.8)",
|
|
12687
|
+
"&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
|
|
12688
|
+
},
|
|
12689
|
+
disabled: true,
|
|
12690
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiSun, { style: {
|
|
12691
|
+
width: 18,
|
|
12692
|
+
height: 18
|
|
12693
|
+
} })
|
|
12694
|
+
});
|
|
12695
|
+
const isDark = resolvedTheme === "dark";
|
|
12696
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
12697
|
+
title: isDark ? "Switch to light mode" : "Switch to dark mode",
|
|
12698
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
12699
|
+
size: "small",
|
|
12700
|
+
onClick: toggleTheme,
|
|
12701
|
+
sx: {
|
|
12702
|
+
color: "rgba(255, 255, 255, 0.8)",
|
|
12703
|
+
"&:hover": { bgcolor: "rgba(255, 255, 255, 0.1)" }
|
|
12704
|
+
},
|
|
12705
|
+
"aria-label": isDark ? "Switch to light mode" : "Switch to dark mode",
|
|
12706
|
+
children: isDark ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiSun, { style: {
|
|
12707
|
+
width: 18,
|
|
12708
|
+
height: 18
|
|
12709
|
+
} }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiMoon, { style: {
|
|
12710
|
+
width: 18,
|
|
12711
|
+
height: 18
|
|
12712
|
+
} })
|
|
12713
|
+
})
|
|
12714
|
+
});
|
|
12715
|
+
}
|
|
12716
|
+
|
|
12717
|
+
//#endregion
|
|
12718
|
+
//#region recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx
|
|
12719
|
+
function RecceVersionBadge() {
|
|
12720
|
+
const { version, latestVersion } = require_version.useVersionNumber();
|
|
12721
|
+
const versionFormatRegex = (0, react.useMemo)(() => /* @__PURE__ */ new RegExp("^\\d+\\.\\d+\\.\\d+$"), []);
|
|
12722
|
+
(0, react.useEffect)(() => {
|
|
12723
|
+
if (versionFormatRegex.test(version) && version !== latestVersion) {
|
|
12724
|
+
const storageKey = "recce-update-toast-shown";
|
|
12725
|
+
if (sessionStorage.getItem(storageKey)) return;
|
|
12726
|
+
setTimeout(() => {
|
|
12727
|
+
require_state.toaster.create({
|
|
12728
|
+
id: "recce-update-available",
|
|
12729
|
+
title: "Update available",
|
|
12730
|
+
description: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
12731
|
+
"A new version of Recce (v",
|
|
12732
|
+
latestVersion,
|
|
12733
|
+
") is available.",
|
|
12734
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("br", {}),
|
|
12735
|
+
"Please run",
|
|
12736
|
+
" ",
|
|
12737
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12738
|
+
component: "code",
|
|
12739
|
+
sx: {
|
|
12740
|
+
bgcolor: "grey.200",
|
|
12741
|
+
px: .5,
|
|
12742
|
+
py: .25,
|
|
12743
|
+
borderRadius: .5,
|
|
12744
|
+
fontFamily: "monospace",
|
|
12745
|
+
fontSize: "0.875em"
|
|
12746
|
+
},
|
|
12747
|
+
children: "pip install --upgrade recce"
|
|
12748
|
+
}),
|
|
12749
|
+
" ",
|
|
12750
|
+
"to update Recce.",
|
|
12751
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("br", {}),
|
|
12752
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
|
|
12753
|
+
sx: {
|
|
12754
|
+
color: "primary.main",
|
|
12755
|
+
fontWeight: "bold",
|
|
12756
|
+
"&:hover": { textDecoration: "underline" }
|
|
12757
|
+
},
|
|
12758
|
+
href: `https://github.com/DataRecce/recce/releases/tag/v${latestVersion}`,
|
|
12759
|
+
target: "_blank",
|
|
12760
|
+
children: "Click here to view the detail of latest release"
|
|
12761
|
+
})
|
|
12762
|
+
] }),
|
|
12763
|
+
duration: 60 * 1e3,
|
|
12764
|
+
closable: true
|
|
12765
|
+
});
|
|
12766
|
+
sessionStorage.setItem(storageKey, "true");
|
|
12767
|
+
}, 0);
|
|
12768
|
+
}
|
|
12769
|
+
}, [
|
|
12770
|
+
version,
|
|
12771
|
+
latestVersion,
|
|
12772
|
+
versionFormatRegex
|
|
12773
|
+
]);
|
|
12774
|
+
if (!versionFormatRegex.test(version)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12775
|
+
component: "span",
|
|
12776
|
+
sx: {
|
|
12777
|
+
fontSize: "sm",
|
|
12778
|
+
color: "rgba(255,255,255,0.8)",
|
|
12779
|
+
textTransform: "uppercase",
|
|
12780
|
+
borderWidth: 1,
|
|
12781
|
+
px: 1,
|
|
12782
|
+
borderRadius: .75
|
|
12783
|
+
},
|
|
12784
|
+
children: version
|
|
12785
|
+
});
|
|
12786
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
|
|
12787
|
+
href: `https://github.com/DataRecce/recce/releases/tag/v${version}`,
|
|
12788
|
+
sx: {
|
|
12789
|
+
"&:hover": { textDecoration: "none" },
|
|
12790
|
+
fontSize: "sm",
|
|
12791
|
+
color: "rgba(255,255,255,0.8)",
|
|
12792
|
+
textTransform: "uppercase",
|
|
12793
|
+
borderWidth: 1,
|
|
12794
|
+
px: 1,
|
|
12795
|
+
borderRadius: .75
|
|
12796
|
+
},
|
|
12797
|
+
target: "_blank",
|
|
12798
|
+
children: version
|
|
12799
|
+
});
|
|
12800
|
+
}
|
|
12801
|
+
|
|
12802
|
+
//#endregion
|
|
12803
|
+
//#region recce-source/js/app/(mainComponents)/TopBar.tsx
|
|
12804
|
+
function LinkIcon({ icon: IconComponent, href, sx, ...props }) {
|
|
12805
|
+
const theme = (0, _mui_material_styles.useTheme)();
|
|
12806
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
|
|
12807
|
+
sx: {
|
|
12808
|
+
height: "20px",
|
|
12809
|
+
color: "common.white",
|
|
12810
|
+
...sx
|
|
12811
|
+
},
|
|
12812
|
+
href,
|
|
12813
|
+
target: "_blank",
|
|
12814
|
+
...props,
|
|
12815
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconComponent, { style: {
|
|
12816
|
+
color: theme.palette.common.white,
|
|
12817
|
+
width: 20,
|
|
12818
|
+
height: 20
|
|
12819
|
+
} })
|
|
12820
|
+
});
|
|
12821
|
+
}
|
|
12822
|
+
function TopBar() {
|
|
12823
|
+
const { reviewMode, isDemoSite, envInfo, cloudMode } = require_state.useLineageGraphContext();
|
|
12824
|
+
const { featureToggles, authed } = require_state.useRecceInstanceContext();
|
|
12825
|
+
const { url: prURL, id: prID } = envInfo?.pullRequest ?? {};
|
|
12826
|
+
const demoPrId = prURL ? prURL.split("/").pop() : null;
|
|
12827
|
+
const brandLink = cloudMode || authed ? "https://cloud.datarecce.io/" : "https://reccehq.com/";
|
|
12828
|
+
const [showModal, setShowModal] = (0, react.useState)(false);
|
|
12829
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
12830
|
+
sx: {
|
|
12831
|
+
display: "flex",
|
|
12832
|
+
gap: "10px",
|
|
12833
|
+
minHeight: "40px",
|
|
12834
|
+
alignItems: "center",
|
|
12835
|
+
bgcolor: require_state.colors.brand[400]
|
|
12836
|
+
},
|
|
12837
|
+
children: [
|
|
12838
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Link.default, {
|
|
12839
|
+
href: brandLink,
|
|
12840
|
+
target: "_blank",
|
|
12841
|
+
sx: { "&:hover": { textDecoration: "none" } },
|
|
12842
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
12843
|
+
sx: {
|
|
12844
|
+
display: "flex",
|
|
12845
|
+
gap: "10px",
|
|
12846
|
+
alignItems: "center"
|
|
12847
|
+
},
|
|
12848
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12849
|
+
component: "img",
|
|
12850
|
+
sx: {
|
|
12851
|
+
width: 20,
|
|
12852
|
+
height: 20,
|
|
12853
|
+
ml: "18px"
|
|
12854
|
+
},
|
|
12855
|
+
src: "/logo/recce-logo-white.png",
|
|
12856
|
+
alt: "recce-logo-white"
|
|
12857
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12858
|
+
variant: "h4",
|
|
12859
|
+
sx: {
|
|
12860
|
+
fontFamily: "\"Montserrat\", sans-serif",
|
|
12861
|
+
color: "common.white",
|
|
12862
|
+
fontSize: "1.25rem"
|
|
12863
|
+
},
|
|
12864
|
+
children: "RECCE"
|
|
12865
|
+
})]
|
|
12866
|
+
})
|
|
12867
|
+
}),
|
|
12868
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisplayModeToggle, {}),
|
|
12869
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RecceVersionBadge, {}),
|
|
12870
|
+
(featureToggles.mode ?? reviewMode) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Badge.default, {
|
|
12871
|
+
sx: {
|
|
12872
|
+
fontSize: "0.875rem",
|
|
12873
|
+
color: "rgba(255,255,255,0.8)",
|
|
12874
|
+
textTransform: "uppercase",
|
|
12875
|
+
borderWidth: 1,
|
|
12876
|
+
px: 1,
|
|
12877
|
+
borderRadius: .75,
|
|
12878
|
+
borderColor: "rgba(255,255,255,0.8)"
|
|
12879
|
+
},
|
|
12880
|
+
children: featureToggles.mode ?? "review mode"
|
|
12881
|
+
}),
|
|
12882
|
+
cloudMode && prID && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Badge.default, {
|
|
12883
|
+
sx: {
|
|
12884
|
+
fontSize: "0.875rem",
|
|
12885
|
+
color: "rgba(255,255,255,0.8)",
|
|
12886
|
+
textTransform: "uppercase",
|
|
12887
|
+
borderWidth: 1,
|
|
12888
|
+
px: 1,
|
|
12889
|
+
borderRadius: .75,
|
|
12890
|
+
borderColor: "rgba(255,255,255,0.8)"
|
|
12891
|
+
},
|
|
12892
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
12893
|
+
direction: "row",
|
|
12894
|
+
spacing: 1,
|
|
12895
|
+
alignItems: "center",
|
|
12896
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { children: "cloud mode" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12897
|
+
sx: {
|
|
12898
|
+
borderLeft: "1px solid rgba(255,255,255,0.8)",
|
|
12899
|
+
pl: "8px"
|
|
12900
|
+
},
|
|
12901
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Link.default, {
|
|
12902
|
+
href: prURL,
|
|
12903
|
+
sx: { "&:hover": { textDecoration: "none" } },
|
|
12904
|
+
target: "_blank",
|
|
12905
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_vsc.VscGitPullRequest, { style: {
|
|
12906
|
+
color: "rgba(255,255,255,0.8)",
|
|
12907
|
+
width: 12,
|
|
12908
|
+
height: 12,
|
|
12909
|
+
marginRight: 2,
|
|
12910
|
+
display: "inline",
|
|
12911
|
+
verticalAlign: "middle"
|
|
12912
|
+
} }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12913
|
+
component: "span",
|
|
12914
|
+
sx: {
|
|
12915
|
+
color: "rgba(255,255,255,0.8)",
|
|
12916
|
+
display: "inline"
|
|
12917
|
+
},
|
|
12918
|
+
children: `#${String(prID)}`
|
|
12919
|
+
})]
|
|
12920
|
+
})
|
|
12921
|
+
})]
|
|
12922
|
+
})
|
|
12923
|
+
}),
|
|
12924
|
+
isDemoSite && prURL && demoPrId && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Badge.default, {
|
|
12925
|
+
sx: {
|
|
12926
|
+
fontSize: "0.875rem",
|
|
12927
|
+
color: "rgba(255,255,255,0.8)",
|
|
12928
|
+
textTransform: "uppercase",
|
|
12929
|
+
borderWidth: 1,
|
|
12930
|
+
px: 1,
|
|
12931
|
+
borderRadius: .75,
|
|
12932
|
+
borderColor: "rgba(255,255,255,0.8)"
|
|
12933
|
+
},
|
|
12934
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
12935
|
+
direction: "row",
|
|
12936
|
+
spacing: 1,
|
|
12937
|
+
alignItems: "center",
|
|
12938
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { children: "demo mode" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12939
|
+
sx: {
|
|
12940
|
+
borderLeft: "1px solid rgba(255,255,255,0.8)",
|
|
12941
|
+
pl: "8px"
|
|
12942
|
+
},
|
|
12943
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Link.default, {
|
|
12944
|
+
href: prURL,
|
|
12945
|
+
sx: { "&:hover": { textDecoration: "none" } },
|
|
12946
|
+
target: "_blank",
|
|
12947
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_vsc.VscGitPullRequest, { style: {
|
|
12948
|
+
color: "rgba(255,255,255,0.8)",
|
|
12949
|
+
width: 12,
|
|
12950
|
+
height: 12,
|
|
12951
|
+
marginRight: 2,
|
|
12952
|
+
display: "inline",
|
|
12953
|
+
verticalAlign: "middle"
|
|
12954
|
+
} }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
12955
|
+
component: "span",
|
|
12956
|
+
sx: {
|
|
12957
|
+
color: "rgba(255,255,255,0.8)",
|
|
12958
|
+
display: "inline"
|
|
12959
|
+
},
|
|
12960
|
+
children: `#${demoPrId}`
|
|
12961
|
+
})]
|
|
12962
|
+
})
|
|
12963
|
+
})]
|
|
12964
|
+
})
|
|
12965
|
+
}),
|
|
12966
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flex: 1 } }),
|
|
12967
|
+
(isDemoSite || featureToggles.mode === "read only") && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
12968
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(LinkIcon, {
|
|
12969
|
+
icon: react_icons_fa.FaGithub,
|
|
12970
|
+
href: "https://github.com/DataRecce/recce"
|
|
12971
|
+
}),
|
|
12972
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(LinkIcon, {
|
|
12973
|
+
icon: react_icons_fa.FaSlack,
|
|
12974
|
+
href: "https://getdbt.slack.com/archives/C05C28V7CPP"
|
|
12975
|
+
}),
|
|
12976
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(LinkIcon, {
|
|
12977
|
+
sx: { mr: 2 },
|
|
12978
|
+
icon: react_icons_fa.FaQuestionCircle,
|
|
12979
|
+
href: "https://docs.datarecce.io"
|
|
12980
|
+
})
|
|
12981
|
+
] }),
|
|
12982
|
+
!isDemoSite && featureToggles.mode !== "read only" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IdleTimeoutBadge, {}), authed || cloudMode ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12983
|
+
sx: { mr: 2 },
|
|
12984
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AvatarDropdown, {})
|
|
12985
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
12986
|
+
component: "button",
|
|
12987
|
+
sx: {
|
|
12988
|
+
color: "common.white",
|
|
12989
|
+
fontSize: "0.875rem",
|
|
12990
|
+
fontWeight: 600,
|
|
12991
|
+
bgcolor: "brand.700",
|
|
12992
|
+
borderRadius: 1,
|
|
12993
|
+
px: 3,
|
|
12994
|
+
py: 1,
|
|
12995
|
+
mr: 2,
|
|
12996
|
+
cursor: "pointer",
|
|
12997
|
+
border: "none"
|
|
12998
|
+
},
|
|
12999
|
+
onClick: () => {
|
|
13000
|
+
setShowModal(true);
|
|
13001
|
+
},
|
|
13002
|
+
children: "Connect to Cloud"
|
|
13003
|
+
}), showModal && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthModal, {
|
|
13004
|
+
parentOpen: showModal,
|
|
13005
|
+
handleParentClose: setShowModal,
|
|
13006
|
+
ignoreCookie: true,
|
|
13007
|
+
variant: "user-profile"
|
|
13008
|
+
})] })] })
|
|
13009
|
+
]
|
|
13010
|
+
});
|
|
13011
|
+
}
|
|
13012
|
+
|
|
13013
|
+
//#endregion
|
|
13014
|
+
//#region recce-source/js/src/components/app/Filename.tsx
|
|
13015
|
+
const useRecceToast = () => {
|
|
13016
|
+
const toastSuccess = (message) => {
|
|
13017
|
+
require_state.toaster.create({
|
|
13018
|
+
description: message,
|
|
13019
|
+
type: "success",
|
|
13020
|
+
duration: 5e3,
|
|
13021
|
+
closable: true
|
|
13022
|
+
});
|
|
13023
|
+
};
|
|
13024
|
+
const toastError = (message, error) => {
|
|
13025
|
+
let errorMessage = message;
|
|
13026
|
+
if (error != null) if (error instanceof axios.AxiosError) errorMessage = `${message}. ${String(error.response?.data?.detail)}`;
|
|
13027
|
+
else errorMessage = `${message}. ${error}`;
|
|
13028
|
+
require_state.toaster.create({
|
|
13029
|
+
description: errorMessage,
|
|
13030
|
+
type: "error",
|
|
13031
|
+
duration: 5e3,
|
|
13032
|
+
closable: true
|
|
13033
|
+
});
|
|
13034
|
+
};
|
|
13035
|
+
return {
|
|
13036
|
+
toastSuccess,
|
|
13037
|
+
toastError
|
|
13038
|
+
};
|
|
13039
|
+
};
|
|
13040
|
+
const useClosePrompt = (prompt) => {
|
|
13041
|
+
(0, react.useEffect)(() => {
|
|
13042
|
+
const handleBeforeUnload = (e) => {
|
|
13043
|
+
e.preventDefault();
|
|
13044
|
+
};
|
|
13045
|
+
if (prompt) window.addEventListener("beforeunload", handleBeforeUnload);
|
|
13046
|
+
return () => {
|
|
13047
|
+
if (prompt) window.removeEventListener("beforeunload", handleBeforeUnload);
|
|
13048
|
+
};
|
|
13049
|
+
}, [prompt]);
|
|
13050
|
+
};
|
|
13051
|
+
const Filename = () => {
|
|
13052
|
+
const { featureToggles } = require_state.useRecceInstanceContext();
|
|
13053
|
+
const { fileName, cloudMode, isDemoSite, envInfo } = require_state.useLineageGraphContext();
|
|
13054
|
+
const { apiClient } = require_state.useApiConfig();
|
|
13055
|
+
const [modalOpen, setModalOpen] = (0, react.useState)(false);
|
|
13056
|
+
const [overwriteOpen, setOverwriteOpen] = (0, react.useState)(false);
|
|
13057
|
+
const isStateless = !fileName && !cloudMode && !isDemoSite;
|
|
13058
|
+
const { data: checks } = require_state.useChecks(isStateless);
|
|
13059
|
+
const hasNonPresetChecks = checks != void 0 && checks.filter((check) => !check.is_preset).length > 0;
|
|
13060
|
+
useClosePrompt(isStateless && hasNonPresetChecks);
|
|
13061
|
+
const [{ newFileName, errorMessage, modified, overwriteWithMethod, bypass }, setState] = (0, react.useState)({ newFileName: fileName ?? "recce_state.json" });
|
|
13062
|
+
const inputRef = (0, react.useRef)(null);
|
|
13063
|
+
const { toastSuccess, toastError } = useRecceToast();
|
|
13064
|
+
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
13065
|
+
const handleOpen = () => {
|
|
13066
|
+
setState({
|
|
13067
|
+
newFileName: fileName ?? "recce_state.json",
|
|
13068
|
+
modified: !fileName
|
|
13069
|
+
});
|
|
13070
|
+
setModalOpen(true);
|
|
13071
|
+
};
|
|
13072
|
+
const handleModalClose = () => setModalOpen(false);
|
|
13073
|
+
const handleOverwriteClose = () => setOverwriteOpen(false);
|
|
13074
|
+
const handleAction = async (method, overwrite) => {
|
|
13075
|
+
if (!newFileName) return;
|
|
13076
|
+
const bypassOverwrite = localStorage.getItem(require_version.localStorageKeys.bypassSaveOverwrite) === "true";
|
|
13077
|
+
try {
|
|
13078
|
+
if (method === "save") await require_state.saveAs({
|
|
13079
|
+
filename: newFileName,
|
|
13080
|
+
overwrite: overwrite ?? bypassOverwrite
|
|
13081
|
+
}, apiClient);
|
|
13082
|
+
else await require_state.rename({
|
|
13083
|
+
filename: newFileName,
|
|
13084
|
+
overwrite: overwrite ?? bypassOverwrite
|
|
13085
|
+
}, apiClient);
|
|
13086
|
+
toastSuccess(method === "save" ? "Save file successfully" : "Rename file successfully");
|
|
13087
|
+
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.lineage() });
|
|
13088
|
+
if (bypass) localStorage.setItem(require_version.localStorageKeys.bypassSaveOverwrite, "true");
|
|
13089
|
+
} catch (error) {
|
|
13090
|
+
if (error instanceof axios.AxiosError) {
|
|
13091
|
+
if (error.response?.status === 409) {
|
|
13092
|
+
setState((s) => ({
|
|
13093
|
+
...s,
|
|
13094
|
+
overwriteWithMethod: method
|
|
13095
|
+
}));
|
|
13096
|
+
setOverwriteOpen(true);
|
|
13097
|
+
return;
|
|
13098
|
+
}
|
|
13099
|
+
}
|
|
13100
|
+
toastError(method === "save" ? "Save file failed" : "Rename file failed", error);
|
|
13101
|
+
} finally {
|
|
13102
|
+
handleModalClose();
|
|
13103
|
+
}
|
|
13104
|
+
};
|
|
13105
|
+
const handleOvewriteBack = () => {
|
|
13106
|
+
handleOverwriteClose();
|
|
13107
|
+
setModalOpen(true);
|
|
13108
|
+
setState((s) => {
|
|
13109
|
+
return {
|
|
13110
|
+
...s,
|
|
13111
|
+
overwriteWithMethod: void 0
|
|
13112
|
+
};
|
|
13113
|
+
});
|
|
13114
|
+
};
|
|
13115
|
+
if (cloudMode || isDemoSite) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {});
|
|
13116
|
+
const titleNewInstance = "New Instance" + (hasNonPresetChecks ? " (unsaved)" : "");
|
|
13117
|
+
let titleReadOnlyState;
|
|
13118
|
+
if (featureToggles.disableSaveToFile && fileName) {
|
|
13119
|
+
const generatedAt = envInfo?.stateMetadata?.generated_at;
|
|
13120
|
+
const formattedDate = generatedAt ? formatRunDateTime(new Date(generatedAt)) : null;
|
|
13121
|
+
titleReadOnlyState = formattedDate ? `${fileName} (${formattedDate})` : null;
|
|
13122
|
+
}
|
|
13123
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
13124
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13125
|
+
direction: "row",
|
|
13126
|
+
alignItems: "center",
|
|
13127
|
+
justifyContent: "center",
|
|
13128
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13129
|
+
sx: { fontWeight: 600 },
|
|
13130
|
+
children: titleReadOnlyState ?? fileName ?? titleNewInstance
|
|
13131
|
+
}), !featureToggles.disableSaveToFile && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13132
|
+
title: fileName ? "Change Filename" : "Save",
|
|
13133
|
+
enterDelay: 1e3,
|
|
13134
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13135
|
+
onClick: handleOpen,
|
|
13136
|
+
"aria-label": fileName ? "Change Filename" : "Save",
|
|
13137
|
+
size: "small",
|
|
13138
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13139
|
+
component: fileName ? require_state.IconEdit : require_state.IconSave,
|
|
13140
|
+
sx: {
|
|
13141
|
+
fontSize: 16,
|
|
13142
|
+
verticalAlign: "middle"
|
|
13143
|
+
}
|
|
13144
|
+
})
|
|
13145
|
+
})
|
|
13146
|
+
})]
|
|
13147
|
+
}),
|
|
13148
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Dialog.default, {
|
|
13149
|
+
open: modalOpen,
|
|
13150
|
+
onClose: handleModalClose,
|
|
13151
|
+
children: [
|
|
13152
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogTitle.default, {
|
|
13153
|
+
sx: {
|
|
13154
|
+
display: "flex",
|
|
13155
|
+
alignItems: "center"
|
|
13156
|
+
},
|
|
13157
|
+
children: [
|
|
13158
|
+
fileName ? "Change Filename" : "Save File",
|
|
13159
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flexGrow: 1 } }),
|
|
13160
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13161
|
+
size: "small",
|
|
13162
|
+
onClick: handleModalClose,
|
|
13163
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_io5.IoClose, {})
|
|
13164
|
+
})
|
|
13165
|
+
]
|
|
13166
|
+
}),
|
|
13167
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_DialogContent.default, {
|
|
13168
|
+
onKeyDown: (e) => {
|
|
13169
|
+
e.stopPropagation();
|
|
13170
|
+
},
|
|
13171
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_TextField.default, {
|
|
13172
|
+
inputRef,
|
|
13173
|
+
value: newFileName,
|
|
13174
|
+
label: "File name",
|
|
13175
|
+
placeholder: "Enter filename",
|
|
13176
|
+
error: !!errorMessage,
|
|
13177
|
+
helperText: errorMessage,
|
|
13178
|
+
fullWidth: true,
|
|
13179
|
+
size: "small",
|
|
13180
|
+
sx: { mt: 1 },
|
|
13181
|
+
onChange: (e) => {
|
|
13182
|
+
const value = e.target.value;
|
|
13183
|
+
let newErrorMessage = void 0;
|
|
13184
|
+
if (!value) newErrorMessage = "Filename cannot be empty.";
|
|
13185
|
+
else if (!value.endsWith(".json")) newErrorMessage = "Filename must end with .json.";
|
|
13186
|
+
else if (!/^[a-zA-Z0-9 _-]+\.json$/.test(value)) newErrorMessage = "Invalid filename. Only alphanumeric, space, _ and - are allowed.";
|
|
13187
|
+
else if (fileName && value === fileName) newErrorMessage = "Filename is the same as the current one.";
|
|
13188
|
+
setState((s) => {
|
|
13189
|
+
return {
|
|
13190
|
+
...s,
|
|
13191
|
+
modified: true,
|
|
13192
|
+
newFileName: value,
|
|
13193
|
+
errorMessage: newErrorMessage
|
|
13194
|
+
};
|
|
13195
|
+
});
|
|
13196
|
+
},
|
|
13197
|
+
onKeyDown: (e) => {
|
|
13198
|
+
if (e.key === "Enter") {
|
|
13199
|
+
if (errorMessage) return;
|
|
13200
|
+
if (!fileName) handleAction("save");
|
|
13201
|
+
else handleAction("rename");
|
|
13202
|
+
} else if (e.key === "Escape") handleModalClose();
|
|
13203
|
+
}
|
|
13204
|
+
})
|
|
13205
|
+
}),
|
|
13206
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogActions.default, {
|
|
13207
|
+
sx: { gap: "5px" },
|
|
13208
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13209
|
+
size: "small",
|
|
13210
|
+
color: fileName ? "inherit" : "iochmara",
|
|
13211
|
+
variant: "contained",
|
|
13212
|
+
onClick: async () => {
|
|
13213
|
+
await handleAction("save");
|
|
13214
|
+
},
|
|
13215
|
+
disabled: !newFileName || !!errorMessage || !modified,
|
|
13216
|
+
children: fileName ? "Save as New File" : "Confirm"
|
|
13217
|
+
}), fileName && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13218
|
+
size: "small",
|
|
13219
|
+
color: "iochmara",
|
|
13220
|
+
variant: "contained",
|
|
13221
|
+
onClick: async () => {
|
|
13222
|
+
await handleAction("rename");
|
|
13223
|
+
},
|
|
13224
|
+
disabled: !newFileName || !!errorMessage || !modified,
|
|
13225
|
+
children: "Rename"
|
|
13226
|
+
})]
|
|
13227
|
+
})
|
|
13228
|
+
]
|
|
13229
|
+
}),
|
|
13230
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Dialog.default, {
|
|
13231
|
+
open: overwriteOpen,
|
|
13232
|
+
onClose: handleOverwriteClose,
|
|
13233
|
+
children: [
|
|
13234
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogTitle.default, {
|
|
13235
|
+
sx: {
|
|
13236
|
+
display: "flex",
|
|
13237
|
+
alignItems: "center"
|
|
13238
|
+
},
|
|
13239
|
+
children: [
|
|
13240
|
+
"Overwrite File?",
|
|
13241
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flexGrow: 1 } }),
|
|
13242
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13243
|
+
size: "small",
|
|
13244
|
+
onClick: handleOverwriteClose,
|
|
13245
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_io5.IoClose, {})
|
|
13246
|
+
})
|
|
13247
|
+
]
|
|
13248
|
+
}),
|
|
13249
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogContent.default, {
|
|
13250
|
+
sx: {
|
|
13251
|
+
borderTop: "solid 1px",
|
|
13252
|
+
borderBottom: "solid 1px",
|
|
13253
|
+
borderColor: "divider"
|
|
13254
|
+
},
|
|
13255
|
+
onKeyDown: (e) => {
|
|
13256
|
+
e.stopPropagation();
|
|
13257
|
+
},
|
|
13258
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
13259
|
+
sx: { fontSize: "12pt" },
|
|
13260
|
+
children: overwriteWithMethod === "save" ? "Saving a file with this name will overwrite the existing file. Are you sure you wish to continue?" : "Renaming the file with this name will overwrite the existing file. Are you sure you wish to continue?"
|
|
13261
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
|
|
13262
|
+
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Checkbox.default, {
|
|
13263
|
+
size: "small",
|
|
13264
|
+
checked: bypass,
|
|
13265
|
+
onChange: (e) => {
|
|
13266
|
+
setState((s) => ({
|
|
13267
|
+
...s,
|
|
13268
|
+
bypass: e.target.checked
|
|
13269
|
+
}));
|
|
13270
|
+
}
|
|
13271
|
+
}),
|
|
13272
|
+
label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
13273
|
+
sx: {
|
|
13274
|
+
fontWeight: "bold",
|
|
13275
|
+
pt: "8px"
|
|
13276
|
+
},
|
|
13277
|
+
children: "Don't show this again"
|
|
13278
|
+
})
|
|
13279
|
+
})]
|
|
13280
|
+
}),
|
|
13281
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogActions.default, {
|
|
13282
|
+
sx: { gap: "5px" },
|
|
13283
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13284
|
+
variant: "outlined",
|
|
13285
|
+
onClick: handleOvewriteBack,
|
|
13286
|
+
size: "small",
|
|
13287
|
+
children: "Back"
|
|
13288
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13289
|
+
size: "small",
|
|
13290
|
+
color: "iochmara",
|
|
13291
|
+
variant: "contained",
|
|
13292
|
+
onClick: () => {
|
|
13293
|
+
if (!overwriteWithMethod) return;
|
|
13294
|
+
handleAction(overwriteWithMethod, true);
|
|
13295
|
+
handleOverwriteClose();
|
|
13296
|
+
},
|
|
13297
|
+
children: "Overwrite"
|
|
13298
|
+
})]
|
|
13299
|
+
})
|
|
13300
|
+
]
|
|
13301
|
+
})
|
|
13302
|
+
] });
|
|
13303
|
+
};
|
|
13304
|
+
|
|
13305
|
+
//#endregion
|
|
13306
|
+
//#region recce-source/js/src/components/app/StateExporter.tsx
|
|
13307
|
+
function StateExporter() {
|
|
13308
|
+
const { featureToggles } = require_state.useRecceInstanceContext();
|
|
13309
|
+
const { apiClient } = require_state.useApiConfig();
|
|
13310
|
+
const handleExport = async () => {
|
|
13311
|
+
try {
|
|
13312
|
+
const jsonData = await require_state.exportState(apiClient);
|
|
13313
|
+
const jsonString = JSON.stringify(jsonData, null, 2);
|
|
13314
|
+
(0, file_saver.default)(new Blob([jsonString], { type: "application/json" }), `recce-state-${(0, date_fns.format)(/* @__PURE__ */ new Date(), "yyyy-MM-dd-HH-mm-ss")}.json`);
|
|
13315
|
+
} catch (error) {
|
|
13316
|
+
console.error("Export failed", error);
|
|
13317
|
+
require_state.toaster.create({
|
|
13318
|
+
title: "Export failed",
|
|
13319
|
+
description: String(error),
|
|
13320
|
+
type: "error",
|
|
13321
|
+
duration: 5e3,
|
|
13322
|
+
closable: true
|
|
13323
|
+
});
|
|
13324
|
+
}
|
|
13325
|
+
};
|
|
13326
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13327
|
+
title: "Export",
|
|
13328
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13329
|
+
size: "small",
|
|
13330
|
+
"aria-label": "Export state",
|
|
13331
|
+
onClick: async () => {
|
|
13332
|
+
await handleExport();
|
|
13333
|
+
require_state.trackStateAction({ name: "export" });
|
|
13334
|
+
},
|
|
13335
|
+
disabled: featureToggles.disableExportStateFile,
|
|
13336
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13337
|
+
component: require_state.IconExport,
|
|
13338
|
+
sx: {
|
|
13339
|
+
verticalAlign: "middle",
|
|
13340
|
+
width: "16px",
|
|
13341
|
+
height: "16px"
|
|
13342
|
+
}
|
|
13343
|
+
})
|
|
13344
|
+
})
|
|
13345
|
+
});
|
|
13346
|
+
}
|
|
13347
|
+
|
|
13348
|
+
//#endregion
|
|
13349
|
+
//#region recce-source/js/src/components/app/StateSharing.tsx
|
|
13350
|
+
const LOADING_MESSAGES = [
|
|
13351
|
+
"Processing...",
|
|
13352
|
+
"Still processing, please wait...",
|
|
13353
|
+
"Almost there, thanks for your patience..."
|
|
13354
|
+
];
|
|
13355
|
+
function TopLevelShare() {
|
|
13356
|
+
const { successToast, failToast } = require_state.useClipBoardToast();
|
|
13357
|
+
const [, copyToClipboard] = (0, usehooks_ts.useCopyToClipboard)();
|
|
13358
|
+
const { authed } = require_state.useRecceInstanceContext();
|
|
13359
|
+
const { shareUrl, isLoading, error, handleShareClick } = require_RecceCheckContext.useRecceShareStateContext();
|
|
13360
|
+
const [showModal, setShowModal] = (0, react.useState)(false);
|
|
13361
|
+
const [messageIndex, setMessageIndex] = (0, react.useState)(0);
|
|
13362
|
+
const [prevIsLoading, setPrevIsLoading] = (0, react.useState)(isLoading);
|
|
13363
|
+
if (isLoading !== prevIsLoading) {
|
|
13364
|
+
setPrevIsLoading(isLoading);
|
|
13365
|
+
if (isLoading) setMessageIndex(0);
|
|
13366
|
+
}
|
|
13367
|
+
(0, usehooks_ts.useInterval)(() => {
|
|
13368
|
+
setMessageIndex((prev) => Math.min(prev + 1, LOADING_MESSAGES.length - 1));
|
|
13369
|
+
}, isLoading ? 3e4 : null);
|
|
13370
|
+
(0, react.useEffect)(() => {
|
|
13371
|
+
if (error) failToast("Failed to share state", error);
|
|
13372
|
+
}, [error, failToast]);
|
|
13373
|
+
const handleCopy = async () => {
|
|
13374
|
+
try {
|
|
13375
|
+
await copyToClipboard(String(shareUrl));
|
|
13376
|
+
successToast("Copied the link to clipboard");
|
|
13377
|
+
} catch (error$1) {
|
|
13378
|
+
failToast("Failed to copy the link", error$1);
|
|
13379
|
+
}
|
|
13380
|
+
};
|
|
13381
|
+
if (!authed) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13382
|
+
direction: "row",
|
|
13383
|
+
sx: {
|
|
13384
|
+
flex: 1,
|
|
13385
|
+
alignItems: "center"
|
|
13386
|
+
},
|
|
13387
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13388
|
+
size: "xsmall",
|
|
13389
|
+
color: "neutral",
|
|
13390
|
+
variant: "outlined",
|
|
13391
|
+
onClick: () => {
|
|
13392
|
+
setShowModal(true);
|
|
13393
|
+
},
|
|
13394
|
+
startIcon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_tb.TbCloudUpload, {}),
|
|
13395
|
+
children: "Share"
|
|
13396
|
+
}), showModal && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthModal, {
|
|
13397
|
+
parentOpen: showModal,
|
|
13398
|
+
handleParentClose: setShowModal,
|
|
13399
|
+
ignoreCookie: true,
|
|
13400
|
+
variant: "enable-share"
|
|
13401
|
+
})]
|
|
13402
|
+
});
|
|
13403
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13404
|
+
direction: "row",
|
|
13405
|
+
sx: {
|
|
13406
|
+
flex: 1,
|
|
13407
|
+
alignItems: "center",
|
|
13408
|
+
gap: "5px"
|
|
13409
|
+
},
|
|
13410
|
+
children: [
|
|
13411
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13412
|
+
size: "xsmall",
|
|
13413
|
+
variant: "outlined",
|
|
13414
|
+
color: "neutral",
|
|
13415
|
+
startIcon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_tb.TbCloudUpload, {}),
|
|
13416
|
+
endIcon: shareUrl ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13417
|
+
component: react_icons_pi.PiCheckCircle,
|
|
13418
|
+
sx: { color: "success.main" }
|
|
13419
|
+
}) : void 0,
|
|
13420
|
+
onClick: async () => {
|
|
13421
|
+
await handleShareClick();
|
|
13422
|
+
require_state.trackShareState({ name: "create" });
|
|
13423
|
+
},
|
|
13424
|
+
disabled: isLoading,
|
|
13425
|
+
children: isLoading ? "Sharing..." : "Share"
|
|
13426
|
+
}),
|
|
13427
|
+
isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
13428
|
+
sx: {
|
|
13429
|
+
fontSize: 14,
|
|
13430
|
+
color: "grey.500"
|
|
13431
|
+
},
|
|
13432
|
+
children: LOADING_MESSAGES[messageIndex]
|
|
13433
|
+
}),
|
|
13434
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Stack.default, {
|
|
13435
|
+
direction: "row",
|
|
13436
|
+
spacing: .5,
|
|
13437
|
+
alignItems: "center",
|
|
13438
|
+
children: shareUrl && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13439
|
+
sx: {
|
|
13440
|
+
overflowX: "auto",
|
|
13441
|
+
whiteSpace: "nowrap",
|
|
13442
|
+
maxWidth: "350px"
|
|
13443
|
+
},
|
|
13444
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, {
|
|
13445
|
+
sx: { fontSize: 14 },
|
|
13446
|
+
children: shareUrl
|
|
13447
|
+
})
|
|
13448
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13449
|
+
size: "small",
|
|
13450
|
+
"aria-label": "Copy the share URL",
|
|
13451
|
+
onClick: async () => {
|
|
13452
|
+
await handleCopy();
|
|
13453
|
+
require_state.trackShareState({ name: "copy" });
|
|
13454
|
+
},
|
|
13455
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_pi.PiCopy, {})
|
|
13456
|
+
})] })
|
|
13457
|
+
})
|
|
13458
|
+
]
|
|
13459
|
+
});
|
|
13460
|
+
}
|
|
13461
|
+
|
|
13462
|
+
//#endregion
|
|
13463
|
+
//#region recce-source/js/src/components/app/StateSynchronizer.tsx
|
|
13464
|
+
function isCheckDetailPage(href) {
|
|
13465
|
+
return /^\/checks\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/.test(href);
|
|
13466
|
+
}
|
|
13467
|
+
function StateSpinner() {
|
|
13468
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13469
|
+
title: "Syncing",
|
|
13470
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13471
|
+
sx: { mx: "10px" },
|
|
13472
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_CircularProgress.default, { size: 20 })
|
|
13473
|
+
})
|
|
13474
|
+
});
|
|
13475
|
+
}
|
|
13476
|
+
function StateSynchronizer() {
|
|
13477
|
+
const [isSyncing, setSyncing] = (0, react.useState)(false);
|
|
13478
|
+
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
13479
|
+
const { apiClient } = require_state.useApiConfig();
|
|
13480
|
+
const [location, setLocation] = require_state.useAppLocation();
|
|
13481
|
+
const [open, setOpen] = (0, react.useState)(false);
|
|
13482
|
+
const [syncOption, setSyncOption] = (0, react.useState)("");
|
|
13483
|
+
const { data: instanceInfo } = require_state.useRecceInstanceInfo();
|
|
13484
|
+
const handleClose = () => setOpen(false);
|
|
13485
|
+
const handleSync = (0, react.useCallback)(async (input) => {
|
|
13486
|
+
setOpen(false);
|
|
13487
|
+
setSyncing(true);
|
|
13488
|
+
if ((await require_state.syncState(input, apiClient)).status === "conflict") {
|
|
13489
|
+
setOpen(true);
|
|
13490
|
+
setSyncing(false);
|
|
13491
|
+
return;
|
|
13492
|
+
}
|
|
13493
|
+
while (await require_state.isStateSyncing(apiClient)) await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
13494
|
+
require_state.toaster.create({
|
|
13495
|
+
description: "Sync Completed",
|
|
13496
|
+
type: "success",
|
|
13497
|
+
duration: 5e3,
|
|
13498
|
+
closable: true
|
|
13499
|
+
});
|
|
13500
|
+
setSyncing(false);
|
|
13501
|
+
setSyncOption("");
|
|
13502
|
+
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.lineage() });
|
|
13503
|
+
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.checks() });
|
|
13504
|
+
await queryClient.invalidateQueries({ queryKey: require_state.cacheKeys.runs() });
|
|
13505
|
+
if (isCheckDetailPage(location)) setLocation("/checks");
|
|
13506
|
+
}, [
|
|
13507
|
+
queryClient,
|
|
13508
|
+
location,
|
|
13509
|
+
setLocation,
|
|
13510
|
+
apiClient
|
|
13511
|
+
]);
|
|
13512
|
+
if (isSyncing) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StateSpinner, {});
|
|
13513
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13514
|
+
title: "Sync with Cloud",
|
|
13515
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13516
|
+
size: "small",
|
|
13517
|
+
"aria-label": "Sync state",
|
|
13518
|
+
onClick: () => handleSync(instanceInfo?.session_id ? { method: "merge" } : {}),
|
|
13519
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13520
|
+
component: require_state.IconSync,
|
|
13521
|
+
sx: {
|
|
13522
|
+
fontSize: 16,
|
|
13523
|
+
verticalAlign: "middle"
|
|
13524
|
+
}
|
|
13525
|
+
})
|
|
13526
|
+
})
|
|
13527
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Dialog.default, {
|
|
13528
|
+
open,
|
|
13529
|
+
onClose: handleClose,
|
|
13530
|
+
children: [
|
|
13531
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogTitle.default, {
|
|
13532
|
+
sx: {
|
|
13533
|
+
display: "flex",
|
|
13534
|
+
alignItems: "center",
|
|
13535
|
+
fontWeight: "bold"
|
|
13536
|
+
},
|
|
13537
|
+
children: [
|
|
13538
|
+
"Sync with Cloud",
|
|
13539
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, { sx: { flexGrow: 1 } }),
|
|
13540
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
|
|
13541
|
+
size: "small",
|
|
13542
|
+
onClick: handleClose,
|
|
13543
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_icons_io5.IoClose, {})
|
|
13544
|
+
})
|
|
13545
|
+
]
|
|
13546
|
+
}),
|
|
13547
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogContent.default, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Typography.default, { children: "New changes have been detected in the cloud. Please choose a method to sync your state" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13548
|
+
sx: { mt: "5px" },
|
|
13549
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_RadioGroup.default, {
|
|
13550
|
+
value: syncOption,
|
|
13551
|
+
onChange: (e) => {
|
|
13552
|
+
setSyncOption(e.target.value);
|
|
13553
|
+
},
|
|
13554
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13555
|
+
direction: "column",
|
|
13556
|
+
children: [
|
|
13557
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
|
|
13558
|
+
value: "merge",
|
|
13559
|
+
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Radio.default, {}),
|
|
13560
|
+
label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13561
|
+
direction: "row",
|
|
13562
|
+
alignItems: "center",
|
|
13563
|
+
children: ["Merge", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13564
|
+
title: "This will merge the local and remote states.",
|
|
13565
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13566
|
+
component: react_icons_pi.PiInfo,
|
|
13567
|
+
sx: {
|
|
13568
|
+
ml: 2,
|
|
13569
|
+
cursor: "pointer"
|
|
13570
|
+
}
|
|
13571
|
+
})
|
|
13572
|
+
})]
|
|
13573
|
+
})
|
|
13574
|
+
}),
|
|
13575
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
|
|
13576
|
+
value: "overwrite",
|
|
13577
|
+
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Radio.default, {}),
|
|
13578
|
+
label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13579
|
+
direction: "row",
|
|
13580
|
+
alignItems: "center",
|
|
13581
|
+
children: ["Overwrite", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13582
|
+
title: "This will overwrite the remote state file with the local state.",
|
|
13583
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13584
|
+
component: react_icons_pi.PiInfo,
|
|
13585
|
+
sx: {
|
|
13586
|
+
ml: 2,
|
|
13587
|
+
cursor: "pointer"
|
|
13588
|
+
}
|
|
13589
|
+
})
|
|
13590
|
+
})]
|
|
13591
|
+
})
|
|
13592
|
+
}),
|
|
13593
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_FormControlLabel.default, {
|
|
13594
|
+
value: "revert",
|
|
13595
|
+
control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Radio.default, {}),
|
|
13596
|
+
label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Stack.default, {
|
|
13597
|
+
direction: "row",
|
|
13598
|
+
alignItems: "center",
|
|
13599
|
+
children: ["Revert", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tooltip.default, {
|
|
13600
|
+
title: "This will discard local changes and revert to the cloud state.",
|
|
13601
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13602
|
+
component: react_icons_pi.PiInfo,
|
|
13603
|
+
sx: {
|
|
13604
|
+
ml: 2,
|
|
13605
|
+
cursor: "pointer"
|
|
13606
|
+
}
|
|
13607
|
+
})
|
|
13608
|
+
})]
|
|
13609
|
+
})
|
|
13610
|
+
})
|
|
13611
|
+
]
|
|
13612
|
+
})
|
|
13613
|
+
})
|
|
13614
|
+
})] }),
|
|
13615
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_DialogActions.default, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13616
|
+
onClick: handleClose,
|
|
13617
|
+
sx: { mr: 1 },
|
|
13618
|
+
children: "Cancel"
|
|
13619
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Button.default, {
|
|
13620
|
+
color: "iochmara",
|
|
13621
|
+
variant: "contained",
|
|
13622
|
+
onClick: () => handleSync({ method: syncOption || void 0 }),
|
|
13623
|
+
disabled: !syncOption,
|
|
13624
|
+
children: "Sync"
|
|
13625
|
+
})] })
|
|
13626
|
+
]
|
|
13627
|
+
})] });
|
|
13628
|
+
}
|
|
13629
|
+
|
|
13630
|
+
//#endregion
|
|
13631
|
+
//#region recce-source/js/app/(mainComponents)/NavBar.tsx
|
|
13632
|
+
/**
|
|
13633
|
+
* Route configuration for tabs
|
|
13634
|
+
*/
|
|
13635
|
+
const ROUTE_CONFIG = [
|
|
13636
|
+
{
|
|
13637
|
+
path: "/lineage",
|
|
13638
|
+
name: "Lineage"
|
|
13639
|
+
},
|
|
13640
|
+
{
|
|
13641
|
+
path: "/query",
|
|
13642
|
+
name: "Query"
|
|
13643
|
+
},
|
|
13644
|
+
{
|
|
13645
|
+
path: "/checks",
|
|
13646
|
+
name: "Checklist"
|
|
13647
|
+
}
|
|
13648
|
+
];
|
|
13649
|
+
function TabBadge({ queryKey, fetchCallback, selectCallback }) {
|
|
13650
|
+
const { data: count, isLoading, error } = (0, _tanstack_react_query.useQuery)({
|
|
13651
|
+
queryKey,
|
|
13652
|
+
queryFn: fetchCallback,
|
|
13653
|
+
select: selectCallback
|
|
13654
|
+
});
|
|
13655
|
+
if (isLoading || error || count === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {});
|
|
13656
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13657
|
+
bgcolor: "brand.main",
|
|
13658
|
+
display: "flex",
|
|
13659
|
+
justifyContent: "center",
|
|
13660
|
+
alignItems: "center",
|
|
13661
|
+
p: 1,
|
|
13662
|
+
borderRadius: "100%",
|
|
13663
|
+
color: "white",
|
|
13664
|
+
fontWeight: 700,
|
|
13665
|
+
fontSize: "0.75rem",
|
|
13666
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: count })
|
|
13667
|
+
});
|
|
13668
|
+
}
|
|
13669
|
+
function ChecklistBadge() {
|
|
13670
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabBadge, {
|
|
13671
|
+
queryKey: require_state.cacheKeys.checks(),
|
|
13672
|
+
fetchCallback: require_state.listChecks,
|
|
13673
|
+
selectCallback: (checks) => {
|
|
13674
|
+
return checks.filter((check) => !check.is_checked).length;
|
|
13675
|
+
}
|
|
13676
|
+
});
|
|
13677
|
+
}
|
|
13678
|
+
function NavBar() {
|
|
13679
|
+
const pathname = (0, next_navigation.usePathname)();
|
|
13680
|
+
const { isDemoSite, isLoading, cloudMode } = require_state.useLineageGraphContext();
|
|
13681
|
+
const { featureToggles } = require_state.useRecceInstanceContext();
|
|
13682
|
+
const { data: flag, isLoading: isFlagLoading } = require_state.useRecceServerFlag();
|
|
13683
|
+
const prevPathnameRef = (0, react.useRef)(null);
|
|
13684
|
+
(0, react.useEffect)(() => {
|
|
13685
|
+
if (prevPathnameRef.current && prevPathnameRef.current !== pathname) require_state.trackNavigation({
|
|
13686
|
+
from: prevPathnameRef.current,
|
|
13687
|
+
to: pathname
|
|
13688
|
+
});
|
|
13689
|
+
prevPathnameRef.current = pathname;
|
|
13690
|
+
}, [pathname]);
|
|
13691
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13692
|
+
sx: {
|
|
13693
|
+
borderBottom: "1px solid lightgray",
|
|
13694
|
+
px: "12px"
|
|
13695
|
+
},
|
|
13696
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
13697
|
+
sx: {
|
|
13698
|
+
display: "grid",
|
|
13699
|
+
gridTemplateColumns: "1fr auto 1fr",
|
|
13700
|
+
width: "100%",
|
|
13701
|
+
alignItems: "center"
|
|
13702
|
+
},
|
|
13703
|
+
children: [
|
|
13704
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tabs.default, {
|
|
13705
|
+
value: (0, react.useMemo)(() => {
|
|
13706
|
+
if (pathname.startsWith("/checks")) return "/checks";
|
|
13707
|
+
if (pathname.startsWith("/query")) return "/query";
|
|
13708
|
+
if (pathname.startsWith("/runs")) return "/runs";
|
|
13709
|
+
return "/lineage";
|
|
13710
|
+
}, [pathname]),
|
|
13711
|
+
sx: {
|
|
13712
|
+
borderBottom: "none",
|
|
13713
|
+
minHeight: "auto"
|
|
13714
|
+
},
|
|
13715
|
+
children: ROUTE_CONFIG.map(({ path, name }) => {
|
|
13716
|
+
if (name === "Query" && flag?.single_env_onboarding) return null;
|
|
13717
|
+
if (name === "Checklist" && ChecklistBadge) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tab.default, {
|
|
13718
|
+
value: path,
|
|
13719
|
+
disabled: isLoading || isFlagLoading,
|
|
13720
|
+
sx: { p: 0 },
|
|
13721
|
+
label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13722
|
+
sx: {
|
|
13723
|
+
display: "flex",
|
|
13724
|
+
alignItems: "center",
|
|
13725
|
+
gap: "4px"
|
|
13726
|
+
},
|
|
13727
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(next_link.default, {
|
|
13728
|
+
href: path,
|
|
13729
|
+
style: {
|
|
13730
|
+
textDecoration: "none",
|
|
13731
|
+
color: "inherit",
|
|
13732
|
+
padding: "0.875rem 1.1875rem",
|
|
13733
|
+
display: "flex",
|
|
13734
|
+
gap: 3,
|
|
13735
|
+
alignItems: "center"
|
|
13736
|
+
},
|
|
13737
|
+
children: [
|
|
13738
|
+
name,
|
|
13739
|
+
" ",
|
|
13740
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChecklistBadge, {})
|
|
13741
|
+
]
|
|
13742
|
+
})
|
|
13743
|
+
})
|
|
13744
|
+
}, path);
|
|
13745
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Tab.default, {
|
|
13746
|
+
value: path,
|
|
13747
|
+
disabled: isLoading || isFlagLoading,
|
|
13748
|
+
sx: { p: 0 },
|
|
13749
|
+
label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Box.default, {
|
|
13750
|
+
sx: {
|
|
13751
|
+
display: "flex",
|
|
13752
|
+
alignItems: "center",
|
|
13753
|
+
gap: "4px"
|
|
13754
|
+
},
|
|
13755
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(next_link.default, {
|
|
13756
|
+
href: path,
|
|
13757
|
+
style: {
|
|
13758
|
+
textDecoration: "none",
|
|
13759
|
+
color: "inherit",
|
|
13760
|
+
padding: "0.875rem 1.1875rem"
|
|
13761
|
+
},
|
|
13762
|
+
children: name
|
|
13763
|
+
})
|
|
13764
|
+
})
|
|
13765
|
+
}, path);
|
|
13766
|
+
})
|
|
13767
|
+
}),
|
|
13768
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
13769
|
+
sx: {
|
|
13770
|
+
display: "flex",
|
|
13771
|
+
alignItems: "center",
|
|
13772
|
+
gap: "12px",
|
|
13773
|
+
justifyContent: "center"
|
|
13774
|
+
},
|
|
13775
|
+
children: [!isLoading && !isDemoSite && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Filename, {}), !isLoading && !isDemoSite && !flag?.single_env_onboarding && !featureToggles.disableShare && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TopLevelShare, {})]
|
|
13776
|
+
}),
|
|
13777
|
+
!isLoading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material_Box.default, {
|
|
13778
|
+
sx: {
|
|
13779
|
+
display: "flex",
|
|
13780
|
+
justifyContent: "right",
|
|
13781
|
+
alignItems: "center",
|
|
13782
|
+
mr: "8px"
|
|
13783
|
+
},
|
|
13784
|
+
children: [
|
|
13785
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnvInfo, {}),
|
|
13786
|
+
cloudMode && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StateSynchronizer, {}),
|
|
13787
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(StateExporter, {})
|
|
13788
|
+
]
|
|
13789
|
+
})
|
|
13790
|
+
]
|
|
13791
|
+
})
|
|
13792
|
+
});
|
|
13793
|
+
}
|
|
13794
|
+
|
|
13795
|
+
//#endregion
|
|
13796
|
+
Object.defineProperty(exports, 'ChangeSummary', {
|
|
13797
|
+
enumerable: true,
|
|
13798
|
+
get: function () {
|
|
13799
|
+
return ChangeSummary;
|
|
13800
|
+
}
|
|
13801
|
+
});
|
|
13802
|
+
Object.defineProperty(exports, 'CheckBreadcrumb', {
|
|
13803
|
+
enumerable: true,
|
|
13804
|
+
get: function () {
|
|
13805
|
+
return CheckBreadcrumb;
|
|
13806
|
+
}
|
|
13807
|
+
});
|
|
13808
|
+
Object.defineProperty(exports, 'CheckDescription', {
|
|
13809
|
+
enumerable: true,
|
|
13810
|
+
get: function () {
|
|
13811
|
+
return CheckDescription;
|
|
13812
|
+
}
|
|
13813
|
+
});
|
|
13814
|
+
Object.defineProperty(exports, 'CheckDetail', {
|
|
13815
|
+
enumerable: true,
|
|
13816
|
+
get: function () {
|
|
13817
|
+
return CheckDetail;
|
|
13818
|
+
}
|
|
13819
|
+
});
|
|
13820
|
+
Object.defineProperty(exports, 'CheckEmptyState', {
|
|
13821
|
+
enumerable: true,
|
|
13822
|
+
get: function () {
|
|
13823
|
+
return CheckEmptyState;
|
|
13824
|
+
}
|
|
13825
|
+
});
|
|
13826
|
+
Object.defineProperty(exports, 'CheckList', {
|
|
13827
|
+
enumerable: true,
|
|
13828
|
+
get: function () {
|
|
13829
|
+
return CheckList;
|
|
13830
|
+
}
|
|
13831
|
+
});
|
|
13832
|
+
Object.defineProperty(exports, 'CodeEditor_default', {
|
|
13833
|
+
enumerable: true,
|
|
13834
|
+
get: function () {
|
|
13835
|
+
return CodeEditor_default;
|
|
13836
|
+
}
|
|
13837
|
+
});
|
|
13838
|
+
Object.defineProperty(exports, 'DiffEditor_default', {
|
|
13839
|
+
enumerable: true,
|
|
13840
|
+
get: function () {
|
|
13841
|
+
return DiffEditor_default;
|
|
13842
|
+
}
|
|
13843
|
+
});
|
|
13844
|
+
Object.defineProperty(exports, 'DisplayModeToggle', {
|
|
13845
|
+
enumerable: true,
|
|
13846
|
+
get: function () {
|
|
13847
|
+
return DisplayModeToggle;
|
|
13848
|
+
}
|
|
13849
|
+
});
|
|
13850
|
+
Object.defineProperty(exports, 'EnvInfo', {
|
|
13851
|
+
enumerable: true,
|
|
13852
|
+
get: function () {
|
|
13853
|
+
return EnvInfo;
|
|
13854
|
+
}
|
|
13855
|
+
});
|
|
13856
|
+
Object.defineProperty(exports, 'ErrorBoundary', {
|
|
13857
|
+
enumerable: true,
|
|
13858
|
+
get: function () {
|
|
13859
|
+
return ErrorBoundary;
|
|
13860
|
+
}
|
|
13861
|
+
});
|
|
13862
|
+
Object.defineProperty(exports, 'GraphColumnNode', {
|
|
13863
|
+
enumerable: true,
|
|
13864
|
+
get: function () {
|
|
13865
|
+
return GraphColumnNode;
|
|
13866
|
+
}
|
|
13867
|
+
});
|
|
13868
|
+
Object.defineProperty(exports, 'GraphEdge', {
|
|
13869
|
+
enumerable: true,
|
|
13870
|
+
get: function () {
|
|
13871
|
+
return GraphEdge;
|
|
13872
|
+
}
|
|
13873
|
+
});
|
|
13874
|
+
Object.defineProperty(exports, 'GraphNode', {
|
|
13875
|
+
enumerable: true,
|
|
13876
|
+
get: function () {
|
|
13877
|
+
return GraphNode;
|
|
13878
|
+
}
|
|
13879
|
+
});
|
|
13880
|
+
Object.defineProperty(exports, 'HSplit', {
|
|
13881
|
+
enumerable: true,
|
|
13882
|
+
get: function () {
|
|
13883
|
+
return HSplit;
|
|
13884
|
+
}
|
|
13885
|
+
});
|
|
13886
|
+
Object.defineProperty(exports, 'HistoryToggle', {
|
|
13887
|
+
enumerable: true,
|
|
13888
|
+
get: function () {
|
|
13889
|
+
return HistoryToggle;
|
|
13890
|
+
}
|
|
13891
|
+
});
|
|
13892
|
+
Object.defineProperty(exports, 'IdleTimeoutBadge', {
|
|
13893
|
+
enumerable: true,
|
|
13894
|
+
get: function () {
|
|
13895
|
+
return IdleTimeoutBadge;
|
|
13896
|
+
}
|
|
13897
|
+
});
|
|
13898
|
+
Object.defineProperty(exports, 'LineageDiffView', {
|
|
13899
|
+
enumerable: true,
|
|
13900
|
+
get: function () {
|
|
13901
|
+
return LineageDiffView;
|
|
13902
|
+
}
|
|
13903
|
+
});
|
|
13904
|
+
Object.defineProperty(exports, 'LineagePage', {
|
|
13905
|
+
enumerable: true,
|
|
13906
|
+
get: function () {
|
|
13907
|
+
return LineagePage;
|
|
13908
|
+
}
|
|
13909
|
+
});
|
|
13910
|
+
Object.defineProperty(exports, 'LineageView', {
|
|
13911
|
+
enumerable: true,
|
|
13912
|
+
get: function () {
|
|
13913
|
+
return LineageView;
|
|
13914
|
+
}
|
|
13915
|
+
});
|
|
13916
|
+
Object.defineProperty(exports, 'LineageViewTopBar', {
|
|
13917
|
+
enumerable: true,
|
|
13918
|
+
get: function () {
|
|
13919
|
+
return LineageViewTopBar;
|
|
13920
|
+
}
|
|
13921
|
+
});
|
|
13922
|
+
Object.defineProperty(exports, 'ModelRowCount', {
|
|
13923
|
+
enumerable: true,
|
|
13924
|
+
get: function () {
|
|
13925
|
+
return ModelRowCount;
|
|
13926
|
+
}
|
|
13927
|
+
});
|
|
13928
|
+
Object.defineProperty(exports, 'MuiProvider', {
|
|
13929
|
+
enumerable: true,
|
|
13930
|
+
get: function () {
|
|
13931
|
+
return MuiProvider;
|
|
13932
|
+
}
|
|
13933
|
+
});
|
|
13934
|
+
Object.defineProperty(exports, 'NavBar', {
|
|
13935
|
+
enumerable: true,
|
|
13936
|
+
get: function () {
|
|
13937
|
+
return NavBar;
|
|
13938
|
+
}
|
|
13939
|
+
});
|
|
13940
|
+
Object.defineProperty(exports, 'NodeSqlView', {
|
|
13941
|
+
enumerable: true,
|
|
13942
|
+
get: function () {
|
|
13943
|
+
return NodeSqlView;
|
|
13944
|
+
}
|
|
13945
|
+
});
|
|
13946
|
+
Object.defineProperty(exports, 'NodeView', {
|
|
13947
|
+
enumerable: true,
|
|
13948
|
+
get: function () {
|
|
13949
|
+
return NodeView;
|
|
13950
|
+
}
|
|
13951
|
+
});
|
|
13952
|
+
Object.defineProperty(exports, 'QueryForm', {
|
|
13953
|
+
enumerable: true,
|
|
13954
|
+
get: function () {
|
|
13955
|
+
return QueryForm;
|
|
13956
|
+
}
|
|
13957
|
+
});
|
|
13958
|
+
Object.defineProperty(exports, 'QueryPage', {
|
|
13959
|
+
enumerable: true,
|
|
13960
|
+
get: function () {
|
|
13961
|
+
return QueryPage;
|
|
13962
|
+
}
|
|
13963
|
+
});
|
|
13964
|
+
Object.defineProperty(exports, 'RecceVersionBadge', {
|
|
13965
|
+
enumerable: true,
|
|
13966
|
+
get: function () {
|
|
13967
|
+
return RecceVersionBadge;
|
|
13968
|
+
}
|
|
13969
|
+
});
|
|
13970
|
+
Object.defineProperty(exports, 'ResourceTypeTag', {
|
|
13971
|
+
enumerable: true,
|
|
13972
|
+
get: function () {
|
|
13973
|
+
return ResourceTypeTag;
|
|
13974
|
+
}
|
|
13975
|
+
});
|
|
13976
|
+
Object.defineProperty(exports, 'RowCountDiffTag', {
|
|
13977
|
+
enumerable: true,
|
|
13978
|
+
get: function () {
|
|
13979
|
+
return RowCountDiffTag;
|
|
13980
|
+
}
|
|
13981
|
+
});
|
|
13982
|
+
Object.defineProperty(exports, 'RunList', {
|
|
13983
|
+
enumerable: true,
|
|
13984
|
+
get: function () {
|
|
13985
|
+
return RunList;
|
|
12683
13986
|
}
|
|
12684
13987
|
});
|
|
12685
13988
|
Object.defineProperty(exports, 'RunPage', {
|
|
@@ -12748,6 +14051,12 @@ Object.defineProperty(exports, 'SummaryView', {
|
|
|
12748
14051
|
return SummaryView;
|
|
12749
14052
|
}
|
|
12750
14053
|
});
|
|
14054
|
+
Object.defineProperty(exports, 'TopBar', {
|
|
14055
|
+
enumerable: true,
|
|
14056
|
+
get: function () {
|
|
14057
|
+
return TopBar;
|
|
14058
|
+
}
|
|
14059
|
+
});
|
|
12751
14060
|
Object.defineProperty(exports, 'VSplit', {
|
|
12752
14061
|
enumerable: true,
|
|
12753
14062
|
get: function () {
|
|
@@ -12760,4 +14069,4 @@ Object.defineProperty(exports, 'mui_provider_default', {
|
|
|
12760
14069
|
return mui_provider_default;
|
|
12761
14070
|
}
|
|
12762
14071
|
});
|
|
12763
|
-
//# sourceMappingURL=components-
|
|
14072
|
+
//# sourceMappingURL=components-Bmc5X473.js.map
|