From dbbdf1f2d77ae5049d6e68dc53184243d6481a68 Mon Sep 17 00:00:00 2001 From: peng Date: Thu, 23 Oct 2025 18:04:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E7=AE=A1=E7=90=86=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=89=8D=E7=AB=AF=201=E5=BC=80=E5=8F=91=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E5=AD=97=E5=85=B8=202.=E9=80=82=E9=85=8Dinput?= =?UTF-8?q?=E6=A1=86=E7=81=B0=E8=89=B2=E8=83=8C=E6=99=AF=203.=E9=80=82?= =?UTF-8?q?=E9=85=8Dtextarea=E7=81=B0=E8=89=B2=E8=83=8C=E6=99=AF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- crop-x/package.json | 1 - .../category/components/CategoryFilters.tsx | 50 +++ .../components/CategoryFormDialog.tsx | 137 ++++++++ .../components/CategoryInstructions.tsx | 23 ++ .../category/components/CategoryTree.tsx | 114 +++++++ .../central-config/system/category/page.tsx | 302 +++++++++++++++++- .../central-config/system/category/reducer.ts | 94 ++++++ .../central-config/system/category/types.ts | 53 +++ .../user/role/components/RoleFormDialog.tsx | 2 +- crop-x/src/components/ui/input.tsx | 2 +- crop-x/src/components/ui/textarea.tsx | 2 +- crop-x/src/styles/globals.css | 17 +- 13 files changed, 788 insertions(+), 12 deletions(-) create mode 100644 crop-x/src/app/(app)/central-config/system/category/components/CategoryFilters.tsx create mode 100644 crop-x/src/app/(app)/central-config/system/category/components/CategoryFormDialog.tsx create mode 100644 crop-x/src/app/(app)/central-config/system/category/components/CategoryInstructions.tsx create mode 100644 crop-x/src/app/(app)/central-config/system/category/components/CategoryTree.tsx create mode 100644 crop-x/src/app/(app)/central-config/system/category/reducer.ts create mode 100644 crop-x/src/app/(app)/central-config/system/category/types.ts diff --git a/.gitignore b/.gitignore index db2de28..a26fc80 100644 --- a/.gitignore +++ b/.gitignore @@ -145,4 +145,5 @@ Thumbs.db # Temporary folders tmp/ -temp/ \ No newline at end of file +temp/ +nul diff --git a/crop-x/package.json b/crop-x/package.json index b7bc4c5..f4ec67e 100644 --- a/crop-x/package.json +++ b/crop-x/package.json @@ -4,7 +4,6 @@ "private": true, "type": "module", "scripts": { - "dev": "vite", "next:dev": "next dev --turbopack", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", diff --git a/crop-x/src/app/(app)/central-config/system/category/components/CategoryFilters.tsx b/crop-x/src/app/(app)/central-config/system/category/components/CategoryFilters.tsx new file mode 100644 index 0000000..75d2f6b --- /dev/null +++ b/crop-x/src/app/(app)/central-config/system/category/components/CategoryFilters.tsx @@ -0,0 +1,50 @@ +'use client'; + +import React from 'react'; +import { Card } from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Search } from 'lucide-react'; + +interface CategoryFiltersProps { + searchKeyword: string; + typeFilter: string; + onSearchChange: (value: string) => void; + onTypeFilterChange: (value: string) => void; +} + +export function CategoryFilters({ + searchKeyword, + typeFilter, + onSearchChange, + onTypeFilterChange, +}: CategoryFiltersProps) { + return ( + +
+
+ + onSearchChange(e.target.value)} + className="pl-10" + /> +
+ +
+
+ ); +} \ No newline at end of file diff --git a/crop-x/src/app/(app)/central-config/system/category/components/CategoryFormDialog.tsx b/crop-x/src/app/(app)/central-config/system/category/components/CategoryFormDialog.tsx new file mode 100644 index 0000000..841a667 --- /dev/null +++ b/crop-x/src/app/(app)/central-config/system/category/components/CategoryFormDialog.tsx @@ -0,0 +1,137 @@ +'use client'; + +import React from 'react'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogFooter, +} from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Switch } from '@/components/ui/switch'; +import { CategoryDictionary, CategoryFormData } from '../types'; + +interface CategoryFormDialogProps { + open: boolean; + editing?: CategoryDictionary; + parent?: CategoryDictionary | null; + formData: CategoryFormData; + onOpenChange: (open: boolean) => void; + onFormDataChange: (data: Partial) => void; + onSave: () => void; +} + +export function CategoryFormDialog({ + open, + editing, + parent, + formData, + onOpenChange, + onFormDataChange, + onSave, +}: CategoryFormDialogProps) { + return ( + + + + + {editing ? '编辑分类' : '新增分类'} + + + {editing ? '编辑分类信息' : '添加新分类'} + + +
+ {parent && ( +
+ +

{parent.name}

+
+ )} +
+
+ + onFormDataChange({ code: e.target.value })} + placeholder="IND001" + /> +
+
+ + onFormDataChange({ name: e.target.value })} + placeholder="请输入名称" + /> +
+
+
+ + +
+
+ +