From 11e8ce708a152c331a602ea2fe29ebe2d637ad8e Mon Sep 17 00:00:00 2001 From: ditiqi Date: Tue, 25 Feb 2025 21:48:41 +0800 Subject: [PATCH] addd --- .../main/courses/components/FilterSection.tsx | 24 ++++++++++++----- .../main/courses/layout/AllCoursesLayout.tsx | 3 --- apps/web/src/app/main/courses/page.tsx | 18 ------------- apps/web/src/app/main/layout/MainProvider.tsx | 1 + .../components/models/term/term-select.tsx | 27 +++++++++++++++++-- 5 files changed, 44 insertions(+), 29 deletions(-) diff --git a/apps/web/src/app/main/courses/components/FilterSection.tsx b/apps/web/src/app/main/courses/components/FilterSection.tsx index e6f17eb..203e1d1 100755 --- a/apps/web/src/app/main/courses/components/FilterSection.tsx +++ b/apps/web/src/app/main/courses/components/FilterSection.tsx @@ -10,27 +10,39 @@ import { useMainContext } from "../../layout/MainProvider"; export default function FilterSection() { const { data: taxonomies } = api.taxonomy.getAll.useQuery({}); - const { setSelectedTerms } = useMainContext(); - const handleTermChange = (slug, selected) => { - setSelectedTerms((prev) => ({ - ...prev, + const { selectedTerms, setSelectedTerms } = useMainContext(); + const handleTermChange = (slug: string, selected: string[]) => { + setSelectedTerms({ + ...selectedTerms, [slug]: selected, // 更新对应 slug 的选择 - })); + }); }; return (
{taxonomies?.map((tax, index) => { + const items = Object.entries(selectedTerms).find( + ([key, items]) => key === tax.slug + )?.[1]; return (

{tax?.name}

( +
{menu}
+ )} + dropdownStyle={{ maxHeight: 400, overflow: "auto" }} multiple taxonomyId={tax?.id} onChange={(selected) => - handleTermChange(tax?.slug, selected) + handleTermChange( + tax?.slug, + selected as string[] + ) }>
{index < taxonomies.length - 1 && ( diff --git a/apps/web/src/app/main/courses/layout/AllCoursesLayout.tsx b/apps/web/src/app/main/courses/layout/AllCoursesLayout.tsx index 1acc666..5062731 100644 --- a/apps/web/src/app/main/courses/layout/AllCoursesLayout.tsx +++ b/apps/web/src/app/main/courses/layout/AllCoursesLayout.tsx @@ -1,8 +1,5 @@ -import { useMainContext } from "../../layout/MainProvider"; -import CourseList from "../../../../components/models/course/list/CourseList"; import FilterSection from "../components/FilterSection"; import CoursesContainer from "../components/CoursesContainer"; - export function AllCoursesLayout() { return ( <> diff --git a/apps/web/src/app/main/courses/page.tsx b/apps/web/src/app/main/courses/page.tsx index b389a4c..9c9225e 100755 --- a/apps/web/src/app/main/courses/page.tsx +++ b/apps/web/src/app/main/courses/page.tsx @@ -1,22 +1,4 @@ -import { useState, useMemo, useEffect } from "react"; -import FilterSection from "./components/FilterSection"; -import CourseList from "../../../components/models/course/list/CourseList"; -import { api } from "@nice/client"; -import { - courseDetailSelect, - CourseDto, - LectureType, - PostType, -} from "@nice/common"; -import { useSearchParams } from "react-router-dom"; -import { set } from "idb-keyval"; -import { useMainContext } from "../layout/MainProvider"; import AllCoursesLayout from "./layout/AllCoursesLayout"; - -interface paginationData { - items: CourseDto[]; - totalPages: number; -} export default function CoursesPage() { return ( <> diff --git a/apps/web/src/app/main/layout/MainProvider.tsx b/apps/web/src/app/main/layout/MainProvider.tsx index f75f62f..0952268 100644 --- a/apps/web/src/app/main/layout/MainProvider.tsx +++ b/apps/web/src/app/main/layout/MainProvider.tsx @@ -2,6 +2,7 @@ import React, { createContext, ReactNode, useContext, useState } from "react"; interface SelectedTerms { [key: string]: string[]; // 每个 slug 对应一个 string 数组 } + interface MainContextType { searchValue?: string; selectedTerms?: SelectedTerms; diff --git a/apps/web/src/components/models/term/term-select.tsx b/apps/web/src/components/models/term/term-select.tsx index 07b4741..c0fe5a0 100755 --- a/apps/web/src/components/models/term/term-select.tsx +++ b/apps/web/src/components/models/term/term-select.tsx @@ -1,5 +1,12 @@ import { TreeSelect, TreeSelectProps } from "antd"; -import React, { useEffect, useState, useCallback, useRef } from "react"; +import React, { + useEffect, + useState, + useCallback, + useRef, + ReactElement, + JSXElementConstructor, +} from "react"; import { getUniqueItems } from "@nice/common"; import { api } from "@nice/client"; import { DefaultOptionType } from "antd/es/select"; @@ -14,6 +21,13 @@ interface TermSelectProps { disabled?: boolean; className?: string; domainId?: string; + dropdownStyle?: React.CSSProperties; + style?: React.CSSProperties; + open?: boolean; + showSearch?: boolean; + dropdownRender?: ( + menu: ReactElement> + ) => ReactElement>; } export default function TermSelect({ @@ -24,8 +38,13 @@ export default function TermSelect({ placeholder = "选择分类", multiple = false, taxonomyId, + open = undefined, + showSearch = true, domainId, + dropdownStyle, + style, disabled = false, + dropdownRender, }: TermSelectProps) { const utils = api.useUtils(); const [listTreeData, setListTreeData] = useState< @@ -150,16 +169,20 @@ export default function TermSelect({