FEAT => 本次更新项目为:

内容库处理完成
This commit is contained in:
2025-08-07 18:21:35 +08:00
parent 504e8ff9b6
commit bb06d3e4f8
9 changed files with 84 additions and 120 deletions

View File

@@ -0,0 +1,21 @@
// 内容库接口类型
export interface ContentItem {
id: number;
name: string;
[key: string]: any;
}
// 组件属性接口
export interface ContentSelectionProps {
selectedContent: ContentItem[];
onSelect: (selectedItems: ContentItem[]) => void;
placeholder?: string;
className?: string;
visible?: boolean;
onVisibleChange?: (visible: boolean) => void;
selectedListMaxHeight?: number;
showInput?: boolean;
showSelectedList?: boolean;
readonly?: boolean;
onConfirm?: (selectedItems: ContentItem[]) => void;
}

View File

@@ -7,17 +7,7 @@ import Layout from "@/components/Layout/Layout";
import PopupHeader from "@/components/PopuLayout/header";
import PopupFooter from "@/components/PopuLayout/footer";
import { getContentLibraryList } from "./api";
// 内容库接口类型
interface ContentLibraryItem {
id: string;
name: string;
description?: string;
sourceType?: number; // 1=文本 2=图片 3=视频
creatorName?: string;
updateTime?: string;
[key: string]: any;
}
import { ContentItem, ContentSelectionProps } from "./data";
// 类型标签文本
const getTypeText = (type?: number) => {
@@ -43,29 +33,9 @@ const formatDate = (dateStr?: string) => {
.padStart(2, "0")}`;
};
// 组件属性接口
interface ContentLibrarySelectionProps {
selectedLibraries: (string | number)[];
onSelect: (libraries: string[]) => void;
onSelectDetail?: (libraries: ContentLibraryItem[]) => void;
placeholder?: string;
className?: string;
visible?: boolean;
onVisibleChange?: (visible: boolean) => void;
selectedListMaxHeight?: number;
showInput?: boolean;
showSelectedList?: boolean;
readonly?: boolean;
onConfirm?: (
selectedIds: string[],
selectedItems: ContentLibraryItem[],
) => void;
}
export default function ContentLibrarySelection({
selectedLibraries,
export default function ContentSelection({
selectedContent,
onSelect,
onSelectDetail,
placeholder = "选择内容库",
className = "",
visible,
@@ -75,24 +45,19 @@ export default function ContentLibrarySelection({
showSelectedList = true,
readonly = false,
onConfirm,
}: ContentLibrarySelectionProps) {
}: ContentSelectionProps) {
const [popupVisible, setPopupVisible] = useState(false);
const [libraries, setLibraries] = useState<ContentLibraryItem[]>([]);
const [libraries, setLibraries] = useState<ContentItem[]>([]);
const [searchQuery, setSearchQuery] = useState("");
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);
const [totalLibraries, setTotalLibraries] = useState(0);
const [loading, setLoading] = useState(false);
// 获取已选内容库详细信息
const selectedLibraryObjs = libraries.filter(item =>
selectedLibraries.includes(item.id),
);
// 删除已选内容库
const handleRemoveLibrary = (id: string) => {
const handleRemoveLibrary = (id: number) => {
if (readonly) return;
onSelect(selectedLibraries.filter(g => g !== id));
onSelect(selectedContent.filter(c => c.id !== id));
};
// 受控弹窗逻辑
@@ -153,30 +118,24 @@ export default function ContentLibrarySelection({
};
// 处理内容库选择
const handleLibraryToggle = (libraryId: string) => {
const handleLibraryToggle = (library: ContentItem) => {
if (readonly) return;
const newSelected = selectedLibraries.includes(libraryId)
? selectedLibraries.filter(id => id !== libraryId)
: [...selectedLibraries, libraryId];
const newSelected = selectedContent.some(c => c.id === library.id)
? selectedContent.filter(c => c.id !== library.id)
: [...selectedContent, library];
onSelect(newSelected);
if (onSelectDetail) {
const selectedObjs = libraries.filter(item =>
newSelected.includes(item.id),
);
onSelectDetail(selectedObjs);
}
};
// 获取显示文本
const getDisplayText = () => {
if (selectedLibraries.length === 0) return "";
return `已选择 ${selectedLibraries.length} 个内容库`;
if (selectedContent.length === 0) return "";
return `已选择 ${selectedContent.length} 个内容库`;
};
// 确认选择
const handleConfirm = () => {
if (onConfirm) {
onConfirm(selectedLibraries, selectedLibraryObjs);
onConfirm(selectedContent);
}
setRealVisible(false);
};
@@ -202,7 +161,7 @@ export default function ContentLibrarySelection({
</div>
)}
{/* 已选内容库列表窗口 */}
{showSelectedList && selectedLibraryObjs.length > 0 && (
{showSelectedList && selectedContent.length > 0 && (
<div
className={style.selectedListWindow}
style={{
@@ -214,7 +173,7 @@ export default function ContentLibrarySelection({
background: "#fff",
}}
>
{selectedLibraryObjs.map(item => (
{selectedContent.map(item => (
<div
key={item.id}
className={style.selectedListRow}
@@ -284,7 +243,7 @@ export default function ContentLibrarySelection({
currentPage={currentPage}
totalPages={totalPages}
loading={loading}
selectedCount={selectedLibraries.length}
selectedCount={selectedContent.length}
onPageChange={setCurrentPage}
onCancel={() => setRealVisible(false)}
onConfirm={handleConfirm}
@@ -301,8 +260,8 @@ export default function ContentLibrarySelection({
{libraries.map(item => (
<label key={item.id} className={style.libraryItem}>
<Checkbox
checked={selectedLibraries.includes(item.id)}
onChange={() => !readonly && handleLibraryToggle(item.id)}
checked={selectedContent.map(c => c.id).includes(item.id)}
onChange={() => !readonly && handleLibraryToggle(item)}
disabled={readonly}
className={style.checkboxWrapper}
/>