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_id uit 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 via ExternalUrlChecker::check(), aangeroepen vanuit media/js/item.js bij 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 van checkUrl(). Aangeroepen vanuit media/js/item.js bij het wijzigen van type/doel, zodat de icoon-preview in het Item-formulier live meebeweegt. Roept dezelfde iconresolutie aan als ItemModel::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-autocreate t.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-lege icon-kolom) krijgt voorrang boven het via LinkResolver automatisch bepaalde icoon. De ruwe icon-kolomwaarde zelf blijft ongemoeid (dit is de brondata voor IconpickerField); 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 opgeslagen target-waarde;
  • type-afhankelijke validatie bij opslaan, waaronder de vormcontrole en host-allowlist voor het type external via ExternalUrlChecker::checkFormat() (uitsluitend bij een nieuw external-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 via LinkResolver bepalen 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 door getGroups() t.b.v. de verwijdermodal — de items-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, via window.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 het target_external-veld: aanroepen van de Ajax-actie item.checkUrl en 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.sortable
  • com_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\Route
  • Joomla\Database\DatabaseInterface (via Factory::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/ItemController verzorgen de procesbesturing voor individuele records, elk met een eigen save()-implementatie (zie ARCHITECTURE.md, hoofdstuk 9/10a).
  • GroupsController/ItemsController verzorgen de Ajax-flow voor respectievelijk de groeps- en de item-volgorde binnen een groep.
  • HubRepository verzorgt de specifieke ordering-opslag voor beide.
  • GroupTable/ItemTable verzorgen de databasekoppeling voor CRUD.
  • LinkResolver bepaalt per item, op basis van type + target, de link, status en het icoon.
  • ExternalUrlChecker beschermt het itemtype external tegen SSRF, met een gescheiden vorm- en bereikbaarheidscontrole.
  • Views en templates bevatten uitsluitend presentatielogica.
  • dashboard.js verzorgt de client-side drag & drop-functionaliteit voor zowel groepen als items; item.js verzorgt 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 external kan het doelvenster gekozen worden: huidig venster, nieuw tabblad, of een los popupvenster (window.open(), met target="_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.

  1. ADR-1 — Popup-methode voor de groep-verwijderflow: JoomlaDialog i.p.v. Bootstrap-modal
  2. ADR-2 — Plaats van de verplaats-logica bij groepverwijdering: HubRepository
  3. ADR-3 — Extern paneel náást het adminmenu: geen dedicated Core-mechanisme, wel haalbaar via het modulesysteem
  4. ADR-4 — Derde external_target-optie "nieuw venster": window.open() i.p.v. het target-attribuut
  5. ADR-5 — Eigen top-level hoofdmenu-item: geen ondersteunde extensie-weg binnen Joomla 6 core
  6. ADR-6 — Titelbalk-snelkoppeling naar SimpleHub: kern-Custom-module via installer-script, positie "title"
  7. ADR-7 — Eigen iconkeuze via FontAwesome: haalbaar, geen tweede library, icon-kolom als override
  8. ADR-8 — DNS-rebindingvenster in ExternalUrlChecker: IP-adres pinnen via CURLOPT_RESOLVE
  9. ADR-9 — Meest gebruikte Dashboard-links: haalbaarheid en aanpak van gebruiksdetectie
  10. 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 met data-bs-toggle.
  • Joomla 6/7 merkt bootstrap.modal-assets en data-bs-toggle="modal"-markup expliciet aan als deprecated/upgrade-blocker (zie de cwm-lint-deprecations-tooling in de bredere Joomla-toolchain).
  • JoomlaDialog ondersteunt naast iframe ook een inline-popuptype, met een declaratieve autocreate-variant ($wa->useScript('joomla.dialog-autocreate') + een data-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-

"`, hergebruikt het bestaande delete-formulier) en, indien van toepassing, keuze B (nieuw `move-then-delete-group-`-formulier met een `