From d9ab10b00f1b66eec5b04f155cce7ab63ff79a16 Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Wed, 6 Nov 2024 17:22:17 +0800 Subject: [PATCH 01/12] feat: node ignore --- packages/arex/src/i18n/locales/cn/common.json | 1 + packages/arex/src/i18n/locales/en/common.json | 1 + .../arex/src/panes/AppSetting/AppSetting.tsx | 6 + .../CompareConfigNew/CategoryIgnore/index.tsx | 272 ++++++++++++++++++ .../CompareConfigNew/ConfigInfoTable.tsx | 145 ++++++++++ .../NodeIgnore/AddIgnoreModal.tsx | 185 ++++++++++++ .../NodeIgnore/ExclusionPathInput.tsx | 94 ++++++ .../CompareConfigNew/NodeIgnore/index.tsx | 187 ++++++++++++ .../AppSetting/CompareConfigNew/index.tsx | 61 ++++ .../panes/AppSetting/CompareConfigNew/mock.ts | 204 +++++++++++++ .../panes/AppSetting/CompareConfigNew/type.ts | 28 ++ .../src/services/ComparisonService/index.ts | 1 + .../queryAggregateIgnoreNode.ts | 25 ++ packages/arex/src/services/type.ts | 9 + 14 files changed, 1219 insertions(+) create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/AddIgnoreModal.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/ExclusionPathInput.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts create mode 100644 packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts create mode 100644 packages/arex/src/services/type.ts diff --git a/packages/arex/src/i18n/locales/cn/common.json b/packages/arex/src/i18n/locales/cn/common.json index 6f8dcc440..aeebecedb 100644 --- a/packages/arex/src/i18n/locales/cn/common.json +++ b/packages/arex/src/i18n/locales/cn/common.json @@ -79,6 +79,7 @@ "remove": "移除", "replay": "回放", "request": "请求", + "reset": "重置", "response": "响应", "saturday": "周六", "save": "保存", diff --git a/packages/arex/src/i18n/locales/en/common.json b/packages/arex/src/i18n/locales/en/common.json index 776217480..e39aab209 100644 --- a/packages/arex/src/i18n/locales/en/common.json +++ b/packages/arex/src/i18n/locales/en/common.json @@ -82,6 +82,7 @@ "remove": "Remove", "replay": "Replay", "request": "Request", + "reset": "Reset", "response": "Response", "saturday": "Sat.", "save": "Save", diff --git a/packages/arex/src/panes/AppSetting/AppSetting.tsx b/packages/arex/src/panes/AppSetting/AppSetting.tsx index 26c9ce418..423c00aba 100644 --- a/packages/arex/src/panes/AppSetting/AppSetting.tsx +++ b/packages/arex/src/panes/AppSetting/AppSetting.tsx @@ -14,6 +14,7 @@ import CompareConfig from '@/panes/AppSetting/CompareConfig'; import { useMenusPanes } from '@/store'; import { decodePaneKey } from '@/store/useMenusPanes'; +import CompareConfigNew from './CompareConfigNew'; import SettingImportYaml from './ImportYaml'; import SettingOther from './Other'; import SettingRecord from './Record'; @@ -43,6 +44,11 @@ const AppSetting: ArexPaneFC<{ key: string }> = (props) => { label: t('appSetting.compareConfig'), children: , }, + { + key: 'compareConfigNew', + label: t('appSetting.compareConfig'), + children: , + }, { key: 'importYaml', label: t('appSetting.importYaml'), diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx new file mode 100644 index 000000000..400feb001 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx @@ -0,0 +1,272 @@ +import { CloseOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; +import { useTranslation } from '@arextest/arex-core'; +import { useAutoAnimate } from '@formkit/auto-animate/react'; +import { useRequest } from 'ahooks'; +import { App, Button, Flex, Select, SelectProps, Space, Table } from 'antd'; +import React, { FC, useEffect, useMemo, useState } from 'react'; + +import { CONFIG_TARGET } from '@/panes/AppSetting/CompareConfig'; +import { ApplicationService, ComparisonService } from '@/services'; +import { IgnoreCategory } from '@/services/ComparisonService'; + +export type CategoryIgnoreProps = { + appId?: string; + operationId?: string; + configTarget: CONFIG_TARGET; +}; + +enum Mode { + READ, + ADD, + DELETE, +} +const CategoryIgnore: FC = (props) => { + const { message } = App.useApp(); + const { t } = useTranslation(); + const [footerRef] = useAutoAnimate(); + + const [mode, setMode] = useState(Mode.READ); + + const [operationTypeValue, setOperationTypeValue] = useState(); + const [operationTypeSelectStatus, setOperationTypeSelectStatus] = + useState(); + + const [operationNameValue, setOperationNameValue] = useState(); + + useEffect(() => { + setOperationNameValue(undefined); + }, [props.operationId, props.configTarget]); + + const [selectedRowKey, setSelectedRowKey] = useState(''); + + const [optionsGroupMap, setOptionsGroupMap] = useState>>(new Map()); + + const [operationNameOptions, setOperationNameOptions] = useState([]); + + const [categoryTypeOptions, setCategoryOptions] = useState([]); + useRequest(ComparisonService.queryCategoryType, { + onSuccess(res) { + const options = res + .filter((item) => !item.entryPoint) + .map((item) => ({ + label: item.name, + value: item.name, + })); + setCategoryOptions(options); + }, + }); + + const reset = () => { + setMode(Mode.READ); + setSelectedRowKey(''); + setOperationNameValue(undefined); + setOperationTypeValue(undefined); + }; + + // 获取接口依赖并聚合 + const { data: interfacesList = [] } = useRequest( + () => ApplicationService.queryInterfacesList<'Interface'>({ appId: props.appId as string }), + { + ready: !!props.appId, + onSuccess(res) { + const groupMap = res.reduce((group, item) => { + if (!item.dependencyList) return group; + + item.dependencyList?.forEach((dependency) => { + if (group.has(dependency.operationType)) { + group.get(dependency.operationType)?.add(dependency.operationName); + } else { + group.set(dependency.operationType, new Set([dependency.operationName])); + } + }); + return group; + }, new Map>()); + + setOptionsGroupMap(groupMap); + }, + }, + ); + + const { data: ignoreCategoryData = [], run: queryIgnoreCategory } = useRequest( + () => + ComparisonService.queryIgnoreCategory({ + appId: props.appId!, + operationId: props.configTarget === CONFIG_TARGET.GLOBAL ? undefined : props.operationId, + }), + { + ready: !!( + props.appId && + (props.configTarget === CONFIG_TARGET.GLOBAL || // GLOBAL ready + // INTERFACE ready + (props.configTarget === CONFIG_TARGET.INTERFACE && props.operationId)) + ), + refreshDeps: [props.operationId, props.configTarget], + onSuccess(res) { + reset(); + }, + }, + ); + + const { run: insertIgnoreCategory } = useRequest( + (ignoreCategoryDetail: IgnoreCategory) => + ComparisonService.insertIgnoreCategory({ + appId: props.appId!, + operationId: props.configTarget === CONFIG_TARGET.GLOBAL ? undefined : props.operationId, + ignoreCategoryDetail, + }), + { + manual: true, + ready: !!props.appId, + onSuccess(success) { + if (success) { + message.success(t('message.updateSuccess')); + queryIgnoreCategory(); + } else message.error(t('message.updateFailed')); + }, + }, + ); + + const { run: deleteIgnoreCategory } = useRequest(ComparisonService.deleteIgnoreCategory, { + manual: true, + onSuccess(success) { + if (success) { + message.success(t('message.delSuccess')); + queryIgnoreCategory(); + } else message.error(t('message.delFailed')); + }, + }); + + const handleAdd = () => { + if (operationTypeValue) { + insertIgnoreCategory({ + operationType: operationTypeValue, + operationName: operationNameValue, + }); + } else { + setOperationTypeSelectStatus('error'); + setTimeout(() => setOperationTypeSelectStatus(undefined), 1000); + } + }; + + const handleDelete = () => { + if (selectedRowKey) deleteIgnoreCategory({ id: selectedRowKey }); + else message.error(t('message.selectRowWarning')); + }; + + const columns = useMemo( + () => [ + { + title: t('appSetting.categoryType', { ns: 'components' }), + dataIndex: ['ignoreCategoryDetail', 'operationType'], + }, + { + title: t('appSetting.operationName', { ns: 'components' }), + dataIndex: ['ignoreCategoryDetail', 'operationName'], + render: (text: string) => text || '*', + }, + ], + [t], + ); + + const footerRender = () => ( +
+ {mode === Mode.READ ? ( + + + + + ) : mode === Mode.ADD ? ( +
+ + + + + + + + +
+ ) : ( + + + + + )} +
+ ); + + return ( +
+ setSelectedRowKey(id[0] as string), + } + : undefined + } + onRow={(record) => ({ + onClick: () => mode === Mode.DELETE && setSelectedRowKey(record.id), + })} + footer={footerRender} + /> + + ); +}; + +export default CategoryIgnore; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx new file mode 100644 index 000000000..6dbd4e656 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx @@ -0,0 +1,145 @@ +import { SearchOutlined } from '@ant-design/icons'; +import { useTranslation } from '@arextest/arex-core'; +import { InputRef, TableProps, theme } from 'antd'; +import { Button, Card, Input, Table, Typography } from 'antd'; +import { ColumnsType, ColumnType } from 'antd/es/table'; +import type { FilterConfirmProps } from 'antd/es/table/interface'; +import dayjs from 'dayjs'; +import React, { Key, ReactNode, useRef } from 'react'; +import { useImmer } from 'use-immer'; + +import { SearchHighLight } from '@/components'; + +import { BaseConfigInfo } from './type'; + +export interface ConfigInfoTableProps extends TableProps { + requestSearch?: boolean; + onSearch?: (search: Record) => void; +} + +export default function ConfigInfoTable>( + props: ConfigInfoTableProps, +) { + const { t } = useTranslation(); + + const { columns: configColumns, ...tableProps } = props; + const { token } = theme.useToken(); + + const [search, setSearch] = useImmer | undefined>(undefined); + const searchInput = useRef(null); + + const handleSearch = ( + selectedKeys: string[], + confirm: (param?: FilterConfirmProps) => void, + dataIndex: string, + ) => { + const searchValue = selectedKeys[0]; + + setSearch((draft) => { + if (!draft) { + return { [dataIndex]: searchValue }; + } else { + draft[dataIndex] = searchValue; + } + }); + !props.requestSearch && confirm(); + search && props.onSearch?.({ ...search, [dataIndex]: searchValue }); + }; + + // 获取列搜索配置 + const getColumnSearchProps = (dataIndex: keyof T, searchFallback?: ReactNode): ColumnType => ({ + filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( +
+ setSelectedKeys(e.target.value ? [e.target.value] : [])} + onPressEnter={() => handleSearch(selectedKeys as string[], confirm, dataIndex.toString())} + style={{ marginBottom: 8, display: 'block' }} + /> + +
+ + + +
+
+ ), + filterIcon: (filtered: boolean) => ( + + ), + onFilter: (value: boolean | Key, record: T) => + record[dataIndex] + ? String(record[dataIndex])?.toLowerCase().includes(value.toString().toLowerCase()) + : false, + onFilterDropdownOpenChange: (open: boolean) => { + open && setTimeout(() => searchInput.current?.select(), 100); + }, + render: (text: string | null) => { + const columnsSearchValue = search?.[dataIndex as string]; + if ( + !!columnsSearchValue && + text?.toLowerCase().includes(columnsSearchValue.toLowerCase() || '') + ) { + return ; + } else { + return text || searchFallback; + } + }, + }); + + // 定义表格的列配置 + const columns: ColumnsType = [ + { + title: t('components:appSetting.interface'), + dataIndex: 'operationName', + ...getColumnSearchProps( + 'operationName', + {``}, + ), + }, + { + title: t('components:appSetting.dependency'), + dataIndex: 'dependencyName', + ...getColumnSearchProps('dependencyName'), + }, + ...(configColumns || []), + { + title: t('components:appSetting.expireOn'), + dataIndex: 'expirationDate', + render: (date: number) => dayjs(date).format('YYYY/MM/HH:mm'), + }, + ]; + + return ( + + pagination={false} {...tableProps} columns={columns} /> + + ); +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/AddIgnoreModal.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/AddIgnoreModal.tsx new file mode 100644 index 000000000..57d209a3f --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/AddIgnoreModal.tsx @@ -0,0 +1,185 @@ +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { App, Form, Modal, Select, SelectProps } from 'antd'; +import React, { forwardRef, useImperativeHandle, useMemo, useState } from 'react'; + +import ExclusionPathInput from '@/panes/AppSetting/CompareConfigNew/NodeIgnore/ExclusionPathInput'; +import { ApplicationService, ComparisonService } from '@/services'; +import { OperationInterface } from '@/services/ApplicationService'; +import { DependencyParams } from '@/services/ComparisonService'; + +export type AddIgnoreModalProps = { + appId: string; + operationList?: OperationInterface<'Interface'>[]; + onSuccess?: () => void; +}; + +export type AddIgnoreModalRef = { + open: () => void; +}; + +const AddIgnoreModal = forwardRef((props, ref) => { + const { message } = App.useApp(); + const { t } = useTranslation(); + + const [openAddExclusionModal, setOpenAddExclusionModal] = useState(false); + + const [activeOperationId, setActiveOperationId] = useState(); + const [activeDependency, setActiveDependency] = useState(); + const [exclusionPathValue, setExclusionPathValue] = useState(''); + + useImperativeHandle( + ref, + () => ({ + open: () => setOpenAddExclusionModal(true), + }), + [], + ); + + const interfaceOptions = useMemo( + () => + Object.entries( + (props.operationList || []).reduce< + Record + >((options, item) => { + item.operationTypes?.forEach((operation) => { + if (options[operation]) { + options[operation].push({ + label: item.operationName, + value: item.id, + }); + } else { + options[operation] = [ + { + label: item.operationName, + value: item.id, + }, + ]; + } + }); + return options; + }, {}), + ).map(([label, options]) => ({ + label, + options, + })), + [props.operationList], + ); + + /** + * 请求 DependencyList + */ + const { loading: loadingDependency } = useRequest( + () => ApplicationService.getDependencyList({ operationId: activeOperationId as string }), + { + ready: !!activeOperationId, + refreshDeps: [activeOperationId], + onSuccess(res) { + const dependencyList = res.dependencyList; + dependencyList.length && + setActiveDependency({ + operationType: dependencyList?.[0]?.operationType, + operationName: dependencyList?.[0]?.operationName, + }); + setDependencyOptions( + dependencyList.map((dependency) => ({ + label: dependency.operationType + '-' + dependency.operationName, + value: dependency.operationType + '-' + dependency.operationName, + })), + ); + }, + }, + ); + + const [dependencyOptions, setDependencyOptions] = useState(); + + const dependencyValue = useMemo( + () => + activeDependency && (activeDependency.operationType || activeDependency.operationName) + ? activeDependency.operationType + '-' + activeDependency.operationName //TODO null + : undefined, + [activeDependency], + ); + + const { run: insertIgnoreNode } = useRequest(ComparisonService.insertIgnoreNode, { + manual: true, + onSuccess(success) { + if (success) { + message.success(t('message.updateSuccess', { ns: 'common' })); + handleCloseModal(); + props.onSuccess?.(); + } else { + message.error(t('message.updateFailed', { ns: 'common' })); + } + }, + }); + + const handleCloseModal = () => { + setOpenAddExclusionModal(false); + setActiveOperationId(undefined); + setActiveDependency(undefined); + setExclusionPathValue(''); + }; + + return ( + { + insertIgnoreNode({ + appId: props.appId, + operationId: activeOperationId, + ...activeDependency, + exclusions: exclusionPathValue.split('/').filter(Boolean), + }); + }} + onCancel={handleCloseModal} + > +
+ + { + const [operationType, operationName] = value.split('-'); + setActiveDependency({ + operationType, + operationName, + }); + }} + /> + + + + + +
+ ); +}); + +export default AddIgnoreModal; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/ExclusionPathInput.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/ExclusionPathInput.tsx new file mode 100644 index 000000000..86588bc73 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/ExclusionPathInput.tsx @@ -0,0 +1,94 @@ +import { styled, tryParseJsonString } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { Collapse, Input, InputProps, theme, Typography } from 'antd'; +import React, { useMemo, useState } from 'react'; + +import IgnoreTree from '@/panes/AppSetting/CompareConfig/NodesIgnore/IgnoreTree'; +import { ReportService } from '@/services'; +import { DependencyParams } from '@/services/ComparisonService'; + +const IgnoreTreeWrapper = styled.div<{ lineThrough?: boolean }>` + .ant-tree-node-selected { + text-decoration: ${(props) => (props.lineThrough ? 'line-through' : 'none')}; + } +`; + +export type ExclusionPathInputProps = Omit & { + appId: string; + operationId?: string; + dependency?: DependencyParams; + onChange?: (value: string) => void; +}; + +const ExclusionPathInput = (props: ExclusionPathInputProps) => { + const { appId, operationId, dependency, ...inputProps } = props; + + const { token } = theme.useToken(); + + const [selectedKeys, setSelectedKeys] = useState(); + + const { + data: contract, + mutate: setContract, + loading: loadingContract, + } = useRequest( + () => + ReportService.queryContract({ + appId, + operationId, + ...dependency, + }), + { + ready: !!appId, + refreshDeps: [appId, operationId, dependency], + onBefore() { + setContract(); + }, + }, + ); + + const contractParsed = useMemo<{ [key: string]: any }>(() => { + const res = contract?.contract; + if (res) return tryParseJsonString(res) || {}; + else return {}; + }, [contract]); + + return ( + + { + props.onChange?.(e.target.value); + }} + /> + + + select from tree + + ), + children: ( + { + setSelectedKeys(keys); + props.onChange?.(keys.join('/')); + }} + treeData={contractParsed} + /> + ), + }, + ]} + /> + + ); +}; + +export default ExclusionPathInput; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx new file mode 100644 index 000000000..3971c4012 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx @@ -0,0 +1,187 @@ +import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { App, Pagination, Popconfirm } from 'antd'; +import { Button } from 'antd'; +import { ColumnsType } from 'antd/es/table'; +import React, { useRef, useState } from 'react'; + +import { ComparisonService } from '@/services'; +import { PageQueryComparisonReq } from '@/services/ComparisonService'; + +import ConfigInfoTable from '../ConfigInfoTable'; +import { ExclusionInfo } from '../type'; +import AddIgnoreModal, { AddIgnoreModalProps } from './AddIgnoreModal'; +import { AddIgnoreModalRef } from './AddIgnoreModal'; + +const PAGE_SIZE = { + SIZE_10: 10, + SIZE_20: 20, + SIZE_30: 30, +}; + +const pageSizeOptions = Object.values(PAGE_SIZE); + +export type NodeIgnoreProps = { appId: string } & Pick; + +// NodeIgnore 组件 +export default function NodeIgnore(props: NodeIgnoreProps) { + const { t } = useTranslation(); + const { message } = App.useApp(); + + const addIgnoreModalRef = useRef(null); + + const [pagination, setPagination] = useState({ + current: 1, + pageSize: PAGE_SIZE.SIZE_10, + }); + + const [searchParams, setSearchParams] = useState< + Pick + >({}); + + const [selectedRows, setSelectedRows] = useState([]); + + // 定义表格的列配置 + const columns: ColumnsType = [ + { + title: t('components:appSetting.path'), + dataIndex: 'exclusionPath', + // ...getColumnSearchProps('exclusionPath'), + render: (path: string[]) => '/ ' + path.join(' / '), + }, + ]; + + const { + data = { totalCount: 0, exclusions: [] }, + loading, + run: queryAggregateIgnoreNode, + } = useRequest( + () => + ComparisonService.queryAggregateIgnoreNode({ + appId: props.appId, + pageSize: pagination.pageSize, + pageIndex: pagination.current, + ...searchParams, + }), + { + refreshDeps: [pagination, searchParams], + }, + ); + + /** + * 批量删除 IgnoreNode + */ + const { run: batchDeleteIgnoreNode } = useRequest(ComparisonService.batchDeleteIgnoreNode, { + manual: true, + onSuccess(success) { + if (success) { + queryAggregateIgnoreNode(); + } else { + message.error(t('common:message.delFailed')); + } + }, + }); + + function handleSearch(search: Record) { + if (pagination.current !== 1) { + setPagination({ current: 1, pageSize: pagination.pageSize }); + } + + const operationIds: PageQueryComparisonReq['operationIds'] = []; + const dependencyIds: PageQueryComparisonReq['dependencyIds'] = []; + const operationNameSearchLowerCase = search['operationName']?.toLowerCase() || ''; + const dependencyNameSearchLowerCase = search['dependencyName']?.toLowerCase() || ''; + + if (operationNameSearchLowerCase && 'global'.includes(operationNameSearchLowerCase)) + operationIds.push(null); + + props.operationList?.forEach((operation) => { + if ( + operationNameSearchLowerCase && + operation.operationName.toLowerCase().includes(operationNameSearchLowerCase) + ) + operationIds.push(operation.id); + operation.dependencyList?.forEach((dependency) => { + if ( + dependencyNameSearchLowerCase && + dependency.operationName?.toLowerCase()?.includes(dependencyNameSearchLowerCase) + ) + dependencyIds.push(dependency.dependencyId); + }); + }); + + setSearchParams({ + operationIds, + dependencyIds, + }); + } + + function handleDelete() { + batchDeleteIgnoreNode(selectedRows.map((row) => ({ id: row.id }))); + } + + const TableFooter = () => ( +
+
+ {data.totalCount >= pagination.pageSize && ( + { + setPagination({ + current: page, + pageSize, + }); + }} + /> + )} +
+ +
+ + + + + +
+
+ ); + + return ( +
+ + rowKey='id' + requestSearch + loading={loading} + columns={columns} + dataSource={data?.exclusions} + footer={TableFooter} + rowSelection={{ + selections: true, + onSelect: (record, selected, selectedRows) => { + setSelectedRows(selectedRows); + }, + }} + onSearch={handleSearch} + /> + + +
+ ); +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx new file mode 100644 index 000000000..53b56a7a2 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx @@ -0,0 +1,61 @@ +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { Tabs, TabsProps } from 'antd'; +import React from 'react'; + +import { ApplicationService } from '@/services'; + +import NodeIgnore from './NodeIgnore'; + +export type CompareConfigNewProps = { + appId: string; +}; + +export default function CompareConfigNew(props: CompareConfigNewProps) { + const { t } = useTranslation('components'); + + /** + * 请求 InterfacesList + */ + const { data: operationList = [] } = useRequest( + () => ApplicationService.queryInterfacesList<'Interface'>({ appId: props.appId as string }), + { + ready: !!props.appId, + }, + ); + + const compareConfigItems: TabsProps['items'] = [ + { + key: 'nodeIgnore', + label: t('appSetting.nodesIgnore'), + children: , + }, + { + key: 'nodeSort', + label: t('appSetting.nodesSort'), + children:
ignore Node
, + }, + { + key: 'categoryIgnore', + label: t('appSetting.categoryIgnore'), + children:
Category Node
, + }, + { + key: 'nodeTransform', + label: t('appSetting.nodesTransform'), + children:
Node Transform
, + }, + ]; + + return ( +
+ +
+ ); +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts new file mode 100644 index 000000000..081290fd7 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts @@ -0,0 +1,204 @@ +export const mockIgnoreData = { + responseStatusType: { + statusCode: 200, + message: 'Success', + }, + body: { + pageIndex: 1, + pageNum: 20, + count: 100, + appId: 'app_12345', + exclusions: [ + { + exclusionPath: ['path', 'to', 'global', 'node1'], + operationId: '', + operationName: '', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: 'd814616009804e367c5cc7b', + }, + { + exclusionPath: ['path', 'to', 'global', 'node2'], + operationId: '', + operationName: '', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: 'dccb121cfea19a7571c96df', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node1'], + operationId: 'op_12345', + operationName: 'GetUserDetails', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: 'dd4d62cdbd0fbe58d921bd3', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node2'], + operationId: 'op_12346', + operationName: 'GetOrderDetails', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '16ac832f31084ba83e5ab1d', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node3'], + operationId: 'op_12347', + operationName: 'GetProductList', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: 'a28f08999e54fca403e70ba', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node4'], + operationId: 'op_12348', + operationName: 'GetCartItems', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '7e8b8f600865582a7cc5aaa', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node1'], + operationId: 'op_12345', + operationName: 'GetUserDetails', + dependencyId: 'dep_12345', + dependencyName: 'UserService', + expirationDate: 1735689600000, + expirationType: 1, + id: 'a27474fc45d60b629f8145b', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node2'], + operationId: 'op_12346', + operationName: 'GetOrderDetails', + dependencyId: 'dep_12346', + dependencyName: 'OrderService', + expirationDate: 1735689600000, + expirationType: 1, + id: 'e068f844dd278bad2a6754f', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node3'], + operationId: 'op_12347', + operationName: 'GetProductList', + dependencyId: 'dep_12347', + dependencyName: 'ProductService', + expirationDate: 1735689600000, + expirationType: 1, + id: 'a98ffa7e871ab960e72c353', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node4'], + operationId: 'op_12348', + operationName: 'GetCartItems', + dependencyId: 'dep_12348', + dependencyName: 'CartService', + expirationDate: 1735689600000, + expirationType: 1, + id: '5400632e72d31137f833483', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node5'], + operationId: 'op_12349', + operationName: 'GetUserPreferences', + dependencyId: 'dep_12349', + dependencyName: 'PreferencesService', + expirationDate: 1735689600000, + expirationType: 1, + id: '99010f9a0ca5892e5a24f47', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node6'], + operationId: 'op_12350', + operationName: 'GetWishlist', + dependencyId: 'dep_12350', + dependencyName: 'WishlistService', + expirationDate: 1735689600000, + expirationType: 1, + id: '3fa1bbf11331bf71d40ad0c', + }, + { + exclusionPath: ['path', 'to', 'dependency', 'node7'], + operationId: 'op_12351', + operationName: 'GetPaymentMethods', + dependencyId: 'dep_12351', + dependencyName: 'PaymentService', + expirationDate: 1735689600000, + expirationType: 1, + id: 'ab60cc79eea381ba0fb31ef', + }, + { + exclusionPath: ['path', 'to', 'global', 'node3'], + operationId: '', + operationName: '', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '25d470a719ce9f292bbf243', + }, + { + exclusionPath: ['path', 'to', 'global', 'node4'], + operationId: '', + operationName: '', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '7bd47d70630fb171881c63d', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node5'], + operationId: 'op_12352', + operationName: 'GetOrderHistory', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '546f9c949f817972174b623', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node6'], + operationId: 'op_12353', + operationName: 'GetNotifications', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: 'f96e417ac8dbeeeb63ea409', + }, + { + exclusionPath: ['path', 'to', 'interface', 'node7'], + operationId: 'op_12354', + operationName: 'GetMessages', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '11dd5719e994d7e327a7c65', + }, + { + exclusionPath: ['path', 'to', 'global', 'node5'], + operationId: '', + operationName: '', + dependencyId: '', + dependencyName: '', + expirationDate: 1735689600000, + expirationType: 1, + id: '11793a85ca10c62e6a4a133', + }, + ], + }, +}; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts new file mode 100644 index 000000000..2a1c3f0ca --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts @@ -0,0 +1,28 @@ +export type BaseConfigInfo = { + id: string; + operationName: string; + dependencyName: string; + dependencyType: string; + expirationDate: number; + expirationType: number; +}; + +export type ExclusionInfo = BaseConfigInfo<{ + exclusionPath: string[]; +}>; + +export type ListSortInfo = BaseConfigInfo<{ + listPath: string[]; + keys: string[][]; +}>; + +type IgnoreCategory = { + operationType: string; + operationName?: string; +}; + +export type IgnoreCategoryInfo = BaseConfigInfo<{ ignoreCategoryDetail: IgnoreCategory }>; + +export type RootTransformInfo = BaseConfigInfo<{ + transformMethodName: string; +}>; diff --git a/packages/arex/src/services/ComparisonService/index.ts b/packages/arex/src/services/ComparisonService/index.ts index 5cb0f0330..4766a567a 100644 --- a/packages/arex/src/services/ComparisonService/index.ts +++ b/packages/arex/src/services/ComparisonService/index.ts @@ -11,6 +11,7 @@ export * from './insertIgnoreCategory'; export * from './insertIgnoreNode'; export * from './insertSortNode'; export * from './insertTransformNode'; +export * from './queryAggregateIgnoreNode'; export * from './queryCategoryType'; export * from './queryEncryptionNode'; export * from './queryIgnoreCategory'; diff --git a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts new file mode 100644 index 000000000..fc149561e --- /dev/null +++ b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts @@ -0,0 +1,25 @@ +import { ExclusionInfo } from '@/panes/AppSetting/CompareConfigNew/type'; +import { PagingRequest, PagingResponse } from '@/services/type'; +import { request } from '@/utils'; + +export type PageQueryComparisonReq = PagingRequest<{ + appId: string; + operationIds?: (string | null)[]; // use null search for global + dependencyIds?: string[]; +}>; + +export type PageQueryComparisonRes = PagingResponse<{ exclusions: ExclusionInfo[] }>; + +export async function queryAggregateIgnoreNode(params: PageQueryComparisonReq) { + const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; + const res = await request.post( + '/webApi/config/comparison/exclusions/pageQueryComparisonConfig', + { + pageIndex, + pageSize, + needTotal, + ...restParams, + }, + ); + return res.body; +} diff --git a/packages/arex/src/services/type.ts b/packages/arex/src/services/type.ts new file mode 100644 index 000000000..5ddb6f45c --- /dev/null +++ b/packages/arex/src/services/type.ts @@ -0,0 +1,9 @@ +export type PagingRequest = { + pageIndex?: number; + pageSize?: number; + needTotal?: boolean; +} & T; + +export type PagingResponse = { + totalCount: number; +} & T; From 5d92b48b4125669e78a92cfd4bda8a024c021a13 Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Thu, 7 Nov 2024 17:00:10 +0800 Subject: [PATCH 02/12] feat: list sort --- .../arex/src/panes/AppSetting/AppSetting.tsx | 2 +- .../CompareConfigNew/AddConfigModal.tsx | 207 +++++++++++++ .../CompareConfigNew/ConfigInfoTable.tsx | 5 + .../ListSort/SortPathKeyInput.tsx | 76 +++++ .../CompareConfigNew/ListSort/index.tsx | 275 ++++++++++++++++++ .../NodeIgnore/AddIgnoreModal.tsx | 185 ------------ ...usionPathInput.tsx => IgnorePathInput.tsx} | 48 +-- .../NodeIgnore/IgnoreTree.tsx | 40 +++ .../CompareConfigNew/NodeIgnore/index.tsx | 147 +++++++--- .../__snapshots__/getIgnoreNodes.test.ts.snap | 78 +++++ .../NodeIgnore/utils/getIgnoreNodes.test.ts | 30 ++ .../NodeIgnore/utils/getIgnoreNodes.ts | 33 +++ .../NodeIgnore/utils/index.ts | 1 + .../AppSetting/CompareConfigNew/index.tsx | 3 +- .../src/services/ComparisonService/index.ts | 1 + .../queryAggregateIgnoreNode.ts | 4 +- .../queryAggregateSortNode.ts | 21 ++ 17 files changed, 915 insertions(+), 241 deletions(-) create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx delete mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/AddIgnoreModal.tsx rename packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/{ExclusionPathInput.tsx => IgnorePathInput.tsx} (62%) create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/__snapshots__/getIgnoreNodes.test.ts.snap create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.test.ts create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/index.ts create mode 100644 packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts diff --git a/packages/arex/src/panes/AppSetting/AppSetting.tsx b/packages/arex/src/panes/AppSetting/AppSetting.tsx index 423c00aba..fce608fcb 100644 --- a/packages/arex/src/panes/AppSetting/AppSetting.tsx +++ b/packages/arex/src/panes/AppSetting/AppSetting.tsx @@ -46,7 +46,7 @@ const AppSetting: ArexPaneFC<{ key: string }> = (props) => { }, { key: 'compareConfigNew', - label: t('appSetting.compareConfig'), + label: t('appSetting.compareConfig') + ' new', children: , }, { diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx new file mode 100644 index 000000000..d77fa20e9 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx @@ -0,0 +1,207 @@ +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { Form, FormInstance, Input, Modal, Select, SelectProps } from 'antd'; +import { Rule } from 'antd/es/form'; +import React, { + ForwardedRef, + ReactNode, + useEffect, + useImperativeHandle, + useMemo, + useState, +} from 'react'; + +import { Connector } from '@/constant'; +import { ApplicationService } from '@/services'; +import { DependencyData, OperationInterface } from '@/services/ApplicationService'; +import { IgnoreNodeBase } from '@/services/ComparisonService'; + +type DependencyParams = Pick; + +type CompareConfigParams = { + appId: string; + operationId?: string; + dependency?: string; +}; + +type CompareConfigForm = CompareConfigParams & T; + +export type AddConfigModalProps = { + appId: string; + title?: ReactNode; + field?: (appId: string, operationId?: string, dependency?: DependencyParams) => ReactNode; + rules?: { + operationId?: Rule[]; + dependency?: Rule[]; + }; + operationList?: OperationInterface<'Interface'>[]; + onOk?: (form: FormInstance>) => void; + onClose?: () => void; +}; + +export type AddConfigModalRef = { + open: () => void; + close: () => void; + getForm: () => FormInstance; + validate: () => Promise; + submit: () => void; +}; + +type FixedForwardRef = ( + render: (props: P, ref: React.Ref) => React.ReactElement | null, +) => (props: P & React.RefAttributes) => React.ReactElement | null; + +const forwardRef = React.forwardRef as FixedForwardRef; + +const AddConfigModal = forwardRef( + (props: AddConfigModalProps, ref: ForwardedRef) => { + const { t } = useTranslation(); + + const [form] = Form.useForm>(); + const operationId = Form.useWatch('operationId', form); + + // reset dependency when operationId changed + useEffect(() => { + form.setFieldValue('dependency', undefined); + }, [operationId]); + + const [openAddConfigModal, setOpenAddConfigModal] = useState(false); + + useImperativeHandle( + ref, + () => ({ + open: () => setOpenAddConfigModal(true), + close: () => handleCloseModal(), + getForm: () => form, + validate: () => form.validateFields(), + submit: () => form.submit(), + }), + [form], + ); + + const interfaceOptions = useMemo( + () => + Object.entries( + (props.operationList || []).reduce< + Record + >((options, item) => { + item.operationTypes?.forEach((operation) => { + if (options[operation]) { + options[operation].push({ + label: item.operationName, + value: item.id, + }); + } else { + options[operation] = [ + { + label: item.operationName, + value: item.id, + }, + ]; + } + }); + return options; + }, {}), + ).map(([label, options]) => ({ + label, + options, + })), + [props.operationList], + ); + + /** + * 请求 DependencyList + * // TODO 从 props.operationList 获取对应的 dependencyOptions + */ + const { loading: loadingDependency } = useRequest( + () => ApplicationService.getDependencyList({ operationId: operationId! }), + { + ready: !!operationId, + refreshDeps: [operationId], + onSuccess(res) { + const dependencyList = res.dependencyList; + setDependencyOptions( + dependencyList.map((dependency) => ({ + label: dependency.operationType + '-' + dependency.operationName, + value: stringifyDependency(dependency), + })), + ); + }, + }, + ); + + const [dependencyOptions, setDependencyOptions] = useState(); + + const handleCloseModal = () => { + setOpenAddConfigModal(false); + props.onClose?.(); + }; + + return ( + props.onOk?.(form)} + onCancel={handleCloseModal} + > + > + form={form} + requiredMark='optional' + initialValues={{ + appId: props.appId, + }} + style={{ padding: '8px 0' }} + > + + + + + + {(() => + props.field?.( + props.appId, + form.getFieldValue('operationId'), + form.getFieldValue('dependency'), + ))()} + + + ); + }, +); + +export default AddConfigModal; +export function stringifyDependency(dependency: DependencyData) { + return dependency.operationType + Connector + dependency.operationName; +} +export function parseDependency(dependencyString?: string | null) { + const [operationType, operationName] = dependencyString?.split(Connector) || []; + return { operationType, operationName }; +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx index 6dbd4e656..2e077f9c9 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx @@ -12,6 +12,11 @@ import { SearchHighLight } from '@/components'; import { BaseConfigInfo } from './type'; +export enum CONFIG_INFO_TABLE_MODE { + DISPLAY, + EDIT, +} + export interface ConfigInfoTableProps extends TableProps { requestSearch?: boolean; onSearch?: (search: Record) => void; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx new file mode 100644 index 000000000..b8a240a20 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx @@ -0,0 +1,76 @@ +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { Form, Input, Select } from 'antd'; +import React from 'react'; + +import { ReportService } from '@/services'; +import { DependencyParams } from '@/services/ComparisonService'; + +export type SortPathKeyInputProps = { + appId: string; + operationId?: string; + dependency?: DependencyParams; +}; + +export default function SortPathKeyInput(props: SortPathKeyInputProps) { + const { appId, operationId, dependency } = props; + const { t } = useTranslation(); + + const { + data: contract, + mutate: setContract, + loading: loadingContract, + } = useRequest( + () => + ReportService.queryContract({ + appId, + operationId, + ...dependency, + }), + { + ready: !!appId, // TODO && collapseExpand + refreshDeps: [appId, operationId, dependency], + onBefore() { + setContract(); + }, + }, + ); + + return ( + <> + + {/* TODO select path from contract tree */} + + + + {/* TODO select path from contract tree */} + { - setActiveOperationId(value); - setActiveDependency(undefined); - }} - /> - - - { - props.onChange?.(e.target.value); - }} - /> + + { + props.onChange?.(e.target.value); + }} + /> + {'select from tree'}} + icon={} + textProps={{ style: { height: '10px' } }} + onClick={() => setExpand(!expand)} + /> + - select from tree - - ), + showArrow: false, + // TODO styles no padding children: ( { ); }; -export default ExclusionPathInput; +export default IgnorePathInput; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx new file mode 100644 index 000000000..cc39232fd --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx @@ -0,0 +1,40 @@ +import { EmptyWrapper, styled, useTranslation } from '@arextest/arex-core'; +import { Card, Tree } from 'antd'; +import { TreeProps } from 'antd/es'; +import React, { FC, useMemo } from 'react'; + +import { getIgnoreNodes } from './utils'; + +type IgnoreTreeProps = Omit & { + title?: React.ReactNode; + loading?: boolean; + treeData: object; + lineThrough?: boolean; +}; + +const IgnoreTreeWrapper = styled.div<{ lineThrough?: boolean }>` + .ant-tree-node-selected { + text-decoration: ${(props) => (props.lineThrough ? 'line-through' : 'none')}; + } +`; + +const IgnoreTree: FC = (props) => { + const { t } = useTranslation(['components', 'common']); + const treeData = useMemo(() => getIgnoreNodes(props.treeData, ''), [props.treeData]); + + return ( + + + + + + + + ); +}; + +export default IgnoreTree; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx index 3971c4012..8152249dc 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx @@ -1,18 +1,30 @@ -import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; +import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; import { useTranslation } from '@arextest/arex-core'; import { useRequest } from 'ahooks'; -import { App, Pagination, Popconfirm } from 'antd'; -import { Button } from 'antd'; +import { App, Button, Form, Pagination, Popconfirm } from 'antd'; import { ColumnsType } from 'antd/es/table'; import React, { useRef, useState } from 'react'; +import AddConfigModal, { + AddConfigModalProps, + AddConfigModalRef, + parseDependency, +} from '@/panes/AppSetting/CompareConfigNew/AddConfigModal'; +import IgnorePathInput from '@/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput'; import { ComparisonService } from '@/services'; -import { PageQueryComparisonReq } from '@/services/ComparisonService'; +import { IgnoreNodeBase, PageQueryComparisonReq } from '@/services/ComparisonService'; -import ConfigInfoTable from '../ConfigInfoTable'; +import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE } from '../ConfigInfoTable'; import { ExclusionInfo } from '../type'; -import AddIgnoreModal, { AddIgnoreModalProps } from './AddIgnoreModal'; -import { AddIgnoreModalRef } from './AddIgnoreModal'; + +type NodeIgnorePrivate = { + exclusions: string; +}; + +export type NodeIgnoreProps = { appId: string } & Pick< + AddConfigModalProps, + 'operationList' +>; const PAGE_SIZE = { SIZE_10: 10, @@ -22,14 +34,15 @@ const PAGE_SIZE = { const pageSizeOptions = Object.values(PAGE_SIZE); -export type NodeIgnoreProps = { appId: string } & Pick; - -// NodeIgnore 组件 export default function NodeIgnore(props: NodeIgnoreProps) { const { t } = useTranslation(); const { message } = App.useApp(); - const addIgnoreModalRef = useRef(null); + const addConfigModalRef = useRef(null); + + const [tableMode, setTableMode] = useState( + CONFIG_INFO_TABLE_MODE.DISPLAY, + ); const [pagination, setPagination] = useState({ current: 1, @@ -76,6 +89,8 @@ export default function NodeIgnore(props: NodeIgnoreProps) { manual: true, onSuccess(success) { if (success) { + message.success(t('common:message.delSuccess')); + setTableMode(CONFIG_INFO_TABLE_MODE.DISPLAY); queryAggregateIgnoreNode(); } else { message.error(t('common:message.delFailed')); @@ -83,6 +98,19 @@ export default function NodeIgnore(props: NodeIgnoreProps) { }, }); + const { run: insertIgnoreNode } = useRequest(ComparisonService.insertIgnoreNode, { + manual: true, + onSuccess(success) { + if (success) { + message.success(t('message.updateSuccess', { ns: 'common' })); + addConfigModalRef.current?.close(); + queryAggregateIgnoreNode(); + } else { + message.error(t('message.updateFailed', { ns: 'common' })); + } + }, + }); + function handleSearch(search: Record) { if (pagination.current !== 1) { setPagination({ current: 1, pageSize: pagination.pageSize }); @@ -124,7 +152,7 @@ export default function NodeIgnore(props: NodeIgnoreProps) { const TableFooter = () => (
- {data.totalCount >= pagination.pageSize && ( + {data.totalCount > pagination.pageSize && (
- - - - - + {tableMode === CONFIG_INFO_TABLE_MODE.DISPLAY ? ( + <> + + + + ) : ( + // tableMode === CONFIG_INFO_TABLE_MODE.EDIT + <> + + + + + + )}
); + const handleAddIgnore: AddConfigModalProps['onOk'] = (form) => { + form + .validateFields() + .then((res) => { + const { dependency, exclusions, ...rest } = res; + const params = { + ...rest, + ...parseDependency(dependency), + exclusions: exclusions?.split('/').filter(Boolean), + } as IgnoreNodeBase; + insertIgnoreNode(params); + }) + .catch((e) => { + console.log(e); + }); + }; + return (
@@ -167,20 +233,33 @@ export default function NodeIgnore(props: NodeIgnoreProps) { columns={columns} dataSource={data?.exclusions} footer={TableFooter} - rowSelection={{ - selections: true, - onSelect: (record, selected, selectedRows) => { - setSelectedRows(selectedRows); - }, - }} + rowSelection={ + tableMode !== CONFIG_INFO_TABLE_MODE.DISPLAY + ? { + onSelect: (record, selected, selectedRows) => { + setSelectedRows(selectedRows.filter(Boolean)); + }, + } + : undefined + } onSearch={handleSearch} /> - + ref={addConfigModalRef} + title={t('components:appSetting.nodesIgnore')} appId={props.appId} operationList={props.operationList} - onSuccess={queryAggregateIgnoreNode} + field={(appId, operationId, dependency) => ( + + + + )} + onOk={handleAddIgnore} />
); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/__snapshots__/getIgnoreNodes.test.ts.snap b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/__snapshots__/getIgnoreNodes.test.ts.snap new file mode 100644 index 000000000..2246fac6c --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/__snapshots__/getIgnoreNodes.test.ts.snap @@ -0,0 +1,78 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`convert sort tree > complex object 1`] = ` +[ + { + "key": "name/", + "title": "name", + "value": "Helen", + }, + { + "key": "age/", + "title": "age", + "value": 20, + }, + { + "key": "hobby/", + "title": "hobby", + "value": [ + "music", + "football", + ], + }, + { + "children": [ + { + "key": "assets/house/", + "title": "house", + "value": "shanghai", + }, + { + "key": "assets/car/", + "title": "car", + "value": [ + "BMW", + "Benz", + ], + }, + { + "key": "assets/savings/", + "title": "savings", + "value": 1000000, + }, + ], + "key": "assets/", + "title": "assets", + }, +] +`; + +exports[`convert sort tree > lossless json string 1`] = ` +[ + { + "key": "name/", + "title": "name", + "value": "Helen", + }, + { + "key": "age/", + "title": "age", + "value": "20.00000000", + }, +] +`; + +exports[`convert sort tree > simple object 1`] = ` +[ + { + "key": "name/", + "title": "name", + "value": "Helen", + }, + { + "key": "age/", + "title": "age", + "value": 20, + }, +] +`; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.test.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.test.ts new file mode 100644 index 000000000..78641beae --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.test.ts @@ -0,0 +1,30 @@ +import { tryParseJsonString } from '@arextest/arex-core'; +import { describe, expect, test } from 'vitest'; + +import { getIgnoreNodes } from './getIgnoreNodes'; + +describe('convert sort tree', () => { + test('simple object', () => { + const objectData = { name: 'Helen', age: 20 }; + expect(getIgnoreNodes(objectData)).toMatchSnapshot(); + }); + + test('complex object', () => { + const objectData = { + name: 'Helen', + age: 20, + hobby: ['music', 'football'], + assets: { + house: 'shanghai', + car: ['BMW', 'Benz'], + savings: 1000000, + }, + }; + expect(getIgnoreNodes(objectData)).toMatchSnapshot(); + }); + + test('lossless json string', () => { + const jsonString = '{"name":"Helen","age":20.00000000}'; + expect(getIgnoreNodes(tryParseJsonString(jsonString) as object)).toMatchSnapshot(); + }); +}); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts new file mode 100644 index 000000000..843afb1d5 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts @@ -0,0 +1,33 @@ +import { DataNode } from 'antd/lib/tree'; + +import { getArrayValidElement } from '@/panes/AppSetting/CompareConfig/NodesSort/utils'; + +/** + * 获取 object 的节点信息 + * @param object + * @param basePath + */ +export function getIgnoreNodes(object: object, basePath = ''): DataNode[] { + const entries = Object.entries(object); + return entries.map(([key, value]) => { + const losslessValue = value.isLosslessNumber ? value.value : value; + const isSimpleArray = + Array.isArray(losslessValue) && ['number', 'string'].includes(typeof losslessValue[0]); + const isObject = typeof losslessValue === 'object'; + + const path = basePath + key + '/'; + + return losslessValue && isObject && !isSimpleArray + ? { + title: key, + key: path, + children: getIgnoreNodes( + Array.isArray(losslessValue) + ? getArrayValidElement(losslessValue) || {} + : losslessValue, + path, + ), + } + : { title: key, key: path, value: losslessValue }; + }); +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/index.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/index.ts new file mode 100644 index 000000000..1d721d9f5 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/index.ts @@ -0,0 +1 @@ +export { getIgnoreNodes } from './getIgnoreNodes'; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx index 53b56a7a2..992f3ba49 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx @@ -5,6 +5,7 @@ import React from 'react'; import { ApplicationService } from '@/services'; +import ListSort from './ListSort'; import NodeIgnore from './NodeIgnore'; export type CompareConfigNewProps = { @@ -33,7 +34,7 @@ export default function CompareConfigNew(props: CompareConfigNewProps) { { key: 'nodeSort', label: t('appSetting.nodesSort'), - children:
ignore Node
, + children: , }, { key: 'categoryIgnore', diff --git a/packages/arex/src/services/ComparisonService/index.ts b/packages/arex/src/services/ComparisonService/index.ts index 4766a567a..b50afd9e1 100644 --- a/packages/arex/src/services/ComparisonService/index.ts +++ b/packages/arex/src/services/ComparisonService/index.ts @@ -12,6 +12,7 @@ export * from './insertIgnoreNode'; export * from './insertSortNode'; export * from './insertTransformNode'; export * from './queryAggregateIgnoreNode'; +export * from './queryAggregateSortNode'; export * from './queryCategoryType'; export * from './queryEncryptionNode'; export * from './queryIgnoreCategory'; diff --git a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts index fc149561e..91a9ce9ce 100644 --- a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts +++ b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts @@ -8,11 +8,11 @@ export type PageQueryComparisonReq = PagingRequest<{ dependencyIds?: string[]; }>; -export type PageQueryComparisonRes = PagingResponse<{ exclusions: ExclusionInfo[] }>; +export type PageQueryIgnoreComparisonRes = PagingResponse<{ exclusions: ExclusionInfo[] }>; export async function queryAggregateIgnoreNode(params: PageQueryComparisonReq) { const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; - const res = await request.post( + const res = await request.post( '/webApi/config/comparison/exclusions/pageQueryComparisonConfig', { pageIndex, diff --git a/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts b/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts new file mode 100644 index 000000000..cd05a59b7 --- /dev/null +++ b/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts @@ -0,0 +1,21 @@ +import { ListSortInfo } from '@/panes/AppSetting/CompareConfigNew/type'; +import { PagingResponse } from '@/services/type'; +import { request } from '@/utils'; + +import { PageQueryComparisonReq } from './queryAggregateIgnoreNode'; + +export type PageQuerySortComparisonRes = PagingResponse<{ listSorts: ListSortInfo[] }>; + +export async function queryAggregateSortNode(params: PageQueryComparisonReq) { + const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; + const res = await request.post( + '/webApi/config/comparison/listsort/pageQueryComparisonConfig', + { + pageIndex, + pageSize, + needTotal, + ...restParams, + }, + ); + return res.body; +} From f3a92a4f3e70eae3dc8d9c17cb15bd2817148d0c Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Thu, 7 Nov 2024 17:03:33 +0800 Subject: [PATCH 03/12] chore: update antd verison to 5.21.6 --- packages/arex-core/package.json | 4 +- packages/arex-request/package.json | 4 +- packages/arex/package.json | 2 +- pnpm-lock.yaml | 467 ++++++++++++++++++----------- 4 files changed, 302 insertions(+), 175 deletions(-) diff --git a/packages/arex-core/package.json b/packages/arex-core/package.json index 55e7ff8ec..eb9a0d58c 100644 --- a/packages/arex-core/package.json +++ b/packages/arex-core/package.json @@ -1,6 +1,6 @@ { "name": "@arextest/arex-core", - "version": "0.4.10", + "version": "0.4.11", "homepage": "https://github.com/arextest/arex", "main": "dist/arex-core.js", "module": "dist/arex-core.js", @@ -48,7 +48,7 @@ "peerDependencies": { "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", - "antd": "^5.19.0", + "antd": "^5.21.6", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/packages/arex-request/package.json b/packages/arex-request/package.json index 4889aef37..12b042155 100644 --- a/packages/arex-request/package.json +++ b/packages/arex-request/package.json @@ -1,6 +1,6 @@ { "name": "@arextest/arex-request", - "version": "0.3.14", + "version": "0.3.15", "type": "module", "main": "dist/arex-request.js", "module": "dist/arex-request.js", @@ -48,7 +48,7 @@ "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@monaco-editor/react": "^4.6.0", - "antd": "^5.19.0", + "antd": "^5.21.6", "i18next": "^22.4.11", "monaco-editor": "^0.39.0", "react": "^18.2.0", diff --git a/packages/arex/package.json b/packages/arex/package.json index c9deb8896..5708dd5ba 100644 --- a/packages/arex/package.json +++ b/packages/arex/package.json @@ -29,7 +29,7 @@ "@sentry/react": "^7.113.0", "ahooks": "^3.7.5", "allotment": "^1.20.2", - "antd": "^5.19.0", + "antd": "^5.21.6", "antd-img-crop": "^4.12.2", "axios": "^1.3.6", "body-parser": "^1.20.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e09ac75b2..326e2021f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,11 +112,11 @@ importers: specifier: ^1.20.2 version: 1.20.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) antd: - specifier: ^5.19.0 - version: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.21.6 + version: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) antd-img-crop: specifier: ^4.12.2 - version: 4.21.0(antd@5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.21.0(antd@5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) axios: specifier: ^1.3.6 version: 1.6.8 @@ -266,8 +266,8 @@ importers: specifier: ^3.7.5 version: 3.7.10(react@18.2.0) antd: - specifier: ^5.19.0 - version: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.21.6 + version: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) dayjs: specifier: ^1.11.7 version: 1.11.10 @@ -427,8 +427,8 @@ importers: specifier: ^1.20.2 version: 1.20.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) antd: - specifier: ^5.19.0 - version: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.21.6 + version: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) arex-request-runtime: specifier: ^1.0.2 version: 1.0.2 @@ -543,18 +543,28 @@ packages: '@ant-design/colors@7.1.0': resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} + '@ant-design/cssinjs-utils@1.1.1': + resolution: {integrity: sha512-2HAiyGGGnM0es40SxdszeQAU5iWp41wBIInq+ONTCKjlSKOrzQfnw4JDtB8IBmqE6tQaEKwmzTP2LGdt5DSwYQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + '@ant-design/cssinjs@1.18.5': resolution: {integrity: sha512-Ub4n3d+MAX/qtE5S9PM8iOn5ocU7GUAIC4Adc2X8UCMXnsRRfpJBHsBdtQ1qoAuaQ7lU2M1BTCuJ+fkv4fOWiw==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - '@ant-design/cssinjs@1.21.0': - resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==} + '@ant-design/cssinjs@1.21.1': + resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' + '@ant-design/fast-color@2.0.6': + resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} + engines: {node: '>=8.x'} + '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} @@ -565,8 +575,8 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' - '@ant-design/icons@5.4.0': - resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==} + '@ant-design/icons@5.5.1': + resolution: {integrity: sha512-0UrM02MA2iDIgvLatWrj6YTCYe0F/cwXvVE0E2SqGrL7PZireQwgEKTKBisWpZyal5eXZLvuM98kju6YtYne8w==} engines: {node: '>=8'} peerDependencies: react: '>=16.0.0' @@ -698,6 +708,10 @@ packages: resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} @@ -1381,6 +1395,12 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + '@rc-component/color-picker@2.0.1': + resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + '@rc-component/context@1.4.0': resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} peerDependencies: @@ -1419,8 +1439,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/tour@1.15.0': - resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} + '@rc-component/tour@1.15.1': + resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -1440,6 +1460,13 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + '@rc-component/trigger@2.2.3': + resolution: {integrity: sha512-X1oFIpKoXAMXNDYCviOmTfuNuYxE4h5laBsyCqVAVMjNHxoF3/uiyA7XdegK1XbCvBbCZ6P6byWrEoDRpKL8+A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + '@remix-run/router@1.15.3': resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} engines: {node: '>=14.0.0'} @@ -2154,8 +2181,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - antd@5.19.3: - resolution: {integrity: sha512-rhGI6yyZ4dA2MWl9bfO0MZjtNwWdzITpp3u7pKLiQpTjJYFlpF5wDFgGaG1or3sqyBihvqcO/OF1hSggmWczbQ==} + antd@5.21.6: + resolution: {integrity: sha512-EviOde/VEu+OsIKH5t6YXTMmmNeg9R85m0W5zXAo+Np8Latg9q10691JvAqOTMpnrRmbdeKUQL1Krp69Bzbe/g==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4624,8 +4651,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-cascader@3.27.0: - resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==} + rc-cascader@3.28.2: + resolution: {integrity: sha512-8f+JgM83iLTvjgdkgU7GfI4qY8icXOBP0cGZjOdx2iJAkEe8ucobxDQAVE69UD/c3ehCxZlcgEHeD5hFmypbUw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4648,14 +4675,20 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + rc-collapse@3.8.0: + resolution: {integrity: sha512-YVBkssrKPBG09TGfcWWGj8zJBYD9G3XuTy89t5iUmSXrIXEAnO1M+qjUxRW6b4Qi0+wNWG6MHJF/+US+nmIlzA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + rc-dialog@9.4.0: resolution: {integrity: sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-dialog@9.5.2: - resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} + rc-dialog@9.6.0: + resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4685,21 +4718,21 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-field-form@2.2.1: - resolution: {integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==} + rc-field-form@2.4.0: + resolution: {integrity: sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-image@7.6.0: - resolution: {integrity: sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==} + rc-image@7.11.0: + resolution: {integrity: sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-image@7.9.0: - resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} + rc-image@7.6.0: + resolution: {integrity: sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4710,8 +4743,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-input-number@9.1.0: - resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} + rc-input-number@9.2.0: + resolution: {integrity: sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4722,8 +4755,8 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-input@1.5.1: - resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} + rc-input@1.6.3: + resolution: {integrity: sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -4734,8 +4767,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-mentions@2.14.0: - resolution: {integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==} + rc-mentions@2.16.1: + resolution: {integrity: sha512-GnhSTGP9Mtv6pqFFGQze44LlrtWOjHNrUUAcsdo9DnNAhN4pwVPEWy4z+2jpjkiGlJ3VoXdvMHcNDQdfI9fEaw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4746,8 +4779,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-menu@9.14.1: - resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} + rc-menu@9.15.1: + resolution: {integrity: sha512-UKporqU6LPfHnpPmtP6hdEK4iO5Q+b7BRv/uRpxdIyDGplZy9jwUjsnpev5bs3PQKB0H0n34WAPDfjAfn3kAPA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4764,6 +4797,12 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + rc-motion@2.9.3: + resolution: {integrity: sha512-rkW47ABVkic7WEB0EKJqzySpvDqwl60/tdkY7hWP7dYnh5pm0SzJpo54oW3TDUGXV5wfxXFmMkxrzRRbotQ0+w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + rc-notification@5.3.0: resolution: {integrity: sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==} engines: {node: '>=8.x'} @@ -4771,8 +4810,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-notification@5.6.0: - resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==} + rc-notification@5.6.2: + resolution: {integrity: sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4790,8 +4829,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-pagination@4.2.0: - resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} + rc-pagination@4.3.0: + resolution: {integrity: sha512-UubEWA0ShnroQ1tDa291Fzw6kj0iOeF26IsUObxYTpimgj4/qPCWVFl18RLZE+0Up1IZg0IK4pMn6nB3mjvB7g==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4816,8 +4855,8 @@ packages: moment: optional: true - rc-picker@4.6.9: - resolution: {integrity: sha512-kwQq5xDNJ1VcX7pauLlVBiuQorpZGUwA/YczVJTO1e33YsTyDuVjaQkYAiAupXbEPUBCU3doGZo0J25HGq2ZOQ==} + rc-picker@4.6.15: + resolution: {integrity: sha512-OWZ1yrMie+KN2uEUfYCfS4b2Vu6RC1FWwNI0s+qypsc3wRt7g+peuZKVIzXCTaJwyyZruo80+akPg2+GmyiJjw==} engines: {node: '>=8.x'} peerDependencies: date-fns: '>= 2.x' @@ -4874,6 +4913,12 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' + rc-segmented@2.5.0: + resolution: {integrity: sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + rc-select@14.13.0: resolution: {integrity: sha512-ew34FsaqHokK4dxVrcIxSYrgWJ2XJYlkk32eiOIiEo3GkHUExdCzmozMYaUc2P67c5QJRUvvY0uqCs3QG67h5A==} engines: {node: '>=8.x'} @@ -4881,8 +4926,8 @@ packages: react: '*' react-dom: '*' - rc-select@14.15.1: - resolution: {integrity: sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==} + rc-select@14.15.2: + resolution: {integrity: sha512-oNoXlaFmpqXYcQDzcPVLrEqS2J9c+/+oJuGrlXeVVX/gVgrbHa5YcyiRUXRydFjyuA7GP3elRuLF7Y3Tfwltlw==} engines: {node: '>=8.x'} peerDependencies: react: '*' @@ -4895,8 +4940,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-slider@10.6.2: - resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} + rc-slider@11.1.7: + resolution: {integrity: sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4922,8 +4967,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-table@7.45.7: - resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} + rc-table@7.47.5: + resolution: {integrity: sha512-fzq+V9j/atbPIcvs3emuclaEoXulwQpIiJA6/7ey52j8+9cJ4P8DGmp4YzfUVDrb3qhgedcVeD6eRgUrokwVEQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4936,8 +4981,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tabs@15.1.1: - resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} + rc-tabs@15.3.0: + resolution: {integrity: sha512-lzE18r+zppT/jZWOAWS6ntdkDUKHOLJzqMi5UAij1LeKwOaQaupupAoI9Srn73GRzVpmGznkECMRrzkRusC40A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4949,8 +4994,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-textarea@1.7.0: - resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} + rc-textarea@1.8.2: + resolution: {integrity: sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4961,14 +5006,20 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + rc-tooltip@6.2.1: + resolution: {integrity: sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + rc-tree-select@5.19.0: resolution: {integrity: sha512-f4l5EsmSGF3ggj76YTzKNPY9SnXfFaer7ZccTSGb3urUf54L+cCqyT+UsPr+S5TAr8mZSxJ7g3CgkCe+cVQ6sw==} peerDependencies: react: '*' react-dom: '*' - rc-tree-select@5.22.1: - resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==} + rc-tree-select@5.23.0: + resolution: {integrity: sha512-aQGi2tFSRw1WbXv0UVXPzHm09E0cSvUVZMLxQtMv3rnZZpNmdRXWrnd9QkLNlVH31F+X5rgghmdSFF3yZW0N9A==} peerDependencies: react: '*' react-dom: '*' @@ -4980,8 +5031,8 @@ packages: react: '*' react-dom: '*' - rc-tree@5.8.8: - resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} + rc-tree@5.9.0: + resolution: {integrity: sha512-CPrgOvm9d/9E+izTONKSngNzQdIEjMox2PBufWjS1wf7vxtvmCWzK1SlpHbRY6IaBfJIeZ+88RkcIevf729cRg==} engines: {node: '>=10.x'} peerDependencies: react: '*' @@ -4993,8 +5044,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-upload@4.6.0: - resolution: {integrity: sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==} + rc-upload@4.8.1: + resolution: {integrity: sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -5537,6 +5588,9 @@ packages: stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + stylis@4.3.4: + resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} + sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} @@ -6226,6 +6280,14 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 + '@ant-design/cssinjs-utils@1.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.26.0 + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + '@ant-design/cssinjs@1.18.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 @@ -6238,9 +6300,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) stylis: 4.3.1 - '@ant-design/cssinjs@1.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@ant-design/cssinjs@1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 @@ -6248,7 +6310,11 @@ snapshots: rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - stylis: 4.3.1 + stylis: 4.3.4 + + '@ant-design/fast-color@2.0.6': + dependencies: + '@babel/runtime': 7.26.0 '@ant-design/icons-svg@4.4.2': {} @@ -6262,11 +6328,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@ant-design/icons@5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@ant-design/icons@5.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -6283,7 +6349,7 @@ snapshots: '@ant-design/react-slick@1.1.2(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 json2mq: 0.2.0 react: 18.2.0 @@ -6465,6 +6531,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 @@ -7189,7 +7259,7 @@ snapshots: '@rc-component/async-validator@5.0.4': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/color-picker@1.5.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -7200,6 +7270,15 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + '@rc-component/color-picker@2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@ant-design/fast-color': 2.0.6 + '@babel/runtime': 7.26.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + '@rc-component/context@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 @@ -7229,7 +7308,7 @@ snapshots: '@rc-component/qrcode@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -7245,11 +7324,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@rc-component/tour@1.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@rc-component/tour@1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -7277,6 +7356,17 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + '@rc-component/trigger@2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.26.0 + '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + classnames: 2.5.1 + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + '@remix-run/router@1.15.3': {} '@replit/codemirror-indentation-markers@6.5.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)': @@ -8046,9 +8136,9 @@ snapshots: ansi-styles@6.2.1: {} - antd-img-crop@4.21.0(antd@5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + antd-img-crop@4.21.0(antd@5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - antd: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) compare-versions: 6.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -8112,53 +8202,54 @@ snapshots: - luxon - moment - antd@5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + antd@5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@ant-design/icons': 5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/cssinjs-utils': 1.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/icons': 5.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@ant-design/react-slick': 1.1.2(react@18.2.0) - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 1.5.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/color-picker': 2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@rc-component/qrcode': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@rc-component/tour': 1.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/tour': 1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.12 - rc-cascader: 3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-cascader: 3.28.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-checkbox: 3.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-collapse: 3.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-dialog: 9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-collapse: 3.8.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-drawer: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-dropdown: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-field-form: 2.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-image: 7.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-input-number: 9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-mentions: 2.14.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-notification: 5.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-pagination: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-picker: 4.6.9(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-field-form: 2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-image: 7.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input-number: 9.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-mentions: 2.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-notification: 5.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-pagination: 4.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-picker: 4.6.15(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-progress: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-rate: 2.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-segmented: 2.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-select: 14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-slider: 10.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-segmented: 2.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-slider: 11.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-steps: 6.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-switch: 4.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-table: 7.45.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tabs: 15.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-textarea: 1.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tooltip: 6.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree: 5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree-select: 5.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-upload: 4.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-table: 7.47.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tabs: 15.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-textarea: 1.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tooltip: 6.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree-select: 5.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-upload: 4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11012,13 +11103,13 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-cascader@3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-cascader@3.28.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 array-tree-filter: 2.1.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree: 5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11033,7 +11124,7 @@ snapshots: rc-checkbox@3.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11048,6 +11139,15 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + rc-collapse@3.8.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.26.0 + classnames: 2.5.1 + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rc-dialog@9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 @@ -11058,12 +11158,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-dialog@9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-dialog@9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11080,10 +11180,10 @@ snapshots: rc-drawer@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11105,33 +11205,33 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-field-form@2.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-field-form@2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/async-validator': 5.0.4 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-image@7.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-image@7.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@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))(react@18.2.0) - rc-motion: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-image@7.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-image@7.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.1 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-dialog: 9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11145,12 +11245,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-input-number@9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-input-number@9.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11163,9 +11263,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-input@1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-input@1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11183,14 +11283,14 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-mentions@2.14.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-mentions@2.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 - '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-textarea: 1.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-textarea: 1.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11206,12 +11306,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-menu@9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-menu@9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 - '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11233,6 +11333,14 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + rc-motion@2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.26.0 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rc-notification@5.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 @@ -11242,11 +11350,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-notification@5.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-notification@5.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11268,9 +11376,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-pagination@4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-pagination@4.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11289,10 +11397,10 @@ snapshots: optionalDependencies: dayjs: 1.11.12 - rc-picker@4.6.9(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-picker@4.6.15(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 - '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -11312,7 +11420,7 @@ snapshots: rc-progress@4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11328,7 +11436,7 @@ snapshots: rc-rate@2.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11352,6 +11460,15 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + rc-segmented@2.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.26.0 + classnames: 2.5.1 + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rc-select@14.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 @@ -11364,12 +11481,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-select@14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-select@14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 - '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -11384,9 +11501,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-slider@10.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-slider@11.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11419,9 +11536,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-table@7.45.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-table@7.47.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 '@rc-component/context': 1.4.0(react-dom@18.2.0(react@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))(react@18.2.0) @@ -11442,13 +11559,13 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tabs@15.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-tabs@15.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-dropdown: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11464,11 +11581,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-textarea@1.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-textarea@1.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11482,6 +11599,14 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + rc-tooltip@6.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + classnames: 2.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rc-tree-select@5.19.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.1 @@ -11492,12 +11617,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tree-select@5.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-tree-select@5.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-select: 14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree: 5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11512,11 +11637,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tree@5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-tree@5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11530,9 +11655,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-upload@4.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-upload@4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11563,7 +11688,7 @@ snapshots: rc-virtual-list@3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.26.0 classnames: 2.5.1 rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -12168,6 +12293,8 @@ snapshots: stylis@4.3.1: {} + stylis@4.3.4: {} + sumchecker@3.0.1: dependencies: debug: 4.3.4 From 085b8a0bf804ccb4c4669239bdb6ba02d414ed66 Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Thu, 7 Nov 2024 17:30:32 +0800 Subject: [PATCH 04/12] fix: promise close modal after success --- .../CompareConfigNew/AddConfigModal.tsx | 14 ++++++++++++-- .../ListSort/SortPathKeyInput.tsx | 12 ++---------- .../CompareConfigNew/ListSort/index.tsx | 3 +-- .../NodeIgnore/IgnorePathInput.tsx | 17 +++++++++++------ .../CompareConfigNew/NodeIgnore/index.tsx | 3 +-- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx index d77fa20e9..224acc315 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx @@ -35,7 +35,7 @@ export type AddConfigModalProps = { dependency?: Rule[]; }; operationList?: OperationInterface<'Interface'>[]; - onOk?: (form: FormInstance>) => void; + onOk?: (form: FormInstance>) => Promise; onClose?: () => void; }; @@ -62,6 +62,7 @@ const AddConfigModal = forwardRef( // reset dependency when operationId changed useEffect(() => { + // @ts-ignore form.setFieldValue('dependency', undefined); }, [operationId]); @@ -132,8 +133,15 @@ const AddConfigModal = forwardRef( const [dependencyOptions, setDependencyOptions] = useState(); + const handleOk = () => + props.onOk?.(form).then(() => { + setOpenAddConfigModal(false); + form.resetFields(); + }); + const handleCloseModal = () => { setOpenAddConfigModal(false); + form.resetFields(); props.onClose?.(); }; @@ -142,7 +150,7 @@ const AddConfigModal = forwardRef( destroyOnClose title={props.title} open={openAddConfigModal} - onOk={() => props.onOk?.(form)} + onOk={handleOk} onCancel={handleCloseModal} > > @@ -188,7 +196,9 @@ const AddConfigModal = forwardRef( {(() => props.field?.( props.appId, + // @ts-ignore form.getFieldValue('operationId'), + // @ts-ignore form.getFieldValue('dependency'), ))()} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx index b8a240a20..53761c8ba 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortPathKeyInput.tsx @@ -50,6 +50,7 @@ export default function SortPathKeyInput(props: SortPathKeyInputProps) { {/* TODO select path from contract tree */} + {/* TODO select path from contract tree */} - ); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx index edb6cbe1f..93927de73 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx @@ -217,7 +217,7 @@ export default function ListSort(props: ListSortProps) { }); } - const handleAddListSort: AddConfigModalProps['onOk'] = (form) => { + const handleAddListSort: AddConfigModalProps['onOk'] = (form) => form .validateFields() .then((res) => { @@ -233,7 +233,6 @@ export default function ListSort(props: ListSortProps) { .catch((e) => { console.error(e); }); - }; return (
diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx index 83ab9be92..e42743840 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx @@ -1,7 +1,7 @@ import { DownOutlined } from '@ant-design/icons'; -import { styled, TooltipButton, tryParseJsonString, useTranslation } from '@arextest/arex-core'; +import { css, styled, TooltipButton, tryParseJsonString } from '@arextest/arex-core'; import { useRequest } from 'ahooks'; -import { Button, Collapse, Form, Input, InputProps, Space, theme, Typography } from 'antd'; +import { Collapse, Input, InputProps, Space, Typography } from 'antd'; import React, { useMemo, useState } from 'react'; import { ReportService } from '@/services'; @@ -25,8 +25,6 @@ export type ExclusionPathInputProps = Omit & { const IgnorePathInput = (props: ExclusionPathInputProps) => { const { appId, operationId, dependency, ...inputProps } = props; - const { t } = useTranslation(); - const [expand, setExpand] = useState(false); const [selectedKeys, setSelectedKeys] = useState(); @@ -43,7 +41,7 @@ const IgnorePathInput = (props: ExclusionPathInputProps) => { ...dependency, }), { - ready: !!appId, // TODO && collapseExpand + ready: !!appId && expand, refreshDeps: [appId, operationId, dependency], onBefore() { setContract(); @@ -79,11 +77,18 @@ const IgnorePathInput = (props: ExclusionPathInputProps) => { ); - const handleAddIgnore: AddConfigModalProps['onOk'] = (form) => { + const handleAddIgnore: AddConfigModalProps['onOk'] = (form) => form .validateFields() .then((res) => { @@ -222,7 +222,6 @@ export default function NodeIgnore(props: NodeIgnoreProps) { .catch((e) => { console.log(e); }); - }; return (
From 9ef1df8cd64721d7e1e5fe49fe7d7d4bc95e1973 Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Mon, 11 Nov 2024 15:29:41 +0800 Subject: [PATCH 05/12] feat: category ignore --- .../CompareConfigNew/AddConfigModal.tsx | 99 +++-- .../CategoryIgnore/DependencyInput.tsx | 103 +++++ .../CompareConfigNew/CategoryIgnore/index.tsx | 417 +++++++++--------- .../CompareConfigNew/ConfigInfoTable.tsx | 8 +- .../CompareConfigNew/ListSort/index.tsx | 8 +- .../CompareConfigNew/NodeIgnore/index.tsx | 8 +- .../AppSetting/CompareConfigNew/index.tsx | 3 +- .../panes/AppSetting/CompareConfigNew/mock.ts | 204 --------- .../panes/AppSetting/CompareConfigNew/type.ts | 25 +- .../src/services/ComparisonService/index.ts | 1 + .../ComparisonService/insertIgnoreCategory.ts | 1 + .../queryAggregateIgnoreCategory.ts | 23 + 12 files changed, 419 insertions(+), 481 deletions(-) create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/DependencyInput.tsx delete mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts create mode 100644 packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx index 224acc315..20252f81b 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/AddConfigModal.tsx @@ -3,6 +3,7 @@ import { useRequest } from 'ahooks'; import { Form, FormInstance, Input, Modal, Select, SelectProps } from 'antd'; import { Rule } from 'antd/es/form'; import React, { + FC, ForwardedRef, ReactNode, useEffect, @@ -26,16 +27,24 @@ type CompareConfigParams = { type CompareConfigForm = CompareConfigParams & T; +export type AddConfigModalFieldProps = { + appId: string; + operationId?: string; + dependency?: DependencyParams; + form: FormInstance>; +}; + export type AddConfigModalProps = { appId: string; title?: ReactNode; - field?: (appId: string, operationId?: string, dependency?: DependencyParams) => ReactNode; + field?: FC>; rules?: { operationId?: Rule[]; dependency?: Rule[]; }; + builtInItems?: Partial>; operationList?: OperationInterface<'Interface'>[]; - onOk?: (form: FormInstance>) => Promise; + onSubmit?: (form: FormInstance>) => Promise; onClose?: () => void; }; @@ -59,6 +68,7 @@ const AddConfigModal = forwardRef( const [form] = Form.useForm>(); const operationId = Form.useWatch('operationId', form); + const dependency = Form.useWatch('dependency', form); // reset dependency when operationId changed useEffect(() => { @@ -134,7 +144,7 @@ const AddConfigModal = forwardRef( const [dependencyOptions, setDependencyOptions] = useState(); const handleOk = () => - props.onOk?.(form).then(() => { + props.onSubmit?.(form).then(() => { setOpenAddConfigModal(false); form.resetFields(); }); @@ -161,46 +171,51 @@ const AddConfigModal = forwardRef( }} style={{ padding: '8px 0' }} > - - - - - + {props.builtInItems?.appId !== false && ( + + )} + + {props.builtInItems?.operationId !== false && ( + + + + )} {(() => - props.field?.( - props.appId, - // @ts-ignore - form.getFieldValue('operationId'), - // @ts-ignore - form.getFieldValue('dependency'), - ))()} + props.field?.({ + appId: props.appId, + operationId, + dependency: parseDependency(dependency), + form, + }))()} ); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/DependencyInput.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/DependencyInput.tsx new file mode 100644 index 000000000..baca3a27f --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/DependencyInput.tsx @@ -0,0 +1,103 @@ +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { Form, Select, SelectProps } from 'antd'; +import React, { FC, useEffect, useMemo, useState } from 'react'; + +import { AddConfigModalFieldProps } from '@/panes/AppSetting/CompareConfigNew/AddConfigModal'; +import { ComparisonService } from '@/services'; +import { OperationInterface } from '@/services/ApplicationService'; +import { IgnoreCategory } from '@/services/ComparisonService'; + +const DependencyInput: FC< + AddConfigModalFieldProps & { + operationList?: OperationInterface<'Interface'>[]; + } +> = (props) => { + const { t } = useTranslation(); + + const operationTypeValue = Form.useWatch('operationTypeValue', props.form); + + useEffect(() => { + props.form.setFieldValue('operationName', undefined); + }, [operationTypeValue]); + + const [operationNameOptions, setOperationNameOptions] = useState([]); + + const [categoryTypeOptions, setCategoryOptions] = useState([]); + useRequest(ComparisonService.queryCategoryType, { + onSuccess(res) { + const options = res + .filter((item) => !item.entryPoint) + .map((item) => ({ + label: item.name, + value: item.name, + })); + setCategoryOptions(options); + }, + }); + + const optionsGroupMap = useMemo( + () => + props.operationList?.reduce((group, item) => { + if (!item.dependencyList) return group; + + item.dependencyList?.forEach((dependency) => { + if (group.has(dependency.operationType)) { + group.get(dependency.operationType)?.add(dependency.operationName); + } else { + group.set(dependency.operationType, new Set([dependency.operationName])); + } + }); + return group; + }, new Map>()) || new Map>(), + [props.operationList], + ); + + function handleOperationTypeChange(value: string) { + setOperationNameOptions( + props.operationId + ? // GLOBAL: set all dependency + Array.from(optionsGroupMap.get(value) || [])?.map((value) => ({ + label: value, + value, + })) + : // INTERFACE: set dependency of current interface + props.operationList + ?.find((item) => item.id === props.operationId) + ?.dependencyList?.filter((item) => item.operationType === value) + .map((item) => ({ + label: item.operationName, + value: item.operationName, + })) || [], + ); + } + return ( + <> + + + + + ); +}; + +export default DependencyInput; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx index 400feb001..6027ee6a1 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx @@ -1,269 +1,266 @@ -import { CloseOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; +import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; import { useTranslation } from '@arextest/arex-core'; -import { useAutoAnimate } from '@formkit/auto-animate/react'; import { useRequest } from 'ahooks'; -import { App, Button, Flex, Select, SelectProps, Space, Table } from 'antd'; -import React, { FC, useEffect, useMemo, useState } from 'react'; +import { App, Button, Pagination, Popconfirm } from 'antd'; +import { ColumnsType } from 'antd/es/table'; +import React, { FC, useRef, useState } from 'react'; -import { CONFIG_TARGET } from '@/panes/AppSetting/CompareConfig'; -import { ApplicationService, ComparisonService } from '@/services'; -import { IgnoreCategory } from '@/services/ComparisonService'; +import AddConfigModal, { + AddConfigModalProps, + AddConfigModalRef, +} from '@/panes/AppSetting/CompareConfigNew/AddConfigModal'; +import DependencyInput from '@/panes/AppSetting/CompareConfigNew/CategoryIgnore/DependencyInput'; +import ConfigInfoTable, { + CONFIG_INFO_TABLE_MODE, +} from '@/panes/AppSetting/CompareConfigNew/ConfigInfoTable'; +import { IgnoreCategoryInfo } from '@/panes/AppSetting/CompareConfigNew/type'; +import { ComparisonService } from '@/services'; +import { IgnoreCategory, PageQueryComparisonReq } from '@/services/ComparisonService'; export type CategoryIgnoreProps = { - appId?: string; - operationId?: string; - configTarget: CONFIG_TARGET; + appId: string; +} & Pick, 'operationList'>; + +const PAGE_SIZE = { + SIZE_10: 10, + SIZE_20: 20, + SIZE_30: 30, }; -enum Mode { - READ, - ADD, - DELETE, -} +const pageSizeOptions = Object.values(PAGE_SIZE); + const CategoryIgnore: FC = (props) => { const { message } = App.useApp(); const { t } = useTranslation(); - const [footerRef] = useAutoAnimate(); - - const [mode, setMode] = useState(Mode.READ); - - const [operationTypeValue, setOperationTypeValue] = useState(); - const [operationTypeSelectStatus, setOperationTypeSelectStatus] = - useState(); - - const [operationNameValue, setOperationNameValue] = useState(); - - useEffect(() => { - setOperationNameValue(undefined); - }, [props.operationId, props.configTarget]); - const [selectedRowKey, setSelectedRowKey] = useState(''); - - const [optionsGroupMap, setOptionsGroupMap] = useState>>(new Map()); + const [tableMode, setTableMode] = useState( + CONFIG_INFO_TABLE_MODE.DISPLAY, + ); - const [operationNameOptions, setOperationNameOptions] = useState([]); + const [selectedRows, setSelectedRows] = useState([]); - const [categoryTypeOptions, setCategoryOptions] = useState([]); - useRequest(ComparisonService.queryCategoryType, { - onSuccess(res) { - const options = res - .filter((item) => !item.entryPoint) - .map((item) => ({ - label: item.name, - value: item.name, - })); - setCategoryOptions(options); - }, + const [pagination, setPagination] = useState({ + current: 1, + pageSize: PAGE_SIZE.SIZE_10, }); - const reset = () => { - setMode(Mode.READ); - setSelectedRowKey(''); - setOperationNameValue(undefined); - setOperationTypeValue(undefined); - }; - - // 获取接口依赖并聚合 - const { data: interfacesList = [] } = useRequest( - () => ApplicationService.queryInterfacesList<'Interface'>({ appId: props.appId as string }), - { - ready: !!props.appId, - onSuccess(res) { - const groupMap = res.reduce((group, item) => { - if (!item.dependencyList) return group; + const [searchParams, setSearchParams] = useState< + Pick + >({}); - item.dependencyList?.forEach((dependency) => { - if (group.has(dependency.operationType)) { - group.get(dependency.operationType)?.add(dependency.operationName); - } else { - group.set(dependency.operationType, new Set([dependency.operationName])); - } - }); - return group; - }, new Map>()); + const addConfigModalRef = useRef(null); - setOptionsGroupMap(groupMap); - }, - }, - ); - - const { data: ignoreCategoryData = [], run: queryIgnoreCategory } = useRequest( + const { + data = { totalCount: 0, ignoreCategories: [] }, + loading, + run: queryIgnoreCategory, + } = useRequest( () => - ComparisonService.queryIgnoreCategory({ - appId: props.appId!, - operationId: props.configTarget === CONFIG_TARGET.GLOBAL ? undefined : props.operationId, + ComparisonService.queryAggregateIgnoreCategory({ + appId: props.appId, + pageSize: pagination.pageSize, + pageIndex: pagination.current, + ...searchParams, }), { - ready: !!( - props.appId && - (props.configTarget === CONFIG_TARGET.GLOBAL || // GLOBAL ready - // INTERFACE ready - (props.configTarget === CONFIG_TARGET.INTERFACE && props.operationId)) - ), - refreshDeps: [props.operationId, props.configTarget], - onSuccess(res) { - reset(); - }, + refreshDeps: [pagination, searchParams], }, ); - const { run: insertIgnoreCategory } = useRequest( - (ignoreCategoryDetail: IgnoreCategory) => - ComparisonService.insertIgnoreCategory({ - appId: props.appId!, - operationId: props.configTarget === CONFIG_TARGET.GLOBAL ? undefined : props.operationId, - ignoreCategoryDetail, - }), - { - manual: true, - ready: !!props.appId, - onSuccess(success) { - if (success) { - message.success(t('message.updateSuccess')); - queryIgnoreCategory(); - } else message.error(t('message.updateFailed')); - }, + const { run: insertIgnoreCategory } = useRequest(ComparisonService.insertIgnoreCategory, { + manual: true, + onSuccess(success) { + if (success) { + message.success(t('message.updateSuccess')); + queryIgnoreCategory(); + } else message.error(t('message.updateFailed')); }, - ); + }); const { run: deleteIgnoreCategory } = useRequest(ComparisonService.deleteIgnoreCategory, { manual: true, onSuccess(success) { if (success) { message.success(t('message.delSuccess')); + setTableMode(CONFIG_INFO_TABLE_MODE.DISPLAY); queryIgnoreCategory(); } else message.error(t('message.delFailed')); }, }); - const handleAdd = () => { - if (operationTypeValue) { - insertIgnoreCategory({ - operationType: operationTypeValue, - operationName: operationNameValue, - }); - } else { - setOperationTypeSelectStatus('error'); - setTimeout(() => setOperationTypeSelectStatus(undefined), 1000); + const columns: ColumnsType = [ + { + title: t('appSetting.categoryType', { ns: 'components' }), + dataIndex: ['ignoreCategoryDetail', 'operationType'], + }, + { + title: t('appSetting.operationName', { ns: 'components' }), + dataIndex: ['ignoreCategoryDetail', 'operationName'], + render: (text: string) => text || '*', + }, + ]; + + // const handleAdd = () => { + // if (operationTypeValue) { + // insertIgnoreCategory({ + // operationType: operationTypeValue, + // operationName: operationNameValue, + // }); + // } else { + // setOperationTypeSelectStatus('error'); + // setTimeout(() => setOperationTypeSelectStatus(undefined), 1000); + // } + // }; + + function handleSearch(search: Record) { + if (pagination.current !== 1) { + setPagination({ current: 1, pageSize: pagination.pageSize }); } - }; - const handleDelete = () => { - if (selectedRowKey) deleteIgnoreCategory({ id: selectedRowKey }); - else message.error(t('message.selectRowWarning')); - }; + const operationIds: PageQueryComparisonReq['operationIds'] = []; + const dependencyIds: PageQueryComparisonReq['dependencyIds'] = []; + const operationNameSearchLowerCase = search['operationName']?.toLowerCase() || ''; + const dependencyNameSearchLowerCase = search['dependencyName']?.toLowerCase() || ''; - const columns = useMemo( - () => [ - { - title: t('appSetting.categoryType', { ns: 'components' }), - dataIndex: ['ignoreCategoryDetail', 'operationType'], - }, - { - title: t('appSetting.operationName', { ns: 'components' }), - dataIndex: ['ignoreCategoryDetail', 'operationName'], - render: (text: string) => text || '*', - }, - ], - [t], - ); + if (operationNameSearchLowerCase && 'global'.includes(operationNameSearchLowerCase)) + operationIds.push(null); - const footerRender = () => ( -
- {mode === Mode.READ ? ( - - - - - ) : mode === Mode.ADD ? ( -
- - - - - + const handleDelete = () => { + const id = selectedRows[0]?.id; + if (id) { + deleteIgnoreCategory({ id }); + } else message.error(t('message.selectRowWarning')); + }; - + + + ) : ( + // tableMode === CONFIG_INFO_TABLE_MODE.EDIT + <> + - -
- ) : ( - - - - - )} + + + + + )} +
); return (
-
rowKey='id' - pagination={false} + requestSearch + loading={loading} columns={columns} - dataSource={ignoreCategoryData} + builtInColumns={{ + dependencyName: { + hidden: true, + }, + }} + dataSource={data.ignoreCategories} + footer={TableFooter} rowSelection={ - mode === Mode.DELETE + tableMode !== CONFIG_INFO_TABLE_MODE.DISPLAY ? { type: 'radio', - selectedRowKeys: [selectedRowKey], - onChange: (id) => setSelectedRowKey(id[0] as string), + onSelect: (record, selected, selectedRows) => { + setSelectedRows(selectedRows.filter(Boolean)); + }, } : undefined } - onRow={(record) => ({ - onClick: () => mode === Mode.DELETE && setSelectedRowKey(record.id), - })} - footer={footerRender} + onSearch={handleSearch} + /> + + + ref={addConfigModalRef} + appId={props.appId} + operationList={props.operationList} + builtInItems={{ + dependency: false, + }} + field={(fieldProps) => ( + + )} + onSubmit={handleSubmit} /> ); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx index 2e077f9c9..ef312503e 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx @@ -10,7 +10,7 @@ import { useImmer } from 'use-immer'; import { SearchHighLight } from '@/components'; -import { BaseConfigInfo } from './type'; +import { ComparisonConfigInfo } from './type'; export enum CONFIG_INFO_TABLE_MODE { DISPLAY, @@ -18,11 +18,12 @@ export enum CONFIG_INFO_TABLE_MODE { } export interface ConfigInfoTableProps extends TableProps { + builtInColumns?: Partial[number]>>; requestSearch?: boolean; onSearch?: (search: Record) => void; } -export default function ConfigInfoTable>( +export default function ConfigInfoTable( props: ConfigInfoTableProps, ) { const { t } = useTranslation(); @@ -128,17 +129,20 @@ export default function ConfigInfoTable>( 'operationName', {``}, ), + ...props.builtInColumns?.operationName, }, { title: t('components:appSetting.dependency'), dataIndex: 'dependencyName', ...getColumnSearchProps('dependencyName'), + ...props.builtInColumns?.dependencyName, }, ...(configColumns || []), { title: t('components:appSetting.expireOn'), dataIndex: 'expirationDate', render: (date: number) => dayjs(date).format('YYYY/MM/HH:mm'), + ...props.builtInColumns?.expirationDate, }, ]; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx index 93927de73..d0cad2526 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx @@ -53,7 +53,7 @@ export default function ListSort(props: ListSortProps) { Pick >({}); - const [selectedRows, setSelectedRows] = useState([]); + const [selectedRows, setSelectedRows] = useState([]); const { data = { totalCount: 0, listSorts: [] }, @@ -217,7 +217,7 @@ export default function ListSort(props: ListSortProps) { }); } - const handleAddListSort: AddConfigModalProps['onOk'] = (form) => + const handleAddListSort: AddConfigModalProps['onSubmit'] = (form) => form .validateFields() .then((res) => { @@ -264,10 +264,10 @@ export default function ListSort(props: ListSortProps) { rules={{ operationId: [{ required: true }], }} - field={(appId, operationId, dependency) => ( + field={({ appId, operationId, dependency }) => ( )} - onOk={handleAddListSort} + onSubmit={handleAddListSort} /> ); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx index 609e101ea..3a20d3716 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx @@ -55,12 +55,10 @@ export default function NodeIgnore(props: NodeIgnoreProps) { const [selectedRows, setSelectedRows] = useState([]); - // 定义表格的列配置 const columns: ColumnsType = [ { title: t('components:appSetting.path'), dataIndex: 'exclusionPath', - // ...getColumnSearchProps('exclusionPath'), render: (path: string[]) => '/ ' + path.join(' / '), }, ]; @@ -207,7 +205,7 @@ export default function NodeIgnore(props: NodeIgnoreProps) { ); - const handleAddIgnore: AddConfigModalProps['onOk'] = (form) => + const handleAddIgnore: AddConfigModalProps['onSubmit'] = (form) => form .validateFields() .then((res) => { @@ -249,7 +247,7 @@ export default function NodeIgnore(props: NodeIgnoreProps) { title={t('components:appSetting.nodesIgnore')} appId={props.appId} operationList={props.operationList} - field={(appId, operationId, dependency) => ( + field={({ appId, operationId, dependency }) => ( )} - onOk={handleAddIgnore} + onSubmit={handleAddIgnore} /> ); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx index 992f3ba49..d7d99fe9d 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx @@ -3,6 +3,7 @@ import { useRequest } from 'ahooks'; import { Tabs, TabsProps } from 'antd'; import React from 'react'; +import CategoryIgnore from '@/panes/AppSetting/CompareConfigNew/CategoryIgnore'; import { ApplicationService } from '@/services'; import ListSort from './ListSort'; @@ -39,7 +40,7 @@ export default function CompareConfigNew(props: CompareConfigNewProps) { { key: 'categoryIgnore', label: t('appSetting.categoryIgnore'), - children:
Category Node
, + children: , }, { key: 'nodeTransform', diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts deleted file mode 100644 index 081290fd7..000000000 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/mock.ts +++ /dev/null @@ -1,204 +0,0 @@ -export const mockIgnoreData = { - responseStatusType: { - statusCode: 200, - message: 'Success', - }, - body: { - pageIndex: 1, - pageNum: 20, - count: 100, - appId: 'app_12345', - exclusions: [ - { - exclusionPath: ['path', 'to', 'global', 'node1'], - operationId: '', - operationName: '', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: 'd814616009804e367c5cc7b', - }, - { - exclusionPath: ['path', 'to', 'global', 'node2'], - operationId: '', - operationName: '', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: 'dccb121cfea19a7571c96df', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node1'], - operationId: 'op_12345', - operationName: 'GetUserDetails', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: 'dd4d62cdbd0fbe58d921bd3', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node2'], - operationId: 'op_12346', - operationName: 'GetOrderDetails', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '16ac832f31084ba83e5ab1d', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node3'], - operationId: 'op_12347', - operationName: 'GetProductList', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: 'a28f08999e54fca403e70ba', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node4'], - operationId: 'op_12348', - operationName: 'GetCartItems', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '7e8b8f600865582a7cc5aaa', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node1'], - operationId: 'op_12345', - operationName: 'GetUserDetails', - dependencyId: 'dep_12345', - dependencyName: 'UserService', - expirationDate: 1735689600000, - expirationType: 1, - id: 'a27474fc45d60b629f8145b', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node2'], - operationId: 'op_12346', - operationName: 'GetOrderDetails', - dependencyId: 'dep_12346', - dependencyName: 'OrderService', - expirationDate: 1735689600000, - expirationType: 1, - id: 'e068f844dd278bad2a6754f', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node3'], - operationId: 'op_12347', - operationName: 'GetProductList', - dependencyId: 'dep_12347', - dependencyName: 'ProductService', - expirationDate: 1735689600000, - expirationType: 1, - id: 'a98ffa7e871ab960e72c353', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node4'], - operationId: 'op_12348', - operationName: 'GetCartItems', - dependencyId: 'dep_12348', - dependencyName: 'CartService', - expirationDate: 1735689600000, - expirationType: 1, - id: '5400632e72d31137f833483', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node5'], - operationId: 'op_12349', - operationName: 'GetUserPreferences', - dependencyId: 'dep_12349', - dependencyName: 'PreferencesService', - expirationDate: 1735689600000, - expirationType: 1, - id: '99010f9a0ca5892e5a24f47', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node6'], - operationId: 'op_12350', - operationName: 'GetWishlist', - dependencyId: 'dep_12350', - dependencyName: 'WishlistService', - expirationDate: 1735689600000, - expirationType: 1, - id: '3fa1bbf11331bf71d40ad0c', - }, - { - exclusionPath: ['path', 'to', 'dependency', 'node7'], - operationId: 'op_12351', - operationName: 'GetPaymentMethods', - dependencyId: 'dep_12351', - dependencyName: 'PaymentService', - expirationDate: 1735689600000, - expirationType: 1, - id: 'ab60cc79eea381ba0fb31ef', - }, - { - exclusionPath: ['path', 'to', 'global', 'node3'], - operationId: '', - operationName: '', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '25d470a719ce9f292bbf243', - }, - { - exclusionPath: ['path', 'to', 'global', 'node4'], - operationId: '', - operationName: '', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '7bd47d70630fb171881c63d', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node5'], - operationId: 'op_12352', - operationName: 'GetOrderHistory', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '546f9c949f817972174b623', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node6'], - operationId: 'op_12353', - operationName: 'GetNotifications', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: 'f96e417ac8dbeeeb63ea409', - }, - { - exclusionPath: ['path', 'to', 'interface', 'node7'], - operationId: 'op_12354', - operationName: 'GetMessages', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '11dd5719e994d7e327a7c65', - }, - { - exclusionPath: ['path', 'to', 'global', 'node5'], - operationId: '', - operationName: '', - dependencyId: '', - dependencyName: '', - expirationDate: 1735689600000, - expirationType: 1, - id: '11793a85ca10c62e6a4a133', - }, - ], - }, -}; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts index 2a1c3f0ca..dd0712073 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts @@ -1,4 +1,6 @@ -export type BaseConfigInfo = { +import { IgnoreCategory } from '@/services/ComparisonService'; + +export type ComparisonConfigInfo = { id: string; operationName: string; dependencyName: string; @@ -7,22 +9,19 @@ export type BaseConfigInfo = { expirationType: number; }; -export type ExclusionInfo = BaseConfigInfo<{ +export interface ExclusionInfo extends ComparisonConfigInfo { exclusionPath: string[]; -}>; +} -export type ListSortInfo = BaseConfigInfo<{ +export interface ListSortInfo extends ComparisonConfigInfo { listPath: string[]; keys: string[][]; -}>; - -type IgnoreCategory = { - operationType: string; - operationName?: string; -}; +} -export type IgnoreCategoryInfo = BaseConfigInfo<{ ignoreCategoryDetail: IgnoreCategory }>; +export interface IgnoreCategoryInfo extends ComparisonConfigInfo { + ignoreCategoryDetail: IgnoreCategory; +} -export type RootTransformInfo = BaseConfigInfo<{ +export interface RootTransformInfo extends ComparisonConfigInfo { transformMethodName: string; -}>; +} diff --git a/packages/arex/src/services/ComparisonService/index.ts b/packages/arex/src/services/ComparisonService/index.ts index b50afd9e1..bc5e71210 100644 --- a/packages/arex/src/services/ComparisonService/index.ts +++ b/packages/arex/src/services/ComparisonService/index.ts @@ -11,6 +11,7 @@ export * from './insertIgnoreCategory'; export * from './insertIgnoreNode'; export * from './insertSortNode'; export * from './insertTransformNode'; +export * from './queryAggregateIgnoreCategory'; export * from './queryAggregateIgnoreNode'; export * from './queryAggregateSortNode'; export * from './queryCategoryType'; diff --git a/packages/arex/src/services/ComparisonService/insertIgnoreCategory.ts b/packages/arex/src/services/ComparisonService/insertIgnoreCategory.ts index f394b98d8..8467c96e0 100644 --- a/packages/arex/src/services/ComparisonService/insertIgnoreCategory.ts +++ b/packages/arex/src/services/ComparisonService/insertIgnoreCategory.ts @@ -5,6 +5,7 @@ export type IgnoreCategory = { operationType: string; operationName?: string; }; + export interface InsertIgnoreCategoryReq extends QueryNodeReq<'Interface'> { ignoreCategoryDetail: IgnoreCategory; } diff --git a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts new file mode 100644 index 000000000..c2b2ce77d --- /dev/null +++ b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts @@ -0,0 +1,23 @@ +import { IgnoreCategoryInfo } from '@/panes/AppSetting/CompareConfigNew/type'; +import { PagingResponse } from '@/services/type'; +import { request } from '@/utils'; + +import { PageQueryComparisonReq } from './queryAggregateIgnoreNode'; + +export type PageQueryIgnoreCategoryComparisonRes = PagingResponse<{ + ignoreCategories: IgnoreCategoryInfo[]; +}>; + +export async function queryAggregateIgnoreCategory(params: PageQueryComparisonReq) { + const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; + const res = await request.post( + '/webApi/config/comparison/ignoreCategory/pageQueryComparisonConfig', + { + pageIndex, + pageSize, + needTotal, + ...restParams, + }, + ); + return res.body; +} From f384465d047797daf97acf91c13a7cf8facfea31 Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Mon, 11 Nov 2024 15:43:57 +0800 Subject: [PATCH 06/12] Revert "chore: update antd verison to 5.21.6" This reverts commit f3a92a4f3e70eae3dc8d9c17cb15bd2817148d0c. --- packages/arex-core/package.json | 4 +- packages/arex-request/package.json | 4 +- packages/arex/package.json | 2 +- pnpm-lock.yaml | 467 +++++++++++------------------ 4 files changed, 175 insertions(+), 302 deletions(-) diff --git a/packages/arex-core/package.json b/packages/arex-core/package.json index eb9a0d58c..55e7ff8ec 100644 --- a/packages/arex-core/package.json +++ b/packages/arex-core/package.json @@ -1,6 +1,6 @@ { "name": "@arextest/arex-core", - "version": "0.4.11", + "version": "0.4.10", "homepage": "https://github.com/arextest/arex", "main": "dist/arex-core.js", "module": "dist/arex-core.js", @@ -48,7 +48,7 @@ "peerDependencies": { "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", - "antd": "^5.21.6", + "antd": "^5.19.0", "react": "^18.2.0", "react-dom": "^18.2.0" } diff --git a/packages/arex-request/package.json b/packages/arex-request/package.json index 12b042155..4889aef37 100644 --- a/packages/arex-request/package.json +++ b/packages/arex-request/package.json @@ -1,6 +1,6 @@ { "name": "@arextest/arex-request", - "version": "0.3.15", + "version": "0.3.14", "type": "module", "main": "dist/arex-request.js", "module": "dist/arex-request.js", @@ -48,7 +48,7 @@ "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@monaco-editor/react": "^4.6.0", - "antd": "^5.21.6", + "antd": "^5.19.0", "i18next": "^22.4.11", "monaco-editor": "^0.39.0", "react": "^18.2.0", diff --git a/packages/arex/package.json b/packages/arex/package.json index 5708dd5ba..c9deb8896 100644 --- a/packages/arex/package.json +++ b/packages/arex/package.json @@ -29,7 +29,7 @@ "@sentry/react": "^7.113.0", "ahooks": "^3.7.5", "allotment": "^1.20.2", - "antd": "^5.21.6", + "antd": "^5.19.0", "antd-img-crop": "^4.12.2", "axios": "^1.3.6", "body-parser": "^1.20.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 326e2021f..e09ac75b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,11 +112,11 @@ importers: specifier: ^1.20.2 version: 1.20.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) antd: - specifier: ^5.21.6 - version: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.19.0 + version: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) antd-img-crop: specifier: ^4.12.2 - version: 4.21.0(antd@5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.21.0(antd@5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) axios: specifier: ^1.3.6 version: 1.6.8 @@ -266,8 +266,8 @@ importers: specifier: ^3.7.5 version: 3.7.10(react@18.2.0) antd: - specifier: ^5.21.6 - version: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.19.0 + version: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) dayjs: specifier: ^1.11.7 version: 1.11.10 @@ -427,8 +427,8 @@ importers: specifier: ^1.20.2 version: 1.20.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) antd: - specifier: ^5.21.6 - version: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.19.0 + version: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) arex-request-runtime: specifier: ^1.0.2 version: 1.0.2 @@ -543,28 +543,18 @@ packages: '@ant-design/colors@7.1.0': resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} - '@ant-design/cssinjs-utils@1.1.1': - resolution: {integrity: sha512-2HAiyGGGnM0es40SxdszeQAU5iWp41wBIInq+ONTCKjlSKOrzQfnw4JDtB8IBmqE6tQaEKwmzTP2LGdt5DSwYQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - '@ant-design/cssinjs@1.18.5': resolution: {integrity: sha512-Ub4n3d+MAX/qtE5S9PM8iOn5ocU7GUAIC4Adc2X8UCMXnsRRfpJBHsBdtQ1qoAuaQ7lU2M1BTCuJ+fkv4fOWiw==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - '@ant-design/cssinjs@1.21.1': - resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==} + '@ant-design/cssinjs@1.21.0': + resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - '@ant-design/fast-color@2.0.6': - resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} - engines: {node: '>=8.x'} - '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} @@ -575,8 +565,8 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' - '@ant-design/icons@5.5.1': - resolution: {integrity: sha512-0UrM02MA2iDIgvLatWrj6YTCYe0F/cwXvVE0E2SqGrL7PZireQwgEKTKBisWpZyal5eXZLvuM98kju6YtYne8w==} + '@ant-design/icons@5.4.0': + resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==} engines: {node: '>=8'} peerDependencies: react: '>=16.0.0' @@ -708,10 +698,6 @@ packages: resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} @@ -1395,12 +1381,6 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/color-picker@2.0.1': - resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - '@rc-component/context@1.4.0': resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} peerDependencies: @@ -1439,8 +1419,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/tour@1.15.1': - resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==} + '@rc-component/tour@1.15.0': + resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -1460,13 +1440,6 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/trigger@2.2.3': - resolution: {integrity: sha512-X1oFIpKoXAMXNDYCviOmTfuNuYxE4h5laBsyCqVAVMjNHxoF3/uiyA7XdegK1XbCvBbCZ6P6byWrEoDRpKL8+A==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - '@remix-run/router@1.15.3': resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} engines: {node: '>=14.0.0'} @@ -2181,8 +2154,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - antd@5.21.6: - resolution: {integrity: sha512-EviOde/VEu+OsIKH5t6YXTMmmNeg9R85m0W5zXAo+Np8Latg9q10691JvAqOTMpnrRmbdeKUQL1Krp69Bzbe/g==} + antd@5.19.3: + resolution: {integrity: sha512-rhGI6yyZ4dA2MWl9bfO0MZjtNwWdzITpp3u7pKLiQpTjJYFlpF5wDFgGaG1or3sqyBihvqcO/OF1hSggmWczbQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4651,8 +4624,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-cascader@3.28.2: - resolution: {integrity: sha512-8f+JgM83iLTvjgdkgU7GfI4qY8icXOBP0cGZjOdx2iJAkEe8ucobxDQAVE69UD/c3ehCxZlcgEHeD5hFmypbUw==} + rc-cascader@3.27.0: + resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4675,20 +4648,14 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-collapse@3.8.0: - resolution: {integrity: sha512-YVBkssrKPBG09TGfcWWGj8zJBYD9G3XuTy89t5iUmSXrIXEAnO1M+qjUxRW6b4Qi0+wNWG6MHJF/+US+nmIlzA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-dialog@9.4.0: resolution: {integrity: sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-dialog@9.6.0: - resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==} + rc-dialog@9.5.2: + resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4718,21 +4685,21 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-field-form@2.4.0: - resolution: {integrity: sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==} + rc-field-form@2.2.1: + resolution: {integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-image@7.11.0: - resolution: {integrity: sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==} + rc-image@7.6.0: + resolution: {integrity: sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-image@7.6.0: - resolution: {integrity: sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==} + rc-image@7.9.0: + resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4743,8 +4710,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-input-number@9.2.0: - resolution: {integrity: sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==} + rc-input-number@9.1.0: + resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4755,8 +4722,8 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-input@1.6.3: - resolution: {integrity: sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==} + rc-input@1.5.1: + resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -4767,8 +4734,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-mentions@2.16.1: - resolution: {integrity: sha512-GnhSTGP9Mtv6pqFFGQze44LlrtWOjHNrUUAcsdo9DnNAhN4pwVPEWy4z+2jpjkiGlJ3VoXdvMHcNDQdfI9fEaw==} + rc-mentions@2.14.0: + resolution: {integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4779,8 +4746,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-menu@9.15.1: - resolution: {integrity: sha512-UKporqU6LPfHnpPmtP6hdEK4iO5Q+b7BRv/uRpxdIyDGplZy9jwUjsnpev5bs3PQKB0H0n34WAPDfjAfn3kAPA==} + rc-menu@9.14.1: + resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4797,12 +4764,6 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-motion@2.9.3: - resolution: {integrity: sha512-rkW47ABVkic7WEB0EKJqzySpvDqwl60/tdkY7hWP7dYnh5pm0SzJpo54oW3TDUGXV5wfxXFmMkxrzRRbotQ0+w==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-notification@5.3.0: resolution: {integrity: sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==} engines: {node: '>=8.x'} @@ -4810,8 +4771,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-notification@5.6.2: - resolution: {integrity: sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==} + rc-notification@5.6.0: + resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4829,8 +4790,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-pagination@4.3.0: - resolution: {integrity: sha512-UubEWA0ShnroQ1tDa291Fzw6kj0iOeF26IsUObxYTpimgj4/qPCWVFl18RLZE+0Up1IZg0IK4pMn6nB3mjvB7g==} + rc-pagination@4.2.0: + resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4855,8 +4816,8 @@ packages: moment: optional: true - rc-picker@4.6.15: - resolution: {integrity: sha512-OWZ1yrMie+KN2uEUfYCfS4b2Vu6RC1FWwNI0s+qypsc3wRt7g+peuZKVIzXCTaJwyyZruo80+akPg2+GmyiJjw==} + rc-picker@4.6.9: + resolution: {integrity: sha512-kwQq5xDNJ1VcX7pauLlVBiuQorpZGUwA/YczVJTO1e33YsTyDuVjaQkYAiAupXbEPUBCU3doGZo0J25HGq2ZOQ==} engines: {node: '>=8.x'} peerDependencies: date-fns: '>= 2.x' @@ -4913,12 +4874,6 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-segmented@2.5.0: - resolution: {integrity: sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - rc-select@14.13.0: resolution: {integrity: sha512-ew34FsaqHokK4dxVrcIxSYrgWJ2XJYlkk32eiOIiEo3GkHUExdCzmozMYaUc2P67c5QJRUvvY0uqCs3QG67h5A==} engines: {node: '>=8.x'} @@ -4926,8 +4881,8 @@ packages: react: '*' react-dom: '*' - rc-select@14.15.2: - resolution: {integrity: sha512-oNoXlaFmpqXYcQDzcPVLrEqS2J9c+/+oJuGrlXeVVX/gVgrbHa5YcyiRUXRydFjyuA7GP3elRuLF7Y3Tfwltlw==} + rc-select@14.15.1: + resolution: {integrity: sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==} engines: {node: '>=8.x'} peerDependencies: react: '*' @@ -4940,8 +4895,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-slider@11.1.7: - resolution: {integrity: sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==} + rc-slider@10.6.2: + resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4967,8 +4922,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-table@7.47.5: - resolution: {integrity: sha512-fzq+V9j/atbPIcvs3emuclaEoXulwQpIiJA6/7ey52j8+9cJ4P8DGmp4YzfUVDrb3qhgedcVeD6eRgUrokwVEQ==} + rc-table@7.45.7: + resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4981,8 +4936,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tabs@15.3.0: - resolution: {integrity: sha512-lzE18r+zppT/jZWOAWS6ntdkDUKHOLJzqMi5UAij1LeKwOaQaupupAoI9Srn73GRzVpmGznkECMRrzkRusC40A==} + rc-tabs@15.1.1: + resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -4994,8 +4949,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-textarea@1.8.2: - resolution: {integrity: sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==} + rc-textarea@1.7.0: + resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -5006,20 +4961,14 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tooltip@6.2.1: - resolution: {integrity: sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-tree-select@5.19.0: resolution: {integrity: sha512-f4l5EsmSGF3ggj76YTzKNPY9SnXfFaer7ZccTSGb3urUf54L+cCqyT+UsPr+S5TAr8mZSxJ7g3CgkCe+cVQ6sw==} peerDependencies: react: '*' react-dom: '*' - rc-tree-select@5.23.0: - resolution: {integrity: sha512-aQGi2tFSRw1WbXv0UVXPzHm09E0cSvUVZMLxQtMv3rnZZpNmdRXWrnd9QkLNlVH31F+X5rgghmdSFF3yZW0N9A==} + rc-tree-select@5.22.1: + resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==} peerDependencies: react: '*' react-dom: '*' @@ -5031,8 +4980,8 @@ packages: react: '*' react-dom: '*' - rc-tree@5.9.0: - resolution: {integrity: sha512-CPrgOvm9d/9E+izTONKSngNzQdIEjMox2PBufWjS1wf7vxtvmCWzK1SlpHbRY6IaBfJIeZ+88RkcIevf729cRg==} + rc-tree@5.8.8: + resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} engines: {node: '>=10.x'} peerDependencies: react: '*' @@ -5044,8 +4993,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-upload@4.8.1: - resolution: {integrity: sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==} + rc-upload@4.6.0: + resolution: {integrity: sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -5588,9 +5537,6 @@ packages: stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} - stylis@4.3.4: - resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} - sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} @@ -6280,14 +6226,6 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/cssinjs-utils@1.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@babel/runtime': 7.26.0 - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@ant-design/cssinjs@1.18.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 @@ -6300,9 +6238,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) stylis: 4.3.1 - '@ant-design/cssinjs@1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@ant-design/cssinjs@1.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 @@ -6310,11 +6248,7 @@ snapshots: rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - stylis: 4.3.4 - - '@ant-design/fast-color@2.0.6': - dependencies: - '@babel/runtime': 7.26.0 + stylis: 4.3.1 '@ant-design/icons-svg@4.4.2': {} @@ -6328,11 +6262,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@ant-design/icons@5.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@ant-design/icons@5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@ant-design/colors': 7.1.0 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -6349,7 +6283,7 @@ snapshots: '@ant-design/react-slick@1.1.2(react@18.2.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 json2mq: 0.2.0 react: 18.2.0 @@ -6531,10 +6465,6 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 @@ -7259,7 +7189,7 @@ snapshots: '@rc-component/async-validator@5.0.4': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/color-picker@1.5.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -7270,15 +7200,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@rc-component/color-picker@2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@ant-design/fast-color': 2.0.6 - '@babel/runtime': 7.26.0 - classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@rc-component/context@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 @@ -7308,7 +7229,7 @@ snapshots: '@rc-component/qrcode@1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -7324,11 +7245,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@rc-component/tour@1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@rc-component/tour@1.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -7356,17 +7277,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@rc-component/trigger@2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.26.0 - '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@remix-run/router@1.15.3': {} '@replit/codemirror-indentation-markers@6.5.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)': @@ -8136,9 +8046,9 @@ snapshots: ansi-styles@6.2.1: {} - antd-img-crop@4.21.0(antd@5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + antd-img-crop@4.21.0(antd@5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - antd: 5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + antd: 5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) compare-versions: 6.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -8202,54 +8112,53 @@ snapshots: - luxon - moment - antd@5.21.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + antd@5.19.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@ant-design/cssinjs-utils': 1.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@ant-design/icons': 5.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@ant-design/icons': 5.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@ant-design/react-slick': 1.1.2(react@18.2.0) - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@ctrl/tinycolor': 3.6.1 - '@rc-component/color-picker': 2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/color-picker': 1.5.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@rc-component/qrcode': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@rc-component/tour': 1.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/tour': 1.15.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.12 - rc-cascader: 3.28.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-cascader: 3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-checkbox: 3.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-collapse: 3.8.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-collapse: 3.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-drawer: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-dropdown: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-field-form: 2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-image: 7.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-input-number: 9.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-mentions: 2.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-menu: 9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-notification: 5.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-pagination: 4.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-picker: 4.6.15(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-field-form: 2.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-image: 7.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input-number: 9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-mentions: 2.14.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-notification: 5.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-pagination: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-picker: 4.6.9(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-progress: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-rate: 2.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-segmented: 2.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-slider: 11.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-segmented: 2.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-slider: 10.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-steps: 6.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-switch: 4.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-table: 7.47.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tabs: 15.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-textarea: 1.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tooltip: 6.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree-select: 5.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-upload: 4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-table: 7.45.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tabs: 15.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-textarea: 1.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tooltip: 6.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree-select: 5.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-upload: 4.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11103,13 +11012,13 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-cascader@3.28.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-cascader@3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 array-tree-filter: 2.1.0 classnames: 2.5.1 - rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11124,7 +11033,7 @@ snapshots: rc-checkbox@3.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11139,15 +11048,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-collapse@3.8.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@babel/runtime': 7.26.0 - classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rc-dialog@9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 @@ -11158,12 +11058,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-dialog@9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-dialog@9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11180,10 +11080,10 @@ snapshots: rc-drawer@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11205,33 +11105,33 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-field-form@2.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-field-form@2.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/async-validator': 5.0.4 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-image@7.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-image@7.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.1 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-dialog: 9.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-image@7.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-image@7.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.8 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@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))(react@18.2.0) - rc-motion: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-dialog: 9.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11245,12 +11145,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-input-number@9.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-input-number@9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11263,9 +11163,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-input@1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-input@1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11283,14 +11183,14 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-mentions@2.16.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-mentions@2.14.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.24.8 + '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-menu: 9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-textarea: 1.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-textarea: 1.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11306,12 +11206,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-menu@9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-menu@9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.24.8 + '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11333,14 +11233,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-motion@2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@babel/runtime': 7.26.0 - classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rc-notification@5.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 @@ -11350,11 +11242,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-notification@5.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-notification@5.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11376,9 +11268,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-pagination@4.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-pagination@4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11397,10 +11289,10 @@ snapshots: optionalDependencies: dayjs: 1.11.12 - rc-picker@4.6.15(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-picker@4.6.9(dayjs@1.11.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.24.8 + '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -11420,7 +11312,7 @@ snapshots: rc-progress@4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11436,7 +11328,7 @@ snapshots: rc-rate@2.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11460,15 +11352,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-segmented@2.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@babel/runtime': 7.26.0 - classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rc-select@14.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 @@ -11481,12 +11364,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-select@14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-select@14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.24.8 + '@rc-component/trigger': 2.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -11501,9 +11384,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-slider@11.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-slider@10.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11536,9 +11419,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-table@7.47.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-table@7.45.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 '@rc-component/context': 1.4.0(react-dom@18.2.0(react@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))(react@18.2.0) @@ -11559,13 +11442,13 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tabs@15.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-tabs@15.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-dropdown: 4.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-menu: 9.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-menu: 9.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11581,11 +11464,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-textarea@1.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-textarea@1.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-input: 1.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11599,14 +11482,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tooltip@6.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@babel/runtime': 7.26.0 - '@rc-component/trigger': 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - classnames: 2.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rc-tree-select@5.19.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.1 @@ -11617,12 +11492,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tree-select@5.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-tree-select@5.22.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 - rc-select: 14.15.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - rc-tree: 5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-select: 14.15.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-tree: 5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11637,11 +11512,11 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-tree@5.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-tree@5.8.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rc-motion: 2.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-virtual-list: 3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11655,9 +11530,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rc-upload@4.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + rc-upload@4.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 @@ -11688,7 +11563,7 @@ snapshots: rc-virtual-list@3.14.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.24.8 classnames: 2.5.1 rc-resize-observer: 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -12293,8 +12168,6 @@ snapshots: stylis@4.3.1: {} - stylis@4.3.4: {} - sumchecker@3.0.1: dependencies: debug: 4.3.4 From 3ac0e08cb0e8e6b57f06ded35733f1fae6ef3b3a Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Mon, 11 Nov 2024 20:32:41 +0800 Subject: [PATCH 07/12] fix: config info table colunms fallback --- packages/arex/src/i18n/locales/cn/common.json | 1 + packages/arex/src/i18n/locales/en/common.json | 1 + .../CompareConfigNew/CategoryIgnore/index.tsx | 12 - .../CompareConfigNew/ConfigInfoTable.tsx | 35 ++- .../CompareConfigNew/ListSort/index.tsx | 60 ++-- .../CompareConfigNew/NodeIgnore/index.tsx | 25 +- .../NodesTransform/RootTransformInput.tsx | 41 +++ .../CompareConfigNew/NodesTransform/index.tsx | 258 ++++++++++++++++++ .../AppSetting/CompareConfigNew/index.tsx | 3 +- .../panes/AppSetting/CompareConfigNew/type.ts | 7 +- .../src/services/ComparisonService/index.ts | 1 + .../queryAggregateRootTransform.ts | 23 ++ .../updateTransformRootNode.ts | 4 +- 13 files changed, 413 insertions(+), 58 deletions(-) create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/RootTransformInput.tsx create mode 100644 packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx create mode 100644 packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts diff --git a/packages/arex/src/i18n/locales/cn/common.json b/packages/arex/src/i18n/locales/cn/common.json index aeebecedb..0970fb822 100644 --- a/packages/arex/src/i18n/locales/cn/common.json +++ b/packages/arex/src/i18n/locales/cn/common.json @@ -65,6 +65,7 @@ "modifiedTime": "修改时间", "monday": "周一", "more": "更多...", + "neverExpired": "永不过期", "new": "新", "no": "否", "noSave": "不保存", diff --git a/packages/arex/src/i18n/locales/en/common.json b/packages/arex/src/i18n/locales/en/common.json index e39aab209..6ed4172c1 100644 --- a/packages/arex/src/i18n/locales/en/common.json +++ b/packages/arex/src/i18n/locales/en/common.json @@ -68,6 +68,7 @@ "modifiedTime": "Modified Time", "monday": "Mon.", "more": "More...", + "neverExpired": "Never Expired", "new": "New", "no": "No", "noSave": "Don't save", diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx index 6027ee6a1..6a268a1af 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/CategoryIgnore/index.tsx @@ -100,18 +100,6 @@ const CategoryIgnore: FC = (props) => { }, ]; - // const handleAdd = () => { - // if (operationTypeValue) { - // insertIgnoreCategory({ - // operationType: operationTypeValue, - // operationName: operationNameValue, - // }); - // } else { - // setOperationTypeSelectStatus('error'); - // setTimeout(() => setOperationTypeSelectStatus(undefined), 1000); - // } - // }; - function handleSearch(search: Record) { if (pagination.current !== 1) { setPagination({ current: 1, pageSize: pagination.pageSize }); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx index ef312503e..f5e18e8f4 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx @@ -10,7 +10,7 @@ import { useImmer } from 'use-immer'; import { SearchHighLight } from '@/components'; -import { ComparisonConfigInfo } from './type'; +import { ComparisonConfigInfo, ExpirationType } from './type'; export enum CONFIG_INFO_TABLE_MODE { DISPLAY, @@ -53,7 +53,10 @@ export default function ConfigInfoTable( }; // 获取列搜索配置 - const getColumnSearchProps = (dataIndex: keyof T, searchFallback?: ReactNode): ColumnType => ({ + const getColumnSearchProps = ( + dataIndex: keyof T, + fallback?: ReactNode | ((record: T) => ReactNode), + ): ColumnType => ({ filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
( onFilterDropdownOpenChange: (open: boolean) => { open && setTimeout(() => searchInput.current?.select(), 100); }, - render: (text: string | null) => { + render: (text: string | null, record) => { const columnsSearchValue = search?.[dataIndex as string]; if ( !!columnsSearchValue && @@ -115,7 +118,12 @@ export default function ConfigInfoTable( ) { return ; } else { - return text || searchFallback; + return ( + text || + (typeof fallback === 'function' + ? (fallback as (record: T) => ReactNode)?.(record) + : fallback) + ); } }, }); @@ -127,21 +135,34 @@ export default function ConfigInfoTable( dataIndex: 'operationName', ...getColumnSearchProps( 'operationName', - {``}, + + Global + , ), ...props.builtInColumns?.operationName, }, { title: t('components:appSetting.dependency'), dataIndex: 'dependencyName', - ...getColumnSearchProps('dependencyName'), + ...getColumnSearchProps('dependencyName', (record) => ( + + {record.operationName ? 'Entry' : 'Global'} + + )), ...props.builtInColumns?.dependencyName, }, ...(configColumns || []), { title: t('components:appSetting.expireOn'), dataIndex: 'expirationDate', - render: (date: number) => dayjs(date).format('YYYY/MM/HH:mm'), + render: (date: number, record) => + record.expirationType === ExpirationType.PINNED_NEVER_EXPIRED ? ( + + {t('common:neverExpired')} + + ) : ( + dayjs(date).format('YYYY/MM/HH:mm') + ), ...props.builtInColumns?.expirationDate, }, ]; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx index d0cad2526..8c4aec252 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx @@ -1,7 +1,7 @@ import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; -import { useTranslation } from '@arextest/arex-core'; +import { css, useTranslation } from '@arextest/arex-core'; import { useRequest } from 'ahooks'; -import { App, Button, Pagination, Popconfirm, Tag } from 'antd'; +import { App, Button, Pagination, Popconfirm, Select, Tag, Tooltip } from 'antd'; import { ColumnsType } from 'antd/es/table'; import React, { useRef, useState } from 'react'; @@ -14,7 +14,7 @@ import AddConfigModal, { parseDependency, } from '../AddConfigModal'; import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE } from '../ConfigInfoTable'; -import { ExclusionInfo, ListSortInfo } from '../type'; +import { ListSortInfo } from '../type'; import SortPathKeyInput from './SortPathKeyInput'; type ListSortPrivate = { @@ -108,13 +108,36 @@ export default function ListSort(props: ListSortProps) { { title: t('components:appSetting.path'), dataIndex: 'listPath', - render: (path: string[]) => '/ ' + path.join(' / '), + render: (path: string[]) => '/' + path.join('/'), }, { title: t('components:appSetting.keys'), dataIndex: 'keys', - render: (keys: string[][]) => - keys.map((key, index) => {'/ ' + key.join(' / ')}), + render: (keys: string[][]) => ( + + ); +}; + +export default RootTransformInput; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx new file mode 100644 index 000000000..15257056d --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx @@ -0,0 +1,258 @@ +import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; +import { useTranslation } from '@arextest/arex-core'; +import { useRequest } from 'ahooks'; +import { App, Button, Form, Pagination, Popconfirm } from 'antd'; +import { ColumnsType } from 'antd/es/table'; +import React, { useRef, useState } from 'react'; + +import AddConfigModal, { + AddConfigModalProps, + AddConfigModalRef, + parseDependency, +} from '@/panes/AppSetting/CompareConfigNew/AddConfigModal'; +import ConfigInfoTable, { + CONFIG_INFO_TABLE_MODE, +} from '@/panes/AppSetting/CompareConfigNew/ConfigInfoTable'; +import RootTransformInput from '@/panes/AppSetting/CompareConfigNew/NodesTransform/RootTransformInput'; +import { RootTransformInfo } from '@/panes/AppSetting/CompareConfigNew/type'; +import { ComparisonService } from '@/services'; +import { PageQueryComparisonReq, UpdateTransformRootNodeReq } from '@/services/ComparisonService'; + +const PAGE_SIZE = { + SIZE_10: 10, + SIZE_20: 20, + SIZE_30: 30, +}; + +const pageSizeOptions = Object.values(PAGE_SIZE); + +export type NodeTransformProps = { + appId: string; +} & Pick, 'operationList'>; + +const NodesTransform = (props: NodeTransformProps) => { + const { t } = useTranslation(); + const { message } = App.useApp(); + + const addConfigModalRef = useRef(null); + + const [tableMode, setTableMode] = useState( + CONFIG_INFO_TABLE_MODE.DISPLAY, + ); + + const [selectedRows, setSelectedRows] = useState([]); + + const [pagination, setPagination] = useState({ + current: 1, + pageSize: PAGE_SIZE.SIZE_10, + }); + + const [searchParams, setSearchParams] = useState< + Pick + >({}); + + const { + data = { rootTransformInfos: [], totalCount: 0 }, + loading, + run: queryAggregateRootTransform, + } = useRequest( + () => + ComparisonService.queryAggregateRootTransform({ + appId: props.appId, + pageSize: pagination.pageSize, + pageIndex: pagination.current, + ...searchParams, + }), + { + refreshDeps: [pagination, searchParams], + }, + ); + + const { run: updateTransformNode } = useRequest(ComparisonService.updateTransformRootNode, { + manual: true, + onSuccess: (success) => { + if (success) { + queryAggregateRootTransform(); + message.success(t('common:message.updateSuccess')); + } else message.error(t('common:message.updateFailed')); + }, + }); + + const { run: deleteTransformRootNode } = useRequest(ComparisonService.deleteTransformRootNode, { + manual: true, + onSuccess: (success) => { + if (success) { + setTableMode(CONFIG_INFO_TABLE_MODE.DISPLAY); + queryAggregateRootTransform(); + message.success(t('common:message.updateSuccess')); + } else message.error(t('common:message.updateFailed')); + }, + }); + + const columns: ColumnsType = [ + { + dataIndex: 'transformMethodName', + title: t('components:appSetting.transformMethodName'), + }, + ]; + + const TableFooter = () => ( +
+
+ {data.totalCount > pagination.pageSize && ( + { + setPagination({ + current: page, + pageSize, + }); + }} + /> + )} +
+ +
+ {tableMode === CONFIG_INFO_TABLE_MODE.DISPLAY ? ( + <> + + + + ) : ( + // tableMode === CONFIG_INFO_TABLE_MODE.EDIT + <> + + + + + + )} +
+
+ ); + + const handleSubmit: AddConfigModalProps['onSubmit'] = (form) => + form.validateFields().then(({ dependency, ...rest }) => { + const params = { + ...parseDependency(dependency), + ...rest, + } as UpdateTransformRootNodeReq; + updateTransformNode(params); + }); + + function handleSearch(search: Record) { + if (pagination.current !== 1) { + setPagination({ current: 1, pageSize: pagination.pageSize }); + } + + const operationIds: PageQueryComparisonReq['operationIds'] = []; + const dependencyIds: PageQueryComparisonReq['dependencyIds'] = []; + const operationNameSearchLowerCase = search['operationName']?.toLowerCase() || ''; + const dependencyNameSearchLowerCase = search['dependencyName']?.toLowerCase() || ''; + + // if (operationNameSearchLowerCase && 'global'.includes(operationNameSearchLowerCase)) + // operationIds.push(null); + + props.operationList?.forEach((operation) => { + if ( + operationNameSearchLowerCase && + operation.operationName.toLowerCase().includes(operationNameSearchLowerCase) + ) + operationIds.push(operation.id); + operation.dependencyList?.forEach((dependency) => { + if ( + dependencyNameSearchLowerCase && + dependency.operationName?.toLowerCase()?.includes(dependencyNameSearchLowerCase) + ) + dependencyIds.push(dependency.dependencyId); + }); + }); + + setSearchParams({ + operationIds, + dependencyIds, + }); + } + + function handleDelete() { + const id = selectedRows[0]?.id; + if (id) deleteTransformRootNode(id); + } + + return ( + <> + + rowKey='id' + requestSearch + loading={loading} + columns={columns} + dataSource={data.rootTransformInfos} + footer={TableFooter} + rowSelection={ + tableMode !== CONFIG_INFO_TABLE_MODE.DISPLAY + ? { + type: 'radio', + onSelect: (record, selected, selectedRows) => { + setSelectedRows(selectedRows.filter(Boolean)); + }, + } + : undefined + } + onSearch={handleSearch} + /> + + + ref={addConfigModalRef} + title={t('components:appSetting.methodName')} // TODO + appId={props.appId} + operationList={props.operationList} + rules={{ + operationId: [ + { + required: true, + }, + ], + }} + field={(fieldProps) => ( + + + + )} + onSubmit={handleSubmit} + /> + + ); +}; + +export default NodesTransform; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx index d7d99fe9d..9d2a56a5b 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/index.tsx @@ -4,6 +4,7 @@ import { Tabs, TabsProps } from 'antd'; import React from 'react'; import CategoryIgnore from '@/panes/AppSetting/CompareConfigNew/CategoryIgnore'; +import NodesTransform from '@/panes/AppSetting/CompareConfigNew/NodesTransform'; import { ApplicationService } from '@/services'; import ListSort from './ListSort'; @@ -45,7 +46,7 @@ export default function CompareConfigNew(props: CompareConfigNewProps) { { key: 'nodeTransform', label: t('appSetting.nodesTransform'), - children:
Node Transform
, + children: , }, ]; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts index dd0712073..bf888091f 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts @@ -1,12 +1,17 @@ import { IgnoreCategory } from '@/services/ComparisonService'; +export enum ExpirationType { + PINNED_NEVER_EXPIRED, + SOFT_TIME_EXPIRED, +} + export type ComparisonConfigInfo = { id: string; operationName: string; dependencyName: string; dependencyType: string; expirationDate: number; - expirationType: number; + expirationType: ExpirationType; }; export interface ExclusionInfo extends ComparisonConfigInfo { diff --git a/packages/arex/src/services/ComparisonService/index.ts b/packages/arex/src/services/ComparisonService/index.ts index bc5e71210..55ada8889 100644 --- a/packages/arex/src/services/ComparisonService/index.ts +++ b/packages/arex/src/services/ComparisonService/index.ts @@ -13,6 +13,7 @@ export * from './insertSortNode'; export * from './insertTransformNode'; export * from './queryAggregateIgnoreCategory'; export * from './queryAggregateIgnoreNode'; +export * from './queryAggregateRootTransform'; export * from './queryAggregateSortNode'; export * from './queryCategoryType'; export * from './queryEncryptionNode'; diff --git a/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts b/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts new file mode 100644 index 000000000..d375dcaa9 --- /dev/null +++ b/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts @@ -0,0 +1,23 @@ +import { RootTransformInfo } from '@/panes/AppSetting/CompareConfigNew/type'; +import { PagingResponse } from '@/services/type'; +import { request } from '@/utils'; + +import { PageQueryComparisonReq } from './queryAggregateIgnoreNode'; + +export type PageQueryRootTransformComparisonRes = PagingResponse<{ + rootTransformInfos: RootTransformInfo[]; +}>; + +export async function queryAggregateRootTransform(params: PageQueryComparisonReq) { + const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; + const res = await request.post( + '/webApi/config/comparison/rootTransform/pageQueryComparisonConfig', + { + pageIndex, + pageSize, + needTotal, + ...restParams, + }, + ); + return res.body; +} diff --git a/packages/arex/src/services/ComparisonService/transformRootNode/updateTransformRootNode.ts b/packages/arex/src/services/ComparisonService/transformRootNode/updateTransformRootNode.ts index dc6d1387b..b1f0bc126 100644 --- a/packages/arex/src/services/ComparisonService/transformRootNode/updateTransformRootNode.ts +++ b/packages/arex/src/services/ComparisonService/transformRootNode/updateTransformRootNode.ts @@ -3,7 +3,9 @@ import { request } from '@/utils'; import { TransformRootNodeParams } from './queryTransformRootNode'; -interface UpdateTransformRootNodeReq extends QueryNodeReq<'Global'>, TransformRootNodeParams {} +export interface UpdateTransformRootNodeReq + extends QueryNodeReq<'Global'>, + TransformRootNodeParams {} export async function updateTransformRootNode(params: UpdateTransformRootNodeReq) { const res = await request.post( From 29e6352f41c90c8012f68f3cddd4478f7bda9ed5 Mon Sep 17 00:00:00 2001 From: Jesse Rodriguez Date: Tue, 12 Nov 2024 14:13:32 +0800 Subject: [PATCH 08/12] fix: table colunms fallback --- packages/arex/src/components/MenuSelect.tsx | 3 +++ packages/arex/src/menus/Replay.tsx | 2 +- .../AppSetting/CompareConfigNew/ConfigInfoTable.tsx | 12 +++++++----- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/arex/src/components/MenuSelect.tsx b/packages/arex/src/components/MenuSelect.tsx index 3165aa68e..303ecf365 100644 --- a/packages/arex/src/components/MenuSelect.tsx +++ b/packages/arex/src/components/MenuSelect.tsx @@ -35,6 +35,9 @@ const MenuList = styled(Menu, { }>` border: none !important; background: transparent !important; + .ant-menu-title-content { + width: 100%; + } .ant-menu-item { color: ${(props) => props.theme.colorTextSecondary}!important; padding-left: 8px; diff --git a/packages/arex/src/menus/Replay.tsx b/packages/arex/src/menus/Replay.tsx index 1e8859729..8c43cceb1 100644 --- a/packages/arex/src/menus/Replay.tsx +++ b/packages/arex/src/menus/Replay.tsx @@ -70,8 +70,8 @@ const MenuItem = styled((props: MenuItemProps) => { ); })` + width: 100%; .menu-item-heart { - padding-right: 8px; .menu-item-heart-outlined { opacity: 0; transition: opacity ease 0.3s; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx index f5e18e8f4..cca059c21 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ConfigInfoTable.tsx @@ -58,17 +58,19 @@ export default function ConfigInfoTable( fallback?: ReactNode | ((record: T) => ReactNode), ): ColumnType => ({ filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( -
+
setSelectedKeys(e.target.value ? [e.target.value] : [])} onPressEnter={() => handleSearch(selectedKeys as string[], confirm, dataIndex.toString())} - style={{ marginBottom: 8, display: 'block' }} + style={{ width: '160px' }} /> -
+
- + + {treeEditMode === TreeEditModeEnum.SortTree && ( + + )} + + } + open={openSortModal} + onClose={handleCancelEdit} + > + setTreeEditMode(to)}> + + handleEditCollapseItem( + contract || {}, + selectedKeys[0] as string, + sortNodeList.find((node) => node.path === selectedKeys[0]), + ) + } + /> + + {treeReady && ( + + )} + + + ); +}); + +export default AddListSortDrawer; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/ArrayTree.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/ArrayTree.tsx new file mode 100644 index 000000000..2e223bc2a --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/ArrayTree.tsx @@ -0,0 +1,59 @@ +import { EmptyWrapper, useTranslation } from '@arextest/arex-core'; +import { css } from '@emotion/react'; +import { Card, Tree, Typography } from 'antd'; +import { TreeProps } from 'antd/es'; +import React, { FC, useMemo } from 'react'; + +import { useColorPrimary } from '@/hooks'; +import { SortNode } from '@/services/ComparisonService'; + +import { getArrayNodes } from './utils'; + +type ResponseTreeProps = Omit & { + loading?: boolean; + sortNodeList?: SortNode[]; + treeData?: object; + onEditResponse?: () => void; +}; + +const ArrayTree: FC = (props) => { + const { t } = useTranslation('components'); + + const color = useColorPrimary(); + + const treeData = useMemo( + () => getArrayNodes(props.treeData || {}, '', props.sortNodeList, color.name), + [props.treeData, props.sortNodeList, color.name], + ); + + return ( + {t('appSetting.chooseOneNode')}} + > + + + + + ); +}; + +export default ArrayTree; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortTree.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortTree.tsx new file mode 100644 index 000000000..3bef2c8da --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/SortTree.tsx @@ -0,0 +1,43 @@ +import { css, EmptyWrapper, useTranslation } from '@arextest/arex-core'; +import { Card, Tree } from 'antd'; +import { TreeProps } from 'antd/es'; +import React, { FC, useMemo } from 'react'; + +import { getSortNodes } from './utils'; + +type SortTreeProps = Omit & { + treeData?: any[]; + title?: string; +}; + +const SortTree: FC = (props) => { + const { t } = useTranslation('components'); + + const treeData = useMemo(() => getSortNodes(props.treeData, ''), [props.treeData]); + return ( + + + + + + ); +}; + +export default SortTree; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/TreeCarousel.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/TreeCarousel.tsx new file mode 100644 index 000000000..82fbacb84 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/TreeCarousel.tsx @@ -0,0 +1,21 @@ +import { styled } from '@arextest/arex-core'; +import { Carousel } from 'antd'; + +const TreeCarousel = styled(Carousel)` + .slick-dots-bottom { + position: relative; + margin: 16px 0 0 0; + } + .slick-dots.slick-dots-bottom { + li > button { + height: 4px; + border-radius: 2px; + background-color: ${(props) => props.theme.colorTextTertiary}!important; + } + * > li.slick-active > button { + background-color: ${(props) => props.theme.colorTextQuaternary}!important; + } + } +`; + +export default TreeCarousel; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx index 34605962e..8bd41997e 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/index.tsx @@ -1,30 +1,25 @@ -import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; +import { CloseOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons'; import { css, useTranslation } from '@arextest/arex-core'; import { useRequest } from 'ahooks'; import { App, Button, Pagination, Popconfirm, Select, Tag, Tooltip } from 'antd'; -import { ColumnsType } from 'antd/es/table'; -import React, { useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; +import { SearchHighLight } from '@/components'; +import { CompareConfigNewProps } from '@/panes/AppSetting/CompareConfigNew'; import { ComparisonService } from '@/services'; -import { PageQueryComparisonReq, SortNodeBase } from '@/services/ComparisonService'; +import { QuerySortSearchParams, SortNodeBase } from '@/services/ComparisonService'; -import AddConfigModal, { - AddConfigModalProps, - AddConfigModalRef, - parseDependency, -} from '../AddConfigModal'; -import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE } from '../ConfigInfoTable'; +import { AddConfigModalProps, AddConfigModalRef, parseDependency } from '../AddConfigModal'; +import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE, ConfigColumnsType } from '../ConfigInfoTable'; import { ListSortInfo } from '../type'; -import SortPathKeyInput from './SortPathKeyInput'; type ListSortPrivate = { listPath: string; keys: string[]; }; -export type ListSortProps = { - appId: string; -} & Pick, 'operationList'>; +export type ListSortProps = CompareConfigNewProps & + Pick, 'operationList'>; const PAGE_SIZE = { SIZE_10: 10, @@ -49,9 +44,14 @@ export default function ListSort(props: ListSortProps) { pageSize: PAGE_SIZE.SIZE_10, }); - const [searchParams, setSearchParams] = useState< - Pick - >({}); + const [searchParams, setSearchParams] = useState({}); + + useEffect(() => { + handleSearch({ + operationName: props.operation?.operationName, + dependencyName: props.dependency?.operationName, + }); + }, [props.operation, props.dependency, props.operationList]); const [selectedRows, setSelectedRows] = useState([]); @@ -104,40 +104,68 @@ export default function ListSort(props: ListSortProps) { }, }); - const columns: ColumnsType = [ + const columns: ConfigColumnsType = [ { title: t('components:appSetting.path'), dataIndex: 'listPath', - render: (path: string[]) => '/' + path.join('/'), + search: true, + render: (path: string[]) => ( + + ), }, { title: t('components:appSetting.keys'), dataIndex: 'keys', - render: (keys: string[][]) => ( - '/' + key.join('/'))} + maxTagCount={maxTagCount} + tagRender={(tag) => + tag.isMaxTag ? ( + + '/' + key.join('/')) + .join(', ')} + > + {keys.length - 2} more ... + + + ) : ( + + + + ) } - .ant-select-selection-overflow-item-suffix { - display: none; - } - `} - /> - ), + labelRender={(tag) => ( + + )} + maxTagPlaceholder={(omittedValues) => ( + label).join(', ')}> + {omittedValues.length} more... + + )} + css={css` + pointer-events: none; // readonly mode + .ant-select-selection-overflow-item-rest { + pointer-events: all; // enable tooltip hover event + } + .ant-select-selection-overflow-item-suffix { + display: none; + } + `} + /> + ); + }, }, ]; @@ -163,13 +191,13 @@ export default function ListSort(props: ListSortProps) {
{tableMode === CONFIG_INFO_TABLE_MODE.DISPLAY ? ( <> - + {/*}*/} + {/* onClick={() => addConfigModalRef.current?.open()}*/} + {/*>*/} + {/* {t('common:add')}*/} + {/**/}
); } diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/__snapshots__/getArrayNodes.test.ts.snap b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/__snapshots__/getArrayNodes.test.ts.snap new file mode 100644 index 000000000..e69de29bb diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayNodes.test.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayNodes.test.ts new file mode 100644 index 000000000..41d2c2824 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayNodes.test.ts @@ -0,0 +1,111 @@ +import { describe, expect, test } from 'vitest'; + +import { getArrayNodes } from './getArrayNodes'; + +describe('getArrayNode', () => { + test('no array object', () => { + const object = { name: 'Helen', age: 20 }; + expect(getArrayNodes(object)).toMatchSnapshot(); + }); + + test('object with simple array and sortNodeList', () => { + const object = { + responsestatustype: { + responsecode: 1, + responsedesc: 'String', + timestamp: 1, + }, + body: [ + { + name: 'String', + id: 1, + age: 1, + }, + ], + }; + expect( + getArrayNodes( + object, + '', + [ + { + id: '', + appId: '', + operationId: '', + modifiedTime: 0, + expirationType: 0, + expirationDate: 0, + listPath: ['body'], + keys: [['name'], ['id'], ['age']], + path: 'body/', + pathKeyList: ['name/', 'id/', 'age/'], + status: null, + }, + ], + 'green', + ), + ).toMatchSnapshot(); + }); + + test('object with nest array and sortNodeList', () => { + const object = { + responsestatustype: { + responsecode: 1, + responsedesc: 'String', + timestamp: 1, + }, + body: [ + { + name: 'String', + id: 1, + age: 1, + }, + ], + nestArray: [ + [ + { + name: 'String', + id: 1, + age: 1, + }, + ], + ], + }; + + expect( + getArrayNodes( + object, + '', + [ + { + id: '', + appId: '', + operationId: '', + modifiedTime: 0, + expirationType: 0, + expirationDate: 0, + listPath: ['body'], + keys: [['name'], ['id'], ['age']], + path: 'body/', + pathKeyList: ['name/', 'id/', 'age/'], + status: null, + }, + { + id: '', + appId: '', + operationId: '', + modifiedTime: 0, + expirationType: 0, + expirationDate: 0, + listPath: ['nestArray'], + keys: [['id'], ['age']], + path: 'nestArray/', + pathKeyList: ['id/', 'age/'], + status: null, + }, + ], + 'green', + ), + ).toMatchSnapshot(); + }); +}); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayNodes.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayNodes.tsx new file mode 100644 index 000000000..76fd672ba --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayNodes.tsx @@ -0,0 +1,55 @@ +import { Badge } from 'antd'; +import { DataNode } from 'antd/lib/tree'; +import React from 'react'; + +import { getArrayValidElement } from '@/panes/AppSetting/CompareConfig/NodesSort/utils/getArrayValidElement'; +import { SortNode } from '@/services/ComparisonService'; + +/** + * 获取 object 的数组类型节点,并为已配置过的数组节点添加圆点提示 + * @param object 契约对象 + * @param basePath 节点路径 + * @param sortNodeList 已配置的节点列表 + * @param color 圆点颜色 + */ +export function getArrayNodes( + object: object, + basePath = '', + sortNodeList?: SortNode[], + color?: string, +): DataNode[] { + const entries = Object.entries(object); + return ( + entries + .map(([key, value]) => { + const losslessValue = value.isLosslessNumber ? value.value : value; + + const path = basePath + key + '/'; + return losslessValue && typeof losslessValue === 'object' + ? { + title: key, + key: path, + children: getArrayNodes( + Array.isArray(losslessValue) + ? getArrayValidElement(losslessValue) || {} + : losslessValue, + path, + sortNodeList, + color, + ), + disabled: !Array.isArray(losslessValue), + icon: sortNodeList?.find((node) => node.path === path)?.pathKeyList?.length && ( + // 已配置过的节点使用圆点进行提示 + ), + } + : { + title: key, + key: path, + value: losslessValue, + disabled: !Array.isArray(losslessValue), + }; + }) + // 过滤非数组子节点 + .filter((item) => item.children || Array.isArray(item.value)) + ); +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayValidElement.test.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayValidElement.test.ts new file mode 100644 index 000000000..d6950dd16 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayValidElement.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, test } from 'vitest'; + +import { getArrayValidElement } from './getArrayValidElement'; + +describe('getArrayValidElement', () => { + test('simple array', () => { + const array = [1, 2, 3]; + expect(getArrayValidElement(array)).toEqual(1); + }); + + test('complex array', () => { + const array = [ + { name: 'Helen', age: 20 }, + { name: 'Jesse', age: 22 }, + ]; + expect(getArrayValidElement(array)).toEqual({ name: 'Helen', age: 20 }); + }); + + test('nested array', () => { + const array = [ + [1, 2, 3], + [4, 5, 6], + ]; + expect(getArrayValidElement(array)).toEqual(1); + }); + + test('nested complex array', () => { + const array = [[{ name: 'Helen', age: 20 }], [{ name: 'Jesse', age: 22 }]]; + expect(getArrayValidElement(array)).toEqual({ name: 'Helen', age: 20 }); + }); + + test('empty array', () => { + const array: any[] = []; + expect(getArrayValidElement(array)).toEqual(undefined); + }); +}); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayValidElement.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayValidElement.ts new file mode 100644 index 000000000..31a7f1c8d --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getArrayValidElement.ts @@ -0,0 +1,8 @@ +/** + * 获取一个数组中的有效元素(非数组类型的对象或者基本数据类型) + * @param array + */ +export function getArrayValidElement(array: any[]): any { + const sample = array[0]; + return Array.isArray(sample) ? getArrayValidElement(sample) : sample; +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getSortArray.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getSortArray.ts new file mode 100644 index 000000000..362f0a9e9 --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getSortArray.ts @@ -0,0 +1,40 @@ +import { NodesSortProps } from '@/panes/AppSetting/CompareConfig/NodesSort'; +import { getArrayValidElement } from '@/panes/AppSetting/CompareConfig/NodesSort/utils/getArrayValidElement'; + +/** + * 根据 path获取 contract 的非数组元素节点 + * @param key + * @param contract + * @param caseSensitivity + */ +export function getSortArray( + key: string, + contract: NodesSortProps['contractParsed'], + caseSensitivity: boolean = true, +) { + let value: any = undefined; + console.log(key, contract, caseSensitivity); + key + .split('/') + .filter(Boolean) + .forEach((k, i) => { + value = + i === 0 + ? lowercaseObjectKeys(contract, caseSensitivity)?.[k] + : Array.isArray(value) + ? lowercaseObjectKeys(getArrayValidElement(value), caseSensitivity)?.[k] + : lowercaseObjectKeys(value, caseSensitivity)?.[k]; + }); + + console.log({ value }); + return value; +} + +function lowercaseObjectKeys(obj?: Record, disabled: boolean = false) { + if (disabled) return obj; + const newObj: Record = {}; + for (const key in obj) { + newObj[key.toLowerCase()] = obj[key]; + } + return newObj; +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getSortNodes.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getSortNodes.ts new file mode 100644 index 000000000..5f585c19a --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/getSortNodes.ts @@ -0,0 +1,31 @@ +import { DataNode } from 'antd/lib/tree'; + +import { getArrayValidElement } from '@/panes/AppSetting/CompareConfig/NodesSort/utils/getArrayValidElement'; + +export function getSortNodes(data?: any[] | object, basePath = ''): DataNode[] { + if (!data || (Array.isArray(data) && !data?.length)) return []; + + const sample = Array.isArray(data) ? getArrayValidElement(data) : data; + + if (['number', 'string'].includes(typeof sample)) + return [{ title: '%value%', key: basePath + '%value%/' }]; + + const entries = Object.entries(sample); + return entries.map(([key, value]) => { + const losslessValue = value.isLosslessNumber ? value.value : value; + + const path = basePath + key + '/'; + return losslessValue && typeof losslessValue === 'object' + ? { + title: key, + key: path, + children: getSortNodes( + Array.isArray(losslessValue) + ? getArrayValidElement(losslessValue) || [] + : losslessValue, + path, + ), + } + : { title: key, key: path, value: path }; + }); +} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/index.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/index.ts new file mode 100644 index 000000000..638e7f23b --- /dev/null +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/ListSort/utils/index.ts @@ -0,0 +1,4 @@ +export { getArrayNodes } from './getArrayNodes'; +export { getArrayValidElement } from './getArrayValidElement'; +export { getSortArray } from './getSortArray'; +export { getSortNodes } from './getSortNodes'; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx index d4a83a80d..748c16450 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput.tsx @@ -22,46 +22,19 @@ const IgnoreTreeWrapper = styled.div<{ lineThrough?: boolean }>` `; export type ExclusionPathInputProps = Omit & { - appId: string; - operationId?: string; - dependency?: DependencyParams; + contract?: Record; onChange?: (value: string) => void; + loadingContract?: boolean; }; const IgnorePathInput = (props: ExclusionPathInputProps) => { - const { appId, operationId, dependency, ...inputProps } = props; + const { contract, loadingContract, ...inputProps } = props; const { t } = useTranslation(); const [expand, setExpand] = useState(false); const [selectedKeys, setSelectedKeys] = useState(); - const { - data: contract, - mutate: setContract, - loading: loadingContract, - } = useRequest( - () => - ReportService.queryContract({ - appId, - operationId, - ...dependency, - }), - { - ready: !!appId && expand, - refreshDeps: [appId, operationId, dependency], - onBefore() { - setContract(); - }, - }, - ); - - const contractParsed = useMemo<{ [key: string]: any }>(() => { - const res = contract?.contract; - if (res) return tryParseJsonString(res) || {}; - else return {}; - }, [contract]); - return ( @@ -75,8 +48,8 @@ const IgnorePathInput = (props: ExclusionPathInputProps) => { {'select from tree'}} - icon={} + title={t('components:appSetting.selectNodePath')} + icon={} textProps={{ style: { height: '10px' } }} onClick={() => setExpand(!expand)} /> @@ -100,13 +73,13 @@ const IgnorePathInput = (props: ExclusionPathInputProps) => { children: ( { setSelectedKeys(keys); props.onChange?.(keys.join('/')); }} - treeData={contractParsed} + treeData={contract} /> ), }, diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx index cc39232fd..7190b457f 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnoreTree.tsx @@ -8,7 +8,7 @@ import { getIgnoreNodes } from './utils'; type IgnoreTreeProps = Omit & { title?: React.ReactNode; loading?: boolean; - treeData: object; + treeData?: Record; lineThrough?: boolean; }; @@ -27,7 +27,7 @@ const IgnoreTree: FC = (props) => { diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx index 286984cbb..eac6fcf2a 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/index.tsx @@ -2,9 +2,10 @@ import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant- import { useTranslation } from '@arextest/arex-core'; import { useRequest } from 'ahooks'; import { App, Button, Form, Pagination, Popconfirm } from 'antd'; -import { ColumnsType } from 'antd/es/table'; -import React, { useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; +import { SearchHighLight } from '@/components'; +import { CompareConfigNewProps } from '@/panes/AppSetting/CompareConfigNew'; import AddConfigModal, { AddConfigModalProps, AddConfigModalRef, @@ -12,19 +13,17 @@ import AddConfigModal, { } from '@/panes/AppSetting/CompareConfigNew/AddConfigModal'; import IgnorePathInput from '@/panes/AppSetting/CompareConfigNew/NodeIgnore/IgnorePathInput'; import { ComparisonService } from '@/services'; -import { IgnoreNodeBase, PageQueryComparisonReq } from '@/services/ComparisonService'; +import { IgnoreNodeBase, QueryIgnoreSearchParams } from '@/services/ComparisonService'; -import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE } from '../ConfigInfoTable'; +import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE, ConfigColumnsType } from '../ConfigInfoTable'; import { ExclusionInfo } from '../type'; type NodeIgnorePrivate = { exclusions: string; }; -export type NodeIgnoreProps = { appId: string } & Pick< - AddConfigModalProps, - 'operationList' ->; +export type NodeIgnoreProps = CompareConfigNewProps & + Pick, 'operationList'>; const PAGE_SIZE = { SIZE_10: 10, @@ -49,17 +48,25 @@ export default function NodeIgnore(props: NodeIgnoreProps) { pageSize: PAGE_SIZE.SIZE_10, }); - const [searchParams, setSearchParams] = useState< - Pick - >({}); + const [searchParams, setSearchParams] = useState({}); + + useEffect(() => { + handleSearch({ + operationName: props.operation?.operationName, + dependencyName: props.dependency?.operationName, + }); + }, [props.operation, props.dependency, props.operationList]); const [selectedRows, setSelectedRows] = useState([]); - const columns: ColumnsType = [ + const columns: ConfigColumnsType = [ { title: t('components:appSetting.path'), dataIndex: 'exclusionPath', - render: (path: string[]) => '/' + path.join('/'), + search: true, + render: (path: string[]) => ( + + ), }, ]; @@ -114,32 +121,10 @@ export default function NodeIgnore(props: NodeIgnoreProps) { setPagination({ current: 1, pageSize: pagination.pageSize }); } - const operationIds: PageQueryComparisonReq['operationIds'] = []; - const dependencyIds: PageQueryComparisonReq['dependencyIds'] = []; - const operationNameSearchLowerCase = search['operationName']?.toLowerCase() || ''; - const dependencyNameSearchLowerCase = search['dependencyName']?.toLowerCase() || ''; - - if (operationNameSearchLowerCase && 'global'.includes(operationNameSearchLowerCase)) - operationIds.push(null); - - props.operationList?.forEach((operation) => { - if ( - operationNameSearchLowerCase && - operation.operationName.toLowerCase().includes(operationNameSearchLowerCase) - ) - operationIds.push(operation.id); - operation.dependencyList?.forEach((dependency) => { - if ( - dependencyNameSearchLowerCase && - dependency.operationName?.toLowerCase()?.includes(dependencyNameSearchLowerCase) - ) - dependencyIds.push(dependency.dependencyId); - }); - }); - setSearchParams({ - operationIds, - dependencyIds, + keyOfOperationName: search.operationName, + keyOfDependencyName: search.dependencyName, + keyOfExclusionPath: search.exclusionPath, }); } @@ -242,13 +227,13 @@ export default function NodeIgnore(props: NodeIgnoreProps) { title={t('components:appSetting.addNodesIgnore')} appId={props.appId} operationList={props.operationList} - field={({ appId, operationId, dependency }) => ( + field={({ contract, loadingContract }) => ( - + )} onSubmit={handleAddIgnore} diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts index 843afb1d5..8b1d38219 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodeIgnore/utils/getIgnoreNodes.ts @@ -7,7 +7,9 @@ import { getArrayValidElement } from '@/panes/AppSetting/CompareConfig/NodesSort * @param object * @param basePath */ -export function getIgnoreNodes(object: object, basePath = ''): DataNode[] { +export function getIgnoreNodes(object?: object, basePath = ''): DataNode[] { + if (!object) return []; + const entries = Object.entries(object); return entries.map(([key, value]) => { const losslessValue = value.isLosslessNumber ? value.value : value; diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx index 95516df84..dac32c3f0 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/NodesTransform/index.tsx @@ -1,22 +1,25 @@ -import { CloseOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; +import { CloseOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons'; import { useTranslation } from '@arextest/arex-core'; import { useRequest } from 'ahooks'; -import { App, Button, Form, Pagination, Popconfirm } from 'antd'; -import { ColumnsType } from 'antd/es/table'; -import React, { useRef, useState } from 'react'; +import { App, Button, Pagination, Popconfirm } from 'antd'; +import React, { useEffect, useRef, useState } from 'react'; -import AddConfigModal, { +import { CompareConfigNewProps } from '@/panes/AppSetting/CompareConfigNew'; +import { AddConfigModalProps, AddConfigModalRef, parseDependency, } from '@/panes/AppSetting/CompareConfigNew/AddConfigModal'; import ConfigInfoTable, { CONFIG_INFO_TABLE_MODE, + ConfigColumnsType, } from '@/panes/AppSetting/CompareConfigNew/ConfigInfoTable'; -import RootTransformInput from '@/panes/AppSetting/CompareConfigNew/NodesTransform/RootTransformInput'; import { RootTransformInfo } from '@/panes/AppSetting/CompareConfigNew/type'; import { ComparisonService } from '@/services'; -import { PageQueryComparisonReq, UpdateTransformRootNodeReq } from '@/services/ComparisonService'; +import { + QueryRootTransformSearchParams, + UpdateTransformRootNodeReq, +} from '@/services/ComparisonService'; const PAGE_SIZE = { SIZE_10: 10, @@ -26,9 +29,8 @@ const PAGE_SIZE = { const pageSizeOptions = Object.values(PAGE_SIZE); -export type NodeTransformProps = { - appId: string; -} & Pick, 'operationList'>; +export type NodeTransformProps = CompareConfigNewProps & + Pick, 'operationList'>; const NodesTransform = (props: NodeTransformProps) => { const { t } = useTranslation(); @@ -47,9 +49,14 @@ const NodesTransform = (props: NodeTransformProps) => { pageSize: PAGE_SIZE.SIZE_10, }); - const [searchParams, setSearchParams] = useState< - Pick - >({}); + const [searchParams, setSearchParams] = useState({}); + + useEffect(() => { + handleSearch({ + operationName: props.operation?.operationName, + dependencyName: props.dependency?.operationName, + }); + }, [props.operation, props.dependency, props.operationList]); const { data = { rootTransformInfos: [], totalCount: 0 }, @@ -89,10 +96,11 @@ const NodesTransform = (props: NodeTransformProps) => { }, }); - const columns: ColumnsType = [ + const columns: ConfigColumnsType = [ { dataIndex: 'transformMethodName', title: t('components:appSetting.transformMethodName'), + search: true, }, ]; @@ -118,13 +126,13 @@ const NodesTransform = (props: NodeTransformProps) => {
{tableMode === CONFIG_INFO_TABLE_MODE.DISPLAY ? ( <> - + {/*}*/} + {/* onClick={() => addConfigModalRef.current?.open()}*/} + {/*>*/} + {/* {t('common:add')}*/} + {/**/}
); diff --git a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts index bf888091f..3893367e7 100644 --- a/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts +++ b/packages/arex/src/panes/AppSetting/CompareConfigNew/type.ts @@ -1,5 +1,11 @@ import { IgnoreCategory } from '@/services/ComparisonService'; +export enum CONFIG_TARGET { + GLOBAL, + INTERFACE, + DEPENDENCY, +} + export enum ExpirationType { PINNED_NEVER_EXPIRED, SOFT_TIME_EXPIRED, diff --git a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts index c2b2ce77d..d9a491400 100644 --- a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts +++ b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreCategory.ts @@ -4,11 +4,22 @@ import { request } from '@/utils'; import { PageQueryComparisonReq } from './queryAggregateIgnoreNode'; +export type QueryIgnoreCategorySearchParams = { + // operationIds?: (string | null)[]; // use null search for global + // dependencyIds?: (string | null)[]; + keyOfOperationName?: string; + keyOfIgnoreOperationType?: string; + keyOfIgnoreOperationName?: string; +}; + +export type PageQueryIgnoreCategoryComparisonReq = + PageQueryComparisonReq; + export type PageQueryIgnoreCategoryComparisonRes = PagingResponse<{ ignoreCategories: IgnoreCategoryInfo[]; }>; -export async function queryAggregateIgnoreCategory(params: PageQueryComparisonReq) { +export async function queryAggregateIgnoreCategory(params: PageQueryIgnoreCategoryComparisonReq) { const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; const res = await request.post( '/webApi/config/comparison/ignoreCategory/pageQueryComparisonConfig', diff --git a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts index 91a9ce9ce..c3a623293 100644 --- a/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts +++ b/packages/arex/src/services/ComparisonService/queryAggregateIgnoreNode.ts @@ -2,15 +2,24 @@ import { ExclusionInfo } from '@/panes/AppSetting/CompareConfigNew/type'; import { PagingRequest, PagingResponse } from '@/services/type'; import { request } from '@/utils'; -export type PageQueryComparisonReq = PagingRequest<{ +export type PageQueryComparisonReq> = PagingRequest<{ appId: string; - operationIds?: (string | null)[]; // use null search for global - dependencyIds?: string[]; -}>; +}> & + T; + +export type QueryIgnoreSearchParams = { + // operationIds?: (string | null)[]; // use null search for global + // dependencyIds?: (string | null)[]; + keyOfOperationName?: string; + keyOfDependencyName?: string; + keyOfExclusionPath?: string; +}; + +export type PageQueryIgnoreComparisonReq = PageQueryComparisonReq; export type PageQueryIgnoreComparisonRes = PagingResponse<{ exclusions: ExclusionInfo[] }>; -export async function queryAggregateIgnoreNode(params: PageQueryComparisonReq) { +export async function queryAggregateIgnoreNode(params: PageQueryIgnoreComparisonReq) { const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; const res = await request.post( '/webApi/config/comparison/exclusions/pageQueryComparisonConfig', diff --git a/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts b/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts index d375dcaa9..fc50c85f4 100644 --- a/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts +++ b/packages/arex/src/services/ComparisonService/queryAggregateRootTransform.ts @@ -4,11 +4,21 @@ import { request } from '@/utils'; import { PageQueryComparisonReq } from './queryAggregateIgnoreNode'; +export type QueryRootTransformSearchParams = { + // operationIds?: (string | null)[]; // use null search for global + // dependencyIds?: (string | null)[]; + keyOfOperationName?: string; + keyOfDependencyName?: string; + keyOfMethodName?: string; +}; + +export type PageQueryIgnoreComparisonReq = PageQueryComparisonReq; + export type PageQueryRootTransformComparisonRes = PagingResponse<{ rootTransformInfos: RootTransformInfo[]; }>; -export async function queryAggregateRootTransform(params: PageQueryComparisonReq) { +export async function queryAggregateRootTransform(params: PageQueryIgnoreComparisonReq) { const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; const res = await request.post( '/webApi/config/comparison/rootTransform/pageQueryComparisonConfig', diff --git a/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts b/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts index cd05a59b7..74468f220 100644 --- a/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts +++ b/packages/arex/src/services/ComparisonService/queryAggregateSortNode.ts @@ -4,9 +4,19 @@ import { request } from '@/utils'; import { PageQueryComparisonReq } from './queryAggregateIgnoreNode'; +export type QuerySortSearchParams = { + // operationIds?: (string | null)[]; // use null search for global + // dependencyIds?: (string | null)[]; + keyOfOperationName?: string; + keyOfDependencyName?: string; + keyOfValue?: string; + keyOfListPath?: string; +}; + +export type PageQuerySortComparisonReq = PageQueryComparisonReq; export type PageQuerySortComparisonRes = PagingResponse<{ listSorts: ListSortInfo[] }>; -export async function queryAggregateSortNode(params: PageQueryComparisonReq) { +export async function queryAggregateSortNode(params: PageQuerySortComparisonReq) { const { pageIndex = 1, pageSize = 10, needTotal = true, ...restParams } = params; const res = await request.post( '/webApi/config/comparison/listsort/pageQueryComparisonConfig', diff --git a/packages/arex/src/utils/index.ts b/packages/arex/src/utils/index.ts index e24310779..600d00fb7 100644 --- a/packages/arex/src/utils/index.ts +++ b/packages/arex/src/utils/index.ts @@ -113,3 +113,40 @@ export function download(content: string, filename: string) { // a标签从body移除 document.body.removeChild(eleLink); } + +/** + * 根据路径获取对象的值 + * @param obj + * @param path + */ +export function getValueByPath(obj: object | undefined, path: string | string[]): any { + if (typeof path === 'string') { + path = path.split('.'); + } + return path.reduce>((o, k) => (o || {})[k], obj || {}); +} + +/** + * 根据路径设置对象的值 + * @param obj + * @param path + * @param value + */ +export function setValueByPath(obj: object, path: string | string[], value: any) { + // path 如果是 string 则直接赋值;如果是数组则遍历赋值,如果不存在则创建 + if (typeof path === 'string') { + path = path.split('.'); + } + path.reduce>((o, k, i) => { + if (i === path.length - 1) { + o[k] = value; + } else { + if (typeof o[k] === 'undefined') { + o[k] = {}; + } + } + return o[k]; + }, obj); + + return obj; +}