From 7e8038f45d1e245c9f20305e0017f5e27462b841 Mon Sep 17 00:00:00 2001 From: Linzp Date: Tue, 19 May 2026 13:01:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=A7=9F=E6=88=B7=E9=83=A8?= =?UTF-8?q?=E5=88=86=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 +- src/components/Apis/getApis.js | 52 ++ src/components/BizUnit/index.js | 25 +- src/components/Signature/index.js | 249 +++---- src/components/Signature/locale/en-US.js | 1 + src/components/Signature/locale/zh-CN.js | 1 + .../Tenant/CompanyInfo/Banner/FormInner.js | 3 +- .../Tenant/CompanyInfo/Banner/index.js | 20 +- .../Tenant/CompanyInfo/Basic/FormInner.js | 46 +- .../Tenant/CompanyInfo/Basic/index.js | 218 +++++- .../DevelopmentHistory/FormInner.js | 26 +- .../CompanyInfo/DevelopmentHistory/index.js | 71 +- .../CompanyInfo/TeamDescription/FormInner.js | 40 +- .../CompanyInfo/TeamDescription/index.js | 53 +- src/components/Tenant/CompanyInfo/index.js | 113 ++- .../Tenant/CompanyInfo/style.module.scss | 361 +++++++++- src/components/Tenant/JoinInvitation/index.js | 259 ++++--- .../Tenant/JoinInvitation/style.module.scss | 361 +++++++++- .../Tenant/LoginTenant/SelectTenant.js | 259 ++++--- src/components/Tenant/LoginTenant/index.js | 10 +- .../Tenant/LoginTenant/style.module.scss | 405 ++++++++++- src/components/Tenant/OrgInfo/FormInner.js | 48 +- .../Tenant/OrgInfo/ImportAnchorOrgSelect.js | 60 ++ .../Tenant/OrgInfo/OrgNodeUserCount.js | 18 + src/components/Tenant/OrgInfo/index.js | 679 +++++++++++++++++- .../OrgInfo/normalizeLeaderUserIdForSubmit.js | 19 + .../Tenant/OrgInfo/orgImportTemplate.js | 439 +++++++++++ .../Tenant/OrgInfo/style.module.scss | 387 +++++++++- src/components/Tenant/Permission/index.js | 19 +- src/components/Tenant/README.md | 355 +++++++-- src/components/Tenant/Role/getFilterList.js | 16 + .../Tenant/Role/getRoleListFilterValue.js | 52 ++ src/components/Tenant/Role/index.js | 20 +- src/components/Tenant/Setting/Org.js | 20 +- src/components/Tenant/Setting/Permission.js | 44 +- src/components/Tenant/Setting/User.js | 3 +- .../Tenant/SharedGroup/FormInner.js | 70 +- .../SharedGroup/SharedGroupModulesField.js | 197 +++++ .../SharedGroupModulesField.module.scss | 110 +++ .../SharedGroupModulesFormField.js | 30 + .../SharedGroup/collectDataScopeModules.js | 53 ++ src/components/Tenant/SharedGroup/index.js | 64 ++ .../SharedGroup/normalizeDataScopeList.js | 22 + .../TenantUserSelect/OrgTenantUserField.js | 117 +++ .../TenantUserSelect/buildOrgTreeData.js | 47 ++ .../Tenant/TenantUserSelect/index.js | 33 + .../Tenant/TenantUserSelect/style.module.scss | 50 ++ .../Tenant/UserList/Actions/Create.js | 11 +- .../Tenant/UserList/Actions/Edit.js | 36 +- .../Tenant/UserList/Actions/Invite.js | 117 +-- .../Actions/buildInvitePersonalCardProps.js | 134 ++++ .../buildInvitePersonalCardProps.test.js | 104 +++ .../UserList/Actions/inviteModal.module.scss | 30 + .../UserList/Actions/personalCard.module.scss | 8 + .../Actions/personalCardWrap.module.scss | 9 + .../UserList/DepartmentTreeFilterItem.js | 48 ++ src/components/Tenant/UserList/FormInner.js | 7 +- .../Tenant/UserList/OrgTooltipContent.js | 42 ++ .../Tenant/UserList/TenantUserPersonalCard.js | 36 + .../Tenant/UserList/UserCard/index.js | 12 +- .../UserList/UserCard/style.module.scss | 5 + src/components/Tenant/UserList/UserOrgTags.js | 62 ++ .../Tenant/UserList/UserOrgTags.module.scss | 121 ++++ .../Tenant/UserList/buildOrgDisplayPath.js | 11 + .../buildTenantUserPersonalCardProps.js | 1 + .../UserList/buildUserListFilterFromSearch.js | 39 + .../UserList/buildUserListWithPositionList.js | 79 ++ src/components/Tenant/UserList/getColumns.js | 20 +- .../Tenant/UserList/getUserListFilterValue.js | 72 ++ .../Tenant/UserList/getUserOrgDisplayItems.js | 73 ++ src/components/Tenant/UserList/index.js | 319 +++++--- .../UserList/mapUserOptionsToFormValue.js | 60 ++ .../normalizeTenantUserForPersonalCard.js | 23 + .../UserList/normalizeTenantUserStatus.js | 22 + .../UserList/pickTenantOrgIdsFromForm.js | 43 ++ .../Tenant/UserList/userListUrlFilters.js | 61 ++ src/components/Tenant/doc/api.md | 29 +- src/components/Tenant/doc/example.json | 102 ++- src/components/Tenant/doc/org-info.js | 58 +- src/components/Tenant/doc/permission.js | 4 +- src/components/Tenant/doc/setting.js | 78 +- src/components/Tenant/doc/summary.md | 2 +- .../Tenant/doc/tenant-user-select-base.js | 39 + .../Tenant/doc/tenant-user-select-initial.js | 34 + .../Tenant/doc/tenant-user-select-multiple.js | 38 + .../Tenant/doc/tenant-user-select-status.js | 37 + src/components/Tenant/index.js | 2 + src/components/Tenant/locale/en-US.js | 82 +++ src/components/Tenant/locale/zh-CN.js | 81 ++- src/components/TenantAdmin/List/getColumns.js | 20 +- src/components/TenantAdmin/List/index.js | 2 +- .../TenantAdmin/TabDetail/Org/index.js | 20 +- .../TenantAdmin/TabDetail/Permission/index.js | 32 + .../TenantAdmin/TabDetail/User/index.js | 30 +- src/components/TenantAdmin/TabDetail/index.js | 5 +- src/mockPreset/index.js | 187 ++++- src/mockPreset/tenant-data.json | 174 ++++- 97 files changed, 7220 insertions(+), 992 deletions(-) create mode 100644 src/components/Tenant/OrgInfo/ImportAnchorOrgSelect.js create mode 100644 src/components/Tenant/OrgInfo/OrgNodeUserCount.js create mode 100644 src/components/Tenant/OrgInfo/normalizeLeaderUserIdForSubmit.js create mode 100644 src/components/Tenant/OrgInfo/orgImportTemplate.js create mode 100644 src/components/Tenant/Role/getFilterList.js create mode 100644 src/components/Tenant/Role/getRoleListFilterValue.js create mode 100644 src/components/Tenant/SharedGroup/SharedGroupModulesField.js create mode 100644 src/components/Tenant/SharedGroup/SharedGroupModulesField.module.scss create mode 100644 src/components/Tenant/SharedGroup/SharedGroupModulesFormField.js create mode 100644 src/components/Tenant/SharedGroup/collectDataScopeModules.js create mode 100644 src/components/Tenant/SharedGroup/normalizeDataScopeList.js create mode 100644 src/components/Tenant/TenantUserSelect/OrgTenantUserField.js create mode 100644 src/components/Tenant/TenantUserSelect/buildOrgTreeData.js create mode 100644 src/components/Tenant/TenantUserSelect/index.js create mode 100644 src/components/Tenant/TenantUserSelect/style.module.scss create mode 100644 src/components/Tenant/UserList/Actions/buildInvitePersonalCardProps.js create mode 100644 src/components/Tenant/UserList/Actions/buildInvitePersonalCardProps.test.js create mode 100644 src/components/Tenant/UserList/Actions/inviteModal.module.scss create mode 100644 src/components/Tenant/UserList/Actions/personalCard.module.scss create mode 100644 src/components/Tenant/UserList/Actions/personalCardWrap.module.scss create mode 100644 src/components/Tenant/UserList/DepartmentTreeFilterItem.js create mode 100644 src/components/Tenant/UserList/OrgTooltipContent.js create mode 100644 src/components/Tenant/UserList/TenantUserPersonalCard.js create mode 100644 src/components/Tenant/UserList/UserOrgTags.js create mode 100644 src/components/Tenant/UserList/UserOrgTags.module.scss create mode 100644 src/components/Tenant/UserList/buildOrgDisplayPath.js create mode 100644 src/components/Tenant/UserList/buildTenantUserPersonalCardProps.js create mode 100644 src/components/Tenant/UserList/buildUserListFilterFromSearch.js create mode 100644 src/components/Tenant/UserList/buildUserListWithPositionList.js create mode 100644 src/components/Tenant/UserList/getUserListFilterValue.js create mode 100644 src/components/Tenant/UserList/getUserOrgDisplayItems.js create mode 100644 src/components/Tenant/UserList/mapUserOptionsToFormValue.js create mode 100644 src/components/Tenant/UserList/normalizeTenantUserForPersonalCard.js create mode 100644 src/components/Tenant/UserList/normalizeTenantUserStatus.js create mode 100644 src/components/Tenant/UserList/pickTenantOrgIdsFromForm.js create mode 100644 src/components/Tenant/UserList/userListUrlFilters.js create mode 100644 src/components/Tenant/doc/tenant-user-select-base.js create mode 100644 src/components/Tenant/doc/tenant-user-select-initial.js create mode 100644 src/components/Tenant/doc/tenant-user-select-multiple.js create mode 100644 src/components/Tenant/doc/tenant-user-select-status.js diff --git a/package.json b/package.json index 4f88228..a9aca5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kne-components/components-admin", - "version": "1.1.40", + "version": "1.1.41", "description": "用于实现一个后台管理系统的必要组件", "scripts": { "init": "husky", @@ -93,10 +93,12 @@ "@kne/react-icon": "^0.1.4", "@kne/react-intl": "^0.1.9", "@kne/react-org-chart": "^0.1.6", + "@kne/timeline": "^1.0.2", "@kne/token-storage": "^1.0.0", "@kne/use-control-value": "^0.1.9", "@kne/use-ref-callback": "^0.1.2", "@kne/use-refer-navigate": "^1.0.0", - "md5": "^2.3.0" + "md5": "^2.3.0", + "xlsx": "^0.18.5" } } diff --git a/src/components/Apis/getApis.js b/src/components/Apis/getApis.js index 652e811..12a9244 100644 --- a/src/components/Apis/getApis.js +++ b/src/components/Apis/getApis.js @@ -235,6 +235,10 @@ const getApis = options => { url: `${prefix}/tenant/admin/org-remove`, method: 'POST' }, + orgBatchImport: { + url: `${prefix}/tenant/admin/org-batch-import`, + method: 'POST' + }, userList: { url: `${prefix}/tenant/admin/user-list`, method: 'GET' @@ -321,6 +325,28 @@ const getApis = options => { method: 'POST' } }, + sharedGroup: { + list: { + url: `${prefix}/tenant/admin/shared-group/list`, + method: 'GET' + }, + create: { + url: `${prefix}/tenant/admin/shared-group/create`, + method: 'POST' + }, + save: { + url: `${prefix}/tenant/admin/shared-group/save`, + method: 'POST' + }, + setStatus: { + url: `${prefix}/tenant/admin/shared-group/set-status`, + method: 'POST' + }, + remove: { + url: `${prefix}/tenant/admin/shared-group/remove`, + method: 'POST' + } + }, permission: { list: { url: `${prefix}/tenant/admin/permission/list`, @@ -377,6 +403,10 @@ const getApis = options => { url: `${prefix}/tenant/org-remove`, method: 'POST' }, + orgBatchImport: { + url: `${prefix}/tenant/org-batch-import`, + method: 'POST' + }, userList: { url: `${prefix}/tenant/user-list`, method: 'GET' @@ -439,6 +469,28 @@ const getApis = options => { method: 'POST' } }, + sharedGroup: { + list: { + url: `${prefix}/tenant/shared-group/list`, + method: 'GET' + }, + create: { + url: `${prefix}/tenant/shared-group/create`, + method: 'POST' + }, + save: { + url: `${prefix}/tenant/shared-group/save`, + method: 'POST' + }, + setStatus: { + url: `${prefix}/tenant/shared-group/set-status`, + method: 'POST' + }, + remove: { + url: `${prefix}/tenant/shared-group/remove`, + method: 'POST' + } + }, permission: { list: { url: `${prefix}/tenant/permission/list`, diff --git a/src/components/BizUnit/index.js b/src/components/BizUnit/index.js index 8af6e96..17f3382 100644 --- a/src/components/BizUnit/index.js +++ b/src/components/BizUnit/index.js @@ -1,5 +1,5 @@ import { createWithRemoteLoader } from '@kne/remote-loader'; -import { useRef, useState, useEffect } from 'react'; +import { useRef, useState, useEffect, useMemo } from 'react'; import { Flex } from 'antd'; import useRefCallback from '@kne/use-ref-callback'; import merge from 'lodash/merge'; @@ -41,6 +41,7 @@ const BizUnit = createWithRemoteLoader({ }, keywordFilterName: 'keyword', keywordFilterLabel: formatMessage({ id: 'Keyword' }), + mapFilterValue: null, getFilterValue: filterValue => ({ params: { filter: filterValue @@ -53,7 +54,9 @@ const BizUnit = createWithRemoteLoader({ const ref = useRef(); const { SearchInput, getFilterValue } = Filter; const [filter, setFilter] = useState([]); - const filterValue = getFilterValue(filter); + const filterValue = options.mapFilterValue ? options.mapFilterValue(filter, getFilterValue) : getFilterValue(filter); + const filterParamsKey = useMemo(() => JSON.stringify(filterValue), [filterValue]); + const isFirstFilterEffect = useRef(true); const topOptions = ( {allowKeywordSearch && } @@ -104,12 +107,26 @@ const BizUnit = createWithRemoteLoader({ }); const handlerMount = useRefCallback(() => { - onMount && onMount({ filter: { value: filter, onChange: setFilter }, topOptions, tableOptions }); + onMount && + onMount({ + filter: { value: filter, onChange: setFilter }, + filterList, + topOptions, + tableOptions + }); }); useEffect(() => { handlerMount(); - }, [handlerMount]); + }, [handlerMount, filter]); + + useEffect(() => { + if (isFirstFilterEffect.current) { + isFirstFilterEffect.current = false; + return; + } + ref.current?.reload?.(); + }, [filterParamsKey]); if (typeof children === 'function') { return children({ filter: { value: filter, onChange: setFilter, list: filterList }, diff --git a/src/components/Signature/index.js b/src/components/Signature/index.js index 321c1b4..454eb54 100644 --- a/src/components/Signature/index.js +++ b/src/components/Signature/index.js @@ -6,6 +6,7 @@ import withLocale from './withLocale'; import { useIntl } from '@kne/react-intl'; import BizUnit from '@components/BizUnit'; import { useRef } from 'react'; +import TablePageRender from '../BizUnit/TablePageRender'; const VerifyAction = createWithRemoteLoader({ modules: ['components-core:FormInfo', 'components-core:FormInfo@useFormModal', 'components-core:Global@usePreset'] @@ -68,8 +69,7 @@ const VerifyAction = createWithRemoteLoader({ /> ) }); - }} - > + }}> {formatMessage({ id: 'Verify' })} ); @@ -82,98 +82,99 @@ const CreateButton = createWithRemoteLoader({ 'components-core:Global@usePreset', 'components-core:InfoPage@CentralContent' ] -})(({ remoteModules, onSuccess }) => { - const [FormInfo, useFormModal, usePreset, CentralContent] = remoteModules; - const { formatMessage } = useIntl(); - const { ajax, apis } = usePreset(); - const { TextArea } = FormInfo.fields; - const formModal = useFormModal(); - const { modal } = App.useApp(); +})( + withLocale(({ remoteModules, onSuccess }) => { + const [FormInfo, useFormModal, usePreset, CentralContent] = remoteModules; + const { formatMessage } = useIntl(); + const { ajax, apis } = usePreset(); + const { TextArea } = FormInfo.fields; + const formModal = useFormModal(); + const { modal } = App.useApp(); - return ( -