diff --git a/frontend/src/_helpers/appUtils.js b/frontend/src/_helpers/appUtils.js index 15af12911d..6b9bbf0e84 100644 --- a/frontend/src/_helpers/appUtils.js +++ b/frontend/src/_helpers/appUtils.js @@ -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 }); } ); }); diff --git a/frontend/src/_helpers/utils.js b/frontend/src/_helpers/utils.js index 2067dd9397..9f41fa517f 100644 --- a/frontend/src/_helpers/utils.js +++ b/frontend/src/_helpers/utils.js @@ -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) {