diff --git a/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php b/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php index 08333636bec..29c58667e57 100644 --- a/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php +++ b/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php @@ -277,7 +277,7 @@ public function createAction( /** * Edit a workspace * - * Renders /Resource/Private/Fusion/Views/Edit.fusion + * @param WorkspaceName $workspaceName The name of the workspace that is being edited */ public function editAction(WorkspaceName $workspaceName): void { @@ -318,8 +318,10 @@ public function editAction(WorkspaceName $workspaceName): void * Update a workspace * * @Flow\Validate(argumentName="title", type="\Neos\Flow\Validation\Validator\NotEmptyValidator") + * @param WorkspaceName $workspaceName The name of the workspace that is being updated * @param WorkspaceTitle $title Human friendly title of the workspace, for example "Christmas Campaign" * @param WorkspaceDescription $description A description explaining the purpose of the new workspace + * @param WorkspaceName $baseWorkspace A description explaining the purpose of the new workspace */ public function updateAction( WorkspaceName $workspaceName, @@ -651,6 +653,7 @@ public function confirmPublishAllChangesAction(WorkspaceName $workspaceName): vo 'workspaceTitle' => $workspaceMetadata->title->value, ]); } + public function confirmDiscardAllChangesAction(WorkspaceName $workspaceName): void { $contentRepositoryId = SiteDetectionResult::fromRequest($this->request->getHttpRequest())->contentRepositoryId; @@ -693,6 +696,7 @@ public function confirmPublishSelectedChangesAction(WorkspaceName $workspaceName 'baseWorkspaceTitle' => $baseWorkspaceMetadata->title->value, ]); } + public function confirmDiscardSelectedChangesAction(WorkspaceName $workspaceName): void { $contentRepositoryId = SiteDetectionResult::fromRequest($this->request->getHttpRequest())->contentRepositoryId; @@ -1246,6 +1250,10 @@ protected function getWorkspaceListItems( // todo this throws "No workspace is assigned to the user with id" for the case user logs first into workspace module before workspace exists!!! $userWorkspace = $this->workspaceService->getPersonalWorkspaceForUser($contentRepository->id, $userWorkspaceOwner->getId()); $userWorkspaceMetadata = $this->workspaceService->getWorkspaceMetadata($contentRepository->id, $userWorkspace->workspaceName); + $workspaceRoleAssignments = $this->workspaceService->getWorkspaceRoleAssignments( + $contentRepository->id, + $userWorkspace->workspaceName + ); $userWorkspacesPermissions = $this->authorizationService->getWorkspacePermissions( $contentRepository->id, $userWorkspace->workspaceName, @@ -1265,11 +1273,13 @@ protected function getWorkspaceListItems( !$allWorkspaces->getDependantWorkspaces($userWorkspace->workspaceName)->isEmpty(), $userWorkspaceOwner->getLabel(), $userWorkspacesPermissions, + $workspaceRoleAssignments, ); // add other, accessible workspaces foreach ($allWorkspaces as $workspace) { $workspaceMetadata = $this->workspaceService->getWorkspaceMetadata($contentRepository->id, $workspace->workspaceName); + $workspaceRoleAssignments = $this->workspaceService->getWorkspaceRoleAssignments($contentRepository->id, $workspace->workspaceName); $workspacesPermissions = $this->authorizationService->getWorkspacePermissions( $contentRepository->id, $workspace->workspaceName, @@ -1303,6 +1313,7 @@ protected function getWorkspaceListItems( !$allWorkspaces->getDependantWorkspaces($workspace->workspaceName)->isEmpty(), $workspaceOwner?->getLabel(), $workspacesPermissions, + $workspaceRoleAssignments, ); } return WorkspaceListItems::fromArray($workspaceListItems); diff --git a/Neos.Workspace.Ui/Classes/ViewModel/WorkspaceListItem.php b/Neos.Workspace.Ui/Classes/ViewModel/WorkspaceListItem.php index 248357a1e83..10faa8443bd 100644 --- a/Neos.Workspace.Ui/Classes/ViewModel/WorkspaceListItem.php +++ b/Neos.Workspace.Ui/Classes/ViewModel/WorkspaceListItem.php @@ -15,7 +15,10 @@ namespace Neos\Workspace\Ui\ViewModel; use Neos\Flow\Annotations as Flow; +use Neos\Neos\Domain\Model\WorkspaceClassification; use Neos\Neos\Domain\Model\WorkspacePermissions; +use Neos\Neos\Domain\Model\WorkspaceRole; +use Neos\Neos\Domain\Model\WorkspaceRoleAssignments; #[Flow\Proxy(false)] final readonly class WorkspaceListItem @@ -33,6 +36,39 @@ public function __construct( // todo check if necessary, only for personal workspaces that others have permissions to public ?string $owner, public WorkspacePermissions $permissions, + public WorkspaceRoleAssignments $roleAssignments, ) { } + + public function isPersonal(): bool + { + return $this->classification === WorkspaceClassification::PERSONAL->value; + } + + public function isPrivate(): bool + { + if ($this->classification !== WorkspaceClassification::SHARED->value || + $this->roleAssignments->count() > 1) { + return false; + } + foreach ($this->roleAssignments as $roleAssignment) { + if ($roleAssignment->role === WorkspaceRole::COLLABORATOR) { + return false; + } + } + return true; + } + + public function isShared(): bool + { + if ($this->roleAssignments->count() > 1) { + return true; + } + foreach ($this->roleAssignments as $roleAssignment) { + if ($roleAssignment->role === WorkspaceRole::COLLABORATOR) { + return true; + } + } + return false; + } } diff --git a/Neos.Workspace.Ui/Resources/Private/Fusion/Common/Presentationals/Icon.fusion b/Neos.Workspace.Ui/Resources/Private/Fusion/Common/Presentationals/Icon.fusion index 321236dd664..756dedff4ac 100644 --- a/Neos.Workspace.Ui/Resources/Private/Fusion/Common/Presentationals/Icon.fusion +++ b/Neos.Workspace.Ui/Resources/Private/Fusion/Common/Presentationals/Icon.fusion @@ -3,6 +3,7 @@ prototype(Neos.Workspace.Ui:Component.Icon) < prototype(Neos.Fusion:Component) { secondaryIcon = '' spin = false rotate = false + // TODO: Support colors style = '' renderer = afx` diff --git a/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Components/WorkspaceTableRow.fusion b/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Components/WorkspaceTableRow.fusion index e2b231a0d8c..04899315a5a 100644 --- a/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Components/WorkspaceTableRow.fusion +++ b/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Components/WorkspaceTableRow.fusion @@ -13,24 +13,13 @@ prototype(Neos.Workspace.Ui:Component.WorkspaceTableRow) < prototype(Neos.Fusion i18n = ${I18n.id('').source('Main').package('Neos.Workspace.Ui')} workspace = ${props.workspaceListItem.workspace} workspaceTableRowId = ${'workspace-row-' + props.workspaceListItem.name} - // todo move state calculation to php workspaceStatus = Neos.Fusion:Case { - personal-workspace { - condition = ${props.workspaceListItem.name == props.userWorkspaceName} - renderer = 'personal-workspace' - } - stale { - // TODO: Calculate stale status based on last change data - condition = false - renderer = 'stale' - } - withAcl { - // TODO: Calculate acl status on whether the workspace is shared with selected users - condition = false - renderer = 'with-acl' + personal { + condition = ${props.workspaceListItem.personal} + renderer = 'personal' } private { - condition = ${props.workspaceListItem.owner} + condition = ${props.workspaceListItem.private} renderer = 'private' } default { @@ -39,18 +28,16 @@ prototype(Neos.Workspace.Ui:Component.WorkspaceTableRow) < prototype(Neos.Fusion } } workspaceStatusLabel = Neos.Fusion:Match { - // todo status private doesnt exist anymore @subject = ${private.workspaceStatus} - @default = ${private.i18n.id('table.column.access.internal').value('Internal workspace')} - personal-workspace = ${private.i18n.id('badge.isPersonalWorkspace').value('This is your personal workspace')} - stale = ${private.i18n.id('badge.isStale').value('This workspace has not been used for a long time')} - with-acl = ${private.i18n.id('table.column.access.acl').value('This workspace is owned by ' + props.workspaceListItem.owner + ' but allows access to additional users')} - private = ${private.i18n.id('table.column.access.private').value('This workspace is owned by ' + props.workspaceListItem.owner)} + @default = ${private.i18n.id('table.column.access.shared')} + personal = ${private.i18n.id('table.column.access.personal').arguments([props.workspaceListItem.owner])} + private = ${private.i18n.id('table.column.access.private')} } workspaceStatusIcon = Neos.Fusion:Match { @subject = ${private.workspaceStatus} @default = 'user' shared = 'users' + private = 'user-shield' with-acl = 'user-plus' } reviewWorkspaceUri = Neos.Fusion:ActionUri { diff --git a/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Modals/Create.fusion b/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Modals/Create.fusion index 1688e9c5ddf..6ca1a371958 100644 --- a/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Modals/Create.fusion +++ b/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Modals/Create.fusion @@ -91,10 +91,10 @@ prototype(Neos.Workspace.Ui:Component.Modal.Create) < prototype(Neos.Fusion:Comp field.name="visibility" field.value="shared" > - {private.i18n.id('workspaces.workspace.visibility.internal')} + {private.i18n.id('workspaces.workspace.visibility.shared')}
- {private.i18n.id('workspaces.workspace.visibility.internal.help')} + {private.i18n.id('workspaces.workspace.visibility.shared.help')}
- {private.i18n.id('workspaces.workspace.visibility.internal.help')} + {private.i18n.id('workspaces.workspace.visibility.shared.help')}