Merge pull request 'feat:更新账单任务、项目公告、项目活动' (#9) from develop into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 3m41s

Reviewed-on: https://code.juyouwu.cn/pay/pay-admin/pulls/9
This commit is contained in:
uiujun 2025-09-22 00:05:40 +08:00
commit 31ed649a27
33 changed files with 1652 additions and 406 deletions

View File

@ -14,6 +14,8 @@
"@ant-design/icons": "^5.0.1", "@ant-design/icons": "^5.0.1",
"@ant-design/pro-components": "^2.8.10", "@ant-design/pro-components": "^2.8.10",
"@umijs/max": "^4.3.10", "@umijs/max": "^4.3.10",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-react": "^1.0.6",
"antd": "^5.4.0", "antd": "^5.4.0",
"axios": "^1.7.2", "axios": "^1.7.2",
"dayjs": "^1.11.12", "dayjs": "^1.11.12",

View File

@ -25,10 +25,10 @@ function MyEditor(props: any) {
file: any, file: any,
onSuccess: (url: string, file: any) => void, onSuccess: (url: string, file: any) => void,
) => { ) => {
Apis.Auth.PreUpload({ Apis.Common.Auth.PreUpload({
filename: file.name, filename: file.name,
alc: 'public-read', alc: 'public-read',
}).then(async (res) => { }).then(async (res: any) => {
axios axios
.put(res.data.url, file, { .put(res.data.url, file, {
headers: res.data.headers, headers: res.data.headers,
@ -102,9 +102,9 @@ function MyEditor(props: any) {
value={html} value={html}
key="Editor2" key="Editor2"
onCreated={setEditor} onCreated={setEditor}
onChange={(editor) => props?.onChange?.(editor.getHtml())} onChange={(editor: any) => props?.onChange?.(editor.getHtml())}
mode="default" mode="default"
style={{ height: '500px', overflowY: 'hidden' }} style={{ height: '320px', overflowY: 'hidden' }}
/> />
</div> </div>
); );

View File

@ -1,12 +1,19 @@
import { MyButtons } from '@/common'; import { MyButtons } from '@/common';
import { Modal } from 'antd'; import { Modal } from 'antd';
import { useImperativeHandle, useState } from 'react'; import { useEffect, useImperativeHandle, useState } from 'react';
export function MyModal(props?: any) { export function MyModal(props?: any) {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const close = () => { const close = () => {
setOpen(false); setOpen(false);
}; };
useEffect(() => {
if (open && props?.onOpen) {
props.onOpen();
}
}, [open, props?.onOpen]);
useImperativeHandle(props.myRef, () => ({ useImperativeHandle(props.myRef, () => ({
close, close,
})); }));

60
src/gen/ApiTypes.d.ts vendored
View File

@ -1,4 +1,64 @@
declare namespace ApiTypes { 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 Archive {
namespace HouseOccupants { namespace HouseOccupants {
type List = { type List = {

View File

@ -2,6 +2,45 @@ import { MyResponseType } from '@/common';
import { request } from '@umijs/max'; import { request } from '@umijs/max';
export const Apis = { export const Apis = {
Activity: {
Activities: {
List(data?: ApiTypes.Activity.Activities.List): Promise<MyResponseType> {
return request('admin/activity/activities/list', { data });
},
Store(data: ApiTypes.Activity.Activities.Store): Promise<MyResponseType> {
return request('admin/activity/activities/store', { data });
},
Update(data: ApiTypes.Activity.Activities.Update): Promise<MyResponseType> {
return request('admin/activity/activities/update', { data });
},
ChangePublishStatus(data: ApiTypes.Activity.Activities.ChangePublishStatus): Promise<MyResponseType> {
return request('admin/activity/activities/change_publish_status', { data });
},
Show(data: ApiTypes.Activity.Activities.Show): Promise<MyResponseType> {
return request('admin/activity/activities/show', { data });
},
SoftDelete(data: ApiTypes.Activity.Activities.SoftDelete): Promise<MyResponseType> {
return request('admin/activity/activities/soft_delete', { data });
},
Restore(data: ApiTypes.Activity.Activities.Restore): Promise<MyResponseType> {
return request('admin/activity/activities/restore', { data });
},
Delete(data: ApiTypes.Activity.Activities.Delete): Promise<MyResponseType> {
return request('admin/activity/activities/delete', { data });
},
},
ActivityEnrolls: {
List(data?: ApiTypes.Activity.ActivityEnrolls.List): Promise<MyResponseType> {
return request('admin/activity/activity_enrolls/list', { data });
},
Show(data: ApiTypes.Activity.ActivityEnrolls.Show): Promise<MyResponseType> {
return request('admin/activity/activity_enrolls/show', { data });
},
ChangeStatus(data: ApiTypes.Activity.ActivityEnrolls.ChangeStatus): Promise<MyResponseType> {
return request('admin/activity/activity_enrolls/change_status', { data });
},
},
},
Archive: { Archive: {
HouseOccupants: { HouseOccupants: {
List(data?: ApiTypes.Archive.HouseOccupants.List): Promise<MyResponseType> { List(data?: ApiTypes.Archive.HouseOccupants.List): Promise<MyResponseType> {

View File

@ -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 // AssetHousesOrientationEnum
export const AssetHousesOrientationEnum= { export const AssetHousesOrientationEnum= {
'East': {"text":"东","color":"#007bff","value":"East"}, 'East': {"text":"东","color":"#007bff","value":"East"},
@ -126,7 +154,7 @@ export const BannersTypeEnum= {
// 缓存类型 // 缓存类型
export const CacheTypeEnum= { export const CacheTypeEnum= {
'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#69355c","value":"MobilePhoneVerificationCode"}, 'MobilePhoneVerificationCode': {"text":"手机验证码","color":"#5acfb3","value":"MobilePhoneVerificationCode"},
}; };
// CompaniesMerchantTypeEnum // CompaniesMerchantTypeEnum

View File

@ -46,7 +46,7 @@ export default function Index({ title = '项目账户' }) {
// width: 360, // width: 360,
}, },
{ {
title: '收款账号名称', title: '收款名称',
dataIndex: ['receipt_account', 'company_name'], dataIndex: ['receipt_account', 'company_name'],
}, },
{ {

View File

@ -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 (
<MyPageContainer
title={title}
enableTabs={true}
tabKey="activity"
tabLabel={title}
>
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
MyProTableProps.request(params, sort, Apis.Activity.Activities.List)
}
toolBarRender={(action) => [
<ActivityCreate key="Create" reload={action?.reload} title={title} />,
]}
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) => (
<Space key={index}>
<ActivityShow item={item} />
{(!item.end_time || new Date(item.end_time) > new Date()) && (
<ActivityUpdate
item={item}
reload={action?.reload}
// title={title}
/>
)}
{(!item.end_time || new Date(item.end_time) > new Date()) && (
<MyButtons.Default
title={
item.publish_status ===
ActivitiesPublishStatusEnum.Unpublished.value
? '发布'
: item.publish_status ===
ActivitiesPublishStatusEnum.Published.value
? '下架'
: '重新发布'
}
type="primary"
isConfirm
description={
item.publish_status ===
ActivitiesPublishStatusEnum.Unpublished.value
? '确认发布此活动吗?'
: item.publish_status ===
ActivitiesPublishStatusEnum.Published.value
? '确认下架此活动吗?'
: '确认重新发布此活动吗?'
}
onConfirm={() => {
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 && (
<EnrollsList
item={item}
title="报名"
reload={action?.reload}
/>
)}
<MyButtons.Delete
onConfirm={() =>
Apis.Activity.Activities.Delete({
id: item.id,
}).then(() => action?.reload())
}
/>
</Space>
),
}),
]}
/>
</MyPageContainer>
);
}

View File

@ -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 (
<BetaSchemaForm<ApiTypes.Activity.Activities.Store>
{...MyModalFormProps.props}
title={`添加活动`}
layout="horizontal"
labelCol={{ span: 4 }}
wrapperCol={{ span: 20 }}
labelAlign="left"
width="950px"
trigger={<MyButtons.Create title={`添加活动`} />}
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: () => <MyEditor />,
},
]}
/>
);
}

View File

@ -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<any>({});
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 (
<MyModal
title={props.title || '查看'}
width={800}
onOpen={getShow}
node={
<ProCard>
<Spin spinning={loading}>
<ProDescriptions
// bordered
column={1}
size="small"
>
<ProDescriptions.Item label=" 关联项目">
{show?.activity_projects
?.map((project: any) => project?.asset_project?.name)
.join(', ') || '-'}
</ProDescriptions.Item>
<ProDescriptions.Item label="活动标题">
{show?.title || '-'}
</ProDescriptions.Item>
<ProDescriptions.Item label="活动时间">
<Space>
<renderTextHelper.Tag
Enums={ActivitiesStatusEnum}
value={props?.item?.status}
key="status"
/>
{show?.start_time || '-'} {show?.end_time || '-'}
</Space>
</ProDescriptions.Item>
<ProDescriptions.Item label="发布时间">
<Space>
<renderTextHelper.Tag
Enums={ActivitiesPublishStatusEnum}
value={props?.item?.publish_status}
key="publish_status"
/>
<renderTextHelper.Tag
Enums={ActivitiesPublishTypeEnum}
value={props?.item?.publish_type}
key="publish_type"
/>
{show?.publish_time || '-'}
</Space>
</ProDescriptions.Item>
<ProDescriptions.Item label="活动内容">
<div
style={{
border: '1px solid #ccc',
borderRadius: '6px',
padding: '12px',
maxHeight: '300px',
width: '100%',
overflow: 'auto',
backgroundColor: '#fafafa',
}}
dangerouslySetInnerHTML={{
__html: show?.content || '暂无内容',
}}
/>
</ProDescriptions.Item>
<ProDescriptions.Item label="创建时间">
{show?.created_at || '-'}
</ProDescriptions.Item>
<ProDescriptions.Item label="最近修改">
{show?.updated_at || '-'}
</ProDescriptions.Item>
</ProDescriptions>
</Spin>
</ProCard>
}
/>
);
}

View File

@ -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 (
<BetaSchemaForm<ApiTypes.Activity.Activities.Update>
{...MyModalFormProps.props}
title={`编辑活动内容`}
trigger={<MyButtons.Edit />}
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: () => <MyEditor />,
initialValue: props.item?.content,
},
]}
/>
);
}

View File

@ -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 (
<MyModal
title={props.title || '报名'}
type={props.item?.type || 'primary'}
width="900px"
node={
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
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) => (
<Space key={index}>
<MyButtons.Default
title={
item.status === ActivityEnrollsStatusEnum.Success.value
? '取消报名'
: item.status ===
ActivityEnrollsStatusEnum.Cancelled.value
? '重新报名'
: '报名'
}
isConfirm
description={
item.status === ActivityEnrollsStatusEnum.Success.value
? '确认取消报名吗?'
: item.status ===
ActivityEnrollsStatusEnum.Cancelled.value
? '确认重新报名吗?'
: '确认报名吗?'
}
onConfirm={() => {
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());
}}
/>
<EnrollsList
item={item}
title="报名信息"
reload={action?.reload}
/>
</Space>
),
}),
]}
/>
}
/>
);
}

View File

@ -6,6 +6,7 @@ import {
usePageTabs, usePageTabs,
} from '@/common'; } from '@/common';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max'; import { useNavigate } from '@umijs/max';
import { Space } from 'antd'; import { Space } from 'antd';
@ -76,52 +77,37 @@ export default function Index({ title = '项目公告' }) {
), ),
}, },
{ {
title: '公告内容', title: '落款日期',
dataIndex: 'content',
valueType: 'textarea', // 仅影响表单编辑时的输入类型,不影响表格展示
search: false,
width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽)
render: (text) => (
<div
style={{
width: '100%', // 继承列宽
// height: '60px', // 设置固定高度约显示3行文本
overflow: 'hidden', // 超出隐藏
textOverflow: 'ellipsis', // 省略号
display: '-webkit-box',
WebkitBoxOrient: 'vertical',
WebkitLineClamp: 2, // 显示3行
}}
>
{text}
</div>
),
},
{
title: '发布日期',
dataIndex: 'publish_at', dataIndex: 'publish_at',
valueType: 'date', valueType: 'date',
search: false, search: false,
}, },
MyColumns.EnumTag({
title: '发布方式',
dataIndex: 'publish_type',
valueEnum: MsgPropertyAnnouncementsPublishTypeEnum,
search: false,
}),
{ {
title: '是否发布小程序', title: '发布时间',
dataIndex: 'is_publish', dataIndex: 'schedule_publish_at',
render: (text) => (text ? '是' : '否'), valueType: 'dateTime',
search: false, search: false,
}, },
{
title: '是否发布',
dataIndex: 'is_publish',
search: false,
render: (text) => (text ? '是' : '否'),
},
MyColumns.SoftDelete({ MyColumns.SoftDelete({
title: '启/禁用', title: '启/禁用',
onRestore: Apis.Msg.MsgPropertyAnnouncements.Restore, onRestore: Apis.Msg.MsgPropertyAnnouncements.Restore,
onSoftDelete: Apis.Msg.MsgPropertyAnnouncements.SoftDelete, onSoftDelete: Apis.Msg.MsgPropertyAnnouncements.SoftDelete,
search: false, search: false,
}), }),
{ MyColumns.UpdatedAt(),
//创建日期
title: '创建日期',
dataIndex: 'created_at',
valueType: 'date',
search: false,
},
MyColumns.Option({ MyColumns.Option({
render: (_, item: any, index, action) => ( render: (_, item: any, index, action) => (
<Space key={index}> <Space key={index}>
@ -131,6 +117,30 @@ export default function Index({ title = '项目公告' }) {
reload={action?.reload} reload={action?.reload}
// title={title} // title={title}
/> />
<MyButtons.Default
title={item.is_publish === 0 ? '发布' : '下架'}
type="primary"
isConfirm
description={
item.is_publish === 0
? '确认发布此公告吗?'
: '确认下架此公告吗?'
}
onConfirm={() => {
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());
}}
/>
<MyButtons.Delete <MyButtons.Delete
onConfirm={() => onConfirm={() =>
Apis.Msg.MsgPropertyAnnouncements.Delete({ Apis.Msg.MsgPropertyAnnouncements.Delete({

View File

@ -1,11 +1,14 @@
import { import {
MyBetaModalFormProps, MyBetaModalFormProps,
MyButtons, MyButtons,
MyFormItems,
MyModalFormProps, MyModalFormProps,
rulesHelper, rulesHelper,
} from '@/common'; } from '@/common';
import MyEditor from '@/common/components/Editor';
import { Selects } from '@/components/Select'; import { Selects } from '@/components/Select';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components'; import { BetaSchemaForm } from '@ant-design/pro-components';
import { Form, message } from 'antd'; import { Form, message } from 'antd';
@ -15,14 +18,18 @@ export default function Create(props: MyBetaModalFormProps) {
<BetaSchemaForm<ApiTypes.Msg.MsgPropertyAnnouncements.Store> <BetaSchemaForm<ApiTypes.Msg.MsgPropertyAnnouncements.Store>
{...MyModalFormProps.props} {...MyModalFormProps.props}
title={`添加公告`} title={`添加公告`}
wrapperCol={{ span: 24 }} layout="horizontal"
width="600px" labelCol={{ span: 4 }}
wrapperCol={{ span: 20 }}
labelAlign="left"
width="950px"
trigger={<MyButtons.Create title={`添加公告`} />} trigger={<MyButtons.Create title={`添加公告`} />}
key={new Date().getTime()} key={new Date().getTime()}
form={form} form={form}
onOpenChange={(open: any) => { onOpenChange={(open: any) => {
if (open) { if (open) {
form.resetFields(); // 清空表单数据 form.resetFields(); // 清空表单数据
form.setFieldValue('is_publish', 1);
} }
}} }}
onFinish={async (values) => onFinish={async (values) =>
@ -48,58 +55,88 @@ export default function Create(props: MyBetaModalFormProps) {
required: true, required: true,
}), }),
]), ]),
{ {
key: 'title', key: 'title',
title: '公告标题', title: '公告标题',
colProps: { span: 24 }, 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', key: 'content',
title: '公告内容', title: '公告内容',
valueType: 'textarea',
colProps: { span: 24 }, colProps: { span: 24 },
formItemProps: { ...rulesHelper.text },
fieldProps: { fieldProps: {
autoSize: { minRows: 4, maxRows: 6 }, mode: 'simple',
}, },
renderFormItem: () => <MyEditor />,
}, },
{ {
key: 'publish_at', key: 'publish_at',
title: '内容显示的发布日期', title: '落款日期',
valueType: 'date', valueType: 'date',
colProps: { span: 12 }, colProps: { span: 24 },
fieldProps: { fieldProps: {
style: { width: '100%' }, style: { width: '40%' },
}, },
formItemProps: { ...rulesHelper.text }, formItemProps: { ...rulesHelper.text },
}, },
// Selects?.AssetProjects({ // {
// title: '请选择项目', // key: 'sort',
// key: 'asset_projects_id', // title: '排序',
// valueType: 'digit',
// colProps: { span: 12 }, // colProps: { span: 12 },
// formItemProps: { ...rulesHelper.text }, // tooltip: '数值越大越靠前',
// }), // fieldProps: {
{ // placeholder: '数值越大越靠前',
key: 'is_publish', // min: 0,
title: '是否立刻发布', // style: { width: '100%' },
tooltip: '如果选择了,那么内容会立刻发布到小程序中', // },
valueType: 'switch', // initialValue: 0,
colProps: { span: 8 }, // },
},
{
key: 'sort',
title: '排序',
valueType: 'digit',
colProps: { span: 12 },
tooltip: '数值越大越靠前',
fieldProps: {
placeholder: '数值越大越靠前',
min: 0,
style: { width: '100%' },
},
initialValue: 0,
},
]} ]}
/> />
); );

View File

@ -1,17 +1,39 @@
import { MyBetaModalFormProps } from '@/common'; import { MyBetaModalFormProps, renderTextHelper } from '@/common';
import { MyModal } from '@/components/MyModal'; import { MyModal } from '@/components/MyModal';
import { Apis } from '@/gen/Apis';
import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums';
import { ProCard, ProDescriptions } from '@ant-design/pro-components'; 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<any>({});
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 ( return (
<MyModal <MyModal
title={props.title || '查看'} title={props.title || '查看'}
// width="40vw" width={800}
width={600} onOpen={getShow}
// style={{ maxWidth: '650px' }}
node={ node={
<ProCard> <ProCard>
<ProDescriptions <ProDescriptions
@ -27,25 +49,42 @@ export default function info(props: MyBetaModalFormProps) {
{props?.item?.title || '-'} {props?.item?.title || '-'}
</ProDescriptions.Item> </ProDescriptions.Item>
<ProDescriptions.Item label="发布方式">
<Space>
{props?.item?.is_publish ? '已发布' : '未发布'}
<renderTextHelper.Tag
Enums={MsgPropertyAnnouncementsPublishTypeEnum}
value={props?.item?.publish_type}
key="publish_type"
/>
{show?.schedule_publish_at || '-'}
</Space>
</ProDescriptions.Item>
<ProDescriptions.Item label="公告内容"> <ProDescriptions.Item label="公告内容">
<div <div
style={{ style={{
whiteSpace: 'pre-wrap', border: '1px solid #ccc',
borderRadius: '6px',
padding: '12px',
maxHeight: '300px', maxHeight: '300px',
width: '100%',
overflow: 'auto', overflow: 'auto',
backgroundColor: '#fafafa',
}} }}
> dangerouslySetInnerHTML={{
{props?.item?.content || '-'} __html: props?.item?.content || '暂无内容',
</div> }}
/>
</ProDescriptions.Item> </ProDescriptions.Item>
<ProDescriptions.Item label="发布日期">
<ProDescriptions.Item label="落款日期">
{props?.item?.publish_at || '-'} {props?.item?.publish_at || '-'}
</ProDescriptions.Item> </ProDescriptions.Item>
<ProDescriptions.Item label="创建时间"> <ProDescriptions.Item label="创建时间">
{props?.item?.created_at || '-'} {props?.item?.created_at || '-'}
</ProDescriptions.Item> </ProDescriptions.Item>
<ProDescriptions.Item label="是否发布小程序"> <ProDescriptions.Item label="最近修改">
{props?.item?.is_publish ? '是' : '否'} {props?.item?.updated_at || '-'}
</ProDescriptions.Item> </ProDescriptions.Item>
</ProDescriptions> </ProDescriptions>
</ProCard> </ProCard>

View File

@ -1,10 +1,13 @@
import { import {
MyBetaModalFormProps, MyBetaModalFormProps,
MyButtons, MyButtons,
MyFormItems,
MyModalFormProps, MyModalFormProps,
rulesHelper, rulesHelper,
} from '@/common'; } from '@/common';
import MyEditor from '@/common/components/Editor';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums';
import { BetaSchemaForm } from '@ant-design/pro-components'; import { BetaSchemaForm } from '@ant-design/pro-components';
import { Form, message } from 'antd'; import { Form, message } from 'antd';
@ -15,8 +18,11 @@ export default function Update(props: MyBetaModalFormProps) {
{...MyModalFormProps.props} {...MyModalFormProps.props}
title={`编辑公告内容`} title={`编辑公告内容`}
trigger={<MyButtons.Edit />} trigger={<MyButtons.Edit />}
wrapperCol={{ span: 24 }} layout="horizontal"
width="600px" labelCol={{ span: 4 }}
wrapperCol={{ span: 20 }}
labelAlign="left"
width="950px"
key={new Date().getTime()} key={new Date().getTime()}
form={form} form={form}
onOpenChange={(open: any) => { onOpenChange={(open: any) => {
@ -42,49 +48,68 @@ export default function Update(props: MyBetaModalFormProps) {
key: 'title', key: 'title',
title: '公告标题', title: '公告标题',
colProps: { span: 24 }, 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', key: 'content',
title: '公告内容', title: '公告内容',
valueType: 'textarea',
colProps: { span: 24 }, colProps: { span: 24 },
formItemProps: { ...rulesHelper.text }, renderFormItem: () => <MyEditor />,
fieldProps: { initialValue: props.item?.content,
autoSize: { minRows: 4, maxRows: 6 },
},
}, },
{ {
key: 'publish_at', key: 'publish_at',
title: '内容显示的发布日期', title: '落款日期',
valueType: 'date', valueType: 'date',
colProps: { span: 12 }, colProps: { span: 24 },
fieldProps: { fieldProps: {
style: { width: '100%' }, style: { width: '40%' },
}, },
formItemProps: { ...rulesHelper.text }, 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,
},
]} ]}
/> />
); );

View File

@ -7,6 +7,7 @@ import { useEffect, useState } from 'react';
import AssetInfo from '../modals/AssetInfo'; import AssetInfo from '../modals/AssetInfo';
import AssetUpdate from '../modals/AssetUpdate'; import AssetUpdate from '../modals/AssetUpdate';
import BindCompany from '../modals/BindCompany'; import BindCompany from '../modals/BindCompany';
import Activities from '../table/Activities';
import Announcement from '../table/Announcement'; import Announcement from '../table/Announcement';
import AssetAccounts from '../table/AssetAccounts'; import AssetAccounts from '../table/AssetAccounts';
import MyAssetBuildings from '../table/AssetBuildings'; import MyAssetBuildings from '../table/AssetBuildings';
@ -79,6 +80,12 @@ export default function Show({ title }: { title?: string } = {}) {
closable: false, closable: false,
children: <Announcement item={data} />, children: <Announcement item={data} />,
}, },
{
label: '项目活动',
key: 'activities',
closable: false,
children: <Activities item={data} />,
},
{ {
label: '便民服务', label: '便民服务',
key: 'convenience_services', key: 'convenience_services',

View File

@ -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<any>();
useEffect(() => {
actionLooks?.current.reloadAndRest();
}, [rest.loadmore]);
return (
<>
<ProTable<Record<any, any>>
{...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) => [
<ActivityCreate
key="Create"
item={rest.item}
reload={action?.reload}
/>,
]}
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) => (
<Space key={index}>
<ActivityShow item={item} />
<ActivityUpdate
item={item}
reload={action?.reload}
// title={title}
/>
<MyButtons.Default
title={
item.publish_status ===
ActivitiesPublishStatusEnum.Unpublished.value
? '发布'
: item.publish_status ===
ActivitiesPublishStatusEnum.Published.value
? '下架'
: '重新发布'
}
isConfirm
description={
item.publish_status ===
ActivitiesPublishStatusEnum.Unpublished.value
? '确认发布此活动吗?'
: item.publish_status ===
ActivitiesPublishStatusEnum.Published.value
? '确认下架此活动吗?'
: '确认重新发布此活动吗?'
}
onConfirm={() => {
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());
}}
/>
<EnrollsList
item={item}
title="报名信息"
reload={action?.reload}
/>
<MyButtons.Delete
onConfirm={() =>
Apis.Activity.Activities.Delete({
id: item.id,
}).then(() => action?.reload())
}
/>
</Space>
),
}),
]}
/>
</>
);
}

View File

@ -1,5 +1,6 @@
import { MyButtons, MyColumns, MyProTableProps } from '@/common'; import { MyButtons, MyColumns, MyProTableProps } from '@/common';
import { Apis } from '@/gen/Apis'; import { Apis } from '@/gen/Apis';
import { MsgPropertyAnnouncementsPublishTypeEnum } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd'; import { Space } from 'antd';
import { useEffect, useRef } from 'react'; import { useEffect, useRef } from 'react';
@ -35,6 +36,14 @@ export default function Index({ ...rest }) {
search={false} search={false}
columns={[ columns={[
MyColumns.ID(), MyColumns.ID(),
{
title: '关联项目',
dataIndex: ['asset_project', 'name'],
search: false,
render: (_, record) => {
return record?.asset_project?.name;
},
},
{ {
title: '公告标题', title: '公告标题',
dataIndex: 'title', dataIndex: 'title',
@ -56,38 +65,28 @@ export default function Index({ ...rest }) {
), ),
}, },
{ {
title: '公告内容', title: '落款日期',
dataIndex: 'content',
valueType: 'textarea', // 仅影响表单编辑时的输入类型,不影响表格展示
search: false,
width: 200, // 关键:固定列宽(若父容器过窄,可设 minWidth: 200 优先保证列宽)
render: (text) => (
<div
style={{
width: '100%', // 继承列宽
// height: '60px', // 设置固定高度约显示3行文本
overflow: 'hidden', // 超出隐藏
textOverflow: 'ellipsis', // 省略号
display: '-webkit-box',
WebkitBoxOrient: 'vertical',
WebkitLineClamp: 2, // 显示3行
}}
>
{text}
</div>
),
},
{
title: '发布日期',
dataIndex: 'publish_at', dataIndex: 'publish_at',
valueType: 'date', valueType: 'date',
search: false, search: false,
}, },
{ MyColumns.EnumTag({
title: '是否发布小程序', title: '发布方式',
dataIndex: 'is_publish', dataIndex: 'publish_type',
render: (text) => (text ? '是' : '否'), valueEnum: MsgPropertyAnnouncementsPublishTypeEnum,
search: false, search: false,
}),
{
title: '发布时间',
dataIndex: 'schedule_publish_at',
valueType: 'dateTime',
search: false,
},
{
title: '是否发布',
dataIndex: 'is_publish',
search: false,
render: (text) => (text ? '是' : '否'),
}, },
MyColumns.SoftDelete({ MyColumns.SoftDelete({
title: '启/禁用', title: '启/禁用',
@ -95,13 +94,7 @@ export default function Index({ ...rest }) {
onSoftDelete: Apis.Msg.MsgPropertyAnnouncements.SoftDelete, onSoftDelete: Apis.Msg.MsgPropertyAnnouncements.SoftDelete,
search: false, search: false,
}), }),
{ MyColumns.UpdatedAt(),
//创建日期
title: '创建日期',
dataIndex: 'created_at',
valueType: 'date',
search: false,
},
MyColumns.Option({ MyColumns.Option({
render: (_, item: any, index, action) => ( render: (_, item: any, index, action) => (
<Space key={index}> <Space key={index}>
@ -111,6 +104,30 @@ export default function Index({ ...rest }) {
reload={action?.reload} reload={action?.reload}
// title={title} // title={title}
/> />
<MyButtons.Default
title={item.is_publish === 0 ? '发布' : '下架'}
type="primary"
isConfirm
description={
item.is_publish === 0
? '确认发布此公告吗?'
: '确认下架此公告吗?'
}
onConfirm={() => {
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());
}}
/>
<MyButtons.Delete <MyButtons.Delete
onConfirm={() => onConfirm={() =>
Apis.Msg.MsgPropertyAnnouncements.Delete({ Apis.Msg.MsgPropertyAnnouncements.Delete({

View File

@ -12,9 +12,9 @@ import {
HouseChargeStandardsCalculationPeriodEnum, HouseChargeStandardsCalculationPeriodEnum,
HouseChargeStandardsPriceAlgorithmEnum, HouseChargeStandardsPriceAlgorithmEnum,
} from '@/gen/Enums'; } from '@/gen/Enums';
import ChargeStandardCreate from '@/pages/house_charge_standard/modals/ChargeStandardCreate'; import ChargeStandardCreate from '@/pages/charge/standard/modals/ChargeStandardCreate';
import ChargeStandardHasHouse from '@/pages/house_charge_standard/modals/ChargeStandardHasHouse'; import ChargeStandardHasHouse from '@/pages/charge/standard/modals/ChargeStandardHasHouse';
import ChargeStandardUpdate from '@/pages/house_charge_standard/modals/ChargeStandardUpdate'; import ChargeStandardUpdate from '@/pages/charge/standard/modals/ChargeStandardUpdate';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { useNavigate } from '@umijs/max'; import { useNavigate } from '@umijs/max';
import { Space } from 'antd'; import { Space } from 'antd';

View File

@ -12,12 +12,13 @@ import {
} from '@/gen/Enums'; } from '@/gen/Enums';
import { ProTable } from '@ant-design/pro-components'; import { ProTable } from '@ant-design/pro-components';
import { Space } from 'antd'; import { Space } from 'antd';
import ChargeTasksCreate from './modals/ChargeTasksCreate'; import TaskCreate from './modals/TaskCreate';
import TaskShow from './modals/TaskShow';
export default function Index({ title = '账单任务' }) { export default function Index({ title = '账单任务' }) {
// 注册当前页面为标签页 // 注册当前页面为标签页
usePageTabs({ usePageTabs({
tabKey: 'charge_tasks', tabKey: 'house_charge_tasks',
tabLabel: title, tabLabel: title,
}); });
@ -25,7 +26,7 @@ export default function Index({ title = '账单任务' }) {
<MyPageContainer <MyPageContainer
title={title} title={title}
enableTabs={true} enableTabs={true}
tabKey="bills" tabKey="house_charge_tasks"
tabLabel={title} tabLabel={title}
> >
<ProTable <ProTable
@ -38,66 +39,65 @@ export default function Index({ title = '账单任务' }) {
) )
} }
toolBarRender={(action) => [ toolBarRender={(action) => [
<ChargeTasksCreate <TaskCreate key="Create" reload={action?.reload} title="账单任务" />,
key="Create"
reload={action?.reload}
title={title}
/>,
]} ]}
columns={[ columns={[
MyColumns.ID(), {
MyColumns.EnumTag({ title: '机构',
title: '任务状态', dataIndex: ['company', 'name'],
dataIndex: 'status', search: false,
valueEnum: HouseChargeTasksStatusEnum, },
}), {
title: '任务ID',
dataIndex: 'id',
search: false,
},
MyColumns.EnumTag({ MyColumns.EnumTag({
title: '创建类型', title: '创建类型',
dataIndex: 'type', dataIndex: 'type',
valueEnum: HouseChargeTasksTypeEnum, valueEnum: HouseChargeTasksTypeEnum,
}), }),
MyColumns.EnumTag({
title: '任务状态',
dataIndex: 'status',
valueEnum: HouseChargeTasksStatusEnum,
}),
{ {
title: '收费标准名称', title: '收费标准',
dataIndex: 'charge_standard_name', dataIndex: ['house_charge_standard', 'name'],
search: false, search: false,
}, },
{ {
title: '账单月份', title: '账单月份',
render: (_, record) => { render: (_, record) => {
return `${record.year}-${String(record.month).padStart(2, '0')}`; return `${record.bill_year}-${String(record.bill_month).padStart(
2,
'0',
)}`;
}, },
}, },
{ {
title: '计费开始日期', title: '计费周期',
dataIndex: 'start_date',
render: (_, record) => {
return `${record.start_date}-${String(record.end_date).padStart(
2,
'0',
)}`;
},
search: false, search: false,
}, },
{ {
title: '计费结束日期', title: '账单数',
dataIndex: 'end_date', dataIndex: 'task_count',
search: false, search: false,
}, },
{ // MyColumns.UpdatedAt(),
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.CreatedAt(), MyColumns.CreatedAt(),
MyColumns.Option({ MyColumns.Option({
render: (_, item: any, index, action) => ( render: (_, item: any, index, action) => (
<Space key={index}> <Space key={index}>
<TaskShow item={item} title="查看" reload={action?.reload} />
<MyButtons.Delete <MyButtons.Delete
onConfirm={() => onConfirm={() =>
Apis.HouseCharage.HouseChargeTasks.Delete({ Apis.HouseCharage.HouseChargeTasks.Delete({

View File

@ -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 (
<MyModal
title={props.title || '查看'}
type={props.item?.type || 'primary'}
width="1000px"
node={
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
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,
},
]}
/>
}
/>
);
}

View File

@ -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 (
<BetaSchemaForm<ApiTypes.HouseCharage.HouseChargeTasks.Store>
{...MyModalFormProps.props}
title={`创建${props.title}`}
width="480px"
layout="horizontal"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
labelAlign="left"
trigger={<MyButtons.Create title={`创建${props.title}`} />}
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 },
},
]}
/>
);
}

View File

@ -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 (
<MyPageContainer
title={title}
enableTabs={true}
tabKey="house_charge_tasks"
tabLabel={title}
>
<ProTable
{...MyProTableProps.props}
request={async (params, sort) =>
MyProTableProps.request(
params,
sort,
Apis.HouseCharage.HouseChargeTasks.List,
)
}
toolBarRender={(action) => [
<ChargeTasksCreate
key="Create"
reload={action?.reload}
title="账单任务"
/>,
]}
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) => (
<Space key={index}>
<MyButtons.Delete
onConfirm={() =>
Apis.HouseCharage.HouseChargeTaskDetails.Delete({
id: item.id,
}).then(() => action?.reload())
}
/>
</Space>
),
}),
]}
/>
</MyPageContainer>
);
}

257
yarn.lock
View File

@ -629,6 +629,11 @@
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6"
integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== 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": "@babel/template@^7.22.15", "@babel/template@^7.27.2", "@babel/template@^7.3.3":
version "7.27.2" version "7.27.2"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
@ -1772,6 +1777,11 @@
"@tanstack/query-core" "4.40.0" "@tanstack/query-core" "4.40.0"
use-sync-external-store "^1.2.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": "@trysound/sax@0.2.0":
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
@ -1810,6 +1820,11 @@
dependencies: dependencies:
"@babel/types" "^7.20.7" "@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": "@types/graceful-fs@^4.1.3":
version "4.1.9" version "4.1.9"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" 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" resolved "https://registry.yarnpkg.com/@umijs/zod2ts/-/zod2ts-4.4.11.tgz#f41d646739d06fd08ae8bcdc8c748c40f3c7daf3"
integrity sha512-B4CGKU6N9Qws5zNEu8TJjQgp61xAEdrBEmXGStXLl32f3zz0oUcIq/N4vBYciCDbwjHQKviqGcl3iSy2pbn7BA== 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": "@vitejs/plugin-react@4.0.0":
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28" 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" "@babel/plugin-transform-react-jsx-source" "^7.19.6"
react-refresh "^0.14.0" 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": "@xobotyi/scrollbar-width@^1.9.5":
version "1.9.5" version "1.9.5"
resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" 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" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== 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: domain-browser@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 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" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce"
integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== 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: html-webpack-plugin@5.5.0:
version "5.5.0" version "5.5.0"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" 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" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436"
integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== 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: iconv-lite@0.4.24:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 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" resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a"
integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ== 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: import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0:
version "3.3.1" version "3.3.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" 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: dependencies:
is-extglob "^2.1.1" 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: is-inside-container@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" 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: dependencies:
which-typed-array "^1.1.16" 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: is-weakmap@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" 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" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== 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: lodash.debounce@^4.0.8:
version "4.0.8" version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== 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: lodash.merge@^4.6.2:
version "4.6.2" version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 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" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== 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: lodash.truncate@^4.4.2:
version "4.4.2" version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" 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" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 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: mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35" version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 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" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 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: nano-css@^5.6.2:
version "5.6.2" version "5.6.2"
resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.6.2.tgz#584884ddd7547278f6d6915b6805069742679a32" 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" stacktrace-js "^2.0.2"
stylis "^4.3.0" stylis "^4.3.0"
nanoid@^3.3.11: nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.11:
version "3.3.11" version "3.3.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== 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" picocolors "^1.1.1"
source-map-js "^1.2.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: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 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" ansi-styles "^3.2.0"
react-is "^16.8.4" 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: process-nextick-args@~2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 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" resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba"
integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== 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" version "2.2.31"
resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587" 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== 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" resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== 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: slice-ansi@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 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" ansi-styles "^6.0.0"
is-fullwidth-code-point "^4.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: sonic-boom@^2.2.1:
version "2.8.0" version "2.8.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" 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" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 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: stable@^0.1.8:
version "0.1.8" version "0.1.8"
resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
@ -10044,6 +10287,11 @@ timers-browserify@^2.0.4:
dependencies: dependencies:
setimmediate "^1.0.4" 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: tinycolor2@^1.4.2:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
@ -10552,6 +10800,11 @@ which@^2.0.1:
dependencies: dependencies:
isexe "^2.0.0" 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: word-wrap@^1.2.5:
version "1.2.5" version "1.2.5"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"