# v0.3.1 โ€” UI-restyle + taalmodule (add-on) ## Nieuw in v0.3.1 ### ๐ŸŽจ Grondige UI-restyle Grotere, touch-vriendelijke knoppen (min. 44px), ruimere spacing, grotere typografie en kaarten. Layout gecentreerd met max-breedte voor meer lucht op grote schermen. Volledig mobielvriendelijk. ### ๐Ÿ“ Inklapbaar menu (ook op desktop) De hamburger klapt de sidebar nu ook op desktop in/uit; voorkeur wordt onthouden (`localStorage`), hoofdinhoud en log-paneel schuiven mee. Op mobiel een tap-to-close overlay. ### ๐ŸŒ Taalmodule als add-on Nieuwe sectie in Instellingen โ†’ "Taalmodule": talen toevoegen, bewerken, verwijderen en ingebouwde talen (NL/EN) dupliceren als startpunt. Editor toont per sleutel de Engelse referentie met zoekfilter. Backend-endpoints: `POST/DELETE /api/i18n`, `GET /api/i18n/keys`, `GET /api/i18n//raw`. Toegevoegde talen komen als JSON in `translations/` en zijn direct beschikbaar. --- # v0.3.01 โ€” Boilerplates fixes + git-driven versioning ## Fixes bovenop v0.3.0 ### ๐Ÿ” Auto-migratie van default-repos voor upgraders Bestaande installaties (vanaf v0.2.x) hadden de Boilerplates-repo niet zichtbaar in de App Store omdat hun `config.json` in de `su-data` volume al bestond en de nieuwe `DEFAULTS["APP_REPOS"]` daardoor werd overschreven. `core/__init__.py` `load()` doet nu een eenmalige migratie: ontbrekende default-repos worden bij opstart aangevuld op basis van id, en gemarkeerd in `MIGRATIONS_DONE: ["v0.3.0_default_repos"]`. Wordt direct gepersisteerd. Verwijdert een gebruiker de Boilerplates-repo expliciet, dan komt-ie niet automatisch terug. ### ๐Ÿงน YAML-poetsstap na boilerplate-render Bij stacks waar de meeste optionele groepen uit staan (Authentik, Nextcloud, etc.) liet de Jinja-render verlaten mapping-sleutels achter (`volumes:`, `networks:`, etc. zonder kinderen). Docker-compose faalt daarop met *"block sequence entries are not allowed in this context"*. `core/boilerplates.py` `_tidy()` heeft nu een `_drop_empty_mappings()` substep die in meerdere passes mapping-sleutels verwijdert die alleen worden gevolgd door whitespace/commentaar of een sibling op gelijke/lagere indent. Werkt in cascade. ### ๐Ÿท๏ธ Versie komt nu uit git `Dockerfile` accepteert `ARG SU_VERSION=dev` en bakt die in `ENV SU_VERSION` + OCI image-label. Met `docker build --build-arg SU_VERSION=$(git describe ...)` weet het image zijn eigen versie. De Server Up UI toont automatisch de juiste waarde, ongeacht wat de productie-compose meegeeft. Forgejo Actions kan een tag-push automatisch verwerken โ€” zie `server-up-deploy/README.md`. ## Migratie vanaf v0.3.0 ```bash docker compose build --no-cache docker compose up -d ``` --- # v0.3.0 โ€” UI rebuild + Boilerplates support ## Hoogtepunten ### ๐ŸŽจ Nieuwe UI (Tailwind + Alpine + HTMX) - `templates/index.html` is volledig herschreven. De handgeschreven CSS (`--bg/--s1/...` variabelen, ad-hoc grid-classes) is vervangen door Tailwind utility-classes met een gematchte donker/licht-palette. - Statebeheer via Alpine.js: รฉรฉn `app()` component bovenop het hele document, geen `$=document.getElementById`-spaghetti meer. - HTMX is geladen voor toekomstige server-rendered partials. Het bestaande fetch-RPC patroon blijft werken; HTMX kan progressief worden ingezet. - Modals, toasts, terminal-overlay en first-run wizard zitten allemaal in รฉรฉn Alpine-state โ€” geen losse globale variabelen meer. - Mobiele sidebar gedraagt zich nu correct (slide-in i.p.v. layout-flip). ### ๐Ÿงฉ ChristianLempa Boilerplates ondersteund Server Up herkent nu twee stack-formaten naast elkaar: | Formaat | Detectie | Bron | |---|---|---| | **Compose** (origineel) | `compose.yml` / `docker-compose.yml` (+ optioneel `stack.json`) | bes-r/server-up | | **Boilerplate** (nieuw) | `template.json` + `files/` | ChristianLempa/boilerplates-library | Nieuw bestand `app/core/boilerplates.py`: - `is_boilerplate(d)` โ€” detectie - `metadata(d)` โ€” converteert `template.json["metadata"]` (incl. selfhst-icons) naar Server-Up formaat - `fields(d)` โ€” flattened variable-schema voor de install-modal - `render_to_dir(src, dest, values)` โ€” rendert `files/*.yaml` met de Jinja-achtige `<< var >>` + `<%- if expr %>` syntax die de boilerplates gebruiken (Jinja2 met custom delimiters). Niet-tekst bestanden worden verbatim gekopieerd. `app/core/git.py` โ†’ `_scan_compose_dirs` herkent beide formaten en zet `format: "boilerplate"` in de stack-entry zodat de UI er een badge bij kan tonen. `app/app.py`: - `_find_stack_src` accepteert ook boilerplate-mappen. - `POST /api/store/preview` retourneert voor boilerplates het variabelen-schema (`fields`) plus een gerenderde preview met defaults. - `POST /api/store/install` met body `{values: {...}}` rendert de templates voor je voordat de stack gestart wordt. ### โš™๏ธ Default-repos Een nieuwe Server Up komt nu uit de doos met twee app-repositories: 1. `bes-r/server-up` โ€” eigen stacks, submap `apps` 2. `ChristianLempa/boilerplates-library` โ€” community templates, submap `compose` ### ๐Ÿ“ฆ Versie / Dockerfile - `SU_VERSION` = `0.3.0` in `Dockerfile` en `docker-compose.yml` - `requirements.txt`: Jinja2 expliciet toegevoegd (was al een Flask-dep) ## Migratie vanaf v0.2.29 - Build opnieuw: `docker compose up -d --build --no-cache` - Bestaande stacks blijven werken (legacy formaat is intact). - De Boilerplates-repo wordt automatisch toegevoegd voor verse installs. Bestaande gebruikers kunnen de repo handmatig toevoegen via Instellingen โ†’ Git Repositories met submap `compose`. ## Bekende beperkingen - Boilerplate-templates met onbekende custom-filters of complexe Ansible-style conditionals kunnen falen โ€” de fout verschijnt in het terminal-paneel. - `volumes:` blokken die conditioneel zijn (`<%- if volume_mode == 'local' %>`) werken; complexere render-logica (loops over services) is nog niet getest. - HTMX is geladen maar de meeste interacties draaien nog op fetch-RPC. Verdere migratie naar server-rendered partials kan stapsgewijs in volgende releases.