joplin-desktop: add module

PR #5020
This commit is contained in:
zorrobert 2024-02-18 22:57:35 +01:00 committed by Robert Helgesson
parent a82cdd288e
commit 383296ffa4
No known key found for this signature in database
GPG Key ID: 96E745BD17AA17ED
8 changed files with 169 additions and 0 deletions

View File

@ -506,4 +506,10 @@
github = "britter";
githubId = 1327662;
};
zorrobert = {
name = "zorrobert";
email = "zorrobert@mailbox.org";
github = "zorrobert";
githubId = 118135271;
};
}

View File

@ -1436,6 +1436,13 @@ in {
A new module is available: 'programs.ranger'.
'';
}
{
time = "2024-03-13T13:28:22+00:00";
message = ''
A new module is available: 'programs.joplin-desktop'.
'';
}
];
};
}

View File

@ -124,6 +124,7 @@ let
./programs/jq.nix
./programs/jujutsu.nix
./programs/joshuto.nix
./programs/joplin-desktop.nix
./programs/just.nix
./programs/k9s.nix
./programs/kakoune.nix

View File

@ -0,0 +1,124 @@
{ config, lib, pkgs, ... }:
let
cfg = config.programs.joplin-desktop;
jsonFormat = pkgs.formats.json { };
# config path is the same for linux and mac
configPath = "${config.xdg.configHome}/joplin-desktop/settings.json";
in {
meta.maintainers = [ lib.maintainers.zorrobert ];
options.programs.joplin-desktop = {
enable = lib.mkEnableOption "joplin-desktop";
package = lib.mkPackageOption pkgs "joplin-desktop" { };
extraConfig = lib.mkOption {
type = lib.types.attrs;
default = { };
example = {
"newNoteFocus" = "title";
"markdown.plugin.mark" = true;
};
description = ''
Use this to add other options to the Joplin config file. Settings are
written in JSON, so `"sync.interval": 600` would be written as
`"sync.interval" = 600`.
'';
};
### General
general = {
editor = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
example = "kate";
description = ''
The editor command (may include arguments) that will be used to open a
note. If none is provided Joplin will try to auto-detect the default
editor.
'';
};
};
### Sync
sync = {
target = lib.mkOption {
type = lib.types.enum [
null
"none"
"file-system"
"onedrive"
"nextcloud"
"webdav"
"dropbox"
"s3"
"joplin-server"
"joplin-cloud"
];
default = null;
example = "dropbox";
description = "What is the type of sync target.";
};
interval = lib.mkOption {
type =
lib.types.enum [ null "disabled" "5m" "10m" "30m" "1h" "12h" "1d" ];
default = null;
example = "10m";
description = ''
Set the synchronisation interval.
'';
};
};
};
config = lib.mkIf cfg.enable {
home.packages = [ cfg.package ];
home.activation = {
activateJoplinDesktopConfig = let
newConfig = jsonFormat.generate "joplin-settings.json"
(lib.attrsets.filterAttrs (n: v: (v != null) && (v != "")) ({
# TODO: find a better way to convert nix attribute names to strings:
# sync.interval = ... -> "sync.interval" = ...
"editor" = cfg.general.editor;
"sync.target" = {
"none" = 0;
"file-system" = 2;
"onedrive" = 3;
"nextcloud" = 5;
"webdav" = 6;
"dropbox" = 7;
"s3" = 8;
"joplin-server" = 9;
"joplin-cloud" = 10;
}.${cfg.sync.target} or null;
"sync.interval" = {
"disabled" = 0;
"5m" = 300;
"10m" = 600;
"30m" = 1800;
"1h" = 3600;
"12h" = 43200;
"1d" = 86400;
}.${cfg.sync.interval} or null;
} // cfg.extraConfig));
in lib.hm.dag.entryAfter [ "linkGeneration" ] ''
# Ensure that settings.json exists.
touch ${configPath}
# Config has to be written to temporary variable because jq cannot edit files in place.
config="$(jq -s '.[0] + .[1]' ${configPath} ${newConfig})"
printf '%s\n' "$config" > ${configPath}
unset config
'';
};
};
}

View File

@ -88,6 +88,7 @@ in import nmtSrc {
./modules/programs/i3status
./modules/programs/irssi
./modules/programs/jujutsu
./modules/programs/joplin-desktop
./modules/programs/k9s
./modules/programs/kakoune
./modules/programs/khal

View File

@ -0,0 +1,6 @@
{
"newNoteFocus": "title",
"richTextBannerDismissed": true,
"sync.interval": 600,
"sync.target": 7
}

View File

@ -0,0 +1,23 @@
{
programs.joplin-desktop = {
enable = true;
sync = {
target = "dropbox";
interval = "10m";
};
extraConfig = {
"richTextBannerDismissed" = true;
"newNoteFocus" = "title";
};
};
test.stubs.joplin-desktop = { };
nmt.script = ''
assertFileContains activate \
'/home/hm-user/.config/joplin-desktop/settings.json'
generated="$(grep -o '/nix/store/.*-joplin-settings.json' $TESTED/activate)"
diff -u "$generated" ${./basic-configuration.json}
'';
}

View File

@ -0,0 +1 @@
{ joplin-desktop-basic-configuration = ./basic-configuration.nix; }