Using AssureSwarm
Linking to a filtered dashboard
Build a shareable CoworkCanvas dashboard URL that preserves its filters, search, sorting, expansion, and Universe view state.
What a dashboard link is
Section titled “What a dashboard link is”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-financeBuilding the absolute URL
Section titled “Building the absolute URL”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%20usedShared parameters
Section titled “Shared parameters”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=aud123Table parameters
Section titled “Table parameters”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/t456Processes (/dashboards/processes)
Section titled “Processes (/dashboards/processes)”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.qandtemplates.sort=<key>.<asc|desc>, with sort keystemplate|uses|lastActivity. - Table ID
assignments:assignments.qandassignments.sort=<key>.<asc|desc>, with sort keysitem|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/t456RCM (/dashboards/rcm)
Section titled “RCM (/dashboards/rcm)”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.descUniverse (/dashboards/universe)
Section titled “Universe (/dashboards/universe)”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=90dTo 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”.
Focus URL grammar
Section titled “Focus URL grammar”| 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,_workflowThe 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.
Where the values come from
Section titled “Where the values come from”| Value | Source |
|---|---|
| Table filter values | systemDashboardTable.filterOptions |
| Item IDs | items(itemType:, search:) |
| Type slugs | itemTypes |
systemDashboardTable(type: PROCESS_PORTFOLIO, tableId: "processes")