> Pull Request Template > > Use this template to quickly create a well written pull request. Delete all quotes before creating the pull request. > ## Description There are multiple refactors and split for query module's creator flow changes which involves module input -- it's a new entity introduced as part of modules project #### PR fixes following issue(s) Fixes # (issue number) Part of https://app.zenhub.com/workspaces/modules-pod-63e0d668a7fea03850c89c6f/issues/gh/appsmithorg/appsmith/27352 #### Type of change - Chore (housekeeping or task changes that don't impact user perception) > > ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [ ] Manual - [ ] JUnit - [ ] Jest - [ ] Cypress > > #### Test Plan > Add Testsmith test cases links that relate to this PR > > #### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
import type { DependencyMap } from "utils/DynamicBindingUtils";
|
|
import { call, fork, put, select, take } from "redux-saga/effects";
|
|
import {
|
|
getEvaluationInverseDependencyMap,
|
|
getDataTree,
|
|
} from "selectors/dataTreeSelectors";
|
|
import type { DataTree } from "@appsmith/entities/DataTree/types";
|
|
import { getActions } from "@appsmith/selectors/entitiesSelector";
|
|
import type {
|
|
ActionData,
|
|
ActionDataState,
|
|
} from "@appsmith/reducers/entityReducers/actionsReducer";
|
|
import type { ReduxAction } from "@appsmith/constants/ReduxActionConstants";
|
|
import {
|
|
ReduxActionErrorTypes,
|
|
ReduxActionTypes,
|
|
} from "@appsmith/constants/ReduxActionConstants";
|
|
import log from "loglevel";
|
|
import * as Sentry from "@sentry/react";
|
|
import { findLoadingEntities } from "utils/WidgetLoadingStateUtils";
|
|
|
|
const actionExecutionRequestActions = [
|
|
ReduxActionTypes.EXECUTE_PLUGIN_ACTION_REQUEST,
|
|
ReduxActionTypes.RUN_ACTION_REQUEST,
|
|
];
|
|
|
|
const actionExecutionCompletionActions = [
|
|
ReduxActionTypes.EXECUTE_PLUGIN_ACTION_SUCCESS,
|
|
ReduxActionTypes.RUN_ACTION_SUCCESS,
|
|
ReduxActionErrorTypes.RUN_ACTION_ERROR,
|
|
ReduxActionErrorTypes.EXECUTE_PLUGIN_ACTION_ERROR,
|
|
];
|
|
|
|
const ACTION_EXECUTION_REDUX_ACTIONS = [
|
|
// Actions
|
|
...actionExecutionRequestActions,
|
|
...actionExecutionCompletionActions,
|
|
ReduxActionTypes.RUN_ACTION_CANCELLED,
|
|
|
|
// Widget evalution
|
|
ReduxActionTypes.SET_EVALUATED_TREE,
|
|
];
|
|
|
|
function* setWidgetsLoadingSaga(action: ReduxAction<unknown>) {
|
|
if (actionExecutionCompletionActions.includes(action.type)) {
|
|
// Ensure that data is already available in the dataTree and all
|
|
// dependent entities have been re-evaluated
|
|
yield take(ReduxActionTypes.SET_EVALUATED_TREE);
|
|
}
|
|
const actions: ActionDataState = yield select(getActions);
|
|
const isLoadingActions: string[] = actions
|
|
.filter((action: ActionData) => action.isLoading)
|
|
.map((action: ActionData) => action.config.name);
|
|
|
|
if (isLoadingActions.length === 0) {
|
|
yield put({
|
|
type: ReduxActionTypes.SET_LOADING_ENTITIES,
|
|
payload: new Set<string>(),
|
|
});
|
|
} else {
|
|
const inverseMap: DependencyMap = yield select(
|
|
getEvaluationInverseDependencyMap,
|
|
);
|
|
const dataTree: DataTree = yield select(getDataTree);
|
|
|
|
const loadingEntities = findLoadingEntities(
|
|
isLoadingActions,
|
|
dataTree,
|
|
inverseMap,
|
|
);
|
|
yield put({
|
|
type: ReduxActionTypes.SET_LOADING_ENTITIES,
|
|
payload: loadingEntities,
|
|
});
|
|
}
|
|
|
|
if (action.type !== ReduxActionTypes.SET_EVALUATED_TREE) {
|
|
yield put({
|
|
type: ReduxActionTypes.TRIGGER_EVAL,
|
|
});
|
|
}
|
|
}
|
|
|
|
function* actionExecutionChangeListenerSaga() {
|
|
while (true) {
|
|
const action: ReduxAction<unknown> = yield take(
|
|
ACTION_EXECUTION_REDUX_ACTIONS,
|
|
);
|
|
yield fork(setWidgetsLoadingSaga, action);
|
|
}
|
|
}
|
|
|
|
export default function* actionExecutionChangeListeners() {
|
|
yield take(ReduxActionTypes.START_EVALUATION);
|
|
while (true) {
|
|
try {
|
|
yield call(actionExecutionChangeListenerSaga);
|
|
} catch (e) {
|
|
log.error(e);
|
|
Sentry.captureException(e);
|
|
}
|
|
}
|
|
}
|