Repository navigation
feat(people): find colleagues by expertise and show extra profile fields - #743
Merged
rubenvdlinde merged 9 commits intoOct 5, 2026
Merged
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
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
September 30, 2026 07:43
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 07:57 UTC
Download the full PDF report from the workflow artifacts.
…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
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 locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ❌ |
Quality workflow — 2026-10-05 17:07 UTC
Download the full PDF report from the workflow artifacts.
This was referenced Oct 5, 2026
Open
Open
…and the value's API shape from their callers
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 locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ❌ |
Quality workflow — 2026-10-05 17:56 UTC
Download the full PDF report from the workflow artifacts.
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
widgets-people-expertise-and-fields(archived in this PR atopenspec/changes/archive/2026-09-30-widgets-people-expertise-and-fields). The stack below it (#733 to #741) is merged, so this PR sits directly on development. The next lane-4 branches (tile sorting, search shortcuts, bookmark import, office network address) are stacked on this one.v2-private) no longer shows or matches for anyone but its owner; a group-only custom field shows and matches only for colleagues who share a group. Search results are never cached.launchpad_profile_values(migrationVersion002012Date20260930080000, version bumped). Demo installs get three demo fields.Rows moved to
built: d-find-expert, d-profile-fields (built.change=openspec/changes/archive/2026-09-30-widgets-people-expertise-and-fields). The spec delta is folded into the main spec; the design records what the build corrected.Tests (red first)
tests/Unit/Service/ProfileFieldServiceTest.php(definitions, self edits, LDAP sync with a stubbed provider, private biography, group-only field)tests/Unit/Service/PeopleWidgetServiceTest.php(search across the directory with the real ProfileFieldService, one-character refusal, group filter, private biography neither matches nor shows); red run against the unchanged service: 21 errorstests/Unit/Controller/ProfileFieldsControllerTest.php,tests/Unit/Database/ProfileValuesDatabaseTest.php(real database; skipped without a live Nextcloud, runs in CI)src/components/Widgets/Renderers/__tests__/PeopleWidget.spec.js,src/views/settings/__tests__/ProfileFieldsSettings.spec.js,src/components/admin/tabs/__tests__/ProfileFieldsTab.spec.jsPlaywright tasks are not written; the specs carry
@e2e excludenaming these files.Verified
check.sh(the required CI jobs mirrored) with BUILD=1 on a6548d8: vitest 878 of 878, build 0, npm lint 0, format 0, check:manifest 0, check:schema-l10n 0, l10n-parity 0, phpmetrics 0; check:strict 1 on phpcs line length, five phpmd findings and one phpstan closure type, all fixed in 400d732 (targeted phpcs, phpmd, phpstan and PHPUnit re-run: 0); one phpcs comment capital fixed in c439e09.--require-full-coverage), on 1f4584d: all 86 applicable gates passed. The only commit after it is c439e09 (a comment).Views.loadingState.spec.jsfails on development; vitest files time out at 30 s when the machine is loaded.Verified again (5 Oct, lane 5)
Version002012).feat/launcher-tile-internal-address): npm lint, format, check:manifest, check:schema-l10n, l10n-parity and Vitest (963 of 963) all 0 on 7579477; the later source changes are three@speccomments (eslint 0 on those files).composer check:strict(lint, phpcs, phpmd, psalm, phpstan, PHPUnit 1948 tests, 14 skipped database tests that run in CI) and phpmetrics: 0 on 4a17769, after fixing six phpmd findings the stack introduced: BookmarkImportController coupling and static access (4e44727),PageController::index()length andTileUpdatercomplexity (4a17769).--require-full-coverage) on b2005d8: 85 of 86 applicable gates pass. Gate 16 found four untagged hooks, fixed where they were introduced (tile sorting, shortcuts, bookmarks). Gate 23 fails with the one match development itself has (PermissionService,RoleFeaturePermissionService, rule consume-or-rbac-fleet-wide); inherited, not touched here, and waiting on a decision.Live check
Admin settings, LaunchPad, "Profile fields": add "Expertise" (tags, searchable). As Pieter: Personal settings, Personal info, "LaunchPad profile", add "subsidies", save. As Sanne, in a people widget type "subsidie": Pieter is listed with the tag highlighted; press the tag "subsidies": everyone with it is listed. Set Karin's biography to private and mention "subsidies": Sanne does not find her by it and her card has no biography.