diff --git a/packages/web/components/elements/LabelColorDropdown.tsx b/packages/web/components/elements/LabelColorDropdown.tsx index fdbd80434..6e105beed 100644 --- a/packages/web/components/elements/LabelColorDropdown.tsx +++ b/packages/web/components/elements/LabelColorDropdown.tsx @@ -75,7 +75,7 @@ const MainContainer = styled(Box, { width: '180px', borderRadius: '$3', px: '$3', - py: '$2', + py: '0px', cursor: 'pointer', '&:hover': { border: '1px solid $grayBorderHover', diff --git a/packages/web/lib/networking/mutations/deleteLabelMutation.ts b/packages/web/lib/networking/mutations/deleteLabelMutation.ts index cef0b4d53..988bac3f5 100644 --- a/packages/web/lib/networking/mutations/deleteLabelMutation.ts +++ b/packages/web/lib/networking/mutations/deleteLabelMutation.ts @@ -1,6 +1,16 @@ import { gql } from 'graphql-request' +import { Label } from '../fragments/labelFragment' import { gqlFetcher } from '../networkHelpers' +type DeleteLabelResult = { + deleteLabel: DeleteLabel + errorCodes?: unknown[] +} + +type DeleteLabel = { + label: Label +} + export async function deleteLabelMutation( labelId: string ): Promise { @@ -24,9 +34,8 @@ export async function deleteLabelMutation( ` try { - const data = await gqlFetcher(mutation) - console.log('deleted label', data) - return data + const data = await gqlFetcher(mutation) as DeleteLabelResult + return data.errorCodes ? undefined : data.deleteLabel.label.id } catch (error) { console.log('deleteLabelMutation error', error) return undefined diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index 446237535..d6a007f42 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -40,6 +40,7 @@ import { DropdownOption, } from '../../components/elements/DropdownElements' import { LabelChip } from '../../components/elements/LabelChip' +import { ConfirmationModal } from '../../components/patterns/ConfirmationModal' const HeaderWrapper = styled(Box, { width: '100%', @@ -52,9 +53,6 @@ const TableCard = styled(Box, { alignItems: 'center', border: '0.3px solid $grayBgActive', width: '100%', - '&:hover': { - border: '0.3px solid #FFD234', - }, '@md': { paddingLeft: '0', }, @@ -89,7 +87,7 @@ const TableCardBox = styled(Box, { const inputStyles = { backgroundColor: 'transparent', color: '$grayTextContrast', - padding: '13px 6px', + padding: '6px 6px', margin: '$2 0', border: '1px solid $grayBorder', borderRadius: '6px', @@ -160,6 +158,7 @@ export default function LabelsPage(): JSX.Element { const [descriptionInputText, setDescriptionInputText] = useState('') const [isCreateMode, setIsCreateMode] = useState(false) const [windowWidth, setWindowWidth] = useState(0) + const [confirmRemoveLabelId, setConfirmRemoveLabelId] = useState(null) const breakpoint = 768 applyStoredTheme(false) @@ -224,11 +223,20 @@ export default function LabelsPage(): JSX.Element { } } - async function deleteLabel(id: string): Promise { - await deleteLabelMutation(id) + async function onDeleteLabel(id: string): Promise { + const result = await deleteLabelMutation(id) + if (result) { + showSuccessToast('Label deleted', { position: 'bottom-right' }) + } else { + showErrorToast('Failed to delete label', { position: 'bottom-right' }) + } revalidate() } + async function deleteLabel(id: string): Promise { + setConfirmRemoveLabelId(id) + } + const handleGenerateRandomColor = (rowId?: string) => { const colorHexes = Object.keys(labelColorObjects).slice( 0, @@ -256,6 +264,16 @@ export default function LabelsPage(): JSX.Element { color: '$grayText', }} > + {confirmRemoveLabelId ? ( + { + onDeleteLabel(confirmRemoveLabelId) + setConfirmRemoveLabelId(null)} + } + onOpenChange={() => setConfirmRemoveLabelId(null)} + /> + ) : null} @@ -302,7 +320,7 @@ export default function LabelsPage(): JSX.Element { <> {isCreateMode ? ( windowWidth > breakpoint ? ( - { const isLastChild = i === labels.length - 1 const isFirstChild = i === 0 - - if (windowWidth <= breakpoint && editingLabelId == label.id) { - return ( - ) + const cardProps = { + label: label, + labelColorHex: labelColorHex, + editingLabelId: editingLabelId, + isCreateMode: isCreateMode, + isLastChild: isLastChild, + isFirstChild: isFirstChild, + handleGenerateRandomColor: handleGenerateRandomColor, + setEditingLabelId: setEditingLabelId, + setLabelColorHex: setLabelColorHex, + deleteLabel: deleteLabel, + nameInputText: nameInputText, + descriptionInputText: descriptionInputText, + setNameInputText: setNameInputText, + setDescriptionInputText: setDescriptionInputText, + setIsCreateMode: setIsCreateMode, + createLabel: createLabel, + resetState: resetLabelState, + updateLabel: updateLabel, } - return ( - - ) + if (editingLabelId == label.id) { + if (windowWidth >= breakpoint) { + return + } else { + return + } + } + + return () }) : null} @@ -445,7 +444,7 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean