From d07f2c90065f53d36a3fc0e7db54c32d54a2a332 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Thu, 25 Apr 2024 20:15:15 +0100 Subject: feature(web): Add ability to rename, merge and fast delete tags. Fixes #105 (#125) * feature(web): Allow deleting tags from the all tags page * feature(web): Add ability to rename, merge and fast delete tags. Fixes #105 --- apps/web/components/dashboard/EditableText.tsx | 146 +++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 apps/web/components/dashboard/EditableText.tsx (limited to 'apps/web/components/dashboard/EditableText.tsx') diff --git a/apps/web/components/dashboard/EditableText.tsx b/apps/web/components/dashboard/EditableText.tsx new file mode 100644 index 00000000..7539bd8f --- /dev/null +++ b/apps/web/components/dashboard/EditableText.tsx @@ -0,0 +1,146 @@ +import { useEffect, useRef, useState } from "react"; +import { ActionButtonWithTooltip } from "@/components/ui/action-button"; +import { ButtonWithTooltip } from "@/components/ui/button"; +import { + Tooltip, + TooltipContent, + TooltipPortal, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Check, Pencil, X } from "lucide-react"; + +interface Props { + viewClassName?: string; + untitledClassName?: string; + editClassName?: string; + onSave: (title: string | null) => void; + isSaving: boolean; + originalText: string | null; + setEditable: (editable: boolean) => void; +} + +function EditMode({ + onSave: onSaveCB, + editClassName: className, + isSaving, + originalText, + setEditable, +}: Props) { + const ref = useRef(null); + + useEffect(() => { + if (ref.current) { + ref.current.focus(); + ref.current.textContent = originalText; + } + }, [ref]); + + const onSave = () => { + let toSave: string | null = ref.current?.textContent ?? null; + if (originalText == toSave) { + // Nothing to do here + return; + } + if (toSave == "") { + toSave = null; + } + onSaveCB(toSave); + setEditable(false); + }; + + return ( +
+
{ + if (e.key === "Enter") { + e.preventDefault(); + } + }} + /> + onSave()} + > + + + { + setEditable(false); + }} + > + + +
+ ); +} + +function ViewMode({ + originalText, + setEditable, + viewClassName, + untitledClassName, +}: Props) { + return ( + +
+ + {originalText ? ( +

{originalText}

+ ) : ( +

Untitled

+ )} +
+ { + setEditable(true); + }} + > + + +
+ + {originalText && ( + + {originalText} + + )} + +
+ ); +} + +export function EditableText(props: { + viewClassName?: string; + untitledClassName?: string; + editClassName?: string; + originalText: string | null; + onSave: (title: string | null) => void; + isSaving: boolean; +}) { + const [editable, setEditable] = useState(false); + + return editable ? ( + + ) : ( + + ); +} -- cgit v1.2.3-70-g09d2