2020-10-14 10:35:19 +00:00
|
|
|
import React, { createRef, useEffect, useState } from "react";
|
2019-11-21 10:52:49 +00:00
|
|
|
import styled from "styled-components";
|
2019-11-22 14:02:55 +00:00
|
|
|
import {
|
|
|
|
|
getApplicationViewerPageURL,
|
|
|
|
|
BUILDER_PAGE_URL,
|
|
|
|
|
} from "constants/routes";
|
2020-09-16 11:50:47 +00:00
|
|
|
import {
|
|
|
|
|
Card,
|
|
|
|
|
Classes,
|
|
|
|
|
HTMLDivProps,
|
|
|
|
|
ICardProps,
|
|
|
|
|
Position,
|
|
|
|
|
} from "@blueprintjs/core";
|
2019-11-21 10:52:49 +00:00
|
|
|
import { ApplicationPayload } from "constants/ReduxActionConstants";
|
2020-09-16 11:50:47 +00:00
|
|
|
import { getColorWithOpacity } from "constants/DefaultTheme";
|
2020-05-27 13:36:06 +00:00
|
|
|
import {
|
|
|
|
|
isPermitted,
|
|
|
|
|
PERMISSION_TYPE,
|
|
|
|
|
} from "pages/Applications/permissionHelpers";
|
2020-09-16 11:50:47 +00:00
|
|
|
import {
|
|
|
|
|
getInitialsAndColorCode,
|
|
|
|
|
getApplicationIcon,
|
|
|
|
|
} from "utils/AppsmithUtils";
|
2020-08-21 06:44:21 +00:00
|
|
|
import { omit } from "lodash";
|
2020-09-16 11:50:47 +00:00
|
|
|
import Text, { TextType } from "components/ads/Text";
|
|
|
|
|
import Button, { Category, Size } from "components/ads/Button";
|
|
|
|
|
import Icon, { IconSize } from "components/ads/Icon";
|
|
|
|
|
import Menu from "components/ads/Menu";
|
|
|
|
|
import MenuItem, { MenuItemProps } from "components/ads/MenuItem";
|
|
|
|
|
import AppIcon, { AppIconName } from "components/ads/AppIcon";
|
|
|
|
|
import EditableText, {
|
|
|
|
|
EditInteractionKind,
|
|
|
|
|
SavingState,
|
|
|
|
|
} from "components/ads/EditableText";
|
|
|
|
|
import ColorSelector from "components/ads/ColorSelector";
|
|
|
|
|
import MenuDivider from "components/ads/MenuDivider";
|
|
|
|
|
import IconSelector from "components/ads/IconSelector";
|
|
|
|
|
// import { appCardColors } from "constants/AppConstants";
|
|
|
|
|
import { getThemeDetails } from "selectors/themeSelectors";
|
|
|
|
|
import { useSelector } from "react-redux";
|
|
|
|
|
import { UpdateApplicationPayload } from "api/ApplicationApi";
|
2020-10-14 10:35:19 +00:00
|
|
|
import {
|
|
|
|
|
getIsFetchingApplications,
|
|
|
|
|
getIsSavingAppName,
|
|
|
|
|
} from "selectors/applicationSelectors";
|
2020-09-23 14:06:50 +00:00
|
|
|
import { Classes as CsClasses } from "components/ads/common";
|
2020-08-18 06:40:11 +00:00
|
|
|
|
2020-08-21 06:44:21 +00:00
|
|
|
type NameWrapperProps = {
|
2020-08-18 06:40:11 +00:00
|
|
|
hasReadPermission: boolean;
|
|
|
|
|
showOverlay: boolean;
|
2020-10-14 10:35:19 +00:00
|
|
|
isMenuOpen: boolean;
|
2020-08-21 06:44:21 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const NameWrapper = styled((props: HTMLDivProps & NameWrapperProps) => (
|
2020-10-14 10:35:19 +00:00
|
|
|
<div {...omit(props, ["hasReadPermission", "showOverlay", "isMenuOpen"])} />
|
2020-08-21 06:44:21 +00:00
|
|
|
))`
|
2020-09-16 11:50:47 +00:00
|
|
|
.bp3-card {
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
box-shadow: none;
|
|
|
|
|
}
|
2020-08-18 06:40:11 +00:00
|
|
|
${props =>
|
|
|
|
|
props.showOverlay &&
|
|
|
|
|
`
|
|
|
|
|
{
|
2020-09-23 14:06:50 +00:00
|
|
|
background-color: ${props.theme.colors.card.hoverBorder}};
|
2020-09-16 11:50:47 +00:00
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
2020-08-18 06:40:11 +00:00
|
|
|
|
|
|
|
|
.overlay {
|
|
|
|
|
${props.hasReadPermission &&
|
|
|
|
|
`text-decoration: none;
|
|
|
|
|
&:after {
|
|
|
|
|
left: 0;
|
|
|
|
|
top: 0;
|
|
|
|
|
content: "";
|
|
|
|
|
position: absolute;
|
|
|
|
|
height: 100%;
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
& .control {
|
|
|
|
|
display: block;
|
|
|
|
|
z-index: 1;
|
|
|
|
|
}`}
|
|
|
|
|
|
|
|
|
|
& div.image-container {
|
|
|
|
|
background: ${
|
2020-10-14 10:35:19 +00:00
|
|
|
props.hasReadPermission && !props.isMenuOpen
|
2020-08-18 06:40:11 +00:00
|
|
|
? getColorWithOpacity(
|
2020-09-16 11:50:47 +00:00
|
|
|
props.theme.colors.card.hoverBG,
|
|
|
|
|
props.theme.colors.card.hoverBGOpacity,
|
2020-08-18 06:40:11 +00:00
|
|
|
)
|
|
|
|
|
: null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`}
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
`;
|
|
|
|
|
|
2020-08-21 06:44:21 +00:00
|
|
|
const Wrapper = styled(
|
|
|
|
|
(
|
|
|
|
|
props: ICardProps & {
|
|
|
|
|
hasReadPermission?: boolean;
|
|
|
|
|
backgroundColor: string;
|
|
|
|
|
},
|
|
|
|
|
) => <Card {...omit(props, ["hasReadPermission", "backgroundColor"])} />,
|
|
|
|
|
)`
|
2019-11-21 10:52:49 +00:00
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
width: ${props => props.theme.card.minWidth}px;
|
|
|
|
|
height: ${props => props.theme.card.minHeight}px;
|
|
|
|
|
position: relative;
|
2020-08-18 06:40:11 +00:00
|
|
|
background-color: ${props => props.backgroundColor};
|
2020-10-14 10:35:19 +00:00
|
|
|
margin: ${props => props.theme.spaces[4]}px;
|
2020-08-18 06:40:11 +00:00
|
|
|
.overlay {
|
2020-01-20 08:07:00 +00:00
|
|
|
display: block;
|
|
|
|
|
position: absolute;
|
|
|
|
|
left: 0;
|
|
|
|
|
top: 0;
|
2020-08-18 06:40:11 +00:00
|
|
|
height: 100%;
|
2020-01-20 08:07:00 +00:00
|
|
|
width: 100%;
|
2020-05-14 10:47:13 +00:00
|
|
|
${props => !props.hasReadPermission && `pointer-events: none;`}
|
2020-01-20 08:07:00 +00:00
|
|
|
}
|
2020-09-16 11:50:47 +00:00
|
|
|
.bp3-card {
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
}
|
2020-09-23 14:06:50 +00:00
|
|
|
.${CsClasses.APP_ICON} {
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
svg {
|
|
|
|
|
path {
|
|
|
|
|
fill: #fff;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-11-21 10:52:49 +00:00
|
|
|
`;
|
2020-08-18 06:40:11 +00:00
|
|
|
|
2019-11-21 10:52:49 +00:00
|
|
|
const ApplicationImage = styled.div`
|
2020-01-28 08:21:22 +00:00
|
|
|
&& {
|
|
|
|
|
height: 100%;
|
|
|
|
|
width: 100%;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
|
|
|
|
& {
|
|
|
|
|
.control {
|
|
|
|
|
button {
|
|
|
|
|
span {
|
|
|
|
|
font-weight: ${props => props.theme.fontWeights[3]};
|
2020-08-18 06:40:11 +00:00
|
|
|
color: white;
|
2020-01-28 08:21:22 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-11-21 10:52:49 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`;
|
|
|
|
|
|
2020-05-05 12:16:51 +00:00
|
|
|
const Control = styled.div<{ fixed?: boolean }>`
|
2019-11-21 10:52:49 +00:00
|
|
|
outline: none;
|
|
|
|
|
border: none;
|
|
|
|
|
cursor: pointer;
|
2020-08-18 06:40:11 +00:00
|
|
|
|
|
|
|
|
.${Classes.BUTTON} {
|
|
|
|
|
margin-top: 7px;
|
|
|
|
|
|
|
|
|
|
div {
|
|
|
|
|
width: auto;
|
|
|
|
|
height: auto;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.${Classes.BUTTON_TEXT} {
|
|
|
|
|
font-size: 12px;
|
2020-08-21 15:25:49 +00:00
|
|
|
color: white;
|
2020-08-18 06:40:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.more {
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: ${props => props.theme.spaces[6]}px;
|
|
|
|
|
top: ${props => props.theme.spaces[4]}px;
|
|
|
|
|
}
|
2019-11-21 10:52:49 +00:00
|
|
|
`;
|
|
|
|
|
|
2020-10-14 10:35:19 +00:00
|
|
|
const MoreOptionsContainer = styled.div`
|
|
|
|
|
width: 22px;
|
|
|
|
|
height: 22px;
|
|
|
|
|
background-color: rgba(0, 0, 0, 0.1);
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const AppNameWrapper = styled.div<{ isFetching: boolean }>`
|
2020-09-16 11:50:47 +00:00
|
|
|
padding: 12px;
|
|
|
|
|
padding-top: 0;
|
2020-10-14 10:35:19 +00:00
|
|
|
${props =>
|
|
|
|
|
props.isFetching
|
|
|
|
|
? `
|
|
|
|
|
width: 119px;
|
|
|
|
|
height: 16px;
|
|
|
|
|
margin-left: 10px;
|
|
|
|
|
`
|
|
|
|
|
: null};
|
2020-08-18 06:40:11 +00:00
|
|
|
`;
|
2019-11-21 10:52:49 +00:00
|
|
|
type ApplicationCardProps = {
|
|
|
|
|
application: ApplicationPayload;
|
2020-01-27 08:24:58 +00:00
|
|
|
duplicate?: (applicationId: string) => void;
|
|
|
|
|
share?: (applicationId: string) => void;
|
2020-10-14 10:35:19 +00:00
|
|
|
delete?: (applicationId: string, orgId: string) => void;
|
2020-09-16 11:50:47 +00:00
|
|
|
update?: (id: string, data: UpdateApplicationPayload) => void;
|
2020-10-14 10:35:19 +00:00
|
|
|
orgId: string;
|
2019-11-21 10:52:49 +00:00
|
|
|
};
|
|
|
|
|
|
2020-09-16 11:50:47 +00:00
|
|
|
const EditButton = styled(Button)`
|
|
|
|
|
margin-bottom: 8px;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const ContextDropdownWrapper = styled.div`
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: -6px;
|
|
|
|
|
right: -3px;
|
|
|
|
|
|
2020-09-23 14:06:50 +00:00
|
|
|
.${Classes.POPOVER_TARGET} {
|
|
|
|
|
span {
|
|
|
|
|
svg {
|
|
|
|
|
path {
|
|
|
|
|
fill: ${props => props.theme.colors.card.iconColor};
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-09-16 11:50:47 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`;
|
|
|
|
|
|
2019-11-21 10:52:49 +00:00
|
|
|
export const ApplicationCard = (props: ApplicationCardProps) => {
|
2020-10-14 10:35:19 +00:00
|
|
|
const isFetchingApplications = useSelector(getIsFetchingApplications);
|
2020-09-16 11:50:47 +00:00
|
|
|
const themeDetails = useSelector(getThemeDetails);
|
2020-10-14 10:35:19 +00:00
|
|
|
const isSavingName = useSelector(getIsSavingAppName);
|
2020-09-16 11:50:47 +00:00
|
|
|
const initialsAndColorCode = getInitialsAndColorCode(
|
|
|
|
|
props.application.name,
|
|
|
|
|
themeDetails.theme.colors.appCardColors,
|
|
|
|
|
);
|
|
|
|
|
let initials = initialsAndColorCode[0];
|
|
|
|
|
const colorCode = props.application?.color || initialsAndColorCode[1];
|
2020-10-14 10:35:19 +00:00
|
|
|
|
|
|
|
|
const [showOverlay, setShowOverlay] = useState(false);
|
2020-09-16 11:50:47 +00:00
|
|
|
const [selectedColor, setSelectedColor] = useState<string>(colorCode);
|
2020-10-14 10:35:19 +00:00
|
|
|
const [moreActionItems, setMoreActionItems] = useState<MenuItemProps[]>([]);
|
|
|
|
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
|
|
|
const [lastUpdatedValue, setLastUpdatedValue] = useState("");
|
|
|
|
|
const menuIconRef = createRef<HTMLSpanElement>();
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setSelectedColor(colorCode);
|
|
|
|
|
}, [colorCode]);
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (props.share) {
|
|
|
|
|
moreActionItems.push({
|
|
|
|
|
onSelect: shareApp,
|
|
|
|
|
text: "Share",
|
|
|
|
|
icon: "share",
|
|
|
|
|
cypressSelector: "t--share",
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (props.duplicate && hasEditPermission) {
|
|
|
|
|
moreActionItems.push({
|
|
|
|
|
onSelect: duplicateApp,
|
|
|
|
|
text: "Duplicate",
|
|
|
|
|
icon: "duplicate",
|
|
|
|
|
cypressSelector: "t--duplicate",
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
setMoreActionItems(moreActionItems);
|
|
|
|
|
addDeleteOption();
|
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
|
}, []);
|
2020-08-18 06:40:11 +00:00
|
|
|
|
2020-10-14 10:35:19 +00:00
|
|
|
const appIcon = (props.application?.icon ||
|
|
|
|
|
getApplicationIcon(props.application.id)) as AppIconName;
|
2020-05-27 13:36:06 +00:00
|
|
|
const hasEditPermission = isPermitted(
|
|
|
|
|
props.application?.userPermissions ?? [],
|
|
|
|
|
PERMISSION_TYPE.MANAGE_APPLICATION,
|
2020-05-14 10:47:13 +00:00
|
|
|
);
|
2020-05-27 13:36:06 +00:00
|
|
|
const hasReadPermission = isPermitted(
|
|
|
|
|
props.application?.userPermissions ?? [],
|
|
|
|
|
PERMISSION_TYPE.READ_APPLICATION,
|
2020-05-14 10:47:13 +00:00
|
|
|
);
|
2020-09-16 11:50:47 +00:00
|
|
|
const updateColor = (color: string) => {
|
|
|
|
|
setSelectedColor(color);
|
|
|
|
|
props.update &&
|
|
|
|
|
props.update(props.application.id, {
|
|
|
|
|
color: color,
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const updateIcon = (icon: AppIconName) => {
|
|
|
|
|
props.update &&
|
|
|
|
|
props.update(props.application.id, {
|
|
|
|
|
icon: icon,
|
|
|
|
|
});
|
|
|
|
|
};
|
2019-11-21 10:52:49 +00:00
|
|
|
const duplicateApp = () => {
|
2020-01-27 08:24:58 +00:00
|
|
|
props.duplicate && props.duplicate(props.application.id);
|
2019-11-21 10:52:49 +00:00
|
|
|
};
|
|
|
|
|
const shareApp = () => {
|
2020-01-27 08:24:58 +00:00
|
|
|
props.share && props.share(props.application.id);
|
2019-11-21 10:52:49 +00:00
|
|
|
};
|
|
|
|
|
const deleteApp = () => {
|
2020-10-14 10:35:19 +00:00
|
|
|
setShowOverlay(false);
|
|
|
|
|
props.delete && props.delete(props.application.id, props.orgId);
|
2019-11-21 10:52:49 +00:00
|
|
|
};
|
2020-10-14 10:35:19 +00:00
|
|
|
const askForConfirmation = () => {
|
|
|
|
|
const updatedActionItems = [...moreActionItems];
|
|
|
|
|
updatedActionItems.pop();
|
|
|
|
|
updatedActionItems.push({
|
2019-11-21 10:52:49 +00:00
|
|
|
onSelect: deleteApp,
|
2020-10-14 10:35:19 +00:00
|
|
|
text: "Are you sure?",
|
2020-09-16 11:50:47 +00:00
|
|
|
icon: "delete",
|
2020-10-14 10:35:19 +00:00
|
|
|
type: "warning",
|
2020-09-16 11:50:47 +00:00
|
|
|
cypressSelector: "t--delete",
|
2020-01-27 08:24:58 +00:00
|
|
|
});
|
2020-10-14 10:35:19 +00:00
|
|
|
setMoreActionItems(updatedActionItems);
|
|
|
|
|
};
|
|
|
|
|
const addDeleteOption = () => {
|
|
|
|
|
if (props.delete && hasEditPermission) {
|
|
|
|
|
const index = moreActionItems.findIndex(el => el.icon === "delete");
|
|
|
|
|
if (index >= 0) {
|
|
|
|
|
moreActionItems.pop();
|
|
|
|
|
}
|
|
|
|
|
moreActionItems.push({
|
|
|
|
|
onSelect: askForConfirmation,
|
|
|
|
|
text: "Delete",
|
|
|
|
|
icon: "delete",
|
|
|
|
|
cypressSelector: "t--delete-confirm",
|
|
|
|
|
});
|
|
|
|
|
setMoreActionItems(moreActionItems);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if (initials.length < 2 && props.application.name.length > 1) {
|
|
|
|
|
initials += props.application.name[1].toUpperCase() || "";
|
2020-01-27 08:24:58 +00:00
|
|
|
}
|
2020-10-14 10:35:19 +00:00
|
|
|
const viewApplicationURL = getApplicationViewerPageURL(
|
|
|
|
|
props.application.id,
|
|
|
|
|
props.application.defaultPageId,
|
|
|
|
|
);
|
|
|
|
|
const editApplicationURL = BUILDER_PAGE_URL(
|
|
|
|
|
props.application.id,
|
|
|
|
|
props.application.defaultPageId,
|
|
|
|
|
);
|
2020-09-16 11:50:47 +00:00
|
|
|
|
|
|
|
|
const ContextMenu = (
|
|
|
|
|
<ContextDropdownWrapper>
|
|
|
|
|
<Menu
|
|
|
|
|
position={Position.RIGHT_TOP}
|
2020-10-14 10:35:19 +00:00
|
|
|
target={
|
|
|
|
|
<MoreOptionsContainer>
|
|
|
|
|
<Icon
|
|
|
|
|
name="context-menu"
|
|
|
|
|
ref={menuIconRef}
|
|
|
|
|
size={IconSize.XXXL}
|
|
|
|
|
></Icon>
|
|
|
|
|
</MoreOptionsContainer>
|
|
|
|
|
}
|
2020-09-16 11:50:47 +00:00
|
|
|
className="more"
|
|
|
|
|
onOpening={() => {
|
|
|
|
|
setIsMenuOpen(true);
|
|
|
|
|
}}
|
|
|
|
|
onClosing={() => {
|
|
|
|
|
setIsMenuOpen(false);
|
|
|
|
|
setShowOverlay(false);
|
2020-10-14 10:35:19 +00:00
|
|
|
addDeleteOption();
|
|
|
|
|
if (lastUpdatedValue && props.application.name !== lastUpdatedValue) {
|
|
|
|
|
props.update &&
|
|
|
|
|
props.update(props.application.id, {
|
|
|
|
|
name: lastUpdatedValue,
|
|
|
|
|
});
|
|
|
|
|
}
|
2020-09-16 11:50:47 +00:00
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{hasEditPermission && (
|
|
|
|
|
<EditableText
|
|
|
|
|
defaultValue={props.application.name}
|
|
|
|
|
editInteractionKind={EditInteractionKind.SINGLE}
|
2020-10-14 10:35:19 +00:00
|
|
|
onTextChanged={(value: string) => {
|
|
|
|
|
setLastUpdatedValue(value);
|
2020-09-16 11:50:47 +00:00
|
|
|
}}
|
|
|
|
|
valueTransform={(value: any) => value.toUpperCase()}
|
|
|
|
|
placeholder={"Edit text input"}
|
|
|
|
|
hideEditIcon={false}
|
|
|
|
|
isInvalid={(value: string) => {
|
|
|
|
|
if (!value) {
|
|
|
|
|
return "Name cannot be empty";
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}}
|
|
|
|
|
savingState={
|
|
|
|
|
isSavingName ? SavingState.STARTED : SavingState.NOT_STARTED
|
|
|
|
|
}
|
|
|
|
|
fill={true}
|
|
|
|
|
onBlur={(value: string) => {
|
|
|
|
|
props.update &&
|
|
|
|
|
props.update(props.application.id, {
|
|
|
|
|
name: value,
|
|
|
|
|
});
|
|
|
|
|
}}
|
2020-10-14 10:35:19 +00:00
|
|
|
className="t--application-name"
|
2020-09-16 11:50:47 +00:00
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{hasEditPermission && (
|
|
|
|
|
<>
|
|
|
|
|
<ColorSelector
|
2020-10-14 10:35:19 +00:00
|
|
|
defaultValue={selectedColor}
|
2020-09-16 11:50:47 +00:00
|
|
|
colorPalette={themeDetails.theme.colors.appCardColors}
|
|
|
|
|
fill={true}
|
|
|
|
|
onSelect={updateColor}
|
|
|
|
|
/>
|
|
|
|
|
<MenuDivider />
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
{hasEditPermission && (
|
|
|
|
|
<>
|
|
|
|
|
<IconSelector
|
|
|
|
|
fill={true}
|
|
|
|
|
selectedIcon={appIcon}
|
|
|
|
|
selectedColor={selectedColor}
|
|
|
|
|
onSelect={updateIcon}
|
|
|
|
|
/>
|
|
|
|
|
<MenuDivider />
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
{moreActionItems.map((item: MenuItemProps) => {
|
|
|
|
|
return <MenuItem key={item.text} {...item}></MenuItem>;
|
|
|
|
|
})}
|
|
|
|
|
</Menu>
|
|
|
|
|
</ContextDropdownWrapper>
|
|
|
|
|
);
|
2020-08-18 06:40:11 +00:00
|
|
|
|
2019-11-21 10:52:49 +00:00
|
|
|
return (
|
2020-08-18 06:40:11 +00:00
|
|
|
<NameWrapper
|
2020-10-14 10:35:19 +00:00
|
|
|
isMenuOpen={isMenuOpen}
|
2020-08-18 06:40:11 +00:00
|
|
|
showOverlay={showOverlay}
|
2020-10-14 10:35:19 +00:00
|
|
|
onMouseEnter={() => {
|
|
|
|
|
!isFetchingApplications && setShowOverlay(true);
|
|
|
|
|
}}
|
2020-09-16 11:50:47 +00:00
|
|
|
onMouseLeave={() => {
|
|
|
|
|
// If the menu is not open, then setOverlay false
|
|
|
|
|
// Set overlay false on outside click.
|
|
|
|
|
!isMenuOpen && setShowOverlay(false);
|
|
|
|
|
}}
|
2020-08-18 06:40:11 +00:00
|
|
|
hasReadPermission={hasReadPermission}
|
|
|
|
|
className="t--application-card"
|
|
|
|
|
>
|
2020-10-14 10:35:19 +00:00
|
|
|
<>
|
|
|
|
|
<Wrapper
|
2020-10-28 12:06:30 +00:00
|
|
|
className={
|
|
|
|
|
isFetchingApplications
|
|
|
|
|
? Classes.SKELETON
|
|
|
|
|
: "t--application-card-background"
|
|
|
|
|
}
|
2020-10-14 10:35:19 +00:00
|
|
|
key={props.application.id}
|
|
|
|
|
hasReadPermission={hasReadPermission}
|
|
|
|
|
backgroundColor={colorCode}
|
|
|
|
|
>
|
|
|
|
|
<AppIcon size={Size.large} name={appIcon} />
|
|
|
|
|
{/* <Initials>{initials}</Initials> */}
|
|
|
|
|
{showOverlay && (
|
|
|
|
|
<div className="overlay">
|
|
|
|
|
<ApplicationImage className="image-container">
|
|
|
|
|
<Control className="control">
|
|
|
|
|
{!!moreActionItems.length && ContextMenu}
|
2020-09-16 11:50:47 +00:00
|
|
|
|
2020-10-14 10:35:19 +00:00
|
|
|
{/* {!!moreActionItems.length && (
|
2020-08-18 06:40:11 +00:00
|
|
|
<ContextDropdown
|
|
|
|
|
options={moreActionItems}
|
|
|
|
|
toggle={{
|
|
|
|
|
type: "icon",
|
|
|
|
|
icon: "MORE_HORIZONTAL_CONTROL",
|
|
|
|
|
iconSize:
|
|
|
|
|
theme.fontSizes[APPLICATION_CONTROL_FONTSIZE_INDEX],
|
|
|
|
|
}}
|
|
|
|
|
className="more"
|
|
|
|
|
/>
|
2020-09-16 11:50:47 +00:00
|
|
|
)} */}
|
2020-08-18 06:40:11 +00:00
|
|
|
|
2020-10-14 10:35:19 +00:00
|
|
|
{hasEditPermission && !isMenuOpen && (
|
|
|
|
|
<EditButton
|
|
|
|
|
text="Edit"
|
|
|
|
|
size={Size.medium}
|
|
|
|
|
icon={"edit"}
|
|
|
|
|
className="t--application-edit-link"
|
|
|
|
|
fill
|
|
|
|
|
href={editApplicationURL}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{!isMenuOpen && (
|
|
|
|
|
<Button
|
|
|
|
|
text="LAUNCH"
|
|
|
|
|
size={Size.medium}
|
|
|
|
|
category={Category.tertiary}
|
|
|
|
|
className="t--application-view-link"
|
|
|
|
|
icon={"rocket"}
|
|
|
|
|
href={viewApplicationURL}
|
|
|
|
|
fill
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</Control>
|
|
|
|
|
</ApplicationImage>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</Wrapper>
|
|
|
|
|
<AppNameWrapper
|
|
|
|
|
isFetching={isFetchingApplications}
|
|
|
|
|
className={isFetchingApplications ? Classes.SKELETON : ""}
|
|
|
|
|
>
|
2020-10-28 12:06:30 +00:00
|
|
|
<Text type={TextType.H3} cypressSelector="t--app-card-name">
|
|
|
|
|
{props.application.name}
|
|
|
|
|
</Text>
|
2020-10-14 10:35:19 +00:00
|
|
|
</AppNameWrapper>
|
|
|
|
|
</>
|
2020-08-18 06:40:11 +00:00
|
|
|
</NameWrapper>
|
2019-11-21 10:52:49 +00:00
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default ApplicationCard;
|