forked from ToolJet/ToolJet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQueryManager.jsx
More file actions
105 lines (98 loc) · 3.66 KB
/
QueryManager.jsx
File metadata and controls
105 lines (98 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import React, { useEffect, useState } from 'react';
import cx from 'classnames';
import { QueryManagerHeader } from './Components/QueryManagerHeader';
import { QueryManagerBody } from './Components/QueryManagerBody';
import { runQuery } from '@/_helpers/appUtils';
import { defaultSources } from './constants';
import {
useDataSources,
useGlobalDataSources,
useLoadingDataSources,
useSampleDataSource,
} from '@/_stores/dataSourcesStore';
import { useQueryToBeRun, useSelectedQuery, useQueryPanelActions } from '@/_stores/queryPanelStore';
import { CodeHinterContext } from '@/Editor/CodeBuilder/CodeHinterContext';
import { resolveReferences } from '@/_helpers/utils';
const QueryManager = ({ mode, appId, darkMode, apps, allComponents, appDefinition, editorRef }) => {
const loadingDataSources = useLoadingDataSources();
const dataSources = useDataSources();
const sampleDataSource = useSampleDataSource();
const globalDataSources = useGlobalDataSources();
const queryToBeRun = useQueryToBeRun();
const selectedQuery = useSelectedQuery();
const { setSelectedDataSource, setQueryToBeRun } = useQueryPanelActions();
const [options, setOptions] = useState({});
const [activeTab, setActiveTab] = useState(1);
useEffect(() => {
if (selectedQuery?.kind == 'runjs' || selectedQuery?.kind == 'runpy' || selectedQuery?.kind == 'workflows') {
setActiveTab(1);
}
}, [selectedQuery?.id]);
useEffect(() => {
setOptions(selectedQuery?.options || {});
}, [selectedQuery?.options]);
useEffect(() => {
if (queryToBeRun !== null) {
runQuery(editorRef, queryToBeRun.id, queryToBeRun.name);
setQueryToBeRun(null);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [editorRef, queryToBeRun]);
useEffect(() => {
if (selectedQuery) {
const selectedDS = [...dataSources, ...globalDataSources, !!sampleDataSource && sampleDataSource]
.filter(Boolean)
.find((datasource) => datasource.id === selectedQuery?.data_source_id);
//TODO: currently type is not taken into account. May create issues in importing REST apis. to be revamped when import app is revamped
if (
selectedQuery?.kind in defaultSources &&
(!selectedQuery?.data_source_id || ['runjs', 'runpy'].includes(selectedQuery?.data_source_id) || !selectedDS)
) {
return setSelectedDataSource(defaultSources[selectedQuery?.kind]);
}
setSelectedDataSource(selectedDS || null);
} else if (selectedQuery === null) {
setSelectedDataSource(null);
}
}, [selectedQuery, dataSources, globalDataSources, setSelectedDataSource, mode]);
return (
<div
className={cx(`query-manager ${darkMode ? 'theme-dark' : ''}`, {
'd-none': loadingDataSources,
})}
>
<QueryManagerHeader
darkMode={darkMode}
options={options}
editorRef={editorRef}
appId={appId}
setOptions={setOptions}
setActiveTab={setActiveTab}
activeTab={activeTab}
/>
<CodeHinterContext.Provider
value={{
parameters: selectedQuery?.options?.parameters?.reduce(
(parameters, parameter) => ({
...parameters,
[parameter.name]: resolveReferences(parameter.defaultValue, undefined),
}),
{}
),
}}
>
<QueryManagerBody
darkMode={darkMode}
options={options}
allComponents={allComponents}
apps={apps}
appId={appId}
appDefinition={appDefinition}
setOptions={setOptions}
activeTab={activeTab}
/>
</CodeHinterContext.Provider>
</div>
);
};
export default QueryManager;