forked from fa/breadcrumb-the-shire
Restructure Support dashboard into 2 KPI groups (Tickets + Contracts) with section dividers, merge escalations and recommendations into "Attention needed". Redesign Sales dashboard with clickable contract timeline and dialog. Add CSS shimmer skeleton loading for all dashboard tabs and aside. Unify vertical rhythm via * + * sibling combinator on tab content containers. Remove ~265 lines of dead CSS (contract cards, escalation styles) and unused JS functions. Refactor hydrateTicketCategoryFilter into generic hydrateSelectFilter. Fix role="button" CSS bleed from shell and remove extra future year from timeline. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
57 lines
1.7 KiB
PHP
57 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace MintyPHP\Http;
|
|
|
|
use MintyPHP\App\Module\ModuleRegistry;
|
|
use MintyPHP\Router;
|
|
use RuntimeException;
|
|
|
|
/**
|
|
* Registers core + module routes into the runtime router.
|
|
*/
|
|
final class RouteRegistrar
|
|
{
|
|
public function __construct(private readonly ModuleRegistry $moduleRegistry)
|
|
{
|
|
}
|
|
|
|
public function register(RouteCatalog $catalog): void
|
|
{
|
|
$coreRoutePaths = [];
|
|
foreach ($catalog->coreRoutes() as $route) {
|
|
$path = trim($route['path']);
|
|
$target = trim($route['target']);
|
|
if ($path === '' || $target === '') {
|
|
continue;
|
|
}
|
|
|
|
$coreRoutePaths[$path] = $target;
|
|
Router::addRoute($path, $target);
|
|
}
|
|
|
|
$modulePaths = [];
|
|
foreach ($this->moduleRegistry->getRoutes() as $route) {
|
|
$path = trim($route['path']);
|
|
$target = trim($route['target']);
|
|
$moduleId = trim($route['module_id']);
|
|
if ($path === '' || $target === '') {
|
|
continue;
|
|
}
|
|
|
|
if (isset($coreRoutePaths[$path])) {
|
|
throw new RuntimeException(
|
|
"Module route path conflict: '{$path}' from module '{$moduleId}' collides with core route target '{$coreRoutePaths[$path]}'."
|
|
);
|
|
}
|
|
if (isset($modulePaths[$path])) {
|
|
throw new RuntimeException(
|
|
"Module route path conflict: '{$path}' from module '{$moduleId}' collides with module '{$modulePaths[$path]}'."
|
|
);
|
|
}
|
|
|
|
$modulePaths[$path] = $moduleId;
|
|
Router::addRoute($path, $target);
|
|
}
|
|
}
|
|
}
|