Skip to content

Commit 288d75c

Browse files
committed
Merge remote-tracking branch 'origin/8.3' into 8.4
2 parents f45852f + 700a39f commit 288d75c

File tree

21 files changed

+199
-64
lines changed

21 files changed

+199
-64
lines changed
Binary file not shown.
Binary file not shown.

Classes/Controller/BackendServiceController.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,15 +575,17 @@ function ($contextPath) {
575575
$result = $nodeInfoHelper->renderNodes(
576576
array_filter($flowQuery->get()),
577577
$this->getControllerContext(),
578-
true
578+
true,
579+
($finisher['payload']['usage'] ?? 'ALL') !== 'PAGE_TREE',
579580
);
580581
break;
581582
case 'getForTreeWithParents':
582583
$nodeTypeFilter = $finisher['payload']['nodeTypeFilter'] ?? null;
583584
$result = $nodeInfoHelper->renderNodesWithParents(
584585
array_filter($flowQuery->get()),
585586
$this->getControllerContext(),
586-
$nodeTypeFilter
587+
$nodeTypeFilter,
588+
($finisher['payload']['usage'] ?? 'ALL') !== 'PAGE_TREE',
587589
);
588590
break;
589591
}

Classes/Domain/Model/Changes/AbstractCopy.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ protected function finish(NodeInterface $node): void
3434
{
3535
$updateNodeInfo = new UpdateNodeInfo();
3636
$updateNodeInfo->setNode($node);
37-
$updateNodeInfo->recursive();
3837
$this->feedbackCollection->add($updateNodeInfo);
3938
$this->addNodeCreatedFeedback($node);
4039
parent::finish($node);

Classes/Domain/Model/Changes/Property.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public function setNodeDomAddress(?RenderedNodeDomAddress $nodeDomAddress = null
117117
/**
118118
* Get the node dom address
119119
*
120-
* @return RenderedNodeDomAddress
120+
* @return ?RenderedNodeDomAddress
121121
*/
122122
public function getNodeDomAddress()
123123
{
@@ -232,7 +232,9 @@ public function apply()
232232

233233
$reloadIfChangedConfigurationPath = sprintf('properties.%s.ui.reloadIfChanged', $propertyName);
234234
if (!$this->getIsInline() && $node->getNodeType()->getConfiguration($reloadIfChangedConfigurationPath)) {
235-
if ($this->getNodeDomAddress() && $this->getNodeDomAddress()->getFusionPath()
235+
if (!$this->getNodeDomAddress()) {
236+
$this->reloadDocument($node);
237+
} elseif ($this->getNodeDomAddress()->getFusionPath()
236238
&& $node->getNodeType()->isOfType('Neos.Neos:Content')
237239
&& $node->getParent()->getNodeType()->isOfType('Neos.Neos:ContentCollection')
238240
) {

Classes/Fusion/Helper/NodeInfoHelper.php

Lines changed: 117 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
* source code.
1212
*/
1313

14+
use GuzzleHttp\Psr7\Uri;
1415
use Neos\ContentRepository\Domain\Model\Node;
1516
use Neos\ContentRepository\Domain\Model\NodeInterface;
1617
use Neos\ContentRepository\Domain\Service\ContextFactoryInterface;
17-
use Neos\ContentRepository\Domain\Utility\NodePaths;
18+
use Neos\ContentRepository\Domain\Service\NodeTypeManager;
1819
use Neos\Eel\ProtectedContextAwareInterface;
1920
use Neos\Flow\Annotations as Flow;
21+
use Neos\Flow\Http\Helper\UriHelper;
2022
use Neos\Flow\Mvc\Controller\ControllerContext;
2123
use Neos\Flow\Persistence\PersistenceManagerInterface;
2224
use Neos\Neos\Domain\Service\ContentContext;
@@ -97,6 +99,17 @@ class NodeInfoHelper implements ProtectedContextAwareInterface
9799
*/
98100
protected $ignoredNodeTypeRole;
99101

102+
/**
103+
* @Flow\Inject
104+
* @var NodeTypeManager
105+
*/
106+
protected $nodeTypeManager;
107+
108+
/**
109+
* @var array<string, string>
110+
*/
111+
protected array $sitePreviewUris = [];
112+
100113
/**
101114
* @param NodeInterface $node
102115
* @param ?ControllerContext $controllerContext
@@ -107,20 +120,32 @@ class NodeInfoHelper implements ProtectedContextAwareInterface
107120
*/
108121
public function renderNode(NodeInterface $node, ?ControllerContext $controllerContext = null, $omitMostPropertiesForTreeState = false, $nodeTypeFilterOverride = null)
109122
{
123+
$includedNodeTypes = $this->getIncludedNodeTypes($controllerContext, $nodeTypeFilterOverride);
110124
return ($omitMostPropertiesForTreeState ?
111-
$this->renderNodeWithMinimalPropertiesAndChildrenInformation($node, $controllerContext, $nodeTypeFilterOverride) :
125+
$this->renderNodeWithMinimalPropertiesAndChildrenInformation(
126+
$node,
127+
$controllerContext,
128+
$this->buildNodeTypeFilterString(
129+
$includedNodeTypes,
130+
$this->nodeTypeStringsToList($this->ignoredNodeTypeRole)
131+
),
132+
$this->shouldIncludeContentChildNodes($includedNodeTypes)
133+
) :
112134
$this->renderNodeWithPropertiesAndChildrenInformation($node, $controllerContext, $nodeTypeFilterOverride)
113135
);
114136
}
115137

116138
/**
117139
* @param NodeInterface $node
118140
* @param ControllerContext|null $controllerContext
119-
* @param ?string $nodeTypeFilterOverride
120141
* @return array|null
121142
*/
122-
public function renderNodeWithMinimalPropertiesAndChildrenInformation(NodeInterface $node, ?ControllerContext $controllerContext = null, ?string $nodeTypeFilterOverride = null)
123-
{
143+
public function renderNodeWithMinimalPropertiesAndChildrenInformation(
144+
NodeInterface $node,
145+
?ControllerContext $controllerContext = null,
146+
string $nodeTypeFilter = '',
147+
bool $includeContentChildNodes = false
148+
) {
124149
if (!$this->nodePolicyService->isNodeTreePrivilegeGranted($node)) {
125150
return null;
126151
}
@@ -137,15 +162,9 @@ public function renderNodeWithMinimalPropertiesAndChildrenInformation(NodeInterf
137162

138163
if ($controllerContext !== null) {
139164
$nodeInfo = array_merge($nodeInfo, $this->getUriInformation($node, $controllerContext));
140-
if ($controllerContext->getRequest()->hasArgument('presetBaseNodeType')) {
141-
$presetBaseNodeType = $controllerContext->getRequest()->getArgument('presetBaseNodeType');
142-
}
143165
}
144166

145-
$baseNodeType = $nodeTypeFilterOverride ? $nodeTypeFilterOverride : (isset($presetBaseNodeType) ? $presetBaseNodeType : $this->defaultBaseNodeType);
146-
$nodeTypeFilter = $this->buildNodeTypeFilterString($this->nodeTypeStringsToList($baseNodeType), $this->nodeTypeStringsToList($this->ignoredNodeTypeRole));
147-
148-
$nodeInfo['children'] = $this->renderChildrenInformation($node, $nodeTypeFilter);
167+
$nodeInfo['children'] = $this->renderChildrenInformation($node, $nodeTypeFilter, $includeContentChildNodes);
149168

150169
$this->userLocaleService->switchToUILocale(true);
151170

@@ -200,7 +219,7 @@ protected function getUriInformation(NodeInterface $node, ControllerContext $con
200219
}
201220

202221
try {
203-
$nodeInfo['uri'] = $this->uri($node, $controllerContext);
222+
$nodeInfo['uri'] = $this->previewUri($node, $controllerContext);
204223
} catch (\Neos\Neos\Exception $exception) {
205224
// Unless there is a serious problem with routes there shouldn't be an exception ever.
206225
$nodeInfo['uri'] = '';
@@ -239,12 +258,16 @@ protected function getBasicNodeInformation(NodeInterface $node): array
239258
* @param string $nodeTypeFilterString
240259
* @return array
241260
*/
242-
protected function renderChildrenInformation(NodeInterface $node, string $nodeTypeFilterString): array
261+
protected function renderChildrenInformation(NodeInterface $node, string $nodeTypeFilterString, bool $includeContentChildNodes = true): array
243262
{
244263
$documentChildNodes = $node->getChildNodes($nodeTypeFilterString);
245-
// child nodes for content tree, must not include those nodes filtered out by `baseNodeType`
246-
$contentChildNodes = $node->getChildNodes($this->buildContentChildNodeFilterString());
247-
$childNodes = array_merge($documentChildNodes, $contentChildNodes);
264+
if ($includeContentChildNodes) {
265+
// child nodes for content tree, must not include those nodes filtered out by `baseNodeType`
266+
$contentChildNodes = $node->getChildNodes($this->buildContentChildNodeFilterString());
267+
$childNodes = array_merge($documentChildNodes, $contentChildNodes);
268+
} else {
269+
$childNodes = $documentChildNodes;
270+
}
248271

249272
$mapper = static function (NodeInterface $childNode) {
250273
return [
@@ -262,14 +285,43 @@ protected function renderChildrenInformation(NodeInterface $node, string $nodeTy
262285
* @param bool $omitMostPropertiesForTreeState
263286
* @return array
264287
*/
265-
public function renderNodes(array $nodes, ControllerContext $controllerContext, $omitMostPropertiesForTreeState = false): array
288+
public function renderNodes(
289+
array $nodes,
290+
ControllerContext $controllerContext,
291+
$omitMostPropertiesForTreeState = false,
292+
bool $includeContentChildNodes = true
293+
): array {
294+
if ($omitMostPropertiesForTreeState) {
295+
$includedNodeTypes = $this->getIncludedNodeTypes($controllerContext);
296+
$nodeTypeFilterString = $this->buildNodeTypeFilterString(
297+
$includedNodeTypes,
298+
$this->nodeTypeStringsToList($this->ignoredNodeTypeRole)
299+
);
300+
$renderedNodes = array_map(function ($node) use ($controllerContext, $includeContentChildNodes, $nodeTypeFilterString) {
301+
return $this->renderNodeWithMinimalPropertiesAndChildrenInformation(
302+
$node,
303+
$controllerContext,
304+
$nodeTypeFilterString,
305+
$includeContentChildNodes
306+
);
307+
}, $nodes);
308+
} else {
309+
$renderedNodes = array_map(function ($node) use ($controllerContext) {
310+
return $this->renderNodeWithPropertiesAndChildrenInformation($node, $controllerContext);
311+
}, $nodes);
312+
}
313+
314+
return array_values(array_filter($renderedNodes));
315+
}
316+
317+
protected function getIncludedNodeTypes(?ControllerContext $controllerContext, string $nodeTypeFilterOverride = null): array
266318
{
267-
$methodName = $omitMostPropertiesForTreeState ? 'renderNodeWithMinimalPropertiesAndChildrenInformation' : 'renderNodeWithPropertiesAndChildrenInformation';
268-
$mapper = function (NodeInterface $node) use ($controllerContext, $methodName) {
269-
return $this->$methodName($node, $controllerContext);
270-
};
319+
if ($controllerContext?->getRequest()->hasArgument('presetBaseNodeType')) {
320+
$presetBaseNodeType = $controllerContext?->getRequest()->getArgument('presetBaseNodeType');
321+
}
271322

272-
return array_values(array_filter(array_map($mapper, $nodes)));
323+
$baseNodeType = $nodeTypeFilterOverride ?: $presetBaseNodeType ?? $this->defaultBaseNodeType;
324+
return $this->nodeTypeStringsToList($baseNodeType);
273325
}
274326

275327
/**
@@ -278,17 +330,29 @@ public function renderNodes(array $nodes, ControllerContext $controllerContext,
278330
* @param null|string $nodeTypeFilter
279331
* @return array
280332
*/
281-
public function renderNodesWithParents(array $nodes, ControllerContext $controllerContext, ?string $nodeTypeFilter = null): array
282-
{
333+
public function renderNodesWithParents(
334+
array $nodes,
335+
ControllerContext $controllerContext,
336+
?string $nodeTypeFilter = null,
337+
bool $includeContentChildNodes = true
338+
): array {
283339
// For search operation we want to include all nodes, not respecting the "baseNodeType" setting
284340
$baseNodeTypeOverride = $this->documentNodeTypeRole;
285341
$renderedNodes = [];
342+
$includedNodeTypes = $this->getIncludedNodeTypes($controllerContext, $nodeTypeFilter ?? $baseNodeTypeOverride);
343+
$excludedNodeTypes = $this->nodeTypeStringsToList($this->ignoredNodeTypeRole);
344+
$nodeTypeFilterString = $this->buildNodeTypeFilterString($includedNodeTypes, $excludedNodeTypes);
286345

287346
/** @var NodeInterface $node */
288347
foreach ($nodes as $node) {
289348
if (array_key_exists($node->getPath(), $renderedNodes)) {
290349
$renderedNodes[$node->getPath()]['matched'] = true;
291-
} elseif ($renderedNode = $this->renderNodeWithMinimalPropertiesAndChildrenInformation($node, $controllerContext, $nodeTypeFilter ?? $baseNodeTypeOverride)) {
350+
} elseif ($renderedNode = $this->renderNodeWithMinimalPropertiesAndChildrenInformation(
351+
$node,
352+
$controllerContext,
353+
$nodeTypeFilterString,
354+
$includeContentChildNodes
355+
)) {
292356
$renderedNode['matched'] = true;
293357
$renderedNodes[$node->getPath()] = $renderedNode;
294358
} else {
@@ -311,7 +375,12 @@ public function renderNodesWithParents(array $nodes, ControllerContext $controll
311375
if (array_key_exists($parentNode->getPath(), $renderedNodes)) {
312376
$renderedNodes[$parentNode->getPath()]['intermediate'] = true;
313377
} else {
314-
$renderedParentNode = $this->renderNodeWithMinimalPropertiesAndChildrenInformation($parentNode, $controllerContext, $baseNodeTypeOverride);
378+
$renderedParentNode = $this->renderNodeWithMinimalPropertiesAndChildrenInformation(
379+
$parentNode,
380+
$controllerContext,
381+
$baseNodeTypeOverride,
382+
$includeContentChildNodes
383+
);
315384
if ($renderedParentNode) {
316385
$renderedParentNode['intermediate'] = true;
317386
$renderedNodes[$parentNode->getPath()] = $renderedParentNode;
@@ -368,6 +437,27 @@ public function defaultNodesForBackend(NodeInterface $site, NodeInterface $docum
368437
];
369438
}
370439

440+
public function previewUri(
441+
NodeInterface $node,
442+
ControllerContext $controllerContext
443+
): string {
444+
/* @var $contentContext ContentContext */
445+
$contentContext = $node->getContext();
446+
$siteNode = $contentContext->getCurrentSiteNode();
447+
448+
$sitePreviewUri = $this->sitePreviewUris[$siteNode->getContextPath()] ?? null;
449+
if (!$sitePreviewUri) {
450+
$sitePreviewUri = new Uri($this->uri($siteNode, $controllerContext));
451+
$this->sitePreviewUris[$siteNode->getContextPath()] = $sitePreviewUri;
452+
}
453+
454+
$arguments = UriHelper::parseQueryIntoArguments($sitePreviewUri);
455+
return (string)UriHelper::uriWithArguments(
456+
$sitePreviewUri,
457+
[...$arguments, 'node' => $node->getContextPath()],
458+
);
459+
}
460+
371461
/**
372462
* Creates a URL that will redirect to the given $node in live or base workspace, or returns an empty string if that doesn't exist or is inaccessible
373463
*

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"license": "GNU GPLv3",
77
"private": true,
88
"resolutions": {
9-
"moment": "^2.20.1",
9+
"moment": "^2.30.1",
1010
"vfile-message": "^2.0.2",
1111
"[email protected]": "patch:isemail@npm:3.2.0#./patches/isemail-npm-3.2.0-browserified.patch",
1212
"[email protected]": "patch:react-codemirror2@npm:7.2.1#./patches/react-codemirror2-npm-7.2.1-browserified.patch",
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export default () => (index: number | 'ALL' = 'ALL') => ({
1+
export default () => (usage: 'ALL' | 'PAGE_TREE' = 'ALL') => ({
22
type: 'getForTree',
3-
payload: index
3+
payload: {usage}
44
});
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export default () => (nodeTypeFilter = null) => ({
1+
export default () => (nodeTypeFilter = null, usage: 'ALL' | 'PAGE_TREE' = 'ALL') => ({
22
type: 'getForTreeWithParents',
3-
payload: {nodeTypeFilter}
3+
payload: {nodeTypeFilter, usage}
44
});

packages/neos-ui-ckeditor5-bindings/src/manifest.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ export default ckEditorRegistry => {
128128
$get('formatting.justify')
129129
)));
130130
config.set('heading', addPlugin(Heading, $or(
131+
$get('formatting.p'),
132+
$get('formatting.pre'),
133+
$get('formatting.blockquote'),
131134
$get('formatting.h1'),
132135
$get('formatting.h2'),
133136
$get('formatting.h3'),

0 commit comments

Comments
 (0)