Skip to content

feat(people): find colleagues by expertise and show extra profile fields - #743

Merged
rubenvdlinde merged 9 commits into
developmentfrom
feat/widgets-people-expertise-and-fields
Oct 5, 2026
Merged

rubenvdlinde merged 9 commits into
developmentfrom
feat/widgets-people-expertise-and-fields

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

What this does

Change widgets-people-expertise-and-fields (archived in this PR at openspec/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.

  • Administrators define up to ten custom profile fields (text or tags; filled by the person or read from an LDAP attribute; searchable or not; shown on the card or not; visible to everyone or to people who share a group) on a new "Profile fields" admin tab.
  • People fill their own fields, such as expertise tags, in Personal settings, Personal info, "LaunchPad profile". LDAP fields show read-only and sync on sign-in and daily.
  • The people widget's search asks the server from two characters on and searches the whole directory by name, email, role, headline, biography and every searchable custom field. Tags show as buttons that search for the tag; a matching tag is highlighted.
  • Visibility: a private standard field (Nextcloud scope 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.
  • New table launchpad_profile_values (migration Version002012Date20260930080000, 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 errors
  • tests/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.js

Playwright tasks are not written; the specs carry @e2e exclude naming 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.
  • Hydra gates, the CI version (hydra-gates@main, full scope, --require-full-coverage), on 1f4584d: all 86 applicable gates passed. The only commit after it is c439e09 (a comment).
  • PHPUnit on the stack top: 1854 tests, 13 skipped (database tests that need a live Nextcloud, including the new ProfileValuesDatabaseTest, which runs in CI).
  • Inherited, not changed here: Views.loadingState.spec.js fails on development; vitest files time out at 30 s when the machine is loaded.

Verified again (5 Oct, lane 5)

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.

…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.
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/launchpad @ 9a23c45

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
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/launchpad @ 7dc796c

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.

…and the value's API shape from their callers
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/launchpad @ 5d023dd

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.

@rubenvdlinde
rubenvdlinde merged commit a65bde0 into development Oct 5, 2026
41 of 43 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.

1 participant