mirror of
https://github.com/ToolJet/ToolJet
synced 2026-05-23 08:58:26 +00:00
[Feature]: Trigger actions from RunJS (#3115)
* Trigger actions from RunJS * returned promise while running query in runjs * Fixed preview issues * Reusing executeAction function
This commit is contained in:
parent
48dc072f17
commit
802ad5e5df
2 changed files with 74 additions and 14 deletions
|
|
@ -167,7 +167,7 @@ function logoutAction(_ref) {
|
|||
|
||||
return Promise.resolve();
|
||||
}
|
||||
function executeAction(_ref, event, mode, customVariables) {
|
||||
export const executeAction = (_ref, event, mode, customVariables) => {
|
||||
console.log('nopski', customVariables);
|
||||
if (event) {
|
||||
switch (event.actionId) {
|
||||
|
|
@ -315,7 +315,7 @@ function executeAction(_ref, event, mode, customVariables) {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export async function onEvent(_ref, eventName, options, mode = 'edit') {
|
||||
let _self = _ref;
|
||||
|
|
@ -548,7 +548,7 @@ export function getQueryVariables(options, state) {
|
|||
return queryVariables;
|
||||
}
|
||||
|
||||
export function previewQuery(_ref, query) {
|
||||
export function previewQuery(_ref, query, calledFromQuery = false) {
|
||||
const options = getQueryVariables(query.options, _ref.props.currentState);
|
||||
|
||||
_ref.setState({ previewLoading: true });
|
||||
|
|
@ -556,7 +556,7 @@ export function previewQuery(_ref, query) {
|
|||
return new Promise(function (resolve, reject) {
|
||||
let queryExecutionPromise = null;
|
||||
if (query.kind === 'runjs') {
|
||||
queryExecutionPromise = executeMultilineJS(_ref.state.currentState, query.options.code);
|
||||
queryExecutionPromise = executeMultilineJS(_ref, query.options.code, true);
|
||||
} else {
|
||||
queryExecutionPromise = dataqueryService.preview(query, options);
|
||||
}
|
||||
|
|
@ -569,7 +569,11 @@ export function previewQuery(_ref, query) {
|
|||
finalData = runTransformation(_ref, finalData, query.options.transformation, query);
|
||||
}
|
||||
|
||||
_ref.setState({ previewLoading: false, queryPreviewData: finalData });
|
||||
if (calledFromQuery) {
|
||||
_ref.setState({ previewLoading: false });
|
||||
} else {
|
||||
_ref.setState({ previewLoading: false, queryPreviewData: finalData });
|
||||
}
|
||||
switch (data.status) {
|
||||
case 'failed': {
|
||||
toast.error(`${data.message}: ${data.description}`);
|
||||
|
|
@ -588,7 +592,7 @@ export function previewQuery(_ref, query) {
|
|||
}
|
||||
}
|
||||
|
||||
resolve();
|
||||
resolve({ status: data.status, data: finalData });
|
||||
})
|
||||
.catch(({ error, data }) => {
|
||||
_ref.setState({ previewLoading: false, queryPreviewData: data });
|
||||
|
|
@ -645,7 +649,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode)
|
|||
let queryExecutionPromise = null;
|
||||
if (query.kind === 'runjs') {
|
||||
console.log('here');
|
||||
queryExecutionPromise = executeMultilineJS(_self.state.currentState, query.options.code);
|
||||
queryExecutionPromise = executeMultilineJS(_self, query.options.code, false, confirmed, mode);
|
||||
} else {
|
||||
queryExecutionPromise = dataqueryService.run(queryId, options);
|
||||
}
|
||||
|
|
@ -691,7 +695,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode)
|
|||
},
|
||||
},
|
||||
() => {
|
||||
resolve();
|
||||
resolve(data);
|
||||
onEvent(_self, 'onDataQueryFailure', { definition: { events: dataQuery.options.events } });
|
||||
}
|
||||
);
|
||||
|
|
@ -725,7 +729,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode)
|
|||
},
|
||||
},
|
||||
() => {
|
||||
resolve();
|
||||
resolve(finalData);
|
||||
onEvent(_self, 'onDataQueryFailure', { definition: { events: dataQuery.options.events } });
|
||||
}
|
||||
);
|
||||
|
|
@ -764,7 +768,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode)
|
|||
},
|
||||
},
|
||||
() => {
|
||||
resolve();
|
||||
resolve({ status: 'ok', data: finalData });
|
||||
onEvent(_self, 'onDataQuerySuccess', { definition: { events: dataQuery.options.events } }, mode);
|
||||
}
|
||||
);
|
||||
|
|
@ -784,7 +788,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode)
|
|||
},
|
||||
},
|
||||
() => {
|
||||
resolve();
|
||||
resolve({ status: 'failed', message: error });
|
||||
}
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import moment from 'moment';
|
|||
import _ from 'lodash';
|
||||
import axios from 'axios';
|
||||
import JSON5 from 'json5';
|
||||
import { previewQuery, executeAction } from '@/_helpers/appUtils';
|
||||
|
||||
export function findProp(obj, prop, defval) {
|
||||
if (typeof defval === 'undefined') defval = null;
|
||||
|
|
@ -269,13 +270,67 @@ export function validateEmail(email) {
|
|||
return emailRegex.test(email);
|
||||
}
|
||||
|
||||
export async function executeMultilineJS(currentState, code) {
|
||||
export async function executeMultilineJS(_ref, code, isPreview, confirmed = undefined, mode = '') {
|
||||
const { currentState } = _ref.state;
|
||||
let result = {},
|
||||
error = null;
|
||||
|
||||
const actions = {
|
||||
runQuery: function (queryName = '') {
|
||||
const query = _ref.state.dataQueries.find((query) => query.name === queryName);
|
||||
if (_.isEmpty(query)) return;
|
||||
if (isPreview) {
|
||||
return previewQuery(_ref, query, true);
|
||||
} else {
|
||||
const event = {
|
||||
actionId: 'run-query',
|
||||
queryId: query.id,
|
||||
queryName: query.name,
|
||||
};
|
||||
return executeAction(_ref, event, mode, {});
|
||||
}
|
||||
},
|
||||
setVariable: function (key = '', value = '') {
|
||||
if (key) {
|
||||
const event = {
|
||||
actionId: 'set-custom-variable',
|
||||
key,
|
||||
value,
|
||||
};
|
||||
return executeAction(_ref, event, mode, {});
|
||||
}
|
||||
},
|
||||
unSetVariable: function (key = '') {
|
||||
if (key) {
|
||||
const event = {
|
||||
actionId: 'unset-custom-variable',
|
||||
key,
|
||||
};
|
||||
return executeAction(_ref, event, mode, {});
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
for (const key of Object.keys(currentState.queries)) {
|
||||
currentState.queries[key] = {
|
||||
...currentState.queries[key],
|
||||
run: () => actions.runQuery(key),
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const AsyncFunction = new Function(`return Object.getPrototypeOf(async function(){}).constructor`)();
|
||||
var evalFn = new AsyncFunction('moment', '_', 'components', 'queries', 'globals', 'axios', 'variables', code);
|
||||
var evalFn = new AsyncFunction(
|
||||
'moment',
|
||||
'_',
|
||||
'components',
|
||||
'queries',
|
||||
'globals',
|
||||
'axios',
|
||||
'variables',
|
||||
'actions',
|
||||
code
|
||||
);
|
||||
result = {
|
||||
status: 'ok',
|
||||
data: await evalFn(
|
||||
|
|
@ -285,7 +340,8 @@ export async function executeMultilineJS(currentState, code) {
|
|||
currentState.queries,
|
||||
currentState.globals,
|
||||
axios,
|
||||
currentState.variables
|
||||
currentState.variables,
|
||||
actions
|
||||
),
|
||||
};
|
||||
} catch (err) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue