diff --git a/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php b/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php
index eb1c909dd1..223a4007a3 100644
--- a/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php
+++ b/Neos.Workspace.Ui/Classes/Controller/WorkspaceController.php
@@ -19,6 +19,7 @@
use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint;
use Neos\ContentRepository\Core\Feature\SubtreeTagging\Dto\SubtreeTag;
use Neos\ContentRepository\Core\Feature\WorkspaceCreation\Exception\WorkspaceAlreadyExists;
+use Neos\ContentRepository\Core\Feature\WorkspaceRebase\Dto\RebaseErrorHandlingStrategy;
use Neos\ContentRepository\Core\Feature\WorkspaceRebase\Exception\WorkspaceRebaseFailed;
use Neos\ContentRepository\Core\Projection\ContentGraph\Filter\FindAncestorNodesFilter;
use Neos\ContentRepository\Core\Projection\ContentGraph\Node;
@@ -706,6 +707,33 @@ public function discardWorkspaceAction(WorkspaceName $workspace): void
$this->forward('review', null, null, ['workspace' => $workspace->value]);
}
+ /**
+ * Rebase a workspace
+ */
+ public function rebaseAction(WorkspaceName $workspaceName, bool $force): void
+ {
+ $contentRepositoryId = SiteDetectionResult::fromRequest($this->request->getHttpRequest())->contentRepositoryId;
+
+ try {
+ $this->workspacePublishingService->rebaseWorkspace(
+ $contentRepositoryId,
+ $workspaceName,
+ $force ? RebaseErrorHandlingStrategy::STRATEGY_FORCE : RebaseErrorHandlingStrategy::STRATEGY_FAIL
+ );
+ $this->addFlashMessage($this->getModuleLabel('workspaces.workspaceHasBeenRebased'));
+ $this->forward('index');
+
+ } catch (WorkspaceRebaseFailed $e) {
+ if ($force) {
+ $this->addFlashMessage($this->getModuleLabel('workspaces.ForceRebaseWorkspaceFailed'));
+ $this->forward('index');
+ }
+ }
+ $this->response->addHttpHeader('HX-Retarget', '#popover-container');
+ $this->response->addHttpHeader('HX-ReSwap', 'innerHTML');
+ $this->view->assign('workspaceName', $workspaceName->value);
+ }
+
/**
* Computes the number of added, changed and removed nodes for the given workspace
*/
diff --git a/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Actions/Rebase.fusion b/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Actions/Rebase.fusion
new file mode 100644
index 0000000000..a2e4885cea
--- /dev/null
+++ b/Neos.Workspace.Ui/Resources/Private/Fusion/Features/Workspace/Actions/Rebase.fusion
@@ -0,0 +1,10 @@
+Neos.Workspace.Ui.WorkspaceController.rebase = Neos.Fusion:Component {
+ /// string
+ workspaceName = ${workspaceName}
+
+ renderer = afx`
+
{private.i18n.id('workspaces.dialog.thisCanLeadToLostChanges')}
+