Skip to content

Release: merge development into beta - #772

Open
github-actions[bot] wants to merge 73 commits into
betafrom
development
Open

github-actions[bot] wants to merge 73 commits into
betafrom
development

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 2, 2026

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 12 commits September 30, 2026 07:34
…ide people search that respects profile visibility

Administrators define up to ten fields (text or tags, filled by the person or read
from LDAP); people fill their own on their personal settings; GET /api/people?q=
matches name, email, role, headline, biography and searchable fields across the
directory; a private standard field neither shows nor matches for others, and a
group-only field only for colleagues who share a group.

REQ-PEX-001..004 (widgets-people-expertise-and-fields)
… profile fields and tags, and let people fill their own fields

A query of two or more characters asks the server; a tag is a button that searches
for it and a matching tag is highlighted. A personal settings form edits the
person's own fields (LDAP fields read-only) and an admin tab defines them.

REQ-PEX-001..003
…xpert and d-profile-fields are built

Demo installs get the three demo profile fields. The people-widget spec no longer
claims scope filtering is a follow-up or that a shared server cache exists.
phpcs line length, phpmd complexity of buildAccountFields (the scope check moved to
visibleValue()), the static scope check became an instance call, reasons for the
remaining suppressions, and the seen-users callback returns true as phpstan requires.
…261002214503

chore(sync): carry beta back into development
…261003011315

chore(sync): carry beta back into development
…an install, export and import (#777)

* wip: ship the Mijn werkdag template, an install command and a template round trip that keeps compulsory widgets

* wip: ready-made templates on the admin page, a download per template, the change record

* wip: the templates page test runs, both files formatted

* wip(l10n): the eight new admin strings in the 35 other locales are English copies, not translations

* wip: a member who owns no dashboard gets their admin template from the page shell too

* wip: the template rung sits inside existing helpers, asks for the template first

* wip: REQ-TMPL-019, a test that asks both chains per page load, and a browser test for the member flow (not yet run)

* wip: the install command says so when personal dashboards are off

* wip: the template only uses widgets that render as installed, and its case lists name real fields

* test(e2e): a new account's first login needs more than the default minute
rubenvdlinde and others added 11 commits October 5, 2026 18:40
…eeds attention (#778)

* wip: ship the Mijn werkdag template, an install command and a template round trip that keeps compulsory widgets

* wip: ready-made templates on the admin page, a download per template, the change record

* wip: the cross-app attention contract as an OpenSpec change, the declaration reader and its endpoint

* wip: the First today widget, the feed logic and template version 2 (frontend tests not yet run)

* wip: spec tag on the query writer

* wip: the templates page test runs, both files formatted

* wip(l10n): the eight new admin strings in the 35 other locales are English copies, not translations

* wip: formatted, lint clean, the twelve new strings copied as English into the 35 other locales

* docs(openspec): tick the built tasks of the attention feed change

* wip: a member who owns no dashboard gets their admin template from the page shell too

* wip: the template rung sits inside existing helpers, asks for the template first

* wip: REQ-TMPL-019, a test that asks both chains per page load, and a browser test for the member flow (not yet run)

* wip: the install command says so when personal dashboards are off

* wip: the template only uses widgets that render as installed, and its case lists name real fields

* test(e2e): a new account's first login needs more than the default minute
…eople-expertise-and-fields

# Conflicts:
#	appinfo/info.xml
#	l10n/be.js
#	l10n/be.json
#	l10n/bg.js
#	l10n/bg.json
#	l10n/bs.js
#	l10n/bs.json
#	l10n/ca.js
#	l10n/ca.json
#	l10n/cs.js
#	l10n/cs.json
#	l10n/da.js
#	l10n/da.json
#	l10n/de.js
#	l10n/de.json
#	l10n/el.js
#	l10n/el.json
#	l10n/en.js
#	l10n/en.json
#	l10n/es.js
#	l10n/es.json
#	l10n/et.js
#	l10n/et.json
#	l10n/fi.js
#	l10n/fi.json
#	l10n/fr.js
#	l10n/fr.json
#	l10n/ga.js
#	l10n/ga.json
#	l10n/hr.js
#	l10n/hr.json
#	l10n/hu.js
#	l10n/hu.json
#	l10n/is.js
#	l10n/is.json
#	l10n/it.js
#	l10n/it.json
#	l10n/lb.js
#	l10n/lb.json
#	l10n/lt.js
#	l10n/lt.json
#	l10n/lv.js
#	l10n/lv.json
#	l10n/mk.js
#	l10n/mk.json
#	l10n/mt.js
#	l10n/mt.json
#	l10n/nb.js
#	l10n/nb.json
#	l10n/nl.js
#	l10n/nl.json
#	l10n/pl.js
#	l10n/pl.json
#	l10n/pt.js
#	l10n/pt.json
#	l10n/rm.js
#	l10n/rm.json
#	l10n/ro.js
#	l10n/ro.json
#	l10n/ru.js
#	l10n/ru.json
#	l10n/sk.js
#	l10n/sk.json
#	l10n/sl.js
#	l10n/sl.json
#	l10n/sq.js
#	l10n/sq.json
#	l10n/sr.js
#	l10n/sr.json
#	l10n/sv.js
#	l10n/sv.json
#	l10n/tr.js
#	l10n/tr.json
#	l10n/uk.js
#	l10n/uk.json
…and the value's API shape from their callers
…se-and-fields

feat(people): find colleagues by expertise and show extra profile fields
- appinfo/info.xml: max-version 34 -> 35.
- composer.json: nextcloud/ocp ^34.0 -> ^35.0; composer.lock refreshed
  (nextcloud/ocp v35.0.1, which pulls symfony/polyfill-php84/85/86 as
  dev-only dependencies).
- code-quality.yml: drop the hard-coded nextcloud-test-refs list so the
  shared quality workflow derives the matrix (now including stable35)
  from info.xml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M7DxSg7d7wqqZsUppLWf7J
On Nextcloud 35 ISchemaWrapper::createTable()/getTable() return
OCP\DB\Schema\ITable instead of Doctrine's Table. The builder helpers
take $table untyped, so runtime is unaffected; widen the @PARAM
docblocks so static analysis against nextcloud/ocp ^35 accepts it while
NC 32-34 (Doctrine Table) stay documented.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M7DxSg7d7wqqZsUppLWf7J
nextcloud/ocp 35 ships no Doctrine stubs, so psalm reported 105
UndefinedClass errors on the ITable|Doctrine\DBAL\Schema\Table union
(only the undefined docblock class itself is suppressed in psalm.xml).
ISchemaWrapper::createTable()/getTable() return OCP\DB\Schema\ITable on
the API this app is analysed against, and every method the builders call
(addColumn, addIndex, addUniqueIndex, setPrimaryKey, hasColumn, hasIndex,
dropColumn, getColumn) is declared there. Docblock-only; psalm locally:
the 105 errors are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M7DxSg7d7wqqZsUppLWf7J
…d one rule for which template a group gets (#791)

* wip: update an installed ready-made template in place (backend)

* wip: update dialog on the Templates page, specs, strings (35 locales carry English copies)

* wip: say what the live check covered

* wip: phpmd findings on the new code (complexity split, coupling reasons, class spec tag)

* test(templates): e2e for the in-place update on a real instance
…iting for a vote, lists that hide when their app is not here (#794)

* wip: update an installed ready-made template in place (backend)

* wip: update dialog on the Templates page, specs, strings (35 locales carry English copies)

* wip: say what the live check covered

* wip: phpmd findings on the new code (complexity split, coupling reasons, class spec tag)

* test(templates): e2e for the in-place update on a real instance

* wip: Mijn werkdag version 3 with tickets and votes, lists hide when their register is not here (1 string, 35 locales carry the English copy)

* feat(templates): Mijn werkdag version 3 with tickets and decisions waiting for a vote, lists that hide when their app is not here
… the support note is for administrators (1 string, 35 locales carry the English copy) (#795)
rubenvdlinde and others added 30 commits October 9, 2026 06:56
…says so

Archives grid-bottom-append-placement: REQ-GRID-006 describes the shipped
bottom-append rule and the push-down scenarios are retired.
…nvelope (#824)

The personal-layer spec fetched /api/dashboards/{id}, which has no route (show
is /api/dashboard/{id}), and read the visible list from data, while the
controller answers with items.
…s endpoint are gone

Decision 131 (Q-launchpad-1): drop setup-wizard step 2, POST
/api/admin/setup-wizard/storage, AdminSettingKey::CONTENT_STORAGE and the
three SetupWizardService storage methods. A stored content_storage row stays
unread. occ launchpad:setup no longer needs storage_backend and says an old
field was ignored. GET /api/admin/settings returns twelve keys.

The code half landed in the coordinator's wip daa7a92; this commit adds the
command test, the two test fixes for the twelve-key settings, the formatted
Vitest spec and the archived change.
… with per-event settings

Four activity settings in one LaunchPad group (REQ-DIGE-001): shared and
published go to the digest by default, updated and acknowledged stay in the
stream only. Registered in info.xml (validated against app-info.xsd), labels
in all 37 locales. engagement-activity-digest stays open for its live check
(task 5); e-digest moves to building.
…y built in dae7ade

The unfiltered People list pages searchDisplayName in bounded chunks;
REQ-PPL-013 now says so (renumbered from a REQ-PPL-007 that collided with
Avatar URLs).
…fix-l10n-domain-mismatch-mydash-calls

Both stay open: the E2E leg is skipped on development push runs, and the
Dutch-locale check needs the live instance.
feat: build open OpenSpec changes (launchpad, part 1)
…t the window edge, greeting in the page language (#836)

* fix(reactions): reactions are off until an administrator turns them on

The start page opened with a row of six emoji buttons above the greeting.
The global reactions toggle now defaults to off, so a dashboard shows no
reactions row unless an administrator enables reactions globally or per
dashboard (reactionsEnabled = 1).

* fix(start): the greeting in the page language, no inner header scrollbar, the page scrollbar at the window edge

- Build against the pinned @conduction/nextcloud-vue, not any ../nextcloud-vue
  checkout beside the app. That checkout was on a 2.54-era branch, so the
  start page lost its greeting and date line.
- Register the library's translations, so the greeting reads Goedemiddag on
  a Dutch page.
- A plain greeting has no 120px banner minimum; a duplicate library rule
  brought it back and the 104px cell scrolled.
- The centred column comes from padding, so the page scroller spans the
  window and its scrollbar sits at the window edge.
…838)

* fix(settings): personal settings move into the user settings dialog

Ruben, 11 Oct 2026: no user configuration pages. LaunchPad no longer adds a
form to Nextcloud's personal info page: <personal> leaves info.xml, with
LaunchPadPersonal, templates/settings/personal.php, src/personal.js, the
webpack entry and the two wiring tests of that form.

The user settings dialog (src/views/settings/UserSettings.vue in CnAppRoot's
#user-settings slot) now carries:
- LaunchPad profile (ProfileFieldsSettings), shown once a field is defined;
- House style of my groups (GroupHouseStyleSettings), moved from thematiq's
  personal settings: a group subadmin picks a delegated group's house style
  through thematiq's /api/my-groups endpoints. Shown only when thematiq is
  installed and the person manages such a group.
Filling the slot drops the library's fallback, so its notifications pane,
credentials and walkthrough replay are drawn again from the app.

l10n: six house-style strings. nl carries thematiq's Dutch; the other 35
required locales carry the English text, as thematiq's own catalogues do.

* fix(settings): no house-style section; the dialog follows board LpPersoonlijk

The house style of my groups stays in thematiq (Ruben, 11 Oct: it becomes a
delegated-admin section there), so GroupHouseStyleSettings and its six
strings leave LaunchPad again.

The profile section is Mijn profiel with the board's description, followed
by Inloggegevens. New strings carry Dutch in nl and the English text in the
other 35 required locales.
* chore(deps): bump @conduction/nextcloud-vue to ^2.81.0

* test(views): give the loading-shim spec time for the 2.81 library import
* chore(deps): bump @conduction/nextcloud-vue to ^2.81.0

* test(views): give the loading-shim spec time for the 2.81 library import

* fix(settings): user settings dialog sections follow board LpPersoonlijk via userSettingsSections
* chore(deps): bump @conduction/nextcloud-vue to ^2.81.0

* test(views): give the loading-shim spec time for the 2.81 library import

* fix(modals): a modal shows its title once

Every NcModal in the app drew its title twice: the h2 in the body, as the
boards do, and NcModal's own name bar floating over the top bar. The name
stays on the modal as its accessible label; its visible copy is hidden for
the ten modals that draw their own title.
CnAppRoot defaults its translate prop to the identity, and App.vue never
passed one. Menu labels, page titles and descriptions and the setup copy
stayed English for a Dutch reader, although l10n/nl.js carries every one.
Dashboard configuration, sharing, tiles, widget forms, visibility rules,
the keyboard move panel and the group dashboards tab showed English to a
Dutch reader. nl.json gets all 253, nl.js the 228 it lacked.
…g frame (#855)

* fix(dialogs): dashboard settings and versions open in the board dialog frame

720px wide, the dashboard's name as a small line over a 20px title, as
boards LpDashboardInstellingen and LpVersies draw them. Version history is
titled "Versions of {name}" when the name is known.

* fix(dialogs): the frame's title sizes beat the house style's !important
nl.json carried Flows, Reports and Store twice, nl.js fifteen keys. In
nl.js the last copy won, so Set as default read "Instellen als standaard"
and View mode "Weergave" while nl.json says "Als standaard instellen"
and "Weergavemodus". The nl.json values stay.
Details, Talen and Delen with a share count, as board
LpDashboardInstellingen draws them. The default switch and the detail
fields move under Details; nothing is removed. A caller that still asks
for the old default tab lands on Details.
main.js, public.js and admin.js never imported
@conduction/nextcloud-vue/css/index.css. The board look, widget and dialog
styles only arrived when another app's bundle on the page carried them,
which is why the Flows toolbar centred its buttons. pipelinq, dossiq and
shillinq import it the same way.
The library stylesheet check holds on the new dist: cn-store-page is in
the CSS and library-style.js stamps data-cn-library. No app workaround
needed removing; the app already imports the library stylesheet (#861).
…ok, opening on Algemeen (#862)

* fix(admin): the admin page opens on Algemeen, in the board's cards and tabs

The setup banner, the defaults, group-shared dashboards and the default-app
note sat above the tab strip on every tab. They now form the first tab,
Algemeen, as cards in two columns (board LpBeheerAlgemeen), and the page
opens there. The tab strip takes the board's 44px tabs with a 3px
underline, and four tab names follow the board: Bediening, Versies en
analyse, Organisatiemenu, Demogegevens.

* fix(admin): the admin page uses the full width, as the board

* Revert "fix(admin): the admin page uses the full width, as the board"

This reverts commit c0829bf.

* chore(deps): launchpad builds on nextcloud-vue 2.82.0

The library stylesheet check holds on the new dist: cn-store-page is in
the CSS and library-style.js stamps data-cn-library. No app workaround
needed removing; the app already imports the library stylesheet (#861).

* fix(admin): the admin page draws in the library admin shell, board look

CnAdminSettingsShell with look="board" draws the h1 that names the open
tab, the path line (Beheerinstellingen / Launchpad / <tab>, with "geldt
voor de hele organisatie" on Algemeen) and the Documentatie button. No
version card: the board has none.

The tab strip is a plain child of the shell, so it spans the grid without
a card or heading. On Algemeen the defaults, group-shared dashboards and
the default-app note are CnSettingsSection cards in the shell's two
columns. The app's own card and grid CSS goes: the library draws both.

l10n: two strings. nl carries the board's Dutch; the other required
locales carry the English text.

* fix(admin): switches as the board draws them, no strip under the banner

The three on/off defaults are switches. The tab panel takes its tab's
height and draws no white surface below the setup banner. The spec keeps
the router's other exports and lint is clean.
#870)

* chore(deps): bump @conduction/nextcloud-vue to ^2.85.0

Assisted-by: ClaudeCode:claude-opus-5-5

* fix(admin): register the library catalogue on the admin page

The admin page is its own webpack entry and never registered the
nextcloud-vue catalogue, so library text on the admin shell fell back
to English.

Assisted-by: ClaudeCode:claude-opus-5-5
…trip (#872)

The admin page drew its own tab strip (BeheerTabs). It now hands its
twelve tabs to CnAdminSettingsShell (`tabs`, `tabsVariant: "underline"`),
as board LpBeheerAlgemeen draws them. The shell opens the tab named by
`?tab=`, else the one remembered under `launchpad.admin.activeTab` (the
key BeheerTabs used, so a stored tab carries over), else General, and
reports it with `tab-change`, which drives the title, the path line and
the General-only cards. A tab's content still mounts only while it is
open. BeheerTabs and its tests are retired; the e2e specs find a tab by
its id through a small helper.

Bumps @conduction/nextcloud-vue to ^2.89.0 (tabStorageKey and the
mount-time tab-change, #1673).

Assisted-by: ClaudeCode:claude-opus-5-5
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