Skip to content

Release: merge development into beta#11

Merged
rubenvdlinde merged 68 commits intobetafrom
development
Apr 30, 2026
Merged

Release: merge development into beta#11
rubenvdlinde merged 68 commits intobetafrom
development

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

rubenvdlinde and others added 8 commits March 19, 2026 16:37
- Remove global header-override.css injection that leaked NL Design
  styling (white header, blue bar, nederland-logo) to every page
  including the login screen, even when nldesign app is disabled
- Fix webpack build by adding @nextcloud/dialogs alias and
  resolve.modules to prevent Vue 3 packages from nextcloud-vue
  submodule leaking into the Vue 2 app (2585 → 0 errors)
- Update @nextcloud/router from v2 to v3 (needed for getBaseUrl)
- Fix PHPMD/PHPCS issues in DashboardRequestValidator,
  HealthController, and MetricsCollector
…ters

- MetricsController: Use sprintf() for Prometheus info label to stay under 125-char line limit
- MetricsController: Fix countTable() named param (table -> tableName)
- UserAttributeResolver: Fix str_starts_with/str_ends_with named params (prefix/suffix -> needle)
- TileMapper: Add @extends QBMapper<Tile> template annotation
- Add ramsey/uuid as explicit dependency (used by TemplateService and AdminTemplateService)
The anchore/scan-action/download-grype@v5 action installs grype to a
toolcache path that is not on PATH. Use the step output `cmd` to
reference the correct binary path.
The gen-mapping and helper-validator-identifier CVEs are false positives
caused by grype matching unscoped CycloneDX names against typosquatting
advisories. The actual deps are scoped (@jridgewell/gen-mapping, etc).
The docs/ folder already contained the full Docusaurus setup.
Remove the duplicate docusaurus/ folder, update .gitignore for
docs/ build artifacts, and fix editUrl reference.
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report

Repository ConductionNL/mydash
Commit c1d80b8
Branch 11/merge
Event pull_request
Generated 2026-03-19 18:55 UTC
Workflow Run https://github.com/ConductionNL/mydash/actions/runs/23311645287

Summary

Group Result
PHP Quality FAIL
Vue Quality PASS
Security PASS
License PASS
PHPUnit SKIP
Newman SKIP

PHP Quality

Tool Result
lint PASS
phpcs FAIL
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint PASS
stylelint PASS

Security

Ecosystem Result
composer PASS
npm PASS

License Compliance

Ecosystem Result
composer PASS
npm PASS

composer dependencies (100 total)

Metric Count
Approved (allowlist) 100
Approved (override) 0
Denied 0

npm dependencies (342 total)

Metric Count
Approved (allowlist) 341
Approved (override) 1
Denied 0

PHPUnit Tests

PHPUnit tests were not enabled for this run.

Integration Tests (Newman)

Newman integration tests were not enabled for this run.


Generated automatically by the Quality workflow.

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report

Repository ConductionNL/mydash
Commit 6cc4e1d
Branch 11/merge
Event pull_request
Generated 2026-03-19 19:05 UTC
Workflow Run https://github.com/ConductionNL/mydash/actions/runs/23312026774

Summary

Group Result
PHP Quality FAIL
Vue Quality PASS
Security PASS
License PASS
PHPUnit SKIP
Newman SKIP

PHP Quality

Tool Result
lint PASS
phpcs FAIL
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint PASS
stylelint PASS

Security

Ecosystem Result
composer PASS
npm PASS

License Compliance

Ecosystem Result
composer PASS
npm PASS

composer dependencies (100 total)

Metric Count
Approved (allowlist) 100
Approved (override) 0
Denied 0

npm dependencies (342 total)

Metric Count
Approved (allowlist) 341
Approved (override) 1
Denied 0

PHPUnit Tests

PHPUnit tests were not enabled for this run.

Integration Tests (Newman)

Newman integration tests were not enabled for this run.


Generated automatically by the Quality workflow.

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report

Repository ConductionNL/mydash
Commit cbe0146
Branch 11/merge
Event pull_request
Generated 2026-03-19 21:37 UTC
Workflow Run https://github.com/ConductionNL/mydash/actions/runs/23318047535

Summary

Group Result
PHP Quality FAIL
Vue Quality PASS
Security PASS
License PASS
PHPUnit SKIP
Newman SKIP

PHP Quality

Tool Result
lint PASS
phpcs FAIL
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint PASS
stylelint PASS

Security

Ecosystem Result
composer PASS
npm PASS

License Compliance

Ecosystem Result
composer PASS
npm PASS

composer dependencies (100 total)

Metric Count
Approved (allowlist) 100
Approved (override) 0
Denied 0

npm dependencies (342 total)

Metric Count
Approved (allowlist) 341
Approved (override) 1
Denied 0

PHPUnit Tests

PHPUnit tests were not enabled for this run.

Integration Tests (Newman)

Newman integration tests were not enabled for this run.


Generated automatically by the Quality workflow.

Download the full PDF report from the workflow artifacts.

Add .phpunit.cache/, coverage/, and phpmetrics/ entries to prevent
generated test and quality tool artifacts from being tracked.
All specs moved from openspec/specs/ to openspec/changes/ with proper
proposal.md as the entry point. Follows the spec-driven workflow:
proposal -> design -> specs -> tasks
Add strengthened ADR-011 rule listing concrete directories to search
and common duplications to prevent future utility reimplementations.
Adds a features overview document for the dashboard and widget system,
covering dashboards, grid layout, tiles, permissions, admin templates,
conditional visibility, and GEMMA BI-component mapping.
[Docs] Feature overview with GEMMA/TEC standards
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ e497748

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 18:19 UTC

Download the full PDF report from the workflow artifacts.

* feat(widgets): image widget per REQ-IMG-001..005

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 6f98f74

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 18:26 UTC

Download the full PDF report from the workflow artifacts.

* feat(openspec): add 25 spec proposals for multi-tenant dashboard platform

Adds 25 OpenSpec change proposals modelling a complete dashboard sharing
and runtime experience for MyDash. Specs are organised across 4 dependency
layers (foundation → extensions → UI surfaces → runtime shell):

Dashboards capability (4): multi-scope-dashboards, default-dashboard-flag,
active-dashboard-resolution, fork-current-as-personal — adds group_shared
type, default flag, 7-step resolution chain, fork-from-current action.

Admin (3): group-priority-order, group-routing, allow-personal-dashboards-flag
— admin-controlled group ordering, primary-group resolver, runtime gating.

Grid layout (2): responsive-grid-breakpoints, widget-collision-placement —
4 viewport breakpoints, moveScale reflow, deterministic add-widget placement.

Widgets (5 + 2 modal/menu): text-display-widget, label-widget, image-widget,
link-button-widget, nc-dashboard-widget-proxy, widget-add-edit-modal,
widget-context-menu — five widget types plus shared add/edit modal and
right-click menu.

Resources (3): resource-uploads, resource-serving, svg-sanitisation —
admin-only base64 upload pipeline, immutable-cached serve route, DOM-based
SVG whitelist.

Icons (2): dashboard-icons, custom-icon-upload-pattern — curated MDI
registry plus URL discriminator for uploaded icons.

UI (2): dashboard-switcher-sidebar, runtime-shell — slide-in 3-section
sidebar, page-level shell with canEdit gate.

Infra (1): initial-state-contract — typed PHP→JS bootstrap contract.

Sharing follow-ups (1): dashboard-sharing-followups — extends the existing
dashboard-sharing capability with notifications, bulk management, and
deletion cascade with admin-retention guard.

Includes the baseline dashboard-sharing capability spec under openspec/specs/.

All 25 changes pass openspec validate --strict. Implementation (opsx-apply)
is the next step for each.

* feat(dashboard-icons): implement icon registry per REQ-ICON-001..004
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ caeed03

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 18:37 UTC

Download the full PDF report from the workflow artifacts.

* feat(grid): widget collision placement helper per REQ-GRID-006/014

Implements collision-aware widget placement for mydash (Vue 2 Options API):

- New src/utils/widgetPlacement.js exports placeNewWidget(spec, layout, grid, viewportRows)
  - Step 1: try GridStack auto-position; if no fit or below viewport, proceed
  - Step 2: place at top-left (0,0) + push overlapping widgets down by newH rows
  - Non-overlapping widgets unchanged
  - Default size 4x4 when caller omits w/h

- DashboardGrid.vue integrated:
  - placeWidget() method calls helper via placeNewWidget
  - Computes viewportRows from container height on mount/resize
  - Used by Views.vue before calling store.addWidgetToDashboard

- Views.vue refactored:
  - addWidget() and saveTile() compute position via dashboardGrid.placeWidget()
  - Position passed to store actions for API persistence

- Vitest tests (src/__tests__/widgetPlacement.test.js):
  - Auto-position into empty space
  - Push-down fallback when grid is full at top
  - Default size (4,4) applied correctly
  - Non-overlapping widgets unchanged
  - Viewport boundary detection

- Single source of truth enforced: grep confirms grid.addWidget only in
  widgetPlacement.js (+ test file)

Per spec: openspec/changes/widget-collision-placement/
Satisfies REQ-GRID-006 (modified) + REQ-GRID-014 (added)

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 14aa284

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 18:48 UTC

Download the full PDF report from the workflow artifacts.

* feat(grid): responsive breakpoints + moveScale via shared constants per REQ-GRID-007/012/013

Implements responsive grid breakpoints and shared geometry constants:

- New `src/constants/gridConfig.js` exports CELL_HEIGHT (80 px), GRID_MARGIN (12 px),
  GRID_COLUMNS (12), BREAKPOINTS (4 entries: 1400→12, 1100→8, 768→4, 480→1), and
  COLUMN_LAYOUT ('moveScale') per REQ-GRID-007 + REQ-GRID-012/013.

- DashboardGrid.vue refactored to import the constants and pass columnOpts to
  GridStack.init with breakpoints + layout for responsive column adaptation.

- Vitest test suite added to validate constant values, breakpoint structure
  (monotonically descending), and height math per REQ-GRID-012.

**Key decision:** Kept existing geometry (cellHeight: 80, margin: 12) and gridstack
^10.3.1 unchanged per task instructions. The spec flagged the 60/8/v12 proposal as a
decision point—the minimal-change interpretation preserves dashboard visual layout
for all existing users while enabling responsive breakpoints on the current platform.

Spec: openspec/changes/responsive-grid-breakpoints/ (development branch)

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 82661aa

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 18:54 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde and others added 3 commits April 30, 2026 21:12
* feat(dashboard-icons): IconPicker (built-in + upload) per REQ-ICON-008..009

- Add isCustomIconUrl discriminator to dashboardIcons.js (REQ-ICON-005)
- Update getIconComponent to return null for URL inputs (REQ-ICON-006)
- Update IconRenderer with alt prop support for URL images (REQ-ICON-007)
- New IconPicker.vue combining built-in select + file upload (REQ-ICON-008)
  * Both update the same v-model
  * 24x24 live preview via IconRenderer
  * Inline error display with value preservation on failure
  * Uses resourceService.uploadDataUrl from PR #55
- Vitest tests covering mode switching and error handling (REQ-ICON-009)
  * Switching between built-in and custom URLs
  * Upload success/failure scenarios
  * Previous value preservation on error
- All quality gates pass: ESLint, Stylelint, Vitest

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…ITCH-001..007 (#59)

- Add DashboardSwitcherSidebar.vue with three conditional sections (matched group / default / personal)
- Render via IconRenderer for all icons, no inline branching
- Click semantics: emit update:open(false) then switch(id, source) where source discriminates by section
- Active-item highlight with --color-primary-element-light background
- Personal rows show hover-revealed delete button (CSS display toggle) emitting delete-dashboard(id)
- + New Dashboard button gated on allowUserDashboards, emits update:open(false) then create-dashboard
- Slide-in animation via transform: translateX(-100%→0) over 0.25s ease
- Add SidebarBackdrop.vue for click-to-close surface
- Vitest tests cover all 7 REQs: section visibility, emit order, active highlight, delete no-switch, create button gating, icon rendering
- Add i18n keys: My Dashboards, + New Dashboard
…WDG-015..017 (#60)

Implements widget context menu with the following:

REQ-WDG-015 (Right-click context menu in edit mode):
- New WidgetContextMenu.vue component with Edit, Remove, Cancel buttons
- @contextmenu.prevent handler on grid items opens menu only in edit mode
- View mode allows native browser context menu
- Menu closes after any action

REQ-WDG-016 (Auto-close on outside interaction):
- Document-level click listener closes menu when clicking outside
- Right-clicking different widget switches menu to new position
- Only one menu visible at a time

REQ-WDG-017 (Position constraints):
- Menu positioned at cursor with min-width: 150px and z-index: 10000
- Clamped to viewport edges to stay fully visible
- Uses computed properties for dynamic positioning

Implementation details:
- WidgetContextMenu.vue: Vue 2 SFC with Pencil/Delete icons
- DashboardGrid.vue: Wired @contextmenu.prevent and document click handler
- onWidgetRightClick(): Captures event, validates edit mode
- onContextEdit/Remove(): Emits to parent for handling
- i18n: Added 'Remove' translation (Edit/Cancel already present)

Test coverage:
- 18 unit tests via Vitest covering all REQs
- Tests: view mode rejection, edit mode opening, button events
- Outside-click and multi-widget switching scenarios
- Position clamping behavior
- Listener cleanup on unmount

Quality gates:
- ESLint: Pass (0 errors, 9 pre-existing warnings in widgetBridge.js)
- Stylelint: Pass
- Vitest: 71 tests pass (CSS import pre-existing issue)
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 32e2466

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer
npm
PHPUnit
Newman
Playwright

Quality workflow — 2026-04-30 19:13 UTC

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 0a660d5

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 19:14 UTC

Download the full PDF report from the workflow artifacts.

* feat(admin-settings): runtime gating on personal-dashboard creation per REQ-ASET-003 + 015

Implements REQ-ASET-003 (modified) runtime gating: when allow_user_dashboards flag
is OFF, POST /api/dashboards returns HTTP 403 with {status:'error',
error:'personal_dashboards_disabled', message:<translated>}.

- New PersonalDashboardsDisabledException (HTTP 403, stable error code)
- DashboardService::assertPersonalDashboardsAllowed() reads setting with default=false
- DashboardApiController::create() calls assert before permission checks; catches
  exception and returns exact spec envelope; read/update/delete untouched
- i18n: English + Dutch strings in all four l10n files (json + js)
- PHPUnit: 7 tests covering envelope shape, readability/editability with flag off,
  no-mutation guarantee, default-blocks-creation, defence-in-depth
- REQ-ASET-015 initial-state mirror already done in PR #45 (InitialStateBuilder);
  skip per spec instruction
- Fork-side wiring deferred to fork-current-as-personal PR
- Pre-existing: fixed 13 phpcbf-auto-fixable blank-line errors in DashboardApiController

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ c8ac613

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 19:36 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde and others added 3 commits April 30, 2026 22:03
* feat(widgets): NC Dashboard widget proxy + bridge poll helper per REQ-WDG-018..021 + REQ-LWB-005..006

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
….019 (#62)

Implements the 7-step precedence resolver in DashboardService with stale-pref
auto-clear (REQ-DASH-018). Adds setActivePreference() and the
POST /api/dashboards/active write endpoint (REQ-DASH-019). PageController
refactored to call resolveActiveDashboard() and push the resolved dashboard
via InitialStateBuilder. PHPUnit covers all 7 steps, stale-pref,
cross-group invalidation, and empty-state. Pre-existing issues fixed:
className: named-param on createMock(), willReturn double-stub in AllowFlagTest.
…cade per REQ-SHARE-008..013 (#64)

Adds Nextcloud-native push notifications on share events, PUT /api/dashboard/{id}/shares
(atomic replace-all) and DELETE /api/sharees/{shareType}/{shareWith} (revoke-all-for-recipient),
plus UserDeletedListener that transfers dashboard ownership to the highest-permission sharer
or deletes orphaned dashboards when no fallback owner exists.
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 5c40110

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 20:04 UTC

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ a01aed9

Check PHP Vue Security License Tests
lint ⏭️
phpcs ⏭️
phpmd ⏭️
psalm ⏭️
phpstan ⏭️
phpmetrics ⏭️
eslint ⏭️
stylelint ⏭️
composer ⏭️ ⏭️
npm ⏭️ ⏭️
PHPUnit
Newman
Playwright

Quality workflow — 2026-04-30 20:05 UTC

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 56a1d0a

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 20:06 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde and others added 3 commits April 30, 2026 22:28
* feat(dashboards): fork visible dashboard as personal copy per REQ-DASH-020..022

- WidgetPlacementMapper::cloneToDashboard() deep-copies all placement fields
  (gridX/Y/W/H, widgetId, customTitle, styleConfig, tile* fields) for a new
  dashboard; resource URLs shared verbatim (REQ-DASH-022)
- DashboardService::forkAsPersonal() — transactional fork: gate on
  allow_user_dashboards (403), 404 when source not visible (no info leak),
  default name via IL10N::t('My copy of {name}'), sets active preference
- DashboardApiController::fork() — POST /api/dashboards/{uuid}/fork,
  #[NoAdminRequired], HTTP 201 on success, 403/404/500 error envelopes
- Route registered before group-scoped wildcard routes to avoid conflicts
- PHPUnit: 8 new tests across service and controller covering all scenarios
- Pre-existing quality fix: DashboardShareApiController DataResponse $status
  named arg corrected to $statusCode (eliminated 6 pre-existing test errors)
- Pre-existing quality fixes in DashboardService: inline ternaries,
  @var docblock formatting, parameter comment alignment
- Existing service tests updated for new IL10N constructor parameter
- Existing controller tests updated for new LoggerInterface constructor param

* chore: update SBOM

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…..014 (#65)

- src/utils/widgetForm.js: resetForm, loadEditingWidget, assembleContent helpers
- src/components/Widgets/AddWidgetModal.vue: unified modal host for create+edit flows;
  dynamic <component :is> sub-form from widgetRegistry; per-type validate() gate;
  three close triggers (cancel, backdrop click, Esc); type-switch resets state
- src/views/Views.vue: mount AddWidgetModal; openWidgetEditModal routes content-type
  placements to the modal, style-only placements fall through to WidgetStyleEditor;
  widget-edit from DashboardGrid/context-menu wired to openWidgetEditModal
- src/__tests__/AddWidgetModal.test.js: 12 Vitest scenarios covering create/edit mode,
  type-switch leakage, submit field filtering, validation gating, close triggers
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 0fcdc39

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer
npm
PHPUnit
Newman
Playwright

Quality workflow — 2026-04-30 20:29 UTC

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 452c041

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 20:30 UTC

Download the full PDF report from the workflow artifacts.

…it gate per REQ-SHELL-001..007 (#68)

- REQ-SHELL-001: Update templates/index.php to render #app-workspace > #workspace-vue mount point; mount Vue on #workspace-vue in main.js
- REQ-SHELL-002: Add canEdit computed (isAdmin || dashboardSource === 'user') via inject; replaces old permissionLevel check; toolbar hidden via v-if (not v-show) when canEdit is false
- REQ-SHELL-003: 4-region layout with header strip (hamburger + label + toolbar); toolbar shows Customize/Close + Add Widget + Save Layout buttons; saveLayout() PUTs to group or user endpoint based on dashboardSource; disabled while saving; showSuccess/showError toasts
- REQ-SHELL-004: Hamburger toggles sidebarOpen; active-dashboard label displayed next to hamburger
- REQ-SHELL-005: Empty state via NcEmptyContent when activeDashboard is null; Create button shown only when allowUserDashboards=true
- REQ-SHELL-006: SidebarBackdrop and DashboardSwitcherSidebar integrated; backdrop click closes sidebar
- REQ-SHELL-007: document.click lifecycle delegated to DashboardGrid (already registered in mounted/beforeDestroy per #60)
- Vitest: 13 tests covering all 7 REQs (canEdit gate, hamburger, empty state, save layout endpoints, lifecycle)
@github-actions
Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/mydash @ 6f7ceb7

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 103/103
npm ✅ 342/342
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-04-30 20:46 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde rubenvdlinde merged commit 4a1a45a into beta Apr 30, 2026
45 of 49 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants