commit 6dc75ce978e8a8d631f3a3b5f34af8b970164586
Author: Jens Kristoffersson <jenkr@vgregion.se>
AuthorDate: Tue Sep 8 15:34:13 2026 +0200
Commit: Jens Kristoffersson <jenkr@vgregion.se>
CommitDate: Tue Sep 8 15:34:13 2026 +0200
Subfloden: wiki + README
- docs/wiki.html: nytt avsnitt "Subfloden & flikar", call_flow-stegkort,
TOC-lank.
- README: webui-avsnittet beskriver flikar + call_flow; flodesformatet
namner subflows.
---
README.md | 12 +++++++++---
docs/wiki.html | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index f8a608e..c8910f8 100644
--- a/README.md
+++ b/README.md
@@ -74,6 +74,11 @@ in-handtag sitter upptill, utgångarna nedtill. Dra en nod för att flytta den
lägga till en lös nod; koppla sedan ihop den. Typ-dropdownen i noden finns kvar
för att byta typ på plats. Fliken **Block** = återanvändbara flödesdelar (se
nedan).
+- **Subflöden & flikar** – flikraden ovanför canvasen visar `Main` + en flik per
+ lokal subgraf (`+` skapar, dubbelklick döper om). En **`call_flow`**-nod kör ett
+ annat flöde eller en lokal subgraf som ett steg, med explicit in-/ut-mappning
+ (`target` = flödesnamn eller `#<subflow-id>`). Varje subflow-flik har en
+ "Kör denna flik"-knapp för att testa den isolerat.
- **⚙-menyn** (uppe till höger) – Nytt/Ta bort flöde, Exportera, close-mode,
körningsinställningar (headless/skip_browser/viewport…), **Kör-parametrar /
indata**, språk, **Inspektera fönster**, Wiki.
@@ -441,9 +446,10 @@ npm test # vitest (graf-round-trip)
Stegtyperna kommer från `GET /api/step-schema` (dvs. [`rpa/schema.py`](rpa/schema.py)),
så nya steg behöver bara läggas där + i `flow_engine.py` – UI:t renderar dem
automatiskt. Flödet lagras som en nod/kant-graf
-(`{format:"graph", nodes, edges, start, settings}`); gamla `{steps}`-flöden
-migreras vid inläsning ([`rpa/migrate.py`](rpa/migrate.py)) och körs av
-[`rpa/graph_engine.py`](rpa/graph_engine.py).
+(`{format:"graph", nodes, edges, start, settings, subflows}`); gamla
+`{steps}`-flöden migreras vid inläsning ([`rpa/migrate.py`](rpa/migrate.py)) och
+körs av [`rpa/graph_engine.py`](rpa/graph_engine.py). `subflows` är lokala
+namngivna subgrafer som `call_flow`-noder anropar.
## Bygga en egen fristående automation
diff --git a/docs/wiki.html b/docs/wiki.html
index e214090..42b951d 100644
--- a/docs/wiki.html
+++ b/docs/wiki.html
@@ -174,6 +174,7 @@
<li><a href="#loop">Loop: DOM vs. lista</a></li>
<li><a href="#recept">Recept (arbetsflöden)</a></li>
<li><a href="#etiketter">Grenar, sammanslagning & loopar</a></li>
+ <li><a href="#subfloden">Subflöden & flikar</a></li>
<li><a href="#felsokning">Felsökning</a></li>
<li><a href="#datamappar">Datamappar</a></li>
<li><a href="#sprak">Språk (i18n)</a></li>
@@ -561,6 +562,21 @@ run_script scripts/merge_and_print.py
<code>else</code>-kant tar den vägen slut. Se <a href="#villkor">Villkor</a>.</p>
</div>
+ <div class="step-card">
+ <h3><code>call_flow</code> <span class="tag">Anropa subflöde</span></h3>
+ <ul class="field-list">
+ <li><code>target</code> – ett externt sparat flödesnamn, ELLER <code>#<subflow-id></code> för en lokal subgraf i samma fil</li>
+ <li><code>in</code> – lista av <code>{name, value}</code>; <code>name</code> = subflödets indata, <code>value</code> stödjer <code>{variabel}</code></li>
+ <li><code>out</code> – lista av <code>{from, to}</code>; kopierar subflödets slutvariabel <code>from</code> till anroparens variabel <code>to</code></li>
+ </ul>
+ <p>Kör ett annat flöde som ett steg (vanliga handtag <code>in</code>/<code>out</code>).
+ Subflödet får en <strong>egen tom variabel-namnrymd</strong> som seedas ur
+ <code>in</code> (och subflödets deklarerade <code>inputs</code>-default);
+ bara det du listar i <code>out</code> följer med tillbaka. Samma webbläsare/
+ flik och inställningar som anroparen. Cirkulära anrop (A→B→A) och för djup
+ kedja avbryts med <code>FlowError</code>. Se <a href="#subfloden">Subflöden & flikar</a>.</p>
+ </div>
+
<div class="step-card">
<h3>Universella fält (alla noder)</h3>
<ul class="field-list">
@@ -766,6 +782,31 @@ run_script path "scripts/merge_and_print.py"
</ul>
</section>
+ <section id="subfloden">
+ <h2>Subflöden & flikar</h2>
+ <p>För att hålla stora flöden läsbara går det att bryta ut delar och
+ <strong>anropa</strong> dem med en <code>call_flow</code>-nod:</p>
+ <ul>
+ <li><strong>Lokala subgrafer</strong> ligger i samma flödesfil under nyckeln
+ <code>subflows: [{id, name, nodes, edges, start, inputs}]</code>. I
+ canvasen är de egna <strong>flikar</strong> bredvid "Main" (<code>+</code>
+ skapar en, dubbelklick döper om). <code>call_flow</code> med
+ <code>target: "#<id>"</code> kör en.</li>
+ <li><strong>Externa flöden</strong> – ett vanligt sparat flöde anropas med
+ <code>target</code> = dess namn.</li>
+ <li><strong>Indata/utdata</strong> mappas explicit (<code>in</code>/<code>out</code>
+ på noden). Subflödet är en "ren funktion": det ser inte anroparens
+ variabler och bara det som listas i <code>out</code> kommer tillbaka.</li>
+ <li>Varje subflow-flik har en <strong>"Kör denna flik"</strong>-knapp som kör
+ just den subgrafen (med en dialog för dess egna <code>inputs</code>) – bra
+ för att testa isolerat.</li>
+ </ul>
+ <pre><code>// Main: ... -> call_flow(target="#dubbla", in=[{name:"x", value:"{v}"}],
+// out=[{from:"y", to:"r"}]) -> ...
+// subflows: [{ id:"dubbla", name:"Dubbla", inputs:[{name:"x"}],
+// nodes:[{id:"s1", type:"set_var", var:"y", text:"{x}{x}"}], edges:[] }]</code></pre>
+ </section>
+
<section id="felsokning">
<h2>Felsökning</h2>
<table>