PromucFlow_constructor/app/client/src/pages/Applications/ForkApplicationModal.tsx

166 lines
4.8 KiB
TypeScript
Raw Normal View History

import React, { useState, useMemo, useEffect } from "react";
import { useDispatch } from "react-redux";
import { useSelector } from "store";
import { getUserApplicationsWorkspaces } from "selectors/applicationSelectors";
import {
isPermitted,
PERMISSION_TYPE,
} from "@appsmith/utils/permissionHelpers";
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
import { AppState } from "@appsmith/reducers";
feat: import changes batch 2 (#15722) * Remove treedropdown from ads * Change Treedropdown imports * Remove Notification Banner, change imports * Remove Toggle from ads * Change toggle imports * explicitly declare function argument types * Remove Menu from ads * Change menu imports * Remove Spinner from ads * Change spinner imports * Remove Radio, import changes * test: updated flaky test under default meta (#15707) * updated flaky test * Updated tests * updated tests * updated the tests * updated tests * Update constants.ts * add more typecasting * Remove ListSegmentHeader, import changes * Remove TagInputComponent, import changes * Remove Switch, import changes * Remove SearchInput, change imports * Rename TagInputComponent to TagInput * Remove ProgressiveImage, import changes * import changes for SearchVariant * Remove menu divider, import changes * Remove TableDropdown, import changes * Remove Switcher * Remove StatusBar, import changes * Remove showcase carousel * Remove RectangularSwitcher, import change * Add types to TableDropdown's args * Remove MultiSwitch, import change * Remove GifPlayerComponent, import change * Remove DraggableList, import change * Remove DisplayImageUpload, import change * Remove DatePickerComponent, import change * Remove CopyToClipBoard, import change * Remove ColorSelector, import change * Remove TabItemBackgroundFill, NumberedStep, ColorPickerComponent * GifPlayerComponent -> GifPlayer * change named import * Remove FormFieldError, change imports * Update to new version of Tree Dropdown * Fix issue with ads/index.ts * Test file fix * Fix issue with merge?!?!?? * update design system to 1.0.18 * Bump ds version * bump ds version * bump ds version Co-authored-by: NandanAnantharamu <67676905+NandanAnantharamu@users.noreply.github.com> Co-authored-by: Albin <albin@appsmith.com>
2022-09-02 08:38:17 +00:00
import {
Button,
Category,
Dropdown,
IconSize,
Size,
Spinner,
} from "design-system";
2022-03-10 14:39:05 +00:00
import { StyledDialog, ButtonWrapper, SpinnerWrapper } from "./ForkModalStyles";
import { getIsFetchingApplications } from "selectors/applicationSelectors";
import { useLocation } from "react-router";
import { matchViewerForkPath } from "constants/routes";
2022-03-10 14:39:05 +00:00
import { Colors } from "constants/Colors";
import {
CANCEL,
createMessage,
FORK,
FORK_APP_MODAL_EMPTY_TITLE,
FORK_APP_MODAL_LOADING_TITLE,
FORK_APP_MODAL_SUCCESS_TITLE,
} from "@appsmith/constants/messages";
import { getAllApplications } from "actions/applicationActions";
type ForkApplicationModalProps = {
applicationId: string;
// if a trigger is passed
// it renders that component
trigger?: React.ReactNode;
isModalOpen?: boolean;
setModalClose?: (isOpen: boolean) => void;
};
function ForkApplicationModal(props: ForkApplicationModalProps) {
const { isModalOpen, setModalClose } = props;
const [workspace, selectWorkspace] = useState<{
2022-03-10 14:39:05 +00:00
label: string;
value: string;
}>({ label: "", value: "" });
const dispatch = useDispatch();
const userWorkspaces = useSelector(getUserApplicationsWorkspaces);
const forkingApplication = useSelector(
(state: AppState) => state.ui.applications.forkingApplication,
);
useEffect(() => {
if (!userWorkspaces.length) {
dispatch(getAllApplications());
}
}, [userWorkspaces.length]);
const isFetchingApplications = useSelector(getIsFetchingApplications);
const { pathname } = useLocation();
const showBasedOnURL = matchViewerForkPath(pathname);
const forkApplication = () => {
dispatch({
type: ReduxActionTypes.FORK_APPLICATION_INIT,
payload: {
applicationId: props.applicationId,
workspaceId: workspace?.value,
},
});
};
const workspaceList = useMemo(() => {
const filteredUserWorkspaces = userWorkspaces.filter((item) => {
const permitted = isPermitted(
item.workspace.userPermissions ?? [],
PERMISSION_TYPE.CREATE_APPLICATION,
);
return permitted;
});
if (filteredUserWorkspaces.length) {
selectWorkspace({
label: filteredUserWorkspaces[0].workspace.name,
value: filteredUserWorkspaces[0].workspace.id,
2022-03-10 14:39:05 +00:00
});
}
return filteredUserWorkspaces.map((workspace) => {
return {
label: workspace.workspace.name,
value: workspace.workspace.id,
};
});
}, [userWorkspaces]);
2022-03-10 14:39:05 +00:00
const modalHeading = isFetchingApplications
? createMessage(FORK_APP_MODAL_LOADING_TITLE)
: !workspaceList.length
2022-03-10 14:39:05 +00:00
? createMessage(FORK_APP_MODAL_EMPTY_TITLE)
: createMessage(FORK_APP_MODAL_SUCCESS_TITLE);
return (
<StyledDialog
canOutsideClickClose
className={"fork-modal"}
2022-03-31 05:16:04 +00:00
headerIcon={{ name: "fork-2", bgColor: Colors.GEYSER_LIGHT }}
isOpen={isModalOpen || showBasedOnURL}
setModalClose={setModalClose}
2022-03-10 14:39:05 +00:00
title={modalHeading}
trigger={props.trigger}
>
2022-03-10 14:39:05 +00:00
{isFetchingApplications ? (
<SpinnerWrapper>
<Spinner size={IconSize.XXXL} />
</SpinnerWrapper>
2022-03-10 14:39:05 +00:00
) : (
!!workspaceList.length && (
2022-03-10 14:39:05 +00:00
<>
<Dropdown
2022-03-31 05:16:04 +00:00
boundary="viewport"
2022-03-10 14:39:05 +00:00
dropdownMaxHeight={"200px"}
fillOptions
feat: Migrate design system components import to design-system repo - I (#15562) * Icon component deleted and changed the imports in refrence places * design system package version changed * import changes * Delete TextInput.tsx * Change imports * Change single named import * Update package * Update package * Delete ScrollIndicator.tsx * Change imports * Icon import completed * Event type added * Changed Button component imports * import change button * Button onclick type fix * Label with Tooltip import changes * Changed breadcrumbs import * EmojiPicker and Emoji Reaction import changes * AppIcon import change * import bug fix * Menu Item import chnages * Icon selector imports changed * Delete LabelWithTooltip.tsx * Change imports across the app * Update package version * Update version number for design-system * Delete Checkbox.tsx * Remove the exports * Add lock file for ds package update * Change imports * default import -> named * Update release version * Make arg type explicit * Updated design-system to latest release * Missing file mysteriously comes back and is updated accordingly * changes design-system package version * Add types to arguments in the onChange for text input * onBlur type fix * Search component in property pane * WDS button changes reverted * package version bumped * conflict fix * Remove Dropdown, change imports * Category import fix * fix: table icon size import * Bump version of design system package * Yarn lock Co-authored-by: Tanvi Bhakta <tanvibhakta@gmail.com>
2022-08-22 05:09:39 +00:00
onSelect={(
_: string,
dropdownOption: React.SetStateAction<{
label: string;
value: string;
}>,
) => selectWorkspace(dropdownOption)}
options={workspaceList}
selected={workspace}
2022-03-10 14:39:05 +00:00
showLabelOnly
width={"100%"}
/>
<ButtonWrapper>
<Button
category={Category.tertiary}
disabled={forkingApplication}
onClick={() => setModalClose && setModalClose(false)}
size={Size.large}
tag="button"
2022-03-10 14:39:05 +00:00
text={createMessage(CANCEL)}
/>
<Button
className="t--fork-app-to-workspace-button"
2022-03-10 14:39:05 +00:00
isLoading={forkingApplication}
onClick={forkApplication}
size={Size.large}
tag="button"
2022-03-10 14:39:05 +00:00
text={createMessage(FORK)}
/>
</ButtonWrapper>
</>
)
)}
</StyledDialog>
);
}
export default ForkApplicationModal;