feat: approval summary and refactor antd-style (#1036)
 Co-authored-by: sealday <zhanglin@daoyoucloud.com> Reviewed-on: daoyoucloud/tachybase#1036 Co-authored-by: bai.zixv <bai.zixv@foxmail.com> Co-committed-by: bai.zixv <bai.zixv@foxmail.com>
This commit is contained in:
		
							parent
							
								
									0596c95e18
								
							
						
					
					
						commit
						4274d7ee4a
					
				| @ -0,0 +1,275 @@ | ||||
| import { CloseCircleFilled } from '@ant-design/icons'; | ||||
| import { Tag, TreeSelect } from 'antd'; | ||||
| import type { DefaultOptionType, TreeSelectProps } from 'rc-tree-select/es/TreeSelect'; | ||||
| import React, { useCallback, useEffect, useMemo, useState } from 'react'; | ||||
| import { useTranslation } from 'react-i18next'; | ||||
| import { | ||||
|   CollectionFieldOptions_deprecated, | ||||
|   parseCollectionName, | ||||
|   useCollectionManager_deprecated, | ||||
|   useCompile, | ||||
| } from '../../..'; | ||||
| 
 | ||||
| export type AppendsTreeSelectPropsV2 = { | ||||
|   value: string[] | string; | ||||
|   onChange: (value: string[] | string) => void; | ||||
|   title?: string; | ||||
|   multiple?: boolean; | ||||
|   filter?(field): boolean; | ||||
|   collection?: string; | ||||
|   needLeaf?: boolean; | ||||
|   useCollection?(props: Pick<AppendsTreeSelectPropsV2, 'collection'>): string; | ||||
|   rootOption?: { | ||||
|     label: string; | ||||
|     value: string; | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| type TreeOptionType = Omit<DefaultOptionType, 'value'> & { value: string }; | ||||
| 
 | ||||
| function usePropsCollection({ collection }) { | ||||
|   return collection; | ||||
| } | ||||
| 
 | ||||
| type CallScope = { | ||||
|   compile?(value: string): string; | ||||
|   getCollectionFields?(name: any, dataSource?: string): CollectionFieldOptions_deprecated[]; | ||||
|   filter(field): boolean; | ||||
| }; | ||||
| 
 | ||||
| function loadChildren(this, option) { | ||||
|   const result = getCollectionFieldOptions.call(this, option.field.target, option); | ||||
|   if (result.length) { | ||||
|     if (!result.some((item) => isAssociation(item.field))) { | ||||
|       option.isLeaf = true; | ||||
|     } | ||||
|   } else { | ||||
|     option.isLeaf = true; | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
| 
 | ||||
| function isAssociation(field) { | ||||
|   return field.target && field.interface; | ||||
| } | ||||
| 
 | ||||
| function trueFilter(field) { | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| function getCollectionFieldOptions( | ||||
|   this: CallScope, | ||||
|   collection, | ||||
|   parentNode?, | ||||
|   options = { needLeaf: false }, | ||||
| ): TreeOptionType[] { | ||||
|   const { needLeaf } = options; | ||||
|   const [dataSourceName, collectionName] = parseCollectionName(collection); | ||||
|   const rawFields = this.getCollectionFields(collectionName, dataSourceName); | ||||
|   const fields = needLeaf ? rawFields : rawFields.filter(isAssociation); | ||||
|   const boundLoadChildren = loadChildren.bind(this); | ||||
|   return fields.filter(this.filter).map((field) => { | ||||
|     const key = parentNode ? `${parentNode.value ? `${parentNode.value}.` : ''}${field.name}` : field.name; | ||||
|     const fieldTitle = this.compile(field.uiSchema?.title) ?? field.name; | ||||
|     const isLeaf = !this.getCollectionFields(field.target).filter(isAssociation).filter(this.filter).length; | ||||
|     return { | ||||
|       pId: parentNode?.key ?? null, | ||||
|       id: key, | ||||
|       key, | ||||
|       value: key, | ||||
|       title: fieldTitle, | ||||
|       isLeaf, | ||||
|       loadChildren: isLeaf ? null : boundLoadChildren, | ||||
|       field, | ||||
|       fullTitle: parentNode ? [...parentNode.fullTitle, fieldTitle] : [fieldTitle], | ||||
|     }; | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // XXX: 目前 AppendsTreeSelectV2 和 AppendsTreeSelect 都有特化逻辑, 需要整理出一个通用组件
 | ||||
| export const AppendsTreeSelectV2: React.FC<TreeSelectProps & AppendsTreeSelectPropsV2> = (props) => { | ||||
|   const { | ||||
|     title, | ||||
|     value: propsValue, | ||||
|     onChange, | ||||
|     collection, | ||||
|     useCollection = usePropsCollection, | ||||
|     filter = trueFilter, | ||||
|     rootOption, | ||||
|     loadData: propsLoadData, | ||||
|     needLeaf = false, | ||||
|     ...restProps | ||||
|   } = props; | ||||
|   const compile = useCompile(); | ||||
|   const { t } = useTranslation(); | ||||
|   const [optionsMap, setOptionsMap] = useState({}); | ||||
|   const collectionString = useCollection({ collection }); | ||||
|   const [dataSourceName, collectionName] = parseCollectionName(collectionString); | ||||
|   const { getCollectionFields } = useCollectionManager_deprecated(dataSourceName); | ||||
|   const treeData = Object.values(optionsMap); | ||||
|   const value: string | DefaultOptionType[] = useMemo(() => { | ||||
|     if (props.multiple) { | ||||
|       return ((propsValue as string[]) || []).map((v) => optionsMap[v]).filter(Boolean); | ||||
|     } | ||||
|     return propsValue; | ||||
|   }, [propsValue, props.multiple, optionsMap]); | ||||
| 
 | ||||
|   const loadData = useCallback( | ||||
|     async (option) => { | ||||
|       if (propsLoadData != null) { | ||||
|         return propsLoadData(option); | ||||
|       } | ||||
|       if (!option.isLeaf && option.loadChildren) { | ||||
|         const children = option.loadChildren(option); | ||||
|         setOptionsMap((prev) => { | ||||
|           return children.reduce((result, item) => Object.assign(result, { [item.value]: item }), { ...prev }); | ||||
|         }); | ||||
|       } | ||||
|     }, | ||||
|     [propsLoadData], | ||||
|   ); | ||||
|   // NOTE:
 | ||||
|   useEffect(() => { | ||||
|     const parentNode = rootOption | ||||
|       ? { | ||||
|           ...rootOption, | ||||
|           id: rootOption.value, | ||||
|           key: rootOption.value, | ||||
|           title: rootOption.label, | ||||
|           fullTitle: rootOption.label, | ||||
|           isLeaf: false, | ||||
|         } | ||||
|       : null; | ||||
|     const tData = | ||||
|       propsLoadData === null | ||||
|         ? [] | ||||
|         : getCollectionFieldOptions.call({ compile, getCollectionFields, filter }, collectionString, parentNode, { | ||||
|             needLeaf, | ||||
|           }); | ||||
| 
 | ||||
|     const map = tData.reduce((result, item) => Object.assign(result, { [item.value]: item }), {}); | ||||
|     if (parentNode) { | ||||
|       map[parentNode.value] = parentNode; | ||||
|     } | ||||
|     setOptionsMap(map); | ||||
|   }, [collectionString, rootOption, filter, propsLoadData]); | ||||
| 
 | ||||
|   // NOTE: preload options in value
 | ||||
|   useEffect(() => { | ||||
|     const arr = (props.multiple ? propsValue : propsValue ? [propsValue] : []) as string[]; | ||||
|     console.log('%c Line:160 🍑 arr', 'font-size:18px;color:#4fff4B;background:#f5ce50', arr); | ||||
|     if (!arr?.length || arr.every((v) => Boolean(optionsMap[v]))) { | ||||
|       return; | ||||
|     } | ||||
|     const loaded = []; | ||||
| 
 | ||||
|     arr.forEach((v) => { | ||||
|       if (typeof v !== 'string') { | ||||
|         v = v.value; | ||||
|       } | ||||
|       const paths = v.split('.'); | ||||
|       let option = optionsMap[paths[0]]; | ||||
|       for (let i = 1; i < paths.length; i++) { | ||||
|         if (!option) { | ||||
|           break; | ||||
|         } | ||||
|         const next = paths.slice(0, i + 1).join('.'); | ||||
|         if (optionsMap[next]) { | ||||
|           option = optionsMap[next]; | ||||
|           break; | ||||
|         } | ||||
|         if (!option.isLeaf && option.loadChildren) { | ||||
|           const children = option.loadChildren(option); | ||||
|           if (children?.length) { | ||||
|             loaded.push(...children); | ||||
|             option = children.find((item) => item.value === paths.slice(0, i + 1).join('.')); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }); | ||||
|     setOptionsMap((prev) => { | ||||
|       return loaded.reduce((result, item) => Object.assign(result, { [item.value]: item }), { ...prev }); | ||||
|     }); | ||||
|   }, [propsValue, treeData.length, props.multiple]); | ||||
| 
 | ||||
|   const handleChange = useCallback( | ||||
|     (next: DefaultOptionType[] | string) => { | ||||
|       console.log('%c Line:193 🥔 next', 'font-size:18px;color:#42b983;background:#f5ce50', next); | ||||
|       if (!props.multiple) { | ||||
|         onChange(next as string | Array<any>); | ||||
|         return; | ||||
|       } | ||||
| 
 | ||||
|       const newValue = (next as DefaultOptionType[]).map((i) => i.value).filter(Boolean) as string[]; | ||||
|       const valueSet = new Set(newValue); | ||||
|       const delValue = (value as DefaultOptionType[]).find((i) => !valueSet.has(i.value as string)); | ||||
| 
 | ||||
|       if (delValue) { | ||||
|         const prefix = `${delValue.value}.`; | ||||
|         Object.keys(optionsMap).forEach((key) => { | ||||
|           if (key.startsWith(prefix)) { | ||||
|             valueSet.delete(key); | ||||
|           } | ||||
|         }); | ||||
|       } else { | ||||
|         newValue.forEach((v) => { | ||||
|           const paths = v.split('.'); | ||||
|           if (paths.length) { | ||||
|             for (let i = 1; i <= paths.length; i++) { | ||||
|               valueSet.add(paths.slice(0, i).join('.')); | ||||
|             } | ||||
|           } | ||||
|         }); | ||||
|       } | ||||
|       onChange(next); | ||||
|     }, | ||||
|     [props.multiple, value, onChange, optionsMap], | ||||
|   ); | ||||
| 
 | ||||
|   const TreeTag = useCallback( | ||||
|     (props) => { | ||||
|       const { value, onClose, disabled, closable } = props; | ||||
|       if (!value) { | ||||
|         return null; | ||||
|       } | ||||
|       const { fullTitle } = optionsMap[value] ?? {}; | ||||
|       return ( | ||||
|         <Tag closable={closable && !disabled} onClose={onClose}> | ||||
|           {fullTitle?.join(' / ')} | ||||
|         </Tag> | ||||
|       ); | ||||
|     }, | ||||
|     [optionsMap], | ||||
|   ); | ||||
| 
 | ||||
|   const filteredValue = Array.isArray(value) ? value.filter((i) => i.value in optionsMap) : value; | ||||
|   console.log('%c Line:247 🥕 filteredValue', 'font-size:18px;color:#6ec1c2;background:#ea7e5c', filteredValue); | ||||
|   const valueKeys: string[] = props.multiple | ||||
|     ? (propsValue as string[]) | ||||
|     : propsValue != null | ||||
|       ? [propsValue as string] | ||||
|       : []; | ||||
| 
 | ||||
|   return ( | ||||
|     <TreeSelect | ||||
|       // @ts-ignore
 | ||||
|       role="button" | ||||
|       data-testid={`select-field${title ? `-${title}` : ''}`} | ||||
|       value={filteredValue} | ||||
|       placeholder={t('Select field')} | ||||
|       showCheckedStrategy={TreeSelect.SHOW_ALL} | ||||
|       treeDefaultExpandedKeys={valueKeys} | ||||
|       allowClear={{ | ||||
|         clearIcon: <CloseCircleFilled role="button" aria-label="icon-close" />, | ||||
|       }} | ||||
|       treeCheckStrictly={props.multiple} | ||||
|       treeCheckable={props.multiple} | ||||
|       tagRender={TreeTag} | ||||
|       onChange={handleChange as (next) => void} | ||||
|       treeDataSimpleMode | ||||
|       treeData={treeData} | ||||
|       loadData={loadData} | ||||
|       {...restProps} | ||||
|     /> | ||||
|   ); | ||||
| }; | ||||
| @ -1 +1,2 @@ | ||||
| export * from './AppendsTreeSelect'; | ||||
| export * from './AppendsTreeSelectV2'; | ||||
|  | ||||
| @ -96,7 +96,7 @@ export const CollectionApprovalTodos = { | ||||
|     }, | ||||
|     { | ||||
|       type: 'string', | ||||
|       name: 'summaryString', | ||||
|       name: 'summary', | ||||
|       interface: 'input', | ||||
|       uiSchema: { | ||||
|         type: 'string', | ||||
|  | ||||
| @ -118,8 +118,7 @@ export class ApprovalTrigger extends Trigger { | ||||
|       type: 'array', | ||||
|       title: '{{t("Select fields to display in the approval summary", { ns: "workflow" })}}', | ||||
|       'x-decorator': 'FormItem', | ||||
|       // TODO: 需要更换为能支持同时选择普通字段和关联字段的组件.目前只能选择关联字段.走通业务逻辑为先
 | ||||
|       'x-component': 'AppendsTreeSelect', | ||||
|       'x-component': 'AppendsTreeSelectV2', | ||||
|       'x-component-props': { | ||||
|         title: 'Preload associations', | ||||
|         multiple: true, | ||||
|  | ||||
| @ -142,13 +142,13 @@ export const SchemaApprovalBlockLaunch = { | ||||
|             }, | ||||
|           }, | ||||
|         }, | ||||
|         summaryString: { | ||||
|         summary: { | ||||
|           type: 'void', | ||||
|           'x-decorator': 'TableV2.Column.Decorator', | ||||
|           'x-component': 'TableV2.Column', | ||||
|           title: tval('Approval Summary'), | ||||
|           properties: { | ||||
|             summaryString: { | ||||
|             summary: { | ||||
|               type: 'string', | ||||
|               'x-component': 'CollectionField', | ||||
|               'x-read-pretty': true, | ||||
|  | ||||
| @ -143,13 +143,13 @@ export const SchemaApprovalBlockTodos = { | ||||
|             }, | ||||
|           }, | ||||
|         }, | ||||
|         summaryString: { | ||||
|         summary: { | ||||
|           type: 'void', | ||||
|           'x-decorator': 'TableV2.Column.Decorator', | ||||
|           'x-component': 'TableV2.Column', | ||||
|           title: tval('Approval Summary'), | ||||
|           properties: { | ||||
|             summaryString: { | ||||
|             summary: { | ||||
|               type: 'string', | ||||
|               'x-component': 'CollectionField', | ||||
|               'x-read-pretty': true, | ||||
|  | ||||
| @ -73,7 +73,7 @@ export const CollectionApprovals = { | ||||
|     }, | ||||
|     { | ||||
|       type: 'string', | ||||
|       name: 'summaryString', | ||||
|       name: 'summary', | ||||
|       interface: 'input', | ||||
|       uiSchema: { | ||||
|         type: 'string', | ||||
|  | ||||
| @ -1,14 +1,31 @@ | ||||
| import { useCollectionManager, useCollectionRecordData, useCompile } from '@tachybase/client'; | ||||
| import React from 'react'; | ||||
| import useStyles from './style'; | ||||
| 
 | ||||
| export const ApprovalsSummary = (props) => { | ||||
|   const { value = '', style } = props; | ||||
|   const valueArray = value.split(','); | ||||
|   const { value = '' } = props; | ||||
|   const record = useCollectionRecordData(); | ||||
|   const cm = useCollectionManager(); | ||||
|   const compile = useCompile(); | ||||
|   const { styles } = useStyles(); | ||||
| 
 | ||||
|   const { collectionName } = record; | ||||
|   const results = Object.entries(value).map(([key, objValue]) => { | ||||
|     const field = cm.getCollectionField(`${collectionName}.${key}`); | ||||
|     return { | ||||
|       label: compile(field?.uiSchema?.title || key), | ||||
|       value: Object.prototype.toString.call(objValue) === '[object Object]' ? objValue?.['name'] : objValue, | ||||
|     }; | ||||
|   }); | ||||
| 
 | ||||
|   // 展示结果要展示一个数组对象, 是 label 和 value 的形式
 | ||||
|   // label 放中文, value 放值
 | ||||
|   return ( | ||||
|     <div> | ||||
|       {valueArray.map((val) => ( | ||||
|         <div style={style} key={val}> | ||||
|           {val} | ||||
|     <div className={styles.ApprovalsSummaryStyle}> | ||||
|       {results.map((item) => ( | ||||
|         <div className={`${styles.ApprovalsSummaryStyle}-item`} key={item.label}> | ||||
|           <div className={`${styles.ApprovalsSummaryStyle}-item-label`}>{`${item.label}:`}   </div> | ||||
|           <div className={`${styles.ApprovalsSummaryStyle}-item-value`}>{item.value}</div> | ||||
|         </div> | ||||
|       ))} | ||||
|     </div> | ||||
|  | ||||
| @ -0,0 +1,27 @@ | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| const useStyles = createStyles(({ css }) => { | ||||
|   return { | ||||
|     ApprovalsSummaryStyle: css` | ||||
|       text-align: left; | ||||
|       &-item { | ||||
|         display: flex; | ||||
|         flex-direction: row; | ||||
|         align-items: baseline; | ||||
|         overflow: hidden; | ||||
| 
 | ||||
|         &-label { | ||||
|           text-overflow: ellipsis; | ||||
|           white-space: nowrap; | ||||
|           color: #aaa; | ||||
|         } | ||||
|         &-value { | ||||
|           text-overflow: ellipsis; | ||||
|           white-space: nowrap; | ||||
|         } | ||||
|       } | ||||
|     `,
 | ||||
|   }; | ||||
| }); | ||||
| 
 | ||||
| export default useStyles; | ||||
| @ -127,7 +127,7 @@ export default class ApprovalInstruction extends Instruction { | ||||
|       filter: { | ||||
|         'executions.id': processor.execution.id, | ||||
|       }, | ||||
|       fields: ['id', 'status', 'data', 'summaryString'], | ||||
|       fields: ['id', 'status', 'data', 'summary', 'collectionName'], | ||||
|       appends: ['approvalExecutions'], | ||||
|       except: ['data'], | ||||
|     }); | ||||
| @ -145,7 +145,8 @@ export default class ApprovalInstruction extends Instruction { | ||||
|         index, | ||||
|         status: node.config.order && index ? APPROVAL_ACTION_STATUS.ASSIGNED : APPROVAL_ACTION_STATUS.PENDING, | ||||
|         snapshot: approvalExecution.snapshot, | ||||
|         summaryString: approval.summaryString, | ||||
|         summary: approval.summary, | ||||
|         collectionName: approval.collectionName, | ||||
|       })), | ||||
|       { | ||||
|         transaction: processor.transaction, | ||||
|  | ||||
| @ -5,7 +5,7 @@ import { parseCollectionName } from '@tachybase/data-source-manager'; | ||||
| import { EXECUTION_STATUS, Trigger, toJSON, JOB_STATUS } from '@tachybase/plugin-workflow'; | ||||
| import { APPROVAL_ACTION_STATUS, APPROVAL_STATUS } from './constants'; | ||||
| import { UiSchemaRepository } from '@nocobase/plugin-ui-schema-storage'; | ||||
| import { getSummaryString } from './tools'; | ||||
| import { getSummary } from './tools'; | ||||
| 
 | ||||
| const ExecutionStatusMap = { | ||||
|   [EXECUTION_STATUS.RESOLVED]: APPROVAL_STATUS.APPROVED, | ||||
| @ -52,10 +52,11 @@ export default class ApprovalTrigger extends Trigger { | ||||
|         data: toJSON(data), | ||||
|         approvalId: approval.id, | ||||
|         applicantRoleName: approval.applicantRoleName, | ||||
|         summaryString: getSummaryString({ | ||||
|         summary: getSummary({ | ||||
|           summaryConfig: workflow.config.summary, | ||||
|           data, | ||||
|         }), | ||||
|         collectionName: approval.collectionName, | ||||
|       }, | ||||
|       { transaction }, | ||||
|     ); | ||||
| @ -65,14 +66,15 @@ export default class ApprovalTrigger extends Trigger { | ||||
|     if (workflow.type !== ApprovalTrigger.TYPE) { | ||||
|       return; | ||||
|     } | ||||
|     const { approvalId, data, summaryString } = execution.context; | ||||
|     const { approvalId, data, summary, collectionName } = execution.context; | ||||
|     const approvalExecution = await this.workflow.db.getRepository('approvalExecutions').create({ | ||||
|       values: { | ||||
|         approvalId, | ||||
|         executionId: execution.id, | ||||
|         status: execution.status, | ||||
|         snapshot: data, | ||||
|         summaryString: summaryString, | ||||
|         summary, | ||||
|         collectionName, | ||||
|       }, | ||||
|       transaction, | ||||
|     }); | ||||
| @ -198,7 +200,10 @@ export default class ApprovalTrigger extends Trigger { | ||||
|           // updatedById: currentUser.id,
 | ||||
|           workflowId: workflow.id, | ||||
|           workflowKey: workflow.key, | ||||
|           summaryString: '12,11,15', | ||||
|           summary: getSummary({ | ||||
|             summaryConfig: workflow.config.summary, | ||||
|             data, | ||||
|           }), | ||||
|         }, | ||||
|         context, | ||||
|       }); | ||||
| @ -231,7 +236,6 @@ export default class ApprovalTrigger extends Trigger { | ||||
|           const { repository } = this.workflow.app.dataSourceManager.dataSources | ||||
|             .get(dataSourceName) | ||||
|             .collectionManager.getCollection(collectionName); | ||||
|           const curretSummaryConfig = workflow.config?.summary || []; | ||||
|           dataCurrent = await repository.findOne({ | ||||
|             filterByTk: data.id, | ||||
|             appends: [...workflow.config.appends], | ||||
| @ -268,7 +272,7 @@ export default class ApprovalTrigger extends Trigger { | ||||
|             workflowId: workflow.id, | ||||
|             workflowKey: workflow.key, | ||||
|             applicantRoleName: context.state.currentRole, | ||||
|             summaryString: getSummaryString({ | ||||
|             summary: getSummary({ | ||||
|               summaryConfig: workflow.config.summary, | ||||
|               data: dataCurrent, | ||||
|             }), | ||||
|  | ||||
| @ -2,6 +2,7 @@ import actions, { utils } from '@tachybase/actions'; | ||||
| import WorkflowPlugin, { EXECUTION_STATUS, JOB_STATUS, toJSON } from '@tachybase/plugin-workflow'; | ||||
| import { APPROVAL_STATUS, APPROVAL_ACTION_STATUS } from './constants'; | ||||
| import { parseCollectionName } from '@tachybase/data-source-manager'; | ||||
| import { getSummary } from './tools'; | ||||
| 
 | ||||
| const workflows = { | ||||
|   async listApprovalFlows(context, next) { | ||||
| @ -60,7 +61,10 @@ const approvals = { | ||||
|         dataKey: values[collection.filterTargetKey], | ||||
|         workflowKey: workflow.key, | ||||
|         applicantRoleName: context.state.currentRole, | ||||
|         summary: toJSON(workflow.config?.summary ?? []), | ||||
|         summary: getSummary({ | ||||
|           summaryConfig: workflow.config.summary, | ||||
|           data: instance, | ||||
|         }), | ||||
|       }, | ||||
|     }); | ||||
|     return actions.create(context, next); | ||||
| @ -238,7 +242,8 @@ const approvalRecords = { | ||||
|       status: values.status, | ||||
|       comment: values.comment, | ||||
|       snapshot: approvalRecord.approval.data, | ||||
|       summaryString: approvalRecord.approval.summaryString, | ||||
|       summary: approvalRecord.approval.summary, | ||||
|       collectionName: approvalRecord.approval.collectionName, | ||||
|     }); | ||||
|     context.body = approvalRecord.get(); | ||||
|     context.status = 202; | ||||
|  | ||||
| @ -6,6 +6,10 @@ export default defineCollection({ | ||||
|   dumpRules: 'required', | ||||
|   name: 'approvalExecutions', | ||||
|   fields: [ | ||||
|     { | ||||
|       type: 'string', | ||||
|       name: 'collectionName', | ||||
|     }, | ||||
|     { | ||||
|       type: 'bigInt', | ||||
|       name: 'id', | ||||
| @ -32,6 +36,11 @@ export default defineCollection({ | ||||
|       type: 'jsonb', | ||||
|       name: 'snapshot', | ||||
|     }, | ||||
|     { | ||||
|       type: 'jsonb', | ||||
|       name: 'summary', | ||||
|       defaultValue: {}, | ||||
|     }, | ||||
|     { | ||||
|       type: 'hasMany', | ||||
|       name: 'records', | ||||
|  | ||||
| @ -6,6 +6,10 @@ export default defineCollection({ | ||||
|   dumpRules: 'required', | ||||
|   name: 'approvalRecords', | ||||
|   fields: [ | ||||
|     { | ||||
|       type: 'string', | ||||
|       name: 'collectionName', | ||||
|     }, | ||||
|     { | ||||
|       type: 'belongsTo', | ||||
|       name: 'approval', | ||||
| @ -51,9 +55,9 @@ export default defineCollection({ | ||||
|       defaultValue: {}, | ||||
|     }, | ||||
|     { | ||||
|       type: 'string', | ||||
|       name: 'summaryString', | ||||
|       defaultValue: '', | ||||
|       type: 'jsonb', | ||||
|       name: 'summary', | ||||
|       defaultValue: {}, | ||||
|     }, | ||||
|     { | ||||
|       type: 'text', | ||||
|  | ||||
| @ -62,9 +62,9 @@ export default defineCollection({ | ||||
|       defaultValue: {}, | ||||
|     }, | ||||
|     { | ||||
|       type: 'string', | ||||
|       name: 'summaryString', | ||||
|       defaultValue: '', | ||||
|       type: 'jsonb', | ||||
|       name: 'summary', | ||||
|       defaultValue: {}, | ||||
|     }, | ||||
|     { | ||||
|       type: 'belongsTo', | ||||
|  | ||||
| @ -5,17 +5,16 @@ interface ParamsType { | ||||
|   data: object; | ||||
| } | ||||
| 
 | ||||
| export function getSummaryString(params: ParamsType): string { | ||||
| export function getSummary(params: ParamsType): object { | ||||
|   const { summaryConfig = [], data } = params; | ||||
|   const result = summaryConfig | ||||
|     .map((key) => { | ||||
|       const value = _.get(data, key); | ||||
|       // XXX: 丑陋的实现, 不应该依赖具体字段, 应该从 summaryConfig, 拿到的就是最终的值, 走通优先
 | ||||
|       if (Object.prototype.toString.call(value) === '[object Object]') { | ||||
|         return _.get(value, 'name'); | ||||
|       } | ||||
|       return _.get(data, key); | ||||
|     }) | ||||
|     .join(','); | ||||
| 
 | ||||
|   const result = summaryConfig.reduce((summary, key) => { | ||||
|     const value = _.get(data, key); | ||||
|     return { | ||||
|       ...summary, | ||||
|       [key]: value, | ||||
|     }; | ||||
|   }, {}); | ||||
| 
 | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| @ -21,7 +21,6 @@ | ||||
|     "@types/jsonwebtoken": "^8.5.8", | ||||
|     "ahooks": "^3.7.2", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.4.5", | ||||
|     "async-mutex": "^0.3.2", | ||||
|     "jsonwebtoken": "^8.5.1", | ||||
|     "lodash": "4.17.21", | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| export const useStyles = createStyles(({ css }) => { | ||||
|   return css` | ||||
|  | ||||
| @ -15,7 +15,6 @@ | ||||
|   "devDependencies": { | ||||
|     "@ant-design/icons": "~5.3.6", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.4.5", | ||||
|     "react-i18next": "^11.15.1", | ||||
|     "swagger-ui-dist": "^5.3.1" | ||||
|   }, | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { RightOutlined } from '@ant-design/icons'; | ||||
| import { Plugin } from '@tachybase/client'; | ||||
| import { Button, Tooltip } from 'antd'; | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| import React, { lazy } from 'react'; | ||||
| import { NAMESPACE } from '../locale'; | ||||
| 
 | ||||
|  | ||||
| @ -21,7 +21,6 @@ | ||||
|     "@tachybase/components": "workspace:*", | ||||
|     "@tachybase/schema": "workspace:*", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.4.5", | ||||
|     "cron-parser": "4.4.0", | ||||
|     "dayjs": "^1.11.8", | ||||
|     "lodash": "^4.17.21", | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createGlobalStyle } from 'antd-style'; | ||||
| import { createGlobalStyle } from '@tachybase/client'; | ||||
| 
 | ||||
| const GlobalStyle = createGlobalStyle` | ||||
|   .rbc-overlay { | ||||
|  | ||||
| @ -16,7 +16,6 @@ | ||||
|     "@tachybase/schema": "workspace:*", | ||||
|     "ahooks": "^3.7.2", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.4.5", | ||||
|     "classnames": "^2.3.1", | ||||
|     "lodash": "4.17.21", | ||||
|     "react-i18next": "^11.15.1", | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| export const useStyles = createStyles(({ css }) => { | ||||
|   return css` | ||||
|  | ||||
| @ -16,7 +16,6 @@ | ||||
|     "@tachybase/components": "workspace:*", | ||||
|     "@tachybase/schema": "workspace:*", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.4.5", | ||||
|     "lodash": "4.17.21", | ||||
|     "react-i18next": "^11.15.1" | ||||
|   }, | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { TinyColor } from '@ctrl/tinycolor'; | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| const useStyles = createStyles(({ token, css }) => { | ||||
|   const colorFillAlterSolid = new TinyColor(token.colorFillAlter) | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| const useStyles = createStyles(({ token, css }) => { | ||||
|   return { | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| const useStyles = createStyles(({ token, css }) => { | ||||
|   return { | ||||
| @ -60,7 +60,7 @@ const useStyles = createStyles(({ token, css }) => { | ||||
|        .horizontalScroll: { | ||||
|         height: 1 | ||||
|         } | ||||
|    | ||||
| 
 | ||||
|       .verticalScroll: { | ||||
|         overflow: hidden auto; | ||||
|         width: 1rem; | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| const useStyles = createStyles(({ token, css }) => { | ||||
|   return { | ||||
|  | ||||
| @ -15,7 +15,6 @@ | ||||
|     "@tachybase/components": "workspace:*", | ||||
|     "@tachybase/schema": "workspace:*", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.4.5", | ||||
|     "classnames": "^2.3.1", | ||||
|     "lodash": "4.17.21", | ||||
|     "react-beautiful-dnd": "^13.1.0", | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| export const useStyles = createStyles(({ css, token }) => { | ||||
|   return { | ||||
|  | ||||
| @ -15,7 +15,6 @@ | ||||
|     "antd": "5.16.1", | ||||
|     "antd-mobile": "^5.35.0", | ||||
|     "antd-mobile-icons": "^0.3.0", | ||||
|     "antd-style": "3.x", | ||||
|     "classnames": "2.x", | ||||
|     "lodash": "4.17.21", | ||||
|     "react": "~18.2.0", | ||||
|  | ||||
| @ -11,7 +11,6 @@ | ||||
|   "devDependencies": { | ||||
|     "@tachybase/schema": "workspace:*", | ||||
|     "antd": "5.16.1", | ||||
|     "antd-style": "3.x", | ||||
|     "async-mutex": "^0.3.2", | ||||
|     "lodash": "4.17.21", | ||||
|     "mysql2": "^2.3.3", | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { createStyles } from 'antd-style'; | ||||
| import { createStyles } from '@tachybase/client'; | ||||
| 
 | ||||
| export const useStyles = createStyles(({ token }) => { | ||||
|   return { | ||||
|  | ||||
							
								
								
									
										118
									
								
								pnpm-lock.yaml
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								pnpm-lock.yaml
									
									
									
									
									
								
							| @ -1811,9 +1811,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.4.5 | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       async-mutex: | ||||
|         specifier: ^0.3.2 | ||||
|         version: 0.3.2 | ||||
| @ -1972,9 +1969,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.4.5 | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       react-i18next: | ||||
|         specifier: ^11.15.1 | ||||
|         version: 11.18.6(i18next@22.5.1)(react-dom@18.2.0)(react@18.2.0) | ||||
| @ -2198,9 +2192,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.4.5 | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       cron-parser: | ||||
|         specifier: 4.4.0 | ||||
|         version: 4.4.0 | ||||
| @ -2459,9 +2450,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.4.5 | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       classnames: | ||||
|         specifier: ^2.3.1 | ||||
|         version: 2.5.1 | ||||
| @ -2773,9 +2761,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.4.5 | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       lodash: | ||||
|         specifier: 4.17.21 | ||||
|         version: 4.17.21 | ||||
| @ -2984,9 +2969,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.4.5 | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       classnames: | ||||
|         specifier: ^2.3.1 | ||||
|         version: 2.5.1 | ||||
| @ -3889,9 +3871,6 @@ importers: | ||||
|       antd-mobile-icons: | ||||
|         specifier: ^0.3.0 | ||||
|         version: 0.3.0 | ||||
|       antd-style: | ||||
|         specifier: 3.x | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       classnames: | ||||
|         specifier: 2.x | ||||
|         version: 2.5.1 | ||||
| @ -3935,9 +3914,6 @@ importers: | ||||
|       antd: | ||||
|         specifier: 5.16.1 | ||||
|         version: 5.16.1(react-dom@18.2.0)(react@18.2.0) | ||||
|       antd-style: | ||||
|         specifier: 3.x | ||||
|         version: 3.4.5(@types/react@18.2.79)(antd@5.16.1)(react-dom@18.2.0)(react@18.2.0) | ||||
|       async-mutex: | ||||
|         specifier: ^0.3.2 | ||||
|         version: 0.3.2 | ||||
| @ -6220,7 +6196,7 @@ packages: | ||||
|       '@babel/parser': 7.23.6 | ||||
|       '@babel/template': 7.22.15 | ||||
|       '@babel/traverse': 7.23.6(supports-color@5.5.0) | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|       convert-source-map: 1.9.0 | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       gensync: 1.0.0-beta.2 | ||||
| @ -6264,7 +6240,7 @@ packages: | ||||
|       '@babel/parser': 7.24.4 | ||||
|       '@babel/template': 7.24.0 | ||||
|       '@babel/traverse': 7.24.1 | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
|       convert-source-map: 2.0.0 | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       gensync: 1.0.0-beta.2 | ||||
| @ -6327,7 +6303,7 @@ packages: | ||||
|     resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|       '@jridgewell/gen-mapping': 0.3.3 | ||||
|       '@jridgewell/trace-mapping': 0.3.20 | ||||
|       jsesc: 2.5.2 | ||||
| @ -6336,7 +6312,7 @@ packages: | ||||
|     resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
|       '@jridgewell/gen-mapping': 0.3.5 | ||||
|       '@jridgewell/trace-mapping': 0.3.25 | ||||
|       jsesc: 2.5.2 | ||||
| @ -6354,13 +6330,13 @@ packages: | ||||
|     resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: | ||||
|     resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@babel/helper-compilation-targets@7.23.6: | ||||
| @ -6427,26 +6403,26 @@ packages: | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/template': 7.22.15 | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-hoist-variables@7.22.5: | ||||
|     resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-member-expression-to-functions@7.23.0: | ||||
|     resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@babel/helper-module-imports@7.22.15: | ||||
|     resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-module-imports@7.24.3: | ||||
|     resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} | ||||
| @ -6462,10 +6438,10 @@ packages: | ||||
|     dependencies: | ||||
|       '@babel/core': 7.22.10 | ||||
|       '@babel/helper-environment-visitor': 7.22.20 | ||||
|       '@babel/helper-module-imports': 7.22.15 | ||||
|       '@babel/helper-module-imports': 7.24.3 | ||||
|       '@babel/helper-simple-access': 7.22.5 | ||||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/helper-validator-identifier': 7.22.20 | ||||
|       '@babel/helper-validator-identifier': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): | ||||
|     resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} | ||||
| @ -6475,10 +6451,10 @@ packages: | ||||
|     dependencies: | ||||
|       '@babel/core': 7.23.6 | ||||
|       '@babel/helper-environment-visitor': 7.22.20 | ||||
|       '@babel/helper-module-imports': 7.22.15 | ||||
|       '@babel/helper-module-imports': 7.24.3 | ||||
|       '@babel/helper-simple-access': 7.22.5 | ||||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/helper-validator-identifier': 7.22.20 | ||||
|       '@babel/helper-validator-identifier': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): | ||||
|     resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} | ||||
| @ -6488,10 +6464,10 @@ packages: | ||||
|     dependencies: | ||||
|       '@babel/core': 7.24.4 | ||||
|       '@babel/helper-environment-visitor': 7.22.20 | ||||
|       '@babel/helper-module-imports': 7.22.15 | ||||
|       '@babel/helper-module-imports': 7.24.3 | ||||
|       '@babel/helper-simple-access': 7.22.5 | ||||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/helper-validator-identifier': 7.22.20 | ||||
|       '@babel/helper-validator-identifier': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): | ||||
|     resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} | ||||
| @ -6510,7 +6486,7 @@ packages: | ||||
|     resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@babel/helper-plugin-utils@7.22.5: | ||||
| @ -6549,7 +6525,7 @@ packages: | ||||
|     resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-simple-access@7.24.5: | ||||
|     resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} | ||||
| @ -6561,14 +6537,14 @@ packages: | ||||
|     resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@babel/helper-split-export-declaration@7.22.6: | ||||
|     resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/helper-split-export-declaration@7.24.5: | ||||
|     resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} | ||||
| @ -6602,7 +6578,7 @@ packages: | ||||
|     dependencies: | ||||
|       '@babel/helper-function-name': 7.23.0 | ||||
|       '@babel/template': 7.22.15 | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@babel/helpers@7.23.6: | ||||
| @ -6621,7 +6597,7 @@ packages: | ||||
|     dependencies: | ||||
|       '@babel/template': 7.24.0 | ||||
|       '@babel/traverse': 7.24.1 | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
| @ -6639,7 +6615,7 @@ packages: | ||||
|     resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/helper-validator-identifier': 7.22.20 | ||||
|       '@babel/helper-validator-identifier': 7.24.5 | ||||
|       chalk: 2.4.2 | ||||
|       js-tokens: 4.0.0 | ||||
|       picocolors: 1.0.0 | ||||
| @ -6656,7 +6632,7 @@ packages: | ||||
|     engines: {node: '>=6.0.0'} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/parser@7.24.5: | ||||
|     resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} | ||||
| @ -7613,7 +7589,7 @@ packages: | ||||
|     dependencies: | ||||
|       '@babel/code-frame': 7.24.2 | ||||
|       '@babel/parser': 7.24.4 | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@babel/traverse@7.23.6(supports-color@5.5.0): | ||||
|     resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} | ||||
| @ -7626,7 +7602,7 @@ packages: | ||||
|       '@babel/helper-hoist-variables': 7.22.5 | ||||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/parser': 7.23.6 | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       globals: 11.12.0 | ||||
|     transitivePeerDependencies: | ||||
| @ -7643,7 +7619,7 @@ packages: | ||||
|       '@babel/helper-hoist-variables': 7.22.5 | ||||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/parser': 7.24.4 | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       globals: 11.12.0 | ||||
|     transitivePeerDependencies: | ||||
| @ -7674,14 +7650,6 @@ packages: | ||||
|       '@babel/helper-validator-identifier': 7.22.20 | ||||
|       to-fast-properties: 2.0.0 | ||||
| 
 | ||||
|   /@babel/types@7.24.0: | ||||
|     resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
|     dependencies: | ||||
|       '@babel/helper-string-parser': 7.24.1 | ||||
|       '@babel/helper-validator-identifier': 7.22.20 | ||||
|       to-fast-properties: 2.0.0 | ||||
| 
 | ||||
|   /@babel/types@7.24.5: | ||||
|     resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
| @ -8340,6 +8308,7 @@ packages: | ||||
|       '@types/react': 18.2.79 | ||||
|       hoist-non-react-statics: 3.3.2 | ||||
|       react: 18.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@emotion/serialize@1.1.2: | ||||
|     resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} | ||||
| @ -8363,6 +8332,7 @@ packages: | ||||
|       html-tokenize: 2.0.1 | ||||
|       multipipe: 1.0.2 | ||||
|       through: 2.3.8 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@emotion/sheet@1.2.2: | ||||
|     resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} | ||||
| @ -8383,6 +8353,7 @@ packages: | ||||
|       react: '>=16.8.0' | ||||
|     dependencies: | ||||
|       react: 18.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@emotion/utils@1.2.1: | ||||
|     resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} | ||||
| @ -11906,7 +11877,7 @@ packages: | ||||
|     resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} | ||||
|     engines: {node: '>=10'} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
|       entities: 4.5.0 | ||||
| 
 | ||||
|   /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): | ||||
| @ -12102,23 +12073,23 @@ packages: | ||||
|   /@types/babel__generator@7.6.7: | ||||
|     resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@types/babel__template@7.4.4: | ||||
|     resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} | ||||
|     dependencies: | ||||
|       '@babel/parser': 7.23.6 | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@types/babel__traverse@7.20.4: | ||||
|     resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.23.6 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@types/babel__traverse@7.20.5: | ||||
|     resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} | ||||
|     dependencies: | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
| 
 | ||||
|   /@types/body-parser@1.19.5: | ||||
|     resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} | ||||
| @ -13863,7 +13834,7 @@ packages: | ||||
|       '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) | ||||
|       '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) | ||||
|       react-refresh: 0.14.0 | ||||
|       vite: 4.5.2(@types/node@20.12.2)(less@4.1.3) | ||||
|       vite: 4.5.2(@types/node@20.12.8)(less@4.1.3) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
| @ -14457,6 +14428,7 @@ packages: | ||||
|     transitivePeerDependencies: | ||||
|       - '@types/react' | ||||
|       - react-dom | ||||
|     dev: false | ||||
| 
 | ||||
|   /antd@5.16.1(react-dom@18.2.0)(react@18.2.0): | ||||
|     resolution: {integrity: sha512-XAlLRrgYV+nj9FHnkXEPS6HNcKcluEa8v44e7Cixjlp8aOXRhUI6IfZaKpc2MPGjQ+06rp62/dsxOUNJW9kfLA==} | ||||
| @ -15086,7 +15058,7 @@ packages: | ||||
|     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} | ||||
|     dependencies: | ||||
|       '@babel/template': 7.24.0 | ||||
|       '@babel/types': 7.24.0 | ||||
|       '@babel/types': 7.24.5 | ||||
|       '@types/babel__core': 7.20.5 | ||||
|       '@types/babel__traverse': 7.20.5 | ||||
| 
 | ||||
| @ -15140,7 +15112,7 @@ packages: | ||||
|       styled-components: '>= 2' | ||||
|     dependencies: | ||||
|       '@babel/helper-annotate-as-pure': 7.22.5 | ||||
|       '@babel/helper-module-imports': 7.22.15 | ||||
|       '@babel/helper-module-imports': 7.24.3 | ||||
|       '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.22.10) | ||||
|       lodash: 4.17.21 | ||||
|       picomatch: 2.3.1 | ||||
| @ -15545,6 +15517,7 @@ packages: | ||||
| 
 | ||||
|   /buffer-from@0.1.2: | ||||
|     resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /buffer-from@1.1.2: | ||||
|     resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} | ||||
| @ -20603,6 +20576,7 @@ packages: | ||||
|       minimist: 1.2.8 | ||||
|       readable-stream: 1.0.34 | ||||
|       through2: 0.4.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /html-webpack-plugin@5.5.0(webpack@5.91.0): | ||||
|     resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} | ||||
| @ -23410,6 +23384,7 @@ packages: | ||||
|     dependencies: | ||||
|       duplexer2: 0.1.4 | ||||
|       object-assign: 4.1.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /mute-stdout@1.0.1: | ||||
|     resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} | ||||
| @ -23857,6 +23832,7 @@ packages: | ||||
| 
 | ||||
|   /object-keys@0.4.0: | ||||
|     resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /object-keys@1.1.1: | ||||
|     resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} | ||||
| @ -27059,6 +27035,7 @@ packages: | ||||
|       inherits: 2.0.4 | ||||
|       isarray: 0.0.1 | ||||
|       string_decoder: 0.10.31 | ||||
|     dev: false | ||||
| 
 | ||||
|   /readable-stream@1.1.14: | ||||
|     resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} | ||||
| @ -28893,7 +28870,7 @@ packages: | ||||
|       react-dom: '>= 16.8.0' | ||||
|       react-is: '>= 16.8.0' | ||||
|     dependencies: | ||||
|       '@babel/helper-module-imports': 7.22.15 | ||||
|       '@babel/helper-module-imports': 7.24.3 | ||||
|       '@babel/traverse': 7.23.6(supports-color@5.5.0) | ||||
|       '@emotion/is-prop-valid': 1.2.1 | ||||
|       '@emotion/stylis': 0.8.5 | ||||
| @ -29375,6 +29352,7 @@ packages: | ||||
|     dependencies: | ||||
|       readable-stream: 1.0.34 | ||||
|       xtend: 2.1.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /through2@2.0.5: | ||||
|     resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} | ||||
| @ -30527,6 +30505,7 @@ packages: | ||||
|       react: '>= 16.x' | ||||
|     dependencies: | ||||
|       react: 18.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /use-sync-external-store@1.2.0(react@18.2.0): | ||||
|     resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} | ||||
| @ -30779,6 +30758,7 @@ packages: | ||||
|       rollup: 3.29.4 | ||||
|     optionalDependencies: | ||||
|       fsevents: 2.3.3 | ||||
|     dev: false | ||||
| 
 | ||||
|   /vite@4.5.2(@types/node@20.12.8)(less@4.1.3): | ||||
|     resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} | ||||
| @ -30815,7 +30795,6 @@ packages: | ||||
|       rollup: 3.29.4 | ||||
|     optionalDependencies: | ||||
|       fsevents: 2.3.3 | ||||
|     dev: true | ||||
| 
 | ||||
|   /vite@5.1.5(@types/node@20.12.8)(sass@1.75.0): | ||||
|     resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} | ||||
| @ -31543,6 +31522,7 @@ packages: | ||||
|     engines: {node: '>=0.4'} | ||||
|     dependencies: | ||||
|       object-keys: 0.4.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /xtend@4.0.2: | ||||
|     resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user