diff --git a/contracts/admin-openapi.json b/contracts/admin-openapi.json index dc41c8b..2f6df9d 100644 --- a/contracts/admin-openapi.json +++ b/contracts/admin-openapi.json @@ -8875,9 +8875,13 @@ }, "ApiPageManager": { "type": "object", - "required": ["items", "page", "pageSize", "total", "bdLeaderInviteScopePolicy"], + "required": ["items", "page", "pageSize", "total", "managerOperationScopePolicy"], "properties": { "bdLeaderInviteScopePolicy": { + "$ref": "#/components/schemas/ManagerRoleScopePolicy", + "deprecated": true + }, + "managerOperationScopePolicy": { "$ref": "#/components/schemas/ManagerRoleScopePolicy" }, "items": { @@ -10117,12 +10121,16 @@ }, "ManagerRoleScopePolicy": { "type": "object", - "required": ["baseScope", "regionExpansionConfigurable"], + "required": ["baseScope", "expandedScope", "regionExpansionConfigurable"], "properties": { "baseScope": { "type": "string", "enum": ["country", "region", "global"] }, + "expandedScope": { + "type": "string", + "enum": ["country", "region", "global"] + }, "regionExpansionConfigurable": { "type": "boolean" } @@ -10145,17 +10153,35 @@ "type": "boolean" }, "canAddBdLeaderInRegion": { + "type": "boolean", + "deprecated": true + }, + "canManageCrossRegion": { "type": "boolean" }, "bdLeaderInviteBaseScope": { "type": "string", - "enum": ["country", "region", "global"] + "enum": ["country", "region", "global"], + "deprecated": true }, "bdLeaderInviteEffectiveScope": { "type": "string", - "enum": ["country", "region", "global"] + "enum": ["country", "region", "global"], + "deprecated": true }, "bdLeaderRegionExpansionConfigurable": { + "type": "boolean", + "deprecated": true + }, + "managerOperationBaseScope": { + "type": "string", + "enum": ["country", "region", "global"] + }, + "managerOperationEffectiveScope": { + "type": "string", + "enum": ["country", "region", "global"] + }, + "managerCrossRegionConfigurable": { "type": "boolean" }, "canAddSuperadmin": { @@ -10669,6 +10695,10 @@ "type": "boolean" }, "canAddBdLeaderInRegion": { + "type": "boolean", + "deprecated": true + }, + "canManageCrossRegion": { "type": "boolean" }, "canAddSuperadmin": { @@ -10714,6 +10744,10 @@ "type": "boolean" }, "canAddBdLeaderInRegion": { + "type": "boolean", + "deprecated": true + }, + "canManageCrossRegion": { "type": "boolean" }, "canAddSuperadmin": { diff --git a/src/features/host-org/api.test.ts b/src/features/host-org/api.test.ts index 766b13b..67447be 100644 --- a/src/features/host-org/api.test.ts +++ b/src/features/host-org/api.test.ts @@ -69,7 +69,7 @@ test("host org list APIs use generated admin paths and filters", async () => { status: "active", }); await createManager({ - canAddBdLeaderInRegion: false, + canManageCrossRegion: false, canBlockUser: false, canGrantBadge: false, canGrantVip: true, @@ -77,7 +77,7 @@ test("host org list APIs use generated admin paths and filters", async () => { targetUserId: "1003", }); await updateManager("1003", { - canAddBdLeaderInRegion: true, + canManageCrossRegion: true, canBlockUser: false, canGrantVehicle: true, canGrantVip: false, @@ -160,7 +160,7 @@ test("host org list APIs use generated admin paths and filters", async () => { expect(String(managerCreateUrl)).toContain("/api/v1/admin/managers"); expect(managerCreateInit?.method).toBe("POST"); expect(JSON.parse(String(managerCreateInit?.body))).toEqual({ - canAddBdLeaderInRegion: false, + canManageCrossRegion: false, canBlockUser: false, canGrantBadge: false, canGrantVip: true, @@ -170,7 +170,7 @@ test("host org list APIs use generated admin paths and filters", async () => { expect(String(managerUpdateUrl)).toContain("/api/v1/admin/managers/1003"); expect(managerUpdateInit?.method).toBe("PUT"); expect(JSON.parse(String(managerUpdateInit?.body))).toEqual({ - canAddBdLeaderInRegion: true, + canManageCrossRegion: true, canBlockUser: false, canGrantVehicle: true, canGrantVip: false, diff --git a/src/features/host-org/hooks/useHostManagersPage.js b/src/features/host-org/hooks/useHostManagersPage.js index 29ed8e7..0fc03aa 100644 --- a/src/features/host-org/hooks/useHostManagersPage.js +++ b/src/features/host-org/hooks/useHostManagersPage.js @@ -17,25 +17,28 @@ export const managerPermissionFields = [ "canGrantVip", "canUpdateUserLevel", "canAddBdLeader", - "canAddBdLeaderInRegion", + "canManageCrossRegion", "canAddAdmin", "canAddSuperadmin", "canBlockUser", "canTransferUserCountry", ]; -const managerPermissionDefault = (field) => field !== "canAddBdLeaderInRegion"; +const managerPermissionDefault = (field) => field !== "canManageCrossRegion"; const managerPermissionEnabled = (source, field) => { - const value = source?.[field]; + const value = + field === "canManageCrossRegion" + ? (source?.canManageCrossRegion ?? source?.canAddBdLeaderInRegion) + : source?.[field]; return value === undefined || value === null ? managerPermissionDefault(field) : value !== false; }; const emptyPermissions = () => Object.fromEntries(managerPermissionFields.map((field) => [field, managerPermissionDefault(field)])); -const emptyManagerForm = (regionExpansionConfigurable = false) => ({ - bdLeaderRegionExpansionConfigurable: regionExpansionConfigurable, +const emptyManagerForm = (crossRegionConfigurable = false) => ({ + managerCrossRegionConfigurable: crossRegionConfigurable, contact: "", targetUserId: "", ...emptyPermissions(), @@ -51,7 +54,8 @@ const managerStatusPayload = (item, status) => ({ }); const managerFormFromItem = (item) => ({ - bdLeaderRegionExpansionConfigurable: item?.bdLeaderRegionExpansionConfigurable === true, + managerCrossRegionConfigurable: + item?.managerCrossRegionConfigurable === true || item?.bdLeaderRegionExpansionConfigurable === true, contact: item?.contact || "", targetUserId: String(item?.userId || ""), ...Object.fromEntries(managerPermissionFields.map((field) => [field, managerPermissionEnabled(item, field)])), @@ -133,7 +137,7 @@ export function useHostManagersPage() { }); showToast("经理已添加", "success"); } - setManagerForm(emptyManagerForm(data.bdLeaderInviteScopePolicy?.regionExpansionConfigurable === true)); + setManagerForm(emptyManagerForm(managerCrossRegionConfigurable(data))); setActiveAction(""); setEditingManager(null); await reload(); @@ -147,12 +151,12 @@ export function useHostManagersPage() { const closeAction = () => { setActiveAction(""); setEditingManager(null); - setManagerForm(emptyManagerForm(data.bdLeaderInviteScopePolicy?.regionExpansionConfigurable === true)); + setManagerForm(emptyManagerForm(managerCrossRegionConfigurable(data))); }; const openManagerForm = () => { setEditingManager(null); - setManagerForm(emptyManagerForm(data.bdLeaderInviteScopePolicy?.regionExpansionConfigurable === true)); + setManagerForm(emptyManagerForm(managerCrossRegionConfigurable(data))); setActiveAction("manager"); }; @@ -206,3 +210,10 @@ export function useHostManagersPage() { userFilter, }; } + +function managerCrossRegionConfigurable(data) { + return ( + data?.managerOperationScopePolicy?.regionExpansionConfigurable === true || + data?.bdLeaderInviteScopePolicy?.regionExpansionConfigurable === true + ); +} diff --git a/src/features/host-org/pages/HostManagersPage.jsx b/src/features/host-org/pages/HostManagersPage.jsx index d7a6b29..e71a6ef 100644 --- a/src/features/host-org/pages/HostManagersPage.jsx +++ b/src/features/host-org/pages/HostManagersPage.jsx @@ -22,7 +22,7 @@ const managerPermissionOptions = [ { key: "canGrantVip", label: "VIP" }, { key: "canUpdateUserLevel", label: "升级等级" }, { key: "canAddBdLeader", label: "BD Leader" }, - { key: "canAddBdLeaderInRegion", label: "区域邀请 BD Leader", regionExpansionOnly: true }, + { key: "canManageCrossRegion", label: "跨区经理", crossRegionOnly: true }, { key: "canAddAdmin", label: "Admin" }, { key: "canAddSuperadmin", label: "Superadmin" }, { key: "canBlockUser", label: "Block User" }, @@ -205,12 +205,14 @@ function ManagerPermissions({ item }) { {managerPermissionOptions .filter( (permission) => - !permission.regionExpansionOnly || item?.bdLeaderRegionExpansionConfigurable === true, + !permission.crossRegionOnly || + item?.managerCrossRegionConfigurable === true || + item?.bdLeaderRegionExpansionConfigurable === true, ) .map((permission) => { const enabled = - permission.key === "canAddBdLeaderInRegion" - ? item?.[permission.key] === true + permission.key === "canManageCrossRegion" + ? (item?.canManageCrossRegion ?? item?.canAddBdLeaderInRegion) === true : item?.[permission.key] !== false; return ( - !permission.regionExpansionOnly || form?.bdLeaderRegionExpansionConfigurable === true, + !permission.crossRegionOnly || form?.managerCrossRegionConfigurable === true, ) .map((permission) => (