From 59ac661730fefa932f19a4d8f2e1c914da700f5a Mon Sep 17 00:00:00 2001 From: Carlo Beltrame Date: Wed, 4 May 2022 16:45:53 +0200 Subject: [PATCH] Adapt react print to changes in #2571 Fixes the open todo from https://github.com/ecamp/ecamp3/pull/2571#discussion_r844189118 --- api/src/Entity/Period.php | 17 ++++++++ api/tests/Entity/PeriodTest.php | 40 +++++++++++++++++++ .../contentNode/ColumnLayout.jsx | 7 +--- .../pdfDocument/prepareInMainThread.js | 20 +++++----- .../print/print-react/minimalHalJsonVuex.js | 10 ++++- 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/api/src/Entity/Period.php b/api/src/Entity/Period.php index 65094f482a..785e54380d 100644 --- a/api/src/Entity/Period.php +++ b/api/src/Entity/Period.php @@ -230,6 +230,23 @@ public function removeScheduleEntry(ScheduleEntry $scheduleEntry): self { return $this; } + /** + * All the content nodes used in some activity which is carried out (has a schedule entry) in this period. + * + * @return ContentNode[] + */ + #[ApiProperty(writable: false, example: '["/content_nodes/1a2b3c4d"]')] + #[RelatedCollectionLink(ContentNode::class, ['period' => '$this'])] + #[Groups(['read'])] + public function getContentNodes(): array { + return array_values(array_unique(array_merge(...array_map( + function (ScheduleEntry $scheduleEntry) { + return $scheduleEntry->activity->getRootContentNode()->getRootDescendants(); + }, + $this->getScheduleEntries() + )), SORT_REGULAR)); + } + /** * @return MaterialItem[] */ diff --git a/api/tests/Entity/PeriodTest.php b/api/tests/Entity/PeriodTest.php index 057a11db0e..1a397d9eb9 100644 --- a/api/tests/Entity/PeriodTest.php +++ b/api/tests/Entity/PeriodTest.php @@ -2,9 +2,13 @@ namespace App\Tests\Entity; +use App\Entity\Activity; use App\Entity\Camp; +use App\Entity\ContentNode\ColumnLayout; +use App\Entity\ContentNode\SingleText; use App\Entity\Day; use App\Entity\Period; +use App\Entity\ScheduleEntry; use DateTime; use PHPUnit\Framework\TestCase; @@ -33,4 +37,40 @@ public function testFirstDayNumberInPeriod() { $this->assertEquals(3, $period1->getFirstDayNumber()); $this->assertEquals(1, $period2->getFirstDayNumber()); } + + public function testGetContentNodes() { + $camp = new Camp(); + + $period = new Period(); + $period->start = new DateTime('2020-09-14'); + $camp->addPeriod($period); + $scheduleEntry1 = new ScheduleEntry(); + $scheduleEntry2 = new ScheduleEntry(); + $scheduleEntry3 = new ScheduleEntry(); + $period->addScheduleEntry($scheduleEntry1); + $period->addScheduleEntry($scheduleEntry2); + $period->addScheduleEntry($scheduleEntry3); + + $activity1 = new Activity(); + $columnLayout1 = new ColumnLayout(); + $singleText1 = new SingleText(); + $columnLayout1->addRootDescendant($singleText1); + $columnLayout1->addChild($singleText1); + $activity1->setRootContentNode($columnLayout1); + $scheduleEntry1->activity = $activity1; + $scheduleEntry2->activity = $activity1; + + $activity2 = new Activity(); + $columnLayout2 = new ColumnLayout(); + $singleText2 = new SingleText(); + $columnLayout2->addRootDescendant($singleText2); + $columnLayout2->addChild($singleText2); + $activity2->setRootContentNode($columnLayout2); + $scheduleEntry3->activity = $activity2; + + $this->assertEquals( + [$singleText1, $columnLayout1, $singleText2, $columnLayout2], + $period->getContentNodes() + ); + } } diff --git a/frontend/src/components/print/print-react/components/scheduleEntry/contentNode/ColumnLayout.jsx b/frontend/src/components/print/print-react/components/scheduleEntry/contentNode/ColumnLayout.jsx index 4f7e978491..12749bea3f 100644 --- a/frontend/src/components/print/print-react/components/scheduleEntry/contentNode/ColumnLayout.jsx +++ b/frontend/src/components/print/print-react/components/scheduleEntry/contentNode/ColumnLayout.jsx @@ -7,12 +7,7 @@ function ColumnLayout(props) { const columns = props.contentNode.columns const firstSlot = columns.length ? columns[0].slot : '1' const lastSlot = columns.length ? columns[columns.length - 1].slot : '1' - const children = props.allContentNodes.items.filter((contentNode) => { - return ( - contentNode.parent && - contentNode.parent()._meta.self === props.contentNode._meta.self - ) - }) + const children = props.contentNode.children().items return ( diff --git a/frontend/src/components/print/print-react/documents/pdfDocument/prepareInMainThread.js b/frontend/src/components/print/print-react/documents/pdfDocument/prepareInMainThread.js index 548e15c3e0..1476a0c9fa 100644 --- a/frontend/src/components/print/print-react/documents/pdfDocument/prepareInMainThread.js +++ b/frontend/src/components/print/print-react/documents/pdfDocument/prepareInMainThread.js @@ -14,10 +14,7 @@ const picassoData = (config) => { .then((activities) => { return Promise.all( activities.items.map((activity) => { - return Promise.all([ - activity.activityResponsibles().$loadItems(), - activity.contentNodes().$loadItems(), - ]) + return activity.activityResponsibles().$loadItems() }) ) }), @@ -35,7 +32,10 @@ const picassoData = (config) => { .then((periods) => { return Promise.all( periods.items.map((period) => { - return period.scheduleEntries().$loadItems() + return Promise.all([ + period.scheduleEntries().$loadItems(), + period.contentNodes().$loadItems() + ]) }) ) }), @@ -58,10 +58,7 @@ const activityData = (config) => { .then((activities) => { return Promise.all( activities.items.map((activity) => { - return Promise.all([ - activity.activityResponsibles().$loadItems(), - activity.contentNodes().$loadItems(), - ]) + return activity.activityResponsibles().$loadItems() }) ) }), @@ -79,7 +76,10 @@ const activityData = (config) => { .then((periods) => { return Promise.all( periods.items.map((period) => { - return period.scheduleEntries().$loadItems() + return Promise.all([ + period.scheduleEntries().$loadItems(), + period.contentNodes().$loadItems() + ]) }) ) }), diff --git a/frontend/src/components/print/print-react/minimalHalJsonVuex.js b/frontend/src/components/print/print-react/minimalHalJsonVuex.js index dfcdaf1b2d..ef7392f57c 100644 --- a/frontend/src/components/print/print-react/minimalHalJsonVuex.js +++ b/frontend/src/components/print/print-react/minimalHalJsonVuex.js @@ -10,7 +10,7 @@ function isCollection(object) { function isEntityReference(object) { if (!object) return false - return isEqualIgnoringOrder(Object.keys(object), ['href']) + return isEqualIgnoringOrder(Object.keys(object), ['href']) || isVirtualLink(object) } function isTemplatedLink(object) { @@ -21,6 +21,14 @@ function isTemplatedLink(object) { ) } +function isVirtualLink(object) { + if (!object) return false + return ( + isEqualIgnoringOrder(Object.keys(object), ['href', 'virtual']) && + object.virtual === true + ) +} + function normalizeEntityUri(uriOrEntity) { if (typeof uriOrEntity === 'function') { uriOrEntity = uriOrEntity()