Skip to content

Commit

Permalink
feat: add rich text editor to survey description
Browse files Browse the repository at this point in the history
  • Loading branch information
zrll12 committed Sep 7, 2024
1 parent 8527978 commit 59f55bd
Show file tree
Hide file tree
Showing 6 changed files with 807 additions and 28 deletions.
6 changes: 2 additions & 4 deletions app/(root)/backstage/components/BadgeCard.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client';

import { Card, Image, Text, Badge, Button, Modal, ActionIcon, ScrollArea, Space, Group } from '@mantine/core';
import { Card, Image, Text, Badge, Button, Modal, ActionIcon, Space, Group } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks';
import { IconSettings2 } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
Expand Down Expand Up @@ -58,9 +58,7 @@ export default function BadgeCard({ survey, showBadge, routeAdmin }: BadgeCardPr

<Space h="md" />

<ScrollArea h={150}>
{survey.description}
</ScrollArea>
<iframe width="100%" style={{ border: 'none' }} title="111" srcDoc={survey.description} />

<Button
fullWidth
Expand Down
22 changes: 13 additions & 9 deletions app/(root)/backstage/components/SurveyBasicContentsEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
Card,
Center,
Group,
Image,
Image, Input,
ScrollArea,
Stack,
Switch,
Expand All @@ -17,6 +17,7 @@ import { useState } from 'react';
import { DateTimePicker } from '@mantine/dates';
import { notifications } from '@mantine/notifications';
import SurveyApi, { SurveyInfo } from '@/api/SurveyApi';
import ClickToEdit from '@/components/ClickToEdit';

// UTC -> CST (8 hours)
const ADDED_TIME_STAMP = 28800000;
Expand Down Expand Up @@ -108,14 +109,17 @@ export default function SurveyBasicContentsEditor({ survey }: SurveyEditorProps)
</Card.Section>

<Card.Section withBorder inheritPadding py="xs">
<Textarea
label="描述"
value={description}
placeholder="请输入描述"
onChange={(e) => setDescription(e.currentTarget.value)}
mt="mt"
autosize
/>
<Input.Wrapper label="描述">
<ClickToEdit content={description} onSave={setDescription} alwaysShowBar />
</Input.Wrapper>
{/*<Textarea*/}
{/* label="描述"*/}
{/* value={description}*/}
{/* placeholder="请输入描述"*/}
{/* onChange={(e) => setDescription(e.currentTarget.value)}*/}
{/* mt="mt"*/}
{/* autosize*/}
{/*/>*/}
</Card.Section>

<Card.Section withBorder inheritPadding py="xs">
Expand Down
3 changes: 2 additions & 1 deletion app/(root)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import '@mantine/core/styles.css';
import '@mantine/dates/styles.css';
import '@mantine/notifications/styles.css';
import '@mantine/tiptap/styles.css';
import React from 'react';
import { usePathname } from 'next/navigation';
import { AppShell, ColorSchemeScript, MantineProvider } from '@mantine/core';
import { Notifications } from '@mantine/notifications';
import { useDisclosure } from '@mantine/hooks';
import { theme } from '@/theme';
import '@mantine/notifications/styles.css';
import Header from '@/components/Header';
import Footer from '@/components/Footer';
import { NavbarList } from '@/components/NavbarList';
Expand Down
101 changes: 101 additions & 0 deletions components/ClickToEdit.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
'use client';

import { RichTextEditor, Link } from '@mantine/tiptap';
import { useEditor } from '@tiptap/react';
import Highlight from '@tiptap/extension-highlight';
import StarterKit from '@tiptap/starter-kit';
import Underline from '@tiptap/extension-underline';
import TextAlign from '@tiptap/extension-text-align';
import Superscript from '@tiptap/extension-superscript';
import SubScript from '@tiptap/extension-subscript';
import { useFocusWithin } from '@mantine/hooks';

export default function ClickToEdit(props: ClickToEditProps) {
const { ref, focused } = useFocusWithin({ onBlur: save });
const editor = useEditor({
extensions: [
StarterKit,
Underline,
Link,
Superscript,
SubScript,
Highlight,
TextAlign.configure({ types: ['heading', 'paragraph'] }),
],
content: props.content,
});

function save() {
if (editor == null) {
return;
}
props.onSave(editor.getHTML());
}

function shouldShowBar() {
return props.alwaysShowBar || focused;
}

return (
<>
<RichTextEditor editor={editor} w={props.w} ref={ref}>
{shouldShowBar() &&
<RichTextEditor.Toolbar sticky stickyOffset={60}>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Bold />
<RichTextEditor.Italic />
<RichTextEditor.Underline />
<RichTextEditor.Strikethrough />
<RichTextEditor.ClearFormatting />
<RichTextEditor.Highlight />
<RichTextEditor.Code />
</RichTextEditor.ControlsGroup>

<RichTextEditor.ControlsGroup>
<RichTextEditor.H1 />
<RichTextEditor.H2 />
<RichTextEditor.H3 />
<RichTextEditor.H4 />
</RichTextEditor.ControlsGroup>

<RichTextEditor.ControlsGroup>
<RichTextEditor.Blockquote />
<RichTextEditor.Hr />
<RichTextEditor.BulletList />
<RichTextEditor.OrderedList />
<RichTextEditor.Subscript />
<RichTextEditor.Superscript />
</RichTextEditor.ControlsGroup>

{
props.alwaysShowBar &&
<RichTextEditor.ControlsGroup>
<RichTextEditor.Link />
<RichTextEditor.Unlink />
</RichTextEditor.ControlsGroup>
}

<RichTextEditor.ControlsGroup>
<RichTextEditor.AlignLeft />
<RichTextEditor.AlignCenter />
<RichTextEditor.AlignJustify />
<RichTextEditor.AlignRight />
</RichTextEditor.ControlsGroup>

<RichTextEditor.ControlsGroup>
<RichTextEditor.Undo />
<RichTextEditor.Redo />
</RichTextEditor.ControlsGroup>
</RichTextEditor.Toolbar>}
<RichTextEditor.Content />
</RichTextEditor>
</>
);
}

export interface ClickToEditProps {
content: string;
onSave: (content: string) => void;
w?: number;
alwaysShowBar?: boolean;
}
14 changes: 12 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,25 @@
"dependencies": {
"@floating-ui/utils": "^0.2.7",
"@mantine/core": "^7.12.2",
"@mantine/dates": "^7.12.1",
"@mantine/hooks": "7.12.1",
"@mantine/dates": "^7.12.2",
"@mantine/hooks": "^7.12.2",
"@mantine/notifications": "^7.12.1",
"@mantine/tiptap": "^7.12.2",
"@mdx-js/loader": "^3.0.1",
"@mdx-js/react": "^3.0.1",
"@next/bundle-analyzer": "^14.2.4",
"@next/mdx": "^14.2.5",
"@tabler/icons": "^3.12.0",
"@tabler/icons-react": "^3.6.0",
"@testing-library/jest-dom": "^6.4.8",
"@tiptap/extension-link": "^2.6.6",
"@tiptap/extension-subscript": "^2.6.6",
"@tiptap/extension-superscript": "^2.6.6",
"@tiptap/extension-text-align": "^2.6.6",
"@tiptap/extension-underline": "^2.6.6",
"@tiptap/pm": "^2.6.6",
"@tiptap/react": "^2.6.6",
"@tiptap/starter-kit": "^2.6.6",
"@types/mdx": "^2.0.13",
"dayjs": "^1.11.13",
"less": "^4.2.0",
Expand All @@ -44,6 +53,7 @@
"devDependencies": {
"@babel/core": "^7.24.7",
"@next/eslint-plugin-next": "^14.2.4",
"@tiptap/extension-highlight": "^2.6.6",
"@types/jest": "^29.5.12",
"@types/micromatch": "^4",
"@types/node": "^20.14.8",
Expand Down
Loading

0 comments on commit 59f55bd

Please sign in to comment.