aboutsummaryrefslogtreecommitdiff
path: root/www/framework
diff options
context:
space:
mode:
Diffstat (limited to 'www/framework')
-rw-r--r--www/framework/default.nix7
-rw-r--r--www/framework/event.nix45
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;
};
};
};