diff --git a/apps/server/src/models/base/base.service.ts b/apps/server/src/models/base/base.service.ts index 9367d37..c6e8ad7 100644 --- a/apps/server/src/models/base/base.service.ts +++ b/apps/server/src/models/base/base.service.ts @@ -9,6 +9,7 @@ import { UpdateOrderArgs, TransactionType, SelectArgs, + OrderByArgs, } from './base.type'; import { NotFoundException, @@ -451,12 +452,13 @@ export class BaseService< pageSize?: number; where?: WhereArgs; select?: SelectArgs; + orderBy?: OrderByArgs; }): Promise<{ items: R['findMany']; totalPages: number; totalCount: number; }> { - const { page = 1, pageSize = 10, where, select } = args; + const { page = 1, pageSize = 10, where, select, orderBy } = args; try { // 获取总记录数 @@ -466,6 +468,7 @@ export class BaseService< const items = (await this.getModel().findMany({ where, select, + orderBy, skip: (page - 1) * pageSize, take: pageSize, } as any)) as R['findMany']; diff --git a/apps/server/src/models/post/post.router.ts b/apps/server/src/models/post/post.router.ts index 0638e80..c536977 100755 --- a/apps/server/src/models/post/post.router.ts +++ b/apps/server/src/models/post/post.router.ts @@ -12,6 +12,7 @@ const PostDeleteManyArgsSchema: ZodType = z.any(); const PostWhereInputSchema: ZodType = z.any(); const PostSelectSchema: ZodType = z.any(); const PostUpdateInputSchema: ZodType = z.any(); +const PostOrderBySchema: ZodType = z.any() @Injectable() export class PostRouter { constructor( @@ -103,6 +104,7 @@ export class PostRouter { pageSize: z.number().optional(), where: PostWhereInputSchema.optional(), select: PostSelectSchema.optional(), + orderBy: PostOrderBySchema.optional() }), ) // Assuming StaffMethodSchema.findMany is the Zod schema for finding staffs by keyword .query(async ({ input, ctx }) => { diff --git a/apps/server/src/models/post/post.service.ts b/apps/server/src/models/post/post.service.ts index 10d786d..c599add 100755 --- a/apps/server/src/models/post/post.service.ts +++ b/apps/server/src/models/post/post.service.ts @@ -71,8 +71,11 @@ export class PostService extends BaseService { const transDto = await this.wrapResult( super.findFirst(args), async (result) => { - await setPostRelation({ data: result, staff, clientIp }); - await this.setPerms(result, staff); + if (result) { + await setPostRelation({ data: result, staff, clientIp }); + await this.setPerms(result, staff); + } + return result; }, ); @@ -98,13 +101,13 @@ export class PostService extends BaseService { }); } async findManyWithPagination( - args: { page?: number; pageSize?: number; where?: Prisma.PostWhereInput; select?: Prisma.PostSelect; }, + args: { page?: number; pageSize?: number; where?: Prisma.PostWhereInput; select?: Prisma.PostSelect; orderBy?: Prisma.PostOrderByWithRelationInput }, staff?: UserProfile, clientIp?: string, ) { if (!args.where) args.where = {}; args.where.OR = await this.preFilter(args.where.OR, staff); - return this.wrapResult(super.findManyWithPagination(args), async (result) => { + return this.wrapResult(super.findManyWithPagination(args as any), async (result) => { const { items } = result; await Promise.all( items.map(async (item) => { diff --git a/apps/web/src/app/main/letter/detail/page.tsx b/apps/web/src/app/main/letter/detail/page.tsx index 43209d0..6c9ee6e 100644 --- a/apps/web/src/app/main/letter/detail/page.tsx +++ b/apps/web/src/app/main/letter/detail/page.tsx @@ -4,5 +4,8 @@ import { useParams } from "react-router-dom"; export default function LetterDetailPage() { const { id } = useParams(); - return ; + return
+ + +
; } diff --git a/apps/web/src/app/main/letter/list/Header.tsx b/apps/web/src/app/main/letter/list/Header.tsx index c052de8..b0a9886 100644 --- a/apps/web/src/app/main/letter/list/Header.tsx +++ b/apps/web/src/app/main/letter/list/Header.tsx @@ -4,7 +4,7 @@ export function Header() {
{/* 主标题区域 */}
-

公开信件列表

+

公开信件

透明公开 • 及时反馈 • 有效解决

diff --git a/apps/web/src/app/main/letter/list/page.tsx b/apps/web/src/app/main/letter/list/page.tsx index 9af1f9f..0b83c01 100644 --- a/apps/web/src/app/main/letter/list/page.tsx +++ b/apps/web/src/app/main/letter/list/page.tsx @@ -5,7 +5,7 @@ export default function LetterListPage() { return ( // 添加 flex flex-col 使其成为弹性布局容器 -
+
{/* 添加 flex-grow 使内容区域自动填充剩余空间 */} diff --git a/apps/web/src/app/main/letter/progress/page.tsx b/apps/web/src/app/main/letter/progress/page.tsx index 274b5c9..3c11d64 100644 --- a/apps/web/src/app/main/letter/progress/page.tsx +++ b/apps/web/src/app/main/letter/progress/page.tsx @@ -1,18 +1,18 @@ import { useEffect, useState } from "react"; import { Input, Button, Card, Steps, Tag, Spin, message, Empty } from "antd"; -import { SearchOutlined, SafetyCertificateOutlined } from "@ant-design/icons"; +import { SearchOutlined, SafetyCertificateOutlined, SendOutlined, MailOutlined, SyncOutlined, CheckCircleOutlined } from "@ant-design/icons"; import ProgressHeader from "./ProgressHeader"; import { api } from "@nice/client"; import { LetterBadge } from "@web/src/components/models/post/LetterBadge"; import dayjs from "dayjs"; import { LetterCard } from "@web/src/components/models/post/LetterCard"; -import { postDetailSelect } from "@nice/common"; +import { postDetailSelect, PostState } from "@nice/common"; export default function LetterProgressPage() { const [letterId, setLetterId] = useState(); - const { data, isFetching, error } = api.post.findFirst.useQuery({ + const { data, isLoading, error } = api.post.findFirst.useQuery({ where: { id: letterId }, @@ -28,11 +28,12 @@ export default function LetterProgressPage() { return (
+ className=" shadow-elegant border-2 border-white rounded-xl bg-slate-200">
} @@ -43,91 +44,45 @@ export default function LetterProgressPage() { />
+ {isLoading &&
+ +
} + {!isLoading && letterId && !data && ( +
+ +
+ )} + {data && ( + <> + +
- {/* Results Section */} - - {data ? ( - <> -
- {/* Header */} -
-

- 信件处理进度追踪 -

- -
+ -
-

- 信件编号 -

-

- {data.id} -

-
-
-

- 提交日期 -

-

- {dayjs(data.createdAt).format('YYYY-MM-DD HH:mm:ss')} -

-
-
-

- 最后更新 -

-

- {dayjs(data.updatedAt).format('YYYY-MM-DD HH:mm:ss')} -

-
-
-

- 标题 -

-

- {data.title} -

-
-
- - {/* Progress Timeline */} -
- , - }, - { - title: '处理中', - description: '正在审核处理', - icon: , - }, - { - title: '已办结', - description: '信件处理完成', - icon: , - }, - ]} - /> -
-
- - ) : !isFetching && letterId && ( -
- - + items={[ + { + title: '已提交', + description: '信件已成功接收', + icon: + }, + { + title: '处理中', + description: '正在审核处理', + icon: + }, + { + title: '已办结', + description: '信件处理完成', + icon: + }, + ]} + />
- )} - + + )}
); diff --git a/apps/web/src/app/main/letter/write/SendCard.tsx b/apps/web/src/app/main/letter/write/SendCard.tsx index 02d8a83..521a14d 100644 --- a/apps/web/src/app/main/letter/write/SendCard.tsx +++ b/apps/web/src/app/main/letter/write/SendCard.tsx @@ -1,7 +1,7 @@ import { motion } from 'framer-motion'; import { StaffDto } from "@nice/common"; import { Button, Tooltip, Badge } from 'antd'; -import { BankFilled, SendOutlined } from '@ant-design/icons'; +import { BankFilled, SendOutlined, UserOutlined, MailOutlined, PhoneOutlined, HomeOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; export interface SendCardProps { @@ -10,19 +10,17 @@ export interface SendCardProps { } export function SendCard({ staff, termId }: SendCardProps) { - const navigate = useNavigate(); - const handleSendLetter = () => { window.open(`/editor?termId=${termId || ''}&receiverId=${staff.id}`, '_blank'); }; return (
{/* Image Container */} -
+
{staff.meta?.photoUrl ? ( ) : (
- - - + 暂未上传照片
)} @@ -57,15 +42,11 @@ export function SendCard({ staff, termId }: SendCardProps) {
-

+

{staff?.showname || staff?.username}

-

- - - {staff.department?.name || '未设置部门'}

@@ -76,39 +57,26 @@ export function SendCard({ staff, termId }: SendCardProps) { {/* Contact Information */}
-
- - - +
+ + {staff.department?.name || '未设置部门'} +
+
+ {staff.meta?.email || '未设置邮箱'}
-
- - - +
+ {staff.phoneNumber || '未设置电话'}
-
- - - +
+ {staff.meta?.office || '未设置办公室'}
-
diff --git a/apps/web/src/app/main/letter/write/page.tsx b/apps/web/src/app/main/letter/write/page.tsx index 3a0cf33..39b237d 100644 --- a/apps/web/src/app/main/letter/write/page.tsx +++ b/apps/web/src/app/main/letter/write/page.tsx @@ -47,27 +47,29 @@ export default function WriteLetterPage() { }, [searchQuery, selectedDept, resetPage]); return ( -
+
{/* Search and Filter Section */}
-
- } - placeholder="搜索领导姓名或职级..." - onChange={debounce((e) => setSearchQuery(e.target.value), 300)} - className="w-full" - size="large" - /> -
+ } + placeholder="搜索领导姓名或职级..." + onChange={debounce((e) => setSearchQuery(e.target.value), 300)} + + size="large" + /> +
{error && ( diff --git a/apps/web/src/components/layout/main/Footer.tsx b/apps/web/src/components/layout/main/Footer.tsx index 3031cec..df391fe 100644 --- a/apps/web/src/components/layout/main/Footer.tsx +++ b/apps/web/src/components/layout/main/Footer.tsx @@ -11,8 +11,8 @@ export function Footer() {

创新高地 软件小组

-

- 提供系统开发与技术支持 +

+ 提供技术支持

@@ -20,11 +20,11 @@ export function Footer() {
- 1-800-XXX-XXXX + 628118
- support@example.com + gcsjs6@tx3l.nb.kj
@@ -32,14 +32,14 @@ export function Footer() {
@@ -47,7 +47,7 @@ export function Footer() { diff --git a/apps/web/src/components/models/department/department-select.tsx b/apps/web/src/components/models/department/department-select.tsx index d692dbf..6cf2187 100644 --- a/apps/web/src/components/models/department/department-select.tsx +++ b/apps/web/src/components/models/department/department-select.tsx @@ -15,6 +15,7 @@ interface DepartmentSelectProps { disabled?: boolean; className?: string; size?: "small" | "middle" | "large"; + variant?: "outlined" | "borderless" | "filled" } export default function DepartmentSelect({ @@ -28,6 +29,7 @@ export default function DepartmentSelect({ size, disabled = false, domain = undefined, + variant }: DepartmentSelectProps) { const utils = api.useUtils(); const [listTreeData, setListTreeData] = useState< @@ -148,6 +150,7 @@ export default function DepartmentSelect({ return ( , - hover: "hover:from-orange-100 hover:to-orange-200", + bg: "bg-orange-50", + text: "text-orange-700", + border: "border border-orange-100", + + icon: , + }, suggestion: { - bg: "bg-gradient-to-r from-blue-50 to-blue-100", - text: "text-blue-800", - border: "border-blue-200", - icon: , - hover: "hover:from-blue-100 hover:to-blue-200", + bg: "bg-blue-50", + text: "text-blue-700", + border: "border border-blue-100", + + icon: , + }, request: { - bg: "bg-gradient-to-r from-purple-50 to-purple-100", - text: "text-purple-800", - border: "border-purple-200", - icon: , - hover: "hover:from-purple-100 hover:to-purple-200", + bg: "bg-purple-50", + text: "text-purple-700", + border: "border border-purple-100", + + icon: , + }, feedback: { - bg: "bg-gradient-to-r from-teal-50 to-teal-100", - text: "text-teal-800", - border: "border-teal-200", - icon: , - hover: "hover:from-teal-100 hover:to-teal-200", + bg: "bg-teal-50", + text: "text-teal-700", + border: "border border-teal-100", + + icon: , + }, }, state: { [PostState.PENDING]: { - bg: "bg-gradient-to-r from-yellow-50 to-yellow-100", - text: "text-yellow-800", - border: "border-yellow-200", - icon: , - hover: "hover:from-yellow-100 hover:to-yellow-200", + bg: "bg-yellow-50", + text: "text-yellow-700", + border: "border border-yellow-100", + + icon: , + }, [PostState.PROCESSING]: { - bg: "bg-gradient-to-r from-blue-50 to-blue-100", - text: "text-blue-800", - border: "border-blue-200", - icon: , - hover: "hover:from-blue-100 hover:to-blue-200", + bg: "bg-blue-50", + text: "text-blue-700", + border: "border border-blue-100", + + icon: , + }, [PostState.RESOLVED]: { - bg: "bg-gradient-to-r from-green-50 to-green-100", - text: "text-green-800", - border: "border-green-200", - icon: , - hover: "hover:from-green-100 hover:to-green-200", + bg: "bg-green-50", + text: "text-green-700", + border: "border border-green-100", + + icon: , + }, }, tag: { default: { - bg: "bg-gradient-to-r from-gray-50 to-gray-100", - text: "text-gray-800", - border: "border-gray-200", - icon: , - hover: "hover:from-gray-100 hover:to-gray-200", + bg: "bg-gray-50", + text: "text-gray-700", + border: "border border-gray-100", + + icon: , + } }, } as const; @@ -82,11 +90,9 @@ export const getBadgeStyle = ( const style = type === 'tag' ? BADGE_STYLES.tag.default : BADGE_STYLES[type][value as keyof (typeof BADGE_STYLES)[typeof type]] || { - bg: "bg-gradient-to-r from-gray-50 to-gray-100", - text: "text-gray-800", - border: "border-gray-200", - icon: , - hover: "hover:from-gray-100 hover:to-gray-200", + bg: "bg-gray-50", + text: "text-gray-700", + icon: , }; return style; @@ -108,12 +114,9 @@ export function LetterBadge({ return ( {style.icon} diff --git a/apps/web/src/components/models/post/LetterCard.tsx b/apps/web/src/components/models/post/LetterCard.tsx index de28fad..263d1ab 100644 --- a/apps/web/src/components/models/post/LetterCard.tsx +++ b/apps/web/src/components/models/post/LetterCard.tsx @@ -7,6 +7,7 @@ import { CalendarOutlined, FileTextOutlined, SendOutlined, + MailOutlined, } from "@ant-design/icons"; import { Button, Typography, Space, Tooltip } from "antd"; import { PostDto, PostStateLabels } from "@nice/common"; @@ -21,54 +22,42 @@ interface LetterCardProps { export function LetterCard({ letter }: LetterCardProps) { return ( -
{ - window.open(`/${letter.id}/detail`) - }} - className=" cursor-pointer w-full p-6 bg-white rounded-xl group relative overflow-hidden duration-300 hover:-translate-y-1 transition-all ease-in-out " +
{ + window.open(`/${letter.id}/detail`) + }} + className="cursor-pointer p-6 bg-slate-100/80 rounded-xl hover:ring-white hover:ring-1 transition-all + duration-300 ease-in-out hover:-translate-y-0.5 + active:scale-[0.98] border border-white + group relative overflow-hidden" >
-
- - <a - href={`/${letter.id}/detail`} - target="_blank" - - className="text-primary hover:text-primary-600 transition-colors duration-200 hover:underline"> - {letter.title} - </a> - +
+ {letter.title}
{/* Meta Info */} -
-
+
+
+ {letter.author?.department?.name && ( +
+ + + {letter.author?.department?.name} + +
+ )}
- - + + {letter.author?.showname || '匿名用户'}
- {letter.receivers.some(item => item.department?.name) && ( -
- - item.department?.name).filter(Boolean).join(', ')}> - - {letter.receivers - .map(item => item.department?.name) - .filter(Boolean) - .slice(0, 2) - .join('、')} - {letter.receivers.filter(item => item.department?.name).length > 2 && ' 等'} - - -
- )} - {letter.receivers.some(item => item.showname) && (
- + item.showname).filter(Boolean).join(', ')}> - + {letter.receivers .map(item => item.showname) .filter(Boolean) @@ -90,21 +79,21 @@ export function LetterCard({ letter }: LetterCardProps) { {/* Content Preview */} {letter.content && ( - - {letter.content} - +
+
+
)} -
- - {letter.meta.tags.map(tag => ( - - ))} -
+ {/* Badges & Interactions */}
+ + {letter.meta.tags.map(tag => ( + + ))} {letter.terms.map(term => ( ))} diff --git a/apps/web/src/components/models/post/detail/PostCommentCard.tsx b/apps/web/src/components/models/post/detail/PostCommentCard.tsx index 9b6af28..2996500 100644 --- a/apps/web/src/components/models/post/detail/PostCommentCard.tsx +++ b/apps/web/src/components/models/post/detail/PostCommentCard.tsx @@ -6,7 +6,7 @@ import { Avatar } from "antd"; import { useVisitor } from "@nice/client"; import { useContext, useEffect, useRef, useState } from "react"; import { PostDetailContext } from "./context/PostDetailContext"; -import { LikeFilled, LikeOutlined } from "@ant-design/icons"; +import { CheckCircleOutlined, LikeFilled, LikeOutlined } from "@ant-design/icons"; import PostLikeButton from "./PostHeader/PostLikeButton"; import { CustomAvatar } from "@web/src/components/presentation/CustomAvatar"; import PostResources from "./PostResources"; @@ -39,7 +39,7 @@ export default function PostCommentCard({
-
+
{post.author?.showname || "匿名用户"} diff --git a/apps/web/src/components/models/post/detail/PostCommentEditor.tsx b/apps/web/src/components/models/post/detail/PostCommentEditor.tsx index 8480f47..19935fc 100644 --- a/apps/web/src/components/models/post/detail/PostCommentEditor.tsx +++ b/apps/web/src/components/models/post/detail/PostCommentEditor.tsx @@ -52,19 +52,19 @@ export default function PostCommentEditor() { }; return ( -
+
-
+
@@ -101,6 +96,7 @@ export default function PostCommentEditor() { )}
- - {/* Stats Section */}
); diff --git a/apps/web/src/components/models/post/detail/PostHeader/Header.tsx b/apps/web/src/components/models/post/detail/PostHeader/Header.tsx index 295d839..b880ddc 100644 --- a/apps/web/src/components/models/post/detail/PostHeader/Header.tsx +++ b/apps/web/src/components/models/post/detail/PostHeader/Header.tsx @@ -12,16 +12,12 @@ import { UserOutlined, } from "@ant-design/icons"; import dayjs from "dayjs"; -import { CornerBadge } from "../badge/CornerBadeg"; import { LetterBadge } from "../../LetterBadge"; const { Title, Paragraph, Text } = Typography; export default function Header() { const { post, user } = useContext(PostDetailContext); return ( -
- {/* 右上角标签 */} - {/* */} - +
{/* 主标题 */}
@@ -39,15 +35,22 @@ export default function Header() { {/* 收件人信息行 */} - - 收件人: + + 发件人 + + {post?.author?.showname || "匿名用户"} + + + + + 收件人 {post?.receivers?.map((receiver, index) => ( - {receiver?.showname} + {receiver?.meta?.rank} {receiver?.showname || '匿名用户'} ))} @@ -56,16 +59,18 @@ export default function Header() { + 创建于 - 创建于: + {dayjs(post?.createdAt).format("YYYY-MM-DD")} {/* Last Updated Badge */} - + + 最后更新于 - 更新于: + {dayjs(post?.updatedAt).format("YYYY-MM-DD")} @@ -77,7 +82,7 @@ export default function Header() { )} - {post?.isPublic ? "公开" : "私信"} + {post?.isPublic ? "公开" : "保密"} @@ -87,7 +92,7 @@ export default function Header() {
{/* Second Row - Term and Tags */} {post?.meta?.tags?.length > 0 && ( -
+
{/* Tags Badges */} diff --git a/apps/web/src/components/models/post/detail/PostHeader/PostHeader.tsx b/apps/web/src/components/models/post/detail/PostHeader/PostHeader.tsx deleted file mode 100644 index da12fb9..0000000 --- a/apps/web/src/components/models/post/detail/PostHeader/PostHeader.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useContext } from "react"; -import { PostDetailContext } from "../context/PostDetailContext"; -import { motion } from "framer-motion"; - -import { StatsSection } from "./StatsSection"; - -import PostResources from "../PostResources"; -import Header from "./Header"; -import Content from "./Content"; - -export default function PostHeader() { - const { post, user } = useContext(PostDetailContext); - - return ( - <> -
- - - ); -} diff --git a/apps/web/src/components/models/post/detail/PostHeader/PostLikeButton.tsx b/apps/web/src/components/models/post/detail/PostHeader/PostLikeButton.tsx index e2113b0..a784d1f 100644 --- a/apps/web/src/components/models/post/detail/PostHeader/PostLikeButton.tsx +++ b/apps/web/src/components/models/post/detail/PostHeader/PostLikeButton.tsx @@ -31,19 +31,19 @@ export default function PostLikeButton({ post }: { post: PostDto }) { } } return ( - - - + + ); } diff --git a/apps/web/src/components/models/post/detail/PostHeader/StatsSection.tsx b/apps/web/src/components/models/post/detail/PostHeader/StatsSection.tsx index 553bab8..39a02e1 100644 --- a/apps/web/src/components/models/post/detail/PostHeader/StatsSection.tsx +++ b/apps/web/src/components/models/post/detail/PostHeader/StatsSection.tsx @@ -8,27 +8,27 @@ import { } from "@ant-design/icons"; import { Button, Tooltip } from "antd/lib"; import { PostDetailContext } from "../context/PostDetailContext"; -import { useVisitor } from "@nice/client"; -import { VisitType } from "packages/common/dist"; import PostLikeButton from "./PostLikeButton"; +import PostResources from "../PostResources"; export function StatsSection() { const { post } = useContext(PostDetailContext); return ( - +
+ {/* PostResources 组件 */} +
- - +
- - + +
); } diff --git a/apps/web/src/components/models/post/detail/layout/PostDetailLayout.tsx b/apps/web/src/components/models/post/detail/layout/PostDetailLayout.tsx index 676dd62..a64e4af 100644 --- a/apps/web/src/components/models/post/detail/layout/PostDetailLayout.tsx +++ b/apps/web/src/components/models/post/detail/layout/PostDetailLayout.tsx @@ -1,13 +1,11 @@ -import { motion } from "framer-motion"; import { useContext, useEffect } from "react"; import { PostDetailContext } from "../context/PostDetailContext"; -import PostHeader from "../PostHeader/PostHeader"; -import WriteHeader from "../PostHeader/Header"; import PostCommentEditor from "../PostCommentEditor"; import PostCommentList from "../PostCommentList"; import { useVisitor } from "@nice/client"; -import { useAuth } from "@web/src/providers/auth-provider"; import { VisitType } from "@nice/common"; +import Header from "../PostHeader/Header"; +import Content from "../PostHeader/Content"; export default function PostDetailLayout() { const { post, user } = useContext(PostDetailContext); @@ -15,7 +13,6 @@ export default function PostDetailLayout() { useEffect(() => { if (post) { - console.log("read"); read.mutateAsync({ data: { visitorId: user?.id || null, @@ -25,11 +22,10 @@ export default function PostDetailLayout() { }); } }, [post]); - return ( -
- - - -
- ); + return <> +
+ + + + } diff --git a/apps/web/src/components/models/post/list/LetterList.tsx b/apps/web/src/components/models/post/list/LetterList.tsx index 205e038..0e60ef6 100644 --- a/apps/web/src/components/models/post/list/LetterList.tsx +++ b/apps/web/src/components/models/post/list/LetterList.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useMemo } from 'react'; -import { Input, Pagination, Empty } from 'antd'; +import { Input, Pagination, Empty, Spin } from 'antd'; import { api, RouterInputs } from "@nice/client"; import { LetterCard } from "../LetterCard"; import { NonVoid } from "@nice/utils"; @@ -21,15 +21,15 @@ export default function LetterList({ params }: { params: NonVoid { - console.log(data) - }, [data]) - // Debounced search function + const debouncedSearch = useMemo( () => debounce((value: string) => { @@ -57,29 +57,27 @@ export default function LetterList({ params }: { params: NonVoid {/* Search Bar */} -
-
- handleSearch(e.target.value)} - prefix={} - /> -
+
+ handleSearch(e.target.value)} + prefix={} + />
{/* Content Area */} -
+
{isLoading ? ( -
- {[...Array(6)].map((_, index) => ( -
- ))} +
+
) : data?.items.length ? ( <> -
+
{data.items.map((letter: any) => ( ))} @@ -96,16 +94,14 @@ export default function LetterList({ params }: { params: NonVoid ) : ( -
+
- {searchText ? "未找到相关信件" : "暂无信件"} - + searchText ? "未找到相关信件" : "暂无信件" } - className="flex flex-col items-center" + />
)} diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 3033f2f..1e4581d 100755 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -13,6 +13,7 @@ border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; border: none; + @apply text-base } .ag-custom-dragging-class { diff --git a/packages/common/src/enum.ts b/packages/common/src/enum.ts index 40733e5..5a1b00b 100755 --- a/packages/common/src/enum.ts +++ b/packages/common/src/enum.ts @@ -198,5 +198,5 @@ export enum PostState { export const PostStateLabels = { [PostState.PENDING]: "待处理", [PostState.PROCESSING]: "处理中", - [PostState.RESOLVED]: "已解答", + [PostState.RESOLVED]: "已完成", };