[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:
Kavin Venkatachalam 2022-06-16 15:09:26 +05:30 committed by GitHub
parent 48dc072f17
commit 802ad5e5df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 14 deletions

View file

@ -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 });
}
);
});

View file

@ -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) {