-
-
-
-
-
-
-
-
- logger]]>
diff --git a/src/manifest.json b/src/manifest.json
index 3625a9e06a..4694e9e9da 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -144,19 +144,47 @@
{
"id": "flows",
"route": "/flows",
- "type": "custom",
- "component": "FlowsIndex",
+ "type": "index",
"title": "Flows",
- "_note": "Custom page rather than type:index. A flow lives in OpenRegister's own native flow table, not in a register/schema, so the manifest's object-backed index cannot address it — index pages resolve rows through register+schema. The body is CnFlowIndexPage from the shared library, so the list, its app scoping and its status semantics stay identical across every app that shows flows."
+ "_note": "Ordinary index over a NAMED SOURCE, not a custom page. A flow lives in OpenRegister's own native flow table rather than a register/schema pair, so an object-backed index had nothing to address and this used to be type:custom over FlowsIndex.vue. Named index sources (nextcloud-vue 2.20.0) close that: config.entitySource names the collection and the index loads it. Columns are stated here rather than left to the source's defaults because this is the ENGINE's cross-app surface — it passes no app filter and so needs the `app` column, which a leaf app's own flow list does not. Migrating also fixes a dead listener: FlowsIndex bound @rowClick while CnIndexPage emits row-click, so opening a flow by clicking its row never worked here.",
+ "config": {
+ "entitySource": "flows",
+ "columns": [
+ {
+ "key": "name",
+ "label": "Name"
+ },
+ {
+ "key": "description",
+ "label": "Description"
+ },
+ {
+ "key": "trigger",
+ "label": "Trigger"
+ },
+ {
+ "key": "cron",
+ "label": "Schedule"
+ },
+ {
+ "key": "app",
+ "label": "App"
+ },
+ {
+ "key": "statusLabel",
+ "label": "Status"
+ }
+ ]
+ }
},
{
"id": "flowDetail",
"route": "/flows/:id",
- "type": "custom",
- "component": "FlowDetailPage",
+ "type": "flow",
"title": "Flow",
"sidebarComponent": "FlowDetailSidebar",
- "_note": "Custom page: a direct-manipulation canvas over a node/edge document is not expressible as a widget grid, and the built-in detail type is record-shaped. Controls live in the NcAppSidebar (sidebarComponent) so the canvas gets the full width; the two halves share useFlowStore because they render in different parts of the tree."
+ "_note": "The shared `flow` page type: a direct-manipulation canvas over a node/edge document is not expressible as a widget grid, and the built-in detail type is record-shaped — but that no longer requires a custom page. CnFlowEditorPage mounts the same CnFlowDetail canvas this app wrapped by hand, including the router.replace that lets a newly created flow pick up its server-assigned id. Controls live in the sidebar so the canvas gets full width, and both halves share useFlowStore.",
+ "config": {}
},
{
"id": "webhooks",
diff --git a/src/registry.js b/src/registry.js
index 46d834bc56..6e878858a6 100644
--- a/src/registry.js
+++ b/src/registry.js
@@ -83,8 +83,6 @@ export default {
AuditTrailIndex: page(() => import('./views/logs/AuditTrailIndex.vue')),
SearchTrailIndex: page(() => import('./views/logs/SearchTrailIndex.vue')),
WebhooksIndex: page(() => import('./views/webhooks/WebhooksIndex.vue')),
- FlowsIndex: page(() => import('./views/flows/FlowsIndex.vue')),
- FlowDetailPage: page(() => import('./views/flows/FlowDetailPage.vue')),
FlowDetailSidebar: page(() => import('./views/flows/FlowDetailSidebar.vue')),
WebhookLogsIndex: page(() => import('./views/webhooks/WebhookLogsIndex.vue')),
EndpointsIndex: page(() => import('./views/Endpoint/EndpointsIndex.vue')),
diff --git a/src/views/flows/FlowDetailPage.vue b/src/views/flows/FlowDetailPage.vue
deleted file mode 100644
index c337ad7709..0000000000
--- a/src/views/flows/FlowDetailPage.vue
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-