feat: rtf
This commit is contained in:
@@ -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)"
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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…"
|
||||
|
||||
Reference in New Issue
Block a user