PromucFlow_constructor/app/client/src/comments/CommentCard/CommentContextMenu.tsx
Pranav Kanade b778b83ac4
refactor: admin settings (#9906)
* refactor admin settings feature

* separated save-restart bar to separate component

* created new CE dir to facilitate code split

* created separate ee dir and exporting everything we have in ce file.

* little mod

* minor fix

* splitting settings types config

* using object literals for category types instead of enums

* CE: support use of component for each category

* minor style fix

* authentication page  UI changes implemented

* github signup doc url added back

* removed comments

* routing updates

* made subcategories listing in left pane optional

* added muted saml to auth listing

* added breadcrumbs and enabled button

* created separate component for auth page and auth config

* added callout and disconnect components

* updated breadcrumbs component

* minor updates to common components

* updated warning callout and added icon

* ce: test cases fixed

* updated test file name

* warning banner callout added on auth page

* updated callout banner for form login

* CE: Split config files

* CE: moved the window declaration in EE file as its dependency will be updated in EE

* CE: Splitting ApiConstants and SocialLogin constants

* CE: split login page

* CE: moved getSocialLoginButtonProps func to EE file as it's dependencies will be updated in EE

* added key icon

* CE: created a factory class to share social auths list

* Minor style fix for social btns

* Updated the third party auth styles

* Small fixes to styling

* ce: splitting forms constants

* breadcrumbs implemented for all pages in admin settings

* Settings breadcrumbs separated

* splitted settings breadcrumbs between ce and ee

* renamed default import

* minor style fix

* added login form config.

* updated login/signup pages to use form login disabled config

* removed common functionality outside

* implemented breadcrumb component from scratch without using blueprint

* removed unwanted code

* Small style update

* updated breadcrumb categories file name and breadcrumb icon

* added cypress tests for admin settings auth page

* added comments

* update locator for upgrade button

* added link for intercom on upgrade button

* removed unnecessary file

* minor style fix

* style fix for auth option cards

* split messages constant

* fixed imports for message constants splitting.

* added message constants

* updated unit test cases

* fixed messages import in cypress index

* fixed messages import again, cypress fails to read re-exported objs.

* added OIDC auth method on authentication page

* updated import statements from ee to @appsmith

* removed dead code

* updated read more link UI

* PR comments fixes

* some UI fixes

* used color and fonts from theme

* fixed some imports

* fixed some imports

* removed warning imports

* updated OIDC logo and auth method desc copies

* css changes

* css changes

* css changes

* updated cypress test for breadcrumb

* moved callout component to ads as calloutv2

* UI changes for form fields

* updated css for spacing between form fields

* added sub-text on auth pages

* added active class for breadcrumb item

* added config for disable signup toggle and fixed UI issues of restart banner

* fixed admin settings page bugs

* assigned true as default state for signup

* fixed messages import statements

* updated code for PR comments related suggestions

* reverted file path change in cypress support

* updated cypress test

* updated cypress test

Co-authored-by: Ankita Kinger <ankita@appsmith.com>
2022-02-11 23:38:46 +05:30

170 lines
4.0 KiB
TypeScript

import React, { useCallback, useMemo, useState } from "react";
import Icon, { IconSize, IconName } from "components/ads/Icon";
import styled from "styled-components";
import {
PIN_COMMENT,
COPY_LINK,
DELETE_COMMENT,
DELETE_THREAD,
UNPIN_COMMENT,
createMessage,
EDIT_COMMENT,
MORE_OPTIONS,
} from "@appsmith/constants/messages";
import { noop } from "lodash";
import "@blueprintjs/popover2/lib/css/blueprint-popover2.css";
import { Popover2 } from "@blueprintjs/popover2";
import Tooltip from "components/ads/Tooltip";
import { Colors } from "constants/Colors";
// render over popover portals
const Container = styled.div``;
const MenuItem = styled.div`
display: flex;
width: 180px;
cursor: pointer;
&:hover {
background-color: ${(props) =>
props.theme.colors.comments.contextMenuItemHover};
}
`;
const StyledIcon = styled(Icon)`
padding-left: ${(props) => props.theme.spaces[2]}px;
&:hover svg {
fill: ${Colors.CHARCOAL};
}
`;
const MenuIcon = styled.div`
padding: ${(props) =>
`${props.theme.spaces[4]}px ${props.theme.spaces[5]}px`};
svg {
fill: ${(props) => props.theme.colors.comments.unresolved};
}
`;
const MenuTitle = styled.div`
padding: ${(props) => props.theme.spaces[4]}px 0px;
color: ${(props) => props.theme.colors.comments.contextMenuTitle};
${MenuItem}:hover & {
color: ${(props) => props.theme.colors.comments.contextMenuTitleHover};
}
`;
type Props = {
pin: typeof noop;
copyCommentLink: typeof noop;
deleteComment: typeof noop;
deleteThread: typeof noop;
switchToEditCommentMode: typeof noop;
isParentComment?: boolean;
isCreatedByMe?: boolean;
isPinned?: boolean;
};
function CommentContextMenu({
copyCommentLink,
deleteComment,
deleteThread,
isCreatedByMe,
isParentComment,
isPinned,
pin,
switchToEditCommentMode,
}: Props) {
const [isOpen, setIsOpen] = useState(false);
const options = useMemo(() => {
const options = [];
if (isParentComment) {
options.push(
{
icon: isPinned ? "unpin" : "pin-3",
display: isPinned
? createMessage(UNPIN_COMMENT)
: createMessage(PIN_COMMENT),
onClick: pin,
},
{
icon: "link-2",
display: createMessage(COPY_LINK),
onClick: copyCommentLink,
},
);
}
if (isCreatedByMe) {
if (!isParentComment) {
options.push({
icon: "trash",
display: createMessage(DELETE_COMMENT),
onClick: deleteComment,
});
} else {
options.push({
icon: "trash",
display: createMessage(DELETE_THREAD),
onClick: deleteThread,
});
}
options.push({
icon: "edit",
display: createMessage(EDIT_COMMENT),
onClick: switchToEditCommentMode,
});
}
return options;
}, [isPinned]);
const handleInteraction = useCallback((isOpen) => {
setIsOpen(isOpen);
}, []);
const handleClick = useCallback((option) => {
setIsOpen(false);
option.onClick();
}, []);
if (!options.length) return null;
return (
<Popover2
content={
<Container>
{options.map((option) => (
<MenuItem key={option.icon} onClick={() => handleClick(option)}>
<MenuIcon>
<Icon
keepColors
name={option.icon as IconName}
size={IconSize.XXL}
/>
</MenuIcon>
<MenuTitle>{option.display}</MenuTitle>
</MenuItem>
))}
</Container>
}
isOpen={isOpen}
minimal
modifiers={{ offset: { enabled: true, options: { offset: [7, 15] } } }}
onInteraction={handleInteraction}
placement={"bottom-end"}
portalClassName="comment-context-menu"
>
<Tooltip content={createMessage(MORE_OPTIONS)} hoverOpenDelay={1000}>
<StyledIcon name="comment-context-menu" size={IconSize.XXL} />
</Tooltip>
</Popover2>
);
}
export default CommentContextMenu;