Repository navigation
Release: merge development into beta - #772
Open
github-actions[bot] wants to merge 73 commits into
Open
github-actions[bot] wants to merge 73 commits into
github-actions[bot] wants to merge 73 commits into
Conversation
…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.
…he seed coverage test sees them
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.
…ets-people-expertise-and-fields
…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
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48,
rjzondervan and
rubenvdlinde
as code owners
October 5, 2026 16:36
…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
chore(nc35): Nextcloud 35 support
…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)
…says so Archives grid-bottom-append-placement: REQ-GRID-006 describes the shipped bottom-append rule and the push-down scenarios are retired.
…d step stays a follow-up
…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.
…r the Nextcloud bootstrap
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
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.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.