diff --git a/src/constants/typeEnum.js b/src/constants/typeEnum.js new file mode 100644 index 0000000..47fcd61 --- /dev/null +++ b/src/constants/typeEnum.js @@ -0,0 +1,17 @@ +export const TEMPLATE_TYPES = [ + { + value: 'quotation', + label: '报价单模板', + }, + { + value: 'project', + label: '专案模板', + }, + { + value: 'task', + label: '任务模板', + },{ + value: 'common', + label: '通用', + } + ]; \ No newline at end of file diff --git a/src/pages/company/service/classify/index.jsx b/src/pages/company/service/classify/index.jsx deleted file mode 100644 index 4d60b08..0000000 --- a/src/pages/company/service/classify/index.jsx +++ /dev/null @@ -1,336 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { Table, Button, Form, Input, Space, message, Popconfirm, Drawer, Select, Tabs, Badge, Radio } from 'antd'; -import { PlusOutlined, FileTextOutlined, ProjectOutlined, CheckSquareOutlined } from '@ant-design/icons'; -import { supabaseService } from '@/hooks/supabaseService'; - -const CategoryDrawer = () => { - const [data, setData] = useState([]); - const [loading, setLoading] = useState(false); - const [editingKey, setEditingKey] = useState(''); - const [drawerVisible, setDrawerVisible] = useState(false); - const [activeType, setActiveType] = useState('quotation'); // 当前选中的类型 - const [form] = Form.useForm(); - - // 模板类型配置 - const TEMPLATE_TYPES = [ - { - value: 'quotation', - label: '报价单模板', - icon: , - color: 'blue', - description: '用于创建标准化的报价单' - }, - { - value: 'project', - label: '专案模板', - icon: , - color: 'green', - description: '用于创建项目流程模板' - }, - { - value: 'task', - label: '任务模板', - icon: , - color: 'purple', - description: '用于创建标准任务模板' - } - ]; - - // 获取分类数据 - const fetchCategories = async (type = activeType) => { - setLoading(true); - try { - const { data: categories } = await supabaseService.select('resources', { - filter: { - type: { eq: 'categories' }, - 'attributes->>type': { eq: type } - }, - order: { - column: 'created_at', - ascending: false - } - }); - - setData(categories || []); - } catch (error) { - message.error('获取分类数据失败'); - console.error(error); - } finally { - setLoading(false); - } - }; - - useEffect(() => { - if (drawerVisible) { - fetchCategories(); - } - }, [drawerVisible, activeType]); - - // 切换模板类型 - const handleTypeChange = (type) => { - setActiveType(type); - setEditingKey(''); // 清除编辑状态 - form.resetFields(); // 重置表单 - }; - - // 新增分类 - const handleAdd = (type) => { - const newData = { - id: Date.now().toString(), - attributes: { - name: '', - type: type // 默认类型 - }, - isNew: true - }; - setData([newData, ...data]); - setEditingKey(newData.id); - form.setFieldsValue(newData.attributes); - }; - - // 保存分类数据 - const handleSave = async (record) => { - try { - const values = await form.validateFields(); - if (record.isNew) { - await supabaseService.insert('resources', { - type: 'categories', - attributes: { - name: values.name, - type: values.type - }, - schema_version: 1 - }); - } else { - // 更新 - await supabaseService.update('resources', - { id: record.id }, - { - attributes: { - name: values.name, - type: values.type - }, - updated_at: new Date().toISOString() - } - ); - } - - message.success('保存成功'); - setEditingKey(''); - fetchCategories(); - } catch (error) { - message.error('保存失败'); - console.error(error); - } - }; - - // 删除分类 - const handleDelete = async (record) => { - try { - await supabaseService.delete('resources', { id: record.id }); - message.success('删除成功'); - fetchCategories(); - } catch (error) { - message.error('删除失败'); - console.error(error); - } - }; - - const columns = [ - { - title: '分类名称', - dataIndex: ['attributes', 'name'], - render: (text, record) => { - const isEditing = record.id === editingKey; - return isEditing ? ( - - - - ) : ( - {text} - ); - }, - }, - { - title: '模板类型', - dataIndex: ['attributes', 'type'], - render: (text, record) => { - const isEditing = record.id === editingKey; - return isEditing ? ( - - + + ) : ( + {text} + ); + }, + }, + { + title: '模板类型', + dataIndex: ['attributes', 'template_type'], + render: (text, record) => { + const isEditing = record.id === editingKey; + return isEditing ? ( + + + + ) : ( + {text} + ); + }, + }, + { + title: '模板类型', + dataIndex: ['attributes', 'template_type'], + render: (text, record) => { + const isEditing = record.id === editingKey; + return isEditing ? ( + + - - - - {(fields, { add, remove }) => ( - <> - {fields.map(({ key, name, ...restField }) => ( - - - - - - - - - - - - - - - - - remove(name)} /> - - ))} - - - - - )} - - - - - ); -}; - -export default ServiceType; \ No newline at end of file diff --git a/src/pages/company/service/unit/index.jsx b/src/pages/company/service/unit/index.jsx deleted file mode 100644 index 9c287d4..0000000 --- a/src/pages/company/service/unit/index.jsx +++ /dev/null @@ -1,261 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { Table, Button, Drawer, Form, Input, Space, message, Popconfirm } from 'antd'; -import { PlusOutlined, DeleteOutlined, SaveOutlined, CloseOutlined } from '@ant-design/icons'; -import { supabase } from '@/config/supabase'; - -const UnitManagement = () => { - const [data, setData] = useState([]); - const [loading, setLoading] = useState(false); - const [drawerVisible, setDrawerVisible] = useState(false); - const [editingKey, setEditingKey] = useState(''); - const [form] = Form.useForm(); - - // 获取单位数据 - const fetchUnits = async () => { - setLoading(true); - try { - const { data: units, error } = await supabase - .from('resources') - .select('*') - .eq('type', 'units') - .order('created_at', { ascending: false }); - - if (error) throw error; - setData(units || []); - } catch (error) { - message.error('获取单位数据失败'); - console.error(error); - } finally { - setLoading(false); - } - }; - - useEffect(() => { - if (drawerVisible) { - fetchUnits(); - } - }, [drawerVisible]); - - // 新增���位 - const handleAdd = () => { - const newData = { - id: Date.now().toString(), - attributes: { name: '' }, - isNew: true - }; - setData([newData, ...data]); - setEditingKey(newData.id); - form.setFieldsValue(newData.attributes); - }; - - // 保存单位数据 - const handleSave = async (record) => { - try { - const values = await form.validateFields(); - if (record.isNew) { - // 新增 - const { error } = await supabase - .from('resources') - .insert([{ - type: 'units', - attributes: { - name: values.name - }, - schema_version: 1 - }]); - - if (error) throw error; - } else { - // 更新 - const { error } = await supabase - .from('resources') - .update({ - attributes: { - name: values.name - }, - updated_at: new Date().toISOString() - }) - .eq('id', record.id); - - if (error) throw error; - } - - message.success('保存成功'); - setEditingKey(''); - fetchUnits(); - } catch (error) { - message.error('保存失败'); - console.error(error); - } - }; - - // 删除单位 - const handleDelete = async (id) => { - try { - const { error } = await supabase - .from('resources') - .delete() - .eq('id', id); - - if (error) throw error; - message.success('删除成功'); - fetchUnits(); - } catch (error) { - message.error('删除失败'); - console.error(error); - } - }; - - // 修改取消编辑的处理方法 - const handleCancel = (record) => { - setEditingKey(''); - if (record.isNew) { - // 如果是新增的记录,直接从数据中移除 - setData(data.filter(item => item.id !== record.id)); - } - form.resetFields(); - }; - - const columns = [ - { - title: '单位名称', - dataIndex: ['attributes', 'name'], - render: (text, record) => { - const isEditing = record.id === editingKey; - return isEditing ? ( - - - - ) : ( - text - ); - } - }, - { - title: '操作', - render: (_, record) => { - const isEditing = record.id === editingKey; - return isEditing ? ( - - - - - ) : ( - - - handleDelete(record.id)} - okButtonProps={{ - className: "bg-red-500 hover:bg-red-600 border-red-500" - }} - > - - - - 单位管理 - - } - placement="right" - width={600} - onClose={() => { - setDrawerVisible(false); - setEditingKey(''); - form.resetFields(); - }} - open={drawerVisible} - className="dark:bg-gray-800" - > -
- - -
- - `transition-colors ${ - record.id === editingKey - ? 'bg-blue-50 dark:bg-blue-900/20' - : 'hover:bg-gray-50 dark:hover:bg-gray-700/50' - }` - } - /> - - - - - ); -}; - -export default UnitManagement; diff --git a/src/pages/notFound/index.jsx b/src/pages/notFound/index.jsx index 323a4c7..06cc3f9 100644 --- a/src/pages/notFound/index.jsx +++ b/src/pages/notFound/index.jsx @@ -15,7 +15,7 @@ const NotFound = () => { , diff --git a/src/pages/resource/bucket/index.jsx b/src/pages/resource/bucket/index.jsx index f0b0d5f..9453d04 100644 --- a/src/pages/resource/bucket/index.jsx +++ b/src/pages/resource/bucket/index.jsx @@ -599,9 +599,7 @@ const StorageManager = () => { return (
- {/* 左侧文件列表 */}
- {/* 上传区域 */}
{ : + user ? : } /> diff --git a/src/routes/routes.js b/src/routes/routes.js index f53ac8c..df8f2c4 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -45,16 +45,15 @@ const companyRoutes = [ icon: "file", }, { - path: "serviceTeamplate", + path: "serviceTemplate", component: lazy(() => import("@/pages/company/service")), name: "服务管理", icon: "container", }, { - path: "serviceType", - hidden: true, - component: lazy(() => import("@/pages/company/service/serviceType")), - name: "类型管理", + path: "templateItemManage", + component: lazy(() => import("@/pages/company/service/itemsManange")), + name: "资源类型", icon: "container", }, {