mirror of
https://github.com/ToolJet/ToolJet
synced 2026-04-21 21:47:17 +00:00
Added callback fn to runjs
This commit is contained in:
parent
4fd13fb2af
commit
cb2d3f3b5d
2 changed files with 103 additions and 73 deletions
|
|
@ -570,7 +570,7 @@ export const createEventsSlice = (set, get) => ({
|
|||
}
|
||||
case 'run-query': {
|
||||
try {
|
||||
const { queryId, queryName, component, eventId } = event;
|
||||
const { queryId, queryName, component, eventId, callbackFns } = event;
|
||||
const params = event['parameters'];
|
||||
if (!queryId && !queryName) {
|
||||
throw new Error('No query selected');
|
||||
|
|
@ -608,7 +608,8 @@ export const createEventsSlice = (set, get) => ({
|
|||
eventId,
|
||||
false,
|
||||
false,
|
||||
updatedModuleId
|
||||
updatedModuleId,
|
||||
callbackFns
|
||||
);
|
||||
} catch (error) {
|
||||
get().eventsSlice.logError('run_query', 'run-query', error, eventObj, {
|
||||
|
|
@ -1006,7 +1007,7 @@ export const createEventsSlice = (set, get) => ({
|
|||
const { executeAction } = eventsSlice;
|
||||
const currentComponents = Object.entries(getCurrentPageComponents(moduleId));
|
||||
|
||||
const runQuery = (queryName = '', parameters, moduleId = 'canvas') => {
|
||||
const runQuery = (queryName = '', parameters, moduleId = 'canvas', callbackFns) => {
|
||||
const query = dataQuery.queries.modules[moduleId].find((query) => {
|
||||
const isFound = query.name === queryName;
|
||||
if (isPreview) {
|
||||
|
|
@ -1030,7 +1031,7 @@ export const createEventsSlice = (set, get) => ({
|
|||
}
|
||||
|
||||
if (isPreview) {
|
||||
return previewQuery(query, true, processedParams);
|
||||
return previewQuery(query, true, processedParams, moduleId, callbackFns);
|
||||
}
|
||||
|
||||
const event = {
|
||||
|
|
@ -1038,6 +1039,7 @@ export const createEventsSlice = (set, get) => ({
|
|||
queryId: query.id,
|
||||
queryName: query.name,
|
||||
parameters: processedParams,
|
||||
callbackFns,
|
||||
};
|
||||
|
||||
return executeAction(event, mode, {}, moduleId);
|
||||
|
|
|
|||
|
|
@ -329,7 +329,8 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
eventId,
|
||||
shouldSetPreviewData = false,
|
||||
isOnLoad = false,
|
||||
moduleId = 'canvas'
|
||||
moduleId = 'canvas',
|
||||
callbackFns = undefined
|
||||
) => {
|
||||
const {
|
||||
eventsSlice,
|
||||
|
|
@ -508,9 +509,10 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
},
|
||||
moduleId
|
||||
);
|
||||
|
||||
const successData = { status: 'ok', data: finalData };
|
||||
onEvent('onDataQuerySuccess', queryEvents, {}, mode, moduleId);
|
||||
return { status: 'ok', data: finalData };
|
||||
if (callbackFns?.onSuccess) return callbackFns.onSuccess(successData);
|
||||
return successData;
|
||||
};
|
||||
|
||||
// Handler for query failures
|
||||
|
|
@ -530,10 +532,10 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
error:
|
||||
query.kind === 'restapi' && errorData?.data?.type !== 'tj-401'
|
||||
? {
|
||||
substitutedVariables: options,
|
||||
request: errorData?.data?.requestObject,
|
||||
response: errorData?.data?.responseObject,
|
||||
}
|
||||
substitutedVariables: options,
|
||||
request: errorData?.data?.requestObject,
|
||||
response: errorData?.data?.responseObject,
|
||||
}
|
||||
: errorData,
|
||||
isQuerySuccessLog: false,
|
||||
});
|
||||
|
|
@ -544,19 +546,19 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
isLoading: false,
|
||||
...(errorData?.data?.type === 'tj-401'
|
||||
? {
|
||||
metadata: errorData?.metadata,
|
||||
response: errorData?.data?.responseObject,
|
||||
}
|
||||
metadata: errorData?.metadata,
|
||||
response: errorData?.data?.responseObject,
|
||||
}
|
||||
: query.kind === 'restapi'
|
||||
? {
|
||||
? {
|
||||
metadata: errorData?.metadata,
|
||||
request: errorData?.data?.requestObject,
|
||||
response: errorData?.data?.responseObject,
|
||||
responseHeaders: errorData?.data?.responseHeaders,
|
||||
}
|
||||
: query.kind === 'workflows'
|
||||
? { metadata: errorData?.metadata, response: errorData?.metadata?.response }
|
||||
: {}),
|
||||
: query.kind === 'workflows'
|
||||
? { metadata: errorData?.metadata, response: errorData?.metadata?.response }
|
||||
: {}),
|
||||
},
|
||||
moduleId
|
||||
);
|
||||
|
|
@ -571,6 +573,7 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
);
|
||||
|
||||
onEvent('onDataQueryFailure', queryEvents);
|
||||
if (callbackFns?.onFailure) return callbackFns.onFailure(errorData);
|
||||
return errorData;
|
||||
};
|
||||
|
||||
|
|
@ -748,7 +751,13 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
});
|
||||
},
|
||||
|
||||
previewQuery: (query, calledFromQuery = false, userSuppliedParameters = {}, moduleId = 'canvas') => {
|
||||
previewQuery: (
|
||||
query,
|
||||
calledFromQuery = false,
|
||||
userSuppliedParameters = {},
|
||||
moduleId = 'canvas',
|
||||
callbackFns = undefined
|
||||
) => {
|
||||
const { eventsSlice, queryPanel, appStore, currentVersionId, selectedEnvironment } = get();
|
||||
const {
|
||||
queryPreviewData,
|
||||
|
|
@ -766,7 +775,7 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
setPreviewLoading(true);
|
||||
setIsPreviewQueryLoading(true);
|
||||
return queryUpdatePromise.then(() =>
|
||||
get().queryPanel.previewQuery(query, calledFromQuery, userSuppliedParameters, moduleId)
|
||||
get().queryPanel.previewQuery(query, calledFromQuery, userSuppliedParameters, moduleId, callbackFns)
|
||||
);
|
||||
}
|
||||
const { onEvent } = eventsSlice;
|
||||
|
|
@ -914,7 +923,7 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
handleFailure: handleFailurePreview,
|
||||
shouldSetPreviewData: true,
|
||||
setPreviewData,
|
||||
setResolvedQuery: () => { }, // No resolvedQuery for preview
|
||||
setResolvedQuery: () => {}, // No resolvedQuery for preview
|
||||
resolve,
|
||||
});
|
||||
|
||||
|
|
@ -946,33 +955,40 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
queryStatusCode === 400 ||
|
||||
queryStatusCode === 404 ||
|
||||
queryStatusCode === 422: {
|
||||
let errorData = {};
|
||||
switch (query.kind) {
|
||||
case 'runpy':
|
||||
errorData = data.data;
|
||||
break;
|
||||
case 'tooljetdb':
|
||||
if (data?.error) {
|
||||
errorData = {
|
||||
message: data?.error?.message || 'Something went wrong',
|
||||
description: data?.error?.message || 'Something went wrong',
|
||||
status: data?.statusText || 'Failed',
|
||||
data: data?.error || {},
|
||||
};
|
||||
} else {
|
||||
errorData = data;
|
||||
errorData.description = data.errorMessage || 'Something went wrong';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
let errorData = {};
|
||||
switch (query.kind) {
|
||||
case 'runpy':
|
||||
errorData = data.data;
|
||||
break;
|
||||
case 'tooljetdb':
|
||||
if (data?.error) {
|
||||
errorData = {
|
||||
message: data?.error?.message || 'Something went wrong',
|
||||
description: data?.error?.message || 'Something went wrong',
|
||||
status: data?.statusText || 'Failed',
|
||||
data: data?.error || {},
|
||||
};
|
||||
} else {
|
||||
errorData = data;
|
||||
break;
|
||||
}
|
||||
|
||||
onEvent('onDataQueryFailure', queryEvents);
|
||||
if (!calledFromQuery) setPreviewData(errorData);
|
||||
break;
|
||||
errorData.description = data.errorMessage || 'Something went wrong';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
errorData = data;
|
||||
break;
|
||||
}
|
||||
|
||||
onEvent('onDataQueryFailure', queryEvents);
|
||||
if (callbackFns?.onFailure) {
|
||||
const failureData = { status: data.status, data: finalData };
|
||||
setPreviewLoading(false);
|
||||
setIsPreviewQueryLoading(false);
|
||||
resolve(callbackFns.onFailure(failureData));
|
||||
return;
|
||||
}
|
||||
if (!calledFromQuery) setPreviewData(errorData);
|
||||
break;
|
||||
}
|
||||
case queryStatus === 'needs_oauth': {
|
||||
const url = data.data.auth_url; // Backend generates and return sthe auth url
|
||||
const kind = data.data?.kind;
|
||||
|
|
@ -989,37 +1005,49 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
queryStatus === 'Created' ||
|
||||
queryStatus === 'Accepted' ||
|
||||
queryStatus === 'No Content': {
|
||||
toast(`Query ${'(' + query.name + ') ' || ''}completed.`, {
|
||||
icon: '🚀',
|
||||
});
|
||||
if (query.options.enableTransformation) {
|
||||
const language = query.options.transformationLanguage;
|
||||
finalData = await runTransformation(
|
||||
finalData,
|
||||
query.options.transformations?.[language] ?? query.options.transformation,
|
||||
query.options.transformationLanguage,
|
||||
query,
|
||||
'edit',
|
||||
moduleId
|
||||
);
|
||||
if (finalData?.status === 'failed') {
|
||||
onEvent('onDataQueryFailure', queryEvents);
|
||||
setPreviewLoading(false);
|
||||
setIsPreviewQueryLoading(false);
|
||||
resolve({ status: data.status, data: finalData });
|
||||
if (!calledFromQuery) setPreviewData(finalData);
|
||||
return;
|
||||
toast(`Query ${'(' + query.name + ') ' || ''}completed.`, {
|
||||
icon: '🚀',
|
||||
});
|
||||
if (query.options.enableTransformation) {
|
||||
const language = query.options.transformationLanguage;
|
||||
finalData = await runTransformation(
|
||||
finalData,
|
||||
query.options.transformations?.[language] ?? query.options.transformation,
|
||||
query.options.transformationLanguage,
|
||||
query,
|
||||
'edit',
|
||||
moduleId
|
||||
);
|
||||
if (finalData?.status === 'failed') {
|
||||
onEvent('onDataQueryFailure', queryEvents);
|
||||
setPreviewLoading(false);
|
||||
setIsPreviewQueryLoading(false);
|
||||
const failureData = { status: data.status, data: finalData };
|
||||
if (callbackFns?.onFailure) {
|
||||
resolve(callbackFns.onFailure(failureData));
|
||||
} else {
|
||||
resolve(failureData);
|
||||
}
|
||||
if (!calledFromQuery) setPreviewData(finalData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!calledFromQuery) setPreviewData(finalData);
|
||||
onEvent('onDataQuerySuccess', queryEvents, 'edit');
|
||||
break;
|
||||
}
|
||||
|
||||
if (!calledFromQuery) setPreviewData(finalData);
|
||||
onEvent('onDataQuerySuccess', queryEvents, 'edit');
|
||||
|
||||
if (callbackFns?.onSuccess) {
|
||||
const successData = { status: data.status, data: finalData };
|
||||
setPreviewLoading(false);
|
||||
setIsPreviewQueryLoading(false);
|
||||
resolve(callbackFns.onSuccess(successData));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
setPreviewLoading(false);
|
||||
setIsPreviewQueryLoading(false);
|
||||
|
||||
resolve({ status: data.status, data: finalData });
|
||||
})
|
||||
.catch((err) => {
|
||||
|
|
@ -1464,14 +1492,14 @@ export const createQueryPanelSlice = (set, get) => ({
|
|||
for (const key of Object.keys(resolvedState.queries)) {
|
||||
queriesInResolvedState[key] = {
|
||||
...queriesInResolvedState[key],
|
||||
run: (params) => {
|
||||
run: (params, callbackFns) => {
|
||||
if (typeof params !== 'object' || params === null) {
|
||||
params = {};
|
||||
}
|
||||
const processedParams = {};
|
||||
const query = dataQuery.queries.modules?.[moduleId].find((q) => q.name === key);
|
||||
query.options.parameters?.forEach((arg) => (processedParams[arg.name] = params[arg.name]));
|
||||
return actions.runQuery(query.name, processedParams, moduleId);
|
||||
return actions.runQuery(query.name, processedParams, moduleId, callbackFns);
|
||||
},
|
||||
reset: () => {
|
||||
const query = dataQuery.queries.modules?.[moduleId].find((q) => q.name === key);
|
||||
|
|
|
|||
Loading…
Reference in a new issue