docs: add clan options search page
This provides a simpler and more intuitive search over a flat list of possible options. Styling still to be improved
This commit is contained in:
@@ -179,6 +179,7 @@ nav:
|
||||
- 04-fetching-nix-from-python: decisions/04-fetching-nix-from-python.md
|
||||
- 05-deployment-parameters: decisions/05-deployment-parameters.md
|
||||
- Template: decisions/_template.md
|
||||
- Options: options.md
|
||||
|
||||
docs_dir: site
|
||||
site_dir: out
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
asciinema-player-css,
|
||||
roboto,
|
||||
fira-code,
|
||||
docs-options,
|
||||
...
|
||||
}:
|
||||
let
|
||||
@@ -55,5 +56,6 @@ pkgs.stdenv.mkDerivation {
|
||||
|
||||
installPhase = ''
|
||||
cp -a out/ $out/
|
||||
cp -r ${docs-options} $out/options-page
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
{ inputs, self, ... }:
|
||||
{
|
||||
imports = [
|
||||
./options/flake-module.nix
|
||||
];
|
||||
perSystem =
|
||||
{
|
||||
config,
|
||||
@@ -124,7 +127,7 @@
|
||||
packages = {
|
||||
docs = pkgs.python3.pkgs.callPackage ./default.nix {
|
||||
clan-core = self;
|
||||
inherit (self'.packages) clan-cli-docs inventory-api-docs;
|
||||
inherit (self'.packages) clan-cli-docs docs-options inventory-api-docs;
|
||||
inherit (inputs) nixpkgs;
|
||||
inherit module-docs;
|
||||
inherit asciinema-player-js;
|
||||
|
||||
167
docs/nix/options/flake-module.nix
Normal file
167
docs/nix/options/flake-module.nix
Normal file
@@ -0,0 +1,167 @@
|
||||
{ self, config, ... }:
|
||||
{
|
||||
perSystem =
|
||||
{
|
||||
inputs',
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (lib)
|
||||
mapAttrsToList
|
||||
flip
|
||||
mapAttrs
|
||||
mkOption
|
||||
types
|
||||
splitString
|
||||
stringLength
|
||||
substring
|
||||
;
|
||||
inherit (self) clanLib;
|
||||
|
||||
serviceModules = self.clan.modules;
|
||||
|
||||
baseHref = "/options-page/";
|
||||
|
||||
evalService =
|
||||
serviceModule:
|
||||
lib.evalModules {
|
||||
modules = [
|
||||
{
|
||||
imports = [
|
||||
serviceModule
|
||||
../../../lib/inventory/distributed-service/service-module.nix
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
getRoles = module: (evalService module).config.roles;
|
||||
|
||||
getManifest = module: (evalService module).config.manifest;
|
||||
|
||||
loadFile = file: if builtins.pathExists file then builtins.readFile file else "";
|
||||
|
||||
settingsModules =
|
||||
module: flip mapAttrs (getRoles module) (_roleName: roleConfig: roleConfig.interface);
|
||||
|
||||
# Map each letter to its capitalized version
|
||||
capitalizeChar =
|
||||
char:
|
||||
{
|
||||
a = "A";
|
||||
b = "B";
|
||||
c = "C";
|
||||
d = "D";
|
||||
e = "E";
|
||||
f = "F";
|
||||
g = "G";
|
||||
h = "H";
|
||||
i = "I";
|
||||
j = "J";
|
||||
k = "K";
|
||||
l = "L";
|
||||
m = "M";
|
||||
n = "N";
|
||||
o = "O";
|
||||
p = "P";
|
||||
q = "Q";
|
||||
r = "R";
|
||||
s = "S";
|
||||
t = "T";
|
||||
u = "U";
|
||||
v = "V";
|
||||
w = "W";
|
||||
x = "X";
|
||||
y = "Y";
|
||||
z = "Z";
|
||||
}
|
||||
.${char};
|
||||
|
||||
title =
|
||||
name:
|
||||
let
|
||||
# split by -
|
||||
parts = splitString "-" name;
|
||||
# capitalize first letter of each part
|
||||
capitalize = part: (capitalizeChar (substring 0 1 part)) + substring 1 (stringLength part) part;
|
||||
capitalizedParts = map capitalize parts;
|
||||
in
|
||||
builtins.concatStringsSep " " capitalizedParts;
|
||||
|
||||
fakeInstanceOptions =
|
||||
name: module:
|
||||
let
|
||||
manifest = getManifest module;
|
||||
description = ''
|
||||
# ${title name} (Clan Service)
|
||||
|
||||
**${manifest.description}**
|
||||
|
||||
${loadFile (module._file + "/../README.md")}
|
||||
|
||||
${
|
||||
if manifest.categories != [ ] then
|
||||
"Categories: " + builtins.concatStringsSep ", " manifest.categories
|
||||
else
|
||||
"No categories defined"
|
||||
}
|
||||
|
||||
'';
|
||||
in
|
||||
{
|
||||
options = {
|
||||
_ = mkOption {
|
||||
type = types.raw;
|
||||
};
|
||||
instances.${name} = lib.mkOption {
|
||||
inherit description;
|
||||
type = types.submodule {
|
||||
options.roles = flip mapAttrs (settingsModules module) (
|
||||
roleName: roleSettingsModule:
|
||||
mkOption {
|
||||
type = types.submodule {
|
||||
imports = [
|
||||
(import ../../../lib/inventory/build-inventory/roles-interface.nix {
|
||||
inherit clanLib;
|
||||
nestedSettingsOption = mkOption {
|
||||
type = types.raw;
|
||||
description = ''
|
||||
See [instances.${name}.roles.${roleName}.settings](${baseHref}?option_scope=0&option=instances.${name}.roles.${roleName}.settings)
|
||||
'';
|
||||
};
|
||||
settingsOption = mkOption {
|
||||
type = types.submoduleWith {
|
||||
modules = [ roleSettingsModule ];
|
||||
};
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mkScope = name: modules: {
|
||||
inherit name;
|
||||
modules = [
|
||||
(import ../../../lib/inventory/build-inventory/interface.nix {
|
||||
inherit clanLib;
|
||||
noInstanceOptions = true;
|
||||
})
|
||||
] ++ mapAttrsToList fakeInstanceOptions modules;
|
||||
urlPrefix = "https://github.com/nix-community/dream2nix/blob/main/";
|
||||
};
|
||||
in
|
||||
{
|
||||
packages.docs-options = inputs'.nuschtos.packages.mkMultiSearch {
|
||||
inherit baseHref;
|
||||
title = "Clan Options";
|
||||
# scopes = mapAttrsToList mkScope serviceModules;
|
||||
scopes = [ (mkScope "Clan Inventory" serviceModules) ];
|
||||
};
|
||||
};
|
||||
}
|
||||
14
docs/overrides/options.html
Normal file
14
docs/overrides/options.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends "base.html" %} {% block extrahead %}
|
||||
<style>
|
||||
.md-main__inner {
|
||||
max-width: 100% !important;
|
||||
}
|
||||
.md-content {
|
||||
max-width: 100% !important;
|
||||
}
|
||||
.md-main__inner {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
</style>
|
||||
{% endblock %} {% block site_nav %}{% endblock %} {% block content %} {{
|
||||
page.content }} {% endblock %}
|
||||
6
docs/site/options.md
Normal file
6
docs/site/options.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
template: options.html
|
||||
---
|
||||
|
||||
|
||||
<iframe src="/options-page/" height="1000" width="100%"></iframe>
|
||||
Reference in New Issue
Block a user