PromucFlow_constructor/app/client/src/components/propertyControls/ActionSelectorControl.tsx

143 lines
4.1 KiB
TypeScript
Raw Normal View History

2020-01-23 07:53:36 +00:00
import React from "react";
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com> ## Description This PR upgrades Prettier to v2 + enforces TypeScript’s [`import type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export) syntax where applicable. It’s submitted as a separate PR so we can merge it easily. As a part of this PR, we reformat the codebase heavily: - add `import type` everywhere where it’s required, and - re-format the code to account for Prettier 2’s breaking changes: https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes This PR is submitted against `release` to make sure all new code by team members will adhere to new formatting standards, and we’ll have fewer conflicts when merging `bundle-optimizations` into `release`. (I’ll merge `release` back into `bundle-optimizations` once this PR is merged.) ### Why is this needed? This PR is needed because, for the Lodash optimization from https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3, we need to use `import type`. Otherwise, `babel-plugin-lodash` complains that `LoDashStatic` is not a lodash function. However, just using `import type` in the current codebase will give you this: <img width="962" alt="Screenshot 2023-03-08 at 17 45 59" src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png"> That’s because Prettier 1 can’t parse `import type` at all. To parse it, we need to upgrade to Prettier 2. ### Why enforce `import type`? Apart from just enabling `import type` support, this PR enforces specifying `import type` everywhere it’s needed. (Developers will get immediate TypeScript and ESLint errors when they forget to do so.) I’m doing this because I believe `import type` improves DX and makes refactorings easier. Let’s say you had a few imports like below. Can you tell which of these imports will increase the bundle size? (Tip: it’s not all of them!) ```ts // app/client/src/workers/Linting/utils.ts import { Position } from "codemirror"; import { LintError as JSHintError, LintOptions } from "jshint"; import { get, isEmpty, isNumber, keys, last, set } from "lodash"; ``` It’s pretty hard, right? What about now? ```ts // app/client/src/workers/Linting/utils.ts import type { Position } from "codemirror"; import type { LintError as JSHintError, LintOptions } from "jshint"; import { get, isEmpty, isNumber, keys, last, set } from "lodash"; ``` Now, it’s clear that only `lodash` will be bundled. This helps developers to see which imports are problematic, but it _also_ helps with refactorings. Now, if you want to see where `codemirror` is bundled, you can just grep for `import \{.*\} from "codemirror"` – and you won’t get any type-only imports. This also helps (some) bundlers. Upon transpiling, TypeScript erases type-only imports completely. In some environment (not ours), this makes the bundle smaller, as the bundler doesn’t need to bundle type-only imports anymore. ## Type of change - Chore (housekeeping or task changes that don't impact user perception) ## How Has This Been Tested? This was tested to not break the build. ### 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 - [x] 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 - [x] 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: - [ ] Test plan has been approved by relevant developers - [ ] Test plan has been peer reviewed by QA - [ ] Cypress test cases have been added and approved by either SDET or manual QA - [ ] Organized project review call with relevant stakeholders after Round 1/2 of QA - [ ] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
import type { ControlData, ControlProps } from "./BaseControl";
import BaseControl from "./BaseControl";
2020-04-20 05:42:46 +00:00
// import DynamicActionCreator from "components/editorComponents/DynamicActionCreator";
feat: Change navigate to UI (#14856) * Initial work to change navigate to UI * Remove console.logs * Adjust default parameters and getters/setters for page dropdown field * change url field getter so page names are not showm * Remove ../ from the imports Remove unnecessary todo * Add check for undefined fields * Add validations for url/page name, add error message * Make height auto to accommodate the flexible size of query param text box * Update dropdown list of pages when page names are updated * Set tab to url when a url has been entered, else default to page * Add feature tests * Add check on null value in isValueValidURL to ensure it does not crash the app * Remove unused ref * Fix bug when switch is selected and a new page addition let to page crash * Initial work to change navigate to UI * Remove console.logs * Adjust default parameters and getters/setters for page dropdown field * change url field getter so page names are not showm * Remove ../ from the imports Remove unnecessary todo * Add check for undefined fields * Add validations for url/page name, add error message * Make height auto to accommodate the flexible size of query param text box * Update dropdown list of pages when page names are updated * Set tab to url when a url has been entered, else default to page * Add feature tests * Add check on null value in isValueValidURL to ensure it does not crash the app * Remove unused ref * Fix bug when switch is selected and a new page addition let to page crash * Fix types and imports * Update the tests * Add ref back to the code Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
2022-09-16 04:30:16 +00:00
import ActionCreator from "components/editorComponents/ActionCreator";
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com> ## Description This PR upgrades Prettier to v2 + enforces TypeScript’s [`import type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export) syntax where applicable. It’s submitted as a separate PR so we can merge it easily. As a part of this PR, we reformat the codebase heavily: - add `import type` everywhere where it’s required, and - re-format the code to account for Prettier 2’s breaking changes: https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes This PR is submitted against `release` to make sure all new code by team members will adhere to new formatting standards, and we’ll have fewer conflicts when merging `bundle-optimizations` into `release`. (I’ll merge `release` back into `bundle-optimizations` once this PR is merged.) ### Why is this needed? This PR is needed because, for the Lodash optimization from https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3, we need to use `import type`. Otherwise, `babel-plugin-lodash` complains that `LoDashStatic` is not a lodash function. However, just using `import type` in the current codebase will give you this: <img width="962" alt="Screenshot 2023-03-08 at 17 45 59" src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png"> That’s because Prettier 1 can’t parse `import type` at all. To parse it, we need to upgrade to Prettier 2. ### Why enforce `import type`? Apart from just enabling `import type` support, this PR enforces specifying `import type` everywhere it’s needed. (Developers will get immediate TypeScript and ESLint errors when they forget to do so.) I’m doing this because I believe `import type` improves DX and makes refactorings easier. Let’s say you had a few imports like below. Can you tell which of these imports will increase the bundle size? (Tip: it’s not all of them!) ```ts // app/client/src/workers/Linting/utils.ts import { Position } from "codemirror"; import { LintError as JSHintError, LintOptions } from "jshint"; import { get, isEmpty, isNumber, keys, last, set } from "lodash"; ``` It’s pretty hard, right? What about now? ```ts // app/client/src/workers/Linting/utils.ts import type { Position } from "codemirror"; import type { LintError as JSHintError, LintOptions } from "jshint"; import { get, isEmpty, isNumber, keys, last, set } from "lodash"; ``` Now, it’s clear that only `lodash` will be bundled. This helps developers to see which imports are problematic, but it _also_ helps with refactorings. Now, if you want to see where `codemirror` is bundled, you can just grep for `import \{.*\} from "codemirror"` – and you won’t get any type-only imports. This also helps (some) bundlers. Upon transpiling, TypeScript erases type-only imports completely. In some environment (not ours), this makes the bundle smaller, as the bundler doesn’t need to bundle type-only imports anymore. ## Type of change - Chore (housekeeping or task changes that don't impact user perception) ## How Has This Been Tested? This was tested to not break the build. ### 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 - [x] 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 - [x] 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: - [ ] Test plan has been approved by relevant developers - [ ] Test plan has been peer reviewed by QA - [ ] Cypress test cases have been added and approved by either SDET or manual QA - [ ] Organized project review call with relevant stakeholders after Round 1/2 of QA - [ ] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
import type { DSEventDetail } from "utils/AppsmithUtils";
import {
DSEventTypes,
DS_EVENT,
emitInteractionAnalyticsEvent,
} from "utils/AppsmithUtils";
feat: Action selector (#21582) ## Description Replaces the old boring action selector dropdown with a much more sophisticated UI that is capable of going above and beyond. Users with an aversion to code can now build their more complex workflows with a click of a few buttons. Consider this code snippet ```javascript Api1.run(() => { showAlert("Hello"); navigateTo('Page1', {}, 'SAME_WINDOW'); }, () => { removeValue("test"); }); ``` |**Old action selector** |**New action selector**| |:-:|:-:| |<img width="250" alt="Screenshot 2023-03-29 at 16 54 14" src="https://user-images.githubusercontent.com/32433245/228520661-a639b580-8986-4aec-a0f5-e2786d1a0f56.png">| <img width="250" alt="Screenshot 2023-03-29 at 16 55 15" src="https://user-images.githubusercontent.com/32433245/228521043-5025aa42-af95-4574-b586-bc4c721240bc.png">| **Click on an action block to edit its parameters.** <img width="500" alt="Screenshot 2023-03-29 at 17 01 18" src="https://user-images.githubusercontent.com/32433245/228522479-493769d0-9d2c-4b67-b493-a79e3bb9c947.png"> **Switch to JS mode to get the raw code** <img width="273" alt="Screenshot 2023-03-29 at 17 05 51" src="https://user-images.githubusercontent.com/32433245/228523458-13bc0302-4c94-4176-b5aa-3ec208122f57.png"> ### Code changes **New UI components** - ActionCreator component splits the code into block statements. - Each block statement is represented by ActionTree.tsx UI component. - ActionTree.tsx represents an action and its chains. - ActionCard.tsx is the block that represents the individual action on the UI. - ActionSelector.tsx component is popover that contains the form for editing individual action. - TabView, TextView, SelectorView, ActionSelectorView and KeyValueView are components that represent configurable fields in ActionSelector form. **AST methods** - Added methods to get/set function names, expressions, arguments. - Added methods to get/set then/catch blocks to allow chaining of actions. - Added methods to check if code is convertible to UI. Fixes #10160 Fixes #21588 Fixes #21392 Fixes #21393 Fixes #7903 Fixes #15895 Fixes #17765 Fixes #14562 Depends on https://github.com/appsmithorg/design-system/pull/306 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Manual - Jest - Cypress ### Test Plan https://github.com/appsmithorg/TestSmith/issues/2296 ### 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 - [x] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [x] Test plan has been approved by relevant developers - [x] Test plan has been peer reviewed by QA - [x] Cypress test cases have been added and approved by either SDET or manual QA - [x] Organized project review call with relevant stakeholders after Round 1/2 of QA - [x] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Rimil Dey <rimil@appsmith.com> Co-authored-by: arunvjn <arun@appsmith.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
2023-04-06 16:49:12 +00:00
import {
codeToAction,
getCodeFromMoustache,
} from "components/editorComponents/ActionCreator/utils";
import { canTranslateToUI, getActionBlocks } from "@shared/ast";
import {
getActions,
getJSCollections,
getPlugins,
} from "selectors/entitiesSelector";
import store from "store";
import keyBy from "lodash/keyBy";
import { getCurrentPageId } from "selectors/editorSelectors";
import { getApiQueriesAndJSActionOptionsWithChildren } from "components/editorComponents/ActionCreator/helpers";
import { selectEvaluationVersion } from "@appsmith/selectors/applicationSelectors";
2020-01-23 07:53:36 +00:00
2020-02-18 10:41:52 +00:00
class ActionSelectorControl extends BaseControl<ControlProps> {
componentRef = React.createRef<HTMLDivElement>();
componentDidMount() {
this.componentRef.current?.addEventListener(
DS_EVENT,
this.handleAdsEvent as (arg0: Event) => void,
);
}
componentWillUnmount() {
this.componentRef.current?.removeEventListener(
DS_EVENT,
this.handleAdsEvent as (arg0: Event) => void,
);
}
handleAdsEvent = (e: CustomEvent<DSEventDetail>) => {
if (
e.detail.component === "TreeDropdown" &&
e.detail.event === DSEventTypes.KEYPRESS
) {
emitInteractionAnalyticsEvent(this.componentRef.current, {
key: e.detail.meta.key,
});
e.stopPropagation();
}
};
handleValueUpdate = (newValue: string, isUpdatedViaKeyboard = false) => {
const { propertyName, propertyValue } = this.props;
if (!propertyValue && !newValue) return;
this.updateProperty(propertyName, newValue, isUpdatedViaKeyboard);
2020-01-23 07:53:36 +00:00
};
render() {
feat: Action selector (#21582) ## Description Replaces the old boring action selector dropdown with a much more sophisticated UI that is capable of going above and beyond. Users with an aversion to code can now build their more complex workflows with a click of a few buttons. Consider this code snippet ```javascript Api1.run(() => { showAlert("Hello"); navigateTo('Page1', {}, 'SAME_WINDOW'); }, () => { removeValue("test"); }); ``` |**Old action selector** |**New action selector**| |:-:|:-:| |<img width="250" alt="Screenshot 2023-03-29 at 16 54 14" src="https://user-images.githubusercontent.com/32433245/228520661-a639b580-8986-4aec-a0f5-e2786d1a0f56.png">| <img width="250" alt="Screenshot 2023-03-29 at 16 55 15" src="https://user-images.githubusercontent.com/32433245/228521043-5025aa42-af95-4574-b586-bc4c721240bc.png">| **Click on an action block to edit its parameters.** <img width="500" alt="Screenshot 2023-03-29 at 17 01 18" src="https://user-images.githubusercontent.com/32433245/228522479-493769d0-9d2c-4b67-b493-a79e3bb9c947.png"> **Switch to JS mode to get the raw code** <img width="273" alt="Screenshot 2023-03-29 at 17 05 51" src="https://user-images.githubusercontent.com/32433245/228523458-13bc0302-4c94-4176-b5aa-3ec208122f57.png"> ### Code changes **New UI components** - ActionCreator component splits the code into block statements. - Each block statement is represented by ActionTree.tsx UI component. - ActionTree.tsx represents an action and its chains. - ActionCard.tsx is the block that represents the individual action on the UI. - ActionSelector.tsx component is popover that contains the form for editing individual action. - TabView, TextView, SelectorView, ActionSelectorView and KeyValueView are components that represent configurable fields in ActionSelector form. **AST methods** - Added methods to get/set function names, expressions, arguments. - Added methods to get/set then/catch blocks to allow chaining of actions. - Added methods to check if code is convertible to UI. Fixes #10160 Fixes #21588 Fixes #21392 Fixes #21393 Fixes #7903 Fixes #15895 Fixes #17765 Fixes #14562 Depends on https://github.com/appsmithorg/design-system/pull/306 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Manual - Jest - Cypress ### Test Plan https://github.com/appsmithorg/TestSmith/issues/2296 ### 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 - [x] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [x] Test plan has been approved by relevant developers - [x] Test plan has been peer reviewed by QA - [x] Cypress test cases have been added and approved by either SDET or manual QA - [x] Organized project review call with relevant stakeholders after Round 1/2 of QA - [x] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Rimil Dey <rimil@appsmith.com> Co-authored-by: arunvjn <arun@appsmith.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
2023-04-06 16:49:12 +00:00
const { label, propertyValue } = this.props;
2020-01-23 07:53:36 +00:00
return (
2020-04-20 05:42:46 +00:00
<ActionCreator
feat: Action selector (#21582) ## Description Replaces the old boring action selector dropdown with a much more sophisticated UI that is capable of going above and beyond. Users with an aversion to code can now build their more complex workflows with a click of a few buttons. Consider this code snippet ```javascript Api1.run(() => { showAlert("Hello"); navigateTo('Page1', {}, 'SAME_WINDOW'); }, () => { removeValue("test"); }); ``` |**Old action selector** |**New action selector**| |:-:|:-:| |<img width="250" alt="Screenshot 2023-03-29 at 16 54 14" src="https://user-images.githubusercontent.com/32433245/228520661-a639b580-8986-4aec-a0f5-e2786d1a0f56.png">| <img width="250" alt="Screenshot 2023-03-29 at 16 55 15" src="https://user-images.githubusercontent.com/32433245/228521043-5025aa42-af95-4574-b586-bc4c721240bc.png">| **Click on an action block to edit its parameters.** <img width="500" alt="Screenshot 2023-03-29 at 17 01 18" src="https://user-images.githubusercontent.com/32433245/228522479-493769d0-9d2c-4b67-b493-a79e3bb9c947.png"> **Switch to JS mode to get the raw code** <img width="273" alt="Screenshot 2023-03-29 at 17 05 51" src="https://user-images.githubusercontent.com/32433245/228523458-13bc0302-4c94-4176-b5aa-3ec208122f57.png"> ### Code changes **New UI components** - ActionCreator component splits the code into block statements. - Each block statement is represented by ActionTree.tsx UI component. - ActionTree.tsx represents an action and its chains. - ActionCard.tsx is the block that represents the individual action on the UI. - ActionSelector.tsx component is popover that contains the form for editing individual action. - TabView, TextView, SelectorView, ActionSelectorView and KeyValueView are components that represent configurable fields in ActionSelector form. **AST methods** - Added methods to get/set function names, expressions, arguments. - Added methods to get/set then/catch blocks to allow chaining of actions. - Added methods to check if code is convertible to UI. Fixes #10160 Fixes #21588 Fixes #21392 Fixes #21393 Fixes #7903 Fixes #15895 Fixes #17765 Fixes #14562 Depends on https://github.com/appsmithorg/design-system/pull/306 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Manual - Jest - Cypress ### Test Plan https://github.com/appsmithorg/TestSmith/issues/2296 ### 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 - [x] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [x] Test plan has been approved by relevant developers - [x] Test plan has been peer reviewed by QA - [x] Cypress test cases have been added and approved by either SDET or manual QA - [x] Organized project review call with relevant stakeholders after Round 1/2 of QA - [x] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Rimil Dey <rimil@appsmith.com> Co-authored-by: arunvjn <arun@appsmith.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
2023-04-06 16:49:12 +00:00
action={label}
additionalAutoComplete={this.props.additionalAutoComplete}
feat: Action selector (#21582) ## Description Replaces the old boring action selector dropdown with a much more sophisticated UI that is capable of going above and beyond. Users with an aversion to code can now build their more complex workflows with a click of a few buttons. Consider this code snippet ```javascript Api1.run(() => { showAlert("Hello"); navigateTo('Page1', {}, 'SAME_WINDOW'); }, () => { removeValue("test"); }); ``` |**Old action selector** |**New action selector**| |:-:|:-:| |<img width="250" alt="Screenshot 2023-03-29 at 16 54 14" src="https://user-images.githubusercontent.com/32433245/228520661-a639b580-8986-4aec-a0f5-e2786d1a0f56.png">| <img width="250" alt="Screenshot 2023-03-29 at 16 55 15" src="https://user-images.githubusercontent.com/32433245/228521043-5025aa42-af95-4574-b586-bc4c721240bc.png">| **Click on an action block to edit its parameters.** <img width="500" alt="Screenshot 2023-03-29 at 17 01 18" src="https://user-images.githubusercontent.com/32433245/228522479-493769d0-9d2c-4b67-b493-a79e3bb9c947.png"> **Switch to JS mode to get the raw code** <img width="273" alt="Screenshot 2023-03-29 at 17 05 51" src="https://user-images.githubusercontent.com/32433245/228523458-13bc0302-4c94-4176-b5aa-3ec208122f57.png"> ### Code changes **New UI components** - ActionCreator component splits the code into block statements. - Each block statement is represented by ActionTree.tsx UI component. - ActionTree.tsx represents an action and its chains. - ActionCard.tsx is the block that represents the individual action on the UI. - ActionSelector.tsx component is popover that contains the form for editing individual action. - TabView, TextView, SelectorView, ActionSelectorView and KeyValueView are components that represent configurable fields in ActionSelector form. **AST methods** - Added methods to get/set function names, expressions, arguments. - Added methods to get/set then/catch blocks to allow chaining of actions. - Added methods to check if code is convertible to UI. Fixes #10160 Fixes #21588 Fixes #21392 Fixes #21393 Fixes #7903 Fixes #15895 Fixes #17765 Fixes #14562 Depends on https://github.com/appsmithorg/design-system/pull/306 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Manual - Jest - Cypress ### Test Plan https://github.com/appsmithorg/TestSmith/issues/2296 ### 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 - [x] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [x] Test plan has been approved by relevant developers - [x] Test plan has been peer reviewed by QA - [x] Cypress test cases have been added and approved by either SDET or manual QA - [x] Organized project review call with relevant stakeholders after Round 1/2 of QA - [x] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Rimil Dey <rimil@appsmith.com> Co-authored-by: arunvjn <arun@appsmith.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
2023-04-06 16:49:12 +00:00
additionalControlData={
this.props.additionalControlData as Record<string, any>
}
onValueChange={this.handleValueUpdate}
ref={this.componentRef}
value={propertyValue}
/>
2020-01-23 07:53:36 +00:00
);
}
static getControlType() {
2020-01-23 07:53:36 +00:00
return "ACTION_SELECTOR";
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
static canDisplayValueInUI(config: ControlData, value: any): boolean {
feat: Action selector (#21582) ## Description Replaces the old boring action selector dropdown with a much more sophisticated UI that is capable of going above and beyond. Users with an aversion to code can now build their more complex workflows with a click of a few buttons. Consider this code snippet ```javascript Api1.run(() => { showAlert("Hello"); navigateTo('Page1', {}, 'SAME_WINDOW'); }, () => { removeValue("test"); }); ``` |**Old action selector** |**New action selector**| |:-:|:-:| |<img width="250" alt="Screenshot 2023-03-29 at 16 54 14" src="https://user-images.githubusercontent.com/32433245/228520661-a639b580-8986-4aec-a0f5-e2786d1a0f56.png">| <img width="250" alt="Screenshot 2023-03-29 at 16 55 15" src="https://user-images.githubusercontent.com/32433245/228521043-5025aa42-af95-4574-b586-bc4c721240bc.png">| **Click on an action block to edit its parameters.** <img width="500" alt="Screenshot 2023-03-29 at 17 01 18" src="https://user-images.githubusercontent.com/32433245/228522479-493769d0-9d2c-4b67-b493-a79e3bb9c947.png"> **Switch to JS mode to get the raw code** <img width="273" alt="Screenshot 2023-03-29 at 17 05 51" src="https://user-images.githubusercontent.com/32433245/228523458-13bc0302-4c94-4176-b5aa-3ec208122f57.png"> ### Code changes **New UI components** - ActionCreator component splits the code into block statements. - Each block statement is represented by ActionTree.tsx UI component. - ActionTree.tsx represents an action and its chains. - ActionCard.tsx is the block that represents the individual action on the UI. - ActionSelector.tsx component is popover that contains the form for editing individual action. - TabView, TextView, SelectorView, ActionSelectorView and KeyValueView are components that represent configurable fields in ActionSelector form. **AST methods** - Added methods to get/set function names, expressions, arguments. - Added methods to get/set then/catch blocks to allow chaining of actions. - Added methods to check if code is convertible to UI. Fixes #10160 Fixes #21588 Fixes #21392 Fixes #21393 Fixes #7903 Fixes #15895 Fixes #17765 Fixes #14562 Depends on https://github.com/appsmithorg/design-system/pull/306 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Manual - Jest - Cypress ### Test Plan https://github.com/appsmithorg/TestSmith/issues/2296 ### 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 - [x] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [x] Test plan has been approved by relevant developers - [x] Test plan has been peer reviewed by QA - [x] Cypress test cases have been added and approved by either SDET or manual QA - [x] Organized project review call with relevant stakeholders after Round 1/2 of QA - [x] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Rimil Dey <rimil@appsmith.com> Co-authored-by: arunvjn <arun@appsmith.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
2023-04-06 16:49:12 +00:00
const state = store.getState();
const actions = getActions(state);
const jsActions = getJSCollections(state);
const codeFromProperty = getCodeFromMoustache(value?.trim() || "");
const evaluationVersion = selectEvaluationVersion(state);
const actionsArray: string[] = [];
const jsActionsArray: string[] = [];
actions.forEach((action) => {
actionsArray.push(action.config.name + ".run");
actionsArray.push(action.config.name + ".clear");
});
jsActions.forEach((jsAction) =>
jsAction.config.actions.forEach((action) => {
jsActionsArray.push(jsAction.config.name + "." + action.name);
}),
);
const canTranslate = canTranslateToUI(codeFromProperty, evaluationVersion);
if (codeFromProperty.trim() && !canTranslate) {
return false;
}
const pageId = getCurrentPageId(state);
const plugins = getPlugins(state);
const pluginGroups: any = keyBy(plugins, "id");
// this function gets all the Queries/API's/JS objects and attaches it to actionList
const fieldOptions = getApiQueriesAndJSActionOptionsWithChildren(
pageId,
pluginGroups,
actions,
jsActions,
() => {
return;
},
() => {
return;
},
);
try {
const blocks = getActionBlocks(codeFromProperty, evaluationVersion);
fix: code to UI breaking by disabling JS toggle (#23242) ## Description In some cases, while converting code to UI, the actions were being rendered incorrectly. This PR addresses the issue by disabling the JS toggle in such cases. #### PR fixes following issue(s) Fixes #22180 #22505 ## Media ![Screenshot 2023-05-12 at 12 02 04 AM](https://github.com/appsmithorg/appsmith/assets/13567359/65801e91-7e9a-4c68-a0d3-f34c9c4e8bea) ![Screenshot 2023-05-12 at 12 02 11 AM](https://github.com/appsmithorg/appsmith/assets/13567359/b63809ea-a959-4391-8871-a02c077d0351) #### Type of change - Bug fix (non-breaking change which fixes an issue) ## Testing > #### How Has This Been Tested? - [x] Manual - [ ] Jest - [x] Cypress #### Test Plan - snippets present on the issue - snippets with spaces formated on the editor - function declaration like `function() {}` #### Issues raised during DP testing none ## 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/Test-plan-implementation#speedbreaker-features-to-consider-for-every-change) have been covered - [x] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans/_edit#areas-of-interest) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [x] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [x] Cypress test cases have been added and approved by SDET/manual QA - [x] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
2023-05-22 10:53:43 +00:00
for (const codeBlock of blocks) {
codeToAction(codeBlock, fieldOptions, true, true);
feat: Action selector (#21582) ## Description Replaces the old boring action selector dropdown with a much more sophisticated UI that is capable of going above and beyond. Users with an aversion to code can now build their more complex workflows with a click of a few buttons. Consider this code snippet ```javascript Api1.run(() => { showAlert("Hello"); navigateTo('Page1', {}, 'SAME_WINDOW'); }, () => { removeValue("test"); }); ``` |**Old action selector** |**New action selector**| |:-:|:-:| |<img width="250" alt="Screenshot 2023-03-29 at 16 54 14" src="https://user-images.githubusercontent.com/32433245/228520661-a639b580-8986-4aec-a0f5-e2786d1a0f56.png">| <img width="250" alt="Screenshot 2023-03-29 at 16 55 15" src="https://user-images.githubusercontent.com/32433245/228521043-5025aa42-af95-4574-b586-bc4c721240bc.png">| **Click on an action block to edit its parameters.** <img width="500" alt="Screenshot 2023-03-29 at 17 01 18" src="https://user-images.githubusercontent.com/32433245/228522479-493769d0-9d2c-4b67-b493-a79e3bb9c947.png"> **Switch to JS mode to get the raw code** <img width="273" alt="Screenshot 2023-03-29 at 17 05 51" src="https://user-images.githubusercontent.com/32433245/228523458-13bc0302-4c94-4176-b5aa-3ec208122f57.png"> ### Code changes **New UI components** - ActionCreator component splits the code into block statements. - Each block statement is represented by ActionTree.tsx UI component. - ActionTree.tsx represents an action and its chains. - ActionCard.tsx is the block that represents the individual action on the UI. - ActionSelector.tsx component is popover that contains the form for editing individual action. - TabView, TextView, SelectorView, ActionSelectorView and KeyValueView are components that represent configurable fields in ActionSelector form. **AST methods** - Added methods to get/set function names, expressions, arguments. - Added methods to get/set then/catch blocks to allow chaining of actions. - Added methods to check if code is convertible to UI. Fixes #10160 Fixes #21588 Fixes #21392 Fixes #21393 Fixes #7903 Fixes #15895 Fixes #17765 Fixes #14562 Depends on https://github.com/appsmithorg/design-system/pull/306 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Manual - Jest - Cypress ### Test Plan https://github.com/appsmithorg/TestSmith/issues/2296 ### 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 - [x] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [x] Test plan has been approved by relevant developers - [x] Test plan has been peer reviewed by QA - [x] Cypress test cases have been added and approved by either SDET or manual QA - [x] Organized project review call with relevant stakeholders after Round 1/2 of QA - [x] Added Test Plan Approved label after reveiwing all Cypress test --------- Co-authored-by: Rimil Dey <rimil@appsmith.com> Co-authored-by: arunvjn <arun@appsmith.com> Co-authored-by: Aishwarya UR <aishwarya@appsmith.com> Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
2023-04-06 16:49:12 +00:00
}
} catch (e) {
return false;
}
return true;
}
2020-01-23 07:53:36 +00:00
}
2020-02-18 10:41:52 +00:00
export default ActionSelectorControl;