diff --git a/app/client/src/actions/queryPaneActions.ts b/app/client/src/actions/queryPaneActions.ts
index 7074964120..55f87e7724 100644
--- a/app/client/src/actions/queryPaneActions.ts
+++ b/app/client/src/actions/queryPaneActions.ts
@@ -8,6 +8,7 @@ export interface ChangeQueryPayload {
applicationId?: string;
pageId?: string;
moduleId?: string;
+ workflowId?: string;
newQuery?: boolean;
action?: Action;
}
diff --git a/app/client/src/ce/constants/WorkflowConstants.ts b/app/client/src/ce/constants/WorkflowConstants.ts
new file mode 100644
index 0000000000..8bce81de0d
--- /dev/null
+++ b/app/client/src/ce/constants/WorkflowConstants.ts
@@ -0,0 +1,17 @@
+type ID = string;
+
+// Type for the workflow object.
+export interface Workflow {
+ id: ID;
+ name: string; // Name of the workflow.
+ icon: string;
+ color: string;
+ workspaceId: ID; // ID of the workspace where the workflow is created.
+ modifiedBy: string;
+ modifiedAt: string;
+ userPermissions: string[];
+ new: boolean;
+ slug: string; // Slug of the workflow (Not in use currently).
+}
+
+export type WorkflowMetadata = Workflow;
diff --git a/app/client/src/ce/pages/Applications/WorkflowCardList.tsx b/app/client/src/ce/pages/Applications/WorkflowCardList.tsx
new file mode 100644
index 0000000000..c4fa3e370e
--- /dev/null
+++ b/app/client/src/ce/pages/Applications/WorkflowCardList.tsx
@@ -0,0 +1,14 @@
+import type { Workflow } from "@appsmith/constants/WorkflowConstants";
+
+export interface WorkflowCardListProps {
+ isMobile: boolean;
+ workspaceId: string;
+ workflows?: Workflow[];
+}
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+function WorkflowCardList(props: WorkflowCardListProps) {
+ return null;
+}
+
+export default WorkflowCardList;
diff --git a/app/client/src/ce/pages/Applications/index.tsx b/app/client/src/ce/pages/Applications/index.tsx
index d42e3b9f2f..e4f701efff 100644
--- a/app/client/src/ce/pages/Applications/index.tsx
+++ b/app/client/src/ce/pages/Applications/index.tsx
@@ -104,6 +104,7 @@ import ResourceListLoader from "@appsmith/pages/Applications/ResourceListLoader"
import { useFeatureFlag } from "utils/hooks/useFeatureFlag";
import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag";
import { getHasCreateWorkspacePermission } from "@appsmith/utils/BusinessFeatures/permissionPageHelpers";
+import WorkflowCardList from "@appsmith/pages/Applications/WorkflowCardList";
import { allowManageEnvironmentAccessForUser } from "@appsmith/selectors/environmentSelectors";
import CreateNewAppsOption from "@appsmith/pages/Applications/CreateNewAppsOption";
import { resetCurrentApplicationIdForCreateNewApp } from "actions/onboardingActions";
@@ -598,7 +599,8 @@ export function ApplicationsSection(props: any) {
workspacesListComponent = updatedWorkspaces.map(
(workspaceObject: any, index: number) => {
const isLastWorkspace = updatedWorkspaces.length === index + 1;
- const { applications, packages, workspace } = workspaceObject;
+ const { applications, packages, workflows, workspace } =
+ workspaceObject;
const hasManageWorkspacePermissions = isPermitted(
workspace.userPermissions,
PERMISSION_TYPE.MANAGE_WORKSPACE,
@@ -761,6 +763,13 @@ export function ApplicationsSection(props: any) {
workspaceId={workspace.id}
/>
)}
+ {!isLoadingResources && (
+
+ )}
{!isLastWorkspace && }
diff --git a/app/client/src/ce/selectors/applicationSelectors.tsx b/app/client/src/ce/selectors/applicationSelectors.tsx
index 1b77d90c3f..e8ea4a1c8a 100644
--- a/app/client/src/ce/selectors/applicationSelectors.tsx
+++ b/app/client/src/ce/selectors/applicationSelectors.tsx
@@ -1,6 +1,7 @@
import { createSelector } from "reselect";
import { groupBy } from "lodash";
import type { AppState } from "@appsmith/reducers";
+import type { WorkflowMetadata } from "@appsmith/constants/WorkflowConstants";
import type {
ApplicationsReduxState,
creatingApplicationMap,
@@ -13,6 +14,7 @@ import { hasCreateNewAppPermission } from "@appsmith/utils/permissionHelpers";
import { NAVIGATION_SETTINGS, SIDEBAR_WIDTH } from "constants/AppConstants";
import { getPackagesList } from "@appsmith/selectors/packageSelectors";
import type { PackageMetadata } from "@appsmith/constants/PackageConstants";
+import { getWorkflowsList } from "@appsmith/selectors/workflowSelectors";
const fuzzySearchOptions = {
keys: ["applications.name", "workspace.name", "packages.name"],
@@ -36,14 +38,17 @@ const fuzzySearchOptions = {
* workspace: {},
* applications: [],
* users:[],
- * packages: []
+ * packages: [],
+ * workflows: [],
* }
*/
-const injectPackagesToWorkspacesList = (
+const injectPackagesAndWorkflowsToWorkspacesList = (
workspacesList: Workspaces[] = [],
packages: PackageMetadata[] = [],
+ workflows: WorkflowMetadata[] = [],
) => {
const packagesGroupByWorkspaceId = groupBy(packages, (p) => p.workspaceId);
+ const workflowsGroupByWorkspaceId = groupBy(workflows, (w) => w?.workspaceId);
return workspacesList.map((workspacesObj) => {
const { workspace } = workspacesObj;
@@ -51,6 +56,7 @@ const injectPackagesToWorkspacesList = (
return {
...workspacesObj,
packages: packagesGroupByWorkspaceId[workspace.id] || [],
+ workflows: workflowsGroupByWorkspaceId[workspace.id] || [],
};
});
};
@@ -116,14 +122,17 @@ export const getUserApplicationsWorkspacesList = createSelector(
getUserApplicationsWorkspaces,
getApplicationSearchKeyword,
getPackagesList,
+ getWorkflowsList,
(
applicationsWorkspaces?: Workspaces[],
keyword?: string,
packages?: PackageMetadata[],
+ workflows?: WorkflowMetadata[],
) => {
- const workspacesList = injectPackagesToWorkspacesList(
+ const workspacesList = injectPackagesAndWorkflowsToWorkspacesList(
applicationsWorkspaces,
packages,
+ workflows,
);
if (
@@ -144,11 +153,16 @@ export const getUserApplicationsWorkspacesList = createSelector(
...fuzzySearchOptions,
keys: ["name"],
});
+ const workflowFuzzy = new Fuse(workspace.workflows, {
+ ...fuzzySearchOptions,
+ keys: ["name"],
+ });
return {
...workspace,
applications: appFuzzy.search(keyword),
packages: packageFuzzy.search(keyword),
+ workflows: workflowFuzzy.search(keyword),
};
});
} else if (
diff --git a/app/client/src/ce/selectors/workflowSelectors.ts b/app/client/src/ce/selectors/workflowSelectors.ts
new file mode 100644
index 0000000000..a45f971888
--- /dev/null
+++ b/app/client/src/ce/selectors/workflowSelectors.ts
@@ -0,0 +1,20 @@
+import type { AppState } from "@appsmith/reducers";
+import type { WorkflowMetadata } from "@appsmith/constants/WorkflowConstants";
+
+const DEFAULT_WORKFLOW_LIST: WorkflowMetadata[] = [];
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+export const getIsFetchingWorkflows = (state: AppState) => false;
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+export const getIsCreatingWorkflow = (state: AppState, workspaceId: string) =>
+ false;
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+export const getWorkflowsList = (state: AppState): WorkflowMetadata[] =>
+ DEFAULT_WORKFLOW_LIST;
+
+export const getIsCurrentEditorWorkflowType = (
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ state: AppState,
+) => false;
diff --git a/app/client/src/ee/constants/WorkflowConstants.ts b/app/client/src/ee/constants/WorkflowConstants.ts
new file mode 100644
index 0000000000..56b284a580
--- /dev/null
+++ b/app/client/src/ee/constants/WorkflowConstants.ts
@@ -0,0 +1 @@
+export * from "ce/constants/WorkflowConstants";
diff --git a/app/client/src/ee/pages/Applications/WorkflowCardList.tsx b/app/client/src/ee/pages/Applications/WorkflowCardList.tsx
new file mode 100644
index 0000000000..9c2db63245
--- /dev/null
+++ b/app/client/src/ee/pages/Applications/WorkflowCardList.tsx
@@ -0,0 +1,3 @@
+export * from "ce/pages/Applications/WorkflowCardList";
+import { default as CE_WorkflowCardList } from "ce/pages/Applications/WorkflowCardList";
+export default CE_WorkflowCardList;
diff --git a/app/client/src/ee/selectors/workflowSelectors.ts b/app/client/src/ee/selectors/workflowSelectors.ts
new file mode 100644
index 0000000000..22166f4f1f
--- /dev/null
+++ b/app/client/src/ee/selectors/workflowSelectors.ts
@@ -0,0 +1 @@
+export * from "ce/selectors/workflowSelectors";
diff --git a/app/client/src/sagas/EvaluationsSaga.ts b/app/client/src/sagas/EvaluationsSaga.ts
index 0191b1bda8..a1e2cdf3ab 100644
--- a/app/client/src/sagas/EvaluationsSaga.ts
+++ b/app/client/src/sagas/EvaluationsSaga.ts
@@ -101,6 +101,7 @@ import { selectFeatureFlags } from "@appsmith/selectors/featureFlagsSelectors";
import { fetchFeatureFlagsInit } from "actions/userActions";
import { parseUpdatesAndDeleteUndefinedUpdates } from "./EvaluationSaga.utils";
import { getFeatureFlagsFetched } from "selectors/usersSelectors";
+import { getIsCurrentEditorWorkflowType } from "@appsmith/selectors/workflowSelectors";
import { evalErrorHandler } from "./EvalErrorHandler";
import AnalyticsUtil from "utils/AnalyticsUtil";
@@ -607,7 +608,16 @@ function* evaluationChangeListenerSaga(): any {
const initAction: EvaluationReduxAction = yield take(
FIRST_EVAL_REDUX_ACTIONS,
);
- yield call(waitForWidgetConfigBuild);
+
+ // Wait for widget config build to complete before starting evaluation only if the current editor is not a workflow
+ const isCurrentEditorWorkflowType = yield select(
+ getIsCurrentEditorWorkflowType,
+ );
+
+ if (!isCurrentEditorWorkflowType) {
+ yield call(waitForWidgetConfigBuild);
+ }
+
widgetTypeConfigMap = WidgetFactory.getWidgetTypeConfigMap();
yield fork(evalAndLintingHandler, false, initAction, {
shouldReplay: false,