Merge pull request 'fix(homepage): merge service groups by name to stop manual entries being dropped' (#14) from fix/homepage-duplicate-service-groups into main

Reviewed-on: #14
This commit was merged in pull request #14.
This commit is contained in:
2026-09-21 15:29:59 +02:00
+28 -14
View File
@@ -12,21 +12,15 @@ let
manualServices = import ./manual-services.nix; manualServices = import ./manual-services.nix;
manualWidgets = import ./manual-widgets.nix; manualWidgets = import ./manual-widgets.nix;
groupedServices = groupedServices = lib.foldl' (
lib.foldl'
(
acc: entry: acc: entry:
acc acc
// { // {
${entry.group} = (acc.${entry.group} or [ ]) ++ [ entry ]; ${entry.group} = (acc.${entry.group} or [ ]) ++ [ entry ];
} }
) ) { } config.my.homepage.services;
{ }
config.my.homepage.services;
homepageServices = lib.mapAttrsToList ( homepageServices = lib.mapAttrsToList (group: entries: {
group: entries:
{
${group} = map ( ${group} = map (
entry: entry:
let let
@@ -39,12 +33,30 @@ let
${entry.name} = lib.filterAttrs (_: value: value != null) service; ${entry.name} = lib.filterAttrs (_: value: value != null) service;
} }
) entries; ) entries;
} }) groupedServices;
) groupedServices;
# homepage-dashboard keeps only the first services.yaml list entry with a
# given group name (first match wins), so module-contributed and manual
# groups sharing a name (e.g. "Services") must be merged here rather than
# simply concatenated, or the later ones are silently dropped.
mergeGroups =
lists:
let
merged = lib.foldl' (
acc: groupAttrs:
let
groupName = builtins.head (builtins.attrNames groupAttrs);
in
acc // { ${groupName} = (acc.${groupName} or [ ]) ++ groupAttrs.${groupName}; }
) { } lists;
in
lib.mapAttrsToList (name: entries: { ${name} = entries; }) merged;
in in
{ {
options.my.homepage.services = with lib; mkOption { options.my.homepage.services =
with lib;
mkOption {
type = types.listOf ( type = types.listOf (
types.submodule { types.submodule {
options = { options = {
@@ -80,7 +92,9 @@ in
description = "Merged homepage service metadata contributed by repo modules."; description = "Merged homepage service metadata contributed by repo modules.";
}; };
options.my.homepage.widgets = with lib; mkOption { options.my.homepage.widgets =
with lib;
mkOption {
type = types.listOf types.attrs; type = types.listOf types.attrs;
default = [ ]; default = [ ];
description = "Widget definitions passed directly to services.homepage-dashboard.widgets. Each entry is an attrset like { resources = { cpu = true; memory = true; }; }."; description = "Widget definitions passed directly to services.homepage-dashboard.widgets. Each entry is an attrset like { resources = { cpu = true; memory = true; }; }.";
@@ -98,7 +112,7 @@ in
listenPort = dashboardPort; listenPort = dashboardPort;
allowedHosts = "${dashboardHost}:${toString dashboardPort},192.168.178.65:${toString dashboardPort},localhost:${toString dashboardPort},127.0.0.1:${toString dashboardPort},jupiter:${toString dashboardPort},jupiter.solar.internal:${toString dashboardPort}"; allowedHosts = "${dashboardHost}:${toString dashboardPort},192.168.178.65:${toString dashboardPort},localhost:${toString dashboardPort},127.0.0.1:${toString dashboardPort},jupiter:${toString dashboardPort},jupiter.solar.internal:${toString dashboardPort}";
bookmarks = import ./bookmarks.nix; bookmarks = import ./bookmarks.nix;
services = homepageServices ++ manualServices; services = mergeGroups (homepageServices ++ manualServices);
widgets = config.my.homepage.widgets ++ manualWidgets; widgets = config.my.homepage.widgets ++ manualWidgets;
}; };