Skip to content

Commit

Permalink
addressing review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
ankitakinger committed Oct 10, 2024
1 parent 14550f9 commit 67b4a47
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ import { IDEToolbar } from "IDE";
import { Button, Menu, MenuContent, MenuTrigger, Tooltip } from "@appsmith/ads";
import { modText } from "utils/helpers";
import { usePluginActionContext } from "../PluginActionContext";
import { useHandleRunClick } from "PluginActionEditor/hooks";
import { useBlockExecution, useHandleRunClick } from "PluginActionEditor/hooks";
import { useToggle } from "@mantine/hooks";
import { useSelector } from "react-redux";
import { isActionRunning } from "PluginActionEditor/store";

interface PluginActionToolbarProps {
runOptions?: React.ReactNode;
Expand All @@ -16,6 +18,8 @@ const PluginActionToolbar = (props: PluginActionToolbarProps) => {
const { action } = usePluginActionContext();
const { handleRunClick } = useHandleRunClick();
const [isMenuOpen, toggleMenuOpen] = useToggle([false, true]);
const blockExecution = useBlockExecution();
const isRunning = useSelector(isActionRunning(action.id));

const onRunClick = () => {
handleRunClick();
Expand All @@ -31,7 +35,13 @@ const PluginActionToolbar = (props: PluginActionToolbarProps) => {
placement="topRight"
showArrow={false}
>
<Button kind="primary" onClick={onRunClick} size="sm">
<Button
isDisabled={blockExecution}
isLoading={isRunning}
kind="primary"
onClick={onRunClick}
size="sm"
>
Run
</Button>
</Tooltip>
Expand Down
1 change: 1 addition & 0 deletions app/client/src/PluginActionEditor/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export { useActionSettingsConfig } from "ee/PluginActionEditor/hooks/useActionSettingsConfig";
export { useHandleDeleteClick } from "ee/PluginActionEditor/hooks/useHandleDeleteClick";
export { useHandleRunClick } from "ee/PluginActionEditor/hooks/useHandleRunClick";
export { useBlockExecution } from "ee/PluginActionEditor/hooks/useBlockExecution";
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,8 @@ import Schema from "components/editorComponents/Debugger/Schema";
import QueryResponseTab from "pages/Editor/QueryEditor/QueryResponseTab";
import type { SourceEntity } from "entities/AppsmithConsole";
import { ENTITY_TYPE as SOURCE_ENTITY_TYPE } from "ee/entities/AppsmithConsole/utils";
import { useHandleRunClick } from "PluginActionEditor/hooks";
import { useBlockExecution, useHandleRunClick } from "PluginActionEditor/hooks";
import useDebuggerTriggerClick from "components/editorComponents/Debugger/hooks/useDebuggerTriggerClick";
import { useFeatureFlag } from "utils/hooks/useFeatureFlag";
import { FEATURE_FLAG } from "ee/entities/FeatureFlag";
import { getHasExecuteActionPermission } from "ee/utils/BusinessFeatures/permissionPageHelpers";
import { DEFAULT_DATASOURCE_NAME } from "constants/ApiEditorConstants/ApiEditorConstants";

function usePluginActionResponseTabs() {
const { action, actionResponse, datasource, plugin } =
Expand All @@ -51,27 +47,7 @@ function usePluginActionResponseTabs() {

const onDebugClick = useDebuggerTriggerClick();
const isRunning = useSelector(isActionRunning(action.id));

const isFeatureEnabled = useFeatureFlag(FEATURE_FLAG.license_gac_enabled);
const isExecutePermitted = getHasExecuteActionPermission(
isFeatureEnabled,
action?.userPermissions,
);
// this gets the url of the current action's datasource
const actionDatasourceUrl =
action?.datasource?.datasourceConfiguration?.url || "";
const actionDatasourceUrlPath = action?.actionConfiguration?.path || "";
// this gets the name of the current action's datasource
const actionDatasourceName = action?.datasource.name || "";

// if the url is empty and the action's datasource name is the default datasource name (this means the api does not have a datasource attached)
// or the user does not have permission,
// we block action execution.
const blockExecution =
(!actionDatasourceUrl &&
!actionDatasourceUrlPath &&
actionDatasourceName === DEFAULT_DATASOURCE_NAME) ||
!isExecutePermitted;
const blockExecution = useBlockExecution();

const tabs: BottomTab[] = [];

Expand Down
63 changes: 63 additions & 0 deletions app/client/src/ce/PluginActionEditor/hooks/useBlockExecution.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { getHasExecuteActionPermission } from "ee/utils/BusinessFeatures/permissionPageHelpers";
import { FEATURE_FLAG } from "ee/entities/FeatureFlag";
import { useFeatureFlag } from "utils/hooks/useFeatureFlag";
import { DEFAULT_DATASOURCE_NAME } from "constants/ApiEditorConstants/ApiEditorConstants";
import { UIComponentTypes } from "api/PluginApi";
import { SQL_DATASOURCES } from "constants/QueryEditorConstants";
import { usePluginActionContext } from "PluginActionEditor/PluginActionContext";

const useBlockExecution = () => {
const { action, plugin } = usePluginActionContext();
const isFeatureEnabled = useFeatureFlag(FEATURE_FLAG.license_gac_enabled);
const isExecutePermitted = getHasExecuteActionPermission(
isFeatureEnabled,
action?.userPermissions,
);

let actionBody = "";
let blockExecution = false;

// API Editor Constants
// this gets the url of the current action's datasource
const actionDatasourceUrl =
action.datasource.datasourceConfiguration?.url || "";
const actionDatasourceUrlPath = action.actionConfiguration.path || "";
// this gets the name of the current action's datasource
const actionDatasourceName = action.datasource.name || "";

// Query Editor Constants
if (!!action.actionConfiguration) {
if ("formData" in action.actionConfiguration) {
// if the action has a formData (the action is postUQI e.g. Oracle)
actionBody = action.actionConfiguration.formData?.body?.data || "";
} else {
// if the action is pre UQI, the path is different e.g. mySQL
actionBody = action.actionConfiguration?.body || "";
}
}

if (
[
UIComponentTypes.ApiEditorForm,
UIComponentTypes.GraphQLEditorForm,
].includes(plugin.uiComponent)
) {
// if the url is empty and the action's datasource name is the default datasource name (this means the api does not have a datasource attached)
// or the user does not have permission,
// we block action execution.
blockExecution =
(!actionDatasourceUrl &&
!actionDatasourceUrlPath &&
actionDatasourceName === DEFAULT_DATASOURCE_NAME) ||
!isExecutePermitted;
} else {
// if (the body is empty and the action is an sql datasource) or the user does not have permission, block action execution.
blockExecution =
(!actionBody && SQL_DATASOURCES.includes(plugin.name)) ||
!isExecutePermitted;
}

return blockExecution;
};

export { useBlockExecution };
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "ce/PluginActionEditor/hooks/useBlockExecution";

0 comments on commit 67b4a47

Please sign in to comment.