team-5/project-updates #46

Open
caylen-ramazan wants to merge 13 commits from team-5/project-updates into develop
Member

Component voor modify updates en geplaats in de page.
import './styles/app.css'; heb ik weer verwijderd uit assets/app.js
geautoriseerde leden van een project kunnen updates van het project bewerken, verwijderen en herstellen.
Deze PR is afhankelijk van PR #28

Component voor modify updates en geplaats in de page. import './styles/app.css'; heb ik weer verwijderd uit assets/app.js geautoriseerde leden van een project kunnen updates van het project bewerken, verwijderen en herstellen. Deze PR is afhankelijk van PR #28
rileydeman requested changes 2026-10-12 12:49:26 +00:00
Dismissed
rileydeman left a comment

Goed begin met de project-updates als Live Component. De opzet met een aparte handler, een eigen repository en de soft delete via softDelete() op de entity klopt, en het weghalen van import './styles/app.css' is terecht. Er zitten alleen nog een paar bugs in waardoor het wijzigen van updates niet goed werkt.

Moet opgelost worden

  1. De publiek/privé-logica in ModifyProjectUpdatesHandler::handleModifyUpdate() klopt niet: elseif ($isPublic && $update->isPublic()) roept makePrivate() aan. Vink je "Public" aan bij een update die al publiek is, dan wordt hij privé. Vink je hem uit, dan gebeurt er niets. Dit moet elseif (!$isPublic && $update->isPublic()) zijn.
  2. updateMap wordt alleen gevuld voor velden die je aanraakt (data-model="norender|..."). Pas je alleen de titel aan, dan ontbreekt content, faalt de isset() en wordt er stil niets opgeslagen. Pas je de checkbox niet aan, dan is public leeg en wordt dat als false gezien. Met de fix van punt 1 maak je zo elke publieke update privé zodra je alleen de tekst wijzigt. Vul updateMap bij het mounten met de huidige waardes van elke update (titel, content, public).
  3. deleteProjectUpdateById() en restoreProjectUpdateById() doen geen flush(). De soft delete wordt dus nooit opgeslagen. Er staat ook geen check op null in (onbekend ID geeft een fatal error).
  4. Bij verwijderen en herstellen wordt niet gecontroleerd of de update bij $this->projectId hoort. Met PROJECT_EDIT op je eigen project kun je via een aangepast request updates van elk ander project verwijderen. Doe dezelfde check als in handleModifyUpdate() ($update->getProject() !== $project).
  5. isGranted('PROJECT_EDIT', ...) werkt alleen als er een voter is die dat attribuut afhandelt. Op develop bestaat die niet. De ProjectVoter komt pas met PR #28, en daar is hij nog abstract, dus hij wordt niet geregistreerd. Zonder voter is het antwoord altijd "nee", dus niemand kan updates wijzigen. Zorg dat #28 eerst (werkend) gemerged wordt, of neem dat op in deze PR, en zet in de PR-beschrijving dat deze PR van #28 afhankelijk is.

Verbeterpunten
6. Verwijderde updates blijven in de lijst staan: getProjectUpdates() gebruikt findBy(['project' => ...]) zonder filter op deletedAt. Er is ook geen knop voor restoreProjectUpdate in de template. Filter verwijderde updates eruit, of toon ze apart met een herstelknop.
7. getProject(): project geeft een TypeError als het project niet bestaat (find() geeft null). Schrijf Project met een hoofdletter, en handel null af (bijv. een NotFoundHttpException).
8. $errorMessage is geen LiveProp, dus de foutmelding verdwijnt meteen weer na de re-render. Maak er een (niet-writable) LiveProp van.
9. {{ importmap('app') }} staat nu ín {% block javascript %} van org.base.html.twig. Elke pagina die dat block overschrijft (de meeste org-pagina's hebben {% block javascript %}{% endblock %}) verliest dan de importmap, en daarmee de Live Components. Zet importmap('app') buiten het block in de layout en haal hem uit modify-updates.html.twig. PR #28 doet dezelfde wijziging in de layout: stem dat af.
10. Kleine punten: de docblock boven handleModifyUpdate() gaat nog over $roleMap, er staan lege regels en een lege <thead>, ongebruikte imports (ProjectUpdate, LiveProp in de handler), en de opmerkingen // throw an exception (dan ook echt doen of weghalen). Voeg repositoryClass: ProjectUpdateRepository::class toe aan #[ORM\Entity] in ProjectUpdate.
11. Er staat geen beschrijving in de PR. Zet erin wat de PR doet en hoe je het test.

Goed begin met de project-updates als Live Component. De opzet met een aparte handler, een eigen repository en de soft delete via `softDelete()` op de entity klopt, en het weghalen van `import './styles/app.css'` is terecht. Er zitten alleen nog een paar bugs in waardoor het wijzigen van updates niet goed werkt. **Moet opgelost worden** 1. De publiek/privé-logica in `ModifyProjectUpdatesHandler::handleModifyUpdate()` klopt niet: `elseif ($isPublic && $update->isPublic())` roept `makePrivate()` aan. Vink je "Public" aan bij een update die al publiek is, dan wordt hij privé. Vink je hem uit, dan gebeurt er niets. Dit moet `elseif (!$isPublic && $update->isPublic())` zijn. 2. `updateMap` wordt alleen gevuld voor velden die je aanraakt (`data-model="norender|..."`). Pas je alleen de titel aan, dan ontbreekt `content`, faalt de `isset()` en wordt er stil niets opgeslagen. Pas je de checkbox niet aan, dan is `public` leeg en wordt dat als `false` gezien. Met de fix van punt 1 maak je zo elke publieke update privé zodra je alleen de tekst wijzigt. Vul `updateMap` bij het mounten met de huidige waardes van elke update (titel, content, public). 3. `deleteProjectUpdateById()` en `restoreProjectUpdateById()` doen geen `flush()`. De soft delete wordt dus nooit opgeslagen. Er staat ook geen check op `null` in (onbekend ID geeft een fatal error). 4. Bij verwijderen en herstellen wordt niet gecontroleerd of de update bij `$this->projectId` hoort. Met `PROJECT_EDIT` op je eigen project kun je via een aangepast request updates van elk ander project verwijderen. Doe dezelfde check als in `handleModifyUpdate()` (`$update->getProject() !== $project`). 5. `isGranted('PROJECT_EDIT', ...)` werkt alleen als er een voter is die dat attribuut afhandelt. Op develop bestaat die niet. De `ProjectVoter` komt pas met PR #28, en daar is hij nog `abstract`, dus hij wordt niet geregistreerd. Zonder voter is het antwoord altijd "nee", dus niemand kan updates wijzigen. Zorg dat #28 eerst (werkend) gemerged wordt, of neem dat op in deze PR, en zet in de PR-beschrijving dat deze PR van #28 afhankelijk is. **Verbeterpunten** 6. Verwijderde updates blijven in de lijst staan: `getProjectUpdates()` gebruikt `findBy(['project' => ...])` zonder filter op `deletedAt`. Er is ook geen knop voor `restoreProjectUpdate` in de template. Filter verwijderde updates eruit, of toon ze apart met een herstelknop. 7. `getProject(): project` geeft een TypeError als het project niet bestaat (`find()` geeft `null`). Schrijf `Project` met een hoofdletter, en handel `null` af (bijv. een `NotFoundHttpException`). 8. `$errorMessage` is geen `LiveProp`, dus de foutmelding verdwijnt meteen weer na de re-render. Maak er een (niet-writable) `LiveProp` van. 9. `{{ importmap('app') }}` staat nu ín `{% block javascript %}` van `org.base.html.twig`. Elke pagina die dat block overschrijft (de meeste org-pagina's hebben `{% block javascript %}{% endblock %}`) verliest dan de importmap, en daarmee de Live Components. Zet `importmap('app')` buiten het block in de layout en haal hem uit `modify-updates.html.twig`. PR #28 doet dezelfde wijziging in de layout: stem dat af. 10. Kleine punten: de docblock boven `handleModifyUpdate()` gaat nog over `$roleMap`, er staan lege regels en een lege `<thead>`, ongebruikte imports (`ProjectUpdate`, `LiveProp` in de handler), en de opmerkingen `// throw an exception` (dan ook echt doen of weghalen). Voeg `repositoryClass: ProjectUpdateRepository::class` toe aan `#[ORM\Entity]` in `ProjectUpdate`. 11. Er staat geen beschrijving in de PR. Zet erin wat de PR doet en hoe je het test.
Author
Member

Ik heb alle verzoeken verwerkt en aangepast.

Ik heb alle verzoeken verwerkt en aangepast.
rileydeman requested changes 2026-10-13 07:22:45 +00:00
Dismissed
rileydeman left a comment

Goed opgepakt: de publiek/privé-logica klopt nu, verwijderen en herstellen worden echt opgeslagen (met flush()) en controleren of de update bij het project hoort, en importmap('app') staat nu netjes buiten het block in de layout. Ook de NotFoundHttpException in getProject(), de LiveProp op $errorMessage en de PR-beschrijving zijn in orde.

Vorige review

  • (punt 1) opgelost.
  • (punt 2) nog open, zie hieronder.
  • (punt 3) opgelost.
  • (punt 4) opgelost.
  • (punt 5) De afhankelijkheid staat nu in de PR-beschrijving, dat is goed. Let wel op: in PR #28 is ProjectVoter nog steeds abstract. Zolang dat zo is, geeft isGranted('PROJECT_EDIT', ...) altijd "nee". Deze PR mag dus pas gemerged worden nadat een werkende #28 erin zit.
  • (punt 6) deels opgelost, zie verbeterpunten.
  • (punt 7) opgelost.
  • (punt 8) opgelost.
  • (punt 9) opgelost.
  • (punt 10) grotendeels opgelost, een paar kleine dingen staan nog open (zie verbeterpunten).
  • (punt 11) opgelost.

Moet opgelost worden

  1. (punt 2 vorige review) updateMap wordt nog steeds alleen gevuld voor velden die je aanraakt. Het weghalen van norender| verandert daar niets aan. Pas je alleen de titel aan, dan ontbreekt content en slaat handleModifyUpdate() stil niets op. Pas je de tekst aan maar niet de checkbox, dan ontbreekt public en wordt dat false. Door de (terechte) fix van punt 1 wordt een publieke update dan privé zodra je alleen de tekst wijzigt. Vul updateMap bij het mounten (bijv. in een mount()- of #[PostMount]-methode) met de huidige title, content en public van elke update. Dan zijn alle velden altijd aanwezig.

Verbeterpunten
2. (punt 6 vorige review) Verwijderde updates hebben nu een Restore-knop, maar ze staan nog gewoon tussen de andere updates, met een Remove- en Update-knop en zonder dat je ziet dat ze verwijderd zijn. Toon ze apart (of markeer ze duidelijk) en verberg Remove/Update als update.deletedAt gezet is.
3. (punt 10 vorige review) In deleteProjectUpdateById() en restoreProjectUpdateById() staat nog // throw an exception. Gooi dan ook echt een exception of haal de opmerking weg. Geef $projectUpdateId en $project ook een type (string, Project). repositoryClass: ProjectUpdateRepository::class ontbreekt nog in #[ORM\Entity] van ProjectUpdate, en in de component staan nog veel lege regels.
4. Mislukt een wijziging (bijv. update niet gevonden), dan gebeurt er nu stil niets. Zet in dat geval ook $errorMessage, zodat de gebruiker ziet dat het niet gelukt is.

Let op: PR #28 wijzigt dezelfde regel in org.base.html.twig, maar zet importmap('app') daar ín {% block javascript %}. Jouw versie (buiten het block) is de goede. Stem met team #28 af dat zij jouw versie overnemen, anders krijg je bij het mergen een conflict of komt het probleem terug.

Goed opgepakt: de publiek/privé-logica klopt nu, verwijderen en herstellen worden echt opgeslagen (met `flush()`) en controleren of de update bij het project hoort, en `importmap('app')` staat nu netjes buiten het block in de layout. Ook de `NotFoundHttpException` in `getProject()`, de `LiveProp` op `$errorMessage` en de PR-beschrijving zijn in orde. **Vorige review** - (punt 1) opgelost. - (punt 2) nog open, zie hieronder. - (punt 3) opgelost. - (punt 4) opgelost. - (punt 5) De afhankelijkheid staat nu in de PR-beschrijving, dat is goed. Let wel op: in PR #28 is `ProjectVoter` nog steeds `abstract`. Zolang dat zo is, geeft `isGranted('PROJECT_EDIT', ...)` altijd "nee". Deze PR mag dus pas gemerged worden nadat een werkende #28 erin zit. - (punt 6) deels opgelost, zie verbeterpunten. - (punt 7) opgelost. - (punt 8) opgelost. - (punt 9) opgelost. - (punt 10) grotendeels opgelost, een paar kleine dingen staan nog open (zie verbeterpunten). - (punt 11) opgelost. **Moet opgelost worden** 1. (punt 2 vorige review) `updateMap` wordt nog steeds alleen gevuld voor velden die je aanraakt. Het weghalen van `norender|` verandert daar niets aan. Pas je alleen de titel aan, dan ontbreekt `content` en slaat `handleModifyUpdate()` stil niets op. Pas je de tekst aan maar niet de checkbox, dan ontbreekt `public` en wordt dat `false`. Door de (terechte) fix van punt 1 wordt een publieke update dan privé zodra je alleen de tekst wijzigt. Vul `updateMap` bij het mounten (bijv. in een `mount()`- of `#[PostMount]`-methode) met de huidige `title`, `content` en `public` van elke update. Dan zijn alle velden altijd aanwezig. **Verbeterpunten** 2. (punt 6 vorige review) Verwijderde updates hebben nu een Restore-knop, maar ze staan nog gewoon tussen de andere updates, met een Remove- en Update-knop en zonder dat je ziet dat ze verwijderd zijn. Toon ze apart (of markeer ze duidelijk) en verberg Remove/Update als `update.deletedAt` gezet is. 3. (punt 10 vorige review) In `deleteProjectUpdateById()` en `restoreProjectUpdateById()` staat nog `// throw an exception`. Gooi dan ook echt een exception of haal de opmerking weg. Geef `$projectUpdateId` en `$project` ook een type (`string`, `Project`). `repositoryClass: ProjectUpdateRepository::class` ontbreekt nog in `#[ORM\Entity]` van `ProjectUpdate`, en in de component staan nog veel lege regels. 4. Mislukt een wijziging (bijv. update niet gevonden), dan gebeurt er nu stil niets. Zet in dat geval ook `$errorMessage`, zodat de gebruiker ziet dat het niet gelukt is. Let op: PR #28 wijzigt dezelfde regel in `org.base.html.twig`, maar zet `importmap('app')` daar ín `{% block javascript %}`. Jouw versie (buiten het block) is de goede. Stem met team #28 af dat zij jouw versie overnemen, anders krijg je bij het mergen een conflict of komt het probleem terug.
patrick left a comment

De updateMap van ModifyProjectUpdatesComponent is altijd een lege array, omdat wanneer de mount functie wordt aangeroepen projectId nog geen waarde heeft. Gebruik hierom de postMount functie inplaats van de mount functie(https://symfony.com/bundles/ux-twig-component/current/index.html#postmount-hook).
Bij de twig ModifyProjectUpdatesComponent staat update.deletedAt verkeerd gespelt, er mist een "d", op de regel ' Project delete at:{{ update.deleteAt ? update.deleteAt|date('d/m/Y') : '-' }}' hierdoor krijg je een uitzondering als een update is verwijderdt.

De updateMap van ModifyProjectUpdatesComponent is altijd een lege array, omdat wanneer de mount functie wordt aangeroepen projectId nog geen waarde heeft. Gebruik hierom de postMount functie inplaats van de mount functie(https://symfony.com/bundles/ux-twig-component/current/index.html#postmount-hook). Bij de twig ModifyProjectUpdatesComponent staat update.deletedAt verkeerd gespelt, er mist een "d", op de regel ' Project delete at:{{ update.deleteAt ? update.deleteAt|date('d/m/Y') : '-' }}' hierdoor krijg je een uitzondering als een update is verwijderdt.
patrick left a comment

Er mist nu nog steeds een "d" bij de eerste update.deletedAt in de regel ' Project delete at:{{ update.deleteAt ? update.deletedAt|date('d/m/Y') : '-' }}'.
Verder wordt de functie mount nu zowel als mount(vanwege de naam) en postmount(vanwege de attribute postMount) aangeroepen. Hierdoor wordt er een extra onnodige keer naar projecten gezocht. Dus verander de naam van de functie zodat het niet meer als mount wordt aangeroepen bijvoorbeeld naar postMount.

Er mist nu nog steeds een "d" bij de eerste update.deletedAt in de regel ' Project delete at:{{ update.deleteAt ? update.deletedAt|date('d/m/Y') : '-' }}'. Verder wordt de functie mount nu zowel als mount(vanwege de naam) en postmount(vanwege de attribute postMount) aangeroepen. Hierdoor wordt er een extra onnodige keer naar projecten gezocht. Dus verander de naam van de functie zodat het niet meer als mount wordt aangeroepen bijvoorbeeld naar postMount.
rileydeman requested changes 2026-10-14 10:46:45 +00:00
Dismissed
rileydeman left a comment

Goed opgelost: de methode heet nu postMount() met #[PostMount], dus updateMap wordt gevuld nadat projectId gezet is. En update.deleteAt is overal update.deletedAt, dus de pagina crasht niet meer bij verwijderde updates. De twee grootste problemen zijn daarmee weg.

Vorige review

  • (punt 1) opgelost.
  • (punt 2) opgelost, alleen de losse }} staat er nog.
  • (punt 3) t/m (punt 6) nog open.

Dit moet nog aangepast worden:

Moet opgelost worden

  1. In ModifyProjectUpdatesComponent.html.twig (regel 15) staat na de datum nog een losse }}. Die verschijnt letterlijk als tekst op de pagina. Binnen {% if update.deletedAt %} is de datum altijd gezet, dus {{ update.deletedAt|date('d/m/Y') }} is genoeg.
  2. (punt 6 vorige review) handleModifyUpdate(), deleteProjectUpdateById() en restoreProjectUpdateById() in ModifyProjectUpdatesHandler doen stil return als de update niet bestaat of bij een ander project hoort. De gebruiker klikt dan en er gebeurt niets, zonder melding. Laat ze false teruggeven of een exception gooien, zodat de component $errorMessage kan zetten.
  3. (punt 5 vorige review) #[ORM\Entity] op ProjectUpdate mist repositoryClass: ProjectUpdateRepository::class. Zonder die koppeling geeft $entityManager->getRepository(ProjectUpdate::class) een standaard repository zonder jouw eigen methodes. Haal ook de vijf lege regels bovenaan de component weg.

Verbeterpunten
4. (punt 3 vorige review) "Project delete at:" gaat over de update, niet over het project. Bijvoorbeeld "Deleted at:".
5. (punt 4 vorige review) Het {% else %}-blok met "No actions available" wordt nooit bereikt. Maak van {% elseif update.deletedAt %} een {% else %} en haal het laatste blok weg.

Let op: deze PR hangt af van PR #28 (ProjectVoter voor PROJECT_EDIT), dus merge hem pas nadat #28 erin zit. #28 zet importmap('app') in org.base.html.twig nog ín {% block javascript %}; dat geeft een merge-conflict met jouw versie (buiten het block). Neem bij het oplossen jouw versie aan.

Goed opgelost: de methode heet nu `postMount()` met `#[PostMount]`, dus `updateMap` wordt gevuld nadat `projectId` gezet is. En `update.deleteAt` is overal `update.deletedAt`, dus de pagina crasht niet meer bij verwijderde updates. De twee grootste problemen zijn daarmee weg. **Vorige review** - (punt 1) opgelost. - (punt 2) opgelost, alleen de losse ` }}` staat er nog. - (punt 3) t/m (punt 6) nog open. Dit moet nog aangepast worden: **Moet opgelost worden** 1. In `ModifyProjectUpdatesComponent.html.twig` (regel 15) staat na de datum nog een losse ` }}`. Die verschijnt letterlijk als tekst op de pagina. Binnen `{% if update.deletedAt %}` is de datum altijd gezet, dus `{{ update.deletedAt|date('d/m/Y') }}` is genoeg. 2. (punt 6 vorige review) `handleModifyUpdate()`, `deleteProjectUpdateById()` en `restoreProjectUpdateById()` in `ModifyProjectUpdatesHandler` doen stil `return` als de update niet bestaat of bij een ander project hoort. De gebruiker klikt dan en er gebeurt niets, zonder melding. Laat ze `false` teruggeven of een exception gooien, zodat de component `$errorMessage` kan zetten. 3. (punt 5 vorige review) `#[ORM\Entity]` op `ProjectUpdate` mist `repositoryClass: ProjectUpdateRepository::class`. Zonder die koppeling geeft `$entityManager->getRepository(ProjectUpdate::class)` een standaard repository zonder jouw eigen methodes. Haal ook de vijf lege regels bovenaan de component weg. **Verbeterpunten** 4. (punt 3 vorige review) "Project delete at:" gaat over de update, niet over het project. Bijvoorbeeld "Deleted at:". 5. (punt 4 vorige review) Het `{% else %}`-blok met "No actions available" wordt nooit bereikt. Maak van `{% elseif update.deletedAt %}` een `{% else %}` en haal het laatste blok weg. Let op: deze PR hangt af van PR #28 (`ProjectVoter` voor `PROJECT_EDIT`), dus merge hem pas nadat #28 erin zit. #28 zet `importmap('app')` in `org.base.html.twig` nog ín `{% block javascript %}`; dat geeft een merge-conflict met jouw versie (buiten het block). Neem bij het oplossen jouw versie aan.
rileydeman requested changes 2026-10-14 16:56:29 +00:00
Dismissed
rileydeman left a comment

Goed opgepakt: de handler gooit nu een InvalidArgumentException in plaats van stil te returnen, en de component vangt die op en zet $errorMessage. De gebruiker krijgt dus eindelijk een melding. Ook de losse }}, de tekst "Deleted at:", de lege regels en het overbodige {% else %}-blok zijn netjes aangepakt.

Vorige review

  • (punt 1) opgelost.
  • (punt 2) opgelost.
  • (punt 3) half: de lege regels zijn weg, de repositoryClass ontbreekt nog.
  • (punt 4) opgelost.
  • (punt 5) opgelost, maar daarbij is de {% endif %} ook weggehaald (zie punt 1 hieronder).

Dit moet nog aangepast worden:

Moet opgelost worden

  1. In ModifyProjectUpdatesComponent.html.twig heb je bij het weghalen van het "No actions available"-blok ook de {% endif %} verwijderd. De {% if not update.deletedAt %} op regel 38 wordt nu nergens afgesloten. Twig geeft dan een syntax error en de hele pagina laadt niet meer. Zet {% endif %} terug na de Restore-knop, vóór </td>.
  2. (punt 3 vorige review) #[ORM\Entity] op ProjectUpdate mist nog steeds repositoryClass: ProjectUpdateRepository::class. Zonder die koppeling geeft $entityManager->getRepository(ProjectUpdate::class) een standaard repository zonder jouw eigen methodes. Maak er #[ORM\Entity(repositoryClass: ProjectUpdateRepository::class)] van.
  3. $errorMessage wordt nooit leeggemaakt. Gaat één actie mis, dan blijft die foutmelding staan, ook nadat de volgende actie wel lukt. Zet $this->errorMessage = ''; aan het begin van updateProjectUpdate(), deleteProjectUpdate() en restoreProjectUpdate().

Verbeterpunten
4. In ModifyProjectUpdatesHandler staat use http\Exception;. Die wordt nergens gebruikt (je gooit \InvalidArgumentException) en http\Exception hoort bij een PHP-extensie die we niet gebruiken. Haal die regel weg.
5. isset($updateMap['title'], $updateMap['content']) laat een lege string gewoon door, terwijl de melding "Title and Content cant be empty" zegt. Wil je lege velden echt tegenhouden, check dan ook op trim(...) === ''.
6. Op regel 15 van de template is update.deletedAt ? ... : '-' niet nodig, want binnen {% if update.deletedAt %} is de datum altijd gezet. {{ update.deletedAt|date('d/m/Y') }} is genoeg. Haal ook de dubbele lege regels na de try/catch-blokken weg.

Let op: deze PR hangt nog steeds af van PR #28 (ProjectVoter voor PROJECT_EDIT). Merge hem pas nadat #28 erin zit. Met de huidige develop geeft de proefmerge geen conflicten.

Goed opgepakt: de handler gooit nu een `InvalidArgumentException` in plaats van stil te returnen, en de component vangt die op en zet `$errorMessage`. De gebruiker krijgt dus eindelijk een melding. Ook de losse ` }}`, de tekst "Deleted at:", de lege regels en het overbodige `{% else %}`-blok zijn netjes aangepakt. **Vorige review** - (punt 1) opgelost. - (punt 2) opgelost. - (punt 3) half: de lege regels zijn weg, de `repositoryClass` ontbreekt nog. - (punt 4) opgelost. - (punt 5) opgelost, maar daarbij is de `{% endif %}` ook weggehaald (zie punt 1 hieronder). Dit moet nog aangepast worden: **Moet opgelost worden** 1. In `ModifyProjectUpdatesComponent.html.twig` heb je bij het weghalen van het "No actions available"-blok ook de `{% endif %}` verwijderd. De `{% if not update.deletedAt %}` op regel 38 wordt nu nergens afgesloten. Twig geeft dan een syntax error en de hele pagina laadt niet meer. Zet `{% endif %}` terug na de Restore-knop, vóór `</td>`. 2. (punt 3 vorige review) `#[ORM\Entity]` op `ProjectUpdate` mist nog steeds `repositoryClass: ProjectUpdateRepository::class`. Zonder die koppeling geeft `$entityManager->getRepository(ProjectUpdate::class)` een standaard repository zonder jouw eigen methodes. Maak er `#[ORM\Entity(repositoryClass: ProjectUpdateRepository::class)]` van. 3. `$errorMessage` wordt nooit leeggemaakt. Gaat één actie mis, dan blijft die foutmelding staan, ook nadat de volgende actie wel lukt. Zet `$this->errorMessage = '';` aan het begin van `updateProjectUpdate()`, `deleteProjectUpdate()` en `restoreProjectUpdate()`. **Verbeterpunten** 4. In `ModifyProjectUpdatesHandler` staat `use http\Exception;`. Die wordt nergens gebruikt (je gooit `\InvalidArgumentException`) en `http\Exception` hoort bij een PHP-extensie die we niet gebruiken. Haal die regel weg. 5. `isset($updateMap['title'], $updateMap['content'])` laat een lege string gewoon door, terwijl de melding "Title and Content cant be empty" zegt. Wil je lege velden echt tegenhouden, check dan ook op `trim(...) === ''`. 6. Op regel 15 van de template is `update.deletedAt ? ... : '-'` niet nodig, want binnen `{% if update.deletedAt %}` is de datum altijd gezet. `{{ update.deletedAt|date('d/m/Y') }}` is genoeg. Haal ook de dubbele lege regels na de `try/catch`-blokken weg. Let op: deze PR hangt nog steeds af van PR #28 (`ProjectVoter` voor `PROJECT_EDIT`). Merge hem pas nadat #28 erin zit. Met de huidige develop geeft de proefmerge geen conflicten.
rileydeman left a comment

Alle punten uit de vorige review zijn opgepakt. De {% endif %} staat weer op zijn plek, ProjectUpdate heeft nu repositoryClass: ProjectUpdateRepository::class, en $errorMessage wordt aan het begin van elke actie leeggemaakt. Ook de lege-velden-check met trim(), de weggehaalde use http\Exception; en de opgeschoonde template zijn netjes.

Vorige review

  • (punt 1, 2 en 3) opgelost.
  • (punt 4, 5 en 6) opgelost.

Er is nog één klein ding, daarna kan hij erin:

Moet opgelost worden

  1. In ModifyProjectUpdatesComponent.html.twig staan Created by:{{ update.author.displayName }} en Deleted at:{{ update.deletedAt|date('d/m/Y') }} zonder spatie na de dubbele punt. Op de pagina zie je dan "Created by:Jan" en "Deleted at:14/10/2026". Zet er een spatie tussen: Created by: {{ ... }} en Deleted at: {{ ... }}.

Verbeterpunten
2. Kleine opmaak: restoreProjectUpdate( #[LiveArg] string $id) heeft een spatie te veel na de (, en in de component en de handler staan nog een paar dubbele lege regels (na $errorMessage, na de constructor, na $this->em->flush()). Laat eventueel PHP-CS-Fixer erover lopen.

Let op: deze PR gebruikt PROJECT_EDIT uit de ProjectVoter van PR #28. Die staat nog niet op develop, dus merge deze PR pas nadat #28 erin zit. Ik heb het getest: eerst #28 en daarna deze PR mergen gaat zonder conflicten (de importmap('app')-regel in org.base.html.twig valt samen).

Alle punten uit de vorige review zijn opgepakt. De `{% endif %}` staat weer op zijn plek, `ProjectUpdate` heeft nu `repositoryClass: ProjectUpdateRepository::class`, en `$errorMessage` wordt aan het begin van elke actie leeggemaakt. Ook de lege-velden-check met `trim()`, de weggehaalde `use http\Exception;` en de opgeschoonde template zijn netjes. **Vorige review** - (punt 1, 2 en 3) opgelost. - (punt 4, 5 en 6) opgelost. Er is nog één klein ding, daarna kan hij erin: **Moet opgelost worden** 1. In `ModifyProjectUpdatesComponent.html.twig` staan `Created by:{{ update.author.displayName }}` en `Deleted at:{{ update.deletedAt|date('d/m/Y') }}` zonder spatie na de dubbele punt. Op de pagina zie je dan "Created by:Jan" en "Deleted at:14/10/2026". Zet er een spatie tussen: `Created by: {{ ... }}` en `Deleted at: {{ ... }}`. **Verbeterpunten** 2. Kleine opmaak: `restoreProjectUpdate( #[LiveArg] string $id)` heeft een spatie te veel na de `(`, en in de component en de handler staan nog een paar dubbele lege regels (na `$errorMessage`, na de constructor, na `$this->em->flush()`). Laat eventueel PHP-CS-Fixer erover lopen. Let op: deze PR gebruikt `PROJECT_EDIT` uit de `ProjectVoter` van PR #28. Die staat nog niet op develop, dus merge deze PR pas nadat #28 erin zit. Ik heb het getest: eerst #28 en daarna deze PR mergen gaat zonder conflicten (de `importmap('app')`-regel in `org.base.html.twig` valt samen).
This pull request doesn't have enough approvals yet. 0 of 2 approvals granted.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin team-5/project-updates:team-5/project-updates
git switch team-5/project-updates
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
HNNW/core!46
No description provided.