feat: rtf

This commit is contained in:
gosangam
2026-10-09 06:22:31 +05:30
parent 082815fc53
commit 3f3fa9a720
5 changed files with 342 additions and 12 deletions
+5 -4
View File
@@ -9,7 +9,8 @@ import { Table, THead, TR, TH, TD } from "@/components/ui/table";
import { Button } from "@/components/ui/button";
import { Modal } from "@/components/ui/modal";
import { useConfirm } from "@/components/confirm";
import { Textarea } from "@/components/ui/input";
import { RichTextarea } from "@/components/ui/rich-textarea";
import { RichText } from "@/lib/rich-text";
import { cn, fmtDate } from "@/lib/utils";
const STATUSES = ["all", "open", "resolved"] as const;
@@ -121,7 +122,7 @@ export default function FeedbackPage() {
{f.reply_message ? (
<div className="mt-2 rounded-md bg-muted px-3 py-2 text-xs">
<span className="font-medium">Your reply: </span>
{f.reply_message}
<RichText text={f.reply_message} />
</div>
) : null}
</TD>
@@ -235,9 +236,9 @@ function ReplyModal({
) : null}
<label className="block space-y-1.5">
<span className="text-sm font-medium">Your reply</span>
<Textarea
<RichTextarea
value={message}
onChange={(e) => setMessage(e.target.value)}
onValueChange={setMessage}
rows={5}
maxLength={4000}
placeholder="Write your reply… (emailed to the submitter; use Resolve separately to close it)"
+6 -5
View File
@@ -8,7 +8,8 @@ import { ListShell, EmptyRow } from "@/components/list-shell";
import { Table, THead, TR, TH, TD } from "@/components/ui/table";
import { Button } from "@/components/ui/button";
import { Modal } from "@/components/ui/modal";
import { Textarea } from "@/components/ui/input";
import { RichTextarea } from "@/components/ui/rich-textarea";
import { RichText } from "@/lib/rich-text";
import { useConfirm } from "@/components/confirm";
import { cn, fmtDate } from "@/lib/utils";
@@ -221,8 +222,8 @@ export default function ReportsPage() {
✓ Resolved
</span>
{r.resolution_note ? (
<p className="max-w-[220px] whitespace-pre-line text-right text-xs text-muted-foreground">
{r.resolution_note}
<p className="max-w-[220px] text-right text-xs text-muted-foreground">
<RichText text={r.resolution_note} />
</p>
) : null}
{r.target_removed ? undoButton(r) : null}
@@ -291,9 +292,9 @@ function ResolveModal({
<div className="space-y-4">
<label className="block space-y-1.5">
<span className="text-sm font-medium">Resolution note</span>
<Textarea
<RichTextarea
value={note}
onChange={(e) => setNote(e.target.value)}
onValueChange={setNote}
rows={4}
maxLength={2000}
placeholder="What did you do / decide? (shown in the reports table)"
+4 -3
View File
@@ -18,7 +18,8 @@ import { Modal } from "@/components/ui/modal";
import { RowMenu, type MenuItem } from "@/components/ui/menu";
import { Avatar } from "@/components/ui/avatar";
import { useConfirm } from "@/components/confirm";
import { Input, Textarea } from "@/components/ui/input";
import { Input } from "@/components/ui/input";
import { RichTextarea } from "@/components/ui/rich-textarea";
import { fmtDate } from "@/lib/utils";
import { DiscipleLinkModal } from "./disciple-link-modal";
@@ -404,9 +405,9 @@ function NotifyModal({
</label>
<label className="block space-y-1.5">
<span className="text-sm font-medium">Message</span>
<Textarea
<RichTextarea
value={body}
onChange={(e) => setBody(e.target.value)}
onValueChange={setBody}
rows={5}
maxLength={4000}
placeholder="Write your message…"