addd
This commit is contained in:
parent
ba6801898d
commit
11e8ce708a
|
@ -10,27 +10,39 @@ import { useMainContext } from "../../layout/MainProvider";
|
||||||
|
|
||||||
export default function FilterSection() {
|
export default function FilterSection() {
|
||||||
const { data: taxonomies } = api.taxonomy.getAll.useQuery({});
|
const { data: taxonomies } = api.taxonomy.getAll.useQuery({});
|
||||||
const { setSelectedTerms } = useMainContext();
|
const { selectedTerms, setSelectedTerms } = useMainContext();
|
||||||
const handleTermChange = (slug, selected) => {
|
const handleTermChange = (slug: string, selected: string[]) => {
|
||||||
setSelectedTerms((prev) => ({
|
setSelectedTerms({
|
||||||
...prev,
|
...selectedTerms,
|
||||||
[slug]: selected, // 更新对应 slug 的选择
|
[slug]: selected, // 更新对应 slug 的选择
|
||||||
}));
|
});
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="bg-white p-6 rounded-lg shadow-sm space-y-6 h-full">
|
<div className="bg-white p-6 rounded-lg shadow-sm space-y-6 h-full">
|
||||||
{taxonomies?.map((tax, index) => {
|
{taxonomies?.map((tax, index) => {
|
||||||
|
const items = Object.entries(selectedTerms).find(
|
||||||
|
([key, items]) => key === tax.slug
|
||||||
|
)?.[1];
|
||||||
return (
|
return (
|
||||||
<div key={index}>
|
<div key={index}>
|
||||||
<h3 className="text-lg font-medium mb-4">
|
<h3 className="text-lg font-medium mb-4">
|
||||||
{tax?.name}
|
{tax?.name}
|
||||||
</h3>
|
</h3>
|
||||||
<TermSelect
|
<TermSelect
|
||||||
|
// open
|
||||||
className="w-72"
|
className="w-72"
|
||||||
|
value={items}
|
||||||
|
dropdownRender={(menu) => (
|
||||||
|
<div style={{ padding: "8px" }}>{menu}</div>
|
||||||
|
)}
|
||||||
|
dropdownStyle={{ maxHeight: 400, overflow: "auto" }}
|
||||||
multiple
|
multiple
|
||||||
taxonomyId={tax?.id}
|
taxonomyId={tax?.id}
|
||||||
onChange={(selected) =>
|
onChange={(selected) =>
|
||||||
handleTermChange(tax?.slug, selected)
|
handleTermChange(
|
||||||
|
tax?.slug,
|
||||||
|
selected as string[]
|
||||||
|
)
|
||||||
}></TermSelect>
|
}></TermSelect>
|
||||||
{index < taxonomies.length - 1 && (
|
{index < taxonomies.length - 1 && (
|
||||||
<Divider className="my-6" />
|
<Divider className="my-6" />
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
import { useMainContext } from "../../layout/MainProvider";
|
|
||||||
import CourseList from "../../../../components/models/course/list/CourseList";
|
|
||||||
import FilterSection from "../components/FilterSection";
|
import FilterSection from "../components/FilterSection";
|
||||||
import CoursesContainer from "../components/CoursesContainer";
|
import CoursesContainer from "../components/CoursesContainer";
|
||||||
|
|
||||||
export function AllCoursesLayout() {
|
export function AllCoursesLayout() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
|
@ -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";
|
import AllCoursesLayout from "./layout/AllCoursesLayout";
|
||||||
|
|
||||||
interface paginationData {
|
|
||||||
items: CourseDto[];
|
|
||||||
totalPages: number;
|
|
||||||
}
|
|
||||||
export default function CoursesPage() {
|
export default function CoursesPage() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
|
@ -2,6 +2,7 @@ import React, { createContext, ReactNode, useContext, useState } from "react";
|
||||||
interface SelectedTerms {
|
interface SelectedTerms {
|
||||||
[key: string]: string[]; // 每个 slug 对应一个 string 数组
|
[key: string]: string[]; // 每个 slug 对应一个 string 数组
|
||||||
}
|
}
|
||||||
|
|
||||||
interface MainContextType {
|
interface MainContextType {
|
||||||
searchValue?: string;
|
searchValue?: string;
|
||||||
selectedTerms?: SelectedTerms;
|
selectedTerms?: SelectedTerms;
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
import { TreeSelect, TreeSelectProps } from "antd";
|
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 { getUniqueItems } from "@nice/common";
|
||||||
import { api } from "@nice/client";
|
import { api } from "@nice/client";
|
||||||
import { DefaultOptionType } from "antd/es/select";
|
import { DefaultOptionType } from "antd/es/select";
|
||||||
|
@ -14,6 +21,13 @@ interface TermSelectProps {
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
className?: string;
|
className?: string;
|
||||||
domainId?: string;
|
domainId?: string;
|
||||||
|
dropdownStyle?: React.CSSProperties;
|
||||||
|
style?: React.CSSProperties;
|
||||||
|
open?: boolean;
|
||||||
|
showSearch?: boolean;
|
||||||
|
dropdownRender?: (
|
||||||
|
menu: ReactElement<any, string | JSXElementConstructor<any>>
|
||||||
|
) => ReactElement<any, string | JSXElementConstructor<any>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function TermSelect({
|
export default function TermSelect({
|
||||||
|
@ -24,8 +38,13 @@ export default function TermSelect({
|
||||||
placeholder = "选择分类",
|
placeholder = "选择分类",
|
||||||
multiple = false,
|
multiple = false,
|
||||||
taxonomyId,
|
taxonomyId,
|
||||||
|
open = undefined,
|
||||||
|
showSearch = true,
|
||||||
domainId,
|
domainId,
|
||||||
|
dropdownStyle,
|
||||||
|
style,
|
||||||
disabled = false,
|
disabled = false,
|
||||||
|
dropdownRender,
|
||||||
}: TermSelectProps) {
|
}: TermSelectProps) {
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
const [listTreeData, setListTreeData] = useState<
|
const [listTreeData, setListTreeData] = useState<
|
||||||
|
@ -150,16 +169,20 @@ export default function TermSelect({
|
||||||
<TreeSelect
|
<TreeSelect
|
||||||
treeDataSimpleMode
|
treeDataSimpleMode
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
showSearch
|
showSearch={showSearch}
|
||||||
allowClear
|
allowClear
|
||||||
|
style={style}
|
||||||
// ref={selectRef}
|
// ref={selectRef}
|
||||||
dropdownStyle={{
|
dropdownStyle={{
|
||||||
width: "300px", // 固定宽度
|
width: "300px", // 固定宽度
|
||||||
minWidth: "200px", // 最小宽度
|
minWidth: "200px", // 最小宽度
|
||||||
maxWidth: "600px", // 最大宽度
|
maxWidth: "600px", // 最大宽度
|
||||||
|
...dropdownStyle,
|
||||||
}}
|
}}
|
||||||
|
dropdownRender={dropdownRender}
|
||||||
defaultValue={defaultValue}
|
defaultValue={defaultValue}
|
||||||
value={value}
|
value={value}
|
||||||
|
open={open}
|
||||||
className={className}
|
className={className}
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
|
|
Loading…
Reference in New Issue