Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ jobs:
- name: Install frontend dependencies
run: npm install

- name: Frontend tests
run: npm test

- name: Rust tests
working-directory: src-tauri
run: cargo test
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@ De centrale hub voor de open source bouwsoftware van de [OpenAEC Foundation](htt
## Functies

- **Catalogus** van alle OpenAEC-tools met omschrijving en categorie — desktop-apps én webtools
- **Installatiedetectie**: ziet via het Windows-register welke tools al geïnstalleerd zijn en welke versie
- **Installatiedetectie**: ziet welke tools al geïnstalleerd zijn en welke versie (Windows: via het register; Linux: via de beheerde AppImage-map)
- **Updatedetectie**: vergelijkt de geïnstalleerde versie met de laatste GitHub-release
- **Eén klik installeren of bijwerken**: downloadt de officiële installer van GitHub Releases en start hem
- **Starten** van geïnstalleerde tools en openen van webtools in de browser
- **Starten** van geïnstalleerde tools
- **Webtools in tabbladen**: webtools (en de webversies van desktop-tools) draaien in tabs binnen de installer zelf; open tabs worden onthouden en behouden hun staat bij wisselen. Openen in de externe browser blijft mogelijk
- **Werkt zichzelf bij**: de installer controleert ook zijn eigen versie en meldt het wanneer er een nieuwe versie is — bijwerken kan met één klik vanuit de app
- Volledig in de [OpenAEC-huisstijl](https://github.com/OpenAEC-Foundation/OpenAEC-style-book), met vijf thema's (licht, Forge, OpenAEC, Blueprint, hoog contrast) en tweetalige interface (NL/EN)

> Installatie- en updatedetectie werkt momenteel op Windows. De catalogus en websnelkoppelingen werken op alle platformen.
> Installeren, bijwerken en starten werkt op Windows (via de officiële installers) en Linux (via AppImages, zonder beheerdersrechten — inclusief menu-snelkoppeling). De catalogus en websnelkoppelingen werken op alle platformen; macOS-installatie volgt nog.

## Downloaden

Expand All @@ -37,6 +38,8 @@ Vereisten: [Node.js](https://nodejs.org/) 20+, [Rust](https://rustup.rs/) (stabl
npm install
npm run tauri dev # ontwikkelmodus
npm run tauri build # productie-build + installers
npm test # frontend-tests (vitest)
cd src-tauri && cargo test # backend-tests
```

### Een tool toevoegen aan de catalogus
Expand All @@ -46,7 +49,7 @@ Voeg een entry toe aan [`src/data/catalog.ts`](src/data/catalog.ts):
- `kind: "desktop"` — met `repo` (GitHub `owner/naam`), `registryName` (DisplayName in de Windows Uninstall-registersleutel, meestal gelijk aan de productnaam) en `exeName` als fallback
- `kind: "web"` — met alleen een `webUrl`

De laatste release en het juiste Windows-installer-asset worden automatisch via de GitHub API opgehaald.
De laatste release en het juiste installer-asset voor het platform (Windows: `-setup.exe`/`.msi`, Linux: `.AppImage`) worden automatisch via de GitHub API opgehaald.

## Release maken

Expand Down
81 changes: 81 additions & 0 deletions docs/superpowers/specs/2026-07-20-webtool-tabs-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Webtools in tabbladen — ontwerp

Datum: 2026-07-20

## Doel

Webtools uit de catalogus openen in tabbladen binnen de OpenAEC Installer in
plaats van in een externe browser. De installer wordt daarmee één werkplek voor
zowel desktop-tools als webtools.

## Uitgangspunt

De webtools hebben alleen een webview nodig. Geen enkele tool op
`*.open-aec.com` stuurt `X-Frame-Options` of een `frame-ancestors`-CSP
(gecontroleerd op alle zes de domeinen), en `tauri.conf.json` zet zelf geen CSP
(`"csp": null`). Iframes binnen het bestaande webview volstaan dus — er is geen
Rust-code en geen extra Tauri-feature nodig.

## Gedrag

**Tabmodel — browserachtig.** Een vaste, niet-sluitbare tab "Catalogus" plus een
sluitbare tab per geopende webtool. De tabbalk verschijnt alleen zodra er een
webtool open staat, zodat de gewone catalogusweergave geen overbodige chrome
krijgt.

**Reikwijdte.** Elke tool met een `webUrl` kan in een tab: de vijf web-only
tools én de webversies van desktop-tools. Installeren en starten van
desktop-tools verandert niet.

**Knopgedrag.** Bij web-only tools is "Openen" de primaire knop en opent die een
tab. Bij alle tools met een `webUrl` opent de klikbare preview eveneens een tab.
Een icoonknop "Openen in browser" blijft op elke kaart aanwezig, en ook in de
balk boven een geopende tab — dat is tevens de vluchtroute mocht een site ooit
embedding gaan blokkeren.

**Staat behouden.** Alle open tabs blijven gemount; inactieve worden met
`hidden` verborgen. Wisselen tussen tabs herlaadt de tool dus niet en behoudt
sessie en invoer. De catalogus blijft eveneens gemount (scrollpositie behouden).

**Dedupliceren.** Een tool die al open staat, opent geen tweede tab maar
activeert de bestaande.

**Sluiten.** Sluit je de actieve tab, dan springt de focus naar de rechterbuur,
anders de linker, anders terug naar de catalogus — zoals in een browser.

**Herstel.** De open tabs en de actieve tab worden bewaard in de bestaande
instellingen-store en bij het opstarten hersteld. Bewaarde ids die niet meer in
de catalogus staan of geen `webUrl` meer hebben, vallen weg. De pagina-staat
binnen een tool wordt niet bewaard — die laadt vers.

## Componenten

| Bestand | Verantwoordelijkheid |
|---|---|
| `src/lib/tabs.ts` | Pure tab-logica: openen, dedupliceren, sluiten, herstellen. Geen React. |
| `src/components/TabBar.tsx` | De tabbalk. |
| `src/components/WebToolView.tsx` | Eén webtool in een iframe, met herlaad- en browserknop. |
| `src/App.tsx` | Tab-state, persistentie, weergaveschakeling. |
| `src/components/ToolCard.tsx` | Roept `onOpenTab` aan in plaats van extern openen. |

De tab-logica staat bewust los van React zodat ze zonder DOM te testen is.

## Beperkingen

- Links binnen een webtool die naar een externe site wijzen, navigeren binnen de
tab; met de herlaadknop kom je terug bij de tool.
- `target="_blank"`-popups werken binnen een iframe mogelijk niet. Als dat in de
praktijk knelt, is de vervolgstap native child-webviews (Tauri `unstable`) —
bewust uitgesteld tot er een concrete aanleiding is.
- Zware tools (Pointcloud) open houden kost geheugen; de tab sluiten ruimt op.
- Herladen gebeurt door de iframe te vervangen: cross-origin `location.reload()`
is vanuit de app niet toegestaan.

## Verificatie

- `npm test` — 10 tests op de tab-logica (openen, dedupliceren, sluitfocus,
herstelfiltering).
- `npm run build` — typecontrole en productiebuild.
- Handmatig in de draaiende frontend: tab openen, wisselen met behoud van staat,
dubbel openen, sluiten van actieve en laatste tab, iframe-lading van
`open-calc-studio` en `open-heatloss-studio`.
Loading
Loading