* 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>
170 lines
4.0 KiB
TypeScript
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;
|