foxygit / RPA-Remisser Log in
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 &amp; loopar</a></li>
+    <li><a href="#subfloden">Subflöden &amp; 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>#&lt;subflow-id&gt;</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 &amp; 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 &amp; 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: "#&lt;id&gt;"</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>