From ecaf4566cd9af7113c1d10f4d994bdd78764f9c8 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 12 Jul 2026 15:54:58 +0200 Subject: [PATCH 1/3] feat: add role removal functionality for members and enhance role assignment logic --- .../ce/src/member/services/Member.service.ts | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/packages/ce/src/member/services/Member.service.ts b/src/packages/ce/src/member/services/Member.service.ts index 4a9f7aa4..5641b4b8 100644 --- a/src/packages/ce/src/member/services/Member.service.ts +++ b/src/packages/ce/src/member/services/Member.service.ts @@ -11,6 +11,7 @@ import { NamespacesMembersBulkInvitePayload, NamespacesMembersDeleteInput, NamespacesMembersDeletePayload, + NamespaceRole, Query, User } from "@code0-tech/sagittarius-graphql-types" import {GraphqlClient} from "@core/util/graphql-client" @@ -89,18 +90,39 @@ export class MemberService extends ReactiveArrayService m.id === payload.memberId) + if (currentMember && index >= 0) { + const newMember: NamespaceMember = { + ...currentMember, + roles: { + ...currentMember.roles, + count: payload.roleIds.length, + nodes: payload.roleIds.map(roleId => ({ id: roleId })) + } + } + + this.set(index, new View(newMember)) + } + } + + return result.data?.namespacesMembersAssignRoles ?? undefined + } + + removeRoleFromMembers(roleId: NamespaceRole['id']): void { + super.values().forEach((member, index) => { + if (!member?.roles?.nodes?.some(role => role?.id === roleId)) return + + const nodes = member.roles.nodes.filter(role => role?.id !== roleId) const newMember: NamespaceMember = { - ...currentMember, + ...member, roles: { - count: payload.roleIds.length, - nodes: payload.roleIds.map(roleId => ({ id: roleId })) + ...member.roles, + count: nodes.length, + nodes: nodes } } this.set(index, new View(newMember)) - } - - return result.data?.namespacesMembersAssignRoles ?? undefined + }) } async memberDelete(payload: NamespacesMembersDeleteInput): Promise { From bd60c4d461f132adc135302a14b0857704e51968 Mon Sep 17 00:00:00 2001 From: nicosammito Date: Sun, 12 Jul 2026 15:55:09 +0200 Subject: [PATCH 2/3] feat: update member data retrieval to include namespaceId for improved accuracy --- .../ce/src/member/components/MemberDataTableComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/ce/src/member/components/MemberDataTableComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableComponent.tsx index 90ba425c..222fde2f 100644 --- a/src/packages/ce/src/member/components/MemberDataTableComponent.tsx +++ b/src/packages/ce/src/member/components/MemberDataTableComponent.tsx @@ -37,7 +37,7 @@ export const MemberDataTableComponent: React.FC = const members = React.useMemo( () => memberService.values({namespaceId: namespaceId}), - [memberStore] + [memberStore, namespaceId] ) return Date: Sun, 12 Jul 2026 15:55:27 +0200 Subject: [PATCH 3/3] feat: update role deletion to remove role from associated members for improved data consistency --- .../ce/src/member/components/MemberDataTableRowComponent.tsx | 2 +- src/packages/ce/src/role/views/RoleDeleteView.tsx | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx b/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx index d731ce09..1ce67a0f 100644 --- a/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx +++ b/src/packages/ce/src/member/components/MemberDataTableRowComponent.tsx @@ -61,7 +61,7 @@ export const MemberDataTableRowComponent: React.FC member?.roles?.nodes?.map(role => roleService.getById(role?.id, {namespaceId: member?.namespace?.id})) || [], - [roleStore, member?.roles?.nodes?.length] + [roleStore, member] ) const [localAssignedRoles, setLocalAssignedRoles] = React.useState(assignedRoles) diff --git a/src/packages/ce/src/role/views/RoleDeleteView.tsx b/src/packages/ce/src/role/views/RoleDeleteView.tsx index eac55d88..85d8db88 100644 --- a/src/packages/ce/src/role/views/RoleDeleteView.tsx +++ b/src/packages/ce/src/role/views/RoleDeleteView.tsx @@ -4,6 +4,7 @@ import React from "react"; import {useParams, useRouter} from "next/navigation"; import {Button, Card, Flex, Spacing, Text, useService} from "@code0-tech/pictor"; import {RoleService} from "@edition/role/services/Role.service"; +import {MemberService} from "@edition/member/services/Member.service"; import type {NamespaceRole} from "@code0-tech/sagittarius-graphql-types"; import {TabContent} from "@code0-tech/pictor/dist/components/tab/Tab"; import {addIslandSuccessNotification} from "@code0-tech/pictor/dist/components/island/Island.hook"; @@ -13,6 +14,7 @@ export const RoleDeleteView: React.FC = () => { const params = useParams() const router = useRouter() const roleService = useService(RoleService) + const memberService = useService(MemberService) const [, startTransition] = React.useTransition() const namespaceIndex = params.namespaceId as any as number @@ -25,6 +27,7 @@ export const RoleDeleteView: React.FC = () => { namespaceRoleId: roleId }).then(payload => { if ((payload?.errors?.length ?? 0) <= 0) { + memberService.removeRoleFromMembers(roleId) addIslandSuccessNotification({ message: "Deleted role" })