Repository navigation
feat(kiosk): rotate dashboards unattended on a lobby screen from a playlist an administrator manages - #733
Merged
Conversation
…h entry carries its widgets
…and survives a network blip The public share page's read-only grid moves into PublicDashboardGrid so the player renders dashboards the same anonymous-safe way.
…lic link Beheer gets a Kiosk tab: list playlists with their link, create and edit them with a dwell time per dashboard inside the service limits, and revoke one after a confirmation.
…ptied The archive step opened tasks.md for writing before reading it, so the kiosk, edit-lock and version-history archives kept an empty tasks.md. Playwright tasks stay open with a note: the specs carry @e2e exclude.
…er page phpstan found the generic Exception catch dead: renderPlaylist only declares PlaylistNotFoundException.
…llaborators phpmd CouplingBetweenObjects, with the repo's reasoned suppression.
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
September 30, 2026 02:53
Contributor
Quality Report — ConductionNL/launchpad @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 104/104 | |||
| npm | ✅ | ✅ 636/636 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it on any branch from the Actions tab, or locally with npx playwright test. |
||||
| Hydra gates | ✅ |
Quality workflow — 2026-09-30 02:57 UTC
Download the full PDF report from the workflow artifacts.
This was referenced Sep 30, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
Change
sharing-kiosk-screens(archived in this PR). Kiosk mode was advertised and had a backend, but no page rendered it and no screen created a playlist. Now:src/components/admin/tabs/KioskTab.vue): list playlists, create or edit one (src/dialogs/KioskPlaylistDialog.vue, using the service's dwell and length limits), copy its public link, revoke it after a confirmation (src/dialogs/RevokeKioskPlaylistDialog.vue).GET /apps/launchpad/kiosk/{token}serves a full-screen player page to a browser (Accept asks for HTML, not JSON) and keeps the JSON for the player itself. A revoked or unknown token answers 404 on both and counts toward the same brute-force bucket.src/kiosk.js,src/views/KioskPlayerView.vue) rotates the dashboards by their dwell time, re-reads the playlist on an interval, and keeps the last playlist on a network failure while it retries.src/components/PublicDashboardGrid.vueso the share page and the player render the same way.Row moved to
built: s-kiosk (built.change=openspec/changes/archive/2026-09-29-sharing-kiosk-screens). REQ-KIOSKUI-001..002 are folded intoopenspec/specs/dashboard-kiosk-mode/spec.md.Also in this PR: the archive helper used for this lane emptied
tasks.mdin every change it archived. The task lists ofsharing-kiosk-screens,dashboard-edit-lock-uianddashboard-version-history-uiare restored; their Playwright tasks stay open with a note.Scenarios and tests (red first)
KioskPlaylistDialog.spec.js"creates a lobby playlist with two dashboards";KioskTab.spec.js"saving a new playlist posts it", "lists playlists with a copyable public link"KioskPlaylistDialog.spec.js"a dwell below the minimum is named and not saved"KioskPlayerView.spec.js"rotates through the playlist and starts over";KioskServiceTest::testRenderPlaylistIncludesEachDashboardsPlacements;KioskControllerTest::testRenderServesThePlayerPageToABrowser,testRenderKeepsJsonForTheJsonAcceptKioskPlayerView.spec.js"a revoked link shows that the playlist is gone";KioskControllerTest::testRenderServesA404PlayerPageForARevokedToken;KioskTab.spec.js"revoking after confirmation deletes the playlist"KioskPlayerView.spec.js"a network blip keeps the last playlist and tries again"The Playwright task is not written; the spec carries
@e2e excludenaming these files.Verified
Branch head 55b2c0b, development 4ff0361 merged in.
composer check:strict: lint, lint:initial-state, lint:spec-annotations, lint:licenses, phpcs, psalm 0; PHPUnit 1795 tests OK (12 skipped). phpstan found 1 NEW finding (a deadcatch (Exception)inKioskController::renderPlayer), fixed in 00d3475; phpmd found 2 NEWCouplingBetweenObjects(KioskController 14, KioskService 13), given the repo's reasoned suppression in 55b2c0b. Re-run:composer phpstan0,composer phpmd0.composer phpmetrics0.npm run build0 (newkioskentry).npm run lint,format,check:manifest,check:schema-l10n,check:l10n-parity0.Views.loadingState.spec.jstimes out on development too, andGroupDashboardsTab.spec.js"opens the create modal" failed under full-suite load and passes on its own (5 of 5).--require-full-coverage): 83 of 83 applicable gates pass.Inherited, not touched:
check:schema-l10nreports 1 fewer uncovered string than its baseline.Live check
As an administrator: Administration settings, Launchpad, "Kiosk" tab, create a playlist with two dashboards at 10 seconds each, copy the link. Open it in a private window: the first dashboard fills the screen, the second follows after 10 seconds. Revoke the playlist; within one refresh the screen says the playlist is gone, and
curl -H 'Accept: application/json' <link>answers 404.🤖 Generated with Claude Code