136 lines
3.6 KiB
Nix
136 lines
3.6 KiB
Nix
|
{ 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.hm.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 [
|
||
|
"undefined"
|
||
|
"none"
|
||
|
"file-system"
|
||
|
"onedrive"
|
||
|
"nextcloud"
|
||
|
"webdav"
|
||
|
"dropbox"
|
||
|
"s3"
|
||
|
"joplin-server"
|
||
|
"joplin-cloud"
|
||
|
];
|
||
|
default = "undefined";
|
||
|
example = "dropbox";
|
||
|
description = "What is the type of sync target.";
|
||
|
};
|
||
|
|
||
|
interval = lib.mkOption {
|
||
|
type = lib.types.enum [
|
||
|
"undefined"
|
||
|
"disabled"
|
||
|
"5m"
|
||
|
"10m"
|
||
|
"30m"
|
||
|
"1h"
|
||
|
"12h"
|
||
|
"1d"
|
||
|
];
|
||
|
default = "undefined";
|
||
|
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" = {
|
||
|
"undefined" = null;
|
||
|
"none" = 0;
|
||
|
"file-system" = 2;
|
||
|
"onedrive" = 3;
|
||
|
"nextcloud" = 5;
|
||
|
"webdav" = 6;
|
||
|
"dropbox" = 7;
|
||
|
"s3" = 8;
|
||
|
"joplin-server" = 9;
|
||
|
"joplin-cloud" = 10;
|
||
|
}.${cfg.sync.target};
|
||
|
|
||
|
"sync.interval" = {
|
||
|
"undefined" = null;
|
||
|
"disabled" = 0;
|
||
|
"5m" = 300;
|
||
|
"10m" = 600;
|
||
|
"30m" = 1800;
|
||
|
"1h" = 3600;
|
||
|
"12h" = 43200;
|
||
|
"1d" = 86400;
|
||
|
}.${cfg.sync.interval};
|
||
|
} // cfg.extraConfig));
|
||
|
in lib.hm.dag.entryAfter [ "linkGeneration" ] ''
|
||
|
# Ensure that settings.json exists.
|
||
|
mkdir -p ${builtins.dirOf configPath}
|
||
|
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
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
}
|