Skip to content

Commit

Permalink
Merge branch 'release' into pg
Browse files Browse the repository at this point in the history
  • Loading branch information
Automated Github Action committed Feb 20, 2025
2 parents ee9b137 + 0fdac20 commit 5e27eec
Show file tree
Hide file tree
Showing 18 changed files with 207 additions and 67 deletions.
2 changes: 1 addition & 1 deletion .github/config.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ app/client/yalc.lock
.idea
.fleet/*
app/client/.fleet/*
.lens

# Observability related local storage
utils/observability/tempo-data/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import EditorNavigation, {
AppSidebarButton,
AppSidebar,
} from "../../../../support/Pages/EditorNavigation";
import PageList from "../../../../support/Pages/PageList";

describe(
"Validate API request body panel",
Expand Down Expand Up @@ -99,6 +100,7 @@ describe(
});

it("7. Checks MultiPart form data for a File Type upload + Bug 12476", () => {
PageList.AddNewPage();
const imageNameToUpload = "ConcreteHouse.jpg";
agHelper.AddDsl("multiPartFormDataDsl");

Expand All @@ -111,7 +113,7 @@ describe(
apiPage.EnterBodyFormData(
"MULTIPART_FORM_DATA",
"file",
"{{FilePicker1.files[0]}}",
"{{FilePicker1.files[0].data}}",
"File",
);

Expand Down Expand Up @@ -141,7 +143,7 @@ describe(
EditorNavigation.SelectEntityByName("MultipartAPI", EntityType.Api);

apiPage.ToggleOnPageLoadRun(false); //Bug 12476
EditorNavigation.SelectEntityByName("Page1", EntityType.Page);
EditorNavigation.SelectEntityByName("Page2", EntityType.Page);
deployMode.DeployApp(locators._buttonByText("Select Files"));
agHelper.ClickButton("Select Files");
agHelper.UploadFile(imageNameToUpload);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/* eslint-disable no-console */
import React from "react";
import type { Meta, StoryObj } from "@storybook/react";

import { MenuItem } from "../../Menu";
import { EntityContextMenu } from "./EntityContextMenu";

const meta: Meta<typeof EntityContextMenu> = {
title: "ADS/Templates/Entity Context Menu",
component: EntityContextMenu,
};

export default meta;

type Story = StoryObj<typeof EntityContextMenu>;

export const Basic: Story = {
args: {
tooltipContent: "More actions",
children: (
<>
<MenuItem onClick={console.log} startIcon="edit-line">
Rename
</MenuItem>
<MenuItem onClick={console.log} startIcon="copy-control">
Copy
</MenuItem>
<MenuItem onClick={console.log} startIcon="delete">
Delete
</MenuItem>
</>
),
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import styled from "styled-components";

import { MenuContent as ADSMenuContent } from "../../Menu";

export const MenuContent = styled(ADSMenuContent)`
width: 220px;
max-height: unset;
`;

export const ButtonContainer = styled.div`
position: relative;
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import React from "react";
import { useToggle } from "usehooks-ts";

import { Button } from "../../Button";
import { Menu, MenuTrigger } from "../../Menu";
import { Tooltip } from "../../Tooltip";

import {
EntityClassNames,
DEFAULT_DATA_TEST_ID,
DEFAULT_TOOLTIP_CONTENT,
} from "./constants";

import * as Styled from "./EntityContextMenu.styles";

interface Props {
dataTestid?: string;
children?: React.ReactNode[] | React.ReactNode;
tooltipContent?: React.ReactNode;
}

export const EntityContextMenu = (props: Props) => {
const {
children,
dataTestid = DEFAULT_DATA_TEST_ID,
tooltipContent = DEFAULT_TOOLTIP_CONTENT,
} = props;

const [isMenuOpen, toggleMenuOpen] = useToggle();

return (
<Menu onOpenChange={toggleMenuOpen} open={isMenuOpen}>
<MenuTrigger className="t--context-menu">
<Styled.ButtonContainer>
<Tooltip
content={tooltipContent}
isDisabled={isMenuOpen}
mouseLeaveDelay={0}
placement="right"
>
<Button
className={EntityClassNames.CONTEXT_MENU}
data-testid={dataTestid}
isIconButton
kind="tertiary"
startIcon="more-2-fill"
/>
</Tooltip>
</Styled.ButtonContainer>
</MenuTrigger>
<Styled.MenuContent
align="start"
className={`t--entity-context-menu ${EntityClassNames.CONTEXT_MENU_CONTENT}`}
side="right"
>
{children}
</Styled.MenuContent>
</Menu>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export enum EntityClassNames {
CONTEXT_MENU = "entity-context-menu",
CONTEXT_MENU_CONTENT = "entity-context-menu-content",
}

export const DEFAULT_DATA_TEST_ID = "t--more-action-trigger";
export const DEFAULT_TOOLTIP_CONTENT = "More actions";
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { EntityContextMenu } from "./EntityContextMenu";
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export * from "./Sidebar";
export * from "./EditableEntityName";
export * from "./EditableDismissibleTab";
export * from "./EntityTabsHeader";
export * from "./EntityContextMenu";
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { toast } from "@appsmith/ads";
import { createMessage, IMPORT_APP_SUCCESSFUL } from "ee/constants/messages";
import { builderURL } from "ee/RouteBuilder";
import { showReconnectDatasourceModal } from "ee/actions/applicationActions";
import type { ApplicationResponsePayload } from "ee/api/ApplicationApi";
import type { GitImportSuccessPayload } from "git/store/actions/gitImportActions";
import type { GitArtifactPayloadAction } from "git/store/types";
import { put } from "redux-saga/effects";
import history from "utils/history";

export default function* applicationImportFromGitSaga(
action: GitArtifactPayloadAction<GitImportSuccessPayload>,
) {
const { responseData } = action.payload;
const { isPartialImport, unConfiguredDatasourceList } = responseData;

const application =
(responseData.application as ApplicationResponsePayload) ?? null;

if (!application) return;

// there is configuration-missing datasources
if (isPartialImport) {
yield put(
showReconnectDatasourceModal({
application: application as ApplicationResponsePayload,
unConfiguredDatasourceList: unConfiguredDatasourceList ?? [],
workspaceId: application?.workspaceId ?? "",
}),
);
} else {
let basePageId = "";

if (application.pages && application.pages.length > 0) {
const defaultPage = application.pages.find(
(eachPage) => !!eachPage.isDefault,
);

basePageId = defaultPage ? defaultPage.baseId : "";
}

const branch = application?.gitApplicationMetadata?.branchName;

const pageURL = builderURL({
basePageId,
branch,
});

history.push(pageURL);
toast.show(createMessage(IMPORT_APP_SUCCESSFUL), {
kind: "success",
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@ import {
gitCheckoutBranchSuccess,
gitConnectSuccess,
gitDiscardSuccess,
gitImportSuccess,
gitPullSuccess,
} from "git/store";
import applicationImportFromGitSaga from "./applicationImportFromGitSaga";

export default function* gitApplicationSagas() {
yield all([
takeLatest(gitConnectSuccess.type, applicationConnectToGitSaga),
takeLatest(gitImportSuccess.type, applicationImportFromGitSaga),
takeLatest(gitDiscardSuccess.type, applicationRedirectToClosestEntitySaga),
takeLatest(
gitCheckoutBranchSuccess.type,
Expand Down
5 changes: 3 additions & 2 deletions app/client/src/git/requests/gitImportRequest.types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ApiResponse } from "api/types";
import type { ApplicationResponsePayload } from "ee/api/ApplicationApi";
import type { Datasource } from "entities/Datasource";
import type { GitApplicationArtifact, GitPackageArtifact } from "git/types";

export interface GitImportRequestParams {
remoteUrl: string;
Expand All @@ -12,7 +12,8 @@ export interface GitImportRequestParams {
}

export interface GitImportResponseData {
application: ApplicationResponsePayload;
application?: GitApplicationArtifact;
package?: GitPackageArtifact;
isPartialImport: boolean;
unConfiguredDatasourceList?: Datasource[];
}
Expand Down
55 changes: 3 additions & 52 deletions app/client/src/git/sagas/gitImportSaga.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,11 @@
import { call, put, select } from "redux-saga/effects";
import { validateResponse } from "sagas/ErrorSagas";
import history from "utils/history";
import { toast } from "@appsmith/ads";
import type { PayloadAction } from "@reduxjs/toolkit";
import gitImportRequest from "git/requests/gitImportRequest";
import type { GitImportResponse } from "git/requests/gitImportRequest.types";
import type { GitImportInitPayload } from "git/store/actions/gitImportActions";
import { gitGlobalActions } from "git/store/gitGlobalSlice";
import { createMessage, IMPORT_APP_SUCCESSFUL } from "ee/constants/messages";
import { builderURL } from "ee/RouteBuilder";
import { getWorkspaceIdForImport } from "ee/selectors/applicationSelectors";
import { showReconnectDatasourceModal } from "ee/actions/applicationActions";
import type { Workspace } from "ee/constants/workspaceConstants";
import { getFetchedWorkspaces } from "ee/selectors/workspaceSelectors";
import { GitErrorCodes } from "git/constants/enums";
import { selectGitApiContractsEnabled } from "git/store/selectors/gitFeatureFlagSelectors";
import handleApiErrors from "./helpers/handleApiErrors";
Expand All @@ -39,52 +32,10 @@ export default function* gitImportSaga(
const isValidResponse: boolean = yield validateResponse(response);

if (response && isValidResponse) {
const allWorkspaces: Workspace[] = yield select(getFetchedWorkspaces);
const currentWorkspace = allWorkspaces.filter(
(el: Workspace) => el.id === workspaceId,
yield put(
gitGlobalActions.gitImportSuccess({ responseData: response.data }),
);

if (currentWorkspace.length > 0) {
const { application, isPartialImport, unConfiguredDatasourceList } =
response.data;

yield put(gitGlobalActions.gitImportSuccess());
yield put(gitGlobalActions.toggleImportModal({ open: false }));

// there is configuration-missing datasources
if (isPartialImport) {
yield put(
showReconnectDatasourceModal({
application: application,
unConfiguredDatasourceList: unConfiguredDatasourceList ?? [],
workspaceId,
}),
);
} else {
let basePageId = "";

if (application.pages && application.pages.length > 0) {
const defaultPage = application.pages.find(
(eachPage) => !!eachPage.isDefault,
);

basePageId = defaultPage ? defaultPage.baseId : "";
}

const branch =
response.data?.application?.gitApplicationMetadata?.branchName;

const pageURL = builderURL({
basePageId,
branch,
});

history.push(pageURL);
toast.show(createMessage(IMPORT_APP_SUCCESSFUL), {
kind: "success",
});
}
}
yield put(gitGlobalActions.toggleImportModal({ open: false }));
}
} catch (e) {
const error = handleApiErrors(e as Error, response);
Expand Down
23 changes: 19 additions & 4 deletions app/client/src/git/store/actions/gitImportActions.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import type { PayloadAction } from "@reduxjs/toolkit";
import type { GitAsyncErrorPayload, GitGlobalReduxState } from "../types";
import type { GitImportRequestParams } from "git/requests/gitImportRequest.types";
import type {
GitAsyncErrorPayload,
GitAsyncSuccessPayload,
GitGlobalReduxState,
} from "../types";
import type {
GitImportRequestParams,
GitImportResponseData,
} from "git/requests/gitImportRequest.types";

export interface GitImportInitPayload extends GitImportRequestParams {}

export const gitImportInitAction = (
state: GitGlobalReduxState,
// need type for better import
// need this here to preserve interface
// eslint-disable-next-line @typescript-eslint/no-unused-vars
action: PayloadAction<GitImportInitPayload>,
) => {
Expand All @@ -16,7 +23,15 @@ export const gitImportInitAction = (
return state;
};

export const gitImportSuccessAction = (state: GitGlobalReduxState) => {
export type GitImportSuccessPayload =
GitAsyncSuccessPayload<GitImportResponseData>;

export const gitImportSuccessAction = (
state: GitGlobalReduxState,
// need this here to preserve interface
// eslint-disable-next-line @typescript-eslint/no-unused-vars
action: PayloadAction<GitImportSuccessPayload>,
) => {
state.gitImport.loading = false;

return state;
Expand Down
1 change: 1 addition & 0 deletions app/client/src/git/store/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ export const gitDiscardSuccess = gitArtifactActions.discardSuccess;
export const gitCheckoutBranchSuccess =
gitArtifactActions.checkoutBranchSuccess;
export const gitPullSuccess = gitArtifactActions.pullSuccess;
export const gitImportSuccess = gitGlobalActions.gitImportSuccess;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useCallback, useMemo } from "react";
import { EntityItem } from "@appsmith/ads";
import { EntityItem, EntityContextMenu } from "@appsmith/ads";
import type { AppState } from "ee/reducers";
import { getJsCollectionByBaseId } from "ee/selectors/entitiesSelector";
import { useDispatch, useSelector } from "react-redux";
Expand All @@ -20,7 +20,6 @@ import { jsCollectionIdURL } from "ee/RouteBuilder";
import { JsFileIconV2 } from "pages/Editor/Explorer/ExplorerIcons";
import { AppJSContextMenuItems } from "./AppJSContextMenuItems";
import type { EntityItem as EntityItemProps } from "ee/IDE/Interfaces/EntityItem";
import EntityContextMenu from "IDE/Components/EntityContextMenu";

export const JSEntityItem = ({ item }: { item: EntityItemProps }) => {
const jsAction = useSelector((state: AppState) =>
Expand Down
Loading

0 comments on commit 5e27eec

Please sign in to comment.