fix: 完善审批工作流界面配置 (#1057)
Reviewed-on: daoyoucloud/tachybase#1057 Co-authored-by: wjh <wwwjh0710@163.com> Co-committed-by: wjh <wwwjh0710@163.com>
This commit is contained in:
parent
260a95cac2
commit
4c6ff2bccf
@ -45,7 +45,5 @@ export const ApprovalInitializerItem = [
|
||||
title: '审批',
|
||||
name: 'todos',
|
||||
itemComponent: 'TodosBlock',
|
||||
collectionName: 'approvalRecords',
|
||||
settingBlock: true,
|
||||
},
|
||||
];
|
||||
|
@ -1,14 +1,4 @@
|
||||
import {
|
||||
removeNullCondition,
|
||||
SchemaSettings,
|
||||
SchemaSettingsDataScope,
|
||||
useCollection,
|
||||
useCollectionManager,
|
||||
useDataLoadingMode,
|
||||
useDesignable,
|
||||
useDetailsBlockContext,
|
||||
useFormBlockContext,
|
||||
} from '@tachybase/client';
|
||||
import { SchemaSettings, SchemaSettingsDataScope, useDesignable, useFormBlockContext } from '@tachybase/client';
|
||||
import { useField, useFieldSchema } from '@tachybase/schema';
|
||||
|
||||
import _ from 'lodash';
|
||||
|
@ -0,0 +1,157 @@
|
||||
import { JobStatusOptions } from '@tachybase/plugin-workflow/client';
|
||||
|
||||
import { NAMESPACE } from '../locale';
|
||||
|
||||
export const nodeCollection = {
|
||||
title: `{{t("Task", { ns: "${NAMESPACE}" })}}`,
|
||||
name: 'flow_nodes',
|
||||
fields: [
|
||||
{
|
||||
type: 'bigInt',
|
||||
name: 'id',
|
||||
interface: 'm2o',
|
||||
uiSchema: {
|
||||
type: 'number',
|
||||
title: 'ID',
|
||||
'x-component': 'RemoteSelect',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
label: 'title',
|
||||
value: 'id',
|
||||
},
|
||||
service: {
|
||||
resource: 'flow_nodes',
|
||||
params: {
|
||||
filter: {
|
||||
type: 'manual',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'string',
|
||||
name: 'title',
|
||||
interface: 'input',
|
||||
uiSchema: {
|
||||
type: 'string',
|
||||
title: '{{t("Title")}}',
|
||||
'x-component': 'Input',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const workflowCollection = {
|
||||
title: `{{t("Workflow", { ns: "${NAMESPACE}" })}}`,
|
||||
name: 'workflows',
|
||||
fields: [
|
||||
{
|
||||
type: 'string',
|
||||
name: 'title',
|
||||
interface: 'input',
|
||||
uiSchema: {
|
||||
title: '{{t("Name")}}',
|
||||
type: 'string',
|
||||
'x-component': 'Input',
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const todoCollection = {
|
||||
title: `{{t("Workflow todos", { ns: "${NAMESPACE}" })}}`,
|
||||
name: 'users_jobs',
|
||||
fields: [
|
||||
{
|
||||
type: 'belongsTo',
|
||||
name: 'user',
|
||||
target: 'users',
|
||||
foreignKey: 'userId',
|
||||
interface: 'm2o',
|
||||
uiSchema: {
|
||||
type: 'number',
|
||||
title: '{{t("User")}}',
|
||||
'x-component': 'RemoteSelect',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
label: 'nickname',
|
||||
value: 'id',
|
||||
},
|
||||
service: {
|
||||
resource: 'users',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'belongsTo',
|
||||
name: 'node',
|
||||
target: 'flow_nodes',
|
||||
foreignKey: 'nodeId',
|
||||
interface: 'm2o',
|
||||
isAssociation: true,
|
||||
uiSchema: {
|
||||
type: 'number',
|
||||
title: `{{t("Task", { ns: "${NAMESPACE}" })}}`,
|
||||
'x-component': 'RemoteSelect',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
label: 'title',
|
||||
value: 'id',
|
||||
},
|
||||
service: {
|
||||
resource: 'flow_nodes',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'belongsTo',
|
||||
name: 'workflow',
|
||||
target: 'workflows',
|
||||
foreignKey: 'workflowId',
|
||||
interface: 'm2o',
|
||||
uiSchema: {
|
||||
type: 'number',
|
||||
title: `{{t("Workflow", { ns: "${NAMESPACE}" })}}`,
|
||||
'x-component': 'RemoteSelect',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
label: 'title',
|
||||
value: 'id',
|
||||
},
|
||||
service: {
|
||||
resource: 'workflows',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'integer',
|
||||
name: 'status',
|
||||
interface: 'select',
|
||||
uiSchema: {
|
||||
type: 'number',
|
||||
title: `{{t("Status", { ns: "${NAMESPACE}" })}}`,
|
||||
'x-component': 'Select',
|
||||
enum: JobStatusOptions,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'createdAt',
|
||||
type: 'date',
|
||||
interface: 'createdAt',
|
||||
uiSchema: {
|
||||
type: 'datetime',
|
||||
title: '{{t("Created at")}}',
|
||||
'x-component': 'DatePicker',
|
||||
'x-component-props': {
|
||||
showTime: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
@ -1,4 +1,18 @@
|
||||
import React from 'react';
|
||||
import { SchemaInitializerItemType } from '@tachybase/client';
|
||||
import { JOB_STATUS } from '@tachybase/plugin-workflow/client';
|
||||
import { ISchema } from '@tachybase/schema';
|
||||
|
||||
import {
|
||||
CheckOutlined,
|
||||
ClockCircleOutlined,
|
||||
CloseOutlined,
|
||||
ExclamationOutlined,
|
||||
HourglassOutlined,
|
||||
LoadingOutlined,
|
||||
MinusOutlined,
|
||||
RedoOutlined,
|
||||
} from '@ant-design/icons';
|
||||
|
||||
import { lang, NAMESPACE, tval } from './locale';
|
||||
|
||||
@ -22,8 +36,6 @@ export const APPROVAL_STATUS = {
|
||||
|
||||
export const ProcessedStatus = [1, 2, -1, -3];
|
||||
|
||||
export const PendingStatus = [0];
|
||||
|
||||
export const approvalStatusOptions = [
|
||||
{ value: APPROVAL_STATUS.ASSIGNED, label: `Assigned`, color: 'blue' },
|
||||
{ value: APPROVAL_STATUS.PENDING, label: `Pending`, color: 'gold' },
|
||||
@ -112,3 +124,118 @@ export function flatSchemaArray(sourceData, filter, needRecursion = false) {
|
||||
|
||||
return flatArray;
|
||||
}
|
||||
|
||||
type ValueOf<T> = T[keyof T];
|
||||
|
||||
export type FormType = {
|
||||
type: 'create' | 'update' | 'custom';
|
||||
title: string;
|
||||
actions: ValueOf<typeof JOB_STATUS>[];
|
||||
collection:
|
||||
| string
|
||||
| {
|
||||
name: string;
|
||||
fields: any[];
|
||||
[key: string]: any;
|
||||
};
|
||||
};
|
||||
|
||||
export type ManualFormType = {
|
||||
title: string;
|
||||
config: {
|
||||
useInitializer: ({ allCollections }?: { allCollections: any[] }) => SchemaInitializerItemType;
|
||||
initializers?: {
|
||||
[key: string]: React.FC;
|
||||
};
|
||||
components?: {
|
||||
[key: string]: React.FC;
|
||||
};
|
||||
parseFormOptions(root: ISchema): { [key: string]: FormType };
|
||||
};
|
||||
block: {
|
||||
scope?: {
|
||||
[key: string]: () => any;
|
||||
};
|
||||
components?: {
|
||||
[key: string]: React.FC;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
export const EXECUTION_STATUS = {
|
||||
QUEUEING: null,
|
||||
STARTED: 0,
|
||||
RESOLVED: 1,
|
||||
FAILED: -1,
|
||||
ERROR: -2,
|
||||
ABORTED: -3,
|
||||
CANCELED: -4,
|
||||
REJECTED: -5,
|
||||
RETRY_NEEDED: -6,
|
||||
};
|
||||
|
||||
export const ExecutionStatusOptions = [
|
||||
{
|
||||
value: EXECUTION_STATUS.QUEUEING,
|
||||
label: 'Queueing',
|
||||
color: 'blue',
|
||||
icon: <HourglassOutlined />,
|
||||
description: 'Triggered but still waiting in queue to execute.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.STARTED,
|
||||
label: 'On going',
|
||||
color: 'gold',
|
||||
icon: <LoadingOutlined />,
|
||||
description: 'Started and executing, maybe waiting for an async callback (manual, delay etc.).',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.RESOLVED,
|
||||
label: 'Resolved',
|
||||
color: 'green',
|
||||
icon: <CheckOutlined />,
|
||||
description: 'Successfully finished.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.FAILED,
|
||||
label: 'Failed',
|
||||
color: 'red',
|
||||
icon: <ExclamationOutlined />,
|
||||
description: 'Failed to satisfy node configurations.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.ERROR,
|
||||
label: 'Error',
|
||||
color: 'red',
|
||||
icon: <CloseOutlined />,
|
||||
description: 'Some node meets error.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.ABORTED,
|
||||
label: 'Aborted',
|
||||
color: 'red',
|
||||
icon: <MinusOutlined rotate={90} />,
|
||||
description: 'Running of some node was aborted by program flow.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.CANCELED,
|
||||
label: 'Canceled',
|
||||
color: 'volcano',
|
||||
icon: <MinusOutlined rotate={45} />,
|
||||
description: 'Manually canceled whole execution when waiting.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.REJECTED,
|
||||
label: 'Rejected',
|
||||
color: 'volcano',
|
||||
icon: <MinusOutlined />,
|
||||
description: 'Rejected from a manual node.',
|
||||
},
|
||||
{
|
||||
value: EXECUTION_STATUS.RETRY_NEEDED,
|
||||
label: 'Retry needed',
|
||||
color: 'volcano',
|
||||
icon: <RedoOutlined />,
|
||||
description: 'General failed but should do another try.',
|
||||
},
|
||||
];
|
@ -16,7 +16,8 @@ import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase
|
||||
import { useContextApprovalExecution } from './ApprovalExecution';
|
||||
|
||||
export const FormBlockProvider = (props) => {
|
||||
const { snapshot } = useContextApprovalExecution();
|
||||
const { approvalExecution } = useContextApprovalExecution();
|
||||
const { snapshot } = approvalExecution;
|
||||
const fieldSchema = useFieldSchema();
|
||||
const field = useField();
|
||||
const formBlockRef = useRef(null);
|
||||
|
@ -8,6 +8,7 @@ import { ViewActionUserInitiationsContent } from './initiations/component/ViewAc
|
||||
import { LauncherActionConfigInitializer } from './initiations/config/LauncherActionConfig';
|
||||
import { InitiationsBlock } from './initiations/InitiationsBlock';
|
||||
import { ViewActionTodosContent } from './todos/component/ViewActionTodosContent';
|
||||
import { ViewTodosUserJobsContent } from './todos/component/ViewTodosUserJobsContent';
|
||||
import { TodosBlock } from './todos/TodosBlock';
|
||||
|
||||
class PluginApproval extends Plugin {
|
||||
@ -19,6 +20,7 @@ class PluginApproval extends Plugin {
|
||||
ViewActionTodosContent,
|
||||
ViewActionUserInitiationsContent,
|
||||
ViewActionInitiationsContent,
|
||||
ViewTodosUserJobsContent,
|
||||
'ApprovalCommon.ViewComponent.MApprovalProcess': ApprovalProcess,
|
||||
});
|
||||
this.app.schemaSettingsManager.add(ApprovalSettings);
|
||||
|
@ -11,12 +11,12 @@
|
||||
background-color: #ffffff;
|
||||
position: fixed;
|
||||
z-index: 2;
|
||||
height: 5vh;
|
||||
height: 6vh;
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
.approvalContext{
|
||||
margin: 6vh 0 6vh 0;
|
||||
margin: 7vh 0 7vh 0;
|
||||
}
|
||||
|
||||
.todosSpacStyle{
|
||||
|
@ -1,116 +1,106 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { BlockItem, ExtendCollectionsProvider } from '@tachybase/client';
|
||||
import { observer } from '@tachybase/schema';
|
||||
import React, { useState } from 'react';
|
||||
import { BlockItem, ExtendCollectionsProvider, SchemaComponent } from '@tachybase/client';
|
||||
import { observer, useFieldSchema } from '@tachybase/schema';
|
||||
|
||||
import { SearchBar, Space, Tabs } from 'antd-mobile';
|
||||
|
||||
import { TabApplicantType } from './component/TabApplicantType';
|
||||
import { TabApprovalItem } from './component/TabApprovalItem';
|
||||
import { TabApprovalType } from './component/TabApprovalType';
|
||||
import { SearchBar, Tabs } from 'antd-mobile';
|
||||
|
||||
import '../style/style.css';
|
||||
|
||||
import { CollectionApprovals } from '../collection/Approvals.collection';
|
||||
import { CollectionApprovalTodos } from '../collection/ApprovalTodos';
|
||||
import { CollectionFlowNodes } from '../collection/FlowNodes.collection';
|
||||
import { nodeCollection, todoCollection, workflowCollection } from '../collection/UserJobs.collection';
|
||||
import { CollectionWorkflows } from '../collection/Workflows.collection';
|
||||
import { ApprovalReachDataType } from '../component/ApprovalReachDataType';
|
||||
import { ApprovalTemplateType } from '../component/ApprovalTemplateType';
|
||||
import { PendingStatus, ProcessedStatus } from '../constants';
|
||||
import { useTranslation } from '../locale';
|
||||
import { TabDuplicateItem } from './component/TabDuplicateItem';
|
||||
import { TabExecutedItem } from './component/TabExecutedItem';
|
||||
import { TabPendingItem } from './component/TabPendingItem';
|
||||
import { TabProcessedItem } from './component/TabProcessedItem';
|
||||
import { tabDuplicateSchema, tabExecutedSchema, tabPendingSchema, tabProcessedSchema } from './componentSchema';
|
||||
import { todosContext } from './provider/todosContext';
|
||||
|
||||
export const TodosBlock = observer((props) => {
|
||||
const [filter, setFilter] = useState({
|
||||
status: PendingStatus,
|
||||
});
|
||||
const [changeInputValue, setChangeInputValue] = useState('');
|
||||
const [input, setInput] = useState('');
|
||||
const changeFilter = (data) => {
|
||||
setFilter(data);
|
||||
};
|
||||
const filterProps = {
|
||||
...props,
|
||||
filter,
|
||||
input,
|
||||
changeFilter,
|
||||
};
|
||||
const fieldSchema = useFieldSchema();
|
||||
const [contextFilter, setContextFilter] = useState({ key: 'pending', inputFilter: '' });
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<ExtendCollectionsProvider
|
||||
collections={[CollectionWorkflows, CollectionFlowNodes, CollectionApprovals, CollectionApprovalTodos]}
|
||||
collections={[
|
||||
CollectionWorkflows,
|
||||
CollectionFlowNodes,
|
||||
CollectionApprovals,
|
||||
CollectionApprovalTodos,
|
||||
nodeCollection,
|
||||
workflowCollection,
|
||||
todoCollection,
|
||||
]}
|
||||
>
|
||||
<BlockItem>
|
||||
<todosContext.Provider value={contextFilter}>
|
||||
<SearchBar
|
||||
placeholder="搜索人名,标题、内容"
|
||||
clearable
|
||||
style={{ '--background': '#ffffff', padding: '10px' }}
|
||||
onChange={(value) => {
|
||||
const filter = { ...contextFilter };
|
||||
if (!value) {
|
||||
setInput(value);
|
||||
filter.inputFilter = value;
|
||||
setContextFilter(filter);
|
||||
}
|
||||
setChangeInputValue(value);
|
||||
}}
|
||||
value={changeInputValue}
|
||||
onSearch={(value) => {
|
||||
setInput(value);
|
||||
const filter = { ...contextFilter };
|
||||
filter.inputFilter = value;
|
||||
setContextFilter(filter);
|
||||
}}
|
||||
/>
|
||||
<Tabs
|
||||
onChange={(key) => {
|
||||
const tabFilter = { status: PendingStatus };
|
||||
switch (key) {
|
||||
case 'pending':
|
||||
tabFilter['status'] = PendingStatus;
|
||||
break;
|
||||
case 'processed':
|
||||
tabFilter['status'] = ProcessedStatus;
|
||||
break;
|
||||
case 'duplicate':
|
||||
delete tabFilter['status'];
|
||||
break;
|
||||
}
|
||||
const tabFilter = { ...contextFilter };
|
||||
tabFilter.key = key;
|
||||
tabFilter.inputFilter = '';
|
||||
setContextFilter(tabFilter);
|
||||
setChangeInputValue('');
|
||||
setInput('');
|
||||
setFilter(tabFilter);
|
||||
}}
|
||||
style={{ '--title-font-size': '12px', backgroundColor: '#ffffff', marginTop: '10px' }}
|
||||
>
|
||||
<Tabs.Tab title="待处理" key="pending">
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
<Tabs.Tab title={t('Pending')} key="pending">
|
||||
<SchemaComponent
|
||||
components={{
|
||||
TabPendingItem,
|
||||
}}
|
||||
schema={tabPendingSchema(t, props, fieldSchema['x-uid'])}
|
||||
/>
|
||||
</Tabs.Tab>
|
||||
<Tabs.Tab title="已处理" key="processed">
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 审批状态 */}
|
||||
<TabApprovalType {...filterProps} />
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
<Tabs.Tab title={t('Processed')} key="processed">
|
||||
<SchemaComponent
|
||||
components={{
|
||||
TabProcessedItem,
|
||||
}}
|
||||
schema={tabProcessedSchema(t, props, fieldSchema['x-uid'])}
|
||||
/>
|
||||
</Tabs.Tab>
|
||||
<Tabs.Tab title="抄送我" key="duplicate">
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 审批状态 */}
|
||||
<TabApprovalType {...filterProps} />
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
<Tabs.Tab title={t('Duplicate')} key="duplicate">
|
||||
<SchemaComponent
|
||||
components={{
|
||||
TabDuplicateItem,
|
||||
}}
|
||||
schema={tabDuplicateSchema(t, props, fieldSchema['x-uid'])}
|
||||
/>
|
||||
</Tabs.Tab>
|
||||
<Tabs.Tab title={t('Executed')} key="executed">
|
||||
<SchemaComponent
|
||||
components={{
|
||||
TabExecutedItem,
|
||||
}}
|
||||
schema={tabExecutedSchema(t, props, fieldSchema['x-uid'])}
|
||||
/>
|
||||
</Tabs.Tab>
|
||||
</Tabs>
|
||||
</todosContext.Provider>
|
||||
</BlockItem>
|
||||
</ExtendCollectionsProvider>
|
||||
);
|
||||
|
@ -1,79 +1,31 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useAPIClient, useCollectionManager, useCompile } from '@tachybase/client';
|
||||
import { ExecutionStatusOptionsMap } from '@tachybase/plugin-workflow/client';
|
||||
import { observer } from '@tachybase/schema';
|
||||
|
||||
import { useAsyncEffect } from 'ahooks';
|
||||
import { Empty, List, Space, Tag } from 'antd-mobile';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
import { APPROVAL_STATUS, ApprovalPriorityType, approvalStatusOptions } from '../../constants';
|
||||
import { APPROVAL_STATUS, ApprovalPriorityType, approvalStatusOptions, ExecutionStatusOptions } from '../../constants';
|
||||
import { useTranslation } from '../../locale';
|
||||
|
||||
export const TabApprovalItem = observer((props) => {
|
||||
const { filter, params, input } = props as any;
|
||||
const { filter, params, input, collectionName, tabKey } = props as any;
|
||||
const api = useAPIClient();
|
||||
const [data, setData] = useState([]);
|
||||
const [defData, setDefData] = useState([]);
|
||||
const { t } = useTranslation();
|
||||
const compile = useCompile();
|
||||
const navigate = useNavigate();
|
||||
const cm = useCollectionManager();
|
||||
useEffect(() => {
|
||||
if (input && defData.length) {
|
||||
const filterData = defData.filter((value) => value.title.includes(input));
|
||||
setData(filterData);
|
||||
} else {
|
||||
setData(defData);
|
||||
}
|
||||
}, [input]);
|
||||
useAsyncEffect(async () => {
|
||||
const { data: user } = await api.request({ url: 'users:list', params: { pageSize: 999, appends: ['roles'] } });
|
||||
api
|
||||
.request({
|
||||
url: 'approvalRecords:listCentralized',
|
||||
params: {
|
||||
pageSize: 9999,
|
||||
appends: ['execution', 'job', 'node', 'workflow'],
|
||||
filter: { ...params, ...filter },
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
const result = res.data?.data.map((item) => {
|
||||
const itemUser = user.data.find((value) => value.id === item.userId);
|
||||
const priorityType = ApprovalPriorityType.find(
|
||||
(priorityItem) => priorityItem.value === item.snapshot.priority,
|
||||
);
|
||||
const statusType = approvalTodoListStatus(item, t);
|
||||
const categoryTitle = item.workflow.title.replace('审批流:', '');
|
||||
const collectionName = item.workflow?.config?.collection || item.execution?.context?.collectionName;
|
||||
const summary = Object.entries(item.summary).map(([key, value]) => {
|
||||
const field = cm.getCollectionField(`${collectionName}.${key}`);
|
||||
return {
|
||||
label: compile(field?.uiSchema?.title || key),
|
||||
value: (Object.prototype.toString.call(value) === '[object Object]' ? value?.['name'] : value) || '',
|
||||
};
|
||||
});
|
||||
return {
|
||||
...item,
|
||||
title: `${itemUser.nickname}的${categoryTitle}`,
|
||||
categoryTitle: categoryTitle,
|
||||
statusTitle: t(statusType.label),
|
||||
statusColor: statusType.color,
|
||||
reason: summary,
|
||||
priorityTitle: priorityType.label,
|
||||
priorityColor: priorityType.color,
|
||||
};
|
||||
});
|
||||
result.sort((a, b) => {
|
||||
return Date.parse(b.createdAt) - Date.parse(a.createdAt);
|
||||
});
|
||||
setData(result);
|
||||
setDefData(result);
|
||||
})
|
||||
.catch(() => {
|
||||
console.error;
|
||||
});
|
||||
}, [filter, params]);
|
||||
if (collectionName === 'approvalRecords') {
|
||||
changeApprovalRecordsService(api, params?.[tabKey], filter, user, cm, compile, t, setData, input);
|
||||
} else if (collectionName === 'users_jobs') {
|
||||
changeUsersJobsService(api, t, cm, compile, input, setData, params?.[tabKey], filter);
|
||||
}
|
||||
}, [filter, params, input]);
|
||||
|
||||
return (
|
||||
<div style={{ marginTop: '10px', minHeight: '70vh' }}>
|
||||
@ -84,13 +36,20 @@ export const TabApprovalItem = observer((props) => {
|
||||
<List.Item
|
||||
key={index}
|
||||
onClick={() => {
|
||||
navigate(`/mobile/approval/${item.id}/${item.categoryTitle}/detailspage`);
|
||||
let url;
|
||||
if (collectionName === 'approvalRecords') {
|
||||
url = `/mobile/approval/${item.id}/${item.categoryTitle}/detailspage`;
|
||||
} else if (collectionName === 'users_jobs') {
|
||||
url = `/mobile/approval/${item.id}/userJobspage`;
|
||||
}
|
||||
navigate(url);
|
||||
}}
|
||||
>
|
||||
{/* <Badge color="#6ac3ff" content={Badge.dot} style={{ '--right': '100%' }}> */}
|
||||
<Space block>
|
||||
{item.title}
|
||||
<Tag color={item.statusColor} fill="outline">
|
||||
{item.statusIcon}
|
||||
{item.statusTitle}
|
||||
</Tag>
|
||||
<Tag color={item.priorityColor} fill="outline">
|
||||
@ -123,3 +82,97 @@ const approvalTodoListStatus = (item, t) => {
|
||||
return approvalStatusOptions.find((value) => value.value === status);
|
||||
}
|
||||
};
|
||||
|
||||
const changeApprovalRecordsService = (api, params, filter, user, cm, compile, t, setData, input) => {
|
||||
api
|
||||
.request({
|
||||
url: 'approvalRecords:listCentralized',
|
||||
params: {
|
||||
pageSize: 9999,
|
||||
appends: ['execution', 'job', 'node', 'workflow'],
|
||||
filter: { ...params, ...filter },
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
const result = res.data?.data.map((item) => {
|
||||
const itemUser = user.data.find((value) => value.id === item.userId);
|
||||
const priorityType = ApprovalPriorityType.find((priorityItem) => priorityItem.value === item.snapshot.priority);
|
||||
const statusType = approvalTodoListStatus(item, t);
|
||||
const categoryTitle = item.workflow.title.replace('审批流:', '');
|
||||
const collectionName = item.workflow?.config?.collection || item.execution?.context?.collectionName;
|
||||
const summary = Object.entries(item.summary).map(([key, value]) => {
|
||||
const field = cm.getCollectionField(`${collectionName}.${key}`);
|
||||
return {
|
||||
label: compile(field?.uiSchema?.title || key),
|
||||
value: (Object.prototype.toString.call(value) === '[object Object]' ? value?.['name'] : value) || '',
|
||||
};
|
||||
});
|
||||
return {
|
||||
...item,
|
||||
title: `${itemUser.nickname}的${categoryTitle}`,
|
||||
categoryTitle: categoryTitle,
|
||||
statusTitle: t(statusType.label),
|
||||
statusColor: statusType.color,
|
||||
reason: summary,
|
||||
priorityTitle: priorityType.label,
|
||||
priorityColor: priorityType.color,
|
||||
};
|
||||
});
|
||||
const filterResult = result.filter((value) => value.title.includes(input));
|
||||
filterResult.sort((a, b) => {
|
||||
return Date.parse(b.createdAt) - Date.parse(a.createdAt);
|
||||
});
|
||||
setData(filterResult);
|
||||
})
|
||||
.catch(() => {
|
||||
console.error;
|
||||
});
|
||||
};
|
||||
|
||||
const changeUsersJobsService = (api, t, cm, compile, input, setData, params, filter) => {
|
||||
api
|
||||
.request({
|
||||
url: 'users_jobs:list',
|
||||
params: {
|
||||
pageSize: 9999,
|
||||
filter: { ...params, ...filter },
|
||||
appends: ['execution', 'job', 'node', 'user', 'workflow'],
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
const result = res.data?.data.map((item) => {
|
||||
const priorityType = ApprovalPriorityType.find(
|
||||
(priorityItem) => priorityItem.value === item.execution.context?.data?.priority,
|
||||
);
|
||||
const statusType = ExecutionStatusOptions.find((value) => value.value === item.status);
|
||||
const categoryTitle = item.workflow.title.replace('审批流:', '');
|
||||
const collectionName = item.workflow?.config?.collection || item.execution?.context?.collectionName;
|
||||
const summary = Object.entries(item.execution?.context?.summary).map(([key, value]) => {
|
||||
const field = cm.getCollectionField(`${collectionName}.${key}`);
|
||||
return {
|
||||
label: compile(field?.uiSchema?.title || key),
|
||||
value: (Object.prototype.toString.call(value) === '[object Object]' ? value?.['name'] : value) || '',
|
||||
};
|
||||
});
|
||||
return {
|
||||
...item,
|
||||
title: `${item.user?.nickname}的${categoryTitle}`,
|
||||
categoryTitle: categoryTitle,
|
||||
statusTitle: t(statusType.label),
|
||||
statusColor: statusType.color,
|
||||
statusIcon: statusType.icon,
|
||||
reason: summary,
|
||||
priorityTitle: priorityType.label,
|
||||
priorityColor: priorityType.color,
|
||||
};
|
||||
});
|
||||
const filterResult = result.filter((value) => value.title.includes(input));
|
||||
filterResult.sort((a, b) => {
|
||||
return Date.parse(b.createdAt) - Date.parse(a.createdAt);
|
||||
});
|
||||
setData(filterResult);
|
||||
})
|
||||
.catch(() => {
|
||||
console.error;
|
||||
});
|
||||
};
|
||||
|
@ -4,23 +4,33 @@ import { observer } from '@tachybase/schema';
|
||||
import { Picker, Space } from 'antd-mobile';
|
||||
import { DownOutline } from 'antd-mobile-icons';
|
||||
|
||||
import { approvalStatusOptions, ProcessedStatus } from '../../constants';
|
||||
import { approvalStatusOptions, ExecutionStatusOptions, ProcessedStatus } from '../../constants';
|
||||
import { useTranslation } from '../../locale';
|
||||
|
||||
export const TabApprovalType = observer((props) => {
|
||||
const { collectionName, params } = props as any;
|
||||
const [visible, setVisible] = useState(false);
|
||||
const { changeFilter, filter } = props as any;
|
||||
const { t } = useTranslation();
|
||||
const columns = approvalStatusOptions
|
||||
.map((item) => {
|
||||
const columns = [];
|
||||
if (collectionName === 'approvalRecords') {
|
||||
approvalStatusOptions.forEach((item) => {
|
||||
if (ProcessedStatus.includes(item.value)) {
|
||||
return {
|
||||
columns.push({
|
||||
label: t(item.label),
|
||||
value: item.value,
|
||||
};
|
||||
});
|
||||
}
|
||||
});
|
||||
} else if (collectionName === 'users_jobs') {
|
||||
ExecutionStatusOptions.forEach((item) => {
|
||||
if (!item.value && item.value !== 0) return;
|
||||
columns.push({
|
||||
label: t(item.label),
|
||||
value: item.value,
|
||||
});
|
||||
});
|
||||
}
|
||||
})
|
||||
.filter(Boolean);
|
||||
columns.unshift({ label: t('All'), value: 'all' });
|
||||
return (
|
||||
<>
|
||||
@ -43,7 +53,7 @@ export const TabApprovalType = observer((props) => {
|
||||
onConfirm={(e) => {
|
||||
const changeData = { ...filter };
|
||||
if (e[0] === 'all') {
|
||||
changeData['status'] = ProcessedStatus;
|
||||
delete changeData['status'];
|
||||
} else {
|
||||
changeData['status'] = e[0];
|
||||
}
|
||||
|
@ -0,0 +1,47 @@
|
||||
import React, { useState } from 'react';
|
||||
import { BlockItem } from '@tachybase/client';
|
||||
import { observer } from '@tachybase/schema';
|
||||
|
||||
import { Space } from 'antd-mobile';
|
||||
|
||||
import { ApprovalReachDataType } from '../../component/ApprovalReachDataType';
|
||||
import { ApprovalTemplateType } from '../../component/ApprovalTemplateType';
|
||||
import { PendingStatus } from '../../constants';
|
||||
import { useTodosContext } from '../provider/todosContext';
|
||||
import { TabApplicantType } from './TabApplicantType';
|
||||
import { TabApprovalItem } from './TabApprovalItem';
|
||||
import { TabApprovalType } from './TabApprovalType';
|
||||
|
||||
import '../../style/style.css';
|
||||
|
||||
//审批-抄送我
|
||||
export const TabDuplicateItem = observer((props) => {
|
||||
const [filter, setFilter] = useState({});
|
||||
const filterContext = useTodosContext();
|
||||
const changeFilter = (data) => {
|
||||
setFilter(data);
|
||||
};
|
||||
const filterProps = {
|
||||
...props,
|
||||
filter,
|
||||
changeFilter,
|
||||
};
|
||||
if (filterContext['key'] === 'duplicate') {
|
||||
filterProps['input'] = filterContext['inputFilter'];
|
||||
}
|
||||
return (
|
||||
<BlockItem>
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 审批状态 */}
|
||||
<TabApprovalType {...filterProps} />
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
</BlockItem>
|
||||
);
|
||||
});
|
@ -0,0 +1,47 @@
|
||||
import React, { useState } from 'react';
|
||||
import { BlockItem } from '@tachybase/client';
|
||||
import { observer } from '@tachybase/schema';
|
||||
|
||||
import { Space } from 'antd-mobile';
|
||||
|
||||
import { ApprovalReachDataType } from '../../component/ApprovalReachDataType';
|
||||
import { ApprovalTemplateType } from '../../component/ApprovalTemplateType';
|
||||
import { PendingStatus } from '../../constants';
|
||||
import { useTodosContext } from '../provider/todosContext';
|
||||
import { TabApplicantType } from './TabApplicantType';
|
||||
import { TabApprovalItem } from './TabApprovalItem';
|
||||
import { TabApprovalType } from './TabApprovalType';
|
||||
|
||||
import '../../style/style.css';
|
||||
|
||||
//审批-执行处理
|
||||
export const TabExecutedItem = observer((props) => {
|
||||
const [filter, setFilter] = useState({});
|
||||
const filterContext = useTodosContext();
|
||||
const changeFilter = (data) => {
|
||||
setFilter(data);
|
||||
};
|
||||
const filterProps = {
|
||||
...props,
|
||||
filter,
|
||||
changeFilter,
|
||||
};
|
||||
if (filterContext['key'] === 'executed') {
|
||||
filterProps['input'] = filterContext['inputFilter'];
|
||||
}
|
||||
return (
|
||||
<BlockItem>
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 审批状态 */}
|
||||
<TabApprovalType {...filterProps} />
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
</BlockItem>
|
||||
);
|
||||
});
|
@ -0,0 +1,45 @@
|
||||
import React, { useState } from 'react';
|
||||
import { BlockItem } from '@tachybase/client';
|
||||
import { observer } from '@tachybase/schema';
|
||||
|
||||
import { Space } from 'antd-mobile';
|
||||
|
||||
import { ApprovalReachDataType } from '../../component/ApprovalReachDataType';
|
||||
import { ApprovalTemplateType } from '../../component/ApprovalTemplateType';
|
||||
import { PendingStatus } from '../../constants';
|
||||
import { useTodosContext } from '../provider/todosContext';
|
||||
import { TabApplicantType } from './TabApplicantType';
|
||||
import { TabApprovalItem } from './TabApprovalItem';
|
||||
|
||||
import '../../style/style.css';
|
||||
|
||||
//审批-待处理
|
||||
export const TabPendingItem = observer((props) => {
|
||||
const [filter, setFilter] = useState({});
|
||||
const filterContext = useTodosContext();
|
||||
const changeFilter = (data) => {
|
||||
setFilter(data);
|
||||
};
|
||||
const filterProps = {
|
||||
...props,
|
||||
filter,
|
||||
changeFilter,
|
||||
};
|
||||
|
||||
if (filterContext['key'] === 'pending') {
|
||||
filterProps['input'] = filterContext['inputFilter'];
|
||||
}
|
||||
return (
|
||||
<BlockItem>
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
</BlockItem>
|
||||
);
|
||||
});
|
@ -0,0 +1,48 @@
|
||||
import React, { useState } from 'react';
|
||||
import { BlockItem } from '@tachybase/client';
|
||||
import { observer } from '@tachybase/schema';
|
||||
|
||||
import { Space } from 'antd-mobile';
|
||||
|
||||
import { ApprovalReachDataType } from '../../component/ApprovalReachDataType';
|
||||
import { ApprovalTemplateType } from '../../component/ApprovalTemplateType';
|
||||
import { useTodosContext } from '../provider/todosContext';
|
||||
import { TabApplicantType } from './TabApplicantType';
|
||||
import { TabApprovalItem } from './TabApprovalItem';
|
||||
import { TabApprovalType } from './TabApprovalType';
|
||||
|
||||
import '../../style/style.css';
|
||||
|
||||
import { ProcessedStatus } from '../../constants';
|
||||
|
||||
//审批-已处理
|
||||
export const TabProcessedItem = observer((props) => {
|
||||
const [filter, setFilter] = useState({});
|
||||
const filterContext = useTodosContext();
|
||||
const changeFilter = (data) => {
|
||||
setFilter(data);
|
||||
};
|
||||
const filterProps = {
|
||||
...props,
|
||||
filter,
|
||||
changeFilter,
|
||||
};
|
||||
if (filterContext['key'] === 'processed') {
|
||||
filterProps['input'] = filterContext['inputFilter'];
|
||||
}
|
||||
return (
|
||||
<BlockItem>
|
||||
<Space justify="evenly" className="todosSpacStyle">
|
||||
{/* 审批状态 */}
|
||||
<TabApprovalType {...filterProps} />
|
||||
{/* 模版类型 */}
|
||||
<ApprovalTemplateType {...filterProps} />
|
||||
{/* 申请人 */}
|
||||
<TabApplicantType {...filterProps} />
|
||||
{/* 到达日期 */}
|
||||
<ApprovalReachDataType {...filterProps} />
|
||||
</Space>
|
||||
<TabApprovalItem {...filterProps} />
|
||||
</BlockItem>
|
||||
);
|
||||
});
|
@ -0,0 +1,148 @@
|
||||
import React, { useContext, useEffect, useState } from 'react';
|
||||
import { SchemaComponent, useAPIClient, useFormBlockContext, usePlugin } from '@tachybase/client';
|
||||
import PluginWorkflowClient, {
|
||||
DetailsBlockProvider,
|
||||
FlowContext,
|
||||
linkNodes,
|
||||
useAvailableUpstreams,
|
||||
} from '@tachybase/plugin-workflow/client';
|
||||
|
||||
import { Result } from 'antd';
|
||||
import { NavBar, Skeleton } from 'antd-mobile';
|
||||
import _ from 'lodash';
|
||||
import { useNavigate, useParams } from 'react-router-dom';
|
||||
|
||||
import { ContextWithActionEnabled } from '../../context/WithActionEnabled';
|
||||
import { useTranslation } from '../../locale';
|
||||
|
||||
import '../../style/style.css';
|
||||
|
||||
import { MobileProvider } from '@tachybase/plugin-mobile-client/client';
|
||||
import { Registry } from '@tachybase/utils/client';
|
||||
|
||||
import { ManualFormType } from '../../constants';
|
||||
import { ContextApprovalExecution } from '../../context/ApprovalExecution';
|
||||
import { useUserJobsFormBlockProps } from '../hook/useFormBlockProps';
|
||||
import { useUserJobsSubmit } from '../hook/useSubmit';
|
||||
import { ActionBarUserJobsProvider } from '../provider/ActionBarProvider';
|
||||
import { FormBlockProvider } from '../provider/FormBlockProvider';
|
||||
import { ManualActionStatusProvider } from '../provider/ManualActionStatusProvider';
|
||||
|
||||
// 审批-执行处理-查看: 内容
|
||||
export const ViewTodosUserJobsContent = () => {
|
||||
const { t } = useTranslation();
|
||||
const { actionEnabled } = useContext(ContextWithActionEnabled);
|
||||
const navigate = useNavigate();
|
||||
const params = useParams();
|
||||
const { id } = params;
|
||||
const api = useAPIClient();
|
||||
const [noDate, setNoDate] = useState(false);
|
||||
const workflowPlugin = usePlugin(PluginWorkflowClient);
|
||||
const [flowContext, setFlowContext] = useState<any>(null);
|
||||
const [jobsData, setJobsData] = useState({});
|
||||
const [node, setNode] = useState<any>(null);
|
||||
useEffect(() => {
|
||||
api
|
||||
.resource('users_jobs')
|
||||
.get?.({
|
||||
filterByTk: id,
|
||||
appends: ['node', 'job', 'workflow', 'workflow.nodes', 'execution', 'execution.jobs'],
|
||||
})
|
||||
.then(({ data }) => {
|
||||
if (!data.data) setNoDate(true);
|
||||
const { node, workflow: { nodes = [], ...workflow } = {}, execution, ...userJob } = data?.data ?? {};
|
||||
linkNodes(nodes);
|
||||
setNode(node);
|
||||
setFlowContext({
|
||||
userJob,
|
||||
workflow,
|
||||
nodes,
|
||||
execution,
|
||||
});
|
||||
setJobsData(data.data);
|
||||
return;
|
||||
})
|
||||
.catch(() => {
|
||||
console.error;
|
||||
});
|
||||
}, []);
|
||||
const upstreams = useAvailableUpstreams(flowContext?.nodes.find((item) => item.id === node.id));
|
||||
const nodeComponents = upstreams.reduce(
|
||||
(components, { type }) => Object.assign(components, workflowPlugin.instructions.get(type).components),
|
||||
{},
|
||||
);
|
||||
|
||||
if (noDate) {
|
||||
return <Result status="error" title={t('Submission may be withdrawn, please try refresh the list.')} />;
|
||||
}
|
||||
return (
|
||||
<div style={{ minHeight: '100vh', backgroundColor: '#f3f3f3', overflow: 'auto' }}>
|
||||
<NavBar
|
||||
onBack={() => {
|
||||
navigate(-1);
|
||||
}}
|
||||
className="navBarStyle"
|
||||
>
|
||||
{'执行处理'}
|
||||
</NavBar>
|
||||
<div className="approvalContext">
|
||||
{node && flowContext ? (
|
||||
<FlowContext.Provider value={flowContext}>
|
||||
<ContextApprovalExecution.Provider value={jobsData}>
|
||||
<SchemaComponent
|
||||
components={{
|
||||
FormBlockProvider,
|
||||
DetailsBlockProvider,
|
||||
ActionBarProvider: ActionBarUserJobsProvider,
|
||||
ManualActionStatusProvider,
|
||||
// @ts-ignore
|
||||
...Array.from(manualFormTypes.getValues()).reduce(
|
||||
(result, item: ManualFormType) => Object.assign(result, item.block.components),
|
||||
{},
|
||||
),
|
||||
...nodeComponents,
|
||||
MobileProvider,
|
||||
}}
|
||||
scope={{
|
||||
useSubmit: useUserJobsSubmit,
|
||||
useFormBlockProps: useUserJobsFormBlockProps,
|
||||
useDetailsBlockProps,
|
||||
// @ts-ignore
|
||||
...Array.from(manualFormTypes.getValues()).reduce(
|
||||
(result, item: ManualFormType) => Object.assign(result, item.block.scope),
|
||||
{},
|
||||
),
|
||||
}}
|
||||
schema={{
|
||||
type: 'void',
|
||||
'x-component': 'MobileProvider',
|
||||
properties: {
|
||||
page: {
|
||||
type: 'void',
|
||||
'x-component': 'MPage',
|
||||
'x-designer': 'MPage.Designer',
|
||||
'x-component-props': {},
|
||||
properties: Object.values(node.config?.schema)[0]['properties'],
|
||||
},
|
||||
},
|
||||
}}
|
||||
/>
|
||||
</ContextApprovalExecution.Provider>
|
||||
</FlowContext.Provider>
|
||||
) : (
|
||||
<div>
|
||||
<Skeleton.Title animated />
|
||||
<Skeleton.Paragraph lineCount={5} animated />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
function useDetailsBlockProps() {
|
||||
const { form } = useFormBlockContext();
|
||||
return { form };
|
||||
}
|
||||
|
||||
export const manualFormTypes = new Registry<ManualFormType>();
|
@ -0,0 +1,71 @@
|
||||
export const tabPendingSchema = (t, props, parantUid) => {
|
||||
return {
|
||||
type: 'void',
|
||||
name: 'TabPendingItem',
|
||||
title: t('Pending'),
|
||||
'x-settings': 'ApprovalSettings',
|
||||
'x-component': 'TabPendingItem',
|
||||
'x-component-props': {
|
||||
...props,
|
||||
collectionName: 'approvalRecords',
|
||||
settingBlock: true,
|
||||
tabKey: 'pending',
|
||||
parantUid,
|
||||
parantParams: props['params'],
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const tabProcessedSchema = (t, props, parantUid) => {
|
||||
return {
|
||||
type: 'void',
|
||||
name: 'TabProcessedItem',
|
||||
title: t('Processed'),
|
||||
'x-settings': 'ApprovalSettings',
|
||||
'x-component': 'TabProcessedItem',
|
||||
'x-component-props': {
|
||||
...props,
|
||||
collectionName: 'approvalRecords',
|
||||
settingBlock: true,
|
||||
tabKey: 'processed',
|
||||
parantUid,
|
||||
parantParams: props['params'],
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const tabDuplicateSchema = (t, props, parantUid) => {
|
||||
return {
|
||||
type: 'void',
|
||||
name: 'TabDuplicateItem',
|
||||
title: t('Duplicate'),
|
||||
'x-settings': 'ApprovalSettings',
|
||||
'x-component': 'TabDuplicateItem',
|
||||
'x-component-props': {
|
||||
...props,
|
||||
collectionName: 'approvalRecords',
|
||||
settingBlock: true,
|
||||
tabKey: 'duplicate',
|
||||
parantUid,
|
||||
parantParams: props['params'],
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const tabExecutedSchema = (t, props, parantUid) => {
|
||||
return {
|
||||
type: 'void',
|
||||
name: 'TabExecutedItem',
|
||||
title: t('Executed'),
|
||||
'x-settings': 'ApprovalSettings',
|
||||
'x-component': 'TabExecutedItem',
|
||||
'x-component-props': {
|
||||
...props,
|
||||
collectionName: 'users_jobs',
|
||||
settingBlock: true,
|
||||
tabKey: 'executed',
|
||||
parantUid,
|
||||
parantParams: props['params'],
|
||||
},
|
||||
};
|
||||
};
|
@ -1,8 +1,12 @@
|
||||
import { useEffect } from 'react';
|
||||
import { useCurrentUserContext } from '@tachybase/client';
|
||||
import { useCurrentUserContext, useFormBlockContext, useRecord } from '@tachybase/client';
|
||||
import { useFlowContext } from '@tachybase/plugin-workflow/client';
|
||||
import { useForm } from '@tachybase/schema';
|
||||
|
||||
import { ApprovalStatusEnumDict } from '../../constants';
|
||||
|
||||
import { ApprovalStatusEnumDict } from '../../constants';
|
||||
|
||||
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
|
||||
|
||||
export function useFormBlockProps() {
|
||||
@ -29,3 +33,25 @@ export function useFormBlockProps() {
|
||||
|
||||
return { form };
|
||||
}
|
||||
|
||||
export function useUserJobsFormBlockProps() {
|
||||
const { userJob, execution } = useFlowContext();
|
||||
const record = useRecord();
|
||||
const { data: user } = useCurrentUserContext();
|
||||
const { form } = useFormBlockContext();
|
||||
|
||||
const pattern =
|
||||
execution.status || userJob.status
|
||||
? record
|
||||
? 'readPretty'
|
||||
: 'disabled'
|
||||
: user?.data?.id !== userJob.userId
|
||||
? 'disabled'
|
||||
: 'editable';
|
||||
|
||||
useEffect(() => {
|
||||
form?.setPattern(pattern);
|
||||
}, [pattern, form]);
|
||||
|
||||
return { form };
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { useActionContext, useAPIClient } from '@tachybase/client';
|
||||
import { useField, useForm } from '@tachybase/schema';
|
||||
import { useActionContext, useAPIClient, useTableBlockContext } from '@tachybase/client';
|
||||
import { useFlowContext } from '@tachybase/plugin-workflow/client';
|
||||
import { useField, useFieldSchema, useForm } from '@tachybase/schema';
|
||||
|
||||
import { Toast } from 'antd-mobile';
|
||||
|
||||
@ -50,3 +51,41 @@ export function useSubmit() {
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function useUserJobsSubmit() {
|
||||
const api = useAPIClient();
|
||||
const { values, submit } = useForm();
|
||||
const buttonSchema = useFieldSchema();
|
||||
const { service } = useTableBlockContext();
|
||||
const { userJob, execution } = useFlowContext();
|
||||
const { name: actionKey } = buttonSchema;
|
||||
const { name: formKey } = buttonSchema.parent.parent;
|
||||
return {
|
||||
async run() {
|
||||
if (execution.status || userJob.status) {
|
||||
return;
|
||||
}
|
||||
await submit();
|
||||
const res = await api.resource('users_jobs').submit({
|
||||
filterByTk: userJob.id,
|
||||
values: {
|
||||
result: { [formKey]: values, _: actionKey },
|
||||
},
|
||||
});
|
||||
if (res.status === 202) {
|
||||
Toast.show({
|
||||
icon: 'success',
|
||||
content: '处理成功',
|
||||
});
|
||||
setTimeout(() => {
|
||||
location.reload();
|
||||
}, 1000);
|
||||
} else {
|
||||
Toast.show({
|
||||
icon: 'fail',
|
||||
content: '处理失败',
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
@ -1,22 +1,23 @@
|
||||
export interface ApprovalExecution {
|
||||
id: number;
|
||||
approval: Approval;
|
||||
approval?: Approval;
|
||||
approvalExecution?: approvalExecution;
|
||||
approvalId: number;
|
||||
approvalId?: number;
|
||||
comment?: any;
|
||||
execution: execution;
|
||||
executionId: number;
|
||||
index?: string;
|
||||
job?: job;
|
||||
jobId?: number;
|
||||
node?: node;
|
||||
nodeId?: number;
|
||||
snapshot: snapshot;
|
||||
job: job;
|
||||
jobId: number;
|
||||
node: node;
|
||||
nodeId: number;
|
||||
snapshot?: snapshot;
|
||||
status: number;
|
||||
user?: user;
|
||||
userId?: number;
|
||||
workflow?: any;
|
||||
workflowId?: number;
|
||||
workflow: any;
|
||||
workflowId: number;
|
||||
result: any;
|
||||
updatedAt: any;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
import React from 'react';
|
||||
import { ActionBarProvider as ClientActionBarProvider, useCompile } from '@tachybase/client';
|
||||
import { ActionBarProvider as ClientActionBarProvider, useCompile, useCurrentUserContext } from '@tachybase/client';
|
||||
import { useFlowContext } from '@tachybase/plugin-workflow/client';
|
||||
import { useFieldSchema } from '@tachybase/schema';
|
||||
import { str2moment } from '@tachybase/utils/client';
|
||||
|
||||
import { Space, Tag } from 'antd';
|
||||
@ -29,3 +31,24 @@ const ComponentUserInfo = () => {
|
||||
</Space>
|
||||
);
|
||||
};
|
||||
|
||||
export function ActionBarUserJobsProvider(props) {
|
||||
const { data: user } = useCurrentUserContext();
|
||||
const { userJob } = useFlowContext();
|
||||
const { status, result, userId } = userJob;
|
||||
const buttonSchema = useFieldSchema();
|
||||
const { name } = buttonSchema.parent.toJSON();
|
||||
|
||||
let { children: content } = props;
|
||||
if (status) {
|
||||
if (!result[name]) {
|
||||
content = null;
|
||||
}
|
||||
} else {
|
||||
if (user?.data?.id !== userId) {
|
||||
content = null;
|
||||
}
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
@ -0,0 +1,98 @@
|
||||
import React, { useMemo, useRef } from 'react';
|
||||
import {
|
||||
BlockRequestContext_deprecated,
|
||||
CollectionManagerProvider,
|
||||
CollectionProvider_deprecated,
|
||||
DEFAULT_DATA_SOURCE_KEY,
|
||||
FormActiveFieldsProvider,
|
||||
FormBlockContext,
|
||||
FormV2,
|
||||
RecordProvider,
|
||||
useAPIClient,
|
||||
useAssociationNames,
|
||||
useBlockRequestContext,
|
||||
useDataSourceHeaders,
|
||||
useDesignable,
|
||||
useRecord,
|
||||
} from '@tachybase/client';
|
||||
import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
|
||||
|
||||
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
|
||||
|
||||
export function FormBlockProvider(props) {
|
||||
const userJob = useContextApprovalExecution();
|
||||
const fieldSchema = useFieldSchema();
|
||||
const field = useField();
|
||||
const formBlockRef = useRef(null);
|
||||
const dataSource = props.dataSource || DEFAULT_DATA_SOURCE_KEY;
|
||||
|
||||
const { getAssociationAppends } = useAssociationNames(dataSource);
|
||||
const { appends, updateAssociationValues } = getAssociationAppends();
|
||||
const [formKey] = Object.keys(fieldSchema.toJSON().properties ?? {});
|
||||
const values = userJob?.result?.[formKey];
|
||||
|
||||
const { findComponent } = useDesignable();
|
||||
const Component = findComponent(field.component?.[0]) || React.Fragment;
|
||||
|
||||
const form = useMemo(
|
||||
() =>
|
||||
createForm({
|
||||
initialValues: values,
|
||||
}),
|
||||
[values],
|
||||
);
|
||||
|
||||
const params = useMemo(() => {
|
||||
return {
|
||||
appends,
|
||||
...props.params,
|
||||
};
|
||||
}, [appends, props.params]);
|
||||
const service = useMemo(() => {
|
||||
return {
|
||||
loading: false,
|
||||
data: {
|
||||
data: values,
|
||||
},
|
||||
};
|
||||
}, [values]);
|
||||
const api = useAPIClient();
|
||||
const headers = useDataSourceHeaders(dataSource);
|
||||
|
||||
const resource = api.resource(props.collection, undefined, headers);
|
||||
const __parent = useBlockRequestContext();
|
||||
|
||||
const formBlockValue = useMemo(() => {
|
||||
return {
|
||||
params,
|
||||
form,
|
||||
field,
|
||||
service,
|
||||
updateAssociationValues,
|
||||
formBlockRef,
|
||||
};
|
||||
}, [field, form, params, service, updateAssociationValues]);
|
||||
|
||||
return !userJob.status || values ? (
|
||||
<CollectionManagerProvider dataSource={dataSource}>
|
||||
<CollectionProvider_deprecated collection={props.collection}>
|
||||
<RecordProvider record={values} parent={null}>
|
||||
<FormActiveFieldsProvider name="form">
|
||||
<BlockRequestContext_deprecated.Provider
|
||||
value={{ block: 'form', props, field, service, resource, __parent }}
|
||||
>
|
||||
<FormBlockContext.Provider value={formBlockValue}>
|
||||
<Component {...field.componentProps}>
|
||||
<FormV2.Templates style={{ marginBottom: 18 }} form={form} />
|
||||
<div ref={formBlockRef}>
|
||||
<RecursionField schema={fieldSchema} onlyRenderProperties />
|
||||
</div>
|
||||
</Component>
|
||||
</FormBlockContext.Provider>
|
||||
</BlockRequestContext_deprecated.Provider>
|
||||
</FormActiveFieldsProvider>
|
||||
</RecordProvider>
|
||||
</CollectionProvider_deprecated>
|
||||
</CollectionManagerProvider>
|
||||
) : null;
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
import React, { createContext, useEffect } from 'react';
|
||||
import { useFlowContext } from '@tachybase/plugin-workflow/client';
|
||||
import { useField, useFieldSchema } from '@tachybase/schema';
|
||||
|
||||
export const ManualActionStatusContext = createContext<number | null>(null);
|
||||
ManualActionStatusContext.displayName = 'ManualActionStatusContext';
|
||||
|
||||
export function ManualActionStatusProvider({ value, children }) {
|
||||
const { userJob, execution } = useFlowContext();
|
||||
const button = useField();
|
||||
const buttonSchema = useFieldSchema();
|
||||
|
||||
useEffect(() => {
|
||||
if (execution.status || userJob.status) {
|
||||
button.disabled = true;
|
||||
button.visible = userJob.status === value && userJob.result._ === buttonSchema.name;
|
||||
}
|
||||
}, [execution, userJob, value, button, buttonSchema.name]);
|
||||
|
||||
return <ManualActionStatusContext.Provider value={value}>{children}</ManualActionStatusContext.Provider>;
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
import { createContext, useContext } from 'react';
|
||||
|
||||
export const todosContext = createContext({});
|
||||
|
||||
export const useTodosContext = () => {
|
||||
return useContext(todosContext);
|
||||
};
|
@ -22,6 +22,10 @@ export class PluginApprovalMobileClient extends Plugin {
|
||||
path: '/mobile/:name/:id/:category/detailspage',
|
||||
Component: 'ViewActionTodosContent',
|
||||
});
|
||||
this.app.router.add('mobile.approval.userJobspage', {
|
||||
path: '/mobile/:name/:id/userJobspage',
|
||||
Component: 'ViewTodosUserJobsContent',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,5 +64,8 @@
|
||||
"Trigger data": "Trigger data",
|
||||
"All":"All",
|
||||
"Initiations":"Initiations",
|
||||
"UserInitiations":"UserInitiations"
|
||||
"UserInitiations":"UserInitiations",
|
||||
"Processed":"Processed",
|
||||
"Duplicate":"Duplicate",
|
||||
"Executed":"Executed"
|
||||
}
|
||||
|
@ -79,5 +79,24 @@
|
||||
"Trigger data": "触发器数据",
|
||||
"All":"全部",
|
||||
"Initiations":"发起申请",
|
||||
"UserInitiations":"我的发起"
|
||||
"UserInitiations":"我的发起",
|
||||
"Processed":"已处理",
|
||||
"Duplicate":"抄送我",
|
||||
"Executed":"执行处理",
|
||||
"On going": "进行中",
|
||||
"Resolved": "完成",
|
||||
"Failed": "失败",
|
||||
"Error": "出错",
|
||||
"Aborted": "已终止",
|
||||
"Retry needed": "需重试",
|
||||
"Triggered but still waiting in queue to execute.": "已触发但仍在队列中等待执行。",
|
||||
"Started and executing, maybe waiting for an async callback (manual, delay etc.).": "已开始执行,可能在等待异步回调(人工、延时等)。",
|
||||
"Successfully finished.": "成功完成。",
|
||||
"Failed to satisfy node configurations.": "未满足节点配置造成的失败。",
|
||||
"Some node meets error.": "某个节点出错。",
|
||||
"Running of some node was aborted by program flow.": "某个节点被程序流程终止。",
|
||||
"Manually canceled whole execution when waiting.": "等待时被手动取消整个执行。",
|
||||
"Rejected from a manual node.": "被人工节点拒绝继续。",
|
||||
"General failed but should do another try.": "执行失败,需重试。",
|
||||
"Queueing": "队列中"
|
||||
}
|
||||
|
@ -1,14 +1,16 @@
|
||||
import { MoreOutlined } from '@ant-design/icons';
|
||||
import { css, useAPIClient, useResourceActionContext } from '@tachybase/client';
|
||||
import { App, Dropdown, Empty, Tree } from 'antd';
|
||||
import { useContext, useEffect } from 'react';
|
||||
import { css, useAPIClient, useResourceActionContext } from '@tachybase/client';
|
||||
|
||||
import { MoreOutlined } from '@ant-design/icons';
|
||||
import { App, Dropdown, Empty, Tree } from 'antd';
|
||||
import { jsx, jsxs } from 'react/jsx-runtime';
|
||||
|
||||
import { useTranslation } from '../../../locale';
|
||||
import { contextK } from '../context/contextK';
|
||||
import { contextN } from '../context/contextN';
|
||||
import { k } from '../others/k';
|
||||
import { schemaHhe } from '../schema/schemaHhe';
|
||||
import { schemaYye } from '../schema/schemaYye';
|
||||
import { contextN } from '../context/contextN';
|
||||
|
||||
export const ComponentX = () => {
|
||||
const { data: e, loading: t } = useResourceActionContext();
|
||||
|
226
pnpm-lock.yaml
226
pnpm-lock.yaml
@ -4007,7 +4007,7 @@ importers:
|
||||
devDependencies:
|
||||
'@ant-design/icons':
|
||||
specifier: 5.x
|
||||
version: 5.3.6(react-dom@18.2.0)(react@18.2.0)
|
||||
version: 5.3.7(react-dom@18.2.0)(react@18.2.0)
|
||||
'@tachybase/actions':
|
||||
specifier: workspace:*
|
||||
version: link:../../../core/actions
|
||||
@ -4995,6 +4995,21 @@ packages:
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
/@ant-design/icons@5.3.7(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==}
|
||||
engines: {node: '>=8'}
|
||||
peerDependencies:
|
||||
react: '>=16.0.0'
|
||||
react-dom: '>=16.0.0'
|
||||
dependencies:
|
||||
'@ant-design/colors': 7.0.2
|
||||
'@ant-design/icons-svg': 4.4.2
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
/@ant-design/plots@2.1.14(lodash-es@4.17.21)(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-ZFhvlNUsPcvD8d+nX4bXA9djbEUDVfKm8/xvFplffWT68rWM37d32qI7EghSvLUreszqh60DZAy80wCA08lgoQ==}
|
||||
peerDependencies:
|
||||
@ -5048,7 +5063,7 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@ctrl/tinycolor': 3.6.1
|
||||
antd: 5.16.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
swr: 2.2.4(react@18.2.0)
|
||||
@ -5060,14 +5075,14 @@ packages:
|
||||
react: '>=17.0.0'
|
||||
react-dom: '>=17.0.0'
|
||||
dependencies:
|
||||
'@ant-design/icons': 5.3.6(react-dom@18.2.0)(react@18.2.0)
|
||||
'@ant-design/icons': 5.3.7(react-dom@18.2.0)(react@18.2.0)
|
||||
'@ant-design/pro-provider': 2.13.5(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@babel/runtime': 7.24.5
|
||||
antd: 5.16.1(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
dayjs: 1.11.10
|
||||
lodash.merge: 4.6.2
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
safe-stable-stringify: 2.4.3
|
||||
@ -10569,7 +10584,7 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@ctrl/tinycolor': 3.6.1
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -10580,7 +10595,7 @@ packages:
|
||||
react-dom: '>=16.9.0'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -10599,7 +10614,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -10612,7 +10627,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -10627,7 +10642,7 @@ packages:
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
'@rc-component/trigger': 2.1.1(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -10641,13 +10656,29 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: false
|
||||
|
||||
/@rc-component/trigger@2.1.0(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-24BQg0M34hUDSFofZ8qpTdMXwbykXIl7svFi3OaZwYiz3HDpmv0pOJs0p3zV6hl7q4QuJypmsDQNs2ADqRu7Bw==}
|
||||
engines: {node: '>=8.x'}
|
||||
peerDependencies:
|
||||
react: '>=16.9.0'
|
||||
react-dom: '>=16.9.0'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
/@rc-component/trigger@2.1.1(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-UjHkedkgtEcgQu87w1VuWug1idoDJV7VUt0swxHXRcmei2uu1AuUzGBPEUlmOmXGJ+YtTgZfVLi7kuAUKoZTMA==}
|
||||
engines: {node: '>=8.x'}
|
||||
@ -10658,9 +10689,9 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -14263,14 +14294,14 @@ packages:
|
||||
dependencies:
|
||||
'@ant-design/colors': 7.0.2
|
||||
'@ant-design/cssinjs': 1.20.0(react-dom@18.2.0)(react@18.2.0)
|
||||
'@ant-design/icons': 5.3.6(react-dom@18.2.0)(react@18.2.0)
|
||||
'@ant-design/icons': 5.3.7(react-dom@18.2.0)(react@18.2.0)
|
||||
'@ant-design/react-slick': 1.1.2(react@18.2.0)
|
||||
'@babel/runtime': 7.24.5
|
||||
'@ctrl/tinycolor': 3.6.1
|
||||
'@rc-component/color-picker': 1.5.3(react-dom@18.2.0)(react@18.2.0)
|
||||
'@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0)(react@18.2.0)
|
||||
'@rc-component/tour': 1.14.2(react-dom@18.2.0)(react@18.2.0)
|
||||
'@rc-component/trigger': 2.1.1(react-dom@18.2.0)(react@18.2.0)
|
||||
'@rc-component/trigger': 2.1.0(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
copy-to-clipboard: 3.3.3
|
||||
dayjs: 1.11.10
|
||||
@ -24447,7 +24478,7 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
dom-align: 1.12.4
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
resize-observer-polyfill: 1.5.1
|
||||
@ -24463,8 +24494,8 @@ packages:
|
||||
array-tree-filter: 2.1.0
|
||||
classnames: 2.5.1
|
||||
rc-select: 14.13.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-tree: 5.8.5(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-tree: 5.8.7(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24476,7 +24507,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24488,8 +24519,8 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24502,8 +24533,8 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24516,8 +24547,8 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24530,7 +24561,7 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/trigger': 2.1.1(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24543,7 +24574,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
async-validator: 4.2.5
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24556,7 +24587,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
async-validator: 4.2.5
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24570,8 +24601,8 @@ packages:
|
||||
'@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-dialog: 9.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24585,7 +24616,7 @@ packages:
|
||||
'@rc-component/mini-decimal': 1.1.0
|
||||
classnames: 2.5.1
|
||||
rc-input: 1.4.5(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24597,7 +24628,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24613,7 +24644,7 @@ packages:
|
||||
rc-input: 1.4.5(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-menu: 9.13.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-textarea: 1.6.3(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24626,9 +24657,9 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/trigger': 2.1.1(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24640,7 +24671,19 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
/rc-motion@2.9.1(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ==}
|
||||
peerDependencies:
|
||||
react: '>=16.9.0'
|
||||
react-dom: '>=16.9.0'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24653,8 +24696,8 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24667,7 +24710,7 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24679,7 +24722,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24709,7 +24752,7 @@ packages:
|
||||
dayjs: 1.11.10
|
||||
rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24721,7 +24764,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24734,7 +24777,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24746,7 +24789,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
resize-observer-polyfill: 1.5.1
|
||||
@ -24759,8 +24802,8 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24773,10 +24816,10 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
@ -24794,8 +24837,8 @@ packages:
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.3(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: false
|
||||
@ -24810,9 +24853,9 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
'@rc-component/trigger': 2.1.1(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
@ -24826,7 +24869,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24839,7 +24882,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24851,7 +24894,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24866,7 +24909,7 @@ packages:
|
||||
'@rc-component/context': 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
classnames: 2.5.1
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
@ -24882,9 +24925,9 @@ packages:
|
||||
classnames: 2.5.1
|
||||
rc-dropdown: 4.2.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-menu: 9.13.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24898,7 +24941,7 @@ packages:
|
||||
classnames: 2.5.1
|
||||
rc-input: 1.4.5(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24938,8 +24981,8 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-select: 14.13.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-tree: 5.8.5(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-tree: 5.8.7(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -24967,8 +25010,8 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
@ -24984,8 +25027,8 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.3(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: false
|
||||
@ -24999,8 +25042,23 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
/rc-tree@5.8.7(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-cpsIQZ4nNYwpj6cqPRt52e/69URuNdgQF9wZ10InmEf8W3+i0A41OVmZWwHuX9gegQSqj+DPmaDkZFKQZ+ZV1w==}
|
||||
engines: {node: '>=10.x'}
|
||||
peerDependencies:
|
||||
react: '*'
|
||||
react-dom: '*'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-virtual-list: 3.11.4(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
@ -25015,8 +25073,8 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-motion: 2.9.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: true
|
||||
@ -25029,7 +25087,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
@ -25055,6 +25113,32 @@ packages:
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
react-is: 18.3.1
|
||||
|
||||
/rc-util@5.41.0(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg==}
|
||||
peerDependencies:
|
||||
react: '>=16.9.0'
|
||||
react-dom: '>=16.9.0'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
react-is: 18.3.1
|
||||
|
||||
/rc-virtual-list@3.11.3(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==}
|
||||
engines: {node: '>=8.x'}
|
||||
peerDependencies:
|
||||
react: '*'
|
||||
react-dom: '*'
|
||||
dependencies:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: false
|
||||
|
||||
/rc-virtual-list@3.11.4(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-NbBi0fvyIu26gP69nQBiWgUMTPX3mr4FcuBQiVqagU0BnuX8WQkiivnMs105JROeuUIFczLrlgUhLQwTWV1XDA==}
|
||||
engines: {node: '>=8.x'}
|
||||
@ -25065,7 +25149,7 @@ packages:
|
||||
'@babel/runtime': 7.24.5
|
||||
classnames: 2.5.1
|
||||
rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0)
|
||||
rc-util: 5.41.0(react-dom@18.2.0)(react@18.2.0)
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user