PromucFlow_constructor/app/client/src/entities/Action/index.ts
Ankita Kinger b30d86ec6e
chore: Calling changeApi and changeQuery actions based on PluginType when plugin action form component is mounted (#36398)
## Description

Calling `changeApi` and `changeQuery` actions based on PluginType when
plugin action form component is mounted in the new Plugin action
modularisation flow.

Fixes #36344 #36345 

## Automation

/ok-to-test tags="@tag.All"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/10939522143>
> Commit: 528977f7e9aed43a6429a2a3c9aa7430e1183b91
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10939522143&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Thu, 19 Sep 2024 12:26:12 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Introduced a new hook, `useChangeActionCall`, to enhance action
management within the IDE.
- Integrated `useChangeActionCall` into the `PluginActionForm` component
for improved interactivity.

- **Tests**
- Added unit tests for the `useChangeActionCall` hook to ensure correct
action dispatching based on plugin context.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-09-19 18:14:26 +05:30

332 lines
8.8 KiB
TypeScript

import type { EmbeddedRestDatasource } from "entities/Datasource";
import type { DynamicPath } from "utils/DynamicBindingUtils";
import _ from "lodash";
import type { LayoutOnLoadActionErrors } from "constants/AppsmithActionConstants/ActionConstants";
import type { Plugin } from "api/PluginApi";
import type { AutoGeneratedHeader } from "pages/Editor/APIEditor/helpers";
import type { EventLocation } from "ee/utils/analyticsUtilTypes";
import type { ActionParentEntityTypeInterface } from "ee/entities/Engine/actionHelpers";
export enum PluginType {
API = "API",
DB = "DB",
SAAS = "SAAS",
JS = "JS",
REMOTE = "REMOTE",
AI = "AI",
INTERNAL = "INTERNAL",
}
export enum PluginPackageName {
POSTGRES = "postgres-plugin",
MONGO = "mongo-plugin",
S3 = "amazons3-plugin",
GOOGLE_SHEETS = "google-sheets-plugin",
FIRESTORE = "firestore-plugin",
REST_API = "restapi-plugin",
GRAPHQL = "graphql-plugin",
JS = "js-plugin",
ORACLE = "oracle-plugin",
MY_SQL = "mysql-plugin",
MS_SQL = "mssql-plugin",
SNOWFLAKE = "snowflake-plugin",
APPSMITH_AI = "appsmithai-plugin",
WORKFLOW = "workflow-plugin",
}
// more can be added subsequently.
export enum PluginName {
MONGO = "MongoDB",
POSTGRES = "PostgreSQL",
MY_SQL = "MySQL",
MS_SQL = "Microsoft SQL Server",
GOOGLE_SHEETS = "Google Sheets",
FIRESTORE = "Firestore",
ORACLE = "Oracle",
SNOWFLAKE = "Snowflake",
ARANGODB = "ArangoDB",
REDSHIFT = "Redshift",
SMTP = "SMTP",
REST_API = "REST API",
REDIS = "Redis",
AIRTABLE = "Airtable",
TWILIO = "Twilio",
HUBSPOT = "HubSpot",
ELASTIC_SEARCH = "Elasticsearch",
GRAPHQL = "Authenticated GraphQL API",
OPEN_AI = "Open AI",
APPSMITH_AI = "Appsmith AI",
}
export enum PaginationType {
NONE = "NONE",
PAGE_NO = "PAGE_NO",
URL = "URL",
CURSOR = "CURSOR",
}
// Used for analytic events
export enum ActionCreationSourceTypeEnum {
SELF = "SELF",
GENERATE_PAGE = "GENERATE_PAGE",
ONE_CLICK_BINDING = "ONE_CLICK_BINDING",
CLONE_PAGE = "CLONE_PAGE",
FORK_APPLICATION = "FORK_APPLICATION",
COPY_ACTION = "COPY_ACTION",
}
// Used for analytic events
export enum ActionExecutionContext {
SELF = "SELF",
ONE_CLICK_BINDING = "ONE_CLICK_BINDING",
GENERATE_CRUD_PAGE = "GENERATE_CRUD_PAGE",
CLONE_PAGE = "CLONE_PAGE",
FORK_TEMPLATE_PAGE = "FORK_TEMPLATE_PAGE",
PAGE_LOAD = "PAGE_LOAD",
EVALUATION_ACTION_TRIGGER = "EVALUATION_ACTION_TRIGGER",
REFRESH_ACTIONS_ON_ENV_CHANGE = "REFRESH_ACTIONS_ON_ENV_CHANGE",
}
export interface KeyValuePair {
key?: string;
value?: unknown;
}
export interface LimitOffset {
limit: Record<string, unknown>;
offset: Record<string, unknown>;
}
export interface SelfReferencingData {
limitBased?: LimitOffset;
curserBased?: {
previous?: LimitOffset;
next?: LimitOffset;
};
}
export interface ActionConfig {
timeoutInMillisecond?: number;
paginationType?: PaginationType;
formData?: Record<string, unknown>;
pluginSpecifiedTemplates?: KeyValuePair[];
path?: string;
queryParameters?: KeyValuePair[];
selfReferencingData?: SelfReferencingData;
}
export interface Property {
key: string;
value: string;
}
export interface BodyFormData {
editable: boolean;
mandatory: boolean;
description: string;
key: string;
value?: string;
type: string;
}
export interface ApiActionConfig extends Omit<ActionConfig, "formData"> {
headers: Property[];
autoGeneratedHeaders?: AutoGeneratedHeader[];
httpMethod: string;
httpVersion: string;
path?: string;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
body?: JSON | string | Record<string, any> | null;
encodeParamsToggle: boolean;
queryParameters?: Property[];
bodyFormData?: BodyFormData[];
formData: Record<string, unknown>;
query?: string | null;
variable?: string | null;
}
export interface QueryActionConfig extends ActionConfig {
body?: string;
}
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const isStoredDatasource = (val: any): val is StoredDatasource => {
if (!_.isObject(val)) return false;
if (!("id" in val)) return false;
return true;
};
export interface StoredDatasource {
name?: string;
id: string;
pluginId?: string;
datasourceConfiguration?: { url?: string };
}
export interface BaseAction {
id: string;
baseId: string;
name: string;
workspaceId: string;
applicationId: string;
pageId: string;
collectionId?: string;
pluginId: string;
executeOnLoad: boolean;
dynamicBindingPathList: DynamicPath[];
isValid: boolean;
invalids: string[];
jsonPathKeys: string[];
cacheResponse: string;
confirmBeforeExecute?: boolean;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
eventData?: any;
messages: string[];
userPermissions?: string[];
errorReports?: Array<LayoutOnLoadActionErrors>;
isPublic?: boolean;
packageId?: string;
moduleId?: string;
moduleInstanceId?: string;
workflowId?: string;
contextType?: ActionParentEntityTypeInterface;
// This is used to identify the main js collection of a workflow
// added here to avoid ts error in entitiesSelector file, in practice
// will always be undefined for non js actions
isMainJSCollection?: boolean;
source?: ActionCreationSourceTypeEnum;
}
interface BaseApiAction extends BaseAction {
pluginType: PluginType.API;
actionConfiguration: ApiActionConfig;
}
export interface SaaSAction extends BaseAction {
pluginType: PluginType.SAAS;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
actionConfiguration: any;
datasource: StoredDatasource;
}
export interface RemoteAction extends BaseAction {
pluginType: PluginType.REMOTE;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
actionConfiguration: any;
datasource: StoredDatasource;
}
export interface AIAction extends BaseAction {
pluginType: PluginType.AI;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
actionConfiguration: any;
datasource: StoredDatasource;
}
export interface InternalAction extends BaseAction {
pluginType: PluginType.INTERNAL;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
actionConfiguration: any;
datasource: StoredDatasource;
}
export interface EmbeddedApiAction extends BaseApiAction {
datasource: EmbeddedRestDatasource;
}
export interface StoredDatasourceApiAction extends BaseApiAction {
datasource: StoredDatasource;
}
export type ApiAction = EmbeddedApiAction | StoredDatasourceApiAction;
export interface QueryAction extends BaseAction {
pluginType: PluginType.DB;
pluginName?: PluginName;
actionConfiguration: QueryActionConfig;
datasource: StoredDatasource;
}
export interface ActionViewMode {
id: string;
baseId: string;
name: string;
pageId: string;
jsonPathKeys: string[];
confirmBeforeExecute?: boolean;
timeoutInMillisecond?: number;
}
export type Action =
| ApiAction
| QueryAction
| SaaSAction
| RemoteAction
| AIAction
| InternalAction;
export enum SlashCommand {
NEW_API,
NEW_QUERY,
NEW_INTEGRATION,
ASK_AI,
}
export interface SlashCommandPayload {
actionType: SlashCommand;
callback?: (binding: string) => void;
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
args: any;
}
export function isAPIAction(action: Action): action is ApiAction {
return action.pluginType === PluginType.API;
}
export function isQueryAction(action: Action): action is QueryAction {
return action.pluginType === PluginType.DB;
}
export function isSaaSAction(action: Action): action is SaaSAction {
return action.pluginType === PluginType.SAAS;
}
export function isAIAction(action: Action): action is AIAction {
return action.pluginType === PluginType.AI;
}
export function getGraphQLPlugin(plugins: Plugin[]): Plugin | undefined {
return plugins.find((p) => p.packageName === PluginPackageName.GRAPHQL);
}
export function getAppsmithAIPlugin(plugins: Plugin[]): Plugin | undefined {
return plugins.find((p) => p.packageName === PluginPackageName.APPSMITH_AI);
}
export function isGraphqlPlugin(plugin: Plugin | undefined) {
return plugin?.packageName === PluginPackageName.GRAPHQL;
}
export function isRESTAPIPlugin(plugin: Plugin | undefined) {
return plugin?.packageName === PluginPackageName.REST_API;
}
export const SCHEMA_SECTION_ID = "t--api-right-pane-schema";
export interface CreateApiActionDefaultsParams {
apiType: string;
from?: EventLocation;
newActionName?: string;
}
export interface CreateActionDefaultsParams {
datasourceId: string;
from?: EventLocation;
newActionName?: string;
queryDefaultTableName?: string;
}