Skip to content

Using AssureSwarm

Linking to a filtered dashboard

Build a shareable CoworkCanvas dashboard URL that preserves its filters, search, sorting, expansion, and Universe view state.

Everything you can filter, search, sort, expand or select on these dashboards is in the URL. Copy the address bar and the recipient sees the same view; an agent can compose one the same way.

For example, this link opens Processes with its own view state:

https://acme.coworkcanvas.com/dashboards/processes?range=6m&processes.area=area-finance

Build a link from https://<your-subdomain>.coworkcanvas.com and a locale-free path such as /dashboards/processes. An agent can get the origin from get_current_context → currentView.pageUrl, or from the plugin’s canvas_url.

Unknown keys are removed when the dashboard loads. A non-empty value for a declared filter key is retained even if it matches no current option or returns no rows; the table simply shows no rows. Malformed reserved values, such as an invalid sort, search, or expansion value, are canonicalized away.

https://acme.coworkcanvas.com/dashboards/processes?range=12m&processes.area=No%20longer%20used

These parameters apply where the dashboard offers them:

Parameter Meaning
range=6m|12m|ytd Reporting range. 6m is the default and is added when absent.
scope=<domain> A dashboard scope, where the dashboard offers scope selection.
entity=<auditId> The selected audit on Risk Control Matrix only.
view= The selected SOX Program view only.
https://acme.coworkcanvas.com/dashboards/rcm?range=12m&entity=aud123

Table state uses <tableId>.<key>. Every table may use q for search and sort=<key>.<asc|desc> for sort order, expressed as <tableId>.q and <tableId>.sort. Expandable tables use one or more expand=<rowId>[/<childRowId>] parameters.

Only table keys in the current dashboard composition, plus recursive childTableId descendants, are accepted; the broader table-definition registry does not make every table key valid on every view. Ordinary expansion segments are 1–64 characters: a leading ASCII letter or digit followed by ASCII letters, digits, underscores or hyphens. Library-installed and library-copy template IDs also accept the exact forms wl_<64 hexadecimal characters> and wlcopy_<64 hexadecimal characters>. These are the only longer forms accepted; all three forms are matched case-insensitively. On Processes, a nested-only expand=<processId>/<templateId> expands both ancestors, so it opens the process and then that template without a separate parent expand parameter.

https://acme.coworkcanvas.com/dashboards/processes?processes.q=vendor&processes.sort=uses.desc&expand=p123/t456

Processes uses table ID processes. Its supported filter keys are processes.area=<area option value>, processes.controls=any|none, and processes.risks=any|exposed. Get area values from systemDashboardTable(type: PROCESS_PORTFOLIO, tableId: "processes") → filterOptions.options[].value for the entry whose key is area. Use processes.q for search and processes.sort=<key>.<asc|desc> with one of process|area|owner|frequency|templates|uses|controls|risks.

Use expand=<processId> to open a process or expand=<processId>/<templateId> to open a process and template. The nested tables accepted through recursive child closure are:

  • Table ID templates: templates.q and templates.sort=<key>.<asc|desc>, with sort keys template|uses|lastActivity.
  • Table ID assignments: assignments.q and assignments.sort=<key>.<asc|desc>, with sort keys item|status|currentStep|lastActivity.

Their hidden parent filters (templates.process, assignments.process, and assignments.template) are derived from the expansion path and are not URL filter keys.

https://acme.coworkcanvas.com/dashboards/processes?range=6m&assignments.q=overdue&assignments.sort=lastActivity.desc&processes.controls=none&processes.q=vendor&processes.sort=uses.desc&templates.q=annual&templates.sort=uses.desc&expand=p123/t456

Risk Control Matrix uses table ID RCM_MATRIX. Select its audit with entity=<auditId>, then use RCM_MATRIX.audit, RCM_MATRIX.type, and RCM_MATRIX.coverage; get their values from the table’s filterOptions. Use RCM_MATRIX.q for search and RCM_MATRIX.sort=<key>.<asc|desc> with one of item|audit|coverage|signedOff.

https://acme.coworkcanvas.com/dashboards/rcm?range=12m&entity=aud123&RCM_MATRIX.coverage=pending&RCM_MATRIX.sort=signedOff.desc

Universe filters have two URL modes. With no Universe filter keys, the implicit default selects every value in every item-type filterable field and shows every ordinary fieldless item type. Synthetic types have mode-specific defaults. The full graph shows only _workflow_template; ego and path focus show _workflow_template plus _template_step. _workflow and _step are hidden by default in all three modes.

Once any Universe filter key is present, the URL is an explicit, complete snapshot. It emits every filterable field as <typeSlug>.<fieldKey>=v1,v2 or <typeSlug>.<fieldKey>= for zero selected values, and every fieldless type as <typeSlug>=visible or <typeSlug>= when hidden. A complete snapshot includes all four synthetic selectors. Each explicit empty value remains in the canonical URL.

Do not omit individual selectors from an explicit snapshot. The legacy parser treats an omitted filterable field as empty and an omitted fieldless type as hidden; omission invokes the mode-specific defaults above only when the URL contains no Universe filter keys at all. Universe view state uses q, node=<nodeId>, window=7d|30d|90d|1y, and the focus-mode keys focus, depth and hops described below. The run-time steps kind is an ordinary fieldless type: _step=visible shows it, _step= hides it (steps=1 is no longer read).

Universe owns q, node, window, focus, depth and hops: writing a view replaces those six keys, then writes only non-default values. The canonical defaults are no search, no selected node, and window=30d omitted from the URL.

For a schema whose only item-type selectors are control.status and a fieldless risk type, this link is a complete explicit snapshot that shows only run steps among the synthetic kinds:

https://acme.coworkcanvas.com/dashboards/universe?control.status=active,planned&risk=visible&_workflow_template=&_template_step=&_workflow=&_step=visible&q=vendor&node=itm123&window=90d

To share the same schema with no control statuses selected and the risk type hidden while retaining the full-graph synthetic defaults, retain every selector:

https://acme.coworkcanvas.com/dashboards/universe?control.status=&risk=&_workflow_template=visible&_template_step=&_workflow=&_step=

Universe focus (/dashboards/universe?focus=…)

Section titled “Universe focus (/dashboards/universe?focus=…)”

Focus mode draws the neighbourhood of one node: the node at the centre and every node within a number of hops on concentric rings. It has two shapes:

  • Ego mode: the same kinds are followed at every hop.
  • Path mode: one kind per hop, so a link can say “this audit → its workflow runs → their steps → the controls in those steps → the templates those controls are linked to → every run of those templates”.
Parameter Grammar Default Notes
focus a node id (below) none (the full graph) An unknown or invisible id is cleared and the full graph shown.
depth 1 … 6 2 (omitted) Ego mode only; ignored when hops is present.
hops comma-separated type slugs, 1–6 none (ego mode) Path mode. Ring k contains only the kind hops[k-1]. Unknown slugs are dropped and the URL corrected.
type filters the Universe grammar above see below Ego mode: the visible types are the kinds followed at every hop. Path mode: the path decides; type filters are ignored for traversal.

Node ids: items use the item id; workflow templates template-<templateId>; template steps tstep-<templateId>:<diagramNodeId>; workflow runs workflow-<workflowId>; run steps step-<stepId>.

Kinds (type slugs): every item type slug plus the synthetic kinds _workflow_template, _template_step, _workflow (runs) and _step (run steps). With no Universe filter keys, ego mode follows every item type plus _workflow_template and _template_step; list kinds explicitly to narrow (any filter key makes the URL a complete snapshot, exactly as above).

Each ring keeps at most 150 nodes per kind, choosing the most connected, and folds the rest into one “N more <kind>” node. Narrow the kinds or reduce the depth when a link reports that cap.

/dashboards/universe?focus=<processId>&depth=2
/dashboards/universe?focus=<processId>&depth=3&process=visible&_workflow_template=visible&_template_step=visible&control=visible&risk=visible&_workflow=&_step=
/dashboards/universe?focus=<auditId>&hops=_workflow,_step,control,_workflow_template,_workflow

The universeFocus query returns the accepted server neighbourhood for an agent (input { focus, depth, kinds, hops }). Its accepted focus, depth, hops, kinds and capped values correspond to the page’s focus state, as do each node’s ring and collapsed values.

The page’s JSON download is not a raw copy of that response. It exports the currently drawn subset after the client applies type and field filters, search, and timeline playback. Edge records keep the GraphQL shape: id, sourceId, targetId, edgeType and label. Export nodes are normalized to id, typeSlug, kind, title, status, ring, href and collapsed; they omit the GraphQL node’s description and filterFields and add the display kind.

Value Source
Table filter values systemDashboardTable.filterOptions
Item IDs items(itemType:, search:)
Type slugs itemTypes
systemDashboardTable(type: PROCESS_PORTFOLIO, tableId: "processes")