Skip to content

Convert the pilot OOB dashboards to SmartViz - #180

Merged
clarkd merged 17 commits into
mainfrom
claude/oob-dashboards-smartviz-r68skj
Nov 6, 2026
Merged

clarkd merged 17 commits into
mainfrom
claude/oob-dashboards-smartviz-r68skj

Conversation

@clarkd

@clarkd clarkd commented Nov 5, 2026 •

Copy link
Copy Markdown
Member

📋 Summary

This PR converts the classic tiles in the out-of-the-box dashboards of three pilot plugins to SmartViz: TransportForLondon, WorldCup2026 and OpenF1. It's phase 0 of moving every OOB dashboard to SmartViz. OpenF1's Driver Photo tile stays classic, because SmartViz has no iframe equivalent.

It also fixes EcoStruxureIT-DCE and LaunchDarkly, whose SmartViz value labels and status grid lines were showing up blank. Install-time templating runs the whole dashboard through Handlebars and empties any expression it doesn't recognise, so I've wrapped their SmartViz templates in {{{{raw}}}} (the same thing Auvik does).

Note

This PR changes five plugins, so the single-plugin CI check will fail. That's deliberate: the conversion is going in grouped waves, and an admin will need to override the check.

🧩 Plugin details

  • Plugin name: TransportForLondon (1.0.7), WorldCup2026 (1.2.3), OpenF1 (1.1.1), EcoStruxureIT-DCE (1.0.3), LaunchDarkly (1.0.1)
  • Type of change:
    • Bug fix
    • New datastream
    • Enhancement to existing datastream
    • Performance improvement
    • Documentation / metadata / logo
    • Other (please describe): pilot dashboards converted from classic visualisations to SmartViz

🧪 Testing

I deployed the classic (main) and converted versions of the pilot plugins to a DEV organization and compared every dashboard side by side: TfL and World Cup 2026 with live data, OpenF1 with demo data. squaredup validate passes for all five plugins.

A few things haven't been rendered yet: three OpenF1 tiles (Driver Details, Meeting Details and Weather) and the EcoStruxureIT-DCE and LaunchDarkly fixes.

Known differences from classic: status cells show the state name rather than the value, clicking a donut slice or bar doesn't open a filtered view, and OpenF1 Lap Times hides line markers to match classic (so a driver with a single lap draws nothing, as in classic).

⚠️ Breaking changes

Does this PR introduce any breaking changes?

  • No
  • Yes (please describe):

📚 Documentation

  • Documentation updated
  • No documentation changes needed

✅ Checklist

  • This PR changes a single plugin only
  • No secrets or credentials included
  • Plugin, datastream and UI naming follow SquaredUp guidelines
  • I agree to the Code of Conduct

🤖 Generated with Claude Code

https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi

claude added 16 commits October 30, 2026 17:46
Default dashboards still use classic visualisations on most tiles, and
there are a few hundred of them, so converting them by hand would be slow
and uneven. The script replaces each classic `visualisation` with a
`vizSpec` in place, so a conversion PR's diff shows only the tiles that
changed.

It works from the repository alone, because most plugins have no live
environment to test against. Columns, types and headers come from the
classic config, the tile's group and metadata, and the stream's declared
metadata. Where converting would mean guessing (a table that shows every
column of an undeclared stream, more than 12 table columns, a chart that
plots some but not all numeric columns, an auto-picked scalar value) the
tile is reported as blocked and left classic.

Table columns follow the in-product SmartViz migration: `columnOrder`
minus `hiddenColumns` is the shown set. Cells use the text renderer
unless the shape is state, date or URL, because the number renderer
reformats values and would drop units and decimal places.

A dry run over every community plugin converts 809 tiles. Every spec
passes the viz-spec schema from saas, and 43 tiles are left classic.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
The first wave of the SmartViz OOB upgrade, done with
scripts/classic-to-smartviz. These three plugins need no credentials,
so their dashboards can be checked against live data.

- TransportForLondon 1.0.7: the arrivals table and the line status
  blocks (now a status grid, with the status description as each
  block's second line).
- WorldCup2026 1.2.3: the four team tables.
- OpenF1 1.1.1: nine tables and the lap times chart.

Some tiles stay classic. The OpenF1 properties tables and the driver
photo stay as they are, as on every SmartViz-first plugin. Weather plots
air and track temperature, which are two of the stream's seven numeric
columns, and SmartViz can plot only one y column or all of them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
The lap times chart split its lines by car number, so the legend read
"1, 4, 11, 16…". The laps stream already carries the driver's name,
which the session tables show, so the lines now use that instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
Before/after screenshots of the pilot showed the World Cup "Last Match"
result reading "Success" in SmartViz where classic showed "Win". The
state shape maps Win/Loss/Draw to success/error/unknown, and the status
renderer shows the mapped state. Classic got away with it because it
appended the platform's "Result (raw)" column.

A state column with a value map now converts to that raw column,
`<name>[Expanded].rawState`, with a badge renderer coloured by the map,
so the cell reads "Win" in green. The World Cup tile was converted
before this rule existed, so it is updated by hand to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
The converter now improves a tile on top of the like-for-like conversion
where the repository alone shows it is safe: relative times for "last
seen" style dates, health colours for status words, progress bars for
percent columns, a 0–100 axis and gauge range for percentages, and
Yes / No for booleans. Each rule works from column shapes, names and the
converted spec, so none depends on what the data holds. A rule runs only
on tiles converted in that run, so hand-built SmartViz tiles are never
touched.

Rules are on by default and chosen with --rules (all, none, or a list),
and the report shows every rule that fired on each tile. Across the
community plugins not yet converted they fire on 45 tiles for status
colours, 38 for recency dates, 27 for booleans, 22 for progress bars
and 4 for the percent axis. Every rule-enhanced spec passes the
viz-spec schema.

A rule turning monitor thresholds into gauge bands was dropped. On the
OOB tiles that have a monitor, the monitor tests a different column
from the one the gauge draws, or counts rows across the whole table.
So it would almost never fire.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
Regenerating the pilot dashboards with the converter's enhancement rules
on changes only these three session result columns, which now read
Yes / No instead of true / false. The rest of the pilot output is
unchanged, including the World Cup result badge, which the rules now
produce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
The enhancement-rules commit accidentally took classic copies of these
dashboards with it: they had been staged while the pilot was being
regenerated from main. This puts back the converted versions, which are
unchanged from before that commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
Before/after screenshots of ProxmoxVE, Healthchecks.io, CrowdStrike and
GoogleHealth dashboards, with demo data, turned up five problems:

- Mapped state badges were blank for computed columns. The platform
  adds the `[Expanded].rawState` copy only for columns read from the
  response, so a computed state column keeps the status renderer.
- A status-block sublabel naming `status[Expanded].rawState` rendered
  nothing, because Handlebars reads the dots and brackets as a path.
  Names that are not plain identifiers now use `{{lookup this "…"}}`.
- Chart axes and legends showed raw field names such as
  `backupGroup_uniqueValues`, because SmartViz falls back to the field
  name when a channel has no title. Channels now carry the column's
  display name.
- Scalars with no label in classic showed their field name ("count")
  under the number. They now set no label, as classic did.
- "Not monitored" and "Paused" join the status colours, as grey, so
  a health donut no longer shows them in a palette colour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
Regenerated with the converter's fixes: the lap times channels now
carry "Lap", "Lap Time" and "Driver" as titles rather than leaving
SmartViz to fall back to the raw field names. The other pilot
dashboards come out unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
When a plugin's default dashboards are installed, the platform runs the
whole dashboard through Handlebars to fill in stream and config ids.
That also resolves SmartViz templates, and with no `value` or
`servingVariation` in scope they render as empty strings:

- EcoStruxureIT-DCE: the Temperature and Humidity label formats on the
  device and environmental dashboards.
- LaunchDarkly: the serving-variation second line on the flag state
  and environment state status grids.

Each template is now wrapped in {{{{raw}}}} so it reaches SmartViz
intact, as Auvik's already are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
A dry run over squaredup-plugin-repository blocked about 100 tiles for
reasons on the converter's side rather than SmartViz's:

- A packaged plugin's data_streams.json metadata is not the full column
  list, because its handler can return columns the metadata does not
  declare. Treating it as complete flagged real columns such as `count`
  and `label` as missing. It is now treated as partial.
- A donut whose label column a later group replaced fell back, in
  classic, to the group's category column. It now does the same instead
  of being left classic.
- Classic donut `palette` colours, keyed by label, now carry over as
  `mappedColors`.

squaredup-plugin-repository now converts 1,049 tiles, up from 948, and
what still blocks is down to SmartViz product gaps. The community repo
is unchanged at 809 converted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
SmartViz now allows up to 50 table columns, and a scalar with
scalarRowCount set no longer needs a value column (saas #10217). The
converter maps classic row counts to scalarRowCount and raises its
table cap to 50, so 108 more OOB tiles convert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
SmartViz now finds a channel left out of the spec in the data as classic
does, plots a list of y columns, and labels donuts with name and
percentage (saas #10225). The converter uses these: a column classic left
on auto is left out of the spec, several y columns become a list,
properties-stream tiles convert, "show values as percentage" maps to
pieLabels nameAndPercent, and percent table columns use the bar renderer
out of 100 instead of the always-green progress bar.

Across both plugin repos, 2,441 of 2,470 classic OOB tiles now convert.
Tables that hide or rename columns of a stream with no full column list
still stay classic.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
Classic stacks a bar chart's y columns unless grouping is on, but the
converter only stacked bars split by a series column, so a chart of
several y columns drew them side by side.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
Re-running the converter on the pilot plugins' main dashboards now also
converts OpenF1's Driver Details and Meeting Details tables and the
Weather chart, which SmartViz could not show before. Every tile the
pilot had already converted comes out unchanged; the Lap Times lines
stay named after the driver.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
@coderabbitai

coderabbitai Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

  • Run on-demand review

This review includes 16 billable files and costs up to $4.00.

  • Ask an admin to make reviews automatic

Open in CodeRabbit

Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing.

Or wait 14 minutes for your next included review.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available. Your 31 included PR review attempts over the past 7 days set your current allowance at 4 reviews per hour.

Learn how review limits work.

Review configuration:

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Essentials
  • Run ID: 114c6270-ac43-4a36-98d7-80ad2360346b
Commits

Reviewing files that changed from the base of the PR and between c444089 and 0617c7a.

Files selected for processing: 16

  • plugins/EcoStruxureIT-DCE/v1/defaultContent/device.dash.json
  • plugins/EcoStruxureIT-DCE/v1/defaultContent/environmental.dash.json
  • plugins/EcoStruxureIT-DCE/v1/metadata.json
  • plugins/LaunchDarkly/v1/defaultContent/environment.dash.json
  • plugins/LaunchDarkly/v1/defaultContent/flag.dash.json
  • plugins/LaunchDarkly/v1/metadata.json
  • plugins/OpenF1/v1/defaultContent/driver.dash.json
  • plugins/OpenF1/v1/defaultContent/meeting.dash.json
  • plugins/OpenF1/v1/defaultContent/overview.dash.json
  • plugins/OpenF1/v1/defaultContent/session.dash.json
  • plugins/OpenF1/v1/metadata.json
  • plugins/TransportForLondon/v1/defaultContent/arrivals.dash.json
  • plugins/TransportForLondon/v1/defaultContent/lineStatus.dash.json
  • plugins/TransportForLondon/v1/metadata.json
  • plugins/WorldCup2026/v1/defaultContent/team.dash.json
  • plugins/WorldCup2026/v1/metadata.json
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

This pull request now carries only the converted pilot dashboards and
the template fixes. The script stays in this branch's history (579ce98)
for later conversion phases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DsSxB9yhNwiJp2KU2D8Upi
@clarkd clarkd changed the title Convert the pilot OOB dashboards to SmartViz, with a conversion script Convert the pilot OOB dashboards to SmartViz Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown

🧩 Plugin PR Summary

📦 Modified Plugins

  • plugins/EcoStruxureIT-DCE/v1
  • plugins/LaunchDarkly/v1
  • plugins/OpenF1/v1
  • plugins/TransportForLondon/v1
  • plugins/WorldCup2026/v1

📋 Results

Step Status
Scope & version ❌ Failed
Validation ⏭️ Skipped
Deployment ⏭️ Skipped

@clarkd
clarkd marked this pull request as ready for review November 5, 2026 12:54
@clarkd
clarkd requested a review from a team November 5, 2026 12:54
@clarkd

clarkd commented Nov 6, 2026

Copy link
Copy Markdown
Member Author

Tested and all are good migrations from classic -> smartviz. Merging this pilot PR.

@clarkd
clarkd merged commit d4393cd into main Nov 6, 2026
1 of 2 checks passed
@clarkd
clarkd deleted the claude/oob-dashboards-smartviz-r68skj branch November 6, 2026 11:38
@clarkd clarkd mentioned this pull request Nov 6, 2026
5 of 14 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants