diff options
Diffstat (limited to 'www/framework')
| -rw-r--r-- | www/framework/default.nix | 7 | ||||
| -rw-r--r-- | www/framework/event.nix | 45 |
2 files changed, 49 insertions, 3 deletions
diff --git a/www/framework/default.nix b/www/framework/default.nix index 71d3c98..91b21a4 100644 --- a/www/framework/default.nix +++ b/www/framework/default.nix @@ -45,7 +45,12 @@ in description = '' Termine ''; - type = with types; attrsOf (submodule config.types.event); + type = + with types; + attrsOf (submodule [ + config.types.event + { _module.args.events = config.events; } + ]); default = { }; }; diff --git a/www/framework/event.nix b/www/framework/event.nix index 7dea810..2daa4a2 100644 --- a/www/framework/event.nix +++ b/www/framework/event.nix @@ -1,9 +1,23 @@ { config, ... }: { config.types.event = - event@{ lib, ... }: + event@{ lib, events, ... }: let inherit (lib) mkOption types; + cfg = event.config; + sort-key = e: "${e.date.start} ${e.time.start}"; + prior = + let + candidates = lib.filter ( + e: + e.venue != null && e.venue == cfg.venue && sort-key e < sort-key cfg && !e.address.once + ) (lib.attrValues events); + sorted = lib.sortOn sort-key candidates; + in + if sorted == [ ] then + throw "Kein vorheriger Termin mit gleichem Veranstaltungsort gefunden." + else + lib.last sorted; in { imports = [ config.types.document ]; @@ -144,19 +158,33 @@ type = types.str; example = "Samstag, 20.12.2025 von 15:00 bis 17:00 Uhr"; }; + venue = mkOption { + description = '' + Kennzeichen des Veranstaltungsorts zum Wiederverwenden von Angaben in nachfolgenden Terminen. + ''; + type = with types; nullOr singleLineStr; + default = null; + }; address.name = mkOption { description = '' Eigenname des Veranstaltungsorts ''; type = with types; nullOr str; example = "Treffpunkthaus"; - default = null; + default = if cfg.venue == null then null else prior.address.name; + defaultText = lib.literalMD "Adresse des vorherigen Termins mit gleichem Veranstaltungsort, falls vorhanden."; }; address.text = mkOption { description = '' Ort in Textform ''; type = types.lines; + default = + if cfg.venue == null then + throw "Ohne Veranstaltungsort-Kennzeichen muss die Adresse vollständig angegeben werden." + else + prior.address.text; + defaultText = lib.literalMD "Adresse des vorherigen Termins mit gleichem Veranstaltungsort."; }; address.openstreetmap = mkOption { description = '' @@ -175,6 +203,19 @@ example = { node = 6549438363; }; + default = + if cfg.venue == null then + throw "Ohne Veranstaltungsort-Kennzeichen muss die Adresse vollständig angegeben werden." + else + prior.address.openstreetmap; + defaultText = lib.literalMD "Adresse des vorherigen Termins mit gleichem Veranstaltungsort."; + }; + address.once = mkOption { + description = '' + Wenn gesetzt, wird die Adresse nicht in nachfolgende Termine vererbt. + ''; + type = types.bool; + default = false; }; }; }; |
