2024-10-22 08:01:21 +00:00
|
|
|
import React, { useEffect, useState } from 'react';
|
|
|
|
|
import cx from 'classnames';
|
|
|
|
|
import { QueryManagerHeader } from './Components/QueryManagerHeader';
|
2025-02-25 06:52:50 +00:00
|
|
|
import QueryManagerBody from './Components/QueryManagerBody';
|
2024-10-22 08:01:21 +00:00
|
|
|
import { defaultSources } from './constants';
|
|
|
|
|
import { CodeHinterContext } from '@/AppBuilder/CodeBuilder/CodeHinterContext';
|
|
|
|
|
import { resolveReferences } from '@/_helpers/utils';
|
|
|
|
|
import useStore from '@/AppBuilder/_stores/store';
|
|
|
|
|
|
|
|
|
|
const QueryManager = ({ mode, darkMode }) => {
|
|
|
|
|
// TODO to be moved into queryPanelStore and reimplemented
|
|
|
|
|
const runQuery = useStore((state) => state.queryPanel.runQuery);
|
|
|
|
|
const loadingDataSources = useStore((state) => state.loadingDataSources);
|
|
|
|
|
const dataSources = useStore((state) => state.dataSources);
|
|
|
|
|
const sampleDataSource = useStore((state) => state.sampleDataSource);
|
|
|
|
|
const globalDataSources = useStore((state) => state.globalDataSources);
|
|
|
|
|
const queryToBeRun = useStore((state) => state.queryPanel.queryToBeRun);
|
|
|
|
|
const selectedQuery = useStore((state) => state.queryPanel.selectedQuery);
|
|
|
|
|
const setSelectedDataSource = useStore((state) => state.queryPanel.setSelectedDataSource);
|
|
|
|
|
const setQueryToBeRun = useStore((state) => state.queryPanel.setQueryToBeRun);
|
|
|
|
|
|
|
|
|
|
const [activeTab, setActiveTab] = useState(1);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2026-03-19 07:11:32 +00:00
|
|
|
if (
|
|
|
|
|
selectedQuery?.kind == 'runjs' ||
|
|
|
|
|
selectedQuery?.kind == 'runpy' ||
|
|
|
|
|
selectedQuery?.kind == 'restapi' ||
|
|
|
|
|
selectedQuery?.kind == 'postgresql'
|
|
|
|
|
) {
|
2024-10-22 08:01:21 +00:00
|
|
|
setActiveTab(1);
|
|
|
|
|
}
|
|
|
|
|
}, [selectedQuery?.id]);
|
2025-09-19 04:31:02 +00:00
|
|
|
|
2024-10-22 08:01:21 +00:00
|
|
|
useEffect(() => {
|
|
|
|
|
if (queryToBeRun !== null) {
|
|
|
|
|
runQuery(queryToBeRun.id, queryToBeRun.name);
|
|
|
|
|
setQueryToBeRun(null);
|
|
|
|
|
}
|
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
|
}, [queryToBeRun]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (selectedQuery) {
|
2025-04-01 10:46:01 +00:00
|
|
|
const selectedDS = [...dataSources, ...globalDataSources, !!sampleDataSource && sampleDataSource]
|
2024-10-22 08:01:21 +00:00
|
|
|
.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,
|
|
|
|
|
})}
|
|
|
|
|
>
|
2025-02-25 06:52:50 +00:00
|
|
|
<QueryManagerHeader darkMode={darkMode} setActiveTab={setActiveTab} activeTab={activeTab} />
|
2024-10-22 08:01:21 +00:00
|
|
|
<CodeHinterContext.Provider
|
|
|
|
|
value={{
|
|
|
|
|
parameters: selectedQuery?.options?.parameters?.reduce(
|
|
|
|
|
(parameters, parameter) => ({
|
|
|
|
|
...parameters,
|
|
|
|
|
[parameter.name]: resolveReferences(parameter.defaultValue, undefined),
|
|
|
|
|
}),
|
|
|
|
|
{}
|
|
|
|
|
),
|
|
|
|
|
}}
|
|
|
|
|
>
|
2025-02-25 06:52:50 +00:00
|
|
|
<QueryManagerBody darkMode={darkMode} activeTab={activeTab} />
|
2024-10-22 08:01:21 +00:00
|
|
|
</CodeHinterContext.Provider>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default QueryManager;
|