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,