@optimizely/ocp-local-env 1.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/package.json +112 -0
- package/dist/public/bundle.82dc5d29fffb9f205051.js +3 -0
- package/dist/public/bundle.82dc5d29fffb9f205051.js.LICENSE.txt +92 -0
- package/dist/public/bundle.82dc5d29fffb9f205051.js.map +1 -0
- package/dist/public/index.html +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +115 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/executor/DestinationExecutor.d.ts +19 -0
- package/dist/src/executor/DestinationExecutor.js +72 -0
- package/dist/src/executor/DestinationExecutor.js.map +1 -0
- package/dist/src/executor/FunctionExecutor.d.ts +67 -0
- package/dist/src/executor/FunctionExecutor.js +189 -0
- package/dist/src/executor/FunctionExecutor.js.map +1 -0
- package/dist/src/executor/JobExecutor.d.ts +79 -0
- package/dist/src/executor/JobExecutor.js +215 -0
- package/dist/src/executor/JobExecutor.js.map +1 -0
- package/dist/src/executor/LifecycleExecutor.d.ts +64 -0
- package/dist/src/executor/LifecycleExecutor.js +167 -0
- package/dist/src/executor/LifecycleExecutor.js.map +1 -0
- package/dist/src/executor/SourceExecutor.d.ts +32 -0
- package/dist/src/executor/SourceExecutor.js +163 -0
- package/dist/src/executor/SourceExecutor.js.map +1 -0
- package/dist/src/executor/watcher.d.ts +62 -0
- package/dist/src/executor/watcher.js +213 -0
- package/dist/src/executor/watcher.js.map +1 -0
- package/dist/src/functions/hello.d.ts +4 -0
- package/dist/src/functions/hello.js +8 -0
- package/dist/src/functions/hello.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jobs/dailyJob.d.ts +4 -0
- package/dist/src/jobs/dailyJob.js +8 -0
- package/dist/src/jobs/dailyJob.js.map +1 -0
- package/dist/src/local_engine/LocalFunctionApi.d.ts +17 -0
- package/dist/src/local_engine/LocalFunctionApi.js +54 -0
- package/dist/src/local_engine/LocalFunctionApi.js.map +1 -0
- package/dist/src/local_engine/LocalJobApi.d.ts +67 -0
- package/dist/src/local_engine/LocalJobApi.js +205 -0
- package/dist/src/local_engine/LocalJobApi.js.map +1 -0
- package/dist/src/local_engine/LocalNotifier.d.ts +9 -0
- package/dist/src/local_engine/LocalNotifier.js +26 -0
- package/dist/src/local_engine/LocalNotifier.js.map +1 -0
- package/dist/src/local_engine/local-engine-child-base.d.ts +110 -0
- package/dist/src/local_engine/local-engine-child-base.js +607 -0
- package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
- package/dist/src/local_engine/local-engine-client.d.ts +161 -0
- package/dist/src/local_engine/local-engine-client.js +888 -0
- package/dist/src/local_engine/local-engine-client.js.map +1 -0
- package/dist/src/local_engine/local-engine-types.d.ts +245 -0
- package/dist/src/local_engine/local-engine-types.js +6 -0
- package/dist/src/local_engine/local-engine-types.js.map +1 -0
- package/dist/src/local_engine/local-engine-unified.d.ts +71 -0
- package/dist/src/local_engine/local-engine-unified.js +723 -0
- package/dist/src/local_engine/local-engine-unified.js.map +1 -0
- package/dist/src/local_engine/local-engine-utils.d.ts +68 -0
- package/dist/src/local_engine/local-engine-utils.js +219 -0
- package/dist/src/local_engine/local-engine-utils.js.map +1 -0
- package/dist/src/local_engine/localSDKConfig.d.ts +40 -0
- package/dist/src/local_engine/localSDKConfig.js +247 -0
- package/dist/src/local_engine/localSDKConfig.js.map +1 -0
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.d.ts +37 -0
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.js +110 -0
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.js.map +1 -0
- package/dist/src/local_engine/storage/LocalConfigStore.d.ts +74 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js +178 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalJobStore.d.ts +111 -0
- package/dist/src/local_engine/storage/LocalJobStore.js +249 -0
- package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalKVStore.d.ts +106 -0
- package/dist/src/local_engine/storage/LocalKVStore.js +1061 -0
- package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +28 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js +149 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +115 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js +350 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.d.ts +19 -0
- package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.js +52 -0
- package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +168 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js +509 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
- package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.d.ts +15 -0
- package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.js +28 -0
- package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.js.map +1 -0
- package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
- package/dist/src/local_engine/storage/NumberSet.js +32 -0
- package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
- package/dist/src/local_engine/storage/SourceDataStore.d.ts +23 -0
- package/dist/src/local_engine/storage/SourceDataStore.js +83 -0
- package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +25 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js +61 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +1 -0
- package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
- package/dist/src/local_engine/storage/StringSet.js +32 -0
- package/dist/src/local_engine/storage/StringSet.js.map +1 -0
- package/dist/src/local_engine/types.d.ts +53 -0
- package/dist/src/local_engine/types.js +6 -0
- package/dist/src/local_engine/types.js.map +1 -0
- package/dist/src/local_engine/utils.d.ts +33 -0
- package/dist/src/local_engine/utils.js +143 -0
- package/dist/src/local_engine/utils.js.map +1 -0
- package/dist/src/logging/LogManager.d.ts +246 -0
- package/dist/src/logging/LogManager.js +343 -0
- package/dist/src/logging/LogManager.js.map +1 -0
- package/dist/src/server/api/destinations.d.ts +7 -0
- package/dist/src/server/api/destinations.js +170 -0
- package/dist/src/server/api/destinations.js.map +1 -0
- package/dist/src/server/api/functions.d.ts +7 -0
- package/dist/src/server/api/functions.js +80 -0
- package/dist/src/server/api/functions.js.map +1 -0
- package/dist/src/server/api/jobs.d.ts +10 -0
- package/dist/src/server/api/jobs.js +244 -0
- package/dist/src/server/api/jobs.js.map +1 -0
- package/dist/src/server/api/settings.d.ts +6 -0
- package/dist/src/server/api/settings.js +116 -0
- package/dist/src/server/api/settings.js.map +1 -0
- package/dist/src/server/api/sources.d.ts +7 -0
- package/dist/src/server/api/sources.js +382 -0
- package/dist/src/server/api/sources.js.map +1 -0
- package/dist/src/server/api/stores.d.ts +2 -0
- package/dist/src/server/api/stores.js +341 -0
- package/dist/src/server/api/stores.js.map +1 -0
- package/dist/src/server/api/v1.d.ts +10 -0
- package/dist/src/server/api/v1.js +718 -0
- package/dist/src/server/api/v1.js.map +1 -0
- package/dist/src/server/api.d.ts +8 -0
- package/dist/src/server/api.js +217 -0
- package/dist/src/server/api.js.map +1 -0
- package/dist/src/server/app-discovery.d.ts +5 -0
- package/dist/src/server/app-discovery.js +113 -0
- package/dist/src/server/app-discovery.js.map +1 -0
- package/dist/src/server/config.d.ts +26 -0
- package/dist/src/server/config.js +112 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/mockDataGenerator.d.ts +1 -0
- package/dist/src/server/mockDataGenerator.js +154 -0
- package/dist/src/server/mockDataGenerator.js.map +1 -0
- package/dist/src/server/websocket.d.ts +0 -0
- package/dist/src/server/websocket.js +2 -0
- package/dist/src/server/websocket.js.map +1 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.js +735 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/types/app.d.ts +154 -0
- package/dist/src/types/app.js +24 -0
- package/dist/src/types/app.js.map +1 -0
- package/dist/src/types/kvstore.d.ts +320 -0
- package/dist/src/types/kvstore.js +5 -0
- package/dist/src/types/kvstore.js.map +1 -0
- package/dist/src/ui/components/App.d.ts +6 -0
- package/dist/src/ui/components/App.js +432 -0
- package/dist/src/ui/components/App.js.map +1 -0
- package/dist/src/ui/components/DestinationBatchEditor.d.ts +7 -0
- package/dist/src/ui/components/DestinationBatchEditor.js +160 -0
- package/dist/src/ui/components/DestinationBatchEditor.js.map +1 -0
- package/dist/src/ui/components/DestinationSchemaViewer.d.ts +7 -0
- package/dist/src/ui/components/DestinationSchemaViewer.js +61 -0
- package/dist/src/ui/components/DestinationSchemaViewer.js.map +1 -0
- package/dist/src/ui/components/DestinationsView.d.ts +14 -0
- package/dist/src/ui/components/DestinationsView.js +68 -0
- package/dist/src/ui/components/DestinationsView.js.map +1 -0
- package/dist/src/ui/components/FunctionsView.d.ts +13 -0
- package/dist/src/ui/components/FunctionsView.js +288 -0
- package/dist/src/ui/components/FunctionsView.js.map +1 -0
- package/dist/src/ui/components/JobsView.d.ts +13 -0
- package/dist/src/ui/components/JobsView.js +320 -0
- package/dist/src/ui/components/JobsView.js.map +1 -0
- package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
- package/dist/src/ui/components/KVStoreViewer.js +168 -0
- package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
- package/dist/src/ui/components/MetadataModal.d.ts +14 -0
- package/dist/src/ui/components/MetadataModal.js +28 -0
- package/dist/src/ui/components/MetadataModal.js.map +1 -0
- package/dist/src/ui/components/MetadataModal.test.d.ts +1 -0
- package/dist/src/ui/components/MetadataModal.test.js +143 -0
- package/dist/src/ui/components/MetadataModal.test.js.map +1 -0
- package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
- package/dist/src/ui/components/NotificationViewer.js +69 -0
- package/dist/src/ui/components/NotificationViewer.js.map +1 -0
- package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
- package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
- package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
- package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
- package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
- package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
- package/dist/src/ui/components/SourceDataViewer.d.ts +8 -0
- package/dist/src/ui/components/SourceDataViewer.js +84 -0
- package/dist/src/ui/components/SourceDataViewer.js.map +1 -0
- package/dist/src/ui/components/SourceJobsSection.d.ts +8 -0
- package/dist/src/ui/components/SourceJobsSection.js +99 -0
- package/dist/src/ui/components/SourceJobsSection.js.map +1 -0
- package/dist/src/ui/components/SourceLifecycleSection.d.ts +7 -0
- package/dist/src/ui/components/SourceLifecycleSection.js +58 -0
- package/dist/src/ui/components/SourceLifecycleSection.js.map +1 -0
- package/dist/src/ui/components/SourceSchemaViewer.d.ts +7 -0
- package/dist/src/ui/components/SourceSchemaViewer.js +65 -0
- package/dist/src/ui/components/SourceSchemaViewer.js.map +1 -0
- package/dist/src/ui/components/SourceWebhookEditor.d.ts +8 -0
- package/dist/src/ui/components/SourceWebhookEditor.js +181 -0
- package/dist/src/ui/components/SourceWebhookEditor.js.map +1 -0
- package/dist/src/ui/components/SourcesView.d.ts +14 -0
- package/dist/src/ui/components/SourcesView.js +74 -0
- package/dist/src/ui/components/SourcesView.js.map +1 -0
- package/dist/src/ui/components/StoreViewer.d.ts +16 -0
- package/dist/src/ui/components/StoreViewer.js +86 -0
- package/dist/src/ui/components/StoreViewer.js.map +1 -0
- package/dist/src/ui/components/TabbedConsole.d.ts +17 -0
- package/dist/src/ui/components/TabbedConsole.js +163 -0
- package/dist/src/ui/components/TabbedConsole.js.map +1 -0
- package/dist/src/ui/components/common/DataTree.d.ts +15 -0
- package/dist/src/ui/components/common/DataTree.js +95 -0
- package/dist/src/ui/components/common/DataTree.js.map +1 -0
- package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
- package/dist/src/ui/components/common/EyeIcon.js +11 -0
- package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
- package/dist/src/ui/hooks/useEntityNavigation.d.ts +72 -0
- package/dist/src/ui/hooks/useEntityNavigation.js +150 -0
- package/dist/src/ui/hooks/useEntityNavigation.js.map +1 -0
- package/dist/src/ui/hooks/useQueryParams.d.ts +6 -0
- package/dist/src/ui/hooks/useQueryParams.js +39 -0
- package/dist/src/ui/hooks/useQueryParams.js.map +1 -0
- package/dist/src/ui/index.d.ts +1 -0
- package/dist/src/ui/index.js +23 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/ui/store/formStateSlice.d.ts +54 -0
- package/dist/src/ui/store/formStateSlice.js +94 -0
- package/dist/src/ui/store/formStateSlice.js.map +1 -0
- package/dist/src/ui/store/hooks.d.ts +6 -0
- package/dist/src/ui/store/hooks.js +8 -0
- package/dist/src/ui/store/hooks.js.map +1 -0
- package/dist/src/ui/store/index.d.ts +11 -0
- package/dist/src/ui/store/index.js +107 -0
- package/dist/src/ui/store/index.js.map +1 -0
- package/dist/src/utils/functionEndpoints.d.ts +24 -0
- package/dist/src/utils/functionEndpoints.js +45 -0
- package/dist/src/utils/functionEndpoints.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
6
|
+
const useQueryParams_1 = require("../hooks/useQueryParams");
|
|
7
|
+
const useEntityNavigation_1 = require("../hooks/useEntityNavigation");
|
|
8
|
+
const hooks_1 = require("../store/hooks");
|
|
9
|
+
const formStateSlice_1 = require("../store/formStateSlice");
|
|
10
|
+
const JobsView = ({ appInstalled, buildStatus }) => {
|
|
11
|
+
const location = (0, react_router_dom_1.useLocation)();
|
|
12
|
+
const { getParam, setParam } = (0, useQueryParams_1.useQueryParams)();
|
|
13
|
+
const [jobs, setJobs] = (0, react_1.useState)([]);
|
|
14
|
+
const [executions, setExecutions] = (0, react_1.useState)([]);
|
|
15
|
+
const [executionStates, setExecutionStates] = (0, react_1.useState)([]);
|
|
16
|
+
// Derive selection from URL
|
|
17
|
+
const pathParts = location.pathname.split('/').filter(Boolean);
|
|
18
|
+
const selectedJob = pathParts.length > 1 ? pathParts[1] : null;
|
|
19
|
+
const selectedExecution = getParam('execution');
|
|
20
|
+
const [expandedStates, setExpandedStates] = (0, react_1.useState)(new Set());
|
|
21
|
+
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
22
|
+
const [startJobDialogOpen, setStartJobDialogOpen] = (0, react_1.useState)(false);
|
|
23
|
+
const [startJobError, setStartJobError] = (0, react_1.useState)(null);
|
|
24
|
+
const [pollingInterval, setPollingInterval] = (0, react_1.useState)(null);
|
|
25
|
+
// Redux state for persisted job parameters
|
|
26
|
+
const dispatch = (0, hooks_1.useAppDispatch)();
|
|
27
|
+
const jobFormState = (0, hooks_1.useAppSelector)(state => state.formState.jobs['global'] || (0, formStateSlice_1.getDefaultJobFormState)());
|
|
28
|
+
// Parse parameters from JSON string
|
|
29
|
+
const jobParameters = (() => {
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(jobFormState.params);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
})();
|
|
37
|
+
// Helper to update job parameters in Redux
|
|
38
|
+
const setJobParameters = (paramsOrUpdater) => {
|
|
39
|
+
const newParams = typeof paramsOrUpdater === 'function'
|
|
40
|
+
? paramsOrUpdater(jobParameters)
|
|
41
|
+
: paramsOrUpdater;
|
|
42
|
+
dispatch((0, formStateSlice_1.updateJobState)({
|
|
43
|
+
id: 'global',
|
|
44
|
+
data: { params: JSON.stringify(newParams) }
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
// Use entity navigation hook for job (primary) selection
|
|
48
|
+
const { navigateToEntity: setSelectedJobAndNavigate } = (0, useEntityNavigation_1.useEntityNavigation)({
|
|
49
|
+
basePath: '/jobs',
|
|
50
|
+
entityName: 'job',
|
|
51
|
+
entities: jobs,
|
|
52
|
+
selectedEntityId: selectedJob,
|
|
53
|
+
});
|
|
54
|
+
// Navigation helper for execution (secondary) selection
|
|
55
|
+
const setSelectedExecutionAndUpdateUrl = (0, react_1.useCallback)((executionId, replace = false) => {
|
|
56
|
+
setParam('execution', executionId, replace);
|
|
57
|
+
}, [setParam]);
|
|
58
|
+
// Fetch jobs on mount
|
|
59
|
+
(0, react_1.useEffect)(() => {
|
|
60
|
+
if (appInstalled) {
|
|
61
|
+
fetchJobs();
|
|
62
|
+
}
|
|
63
|
+
}, [appInstalled]);
|
|
64
|
+
// Fetch executions when job is selected
|
|
65
|
+
(0, react_1.useEffect)(() => {
|
|
66
|
+
// Clear any existing polling when job changes
|
|
67
|
+
if (pollingInterval) {
|
|
68
|
+
clearInterval(pollingInterval);
|
|
69
|
+
setPollingInterval(null);
|
|
70
|
+
}
|
|
71
|
+
if (selectedJob) {
|
|
72
|
+
fetchExecutions(selectedJob);
|
|
73
|
+
}
|
|
74
|
+
}, [selectedJob]);
|
|
75
|
+
// Fetch execution states when execution is selected
|
|
76
|
+
(0, react_1.useEffect)(() => {
|
|
77
|
+
if (selectedExecution) {
|
|
78
|
+
fetchExecutionStates(selectedExecution);
|
|
79
|
+
}
|
|
80
|
+
}, [selectedExecution]);
|
|
81
|
+
// Polling effect for running jobs
|
|
82
|
+
(0, react_1.useEffect)(() => {
|
|
83
|
+
const hasRunningJobs = executions.some(execution => execution.status === 'running');
|
|
84
|
+
if (hasRunningJobs && selectedJob && !pollingInterval) {
|
|
85
|
+
// Start polling every 2 seconds for running jobs
|
|
86
|
+
const interval = setInterval(async () => {
|
|
87
|
+
await fetchExecutions(selectedJob);
|
|
88
|
+
if (selectedExecution) {
|
|
89
|
+
await fetchExecutionStates(selectedExecution);
|
|
90
|
+
}
|
|
91
|
+
}, 2000);
|
|
92
|
+
setPollingInterval(interval);
|
|
93
|
+
}
|
|
94
|
+
else if (!hasRunningJobs && pollingInterval) {
|
|
95
|
+
// Stop polling when no running jobs
|
|
96
|
+
clearInterval(pollingInterval);
|
|
97
|
+
setPollingInterval(null);
|
|
98
|
+
}
|
|
99
|
+
// Cleanup on unmount
|
|
100
|
+
return () => {
|
|
101
|
+
if (pollingInterval) {
|
|
102
|
+
clearInterval(pollingInterval);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}, [executions, selectedJob, selectedExecution, pollingInterval]);
|
|
106
|
+
// Validate execution ID in URL - redirect if invalid (secondary selection, not handled by hook)
|
|
107
|
+
(0, react_1.useEffect)(() => {
|
|
108
|
+
if (selectedExecution && executions.length > 0) {
|
|
109
|
+
const exists = executions.some(e => e.id === selectedExecution);
|
|
110
|
+
if (!exists) {
|
|
111
|
+
// Invalid execution ID in URL, redirect to first execution
|
|
112
|
+
console.warn(`Execution '${selectedExecution}' not found, redirecting to first execution`);
|
|
113
|
+
setSelectedExecutionAndUpdateUrl(executions[0].id, true); // replace: true for validation redirect
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
117
|
+
}, [selectedExecution, executions]);
|
|
118
|
+
// Auto-select first execution when job changes (secondary selection, not handled by hook)
|
|
119
|
+
(0, react_1.useEffect)(() => {
|
|
120
|
+
if (executions.length > 0 && !selectedExecution) {
|
|
121
|
+
setSelectedExecutionAndUpdateUrl(executions[0].id, true); // replace: true for auto-selection
|
|
122
|
+
}
|
|
123
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
124
|
+
}, [executions, selectedExecution]);
|
|
125
|
+
const fetchJobs = async () => {
|
|
126
|
+
try {
|
|
127
|
+
const response = await fetch('/devserver/api/jobs');
|
|
128
|
+
if (response.ok) {
|
|
129
|
+
const data = await response.json();
|
|
130
|
+
setJobs(data.jobs || []);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Error fetching jobs:', error);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const fetchExecutions = async (jobId) => {
|
|
138
|
+
try {
|
|
139
|
+
const response = await fetch(`/devserver/api/jobs/executions?jobId=${jobId}&limit=50`);
|
|
140
|
+
if (response.ok) {
|
|
141
|
+
const data = await response.json();
|
|
142
|
+
setExecutions(data.executions || []);
|
|
143
|
+
if (!data.executions || data.executions.length === 0) {
|
|
144
|
+
setSelectedExecutionAndUpdateUrl(null, true); // replace: true to avoid history entry
|
|
145
|
+
setExecutionStates([]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
console.error('Error fetching executions:', error);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const fetchExecutionStates = async (executionId) => {
|
|
154
|
+
try {
|
|
155
|
+
const response = await fetch(`/devserver/api/jobs/executions/${executionId}/states`);
|
|
156
|
+
if (response.ok) {
|
|
157
|
+
const data = await response.json();
|
|
158
|
+
setExecutionStates(data.states || []);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error('Error fetching execution states:', error);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const startJob = async () => {
|
|
166
|
+
if (!selectedJob)
|
|
167
|
+
return;
|
|
168
|
+
setLoading(true);
|
|
169
|
+
setStartJobError(null);
|
|
170
|
+
try {
|
|
171
|
+
const response = await fetch(`/devserver/api/jobs/${selectedJob}/start`, {
|
|
172
|
+
method: 'POST',
|
|
173
|
+
headers: {
|
|
174
|
+
'Content-Type': 'application/json',
|
|
175
|
+
},
|
|
176
|
+
body: JSON.stringify({
|
|
177
|
+
parameters: jobParameters
|
|
178
|
+
})
|
|
179
|
+
});
|
|
180
|
+
const data = await response.json();
|
|
181
|
+
if (response.ok) {
|
|
182
|
+
// Job started successfully - close modal immediately and reset loading state
|
|
183
|
+
setStartJobDialogOpen(false);
|
|
184
|
+
setJobParameters({});
|
|
185
|
+
setStartJobError(null);
|
|
186
|
+
setLoading(false);
|
|
187
|
+
// Get the execution ID from the response
|
|
188
|
+
const newExecutionId = data.execution?.id;
|
|
189
|
+
// Refresh executions to show the new running job (with small delay to ensure job is persisted)
|
|
190
|
+
setTimeout(async () => {
|
|
191
|
+
await fetchExecutions(selectedJob);
|
|
192
|
+
// Force polling for a short period to catch the running state and completion
|
|
193
|
+
const forcePollingInterval = setInterval(async () => {
|
|
194
|
+
await fetchExecutions(selectedJob);
|
|
195
|
+
// Always fetch states for the newest execution (first in list)
|
|
196
|
+
const response = await fetch(`/devserver/api/jobs/executions?jobId=${selectedJob}&limit=1`);
|
|
197
|
+
if (response.ok) {
|
|
198
|
+
const data = await response.json();
|
|
199
|
+
if (data.executions && data.executions.length > 0) {
|
|
200
|
+
await fetchExecutionStates(data.executions[0].id);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}, 1000);
|
|
204
|
+
// Stop force polling after 15 seconds
|
|
205
|
+
setTimeout(() => {
|
|
206
|
+
clearInterval(forcePollingInterval);
|
|
207
|
+
}, 15000);
|
|
208
|
+
}, 100);
|
|
209
|
+
if (!data.success) {
|
|
210
|
+
// Job failed to start - log the error but modal is already closed
|
|
211
|
+
console.error('Job execution failed to start:', data.error);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Request failed - show error and keep modal open for retry
|
|
216
|
+
const errorMessage = data.error?.message || data.error || 'Failed to start job';
|
|
217
|
+
setStartJobError(errorMessage);
|
|
218
|
+
console.error('Failed to start job:', data.error);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
// Network or other error
|
|
223
|
+
const errorMessage = error instanceof Error ? error.message : 'Network error occurred';
|
|
224
|
+
setStartJobError(errorMessage);
|
|
225
|
+
console.error('Error starting job:', error);
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
setLoading(false);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const formatTimestamp = (timestamp) => {
|
|
232
|
+
return new Date(timestamp).toLocaleString();
|
|
233
|
+
};
|
|
234
|
+
const formatExecutionTime = (time) => {
|
|
235
|
+
if (!time)
|
|
236
|
+
return 'N/A';
|
|
237
|
+
return `${time}ms`;
|
|
238
|
+
};
|
|
239
|
+
const getStatusColor = (status) => {
|
|
240
|
+
switch (status) {
|
|
241
|
+
case 'completed': return '#28a745';
|
|
242
|
+
case 'running': return '#007bff';
|
|
243
|
+
case 'failed': return '#dc3545';
|
|
244
|
+
case 'interrupted': return '#ffc107';
|
|
245
|
+
default: return '#6c757d';
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const toggleStateExpansion = (stateId) => {
|
|
249
|
+
const newExpanded = new Set(expandedStates);
|
|
250
|
+
if (newExpanded.has(stateId)) {
|
|
251
|
+
newExpanded.delete(stateId);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
newExpanded.add(stateId);
|
|
255
|
+
}
|
|
256
|
+
setExpandedStates(newExpanded);
|
|
257
|
+
};
|
|
258
|
+
const updateJobParameter = (key, value) => {
|
|
259
|
+
setJobParameters(prev => ({
|
|
260
|
+
...prev,
|
|
261
|
+
[key]: value
|
|
262
|
+
}));
|
|
263
|
+
};
|
|
264
|
+
const removeJobParameter = (key) => {
|
|
265
|
+
const newParams = { ...jobParameters };
|
|
266
|
+
delete newParams[key];
|
|
267
|
+
setJobParameters(newParams);
|
|
268
|
+
};
|
|
269
|
+
const addJobParameter = () => {
|
|
270
|
+
const key = `param_${Object.keys(jobParameters).length + 1}`;
|
|
271
|
+
updateJobParameter(key, '');
|
|
272
|
+
};
|
|
273
|
+
// Show loading state during initial build or when build is in progress
|
|
274
|
+
if (buildStatus?.buildInProgress || (buildStatus?.lastBuildSuccess === null && buildStatus?.lastBuildTimestamp === null)) {
|
|
275
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "jobs-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Building App..." }), (0, jsx_runtime_1.jsx)("p", { children: "Please wait while the app is being built." }), (0, jsx_runtime_1.jsx)("div", { className: "spinner" })] }) }));
|
|
276
|
+
}
|
|
277
|
+
// Show error state if build failed
|
|
278
|
+
if (buildStatus?.lastBuildSuccess === false) {
|
|
279
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "jobs-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Build Failed" }), (0, jsx_runtime_1.jsx)("p", { children: "The app failed to build. Please check the console for errors." }), buildStatus.lastBuildError && ((0, jsx_runtime_1.jsx)("pre", { className: "error-details", children: buildStatus.lastBuildError }))] }) }));
|
|
280
|
+
}
|
|
281
|
+
if (!appInstalled) {
|
|
282
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "jobs-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Jobs Not Available" }), (0, jsx_runtime_1.jsx)("p", { children: "Install your app first to manage jobs. Jobs will appear here after installation." })] }) }));
|
|
283
|
+
}
|
|
284
|
+
const selectedJobObj = jobs.find(j => j.id === selectedJob);
|
|
285
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "jobs-view", children: [(0, jsx_runtime_1.jsxs)("div", { className: "jobs-controls", children: [(0, jsx_runtime_1.jsxs)("div", { className: "job-selector-group", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "job-select", children: "Job:" }), (0, jsx_runtime_1.jsx)("select", { id: "job-select", value: selectedJob || '', onChange: (e) => setSelectedJobAndNavigate(e.target.value), disabled: jobs.length === 0, children: jobs.length === 0 ? ((0, jsx_runtime_1.jsx)("option", { value: "", children: "No jobs defined" })) : (jobs.map((job) => ((0, jsx_runtime_1.jsxs)("option", { value: job.id, children: [job.id, job.isSourceJob && ' (Source)', job.cron && ' (Scheduled)', !job.validation.valid && ' (Invalid)', job.description && ` - ${job.description}`] }, job.id)))) })] }), selectedJob && selectedJobObj?.validation.valid && ((0, jsx_runtime_1.jsx)("button", { className: "start-job-btn", onClick: () => {
|
|
286
|
+
setStartJobDialogOpen(true);
|
|
287
|
+
setStartJobError(null);
|
|
288
|
+
}, disabled: loading || buildStatus?.buildInProgress, title: buildStatus?.buildInProgress ? "Build in progress..." : "Start job execution", children: "Start Job" }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "jobs-layout", children: [(0, jsx_runtime_1.jsxs)("div", { className: "executions-panel", children: [(0, jsx_runtime_1.jsxs)("div", { className: "executions-header", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Execution History" }), selectedJob && ((0, jsx_runtime_1.jsxs)("span", { className: "selected-job", children: ["Job: ", selectedJob] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "executions-list", children: executions.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "no-executions", children: (0, jsx_runtime_1.jsx)("p", { children: selectedJob ? 'No executions yet' : 'Select a job to see executions' }) })) : (executions.map((execution) => ((0, jsx_runtime_1.jsxs)("div", { className: `execution-item ${selectedExecution === execution.id ? 'active' : ''}`, onClick: () => setSelectedExecutionAndUpdateUrl(execution.id), children: [(0, jsx_runtime_1.jsxs)("div", { className: "execution-status", children: [execution.status === 'running' ? ((0, jsx_runtime_1.jsx)("span", { className: "status-spinner" })) : ((0, jsx_runtime_1.jsx)("span", { className: "status-dot", style: { backgroundColor: getStatusColor(execution.status) } })), (0, jsx_runtime_1.jsx)("span", { className: "status-text", children: execution.status })] }), (0, jsx_runtime_1.jsxs)("div", { className: "execution-time", children: [(0, jsx_runtime_1.jsx)("div", { className: "started-at", children: formatTimestamp(execution.startedAt) }), execution.completedAt && ((0, jsx_runtime_1.jsxs)("div", { className: "execution-duration", children: ["Duration: ", formatExecutionTime(execution.executionTime)] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "execution-stats", children: (0, jsx_runtime_1.jsxs)("span", { className: "state-count", children: [execution.stateCount, " states"] }) }), execution.error && ((0, jsx_runtime_1.jsxs)("div", { className: "execution-error", children: ["Error: ", execution.error.message] }))] }, execution.id)))) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "states-panel", children: [(0, jsx_runtime_1.jsxs)("div", { className: "states-header", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Job States" }), selectedExecution && ((0, jsx_runtime_1.jsxs)("span", { className: "selected-execution", children: ["Execution: ", selectedExecution.slice(0, 8), "..."] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "states-list", children: executionStates.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "no-states", children: (0, jsx_runtime_1.jsx)("p", { children: selectedExecution ? 'No states recorded' : 'Select an execution to see states' }) })) : (executionStates.map((state) => ((0, jsx_runtime_1.jsxs)("div", { className: "state-item", children: [(0, jsx_runtime_1.jsxs)("div", { className: "state-header", onClick: () => toggleStateExpansion(state.id), children: [(0, jsx_runtime_1.jsxs)("div", { className: "state-meta", children: [(0, jsx_runtime_1.jsxs)("div", { className: "state-primary-info", children: [(0, jsx_runtime_1.jsx)("span", { className: "state-timestamp", children: formatTimestamp(state.timestamp) }), (0, jsx_runtime_1.jsx)("span", { className: `state-phase ${state.phase}`, children: state.phase })] }), state.complete && ((0, jsx_runtime_1.jsx)("div", { className: "state-secondary-info", children: (() => {
|
|
289
|
+
const currentExecution = executions.find(e => e.id === state.executionId);
|
|
290
|
+
const isError = currentExecution?.status === 'failed' && currentExecution?.error;
|
|
291
|
+
return ((0, jsx_runtime_1.jsx)("span", { className: `state-status ${isError ? 'error' : 'complete'}`, children: isError ? 'Error' : 'Completed' }));
|
|
292
|
+
})() }))] }), (0, jsx_runtime_1.jsx)("div", { className: "state-expand", children: (0, jsx_runtime_1.jsx)("span", { className: `expand-icon ${expandedStates.has(state.id) ? 'expanded' : ''}`, children: "\u25BC" }) })] }), expandedStates.has(state.id) && ((0, jsx_runtime_1.jsx)("div", { className: "state-content", children: (0, jsx_runtime_1.jsx)("pre", { children: JSON.stringify(state.state, null, 2) }) }))] }, state.id)))) })] })] }), startJobDialogOpen && ((0, jsx_runtime_1.jsx)("div", { className: "modal-overlay", children: (0, jsx_runtime_1.jsxs)("div", { className: "modal", children: [(0, jsx_runtime_1.jsxs)("div", { className: "modal-header", children: [(0, jsx_runtime_1.jsxs)("h3", { children: ["Start Job: ", selectedJob] }), (0, jsx_runtime_1.jsx)("button", { className: "modal-close", onClick: () => {
|
|
293
|
+
setStartJobDialogOpen(false);
|
|
294
|
+
setStartJobError(null);
|
|
295
|
+
setJobParameters({});
|
|
296
|
+
}, children: "\u00D7" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "modal-body", children: [startJobError && ((0, jsx_runtime_1.jsxs)("div", { className: "start-job-error", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Error" }), (0, jsx_runtime_1.jsx)("p", { children: startJobError })] })), (0, jsx_runtime_1.jsxs)("div", { className: "job-parameters", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Parameters" }), (0, jsx_runtime_1.jsxs)("div", { className: "parameter-list", children: [Object.entries(jobParameters).map(([key, value]) => ((0, jsx_runtime_1.jsxs)("div", { className: "parameter-row", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", value: key, onChange: (e) => {
|
|
297
|
+
const newKey = e.target.value;
|
|
298
|
+
const newParams = { ...jobParameters };
|
|
299
|
+
delete newParams[key];
|
|
300
|
+
newParams[newKey] = value;
|
|
301
|
+
setJobParameters(newParams);
|
|
302
|
+
}, placeholder: "Parameter name", className: "parameter-key" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: typeof value === 'string' ? value : JSON.stringify(value), onChange: (e) => {
|
|
303
|
+
try {
|
|
304
|
+
updateJobParameter(key, JSON.parse(e.target.value));
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
updateJobParameter(key, e.target.value);
|
|
308
|
+
}
|
|
309
|
+
}, placeholder: "Parameter value (JSON or string)", className: "parameter-value" }), (0, jsx_runtime_1.jsx)("button", { className: "remove-parameter", onClick: () => removeJobParameter(key), children: "\u00D7" })] }, key))), (0, jsx_runtime_1.jsx)("button", { className: "add-parameter", onClick: addJobParameter, children: "Add Parameter" })] })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "modal-footer", children: [(0, jsx_runtime_1.jsx)("button", { className: "cancel-btn", onClick: () => {
|
|
310
|
+
setStartJobDialogOpen(false);
|
|
311
|
+
setStartJobError(null);
|
|
312
|
+
setJobParameters({});
|
|
313
|
+
}, children: "Cancel" }), startJobError ? ((0, jsx_runtime_1.jsx)("button", { className: "start-btn", onClick: () => {
|
|
314
|
+
setStartJobDialogOpen(false);
|
|
315
|
+
setStartJobError(null);
|
|
316
|
+
setJobParameters({});
|
|
317
|
+
}, children: "Close" })) : ((0, jsx_runtime_1.jsx)("button", { className: "start-btn", onClick: startJob, disabled: loading, children: loading ? 'Starting...' : 'Start Job' }))] })] }) }))] }));
|
|
318
|
+
};
|
|
319
|
+
exports.default = JobsView;
|
|
320
|
+
//# sourceMappingURL=JobsView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobsView.js","sourceRoot":"","sources":["../../../../src/ui/components/JobsView.tsx"],"names":[],"mappings":";;;AAAA,iCAAgE;AAChE,uDAA+C;AAC/C,4DAAyD;AACzD,sEAAmE;AACnE,0CAAgE;AAChE,4DAGiC;AAoDjC,MAAM,QAAQ,GAA4B,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;IAC1E,MAAM,QAAQ,GAAG,IAAA,8BAAW,GAAE,CAAC;IAC/B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAA,+BAAc,GAAE,CAAC;IAEhD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAkB,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAiB,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAAa,EAAE,CAAC,CAAC;IAEvE,4BAA4B;IAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,iBAAiB,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,IAAA,gBAAQ,EAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACpE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAAwB,IAAI,CAAC,CAAC;IAEpF,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAA,sBAAc,GAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAA,sBAAc,EACjC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAA,uCAAsB,GAAE,CACpE,CAAC;IAEF,oCAAoC;IACpC,MAAM,aAAa,GAAwB,CAAC,GAAG,EAAE;QAC/C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,2CAA2C;IAC3C,MAAM,gBAAgB,GAAG,CAAC,eAA2F,EAAE,EAAE;QACvH,MAAM,SAAS,GAAG,OAAO,eAAe,KAAK,UAAU;YACrD,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC;YAChC,CAAC,CAAC,eAAe,CAAC;QACpB,QAAQ,CAAC,IAAA,+BAAoB,EAAC;YAC5B,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;SAC5C,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,yDAAyD;IACzD,MAAM,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,GAAG,IAAA,yCAAmB,EAAC;QAC1E,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;QACd,gBAAgB,EAAE,WAAW;KAC9B,CAAC,CAAC;IAEH,wDAAwD;IACxD,MAAM,gCAAgC,GAAG,IAAA,mBAAW,EAAC,CAAC,WAA0B,EAAE,UAAmB,KAAK,EAAE,EAAE;QAC5G,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,sBAAsB;IACtB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,YAAY,EAAE,CAAC;YACjB,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,wCAAwC;IACxC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,8CAA8C;QAC9C,IAAI,eAAe,EAAE,CAAC;YACpB,aAAa,CAAC,eAAe,CAAC,CAAC;YAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,eAAe,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,oDAAoD;IACpD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,EAAE,CAAC;YACtB,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,kCAAkC;IAClC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAEpF,IAAI,cAAc,IAAI,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;YACtD,iDAAiD;YACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;gBACtC,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;gBACnC,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,CAAC,cAAc,IAAI,eAAe,EAAE,CAAC;YAC9C,oCAAoC;YACpC,aAAa,CAAC,eAAe,CAAC,CAAC;YAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,qBAAqB;QACrB,OAAO,GAAG,EAAE;YACV,IAAI,eAAe,EAAE,CAAC;gBACpB,aAAa,CAAC,eAAe,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC,CAAC;IAElE,gGAAgG;IAChG,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,2DAA2D;gBAC3D,OAAO,CAAC,IAAI,CAAC,cAAc,iBAAiB,6CAA6C,CAAC,CAAC;gBAC3F,gCAAgC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,wCAAwC;YACpG,CAAC;QACH,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;IAEpC,0FAA0F;IAC1F,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChD,gCAAgC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,mCAAmC;QAC/F,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACpD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,wCAAwC,KAAK,WAAW,CAAC,CAAC;YACvF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,aAAa,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrD,gCAAgC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,uCAAuC;oBACrF,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,KAAK,EAAE,WAAmB,EAAE,EAAE;QACzD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,WAAW,SAAS,CAAC,CAAC;YACrF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,kBAAkB,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAuB,WAAW,QAAQ,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,UAAU,EAAE,aAAa;iBAC1B,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,6EAA6E;gBAC7E,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBAC7B,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACvB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAElB,yCAAyC;gBACzC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;gBAE1C,+FAA+F;gBAC/F,UAAU,CAAC,KAAK,IAAI,EAAE;oBACpB,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;oBAEnC,6EAA6E;oBAC7E,MAAM,oBAAoB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;wBAClD,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;wBACnC,+DAA+D;wBAC/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,wCAAwC,WAAW,UAAU,CAAC,CAAC;wBAC5F,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;4BAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;4BACnC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAClD,MAAM,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BACpD,CAAC;wBACH,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,CAAC;oBAET,sCAAsC;oBACtC,UAAU,CAAC,GAAG,EAAE;wBACd,aAAa,CAAC,oBAAoB,CAAC,CAAC;oBACtC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACZ,CAAC,EAAE,GAAG,CAAC,CAAC;gBAER,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,kEAAkE;oBAClE,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,4DAA4D;gBAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,qBAAqB,CAAC;gBAChF,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yBAAyB;YACzB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;YACvF,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAE,EAAE;QAC5C,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,IAAa,EAAE,EAAE;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE;QACxC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,WAAW,CAAC,CAAC,OAAO,SAAS,CAAC;YACnC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;YACjC,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;YAChC,KAAK,aAAa,CAAC,CAAC,OAAO,SAAS,CAAC;YACrC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,EAAE;QAC/C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,EAAE;QACrD,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,GAAG,IAAI;YACP,CAAC,GAAG,CAAC,EAAE,KAAK;SACb,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE;QACzC,MAAM,SAAS,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACtB,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,GAAG,GAAG,SAAS,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,uEAAuE;IACvE,IAAI,WAAW,EAAE,eAAe,IAAI,CAAC,WAAW,EAAE,gBAAgB,KAAK,IAAI,IAAI,WAAW,EAAE,kBAAkB,KAAK,IAAI,CAAC,EAAE,CAAC;QACzH,OAAO,CACL,gCAAK,SAAS,EAAC,oBAAoB,YACjC,iCAAK,SAAS,EAAC,qBAAqB,aAClC,6DAAwB,EACxB,sFAAgD,EAChD,gCAAK,SAAS,EAAC,SAAS,GAAO,IAC3B,GACF,CACP,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,WAAW,EAAE,gBAAgB,KAAK,KAAK,EAAE,CAAC;QAC5C,OAAO,CACL,gCAAK,SAAS,EAAC,oBAAoB,YACjC,iCAAK,SAAS,EAAC,qBAAqB,aAClC,0DAAqB,EACrB,0GAAoE,EACnE,WAAW,CAAC,cAAc,IAAI,CAC7B,gCAAK,SAAS,EAAC,eAAe,YAAE,WAAW,CAAC,cAAc,GAAO,CAClE,IACG,GACF,CACP,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CACL,gCAAK,SAAS,EAAC,oBAAoB,YACjC,iCAAK,SAAS,EAAC,qBAAqB,aAClC,gEAA2B,EAC3B,6HAAuF,IACnF,GACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;IAE5D,OAAO,CACL,iCAAK,SAAS,EAAC,WAAW,aAExB,iCAAK,SAAS,EAAC,eAAe,aAC5B,iCAAK,SAAS,EAAC,oBAAoB,aACjC,kCAAO,OAAO,EAAC,YAAY,qBAAa,EACxC,mCACE,EAAE,EAAC,YAAY,EACf,KAAK,EAAE,WAAW,IAAI,EAAE,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1D,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,YAE1B,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACnB,mCAAQ,KAAK,EAAC,EAAE,gCAAyB,CAC1C,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAChB,oCAAqB,KAAK,EAAE,GAAG,CAAC,EAAE,aAC/B,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,WAAW,IAAI,WAAW,EAC9B,GAAG,CAAC,IAAI,IAAI,cAAc,EAC1B,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,YAAY,EACrC,GAAG,CAAC,WAAW,IAAI,MAAM,GAAG,CAAC,WAAW,EAAE,KALhC,GAAG,CAAC,EAAE,CAMV,CACV,CAAC,CACH,GACM,IACL,EACL,WAAW,IAAI,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAClD,mCACE,SAAS,EAAC,eAAe,EACzB,OAAO,EAAE,GAAG,EAAE;4BACZ,qBAAqB,CAAC,IAAI,CAAC,CAAC;4BAC5B,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBACzB,CAAC,EACD,QAAQ,EAAE,OAAO,IAAI,WAAW,EAAE,eAAe,EACjD,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,qBAAqB,0BAG7E,CACV,IACG,EAEN,iCAAK,SAAS,EAAC,aAAa,aAE1B,iCAAK,SAAS,EAAC,kBAAkB,aAC/B,iCAAK,SAAS,EAAC,mBAAmB,aAChC,+DAA0B,EACzB,WAAW,IAAI,CACd,kCAAM,SAAS,EAAC,cAAc,sBAAO,WAAW,IAAQ,CACzD,IACG,EACN,gCAAK,SAAS,EAAC,iBAAiB,YAC7B,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACzB,gCAAK,SAAS,EAAC,eAAe,YAC5B,wCAAI,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gCAAgC,GAAK,GACzE,CACP,CAAC,CAAC,CAAC,CACF,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAC5B,iCAEE,SAAS,EAAE,kBAAkB,iBAAiB,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EACjF,OAAO,EAAE,GAAG,EAAE,CAAC,gCAAgC,CAAC,SAAS,CAAC,EAAE,CAAC,aAE7D,iCAAK,SAAS,EAAC,kBAAkB,aAC9B,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAChC,iCAAM,SAAS,EAAC,gBAAgB,GAAQ,CACzC,CAAC,CAAC,CAAC,CACF,iCACE,SAAS,EAAC,YAAY,EACtB,KAAK,EAAE,EAAE,eAAe,EAAE,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GACtD,CACT,EACD,iCAAM,SAAS,EAAC,aAAa,YAAE,SAAS,CAAC,MAAM,GAAQ,IACnD,EACN,iCAAK,SAAS,EAAC,gBAAgB,aAC7B,gCAAK,SAAS,EAAC,YAAY,YAAE,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,GAAO,EACvE,SAAS,CAAC,WAAW,IAAI,CACxB,iCAAK,SAAS,EAAC,oBAAoB,2BACtB,mBAAmB,CAAC,SAAS,CAAC,aAAa,CAAC,IACnD,CACP,IACG,EACN,gCAAK,SAAS,EAAC,iBAAiB,YAC9B,kCAAM,SAAS,EAAC,aAAa,aAAE,SAAS,CAAC,UAAU,eAAe,GAC9D,EACL,SAAS,CAAC,KAAK,IAAI,CAClB,iCAAK,SAAS,EAAC,iBAAiB,wBACtB,SAAS,CAAC,KAAK,CAAC,OAAO,IAC3B,CACP,KA9BI,SAAS,CAAC,EAAE,CA+Bb,CACP,CAAC,CACH,GACG,IACF,EAGN,iCAAK,SAAS,EAAC,cAAc,aAC3B,iCAAK,SAAS,EAAC,eAAe,aAC5B,wDAAmB,EAClB,iBAAiB,IAAI,CACpB,kCAAM,SAAS,EAAC,oBAAoB,4BAAa,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAC1F,IACG,EACN,gCAAK,SAAS,EAAC,aAAa,YACzB,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC9B,gCAAK,SAAS,EAAC,WAAW,YACxB,wCAAI,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mCAAmC,GAAK,GACnF,CACP,CAAC,CAAC,CAAC,CACF,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC7B,iCAAoB,SAAS,EAAC,YAAY,aACxC,iCACE,SAAS,EAAC,cAAc,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,aAE7C,iCAAK,SAAS,EAAC,YAAY,aACzB,iCAAK,SAAS,EAAC,oBAAoB,aACjC,iCAAM,SAAS,EAAC,iBAAiB,YAC9B,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,GAC5B,EACP,iCAAM,SAAS,EAAE,eAAe,KAAK,CAAC,KAAK,EAAE,YAC1C,KAAK,CAAC,KAAK,GACP,IACH,EACL,KAAK,CAAC,QAAQ,IAAI,CACjB,gCAAK,SAAS,EAAC,sBAAsB,YAClC,CAAC,GAAG,EAAE;gEACL,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC;gEAC1E,MAAM,OAAO,GAAG,gBAAgB,EAAE,MAAM,KAAK,QAAQ,IAAI,gBAAgB,EAAE,KAAK,CAAC;gEACjF,OAAO,CACL,iCAAM,SAAS,EAAE,gBAAgB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,YAC9D,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,GAC3B,CACR,CAAC;4DACJ,CAAC,CAAC,EAAE,GACA,CACP,IACG,EACN,gCAAK,SAAS,EAAC,cAAc,YAC3B,iCAAM,SAAS,EAAE,eAAe,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,uBAEzE,GACH,IACF,EACL,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAC/B,gCAAK,SAAS,EAAC,eAAe,YAC5B,0CAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAO,GAC7C,CACP,KAtCO,KAAK,CAAC,EAAE,CAuCZ,CACP,CAAC,CACH,GACG,IACF,IACF,EAGL,kBAAkB,IAAI,CACrB,gCAAK,SAAS,EAAC,eAAe,YAC5B,iCAAK,SAAS,EAAC,OAAO,aACpB,iCAAK,SAAS,EAAC,cAAc,aAC3B,0DAAgB,WAAW,IAAM,EACjC,mCACE,SAAS,EAAC,aAAa,EACvB,OAAO,EAAE,GAAG,EAAE;wCACZ,qBAAqB,CAAC,KAAK,CAAC,CAAC;wCAC7B,gBAAgB,CAAC,IAAI,CAAC,CAAC;wCACvB,gBAAgB,CAAC,EAAE,CAAC,CAAC;oCACvB,CAAC,uBAGM,IACL,EACN,iCAAK,SAAS,EAAC,YAAY,aACxB,aAAa,IAAI,CAChB,iCAAK,SAAS,EAAC,iBAAiB,aAC9B,mDAAc,EACd,wCAAI,aAAa,GAAK,IAClB,CACP,EACD,iCAAK,SAAS,EAAC,gBAAgB,aAC7B,wDAAmB,EACnB,iCAAK,SAAS,EAAC,gBAAgB,aAC5B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACnD,iCAAe,SAAS,EAAC,eAAe,aACtC,kCACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gEACd,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gEAC9B,MAAM,SAAS,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;gEACvC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;gEACtB,SAAS,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;gEAC1B,gBAAgB,CAAC,SAAS,CAAC,CAAC;4DAC9B,CAAC,EACD,WAAW,EAAC,gBAAgB,EAC5B,SAAS,EAAC,eAAe,GACzB,EACF,kCACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAChE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gEACd,IAAI,CAAC;oEACH,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gEACtD,CAAC;gEAAC,MAAM,CAAC;oEACP,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gEAC1C,CAAC;4DACH,CAAC,EACD,WAAW,EAAC,kCAAkC,EAC9C,SAAS,EAAC,iBAAiB,GAC3B,EACF,mCACE,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,uBAG/B,KAhCD,GAAG,CAiCP,CACP,CAAC,EACF,mCACE,SAAS,EAAC,eAAe,EACzB,OAAO,EAAE,eAAe,8BAGjB,IACL,IACF,IACF,EACN,iCAAK,SAAS,EAAC,cAAc,aAC3B,mCACE,SAAS,EAAC,YAAY,EACtB,OAAO,EAAE,GAAG,EAAE;wCACZ,qBAAqB,CAAC,KAAK,CAAC,CAAC;wCAC7B,gBAAgB,CAAC,IAAI,CAAC,CAAC;wCACvB,gBAAgB,CAAC,EAAE,CAAC,CAAC;oCACvB,CAAC,uBAGM,EACR,aAAa,CAAC,CAAC,CAAC,CACf,mCACE,SAAS,EAAC,WAAW,EACrB,OAAO,EAAE,GAAG,EAAE;wCACZ,qBAAqB,CAAC,KAAK,CAAC,CAAC;wCAC7B,gBAAgB,CAAC,IAAI,CAAC,CAAC;wCACvB,gBAAgB,CAAC,EAAE,CAAC,CAAC;oCACvB,CAAC,sBAGM,CACV,CAAC,CAAC,CAAC,CACF,mCACE,SAAS,EAAC,WAAW,EACrB,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,OAAO,YAEhB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,GAC/B,CACV,IACG,IACF,GACF,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface KVStoreViewerProps {
|
|
3
|
+
data: {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
};
|
|
6
|
+
title: string;
|
|
7
|
+
apiEndpoint: string;
|
|
8
|
+
onUpdate: (updatedData: any) => void;
|
|
9
|
+
}
|
|
10
|
+
declare const KVStoreViewer: React.FC<KVStoreViewerProps>;
|
|
11
|
+
export default KVStoreViewer;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const KVStoreViewer = ({ data, title, apiEndpoint, onUpdate }) => {
|
|
6
|
+
const [editingKey, setEditingKey] = (0, react_1.useState)(null);
|
|
7
|
+
const [editValue, setEditValue] = (0, react_1.useState)('');
|
|
8
|
+
const [newKey, setNewKey] = (0, react_1.useState)('');
|
|
9
|
+
const [newValue, setNewValue] = (0, react_1.useState)('');
|
|
10
|
+
const [showAddForm, setShowAddForm] = (0, react_1.useState)(false);
|
|
11
|
+
const startEditing = (key, value) => {
|
|
12
|
+
setEditingKey(key);
|
|
13
|
+
// Format JSON for editing
|
|
14
|
+
setEditValue(JSON.stringify(value, null, 2));
|
|
15
|
+
};
|
|
16
|
+
const saveEdit = async (key) => {
|
|
17
|
+
try {
|
|
18
|
+
// Parse JSON value
|
|
19
|
+
let newValue;
|
|
20
|
+
try {
|
|
21
|
+
newValue = JSON.parse(editValue);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
alert('Invalid JSON format. Please check your syntax.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Update via API - API expects value wrapped in object
|
|
28
|
+
const response = await fetch(`${apiEndpoint}/${encodeURIComponent(key)}`, {
|
|
29
|
+
method: 'PUT',
|
|
30
|
+
headers: {
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify(newValue),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
throw new Error(`Failed to update KV value: ${response.statusText}`);
|
|
37
|
+
}
|
|
38
|
+
const result = await response.json();
|
|
39
|
+
// API only returns the key, so we trust that our value was stored correctly
|
|
40
|
+
// Update local state with what we sent
|
|
41
|
+
const updatedData = { ...data, [key]: newValue };
|
|
42
|
+
onUpdate(updatedData);
|
|
43
|
+
setEditingKey(null);
|
|
44
|
+
setEditValue('');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error('Error updating KV value:', error);
|
|
48
|
+
alert(`Failed to update value: ${error instanceof Error ? error.message : String(error)}`);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const deleteKey = async (key) => {
|
|
52
|
+
if (!confirm(`Are you sure you want to delete the key "${key}"?`)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
// Delete via API
|
|
57
|
+
const response = await fetch(`${apiEndpoint}/${encodeURIComponent(key)}`, {
|
|
58
|
+
method: 'DELETE',
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error(`Failed to delete KV value: ${response.statusText}`);
|
|
62
|
+
}
|
|
63
|
+
// Update local state
|
|
64
|
+
const updatedData = { ...data };
|
|
65
|
+
delete updatedData[key];
|
|
66
|
+
onUpdate(updatedData);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('Error deleting KV value:', error);
|
|
70
|
+
alert(`Failed to delete value: ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const addNewEntry = async () => {
|
|
74
|
+
if (!newKey.trim()) {
|
|
75
|
+
alert('Please enter a key name');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
// Parse JSON value
|
|
80
|
+
let value;
|
|
81
|
+
try {
|
|
82
|
+
value = JSON.parse(newValue);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
alert('Invalid JSON format. Please check your syntax.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Add via API - API expects value wrapped in object
|
|
89
|
+
const response = await fetch(`${apiEndpoint}/${encodeURIComponent(newKey)}`, {
|
|
90
|
+
method: 'PUT',
|
|
91
|
+
headers: {
|
|
92
|
+
'Content-Type': 'application/json',
|
|
93
|
+
},
|
|
94
|
+
body: JSON.stringify({ value }),
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new Error(`Failed to add KV value: ${response.statusText}`);
|
|
98
|
+
}
|
|
99
|
+
const result = await response.json();
|
|
100
|
+
// API only returns the key, so we trust that our value was stored correctly
|
|
101
|
+
// Update local state with what we sent
|
|
102
|
+
const updatedData = { ...data, [newKey]: value };
|
|
103
|
+
onUpdate(updatedData);
|
|
104
|
+
// Reset form
|
|
105
|
+
setNewKey('');
|
|
106
|
+
setNewValue('');
|
|
107
|
+
setShowAddForm(false);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('Error adding KV value:', error);
|
|
111
|
+
alert(`Failed to add value: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const cancelEdit = () => {
|
|
115
|
+
setEditingKey(null);
|
|
116
|
+
setEditValue('');
|
|
117
|
+
};
|
|
118
|
+
const cancelAdd = () => {
|
|
119
|
+
setNewKey('');
|
|
120
|
+
setNewValue('');
|
|
121
|
+
setShowAddForm(false);
|
|
122
|
+
};
|
|
123
|
+
const keys = Object.keys(data).sort();
|
|
124
|
+
const [expandedKeys, setExpandedKeys] = (0, react_1.useState)(new Set());
|
|
125
|
+
const toggleKey = (key) => {
|
|
126
|
+
const newExpanded = new Set(expandedKeys);
|
|
127
|
+
if (newExpanded.has(key)) {
|
|
128
|
+
newExpanded.delete(key);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
newExpanded.add(key);
|
|
132
|
+
}
|
|
133
|
+
setExpandedKeys(newExpanded);
|
|
134
|
+
};
|
|
135
|
+
const renderKeyValue = (key, value) => {
|
|
136
|
+
const isEditing = editingKey === key;
|
|
137
|
+
if (isEditing) {
|
|
138
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "edit-mode", children: [(0, jsx_runtime_1.jsx)("textarea", { className: "edit-input", value: editValue, onChange: (e) => setEditValue(e.target.value), placeholder: "Enter JSON document", rows: 8, style: { width: '100%', fontFamily: 'monospace' } }), (0, jsx_runtime_1.jsxs)("div", { className: "edit-controls", children: [(0, jsx_runtime_1.jsx)("button", { className: "save-btn", onClick: () => saveEdit(key), children: "Save" }), (0, jsx_runtime_1.jsx)("button", { className: "cancel-btn", onClick: cancelEdit, children: "Cancel" })] })] }));
|
|
139
|
+
}
|
|
140
|
+
// Show formatted JSON for all values
|
|
141
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "json-display", children: (0, jsx_runtime_1.jsx)("pre", { style: {
|
|
142
|
+
margin: 0,
|
|
143
|
+
padding: '8px',
|
|
144
|
+
background: '#3c3c3c',
|
|
145
|
+
border: '1px solid #4a4a4a',
|
|
146
|
+
borderRadius: '3px',
|
|
147
|
+
color: '#cccccc',
|
|
148
|
+
fontFamily: 'monospace',
|
|
149
|
+
fontSize: '11px',
|
|
150
|
+
whiteSpace: 'pre-wrap',
|
|
151
|
+
wordWrap: 'break-word',
|
|
152
|
+
overflowX: 'auto'
|
|
153
|
+
}, children: JSON.stringify(value, null, 2) }) }));
|
|
154
|
+
};
|
|
155
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "kv-store-viewer compact-store", children: (0, jsx_runtime_1.jsxs)("div", { className: "store-sections", children: [keys.map((key) => {
|
|
156
|
+
const value = data[key];
|
|
157
|
+
const isExpanded = expandedKeys.has(key);
|
|
158
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "store-section", children: [(0, jsx_runtime_1.jsxs)("div", { className: "section-header", onClick: () => toggleKey(key), style: { cursor: 'pointer' }, children: [(0, jsx_runtime_1.jsx)("span", { className: "expand-icon", children: isExpanded ? '▼' : '▶' }), (0, jsx_runtime_1.jsx)("span", { className: "section-name", children: key }), (0, jsx_runtime_1.jsxs)("div", { className: "section-actions", children: [(0, jsx_runtime_1.jsx)("button", { className: "edit-icon", onClick: (e) => {
|
|
159
|
+
e.stopPropagation();
|
|
160
|
+
startEditing(key, value);
|
|
161
|
+
}, title: "Edit JSON", children: "\u270F\uFE0F" }), (0, jsx_runtime_1.jsx)("button", { className: "delete-icon", onClick: (e) => {
|
|
162
|
+
e.stopPropagation();
|
|
163
|
+
deleteKey(key);
|
|
164
|
+
}, title: "Delete Entry", children: "\uD83D\uDDD1\uFE0F" })] })] }), isExpanded && ((0, jsx_runtime_1.jsx)("div", { className: "json-content", children: renderKeyValue(key, value) }))] }, key));
|
|
165
|
+
}), showAddForm && ((0, jsx_runtime_1.jsxs)("div", { className: "store-section add-form", children: [(0, jsx_runtime_1.jsxs)("div", { className: "section-header", children: [(0, jsx_runtime_1.jsx)("span", { className: "expand-icon" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: newKey, onChange: (e) => setNewKey(e.target.value), placeholder: "Key name", className: "key-input" }), (0, jsx_runtime_1.jsxs)("div", { className: "section-actions", children: [(0, jsx_runtime_1.jsx)("button", { className: "save-btn", onClick: addNewEntry, children: "Save" }), (0, jsx_runtime_1.jsx)("button", { className: "cancel-btn", onClick: cancelAdd, children: "Cancel" })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "primitive-value", children: (0, jsx_runtime_1.jsx)("textarea", { value: newValue, onChange: (e) => setNewValue(e.target.value), placeholder: 'Enter JSON document (e.g., {"field1": "value1", "field2": "value2"})', className: "value-input", rows: 4, style: { width: '100%', fontFamily: 'monospace' } }) })] })), (0, jsx_runtime_1.jsx)("div", { className: "add-entry-section", children: (0, jsx_runtime_1.jsx)("button", { className: "add-entry-btn", onClick: () => setShowAddForm(!showAddForm), children: showAddForm ? 'Cancel' : '+ Add Entry' }) }), keys.length === 0 && !showAddForm && ((0, jsx_runtime_1.jsx)("div", { className: "empty-store", children: "No entries in this store" }))] }) }));
|
|
166
|
+
};
|
|
167
|
+
exports.default = KVStoreViewer;
|
|
168
|
+
//# sourceMappingURL=KVStoreViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KVStoreViewer.js","sourceRoot":"","sources":["../../../../src/ui/components/KVStoreViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './MetadataModal.css';
|
|
3
|
+
interface MetadataModalProps {
|
|
4
|
+
isOpen: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
attempt: string;
|
|
7
|
+
syncId: string;
|
|
8
|
+
syncName: string;
|
|
9
|
+
onAttemptChange: (value: string) => void;
|
|
10
|
+
onSyncIdChange: (value: string) => void;
|
|
11
|
+
onSyncNameChange: (value: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const MetadataModal: React.FC<MetadataModalProps>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetadataModal = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
require("./MetadataModal.css");
|
|
7
|
+
const MetadataModal = ({ isOpen, onClose, attempt, syncId, syncName, onAttemptChange, onSyncIdChange, onSyncNameChange }) => {
|
|
8
|
+
(0, react_1.useEffect)(() => {
|
|
9
|
+
if (!isOpen)
|
|
10
|
+
return;
|
|
11
|
+
const handleEscape = (e) => {
|
|
12
|
+
if (e.key === 'Escape')
|
|
13
|
+
onClose();
|
|
14
|
+
};
|
|
15
|
+
window.addEventListener('keydown', handleEscape);
|
|
16
|
+
return () => window.removeEventListener('keydown', handleEscape);
|
|
17
|
+
}, [isOpen, onClose]);
|
|
18
|
+
if (!isOpen)
|
|
19
|
+
return null;
|
|
20
|
+
const handleOverlayClick = (e) => {
|
|
21
|
+
if (e.target === e.currentTarget) {
|
|
22
|
+
onClose();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "metadata-modal-overlay", onClick: handleOverlayClick, children: (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-content", children: [(0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-header", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Batch Metadata" }), (0, jsx_runtime_1.jsx)("button", { className: "metadata-modal-close", onClick: onClose, children: "\u00D7" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-body", children: [(0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-field", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "attempt", children: "Attempt:" }), (0, jsx_runtime_1.jsx)("input", { id: "attempt", type: "number", value: attempt, onChange: (e) => onAttemptChange(e.target.value), min: "1" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-field", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "syncId", children: "Sync ID:" }), (0, jsx_runtime_1.jsx)("input", { id: "syncId", type: "text", value: syncId, onChange: (e) => onSyncIdChange(e.target.value) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-field", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "syncName", children: "Sync Name:" }), (0, jsx_runtime_1.jsx)("input", { id: "syncName", type: "text", value: syncName, onChange: (e) => onSyncNameChange(e.target.value) })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "metadata-modal-footer", children: (0, jsx_runtime_1.jsx)("p", { className: "auto-save-indicator", children: "Changes auto-saved" }) })] }) }));
|
|
26
|
+
};
|
|
27
|
+
exports.MetadataModal = MetadataModal;
|
|
28
|
+
//# sourceMappingURL=MetadataModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataModal.js","sourceRoot":"","sources":["../../../../src/ui/components/MetadataModal.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyC;AACzC,+BAA6B;AAatB,MAAM,aAAa,GAAiC,CAAC,EAC1D,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EACjB,EAAE,EAAE;IACH,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,YAAY,GAAG,CAAC,CAAgB,EAAE,EAAE;YACxC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACjD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,kBAAkB,GAAG,CAAC,CAAmC,EAAE,EAAE;QACjE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,gCACE,SAAS,EAAC,wBAAwB,EAClC,OAAO,EAAE,kBAAkB,YAE3B,iCAAK,SAAS,EAAC,wBAAwB,aACrC,iCAAK,SAAS,EAAC,uBAAuB,aACpC,4DAAuB,EACvB,mCAAQ,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,OAAO,uBAAY,IACjE,EACN,iCAAK,SAAS,EAAC,qBAAqB,aAClC,iCAAK,SAAS,EAAC,sBAAsB,aACnC,kCAAO,OAAO,EAAC,SAAS,yBAAiB,EACzC,kCACE,EAAE,EAAC,SAAS,EACZ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD,GAAG,EAAC,GAAG,GACP,IACE,EACN,iCAAK,SAAS,EAAC,sBAAsB,aACnC,kCAAO,OAAO,EAAC,QAAQ,yBAAiB,EACxC,kCACE,EAAE,EAAC,QAAQ,EACX,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC/C,IACE,EACN,iCAAK,SAAS,EAAC,sBAAsB,aACnC,kCAAO,OAAO,EAAC,UAAU,2BAAmB,EAC5C,kCACE,EAAE,EAAC,UAAU,EACb,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACjD,IACE,IACF,EACN,gCAAK,SAAS,EAAC,uBAAuB,YACpC,8BAAG,SAAS,EAAC,qBAAqB,mCAAuB,GACrD,IACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC;AAzEW,QAAA,aAAa,iBAyExB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|