SimpleHub – Architectuurinventaris
Doel
Dit document vormt een inventaris van de actuele implementatie van de SimpleHub-component.
In tegenstelling tot ARCHITECTURE.md, waarin de softwarearchitectuur wordt beschreven, documenteert deze bijlage de concrete implementatie van de component.
De inventaris dient als referentie voor toekomstige doorontwikkeling en AI-ondersteunde ontwikkelomgevingen, zodat niet steeds de volledige codebasis vooraf hoeft te worden geanalyseerd.
Dit document beschrijft uitsluitend de actuele implementatie.
Statuswaarden
| Status | Betekenis |
|---|---|
| Actief | Onderdeel van de huidige implementatie |
| Tijdelijk | Tijdelijke implementatie die later wordt vervangen |
| Gepland | Voorzien maar nog niet geïmplementeerd |
| Verouderd | Nog aanwezig maar gepland voor verwijdering |
Administrator
DisplayController
Bestand
administrator/src/Controller/DisplayController.php
Status
Actief
Verantwoordelijkheid
Startpunt van de administratorcomponent.
Stelt de standaardweergave (dashboard) vast.
GroupController
Bestand
administrator/src/Controller/GroupController.php
Status
Actief
Verantwoordelijkheid
Controller voor CRUD-bewerkingen op Hubgroepen.
Verantwoordelijk voor:
- Add
- Edit
- Save
- Apply
- Save & New
- Delete
moveItemsAndDelete()— verplaatst eerst de items van de groep naar een gekozen doelgroep (HubRepository::moveItemsToGroup()) en verwijdert daarna de lege bronproep via het bestaande delete-pad. Serverside afhandeling van "Keuze B" uit de verwijdermodal; zie ADR-2.- Redirects
De controller bevat een eigen implementatie van save() omdat de standaard Joomla FormController::save() binnen de gekozen Dashboard-architectuur de primaire sleutel van bestaande records niet correct behoudt. save() zet, net als ItemController::save(), de ingevoerde jform-waarden bij een mislukte opslag terug in de user state (com_simplehub.edit.group.data) en ruimt deze op bij een geslaagde opslag.
Afhankelijkheden
- GroupModel
- HubRepository (uitsluitend voor
moveItemsAndDelete())
GroupsController
Bestand
administrator/src/Controller/GroupsController.php
Status
Actief
Verantwoordelijkheid
Verwerkt de Ajax-aanvraag voor het opslaan van de nieuwe sorteervolgorde van Hubgroepen.
Verantwoordelijk voor:
- ontvangen van de groepsvolgorde;
- converteren van ontvangen groeps-ID's;
- aanroepen van de ordering-opslag;
- retourneren van een
JsonResponse; - foutafhandeling.
De controller bevat geen directe database-logica.
Afhankelijkheden
- HubRepository
- Joomla
JsonResponse
ItemsController
administrator/src/Controller/ItemsController.php
Status
Actief
Verantwoordelijkheid
Verwerkt de Ajax-aanvraag voor het opslaan van de nieuwe sorteervolgorde van Items binnen één Hubgroep.
Verantwoordelijk voor:
- CSRF-tokencontrole;
- ontvangen van de Hubgroep-ID;
- ontvangen en normaliseren van de Item-ID's;
- aanroepen van de Item-ordering opslag;
- retourneren van een JsonResponse;
- foutafhandeling.
De controller bevat geen directe database-logica.
Afhankelijkheden
HubRepository Joomla JsonResponse
ItemController
Bestand
administrator/src/Controller/ItemController.php
Status
Actief
Verantwoordelijkheid
Controller voor CRUD-bewerkingen op Hub-items.
Verantwoordelijk voor:
- Add (inclusief overname van
group_iduit de URL naar de user state, zodat een nieuw item wordt gekoppeld aan de groep vanwaaruit "Add" is gestart); - Save (Apply / Save & Close / Save & New);
checkUrl()— Ajax-actie die de bereikbaarheid van een externe URL controleert viaExternalUrlChecker::check(), aangeroepen vanuitmedia/js/item.jsbij het verlaten van het URL-veld;icon()— Ajax-actie die het effectieve icoon (override vóór automatisch) van een (nog niet opgeslagen) Item teruggeeft, naar het patroon vancheckUrl(). Aangeroepen vanuitmedia/js/item.jsbij het wijzigen van type/doel, zodat de icoon-preview in het Item-formulier live meebeweegt. Roept dezelfde iconresolutie aan alsItemModel::getItem();- Delete;
- Redirects.
Bevat, net als GroupController, een eigen save()-implementatie omdat de standaard Joomla
FormController::save() de primaire sleutel van bestaande records niet correct behoudt binnen deze
architectuur. ItemController::save() zet, net als GroupController::save(), de ingevoerde
jform-waarden bij een mislukte opslag terug in de user state (com_simplehub.edit.item.data), zodat
het formulier niet leeg wordt getoond.
Afhankelijkheden
- ItemModel
- ExternalUrlChecker
TitlebarController
Bestand
administrator/src/Controller/TitlebarController.php
Status
Actief
Verantwoordelijkheid
Verwerkt de Ajax-actie toggle() vanuit het schuifje in de SimpleHub-Opties (TitlebarStateField):
publiceert/depubliceert de titelbalk-snelkoppelingsmodule rechtstreeks, zonder tussenliggende opslag van
een eigen componentinstelling. Zie ADR-6.
Afhankelijkheden
- TitlebarModuleRepository
TitlebarModuleRepository
Bestand
administrator/src/Repository/TitlebarModuleRepository.php
Status
Actief (foutafhandeling rond de databasequery's nog niet uitgewerkt — zie ROADMAP_INTERN.md)
Verantwoordelijkheid
Zoekt en wijzigt de published-status van de door script.php geregistreerde titelbalk-Custom-module
(herkend via note = 'com_simplehub'). Aangeroepen door TitlebarController::toggle().
TitlebarStateField
Bestand
administrator/src/Field/TitlebarStateField.php
Status
Actief
Verantwoordelijkheid
Custom form field type voor de SimpleHub-Opties: rendert het aan/uit-schuifje
(Bootstrap form-check form-switch) voor de titelbalk-snelkoppeling, gekoppeld aan de daadwerkelijke
published-status van de module (geen eigen opgeslagen instelling). Vereist addfieldprefix in
admin/config.xml om binnen de com_config-renderomgeving gevonden te worden.
IconpickerField
Bestand
administrator/src/Field/IconpickerField.php
Status
Actief
Verantwoordelijkheid
Custom form field type voor het icon-veld in item.xml (addfieldprefix), naar het patroon van
TitlebarStateField. Rendert een preview, een verborgen invoerveld en een JoomlaDialog-popup met een
statisch gerenderde, doorzoekbare iconengrid (geen Ajax-rondje voor de iconenlijst zelf). Hergebruikt het
door Joomla core al systeembreed geladen fontawesome-webasset. Zie ARCHITECTURE_APPENDIX.md, ADR-7.
Afhankelijkheden
- FontAwesomeIcons
FontAwesomeIcons
Bestand
administrator/src/Support/FontAwesomeIcons.php
Status
Actief (curated selectie, niet rechtstreeks geverifieerd tegen de daadwerkelijk geladen
joomla-fontawesome-webasset — zie ROADMAP_INTERN.md)
Verantwoordelijkheid
Statische, curated lijst van FontAwesome-iconnamen (Solid, Brands, de door Joomla meegeleverde
Regular-subset), gegroepeerd per stijl, gebruikt door IconpickerField om de iconengrid te renderen.
Dashboard HtmlView
Bestand
administrator/src/View/Dashboard/HtmlView.php
Status
Actief
Verantwoordelijkheid
- Toolbar opbouwen
- Hubgegevens laden
- Dashboardgegevens beschikbaar stellen
- Dashboard-assets activeren, inclusief
joomla.dialog-autocreatet.b.v. de verwijdermodal bij Hubgroepen met items — zie ADR-1.
Afhankelijkheden
- HubRepository
- Joomla Toolbar
- WebAssetManager
Group HtmlView
Bestand
administrator/src/View/Group/HtmlView.php
Status
Actief
Verantwoordelijkheid
Toont het formulier voor het toevoegen en wijzigen van Hubgroepen.
Afhankelijkheden
- GroupModel
- Joomla Form API
Item HtmlView
Bestand
administrator/src/View/Item/HtmlView.php
Status
Actief
Verantwoordelijkheid
Toont het formulier voor het toevoegen en wijzigen van Hub-items.
Afhankelijkheden
- ItemModel
- Joomla Form API
GroupModel
Bestand
administrator/src/Model/GroupModel.php
Status
Actief
Verantwoordelijkheid
Joomla AdminModel voor Hubgroepen.
Verantwoordelijk voor:
- Formulier laden
- Record laden
- Validatie
- Opslaan
- Verwijderen
Afhankelijkheden
- GroupTable
- Joomla AdminModel
GroupTable
Bestand
administrator/src/Table/GroupTable.php
Status
Actief
Verantwoordelijkheid
Databasekoppeling tussen het Group-object en de tabel #__simplehub_groups.
ItemModel
Bestand
administrator/src/Model/ItemModel.php
Status
Actief
Verantwoordelijkheid
Joomla AdminModel voor Hub-items.
Verantwoordelijk voor:
getItem(): haalt het item op en vult het aan met het effectieve icoon (resolved_icon_type/resolved_icon) — een handmatig gekozen icoon (niet-legeicon-kolom) krijgt voorrang boven het viaLinkResolverautomatisch bepaalde icoon. De ruweicon-kolomwaarde zelf blijft ongemoeid (dit is de brondata voorIconpickerField); zie ADR-7 voor de achtergrond van deze scheiding;- Formulier laden, waarbij bij een validatiefout de al gekozen
target_*-waarden uit de user state worden gebruikt in plaats van de (oude) databasewaarde; - normaliseren van de vijf type-afhankelijke doelvelden (
target_component,target_plugin,target_module,target_article,target_external) naar één opgeslagentarget-waarde; - type-afhankelijke validatie bij opslaan, waaronder de vormcontrole en host-allowlist voor het type
externalviaExternalUrlChecker::checkFormat()(uitsluitend bij een nieuwexternal-item of een gewijzigde URL, zodat niet bij iedere opslag opnieuw gevalideerd hoeft te worden); - opslaan en verwijderen (via
AdminModel).
Afhankelijkheden
- ItemTable
- ExternalUrlChecker
- Joomla AdminModel
ItemTable
Bestand
administrator/src/Table/ItemTable.php
Status
Actief
Verantwoordelijkheid
Databasekoppeling tussen het Item-object en de tabel #__simplehub_items.
HubRepository
Bestand
administrator/src/Repository/HubRepository.php
Status
Actief
Verantwoordelijkheid
Centrale repository voor Hub-specifieke databasefunctionaliteit.
Verantwoordelijk voor:
- uitlezen van Hubgroepen (
getGroups()), inclusief het viaLinkResolverbepalen van link, beschikbaarheidsstatus en icoon per Item; - uitlezen van Hub-items;
- voorbereiden van Dashboardgegevens;
- valideren van Hubgegevens (
validateItem()); - opslaan van de sorteervolgorde van Hubgroepen (
saveGroupOrder()); - valideren en opslaan van de sorteervolgorde van Items binnen een Hubgroep (
saveItemOrder()); - tellen van het werkelijke aantal items per groep, ongeacht published-status (
loadItemCounts(), gebruikt doorgetGroups()t.b.v. de verwijdermodal — deitems-lijst zelf bevat immers uitsluitend gepubliceerde items); - verplaatsen van alle items van één groep naar een andere groep, transactioneel en met een geldige
ordening (
moveItemsToGroup()). Zie ADR-2.
De repository vormt daarmee de centrale gegevenslaag voor het Dashboard en voor de specifieke ordering-flow.
De repository bevat geen gebruikersinterface en geen standaard CRUD-flow voor individuele records.
De repository wordt op alle aanroepplekken rechtstreeks geïnstantieerd (new HubRepository()) en is
niet geregistreerd in services/provider.php — zie ROADMAP_INTERN.md, item #4.
Afhankelijkheden
- Database
- LinkResolver
LinkResolver
Bestand
administrator/src/Support/LinkResolver.php
Status
Actief
Verantwoordelijkheid
Zet het opgeslagen type + target van een Hub-item om naar een bruikbare Joomla-administratorlink,
een beschikbaarheidsstatus en een icoon (type + waarde). Bevat een aparte resolver-methode per itemtype
(component, plugin, module, artikel, extern) — zie ARCHITECTURE.md, hoofdstuk 10c, voor de volledige
beschrijving inclusief de dynamische iconresolutie via de administrator-menuhiërarchie.
Wordt momenteel uitsluitend aangeroepen vanuit HubRepository::getGroups(). Instantiatie gebeurt
rechtstreeks (new LinkResolver()), niet via de DI-container — zie ROADMAP_INTERN.md, item #4.
Afhankelijkheden
- Joomla administrator-menu (
#__menu) - Joomla extensie- en modulegegevens (
#__extensions,#__modules)
ExternalUrlChecker
Bestand
administrator/src/Support/ExternalUrlChecker.php
Status
Actief
Verantwoordelijkheid
Beoordeelt een externe URL (itemtype external) in twee gescheiden lagen: een synchrone vormcontrole
met host-allowlist (checkFormat(), geen HTTP-verzoek) en een volledige controle inclusief
daadwerkelijk HTTP-verzoek (check()). Zie ARCHITECTURE.md, hoofdstuk 10d, voor de volledige
beschrijving, de architectuurmotivatie voor deze scheiding, en de bekende, nog openstaande
SSRF-redirect-bevinding (ROADMAP_INTERN.md, item #2).
Afhankelijkheden
- Joomla
HttpFactory - Joomla Logger (categorie
com_simplehub.externalurl)
JavaScript
dashboard.js
Bestand
media/js/dashboard.js
Status
Actief
Verantwoordelijkheid
Verzorgt de client-side drag & drop-functionaliteit voor Hubgroepen.
Verantwoordelijk voor:
- initialiseren van SortableJS;
- initialiseren van Group ordering;
- initialiseren van Item ordering per Hubgroep;
- detecteren van wijzigingen in de Group-volgorde;
- detecteren van wijzigingen in de Item-volgorde;
- verzamelen van Group-ID's;
- verzamelen van Item-ID's;
- meesturen van de betreffende Hubgroep-ID bij Item ordering;
- verzenden van nieuwe volgordes via Ajax;
- verwerken van JSON-resultaten;
- tonen van ordering-fouten op het Dashboard;
- onderscheppen van klikken op externe items met
data-sh-target="popup"en deze, viawindow.open(), in een apart, los venster openen in plaats van in het tabblad/venster van de standaard-target-fallback. Zie ADR-4.
Bevat geen achtergebleven debugregels (console.log/console.warn).
group.js
Bestand
media/js/group.js
Status
Actief
Verantwoordelijkheid
Formulierinteractie op het Group-formulier.
Bevat geen achtergebleven debugregels.
item.js
Bestand
media/js/item.js
Status
Actief
Verantwoordelijkheid
Formulierinteractie op het Item-formulier.
Verantwoordelijk voor:
- tonen/verbergen van de type-afhankelijke doelvelden;
- automatisch voorstellen van een titel op basis van het gekozen target, zonder een bestaande titel te overschrijven;
- bij het verlaten (
blur) van hettarget_external-veld: aanroepen van de Ajax-actieitem.checkUrlen tonen van een statusmelding onder het veld, zonder het formulier op te slaan of opnieuw te laden.
Bevat geen achtergebleven debugregels.
titlebar-config.js
Bestand
media/js/titlebar-config.js
Status
Actief (bevat nog hardgecodeerde Nederlandse teksten — zie ROADMAP_INTERN.md)
Verantwoordelijkheid
Formulierinteractie voor het aan/uit-schuifje in de SimpleHub-Opties (TitlebarStateField): stuurt de
Ajax-aanroep naar TitlebarController::toggle() en werkt de zichtbare schuifjesstatus direct bij.
Geregistreerd als eigen Web Asset com_simplehub.titlebar-config.
SortableJS
Bestand
media/js/vendor/sortable.min.js
Status
Actief
Verantwoordelijkheid
Externe JavaScript-library voor de drag & drop-functionaliteit.
De library wordt als Joomla Web Asset geregistreerd onder de assetnaam:
com_simplehub.sortable
joomla.asset.json
Bestand
media/joomla.asset.json
Status
Actief
Verantwoordelijkheid
Definieert de Joomla Web Assets van SimpleHub.
Bevat onder andere:
com_simplehub.sortablecom_simplehub.dashboard
com_simplehub.dashboard heeft een dependency op com_simplehub.sortable.
Hierdoor wordt de afhankelijkheid tussen de component-JavaScript en SortableJS door Joomla's Web Asset Manager afgehandeld.
Forms
group.xml
Bestand
administrator/forms/group.xml
Status
Actief
Verantwoordelijkheid
Definitie van het Joomla formulier voor Hubgroepen.
item.xml
Bestand
administrator/forms/item.xml
Status
Actief
Verantwoordelijkheid
Definitie van het Joomla-formulier voor Hub-items, inclusief de vijf type-afhankelijke doelvelden
(zie ARCHITECTURE.md, hoofdstuk 10b).
Bevat nog een icon-veld dat geen functie heeft in de runtime-resolutie — zie ROADMAP_INTERN.md,
item #5.
Het external_target-veld (list) biedt drie waarden: _blank (nieuw tabblad), _self (huidig venster)
en popup (nieuw, los venster — client-side afgehandeld door dashboard.js, zie ADR-4). popup is
bewust geen geldige HTML target-waarde (die zijn beperkt tot _blank/_self/_parent/_top).
Templates
Dashboard
Bestand
administrator/tmpl/dashboard/default.php
Status
Actief
Verantwoordelijkheid
Dashboardweergave.
Bevat uitsluitend presentatielogica.
De groepen worden als sorteerbare elementen weergegeven voor de drag & drop-functionaliteit.
De groepen worden als sorteerbare elementen weergegeven.
Binnen iedere Hubgroep worden de Items eveneens als afzonderlijke sorteerbare elementen weergegeven.
De template levert uitsluitend de HTML-structuur, data-attributen en
drag-handles die door dashboard.js en SortableJS worden gebruikt.
De template bevat geen database- of orderinglogica.
De itemlink krijgt, wanneer external_target === 'popup', naast de bestaande target="_blank"-fallback
(progressive enhancement) ook een data-sh-target="popup"-attribuut, waarop dashboard.js aanhaakt om
het venster als apart popup-venster te openen. Zie ADR-4.
De template rendert daarnaast, per Hubgroep met items, een verborgen <template>-element met de inhoud
van de verwijdermodal (waarschuwing, keuze A/B), gekoppeld aan de trashknop via het
data-joomla-dialog-attribuut. Groepen zonder items behouden de bestaande, kale
onsubmit="confirm(...)"-afhandeling. Zie ADR-1.
Group Edit
Bestand
administrator/tmpl/group/edit.php
Status
Actief
Verantwoordelijkheid
Formulier voor toevoegen en wijzigen van Hubgroepen.
Item Edit
Bestand
administrator/tmpl/item/edit.php
Status
Actief
Verantwoordelijkheid
Formulier voor toevoegen en wijzigen van Hub-items, inclusief de type-afhankelijke doelvelden.
Toont (nog) niet het door LinkResolver bepaalde icoon — dat wordt vooralsnog uitsluitend op het
Dashboard getoond. Zie ROADMAP_INTERN.md, item #14.
Styling
dashboard.css
Bestand
media/css/dashboard.css
Status
Actief
Verantwoordelijkheid
Dashboard-opmaak.
titlebar.css
Bestand
media/css/titlebar.css
Status
Actief
Verantwoordelijkheid
Opmaak van de titelbalk-snelkoppeling (icoon, verticale scheidingslijn, verticale centrering t.o.v. de
paginatitel), meegegeven als onderdeel van de door script.php geregistreerde Custom-module-inhoud.
Web Assets
SimpleHub gebruikt Joomla's Web Asset Manager voor het laden van component-CSS en JavaScript.
De assets worden beschreven in:
media/joomla.asset.json
De Dashboard-view activeert de benodigde assets via:
WebAssetManager
De JavaScript-afhankelijkheid is:
com_simplehub.dashboard
│
▼
com_simplehub.sortable
Hierdoor wordt SortableJS vóór dashboard.js geladen.
Configuratie
config.xml
Bestand
administrator/config.xml
Status
Actief
services/provider.php
Bestand
administrator/services/provider.php
Status
Actief
Verantwoordelijkheid
Registratie van alle Joomla services.
Extension
SimplehubComponent
Bestand
administrator/src/Extension/SimplehubComponent.php
Status
Actief
Verantwoordelijkheid
Registratie van de MVC-component en het beschikbaar stellen van de component-capabilities.
Database
install.mysql.sql
Status
Actief
uninstall.mysql.sql
Status
Actief
updates
Status
Actief
Database-updates voor toekomstige componentversies.
De aanwezige SQL-bestanden kunnen als dummy/updatebestand aanwezig zijn om de <updates>-structuur in het installatie- en update-manifest te ondersteunen.
Media-installatie
De component gebruikt in het installatie-manifest een afzonderlijk <media>-blok.
De structuur is:
media/
├── css/
└── js/
└── vendor/
De media-bestanden worden hiermee geïnstalleerd naar:
media/com_simplehub/
De Joomla Web Asset-definitie bevindt zich in de bronstructuur van de component:
media/joomla.asset.json
Deze definitie wordt door Joomla gebruikt voor registratie van de component-assets.
Overige bestanden
com_simplehub.xml
Status
Actief
Installatie- en update-manifest. Bevat <scriptfile>script.php</scriptfile> (zie script.php
hieronder en ADR-6).
script.php
Bestand
script.php (projectroot, naast com_simplehub.xml)
Status
Actief
Verantwoordelijkheid
Registreert bij installatie/upgrade automatisch de titelbalk-snelkoppeling als kern-Custom-module
(mod_custom) op modulepositie "title", altijd als eerste module in die positie (ordering 1, bestaande
modules in de positie worden één plek opgeschoven). Bij update() wordt uitsluitend de content van een
reeds bestaande rij ververst — de ordening wordt dan niet opnieuw aangepast. Bij uninstall() wordt de
modulerij verwijderd (herkend via de vaste waarde note = 'com_simplehub').
De klasse (Com_SimplehubInstallerScript) implementeert InstallerScriptInterface en wordt, conform de
huidige Joomla-conventie, als instantie ge-return-d aan het einde van het bestand — zie Kanttekening bij
ADR-6.
Afhankelijkheden
Joomla\CMS\Table\Table(Module)Joomla\CMS\Router\RouteJoomla\Database\DatabaseInterface(viaFactory::getContainer())
Nog openstaand
- Foutafhandeling rond de databasequery's (een falende query breekt momenteel de volledige installatie/upgrade van de component af, zonder nette foutmelding).
De aan/uit-koppeling met de SimpleHub-Opties (via TitlebarController/TitlebarModuleRepository) en de
moduletitel zijn opgelost — zie de ADR-6-aanvulling hieronder; de moduletitel is bewust een vaste tekst
gebleven, geen taalsleutel (zelfde ADR).
README.md
Status
Actief
Projectbeschrijving voor eindgebruikers: beschrijft functionaliteit, installatie en gebruik.
ARCHITECTURE.md
Status
Actief
Beschrijving van de softwarearchitectuur.
ARCHITECTURE_APPENDIX.md
Status
Actief
Inventaris van de actuele implementatie (dit document).
CHANGELOG.md
Status
Actief
Release notes op hoofdlijnen voor eindgebruikers.
LICENSE.txt
Status
Actief
Standaard, ongewijzigde GNU General Public License versie 2 (or later)-licentietekst.
Architectuuroverzicht
De component is een volledig werkende Hub met vijf itemtypen:
- Dashboard en HubRepository verzorgen het uitlezen van Hubgegevens (groepen én items).
- CRUD op groepen én items wordt afgehandeld via Joomla AdminModel (
GroupModel/ItemModel). GroupController/ItemControllerverzorgen de procesbesturing voor individuele records, elk met een eigensave()-implementatie (zieARCHITECTURE.md, hoofdstuk 9/10a).GroupsController/ItemsControllerverzorgen de Ajax-flow voor respectievelijk de groeps- en de item-volgorde binnen een groep.HubRepositoryverzorgt de specifieke ordering-opslag voor beide.GroupTable/ItemTableverzorgen de databasekoppeling voor CRUD.LinkResolverbepaalt per item, op basis vantype+target, de link, status en het icoon.ExternalUrlCheckerbeschermt het itemtypeexternaltegen SSRF, met een gescheiden vorm- en bereikbaarheidscontrole.- Views en templates bevatten uitsluitend presentatielogica.
dashboard.jsverzorgt de client-side drag & drop-functionaliteit voor zowel groepen als items;item.jsverzorgt de Item-formulierinteractie.- Joomla Web Asset Manager verzorgt de registratie en afhankelijkheden van de JavaScript-assets.
- De database is de enige bron van waarheid.
Aanvullend op deze basis:
- Het verwijderen van een Hubgroep is robuust: een groep zonder items wordt direct verwijderd, een groep mét items toont een JoomlaDialog-modal met een expliciete keuze tussen verwijderen inclusief items of eerst verplaatsen naar een andere groep. Zie ADR-1 en ADR-2.
- Bij het itemtype
externalkan het doelvenster gekozen worden: huidig venster, nieuw tabblad, of een los popupvenster (window.open(), mettarget="_blank"als progressive-enhancement-fallback). Zie ADR-4. - Vanaf elke pagina in de Joomla Administrator is SimpleHub met één klik bereikbaar via een
titelbalk-snelkoppeling: een kern-Custom-module (
mod_custom) op de vaste positie "title", geregistreerd door een installer-script (script.php), met een eigen aan/uit-schakelaar in de SimpleHub-Opties. Zie ADR-6. - Bij een Item is desgewenst een eigen icoon te kiezen via een ingebouwde FontAwesome-iconkiezer, als override op het automatisch herkende icoon. Zie ADR-7.
- Externe URL's zijn beschermd tegen SSRF via zowel schema/host-validatie als het pinnen van het gecontroleerde IP-adres tijdens de bereikbaarheidscontrole (bescherming tegen DNS-rebinding). Zie ADR-8.
Twee onderzochte richtingen zijn bewust niet doorgevoerd: een apart paneel náást het beheermenu (technisch mogelijk, maar geen architecturaal voordeel t.o.v. de titelbalk-snelkoppeling — zie ADR-3) en een eigen top-level hoofdmenu-item in de Joomla Administrator (geen ondersteunde extensie-weg binnen Joomla 6 core, zonder Joomla Core zelf aan te passen — zie ADR-5). Automatische detectie van veelgebruikte Dashboard-links is eveneens onderzocht en bewust niet gebouwd — zie ADR-9.
Architecture Decision Records (ADR's)
Genummerde inhoudsopgave van architectuurbeslissingen. Nieuwe ADR's worden onderaan toegevoegd; bestaande ADR's worden niet hernummerd.
- ADR-1 — Popup-methode voor de groep-verwijderflow: JoomlaDialog i.p.v. Bootstrap-modal
- ADR-2 — Plaats van de verplaats-logica bij groepverwijdering: HubRepository
- ADR-3 — Extern paneel náást het adminmenu: geen dedicated Core-mechanisme, wel haalbaar via het modulesysteem
- ADR-4 — Derde external_target-optie "nieuw venster": window.open() i.p.v. het target-attribuut
- ADR-5 — Eigen top-level hoofdmenu-item: geen ondersteunde extensie-weg binnen Joomla 6 core
- ADR-6 — Titelbalk-snelkoppeling naar SimpleHub: kern-Custom-module via installer-script, positie "title"
- ADR-7 — Eigen iconkeuze via FontAwesome: haalbaar, geen tweede library,
icon-kolom als override - ADR-8 — DNS-rebindingvenster in ExternalUrlChecker: IP-adres pinnen via CURLOPT_RESOLVE
- ADR-9 — Meest gebruikte Dashboard-links: haalbaarheid en aanpak van gebruiksdetectie
- ADR-10 — Packaging vanaf v1.0.0: publicatie-zip vs. backup-zip
ADR-1 — Popup-methode voor de groep-verwijderflow: JoomlaDialog i.p.v. Bootstrap-modal
Status: Aanvaard
Context
Voor de groep-verwijderflow is een popup-mechanisme nodig. De voor de hand liggende, klassieke aanpak —
Joomla's Bootstrap-modalconventie (data-bs-toggle="modal", HTMLHelper::_('bootstrap.renderModal', ...)),
naar analogie van de bestaande Joomla-batchverwerkingsmodals — blijkt bij nader onderzoek achterhaald:
- Sinds Joomla 5.1 is de modal-editing voor plugins en modules in Joomla Core zelf al vervangen door
JoomlaDialog (native
<dialog>-element, wrapper-script), niet langer door een vooraf gerenderde Bootstrap-modal metdata-bs-toggle. - Joomla 6/7 merkt
bootstrap.modal-assets endata-bs-toggle="modal"-markup expliciet aan als deprecated/upgrade-blocker (zie decwm-lint-deprecations-tooling in de bredere Joomla-toolchain). - JoomlaDialog ondersteunt naast
iframeook eeninline-popuptype, met een declaratieve autocreate-variant ($wa->useScript('joomla.dialog-autocreate')+ eendata-joomla-dialog-JSON- attribuut op de trigger-knop, wijzend naar een<template>-element met de popup-inhoud). Hiervoor is geen eigen JavaScript nodig.
Beslissing
De verwijdermodal voor Hubgroepen met items gebruikt JoomlaDialog, autocreate-variant, popupType: "inline". Per groep-met-items wordt een <template id="sh-delete-group-modal-<id>"> gerenderd
(admin/tmpl/dashboard/default.php) met de waarschuwingstekst, keuze A (knop met `form="delete-group-
