diff --git a/packages/web/components/templates/article/HighlightsModal.tsx b/packages/web/components/templates/article/HighlightsModal.tsx index 8336472c4..c59e080da 100644 --- a/packages/web/components/templates/article/HighlightsModal.tsx +++ b/packages/web/components/templates/article/HighlightsModal.tsx @@ -22,6 +22,9 @@ import { StyledTextArea } from '../../elements/StyledTextArea' import { ConfirmationModal } from '../../patterns/ConfirmationModal' import { DotsThree } from 'phosphor-react' import { Dropdown, DropdownOption } from '../../elements/DropdownElements' +import { SetLabelsModal } from './SetLabelsModal' +import { Label } from '../../../lib/networking/fragments/labelFragment' +import { setLabelsForHighlight } from '../../../lib/networking/mutations/setLabelsForHighlight' type HighlightsModalProps = { highlights: Highlight[] @@ -33,6 +36,10 @@ type HighlightsModalProps = { export function HighlightsModal(props: HighlightsModalProps): JSX.Element { const [showConfirmDeleteHighlightId, setShowConfirmDeleteHighlightId] = useState(undefined) + const [labelsTarget, setLabelsTarget] = useState( + undefined + ) + const [, updateState] = useState({}) return ( @@ -53,6 +60,7 @@ export function HighlightsModal(props: HighlightsModalProps): JSX.Element { highlight={highlight} showDelete={!!props.deleteHighlightAction} scrollToHighlight={props.scrollToHighlight} + setSetLabelsTarget={setLabelsTarget} setShowConfirmDeleteHighlightId={ setShowConfirmDeleteHighlightId } @@ -73,7 +81,7 @@ export function HighlightsModal(props: HighlightsModalProps): JSX.Element { - {showConfirmDeleteHighlightId ? ( + {showConfirmDeleteHighlightId && ( { @@ -90,7 +98,25 @@ export function HighlightsModal(props: HighlightsModalProps): JSX.Element { /> } /> - ) : null} + )} + {labelsTarget && ( + { + const result = setLabelsForHighlight( + labelsTarget.id, + labels.map((label) => label.id) + ) + return result + }} + /> + )} ) } @@ -100,6 +126,8 @@ type ModalHighlightViewProps = { showDelete: boolean scrollToHighlight?: (arg: string) => void deleteHighlightAction: () => void + + setSetLabelsTarget: (highlight: Highlight) => void setShowConfirmDeleteHighlightId: (id: string | undefined) => void } @@ -125,7 +153,12 @@ function ModalHighlightView(props: ModalHighlightViewProps): JSX.Element { }} title="Copy" /> - {/* {}} title="Labels" /> */} + { + props.setSetLabelsTarget(props.highlight) + }} + title="Labels" + /> { props.setShowConfirmDeleteHighlightId(props.highlight.id) diff --git a/packages/web/components/templates/article/SetLabelsControl.tsx b/packages/web/components/templates/article/SetLabelsControl.tsx index cb364a65a..b4a23f0f7 100644 --- a/packages/web/components/templates/article/SetLabelsControl.tsx +++ b/packages/web/components/templates/article/SetLabelsControl.tsx @@ -19,7 +19,7 @@ export interface LabelsProvider { } type SetLabelsControlProps = { - provider?: LabelsProvider + provider: LabelsProvider onSave: (labels: Label[] | undefined) => void save: (labels: Label[]) => Promise } @@ -240,7 +240,7 @@ export function SetLabelsControl(props: SetLabelsControlProps): JSX.Element { const [filterText, setFilterText] = useState('') const { labels, revalidate } = useGetLabelsQuery() const [selectedLabels, setSelectedLabels] = useState( - props.provider?.labels || [] + props.provider.labels ?? [] ) useEffect(() => { @@ -269,9 +269,7 @@ export function SetLabelsControl(props: SetLabelsControlProps): JSX.Element { setSelectedLabels(newSelectedLabels) const result = await props.save(newSelectedLabels) - if (props.provider) { - props.provider.labels = result - } + props.provider.labels = result if (props.onSave) { props.onSave(result) } diff --git a/packages/web/components/templates/article/SetLabelsModal.tsx b/packages/web/components/templates/article/SetLabelsModal.tsx index cbd108eba..022136bf3 100644 --- a/packages/web/components/templates/article/SetLabelsModal.tsx +++ b/packages/web/components/templates/article/SetLabelsModal.tsx @@ -14,7 +14,7 @@ import { theme } from '../../tokens/stitches.config' import { LabelsProvider, SetLabelsControl } from './SetLabelsControl' type SetLabelsModalProps = { - provider?: LabelsProvider + provider: LabelsProvider onOpenChange: (open: boolean) => void onSave: (labels: Label[] | undefined) => void save: (labels: Label[]) => Promise diff --git a/packages/web/lib/networking/mutations/setLabelsMutation.ts b/packages/web/lib/networking/mutations/setLabelsMutation.ts index 6953bcc45..cf0bb654b 100644 --- a/packages/web/lib/networking/mutations/setLabelsMutation.ts +++ b/packages/web/lib/networking/mutations/setLabelsMutation.ts @@ -32,7 +32,9 @@ export async function setLabelsMutation( ` try { - const data = await gqlFetcher(mutation, { input: { pageId, labelIds } }) as SetLabelsResult + const data = (await gqlFetcher(mutation, { + input: { pageId, labelIds }, + })) as SetLabelsResult return data.errorCodes ? undefined : data.setLabels.labels } catch (error) { console.log('SetLabelsOutput error', error) diff --git a/packages/web/pages/[username]/[slug]/index.tsx b/packages/web/pages/[username]/[slug]/index.tsx index c4b5025dc..2bbf26d0f 100644 --- a/packages/web/pages/[username]/[slug]/index.tsx +++ b/packages/web/pages/[username]/[slug]/index.tsx @@ -367,7 +367,6 @@ export default function Home(): JSX.Element { {article && readerSettings.showSetLabelsModal && ( { actionHandler('refreshLabels', labels) }} diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index 37a9b08ad..79823d9e5 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -28,10 +28,8 @@ import { GenericTableCardProps, LabelColorHex, } from '../../utils/settings-page/labels/types' -import { labelColorObjects, } from '../../utils/settings-page/labels/labelColorObjects' -import { - TooltipWrapped -} from '../../components/elements/Tooltip' +import { labelColorObjects } from '../../utils/settings-page/labels/labelColorObjects' +import { TooltipWrapped } from '../../components/elements/Tooltip' import { LabelColorDropdown } from '../../components/elements/LabelColorDropdown' import { Dropdown, @@ -157,7 +155,9 @@ 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 [confirmRemoveLabelId, setConfirmRemoveLabelId] = useState< + string | null + >(null) const breakpoint = 768 applyStoredTheme(false) @@ -206,14 +206,13 @@ export default function LabelsPage(): JSX.Element { revalidate() } - const onEditPress = (label : Label | null) => { + const onEditPress = (label: Label | null) => { if (label) { setEditingLabelId(label.id) setNameInputText(label.name) setDescriptionInputText(label.description || '') setLabelColorHex({ rowId: '', value: label.color }) - } - else { + } else { resetLabelState() } } @@ -261,25 +260,23 @@ export default function LabelsPage(): JSX.Element { > {confirmRemoveLabelId ? ( { onDeleteLabel(confirmRemoveLabelId) - setConfirmRemoveLabelId(null)} - } + setConfirmRemoveLabelId(null) + }} onOpenChange={() => setConfirmRemoveLabelId(null)} /> ) : null} - - Labels{' '} - + Labels - + {isCreateMode ? null : ( <> @@ -363,46 +364,58 @@ export default function LabelsPage(): JSX.Element { {labels ? labels.map((label, i) => { - const isLastChild = i === labels.length - 1 - const isFirstChild = i === 0 - 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, - } - - if (editingLabelId == label.id) { - if (windowWidth >= breakpoint) { - return - } else { - return + const isLastChild = i === labels.length - 1 + const isFirstChild = i === 0 + 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 () - }) : null} + if (editingLabelId == label.id) { + if (windowWidth >= breakpoint) { + return + } else { + return + } + } + + return ( + + ) + }) + : null} ) } -function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean; isFirstChild?: boolean}) { +function GenericTableCard( + props: GenericTableCardProps & { + isLastChild?: boolean + isFirstChild?: boolean + } +) { const { label, isLastChild, @@ -423,10 +436,10 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean onEditPress, resetState, } = props - const showInput = - editingLabelId === label?.id || (isCreateMode && !label) - const labelColor = editingLabelId === label?.id ? labelColorHex.value : label?.color - const iconColor = isDarkTheme() ? '#D8D7D5': '#5F5E58' + const showInput = editingLabelId === label?.id || (isCreateMode && !label) + const labelColor = + editingLabelId === label?.id ? labelColorHex.value : label?.color + const iconColor = isDarkTheme() ? '#D8D7D5' : '#5F5E58' const handleEdit = () => { editingLabelId && updateLabel(editingLabelId) @@ -477,7 +490,12 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean > Delete @@ -490,15 +508,16 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean return ( + css={{ + '&:hover': { + background: 'rgba(255, 234, 159, 0.12)', + }, + borderTopLeftRadius: isFirstChild ? '5px' : '', + borderTopRightRadius: isFirstChild ? '5px' : '', + borderBottomLeftRadius: isLastChild ? '5px' : '', + borderBottomRightRadius: isLastChild ? '5px' : '', + }} + > - {(showInput && !label) ? null : ( - + {showInput && !label ? null : ( + )} - {(showInput && !label) ? ( - + {showInput && !label ? ( + setDescriptionInputText(event.target.value)} autoFocus={!!label} @@ -576,9 +600,14 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean css={{ color: '$grayTextContrast', fontSize: '14px', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', }} > - {editingLabelId === label?.id ? descriptionInputText : label?.description || ''} + {editingLabelId === label?.id + ? descriptionInputText + : label?.description || ''} )} @@ -603,31 +632,33 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean /> )} {showInput && ( - - - handleGenerateRandomColor(label?.id)} - disabled={!(isCreateMode && !label) && !(editingLabelId === label?.id)} - > - - - - + + + handleGenerateRandomColor(label?.id)} + disabled={ + !(isCreateMode && !label) && !(editingLabelId === label?.id) + } + > + + + + )} {!showInput && ( - + {moreActionsButton()} )} @@ -647,7 +678,7 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean {showInput && ( setDescriptionInputText(event.target.value)} autoFocus={!!label} @@ -662,57 +693,55 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean padding: '0px 8px', }} > - {editingLabelId === label?.id || !label ? ( - <> - - - - ) : ( - + + + + ) : ( + + onEditPress(label)} + disabled={isCreateMode} + > + + + deleteLabel(label.id)} + disabled={isCreateMode} + > + + + + )} @@ -745,12 +774,13 @@ function MobileEditCard(props: any) { return ( + css={{ + borderTopLeftRadius: isFirstChild ? '5px' : '', + borderTopRightRadius: isFirstChild ? '5px' : '', + borderBottomLeftRadius: isLastChild ? '5px' : '', + borderBottomRightRadius: isLastChild ? '5px' : '', + }} + > {nameInputText && ( @@ -773,7 +803,7 @@ function MobileEditCard(props: any) { setLabelColorHex={setLabelColorHex} />