From d01132842f75a9164c14dd8a7d1413ff75825c31 Mon Sep 17 00:00:00 2001 From: Janis Joderi Shoferi Date: Mon, 29 Jun 2026 12:31:06 +0200 Subject: [PATCH 1/2] Fixed: the selection for potential owners and responsible persons in the properties panel only displays users that are assigned to at least one role --- .../potentialOwner-server-action.ts | 19 ++++++++++++------- .../lib/data/db/iam/memberships.ts | 18 ------------------ src/management-system-v2/lib/data/users.tsx | 13 ++++++++++++- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts index 8639bc654..bed1302e8 100644 --- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts +++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts @@ -3,6 +3,8 @@ import { getCurrentEnvironment, getCurrentUser } from '@/components/auth'; import { getRolesWithMembers } from '@/lib/data/db/iam/roles'; import { RoleType, UserType } from './use-potentialOwner-store'; +import { getSpaceUsers } from '@/lib/data/users'; +import { isUserErrorResponse } from '@/lib/user-error'; export const fetchPotentialOwner = async (environmentId: string) => { const user: UserType = {}; @@ -12,16 +14,19 @@ export const fetchPotentialOwner = async (environmentId: string) => { if (activeEnvironment.isOrganization) { const rawRoles = await getRolesWithMembers(activeEnvironment.spaceId, ability); + const users = await getSpaceUsers(activeEnvironment.spaceId); - rawRoles.forEach((role) => { - roles[role.id] = role.name; - - role.members.forEach((member) => { - user[member.id] = { - userName: member.username, - name: member.firstName + ' ' + member.lastName, + if (!isUserErrorResponse(users)) { + users.forEach((u) => { + user[u.id] = { + userName: u.username || undefined, + name: (u.firstName + ' ' + u.lastName).trim(), }; }); + } + + rawRoles.forEach((role) => { + roles[role.id] = role.name; }); } else { // make sure to get the current user that might not be assigned to any role diff --git a/src/management-system-v2/lib/data/db/iam/memberships.ts b/src/management-system-v2/lib/data/db/iam/memberships.ts index b0f9780eb..0a3d1cbbf 100644 --- a/src/management-system-v2/lib/data/db/iam/memberships.ts +++ b/src/management-system-v2/lib/data/db/iam/memberships.ts @@ -111,24 +111,6 @@ export async function getFullMembersWithRoles(environmentId: string, ability?: A /** * Returns the users that exist in a specific space */ -export async function getUsersInSpace(spaceId: string, ability?: Ability) { - //TODO: ability check - if (ability) ability; - - const users = await db.user.findMany({ - where: { - memberIn: { - some: { - space: { - id: spaceId, - }, - }, - }, - }, - }); - - return users; -} export async function isMember( environmentId: string, diff --git a/src/management-system-v2/lib/data/users.tsx b/src/management-system-v2/lib/data/users.tsx index 98c194ba1..4359eeac8 100644 --- a/src/management-system-v2/lib/data/users.tsx +++ b/src/management-system-v2/lib/data/users.tsx @@ -1,7 +1,7 @@ 'use server'; import { getCurrentEnvironment, getCurrentUser } from '@/components/auth'; -import { UserErrorType, getErrorMessage, userError } from '../user-error'; +import { UserErrorType, getErrorMessage, permissionDenied, userError } from '../user-error'; import { AuthenticatedUserData, AuthenticatedUserDataSchema } from './user-schema'; import { ReactNode } from 'react'; import { OrganizationEnvironment } from './environment-schema'; @@ -12,6 +12,7 @@ import { updateUser as _updateUser, setUserPassword as _setUserPassword, getUserById, + getSpaceUsers as _getSpaceUsers, } from '@/lib/data/db/iam/users'; import { revalidatePath } from 'next/cache'; import { getEnvironmentById } from './db/iam/environments'; @@ -20,6 +21,16 @@ import { getAppliedRolesForUser } from '../authorization/organizationEnvironment import db from '@/lib/data/db/index'; import { env } from '../ms-config/env-vars'; +export async function getSpaceUsers(spaceId: string) { + const { ability, activeEnvironment } = await getCurrentEnvironment(spaceId); + + if (!ability.can('view', 'User')) return permissionDenied(); + + const users = await _getSpaceUsers(spaceId, activeEnvironment.isOrganization); + + return ability.filter('view', 'User', users); +} + export async function deleteUser() { const { userId } = await getCurrentUser(); From ba44b16a91425bddbf356dcfefce594df509c8a1 Mon Sep 17 00:00:00 2001 From: Janis Joderi Shoferi Date: Mon, 29 Jun 2026 14:20:25 +0200 Subject: [PATCH 2/2] Show "All Users" and "All Roles" instead of just "User" and "Roles" when all users or roles are selected in the "Possible Performers" and "Responsible Persons" input in the properties panel --- .../[mode]/[processId]/potential-owner.tsx | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potential-owner.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potential-owner.tsx index b5213753d..65adf0b06 100644 --- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potential-owner.tsx +++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potential-owner.tsx @@ -1,6 +1,6 @@ import React, { FC, useEffect, useState } from 'react'; import type { ElementLike } from 'diagram-js/lib/core/Types'; -import { Divider, Space, Tooltip, Button, Cascader } from 'antd'; +import { Divider, Space, Tooltip, Button, Cascader, Tag, Select } from 'antd'; import { UserOutlined, TeamOutlined, QuestionCircleOutlined } from '@ant-design/icons'; import { BPMNCanvasRef } from '@/components/bpmn-canvas'; import type { CascaderProps, GetProp } from 'antd'; @@ -105,6 +105,23 @@ function updateResource( } } +const customTagRender: React.ComponentProps['tagRender'] = ({ + label, + value, + ...rest +}) => { + if (value === 'all-user') { + label = 'All Users'; + } else if (value === 'all-roles') { + label = 'All Roles'; + } + return ( + + {label} + + ); +}; + const filter = (inputValue: string, path: DefaultOptionType[]) => path.some((option) => `${option?.value}`.toLowerCase().indexOf(inputValue.toLowerCase()) > -1); @@ -165,6 +182,7 @@ export const PotentialOwner: FC = ({ placeholder="Select User or Roles that can claim this task" style={{ width: '100%' }} multiple + tagRender={customTagRender} showSearch={{ filter }} // @ts-ignore onChange={setPotentialOwner} @@ -243,6 +261,7 @@ export const ResponsibleParty: FC = ({ placeholder="Select User or Roles responsible" style={{ width: '100%' }} multiple + tagRender={customTagRender} showSearch={{ filter }} // @ts-ignore onChange={setResponsible}