From 6f8acbd7b2f9e3cb359208dea7302413c4226aaa Mon Sep 17 00:00:00 2001 From: uiuJun <> Date: Mon, 22 Sep 2025 00:04:31 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=9B=B4=E6=96=B0=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E4=BB=BB=E5=8A=A1=E3=80=81=E9=A1=B9=E7=9B=AE=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E3=80=81=E9=A1=B9=E7=9B=AE=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + src/common/components/Editor/index.tsx | 8 +- src/components/MyModal.tsx | 9 +- src/gen/ApiTypes.d.ts | 60 ++++ src/gen/Apis.ts | 39 +++ src/gen/Enums.ts | 30 +- src/pages/asset/accounts/index.tsx | 2 +- src/pages/asset/activities/index.tsx | 176 ++++++++++++ .../activities/modals/ActivityCreate.tsx | 159 +++++++++++ .../asset/activities/modals/ActivityShow.tsx | 112 ++++++++ .../activities/modals/ActivityUpdate.tsx | 159 +++++++++++ .../asset/activities/modals/EnrollsList.tsx | 100 +++++++ src/pages/asset/announcement/index.tsx | 76 +++--- .../modals/AnnouncementCreate.tsx | 105 ++++--- .../announcement/modals/AnnouncementShow.tsx | 67 ++++- .../modals/AnnouncementUpdate.tsx | 89 +++--- src/pages/asset/list/show/$id.tsx | 7 + src/pages/asset/list/table/Activities.tsx | 156 +++++++++++ src/pages/asset/list/table/Announcement.tsx | 85 +++--- src/pages/asset/list/table/ChargeStandard.tsx | 6 +- .../standard}/components/ChargeInfo.tsx | 0 .../standard}/components/HasHouse.tsx | 0 .../standard}/index.tsx | 0 .../standard}/modals/ChargeStandardCreate.tsx | 0 .../modals/ChargeStandardHasHouse.tsx | 0 .../standard}/modals/ChargeStandardUpdate.tsx | 0 .../standard}/show/$id.tsx | 0 .../tasks}/index.tsx | 76 +++--- .../tasks/modals/TaskCreate.tsx} | 0 src/pages/charge/tasks/modals/TaskShow.tsx | 69 +++++ .../modals/ChargeTasksCreate.tsx | 109 -------- src/pages/house_charge_tasks/index.tsx | 100 ------- yarn.lock | 257 +++++++++++++++++- 33 files changed, 1652 insertions(+), 406 deletions(-) create mode 100644 src/pages/asset/activities/index.tsx create mode 100644 src/pages/asset/activities/modals/ActivityCreate.tsx create mode 100644 src/pages/asset/activities/modals/ActivityShow.tsx create mode 100644 src/pages/asset/activities/modals/ActivityUpdate.tsx create mode 100644 src/pages/asset/activities/modals/EnrollsList.tsx create mode 100644 src/pages/asset/list/table/Activities.tsx rename src/pages/{house_charge_standard => charge/standard}/components/ChargeInfo.tsx (100%) rename src/pages/{house_charge_standard => charge/standard}/components/HasHouse.tsx (100%) rename src/pages/{house_charge_standard => charge/standard}/index.tsx (100%) rename src/pages/{house_charge_standard => charge/standard}/modals/ChargeStandardCreate.tsx (100%) rename src/pages/{house_charge_standard => charge/standard}/modals/ChargeStandardHasHouse.tsx (100%) rename src/pages/{house_charge_standard => charge/standard}/modals/ChargeStandardUpdate.tsx (100%) rename src/pages/{house_charge_standard => charge/standard}/show/$id.tsx (100%) rename src/pages/{house_charge_task_details => charge/tasks}/index.tsx (67%) rename src/pages/{house_charge_tasks/modals/ChargeTasksCreate.tsx => charge/tasks/modals/TaskCreate.tsx} (100%) create mode 100644 src/pages/charge/tasks/modals/TaskShow.tsx delete mode 100644 src/pages/house_charge_task_details/modals/ChargeTasksCreate.tsx delete mode 100644 src/pages/house_charge_tasks/index.tsx diff --git a/package.json b/package.json index 8bccefa..cd73ff3 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "@ant-design/icons": "^5.0.1", "@ant-design/pro-components": "^2.8.10", "@umijs/max": "^4.3.10", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-react": "^1.0.6", "antd": "^5.4.0", "axios": "^1.7.2", "dayjs": "^1.11.12", diff --git a/src/common/components/Editor/index.tsx b/src/common/components/Editor/index.tsx index dac622e..d59314e 100644 --- a/src/common/components/Editor/index.tsx +++ b/src/common/components/Editor/index.tsx @@ -25,10 +25,10 @@ function MyEditor(props: any) { file: any, onSuccess: (url: string, file: any) => void, ) => { - Apis.Auth.PreUpload({ + Apis.Common.Auth.PreUpload({ filename: file.name, alc: 'public-read', - }).then(async (res) => { + }).then(async (res: any) => { axios .put(res.data.url, file, { headers: res.data.headers, @@ -102,9 +102,9 @@ function MyEditor(props: any) { value={html} key="Editor2" onCreated={setEditor} - onChange={(editor) => props?.onChange?.(editor.getHtml())} + onChange={(editor: any) => props?.onChange?.(editor.getHtml())} mode="default" - style={{ height: '500px', overflowY: 'hidden' }} + style={{ height: '320px', overflowY: 'hidden' }} /> ); diff --git a/src/components/MyModal.tsx b/src/components/MyModal.tsx index 3daae85..53a5164 100644 --- a/src/components/MyModal.tsx +++ b/src/components/MyModal.tsx @@ -1,12 +1,19 @@ import { MyButtons } from '@/common'; import { Modal } from 'antd'; -import { useImperativeHandle, useState } from 'react'; +import { useEffect, useImperativeHandle, useState } from 'react'; export function MyModal(props?: any) { const [open, setOpen] = useState(false); const close = () => { setOpen(false); }; + + useEffect(() => { + if (open && props?.onOpen) { + props.onOpen(); + } + }, [open, props?.onOpen]); + useImperativeHandle(props.myRef, () => ({ close, })); diff --git a/src/gen/ApiTypes.d.ts b/src/gen/ApiTypes.d.ts index 9f5efbf..696d488 100644 --- a/src/gen/ApiTypes.d.ts +++ b/src/gen/ApiTypes.d.ts @@ -1,4 +1,64 @@ declare namespace ApiTypes { + namespace Activity { + namespace Activities { + type List = { + "title"?: string; // 模糊搜索:名称 + "status"?: string; // 状态,[enum:ActivitiesStatusEnum] + "publish_status"?: string; // 发布状态,[enum:ActivitiesPublishStatusEnum] + }; + type Store = { + "title": string; // 活动标题 + "start_time": Date; // 活动开始时间 + "end_time": Date; // 活动结束时间 + "publish_type"?: string; // 发布类型,[enum:ActivitiesPublishTypeEnum] + "schedule_publish_at"?: Date; // 定时发布时间 + "is_enroll"?: boolean; // 是否报名:1 是、0 否 + "project_ids"?: string[]; // 项目ID + "content": string; // 内容 + }; + type Update = { + "id": number; // id + "title": string; // 活动标题 + "start_time": Date; // 活动开始时间 + "end_time": Date; // 活动结束时间 + "publish_type"?: string; // 发布类型,[enum:ActivitiesPublishTypeEnum] + "schedule_publish_at"?: Date; // 定时发布时间 + "is_enroll"?: boolean; // 是否报名:1 是、0 否 + "project_ids"?: string[]; // 项目ID + "content": string; // 内容 + }; + type ChangePublishStatus = { + "id": number; // id + "publish_status": string; // 状态,[enum:ActivitiesPublishStatusEnum] + }; + type Show = { + "id": number; // id + }; + type SoftDelete = { + "id": number; // id + }; + type Restore = { + "id": number; // id + }; + type Delete = { + "id": number; // id + }; + } + namespace ActivityEnrolls { + type List = { + "activities_id"?: number; // 活动id,[ref:activities] + "customer_name"?: string; // 模糊搜索:客户名称 + "customer_phone"?: string; // 模糊搜索:客户电话 + }; + type Show = { + "id": number; // id + }; + type ChangeStatus = { + "id": number; // id + "status": string; // 状态:[ActivityEnrollsStatusEnum] + }; + } + } namespace Archive { namespace HouseOccupants { type List = { diff --git a/src/gen/Apis.ts b/src/gen/Apis.ts index cd98bb9..d372e32 100644 --- a/src/gen/Apis.ts +++ b/src/gen/Apis.ts @@ -2,6 +2,45 @@ import { MyResponseType } from '@/common'; import { request } from '@umijs/max'; export const Apis = { + Activity: { + Activities: { + List(data?: ApiTypes.Activity.Activities.List): Promise { + return request('admin/activity/activities/list', { data }); + }, + Store(data: ApiTypes.Activity.Activities.Store): Promise { + return request('admin/activity/activities/store', { data }); + }, + Update(data: ApiTypes.Activity.Activities.Update): Promise { + return request('admin/activity/activities/update', { data }); + }, + ChangePublishStatus(data: ApiTypes.Activity.Activities.ChangePublishStatus): Promise { + return request('admin/activity/activities/change_publish_status', { data }); + }, + Show(data: ApiTypes.Activity.Activities.Show): Promise { + return request('admin/activity/activities/show', { data }); + }, + SoftDelete(data: ApiTypes.Activity.Activities.SoftDelete): Promise { + return request('admin/activity/activities/soft_delete', { data }); + }, + Restore(data: ApiTypes.Activity.Activities.Restore): Promise { + return request('admin/activity/activities/restore', { data }); + }, + Delete(data: ApiTypes.Activity.Activities.Delete): Promise { + return request('admin/activity/activities/delete', { data }); + }, + }, + ActivityEnrolls: { + List(data?: ApiTypes.Activity.ActivityEnrolls.List): Promise { + return request('admin/activity/activity_enrolls/list', { data }); + }, + Show(data: ApiTypes.Activity.ActivityEnrolls.Show): Promise { + return request('admin/activity/activity_enrolls/show', { data }); + }, + ChangeStatus(data: ApiTypes.Activity.ActivityEnrolls.ChangeStatus): Promise { + return request('admin/activity/activity_enrolls/change_status', { data }); + }, + }, + }, Archive: { HouseOccupants: { List(data?: ApiTypes.Archive.HouseOccupants.List): Promise { diff --git a/src/gen/Enums.ts b/src/gen/Enums.ts index 7301387..ed38816 100644 --- a/src/gen/Enums.ts +++ b/src/gen/Enums.ts @@ -1,3 +1,31 @@ +// ActivitiesPublishStatusEnum +export const ActivitiesPublishStatusEnum= { + 'Unpublished': {"text":"未发布","color":"#9e9e9e","value":"Unpublished"}, + 'Published': {"text":"已发布","color":"#00c853","value":"Published"}, + 'Unlisted': {"text":"已下架","color":"#d32f2f","value":"Unlisted"}, +}; + +// ActivitiesPublishTypeEnum +export const ActivitiesPublishTypeEnum= { + 'Manual': {"text":"手动","color":"#4caf50","value":"Manual"}, + 'Schedule': {"text":"定时","color":"#2196f3","value":"Schedule"}, +}; + +// ActivitiesStatusEnum +export const ActivitiesStatusEnum= { + 'NotStarted': {"text":"未开始","color":"#9e9e9e","value":"NotStarted"}, + 'InProgress': {"text":"进行中","color":"#00c853","value":"InProgress"}, + 'Finished': {"text":"已结束","color":"#d32f2f","value":"Finished"}, +}; + +// ActivityEnrollsStatusEnum +export const ActivityEnrollsStatusEnum= { + 'PendingReview': {"text":"待审核","color":"#2196f3","value":"PendingReview"}, + 'Success': {"text":"成功","color":"#00c853","value":"Success"}, + 'Failed': {"text":"失败","color":"#d32f2f","value":"Failed"}, + 'Cancelled': {"text":"取消","color":"#ff9800","value":"Cancelled"}, +}; + // AssetHousesOrientationEnum export const AssetHousesOrientationEnum= { 'East': {"text":"东","color":"#007bff","value":"East"}, @@ -126,7 +154,7 @@ export const BannersTypeEnum= { // 缓存类型 export const CacheTypeEnum= { - 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#69355c","value":"MobilePhoneVerificationCode"}, + 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#5acfb3","value":"MobilePhoneVerificationCode"}, }; // CompaniesMerchantTypeEnum diff --git a/src/pages/asset/accounts/index.tsx b/src/pages/asset/accounts/index.tsx index 3a94e7d..6ef3e7b 100644 --- a/src/pages/asset/accounts/index.tsx +++ b/src/pages/asset/accounts/index.tsx @@ -46,7 +46,7 @@ export default function Index({ title = '项目账户' }) { // width: 360, }, { - title: '收款账号名称', + title: '收款名称', dataIndex: ['receipt_account', 'company_name'], }, { diff --git a/src/pages/asset/activities/index.tsx b/src/pages/asset/activities/index.tsx new file mode 100644 index 0000000..880d7c9 --- /dev/null +++ b/src/pages/asset/activities/index.tsx @@ -0,0 +1,176 @@ +import { + MyButtons, + MyColumns, + MyPageContainer, + MyProTableProps, + usePageTabs, +} from '@/common'; +import { Apis } from '@/gen/Apis'; +import { + ActivitiesPublishStatusEnum, + ActivitiesPublishTypeEnum, + ActivitiesStatusEnum, +} from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { useNavigate } from '@umijs/max'; +import { Space } from 'antd'; +import ActivityCreate from './modals/ActivityCreate'; +import ActivityShow from './modals/ActivityShow'; +import ActivityUpdate from './modals/ActivityUpdate'; +import EnrollsList from './modals/EnrollsList'; + +export default function Index({ title = '项目活动' }) { + const navigate = useNavigate(); + + // 注册当前页面为标签页 + usePageTabs({ + tabKey: 'activity', + tabLabel: title, + }); + + return ( + + + MyProTableProps.request(params, sort, Apis.Activity.Activities.List) + } + toolBarRender={(action) => [ + , + ]} + columns={[ + MyColumns.ID(), + { + title: '活动标题', + dataIndex: 'title', + }, + MyColumns.EnumTag({ + title: '发布方式', + dataIndex: 'publish_type', + valueEnum: ActivitiesPublishTypeEnum, + search: false, + }), + MyColumns.EnumTag({ + title: '发布状态', + dataIndex: 'publish_status', + valueEnum: ActivitiesPublishStatusEnum, + search: false, + }), + MyColumns.EnumTag({ + title: '活动状态', + dataIndex: 'status', + valueEnum: ActivitiesStatusEnum, + search: false, + }), + { + title: '开始时间', + dataIndex: 'start_time', + search: false, + }, + { + title: '结束时间', + dataIndex: 'end_time', + search: false, + }, + { + title: '发布时间', + dataIndex: 'publish_time', + search: false, + }, + { + title: '活动报名', + dataIndex: 'is_enroll', + search: false, + render(_, record) { + return `${record?.is_enroll ? '开启' : '关闭'} `; + }, + }, + MyColumns.SoftDelete({ + onRestore: Apis.Activity.Activities.Restore, + onSoftDelete: Apis.Activity.Activities.SoftDelete, + search: false, + }), + MyColumns.UpdatedAt(), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + {(!item.end_time || new Date(item.end_time) > new Date()) && ( + + )} + {(!item.end_time || new Date(item.end_time) > new Date()) && ( + { + let newStatus; + if ( + item.publish_status === + ActivitiesPublishStatusEnum.Unpublished.value + ) { + newStatus = ActivitiesPublishStatusEnum.Published.value; + } else if ( + item.publish_status === + ActivitiesPublishStatusEnum.Published.value + ) { + newStatus = ActivitiesPublishStatusEnum.Unlisted.value; + } else { + newStatus = ActivitiesPublishStatusEnum.Published.value; + } + Apis.Activity.Activities.ChangePublishStatus({ + id: item.id, + publish_status: newStatus, + }).then(() => action?.reload()); + }} + /> + )} + + {item.is_enroll === 1 && ( + + )} + + Apis.Activity.Activities.Delete({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/asset/activities/modals/ActivityCreate.tsx b/src/pages/asset/activities/modals/ActivityCreate.tsx new file mode 100644 index 0000000..1fc7ef2 --- /dev/null +++ b/src/pages/asset/activities/modals/ActivityCreate.tsx @@ -0,0 +1,159 @@ +import { + MyBetaModalFormProps, + MyButtons, + MyFormItems, + MyModalFormProps, + rulesHelper, +} from '@/common'; +import MyEditor from '@/common/components/Editor'; +import { Selects } from '@/components/Select'; +import { Apis } from '@/gen/Apis'; +import { ActivitiesPublishTypeEnum } from '@/gen/Enums'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { Form, message } from 'antd'; + +export default function Create(props: MyBetaModalFormProps) { + const [form] = Form.useForm(); + return ( + + {...MyModalFormProps.props} + title={`添加活动`} + layout="horizontal" + labelCol={{ span: 4 }} + wrapperCol={{ span: 20 }} + labelAlign="left" + width="950px" + trigger={} + key={new Date().getTime()} + form={form} + onOpenChange={(open: any) => { + if (open) { + form.resetFields(); // 清空表单数据 + } + }} + onFinish={async (values) => + Apis.Activity.Activities.Store({ + ...values, + project_ids: values?.project_ids + ? [values?.project_ids] + : [props.item?.id], + }) + .then(() => { + props.reload?.(); + message.success('添加活动成功'); + return true; + }) + .catch(() => false) + } + columns={[ + ...(props?.item?.id + ? [] + : [ + Selects?.AssetProjects({ + key: 'project_ids', + title: '关联项目', + colProps: { span: 24 }, + required: true, + fieldProps: { + showSearch: true, + fieldNames: { + label: 'label', + value: 'value', + }, + }, + }), + ]), + { + key: 'title', + title: '活动标题', + colProps: { span: 16 }, + required: true, + formItemProps: { + labelCol: { span: 6 }, + wrapperCol: { span: 16 }, + ...rulesHelper.text, + }, + }, + { + key: 'is_enroll', + title: '活动报名', + colProps: { span: 8 }, + valueType: 'switch', + required: true, + formItemProps: { + labelCol: { span: 8 }, + wrapperCol: { span: 14 }, + required: true, + }, + fieldProps: { + checkedChildren: '开启', + unCheckedChildren: '关闭', + }, + }, + { + key: 'activity_time', + title: '活动时间', + valueType: 'dateTimeRange', + colProps: { span: 24 }, + fieldProps: { + style: { width: '50%' }, + showTime: true, + format: 'YYYY-MM-DD HH:mm', + }, + formItemProps: { ...rulesHelper.text }, + transform: (value: any) => { + return { + start_time: value?.[0], + end_time: value?.[1], + }; + }, + }, + MyFormItems.EnumRadio({ + key: 'publish_type', + title: '发布方式', + colProps: { span: 8 }, + valueEnum: ActivitiesPublishTypeEnum, + formItemProps: { + labelCol: { span: 12 }, + wrapperCol: { span: 12 }, + ...rulesHelper.text, + }, + }), + { + name: ['publish_type'], + valueType: 'dependency', + columns: ({ publish_type }) => { + return publish_type === ActivitiesPublishTypeEnum.Schedule.value + ? [ + { + key: 'schedule_publish_at', + // title: '定时发布时间', + valueType: 'dateTime', + colProps: { span: 16 }, + fieldProps: { + style: { width: '40%' }, + format: 'YYYY-MM-DD HH:mm', + }, + formItemProps: { + ...rulesHelper.text, + wrapperCol: { span: 24 }, + placeholder: '请设置定时发布时间', + }, + }, + ] + : []; + }, + }, + { + key: 'content', + title: '活动内容', + colProps: { span: 24 }, + fieldProps: { + mode: 'simple', + }, + renderFormItem: () => , + }, + ]} + /> + ); +} diff --git a/src/pages/asset/activities/modals/ActivityShow.tsx b/src/pages/asset/activities/modals/ActivityShow.tsx new file mode 100644 index 0000000..f7b2b01 --- /dev/null +++ b/src/pages/asset/activities/modals/ActivityShow.tsx @@ -0,0 +1,112 @@ +import { MyBetaModalFormProps, renderTextHelper } from '@/common'; +import { MyModal } from '@/components/MyModal'; +import { Apis } from '@/gen/Apis'; +import { + ActivitiesPublishStatusEnum, + ActivitiesPublishTypeEnum, + ActivitiesStatusEnum, +} from '@/gen/Enums'; +import { ProCard, ProDescriptions } from '@ant-design/pro-components'; +import { Space, Spin } from 'antd'; +import { useState } from 'react'; + +export default function Show(props: MyBetaModalFormProps) { + const [show, setShow] = useState({}); + const [loading, setLoading] = useState(false); + const [hasLoaded, setHasLoaded] = useState(false); + + const getShow = () => { + if (props?.item?.id && !loading && !hasLoaded) { + setLoading(true); + setHasLoaded(true); + Apis.Activity.Activities.Show({ + id: props?.item?.id, + }) + .then((res: any) => { + setShow(res?.data); + }) + .catch(() => { + setHasLoaded(false); // 如果请求失败,允许重试 + }) + .finally(() => { + setLoading(false); + }); + } + }; + + return ( + + + + + {show?.activity_projects + ?.map((project: any) => project?.asset_project?.name) + .join(', ') || '-'} + + + {show?.title || '-'} + + + + + {show?.start_time || '-'} 至 {show?.end_time || '-'} + + + + + + + {show?.publish_time || '-'} + + + + +
+ + + {show?.created_at || '-'} + + + {show?.updated_at || '-'} + + + + + } + /> + ); +} diff --git a/src/pages/asset/activities/modals/ActivityUpdate.tsx b/src/pages/asset/activities/modals/ActivityUpdate.tsx new file mode 100644 index 0000000..76e25c2 --- /dev/null +++ b/src/pages/asset/activities/modals/ActivityUpdate.tsx @@ -0,0 +1,159 @@ +import { + MyBetaModalFormProps, + MyButtons, + MyFormItems, + MyModalFormProps, + rulesHelper, +} from '@/common'; +import MyEditor from '@/common/components/Editor'; +import { Selects } from '@/components/Select'; +import { Apis } from '@/gen/Apis'; +import { ActivitiesPublishTypeEnum } from '@/gen/Enums'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { Form, message } from 'antd'; + +export default function Update(props: MyBetaModalFormProps) { + const [form] = Form.useForm(); + return ( + + {...MyModalFormProps.props} + title={`编辑活动内容`} + trigger={} + layout="horizontal" + labelCol={{ span: 4 }} + wrapperCol={{ span: 20 }} + labelAlign="left" + width="1000px" + key={new Date().getTime()} + form={form} + onOpenChange={(open: any) => { + if (open && props.item) { + form.setFieldsValue(props.item); + form.setFieldValue('project_ids', props.item?.project_ids[0]); + form.setFieldValue('activity_time', [ + props.item?.start_time, + props.item?.end_time, + ]); + form.setFieldValue('content', props.item?.content); + } + }} + onFinish={async (values) => + Apis.Activity.Activities.Update({ + ...values, + id: props.item?.id ?? 0, + project_ids: values?.project_ids + ? [values?.project_ids] + : [props.item?.id], + }) + .then(() => { + props.reload?.(); + message.success('编辑公告内容成功'); + return true; + }) + .catch(() => false) + } + columns={[ + Selects?.AssetProjects({ + key: 'project_ids', + title: '关联项目', + colProps: { span: 24 }, + required: true, + fieldProps: { + showSearch: true, + fieldNames: { + label: 'label', + value: 'value', + }, + }, + }), + { + key: 'title', + title: '活动标题', + colProps: { span: 16 }, + required: true, + formItemProps: { + labelCol: { span: 6 }, + wrapperCol: { span: 16 }, + required: true, + }, + }, + { + key: 'is_enroll', + title: '活动报名', + colProps: { span: 8 }, + valueType: 'switch', + formItemProps: { + labelCol: { span: 8 }, + wrapperCol: { span: 14 }, + ...rulesHelper.number, + }, + fieldProps: { + checkedChildren: '开启', + unCheckedChildren: '关闭', + }, + }, + { + key: 'activity_time', + title: '活动时间', + valueType: 'dateTimeRange', + colProps: { span: 24 }, + fieldProps: { + style: { width: '50%' }, + showTime: true, + format: 'YYYY-MM-DD HH:mm', + }, + formItemProps: { ...rulesHelper.text }, + transform: (value: any) => { + return { + start_time: value?.[0], + end_time: value?.[1], + }; + }, + }, + MyFormItems.EnumRadio({ + key: 'publish_type', + title: '发布方式', + colProps: { span: 8 }, + valueEnum: ActivitiesPublishTypeEnum, + required: true, + formItemProps: { + labelCol: { span: 12 }, + wrapperCol: { span: 12 }, + }, + }), + { + name: ['publish_type'], + valueType: 'dependency', + columns: ({ publish_type }) => { + return publish_type === ActivitiesPublishTypeEnum.Schedule.value + ? [ + { + key: 'schedule_publish_at', + // title: '定时发布时间', + valueType: 'dateTime', + colProps: { span: 16 }, + fieldProps: { + style: { width: '40%' }, + format: 'YYYY-MM-DD HH:mm', + }, + formItemProps: { + ...rulesHelper.text, + wrapperCol: { span: 24 }, + placeholder: '请设置定时发布时间', + }, + }, + ] + : []; + }, + }, + { + key: 'content', + title: '活动内容', + colProps: { span: 24 }, + renderFormItem: () => , + initialValue: props.item?.content, + }, + ]} + /> + ); +} diff --git a/src/pages/asset/activities/modals/EnrollsList.tsx b/src/pages/asset/activities/modals/EnrollsList.tsx new file mode 100644 index 0000000..a24842f --- /dev/null +++ b/src/pages/asset/activities/modals/EnrollsList.tsx @@ -0,0 +1,100 @@ +import { + MyBetaModalFormProps, + MyButtons, + MyColumns, + MyProTableProps, +} from '@/common'; +import { MyModal } from '@/components/MyModal'; +import { Apis } from '@/gen/Apis'; +import { ActivityEnrollsStatusEnum } from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { Space } from 'antd'; + +export default function EnrollsList(props: MyBetaModalFormProps) { + return ( + + MyProTableProps.request( + { ...params, activities_id: props?.item?.id }, + sort, + Apis.Activity.ActivityEnrolls.List, + ) + } + columns={[ + MyColumns.ID(), + { + title: '客户姓名', + dataIndex: 'customer_name', + search: false, + }, + { + title: '客户电话', + dataIndex: 'customer_phone', + search: false, + }, + MyColumns.EnumTag({ + title: '状态', + dataIndex: 'status', + valueEnum: ActivityEnrollsStatusEnum, + }), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + { + let newStatus; + if ( + item.status === ActivityEnrollsStatusEnum.Success.value + ) { + newStatus = ActivityEnrollsStatusEnum.Cancelled.value; + } else if ( + item.status === + ActivityEnrollsStatusEnum.Cancelled.value + ) { + newStatus = ActivityEnrollsStatusEnum.Success.value; + } else { + newStatus = ActivityEnrollsStatusEnum.Success.value; + } + Apis.Activity.ActivityEnrolls.ChangeStatus({ + id: item.id, + status: newStatus, + }).then(() => action?.reload()); + }} + /> + + + ), + }), + ]} + /> + } + /> + ); +} diff --git a/src/pages/asset/announcement/index.tsx b/src/pages/asset/announcement/index.tsx index f14af81..d1d1f6a 100644 --- a/src/pages/asset/announcement/index.tsx +++ b/src/pages/asset/announcement/index.tsx @@ -6,6 +6,7 @@ import { usePageTabs, } from '@/common'; import { Apis } from '@/gen/Apis'; +import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums'; import { ProTable } from '@ant-design/pro-components'; import { useNavigate } from '@umijs/max'; import { Space } from 'antd'; @@ -76,52 +77,37 @@ export default function Index({ title = '项目公告' }) { ), }, { - title: '公告内容', - dataIndex: 'content', - valueType: 'textarea', // 仅影响表单编辑时的输入类型,不影响表格展示 - search: false, - width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽) - render: (text) => ( -
- {text} -
- ), - }, - { - title: '发布日期', + title: '落款日期', dataIndex: 'publish_at', valueType: 'date', search: false, }, + MyColumns.EnumTag({ + title: '发布方式', + dataIndex: 'publish_type', + valueEnum: MsgPropertyAnnouncementsPublishTypeEnum, + search: false, + }), { - title: '是否发布小程序', - dataIndex: 'is_publish', - render: (text) => (text ? '是' : '否'), + title: '发布时间', + dataIndex: 'schedule_publish_at', + valueType: 'dateTime', search: false, }, + { + title: '是否发布', + dataIndex: 'is_publish', + search: false, + render: (text) => (text ? '是' : '否'), + }, + MyColumns.SoftDelete({ title: '启/禁用', onRestore: Apis.Msg.MsgPropertyAnnouncements.Restore, onSoftDelete: Apis.Msg.MsgPropertyAnnouncements.SoftDelete, search: false, }), - { - //创建日期 - title: '创建日期', - dataIndex: 'created_at', - valueType: 'date', - search: false, - }, + MyColumns.UpdatedAt(), MyColumns.Option({ render: (_, item: any, index, action) => ( @@ -131,6 +117,30 @@ export default function Index({ title = '项目公告' }) { reload={action?.reload} // title={title} /> + + { + let newStatus: boolean; + if (item.is_publish === 0) { + newStatus = true; + } else { + newStatus = false; + } + Apis.Msg.MsgPropertyAnnouncements.IsPublish({ + id: item.id, + is_publish: Boolean(newStatus), + }).then(() => action?.reload()); + }} + /> + Apis.Msg.MsgPropertyAnnouncements.Delete({ diff --git a/src/pages/asset/announcement/modals/AnnouncementCreate.tsx b/src/pages/asset/announcement/modals/AnnouncementCreate.tsx index 03a4cda..5f28196 100644 --- a/src/pages/asset/announcement/modals/AnnouncementCreate.tsx +++ b/src/pages/asset/announcement/modals/AnnouncementCreate.tsx @@ -1,11 +1,14 @@ import { MyBetaModalFormProps, MyButtons, + MyFormItems, MyModalFormProps, rulesHelper, } from '@/common'; +import MyEditor from '@/common/components/Editor'; import { Selects } from '@/components/Select'; import { Apis } from '@/gen/Apis'; +import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums'; import { BetaSchemaForm } from '@ant-design/pro-components'; import { Form, message } from 'antd'; @@ -15,14 +18,18 @@ export default function Create(props: MyBetaModalFormProps) { {...MyModalFormProps.props} title={`添加公告`} - wrapperCol={{ span: 24 }} - width="600px" + layout="horizontal" + labelCol={{ span: 4 }} + wrapperCol={{ span: 20 }} + labelAlign="left" + width="950px" trigger={} key={new Date().getTime()} form={form} onOpenChange={(open: any) => { if (open) { form.resetFields(); // 清空表单数据 + form.setFieldValue('is_publish', 1); } }} onFinish={async (values) => @@ -48,58 +55,88 @@ export default function Create(props: MyBetaModalFormProps) { required: true, }), ]), + { key: 'title', title: '公告标题', colProps: { span: 24 }, - formItemProps: { ...rulesHelper.text }, + required: true, + formItemProps: { + labelCol: { span: 4 }, + wrapperCol: { span: 20 }, + ...rulesHelper.text, + }, + }, + MyFormItems.EnumRadio({ + key: 'publish_type', + title: '发布方式', + colProps: { span: 8 }, + valueEnum: MsgPropertyAnnouncementsPublishTypeEnum, + formItemProps: { + labelCol: { span: 12 }, + wrapperCol: { span: 12 }, + ...rulesHelper.text, + }, + }), + + { + name: ['publish_type'], + valueType: 'dependency', + columns: ({ publish_type }) => { + return publish_type === + MsgPropertyAnnouncementsPublishTypeEnum.Schedule.value + ? [ + { + key: 'schedule_publish_at', + // title: '定时发布时间', + valueType: 'dateTime', + colProps: { span: 16 }, + fieldProps: { + style: { width: '40%' }, + format: 'YYYY-MM-DD HH:mm', + }, + formItemProps: { + ...rulesHelper.text, + wrapperCol: { span: 24 }, + placeholder: '请设置定时发布时间', + }, + }, + ] + : []; + }, }, { key: 'content', title: '公告内容', - valueType: 'textarea', colProps: { span: 24 }, - formItemProps: { ...rulesHelper.text }, fieldProps: { - autoSize: { minRows: 4, maxRows: 6 }, + mode: 'simple', }, + renderFormItem: () => , }, { key: 'publish_at', - title: '内容显示的发布日期', + title: '落款日期', valueType: 'date', - colProps: { span: 12 }, + colProps: { span: 24 }, fieldProps: { - style: { width: '100%' }, + style: { width: '40%' }, }, formItemProps: { ...rulesHelper.text }, }, - // Selects?.AssetProjects({ - // title: '请选择项目', - // key: 'asset_projects_id', + // { + // key: 'sort', + // title: '排序', + // valueType: 'digit', // colProps: { span: 12 }, - // formItemProps: { ...rulesHelper.text }, - // }), - { - key: 'is_publish', - title: '是否立刻发布', - tooltip: '如果选择了,那么内容会立刻发布到小程序中', - valueType: 'switch', - colProps: { span: 8 }, - }, - { - key: 'sort', - title: '排序', - valueType: 'digit', - colProps: { span: 12 }, - tooltip: '数值越大越靠前', - fieldProps: { - placeholder: '数值越大越靠前', - min: 0, - style: { width: '100%' }, - }, - initialValue: 0, - }, + // tooltip: '数值越大越靠前', + // fieldProps: { + // placeholder: '数值越大越靠前', + // min: 0, + // style: { width: '100%' }, + // }, + // initialValue: 0, + // }, ]} /> ); diff --git a/src/pages/asset/announcement/modals/AnnouncementShow.tsx b/src/pages/asset/announcement/modals/AnnouncementShow.tsx index cb1daf4..23fb8f5 100644 --- a/src/pages/asset/announcement/modals/AnnouncementShow.tsx +++ b/src/pages/asset/announcement/modals/AnnouncementShow.tsx @@ -1,17 +1,39 @@ -import { MyBetaModalFormProps } from '@/common'; +import { MyBetaModalFormProps, renderTextHelper } from '@/common'; import { MyModal } from '@/components/MyModal'; +import { Apis } from '@/gen/Apis'; +import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums'; import { ProCard, ProDescriptions } from '@ant-design/pro-components'; -import { Typography } from 'antd'; +import { Space } from 'antd'; +import { useState } from 'react'; -const { Text } = Typography; +export default function Show(props: MyBetaModalFormProps) { + const [show, setShow] = useState({}); + const [loading, setLoading] = useState(false); + const [hasLoaded, setHasLoaded] = useState(false); -export default function info(props: MyBetaModalFormProps) { + const getShow = () => { + if (props?.item?.id && !loading && !hasLoaded) { + setLoading(true); + setHasLoaded(true); + Apis.Msg.MsgPropertyAnnouncements.Show({ + id: props?.item?.id, + }) + .then((res: any) => { + setShow(res?.data); + }) + .catch(() => { + setHasLoaded(false); // 如果请求失败,允许重试 + }) + .finally(() => { + setLoading(false); + }); + } + }; return ( + + + {props?.item?.is_publish ? '已发布' : '未发布'} + + {show?.schedule_publish_at || '-'} + +
- {props?.item?.content || '-'} -
+ dangerouslySetInnerHTML={{ + __html: props?.item?.content || '暂无内容', + }} + />
- + + {props?.item?.publish_at || '-'} {props?.item?.created_at || '-'} - - {props?.item?.is_publish ? '是' : '否'} + + {props?.item?.updated_at || '-'}
diff --git a/src/pages/asset/announcement/modals/AnnouncementUpdate.tsx b/src/pages/asset/announcement/modals/AnnouncementUpdate.tsx index 88ae286..966350f 100644 --- a/src/pages/asset/announcement/modals/AnnouncementUpdate.tsx +++ b/src/pages/asset/announcement/modals/AnnouncementUpdate.tsx @@ -1,10 +1,13 @@ import { MyBetaModalFormProps, MyButtons, + MyFormItems, MyModalFormProps, rulesHelper, } from '@/common'; +import MyEditor from '@/common/components/Editor'; import { Apis } from '@/gen/Apis'; +import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums'; import { BetaSchemaForm } from '@ant-design/pro-components'; import { Form, message } from 'antd'; @@ -15,8 +18,11 @@ export default function Update(props: MyBetaModalFormProps) { {...MyModalFormProps.props} title={`编辑公告内容`} trigger={} - wrapperCol={{ span: 24 }} - width="600px" + layout="horizontal" + labelCol={{ span: 4 }} + wrapperCol={{ span: 20 }} + labelAlign="left" + width="950px" key={new Date().getTime()} form={form} onOpenChange={(open: any) => { @@ -42,49 +48,68 @@ export default function Update(props: MyBetaModalFormProps) { key: 'title', title: '公告标题', colProps: { span: 24 }, - formItemProps: { ...rulesHelper.text }, + required: true, + formItemProps: { + labelCol: { span: 4 }, + wrapperCol: { span: 20 }, + ...rulesHelper.text, + }, + }, + MyFormItems.EnumRadio({ + key: 'publish_type', + title: '发布方式', + colProps: { span: 8 }, + valueEnum: MsgPropertyAnnouncementsPublishTypeEnum, + formItemProps: { + labelCol: { span: 12 }, + wrapperCol: { span: 12 }, + ...rulesHelper.text, + }, + }), + + { + name: ['publish_type'], + valueType: 'dependency', + columns: ({ publish_type }) => { + return publish_type === + MsgPropertyAnnouncementsPublishTypeEnum.Schedule.value + ? [ + { + key: 'schedule_publish_at', + // title: '定时发布时间', + valueType: 'dateTime', + colProps: { span: 16 }, + fieldProps: { + style: { width: '40%' }, + format: 'YYYY-MM-DD HH:mm', + }, + formItemProps: { + ...rulesHelper.text, + wrapperCol: { span: 24 }, + placeholder: '请设置定时发布时间', + }, + }, + ] + : []; + }, }, { key: 'content', title: '公告内容', - valueType: 'textarea', colProps: { span: 24 }, - formItemProps: { ...rulesHelper.text }, - fieldProps: { - autoSize: { minRows: 4, maxRows: 6 }, - }, + renderFormItem: () => , + initialValue: props.item?.content, }, { key: 'publish_at', - title: '内容显示的发布日期', + title: '落款日期', valueType: 'date', - colProps: { span: 12 }, + colProps: { span: 24 }, fieldProps: { - style: { width: '100%' }, + style: { width: '40%' }, }, formItemProps: { ...rulesHelper.text }, }, - - { - key: 'is_publish', - title: '是否立刻发布', - tooltip: '如果选择了,那么内容会立刻发布到小程序中', - valueType: 'switch', - colProps: { span: 8 }, - }, - { - key: 'sort', - title: '排序', - valueType: 'digit', - colProps: { span: 12 }, - tooltip: '数值越大越靠前', - fieldProps: { - placeholder: '数值越大越靠前', - min: 0, - style: { width: '100%' }, - }, - initialValue: 0, - }, ]} /> ); diff --git a/src/pages/asset/list/show/$id.tsx b/src/pages/asset/list/show/$id.tsx index f8834fa..34de39f 100644 --- a/src/pages/asset/list/show/$id.tsx +++ b/src/pages/asset/list/show/$id.tsx @@ -7,6 +7,7 @@ import { useEffect, useState } from 'react'; import AssetInfo from '../modals/AssetInfo'; import AssetUpdate from '../modals/AssetUpdate'; import BindCompany from '../modals/BindCompany'; +import Activities from '../table/Activities'; import Announcement from '../table/Announcement'; import AssetAccounts from '../table/AssetAccounts'; import MyAssetBuildings from '../table/AssetBuildings'; @@ -79,6 +80,12 @@ export default function Show({ title }: { title?: string } = {}) { closable: false, children: , }, + { + label: '项目活动', + key: 'activities', + closable: false, + children: , + }, { label: '便民服务', key: 'convenience_services', diff --git a/src/pages/asset/list/table/Activities.tsx b/src/pages/asset/list/table/Activities.tsx new file mode 100644 index 0000000..3521032 --- /dev/null +++ b/src/pages/asset/list/table/Activities.tsx @@ -0,0 +1,156 @@ +import { MyButtons, MyColumns, MyProTableProps } from '@/common'; +import { Apis } from '@/gen/Apis'; +import { + ActivitiesPublishStatusEnum, + ActivitiesPublishTypeEnum, + ActivitiesStatusEnum, +} from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; +import { Space } from 'antd'; +import { useEffect, useRef } from 'react'; +import ActivityCreate from '../../activities/modals/ActivityCreate'; +import ActivityShow from '../../activities/modals/ActivityShow'; +import ActivityUpdate from '../../activities/modals/ActivityUpdate'; +import EnrollsList from '../../activities/modals/EnrollsList'; + +export default function Index({ ...rest }) { + const actionLooks = useRef(); + useEffect(() => { + actionLooks?.current.reloadAndRest(); + }, [rest.loadmore]); + + return ( + <> + > + {...MyProTableProps.props} + actionRef={actionLooks} + request={async (params, sort) => + MyProTableProps.request( + { ...params, asset_projects_id: rest.item?.id }, + sort, + Apis.Activity.Activities.List, + ) + } + search={false} + toolBarRender={(action) => [ + , + ]} + columns={[ + MyColumns.ID(), + { + title: '活动标题', + dataIndex: 'title', + }, + MyColumns.EnumTag({ + title: '发布方式', + dataIndex: 'publish_type', + valueEnum: ActivitiesPublishTypeEnum, + search: false, + }), + MyColumns.EnumTag({ + title: '发布状态', + dataIndex: 'publish_status', + valueEnum: ActivitiesPublishStatusEnum, + search: false, + }), + MyColumns.EnumTag({ + title: '活动状态', + dataIndex: 'status', + valueEnum: ActivitiesStatusEnum, + search: false, + }), + { + title: '开始时间', + dataIndex: 'start_time', + search: false, + }, + { + title: '结束时间', + dataIndex: 'end_time', + search: false, + }, + { + title: '发布时间', + dataIndex: 'publish_time', + search: false, + }, + MyColumns.SoftDelete({ + onRestore: Apis.Activity.Activities.Restore, + onSoftDelete: Apis.Activity.Activities.SoftDelete, + search: false, + }), + MyColumns.UpdatedAt(), + MyColumns.Option({ + render: (_, item: any, index, action) => ( + + + + { + let newStatus; + if ( + item.publish_status === + ActivitiesPublishStatusEnum.Unpublished.value + ) { + newStatus = ActivitiesPublishStatusEnum.Published.value; + } else if ( + item.publish_status === + ActivitiesPublishStatusEnum.Published.value + ) { + newStatus = ActivitiesPublishStatusEnum.Unlisted.value; + } else { + newStatus = ActivitiesPublishStatusEnum.Published.value; + } + Apis.Activity.Activities.ChangePublishStatus({ + id: item.id, + publish_status: newStatus, + }).then(() => action?.reload()); + }} + /> + + + Apis.Activity.Activities.Delete({ + id: item.id, + }).then(() => action?.reload()) + } + /> + + ), + }), + ]} + /> + + ); +} diff --git a/src/pages/asset/list/table/Announcement.tsx b/src/pages/asset/list/table/Announcement.tsx index 4a1b8ca..c33b033 100644 --- a/src/pages/asset/list/table/Announcement.tsx +++ b/src/pages/asset/list/table/Announcement.tsx @@ -1,5 +1,6 @@ import { MyButtons, MyColumns, MyProTableProps } from '@/common'; import { Apis } from '@/gen/Apis'; +import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums'; import { ProTable } from '@ant-design/pro-components'; import { Space } from 'antd'; import { useEffect, useRef } from 'react'; @@ -35,6 +36,14 @@ export default function Index({ ...rest }) { search={false} columns={[ MyColumns.ID(), + { + title: '关联项目', + dataIndex: ['asset_project', 'name'], + search: false, + render: (_, record) => { + return record?.asset_project?.name; + }, + }, { title: '公告标题', dataIndex: 'title', @@ -56,38 +65,28 @@ export default function Index({ ...rest }) { ), }, { - title: '公告内容', - dataIndex: 'content', - valueType: 'textarea', // 仅影响表单编辑时的输入类型,不影响表格展示 - search: false, - width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽) - render: (text) => ( -
- {text} -
- ), - }, - { - title: '发布日期', + title: '落款日期', dataIndex: 'publish_at', valueType: 'date', search: false, }, - { - title: '是否发布小程序', - dataIndex: 'is_publish', - render: (text) => (text ? '是' : '否'), + MyColumns.EnumTag({ + title: '发布方式', + dataIndex: 'publish_type', + valueEnum: MsgPropertyAnnouncementsPublishTypeEnum, search: false, + }), + { + title: '发布时间', + dataIndex: 'schedule_publish_at', + valueType: 'dateTime', + search: false, + }, + { + title: '是否发布', + dataIndex: 'is_publish', + search: false, + render: (text) => (text ? '是' : '否'), }, MyColumns.SoftDelete({ title: '启/禁用', @@ -95,13 +94,7 @@ export default function Index({ ...rest }) { onSoftDelete: Apis.Msg.MsgPropertyAnnouncements.SoftDelete, search: false, }), - { - //创建日期 - title: '创建日期', - dataIndex: 'created_at', - valueType: 'date', - search: false, - }, + MyColumns.UpdatedAt(), MyColumns.Option({ render: (_, item: any, index, action) => ( @@ -111,6 +104,30 @@ export default function Index({ ...rest }) { reload={action?.reload} // title={title} /> + + { + let newStatus: boolean; + if (item.is_publish === 0) { + newStatus = true; + } else { + newStatus = false; + } + Apis.Msg.MsgPropertyAnnouncements.IsPublish({ + id: item.id, + is_publish: Boolean(newStatus), + }).then(() => action?.reload()); + }} + /> + Apis.Msg.MsgPropertyAnnouncements.Delete({ diff --git a/src/pages/asset/list/table/ChargeStandard.tsx b/src/pages/asset/list/table/ChargeStandard.tsx index 5741008..d257dc6 100644 --- a/src/pages/asset/list/table/ChargeStandard.tsx +++ b/src/pages/asset/list/table/ChargeStandard.tsx @@ -12,9 +12,9 @@ import { HouseChargeStandardsCalculationPeriodEnum, HouseChargeStandardsPriceAlgorithmEnum, } from '@/gen/Enums'; -import ChargeStandardCreate from '@/pages/house_charge_standard/modals/ChargeStandardCreate'; -import ChargeStandardHasHouse from '@/pages/house_charge_standard/modals/ChargeStandardHasHouse'; -import ChargeStandardUpdate from '@/pages/house_charge_standard/modals/ChargeStandardUpdate'; +import ChargeStandardCreate from '@/pages/charge/standard/modals/ChargeStandardCreate'; +import ChargeStandardHasHouse from '@/pages/charge/standard/modals/ChargeStandardHasHouse'; +import ChargeStandardUpdate from '@/pages/charge/standard/modals/ChargeStandardUpdate'; import { ProTable } from '@ant-design/pro-components'; import { useNavigate } from '@umijs/max'; import { Space } from 'antd'; diff --git a/src/pages/house_charge_standard/components/ChargeInfo.tsx b/src/pages/charge/standard/components/ChargeInfo.tsx similarity index 100% rename from src/pages/house_charge_standard/components/ChargeInfo.tsx rename to src/pages/charge/standard/components/ChargeInfo.tsx diff --git a/src/pages/house_charge_standard/components/HasHouse.tsx b/src/pages/charge/standard/components/HasHouse.tsx similarity index 100% rename from src/pages/house_charge_standard/components/HasHouse.tsx rename to src/pages/charge/standard/components/HasHouse.tsx diff --git a/src/pages/house_charge_standard/index.tsx b/src/pages/charge/standard/index.tsx similarity index 100% rename from src/pages/house_charge_standard/index.tsx rename to src/pages/charge/standard/index.tsx diff --git a/src/pages/house_charge_standard/modals/ChargeStandardCreate.tsx b/src/pages/charge/standard/modals/ChargeStandardCreate.tsx similarity index 100% rename from src/pages/house_charge_standard/modals/ChargeStandardCreate.tsx rename to src/pages/charge/standard/modals/ChargeStandardCreate.tsx diff --git a/src/pages/house_charge_standard/modals/ChargeStandardHasHouse.tsx b/src/pages/charge/standard/modals/ChargeStandardHasHouse.tsx similarity index 100% rename from src/pages/house_charge_standard/modals/ChargeStandardHasHouse.tsx rename to src/pages/charge/standard/modals/ChargeStandardHasHouse.tsx diff --git a/src/pages/house_charge_standard/modals/ChargeStandardUpdate.tsx b/src/pages/charge/standard/modals/ChargeStandardUpdate.tsx similarity index 100% rename from src/pages/house_charge_standard/modals/ChargeStandardUpdate.tsx rename to src/pages/charge/standard/modals/ChargeStandardUpdate.tsx diff --git a/src/pages/house_charge_standard/show/$id.tsx b/src/pages/charge/standard/show/$id.tsx similarity index 100% rename from src/pages/house_charge_standard/show/$id.tsx rename to src/pages/charge/standard/show/$id.tsx diff --git a/src/pages/house_charge_task_details/index.tsx b/src/pages/charge/tasks/index.tsx similarity index 67% rename from src/pages/house_charge_task_details/index.tsx rename to src/pages/charge/tasks/index.tsx index b118dad..5c23cda 100644 --- a/src/pages/house_charge_task_details/index.tsx +++ b/src/pages/charge/tasks/index.tsx @@ -12,12 +12,13 @@ import { } from '@/gen/Enums'; import { ProTable } from '@ant-design/pro-components'; import { Space } from 'antd'; -import ChargeTasksCreate from './modals/ChargeTasksCreate'; +import TaskCreate from './modals/TaskCreate'; +import TaskShow from './modals/TaskShow'; export default function Index({ title = '账单任务' }) { // 注册当前页面为标签页 usePageTabs({ - tabKey: 'charge_tasks', + tabKey: 'house_charge_tasks', tabLabel: title, }); @@ -25,7 +26,7 @@ export default function Index({ title = '账单任务' }) { [ - , + , ]} columns={[ - MyColumns.ID(), - MyColumns.EnumTag({ - title: '任务状态', - dataIndex: 'status', - valueEnum: HouseChargeTasksStatusEnum, - }), + { + title: '机构', + dataIndex: ['company', 'name'], + search: false, + }, + { + title: '任务ID', + dataIndex: 'id', + search: false, + }, MyColumns.EnumTag({ title: '创建类型', dataIndex: 'type', valueEnum: HouseChargeTasksTypeEnum, }), + MyColumns.EnumTag({ + title: '任务状态', + dataIndex: 'status', + valueEnum: HouseChargeTasksStatusEnum, + }), { - title: '收费标准名称', - dataIndex: 'charge_standard_name', + title: '收费标准', + dataIndex: ['house_charge_standard', 'name'], search: false, }, { title: '账单月份', render: (_, record) => { - return `${record.year}-${String(record.month).padStart(2, '0')}`; + return `${record.bill_year}-${String(record.bill_month).padStart( + 2, + '0', + )}`; }, }, { - title: '计费开始日期', - dataIndex: 'start_date', + title: '计费周期', + + render: (_, record) => { + return `${record.start_date}-${String(record.end_date).padStart( + 2, + '0', + )}`; + }, search: false, }, { - title: '计费结束日期', - dataIndex: 'end_date', + title: '账单数', + dataIndex: 'task_count', search: false, }, - { - title: '项目名称', - dataIndex: 'project_name', - search: false, - }, - { - title: '机构名称', - dataIndex: 'company_name', - search: false, - }, - MyColumns.SoftDelete({ - title: '启/禁用', - onRestore: Apis.HouseCharage.HouseChargeTasks.Restore, - onSoftDelete: Apis.HouseCharage.HouseChargeTasks.SoftDelete, - search: false, - }), - MyColumns.UpdatedAt(), + // MyColumns.UpdatedAt(), MyColumns.CreatedAt(), MyColumns.Option({ render: (_, item: any, index, action) => ( + Apis.HouseCharage.HouseChargeTasks.Delete({ diff --git a/src/pages/house_charge_tasks/modals/ChargeTasksCreate.tsx b/src/pages/charge/tasks/modals/TaskCreate.tsx similarity index 100% rename from src/pages/house_charge_tasks/modals/ChargeTasksCreate.tsx rename to src/pages/charge/tasks/modals/TaskCreate.tsx diff --git a/src/pages/charge/tasks/modals/TaskShow.tsx b/src/pages/charge/tasks/modals/TaskShow.tsx new file mode 100644 index 0000000..795010d --- /dev/null +++ b/src/pages/charge/tasks/modals/TaskShow.tsx @@ -0,0 +1,69 @@ +import { MyBetaModalFormProps, MyColumns, MyProTableProps } from '@/common'; +import { MyModal } from '@/components/MyModal'; +import { Apis } from '@/gen/Apis'; +import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums'; +import { ProTable } from '@ant-design/pro-components'; + +export default function AssetInfo(props: MyBetaModalFormProps) { + return ( + + MyProTableProps.request( + { ...params, house_charge_tasks_id: props?.item?.id }, + sort, + Apis.HouseCharage.HouseChargeTaskDetails.List, + ) + } + columns={[ + MyColumns.ID(), + { + title: '对象', + dataIndex: 'full_name', + search: false, + }, + MyColumns.EnumTag({ + title: '状态', + dataIndex: 'status', + valueEnum: HouseChargeTaskDetailsStatusEnum, + }), + + { + title: '收费标准', + dataIndex: ['house_charge_task', 'house_charge_standard', 'name'], + search: false, + }, + { + title: '账单月份', + render: (_, record) => { + return `${record.year}-${String(record.month).padStart( + 2, + '0', + )}`; + }, + }, + { + title: '计费周期', + render: (_, record) => { + return `${record.house_charge_task.start_date} 至 ${String( + record.house_charge_task.end_date, + ).padStart(2, '0')}`; + }, + search: false, + }, + { + title: '完成时间', + dataIndex: 'processed_time', + search: false, + }, + ]} + /> + } + /> + ); +} diff --git a/src/pages/house_charge_task_details/modals/ChargeTasksCreate.tsx b/src/pages/house_charge_task_details/modals/ChargeTasksCreate.tsx deleted file mode 100644 index 199fa3b..0000000 --- a/src/pages/house_charge_task_details/modals/ChargeTasksCreate.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { - MyBetaModalFormProps, - MyButtons, - MyModalFormProps, - rulesHelper, -} from '@/common'; -import { Selects } from '@/components/Select'; -import { Apis } from '@/gen/Apis'; -import { BetaSchemaForm } from '@ant-design/pro-components'; -import { Form, message } from 'antd'; - -export default function Create(props: MyBetaModalFormProps) { - const [form] = Form.useForm(); - return ( - - {...MyModalFormProps.props} - title={`创建${props.title}`} - width="480px" - layout="horizontal" - labelCol={{ span: 8 }} - wrapperCol={{ span: 16 }} - labelAlign="left" - trigger={} - key={new Date().getTime()} - form={form} - onOpenChange={(open: any) => { - if (open) { - form.resetFields(); // 清空表单数据 - } - }} - onFinish={async (values) => - Apis.HouseCharage.HouseChargeTasks.Store(values) - .then(() => { - props.reload?.(); - message.success(props.title + '账单任务创建成功'); - return true; - }) - .catch(() => false) - } - columns={[ - Selects?.AssetProjects({ - title: '选择项目', - key: 'asset_projects_id', - colProps: { span: 24 }, - formItemProps: { ...rulesHelper.text }, - }), - { - valueType: 'dependency', - name: ['asset_projects_id'], - columns: ({ asset_projects_id }) => { - return [ - Selects?.ChargeStandard({ - title: '选择收费标准', - key: 'house_charge_standards_id', - params: { - asset_projects_id: asset_projects_id, - }, - colProps: { span: 24 }, - formItemProps: { ...rulesHelper.text }, - fieldProps: { - showSearch: true, - }, - }), - ]; - }, - }, - { - key: 'month', - title: '选择生成月份', - valueType: 'date', - colProps: { span: 24 }, - fieldProps: { - picker: 'month', - format: 'YYYY-MM', - valueFormat: 'YYYY-MM', - style: { - width: '100%', - }, - }, - formItemProps: { ...rulesHelper.text }, - }, - { - key: 'start_date', - title: '计费开始日期', - valueType: 'date', - colProps: { span: 24 }, - fieldProps: { - style: { - width: '100%', - }, - }, - formItemProps: { ...rulesHelper.text }, - }, - { - key: 'end_date', - title: '计费结束日期', - valueType: 'date', - colProps: { span: 24 }, - fieldProps: { - style: { - width: '100%', - }, - }, - formItemProps: { ...rulesHelper.text }, - }, - ]} - /> - ); -} diff --git a/src/pages/house_charge_tasks/index.tsx b/src/pages/house_charge_tasks/index.tsx deleted file mode 100644 index a3ebd66..0000000 --- a/src/pages/house_charge_tasks/index.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { - MyButtons, - MyColumns, - MyPageContainer, - MyProTableProps, - usePageTabs, -} from '@/common'; -import { Apis } from '@/gen/Apis'; -import { HouseChargeTaskDetailsStatusEnum } from '@/gen/Enums'; -import { ProTable } from '@ant-design/pro-components'; -import { Space } from 'antd'; -import ChargeTasksCreate from './modals/ChargeTasksCreate'; - -export default function Index({ title = '账单任务' }) { - // 注册当前页面为标签页 - usePageTabs({ - tabKey: 'house_charge_tasks', - tabLabel: title, - }); - - return ( - - - MyProTableProps.request( - params, - sort, - Apis.HouseCharage.HouseChargeTasks.List, - ) - } - toolBarRender={(action) => [ - , - ]} - columns={[ - { - title: '任务ID', - dataIndex: 'house_charge_tasks_id', - search: false, - }, - MyColumns.EnumTag({ - title: '任务状态', - dataIndex: 'status', - valueEnum: HouseChargeTaskDetailsStatusEnum, - }), - { - title: '账单ID', - dataIndex: 'id', - search: false, - }, - { - title: '关联对象', - dataIndex: 'full_name', - search: false, - }, - { - title: '账单月份', - render: (_, record) => { - return `${record.year}-${String(record.month).padStart(2, '0')}`; - }, - }, - { - title: '计费开始日期', - dataIndex: ['house_charge_task', 'start_date'], - search: false, - }, - { - title: '计费结束日期', - dataIndex: ['house_charge_task', 'end_date'], - search: false, - }, - // MyColumns.UpdatedAt(), - MyColumns.CreatedAt(), - MyColumns.Option({ - render: (_, item: any, index, action) => ( - - - Apis.HouseCharage.HouseChargeTaskDetails.Delete({ - id: item.id, - }).then(() => action?.reload()) - } - /> - - ), - }), - ]} - /> - - ); -} diff --git a/yarn.lock b/yarn.lock index 7e7c9d0..237d19f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -629,6 +629,11 @@ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== +"@babel/runtime@^7.12.0": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" + integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== + "@babel/template@^7.22.15", "@babel/template@^7.27.2", "@babel/template@^7.3.3": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" @@ -1772,6 +1777,11 @@ "@tanstack/query-core" "4.40.0" use-sync-external-store "^1.2.0" +"@transloadit/prettier-bytes@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b" + integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -1810,6 +1820,11 @@ dependencies: "@babel/types" "^7.20.7" +"@types/event-emitter@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@types/event-emitter/-/event-emitter-0.3.5.tgz#ce9b513f72c50dcf0443a12165a93a79ba7a7092" + integrity sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ== + "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" @@ -2521,6 +2536,49 @@ resolved "https://registry.yarnpkg.com/@umijs/zod2ts/-/zod2ts-4.4.11.tgz#f41d646739d06fd08ae8bcdc8c748c40f3c7daf3" integrity sha512-B4CGKU6N9Qws5zNEu8TJjQgp61xAEdrBEmXGStXLl32f3zz0oUcIq/N4vBYciCDbwjHQKviqGcl3iSy2pbn7BA== +"@uppy/companion-client@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@uppy/companion-client/-/companion-client-2.2.2.tgz#c70b42fdcca728ef88b3eebf7ee3e2fa04b4923b" + integrity sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og== + dependencies: + "@uppy/utils" "^4.1.2" + namespace-emitter "^2.0.1" + +"@uppy/core@^2.1.1": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@uppy/core/-/core-2.3.4.tgz#260b85b6bf3aa03cdc67da231f8c69cfbfdcc84a" + integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ== + dependencies: + "@transloadit/prettier-bytes" "0.0.7" + "@uppy/store-default" "^2.1.1" + "@uppy/utils" "^4.1.3" + lodash.throttle "^4.1.1" + mime-match "^1.0.2" + namespace-emitter "^2.0.1" + nanoid "^3.1.25" + preact "^10.5.13" + +"@uppy/store-default@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@uppy/store-default/-/store-default-2.1.1.tgz#62a656a099bdaa012306e054d093754cb2d36e3e" + integrity sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ== + +"@uppy/utils@^4.1.2", "@uppy/utils@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@uppy/utils/-/utils-4.1.3.tgz#9d0be6ece4df25f228d30ef40be0f14208258ce3" + integrity sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw== + dependencies: + lodash.throttle "^4.1.1" + +"@uppy/xhr-upload@^2.0.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz#0d4e355332fe0c6eb372d7731315e04d02aeeb18" + integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ== + dependencies: + "@uppy/companion-client" "^2.2.2" + "@uppy/utils" "^4.1.2" + nanoid "^3.1.25" + "@vitejs/plugin-react@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28" @@ -2531,6 +2589,84 @@ "@babel/plugin-transform-react-jsx-source" "^7.19.6" react-refresh "^0.14.0" +"@wangeditor/basic-modules@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz#a9c3ccf4ef53332f29550d59d3676e15f395946f" + integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg== + dependencies: + is-url "^1.2.4" + +"@wangeditor/code-highlight@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz#90256857714d5c0cf83ac475aea64db7bf29a7cd" + integrity sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw== + dependencies: + prismjs "^1.23.0" + +"@wangeditor/core@^1.1.19": + version "1.1.19" + resolved "https://registry.yarnpkg.com/@wangeditor/core/-/core-1.1.19.tgz#f9155f7fd92d03cb1982405b3b82e54c31f1c2b0" + integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q== + dependencies: + "@types/event-emitter" "^0.3.3" + event-emitter "^0.3.5" + html-void-elements "^2.0.0" + i18next "^20.4.0" + scroll-into-view-if-needed "^2.2.28" + slate-history "^0.66.0" + +"@wangeditor/editor-for-react@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@wangeditor/editor-for-react/-/editor-for-react-1.0.6.tgz#c77fa5651e196bb7e5a63e4abf0e32d54d4f38af" + integrity sha512-KJNSfgMr5Blzae3oyaiz20flMKHZHnvsz4bCYQKDCUs/qkvC+xNTnwedlCmhGP187oPWPEypCIYI8Zg6sz0psQ== + +"@wangeditor/editor@^5.1.23": + version "5.1.23" + resolved "https://registry.yarnpkg.com/@wangeditor/editor/-/editor-5.1.23.tgz#c9d2007b7cb0ceef6b72692b4ee87b01ee2367b3" + integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ== + dependencies: + "@uppy/core" "^2.1.1" + "@uppy/xhr-upload" "^2.0.3" + "@wangeditor/basic-modules" "^1.1.7" + "@wangeditor/code-highlight" "^1.0.3" + "@wangeditor/core" "^1.1.19" + "@wangeditor/list-module" "^1.0.5" + "@wangeditor/table-module" "^1.1.4" + "@wangeditor/upload-image-module" "^1.0.2" + "@wangeditor/video-module" "^1.1.4" + dom7 "^3.0.0" + is-hotkey "^0.2.0" + lodash.camelcase "^4.3.0" + lodash.clonedeep "^4.5.0" + lodash.debounce "^4.0.8" + lodash.foreach "^4.5.0" + lodash.isequal "^4.5.0" + lodash.throttle "^4.1.1" + lodash.toarray "^4.4.0" + nanoid "^3.2.0" + slate "^0.72.0" + snabbdom "^3.1.0" + +"@wangeditor/list-module@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@wangeditor/list-module/-/list-module-1.0.5.tgz#3fc0b167acddf885536b45fa0c127f9c6adaea33" + integrity sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ== + +"@wangeditor/table-module@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@wangeditor/table-module/-/table-module-1.1.4.tgz#757d4a5868b2b658041cd323854a4d707c8347e9" + integrity sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w== + +"@wangeditor/upload-image-module@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz#89e9b9467e10cbc6b11dc5748e08dd23aaebee30" + integrity sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA== + +"@wangeditor/video-module@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@wangeditor/video-module/-/video-module-1.1.4.tgz#b9df1b3ab2cd53f678b19b4d927e200774a6f532" + integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg== + "@xobotyi/scrollbar-width@^1.9.5": version "1.9.5" resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" @@ -4113,6 +4249,13 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +dom7@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331" + integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g== + dependencies: + ssr-window "^3.0.0-alpha.1" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -5504,6 +5647,11 @@ html-tags@^3.2.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== + html-webpack-plugin@5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" @@ -5569,6 +5717,13 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== +i18next@^20.4.0: + version "20.6.1" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345" + integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A== + dependencies: + "@babel/runtime" "^7.12.0" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5615,6 +5770,11 @@ immer@^8.0.4: resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a" integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ== +immer@^9.0.6: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" @@ -5899,6 +6059,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hotkey@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef" + integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw== + is-inside-container@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" @@ -6017,6 +6182,11 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: dependencies: which-typed-array "^1.1.16" +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" @@ -6515,11 +6685,31 @@ lodash-es@^4.17.21: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -6530,6 +6720,11 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw== + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -6717,6 +6912,13 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== +mime-match@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" + integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg== + dependencies: + wildcard "^1.1.0" + mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -6816,6 +7018,11 @@ ms@2.1.3, ms@^2.1.1, ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +namespace-emitter@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c" + integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g== + nano-css@^5.6.2: version "5.6.2" resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.6.2.tgz#584884ddd7547278f6d6915b6805069742679a32" @@ -6830,7 +7037,7 @@ nano-css@^5.6.2: stacktrace-js "^2.0.2" stylis "^4.3.0" -nanoid@^3.3.11: +nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== @@ -7793,6 +8000,11 @@ postcss@^8.4.13, postcss@^8.4.21, postcss@^8.4.27, postcss@^8.4.31, postcss@^8.4 picocolors "^1.1.1" source-map-js "^1.2.1" +preact@^10.5.13: + version "10.27.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.27.2.tgz#19b9009c1be801a76a0aaf0fe5ba665985a09312" + integrity sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -7842,6 +8054,11 @@ pretty-format@^24: ansi-styles "^3.2.0" react-is "^16.8.4" +prismjs@^1.23.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" + integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9217,7 +9434,7 @@ screenfull@^5.1.0: resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== -scroll-into-view-if-needed@^2.2.25: +scroll-into-view-if-needed@^2.2.25, scroll-into-view-if-needed@^2.2.28: version "2.2.31" resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587" integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA== @@ -9422,6 +9639,22 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slate-history@^0.66.0: + version "0.66.0" + resolved "https://registry.yarnpkg.com/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940" + integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng== + dependencies: + is-plain-object "^5.0.0" + +slate@^0.72.0: + version "0.72.8" + resolved "https://registry.yarnpkg.com/slate/-/slate-0.72.8.tgz#5a018edf24e45448655293a68bfbcf563aa5ba81" + integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw== + dependencies: + immer "^9.0.6" + is-plain-object "^5.0.0" + tiny-warning "^1.0.3" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -9439,6 +9672,11 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +snabbdom@^3.1.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/snabbdom/-/snabbdom-3.6.2.tgz#57dd66878f6320497fa7f67941df356a045c75a1" + integrity sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q== + sonic-boom@^2.2.1: version "2.8.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" @@ -9578,6 +9816,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssr-window@^3.0.0-alpha.1: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37" + integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA== + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -10044,6 +10287,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tinycolor2@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" @@ -10552,6 +10800,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wildcard@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5" + integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng== + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" -- 2.47.2