Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
358 commits
Select commit Hold shift + click to select a range
ea8f0f1
Merge pull request #669 from ConductionNL/parity/corrections-7
rubenvdlinde Sep 27, 2026
ed1e614
fix(parity): tt-exam-seat-plan is decided-no
rubenvdlinde Sep 27, 2026
0ad0657
Merge pull request #671 from ConductionNL/parity/seat-plan-decided-no
rubenvdlinde Sep 27, 2026
de35541
chore(deps): move @conduction/nextcloud-vue to 2.57.1 (Dexie loads on…
rubenvdlinde Sep 27, 2026
d6e119b
docs(openspec): tasks-create-edit-delete for parity rows tsk-create-e…
rubenvdlinde Sep 27, 2026
98a1f6c
docs(openspec): tasks-dates for parity rows tsk-due-date, tsk-all-day…
rubenvdlinde Sep 27, 2026
b242d9c
docs(openspec): tasks-assignment-priority-labels for parity rows tsk-…
rubenvdlinde Sep 27, 2026
b3a4d8f
docs(openspec): backlog-sprints for parity rows bkl-sprints, bkl-spri…
rubenvdlinde Sep 27, 2026
ad6e5f2
docs(openspec): tasks-subtasks-checklist for parity rows tsk-subtasks…
rubenvdlinde Sep 27, 2026
9cf353a
docs(openspec): tasks-search-and-bulk for parity rows tsk-search, tsk…
rubenvdlinde Sep 27, 2026
14e8aa2
docs(openspec): tasks-move-between-projects for parity rows tsk-move-…
rubenvdlinde Sep 27, 2026
409d2b8
docs(openspec): backlog-releases-roadmap for parity rows bkl-releases…
rubenvdlinde Sep 27, 2026
ee2aebb
docs(openspec): projects-members-and-roles for parity rows prj-member…
rubenvdlinde Sep 27, 2026
8f9e35d
docs(openspec): tasks-readable-keys for parity rows tsk-readable-key,…
rubenvdlinde Sep 27, 2026
c083e3e
docs(openspec): planning-dependencies-on-task-page for parity rows pl…
rubenvdlinde Sep 27, 2026
93af05f
docs(openspec): boards-configurable-columns for parity rows brd-colum…
rubenvdlinde Sep 27, 2026
5e5c52d
docs(openspec): planning-timeline-editing for parity rows pln-gantt-e…
rubenvdlinde Sep 27, 2026
4a31a74
docs(openspec): projects-lifecycle-policy for parity rows prj-archive…
rubenvdlinde Sep 27, 2026
63b538f
docs(openspec): boards-filters for parity rows brd-filter, brd-filter…
rubenvdlinde Sep 27, 2026
49eab1a
docs(openspec): boards-card-display for parity rows brd-card-colours,…
rubenvdlinde Sep 27, 2026
9de6191
docs(openspec): backlog-list for parity rows bkl-backlog, bkl-sort-fi…
rubenvdlinde Sep 27, 2026
ffeee72
docs(openspec): projects-overview-logs-risks for parity rows prj-over…
rubenvdlinde Sep 27, 2026
063b39c
docs(openspec): portfolio-my-work-dashboard for parity rows prt-my-wo…
rubenvdlinde Sep 27, 2026
2b99687
docs(openspec): planning-calendar for parity rows pln-calendar-view, …
rubenvdlinde Sep 27, 2026
9f7f153
docs(openspec): integration-case-bridge for parity rows int-project-f…
rubenvdlinde Sep 27, 2026
f4feba5
docs(openspec): projects-templates-shared-workflow for parity rows pr…
rubenvdlinde Sep 27, 2026
f887dd7
docs(openspec): planning-phase-gate-document for parity row pln-phase…
rubenvdlinde Sep 27, 2026
eff51eb
fix(parity): OpenSpec pass decisions for 85 planninq gap rows; 45 row…
rubenvdlinde Sep 27, 2026
51f90d6
docs(openspec): projects-grouping-hierarchy-fields for parity rows pr…
rubenvdlinde Sep 27, 2026
c41e133
docs(openspec): boards-column-automation for parity row brd-column-au…
rubenvdlinde Sep 27, 2026
e31a95d
Merge pull request #675 from ConductionNL/parity/openspec-pass-1
rubenvdlinde Sep 27, 2026
962c0f9
docs(openspec): backlog-sprints stamps completedAt in a pre-save list…
rubenvdlinde Sep 27, 2026
e088d67
docs(openspec): projects-wiki for parity rows prj-wiki, prj-wiki-tree
rubenvdlinde Sep 27, 2026
d849337
docs(openspec): boards-cross-project-board for parity row brd-cross-p…
rubenvdlinde Sep 27, 2026
7f37b15
docs(openspec): boards-configurable-columns stamps completedAt on the…
rubenvdlinde Sep 27, 2026
269488c
docs(openspec): projects-public-share for parity rows prj-public-share
rubenvdlinde Sep 27, 2026
072ff12
docs(openspec): projects-templates-shared-workflow keeps labels app-w…
rubenvdlinde Sep 27, 2026
491e97c
docs(openspec): drop sprint references, take completedAt and owner-on…
rubenvdlinde Sep 27, 2026
c671b63
docs(openspec): boards-cross-project-board is a view that moves cards…
rubenvdlinde Sep 27, 2026
c8d0d8c
docs(openspec): portfolio-finance for parity rows prj-delivery-terms,…
rubenvdlinde Sep 27, 2026
f75e3ec
docs(openspec): portfolio-status-overview for parity rows prt-portfol…
rubenvdlinde Sep 27, 2026
93da092
docs(openspec): collaboration-notifications for parity rows col-notif…
rubenvdlinde Sep 27, 2026
f689558
docs(openspec): tasks-create-by-email for parity row tsk-email-create
rubenvdlinde Sep 27, 2026
e1717b6
docs(openspec): portfolio-flow-reports for parity rows prt-cumulative…
rubenvdlinde Sep 27, 2026
fb7f530
docs(openspec): portfolio-people-capacity for parity rows prt-capacity
rubenvdlinde Sep 27, 2026
24c2b48
docs(openspec): time-timer-and-work-type for parity rows tim-timer, t…
rubenvdlinde Sep 27, 2026
bf98631
docs(openspec): integration-code-forge-links for parity row int-git
rubenvdlinde Sep 27, 2026
9433424
Merge helper C's lane-C changes (parity/openspec-pass-3-changes) into…
rubenvdlinde Sep 27, 2026
7e33d82
fix(parity): OpenSpec pass part 2 decisions: 30 lane C rows specified…
rubenvdlinde Sep 27, 2026
69bb807
docs(openspec): integration-msproject-import for parity row int-impor…
rubenvdlinde Sep 27, 2026
1e37672
Merge pull request #677 from ConductionNL/parity/openspec-pass-2
rubenvdlinde Sep 27, 2026
3d09a9c
docs(openspec): platform-mobile-web for parity row int-mobile
rubenvdlinde Sep 27, 2026
ec23737
docs(openspec): platform-demo-data for parity row plt-demo-data
rubenvdlinde Sep 27, 2026
90ae322
chore(deps): relax the dexie pin now that nextcloud-vue loads it lazi…
rubenvdlinde Sep 27, 2026
681d4a7
Merge helper B's lane-B changes (parity/openspec-pass-2-changes) into…
rubenvdlinde Sep 27, 2026
146152f
docs(openspec): drop backlog-sprints; the sprint rows are decided no …
rubenvdlinde Sep 27, 2026
dc08853
fix(parity): OpenSpec pass part 3 decisions: 19 lane B rows specified…
rubenvdlinde Sep 27, 2026
04683f0
Merge pull request #680 from ConductionNL/parity/openspec-pass-3
rubenvdlinde Sep 27, 2026
bcb12c3
fix(access): scope tasks, columns, phases and time entries by a membe…
rubenvdlinde Sep 27, 2026
1b88a67
fix(access): bump <version> so the back-fill runs on upgrade, and des…
rubenvdlinde Sep 27, 2026
6bb3f01
style(access): docblock tag order, comment case and a RuntimeExceptio…
rubenvdlinde Sep 27, 2026
2363b6d
Merge pull request #683 from ConductionNL/fix/681-member-access-rule
rubenvdlinde Sep 27, 2026
4248783
docs(parity): set 43 sibling rows from the OpenSpec pass (#686)
rubenvdlinde Sep 28, 2026
41c2c90
docs(parity): corrections round 8, note the corrected premise on tt-v…
rubenvdlinde Sep 28, 2026
31118f5
docs(openspec): owner-moves decisions for the D10 timetable rows and …
rubenvdlinde Sep 28, 2026
b768ced
docs(parity): corrections round 9, 1 row (#692)
rubenvdlinde Sep 28, 2026
f8ec5c2
feat(timetable): planninq receives and serves a school timetable (#685)
rubenvdlinde Sep 28, 2026
f4c8701
docs(openspec): integration-case-bridge checks isInstalled('dossiq'),…
rubenvdlinde Sep 28, 2026
3be1913
docs(parity): decide the 54 undecided planninq rows, all recorded as …
rubenvdlinde Sep 28, 2026
77f6aa7
feat(board): run each board on the project's own columns, managed by …
rubenvdlinde Sep 28, 2026
4806ed3
feat(backlog): members work the backlog: add, rank, sort, filter and …
rubenvdlinde Sep 28, 2026
86840fa
feat(board): members switch the board page between the board and a li…
rubenvdlinde Sep 28, 2026
94c2eda
feat(projects): members open a project overview, keep a project log w…
rubenvdlinde Sep 28, 2026
c4a6694
feat(status): project owners write dated status reports on six aspect…
rubenvdlinde Sep 28, 2026
5172b4c
feat(projects): group projects into portfolios whose managers read ev…
rubenvdlinde Sep 29, 2026
a9cd351
feat(portfolio): portfolio managers see a portfolio's status rolled u…
rubenvdlinde Sep 29, 2026
5e33023
feat(phases): members manage project phases, and a phase closes only …
rubenvdlinde Sep 29, 2026
64408e3
feat(import): project owners import a Gantt plan from Microsoft Proje…
rubenvdlinde Sep 29, 2026
66ba8f8
feat(case): project owners hand a project's files and metadata over t…
rubenvdlinde Sep 29, 2026
00d4251
feat(finance): project owners set delivery terms and compare budget w…
rubenvdlinde Sep 29, 2026
8795e4a
feat(finance): portfolio managers see money totalled across a portfol…
rubenvdlinde Sep 29, 2026
e405567
feat(projects): project owners nest projects under a programme, whose…
rubenvdlinde Sep 29, 2026
c75e66b
feat(projects): admins add fields to every project, and project owner…
rubenvdlinde Sep 29, 2026
873e2a4
feat(dependencies): people link tasks on the task page and see blocke…
rubenvdlinde Sep 29, 2026
c01c79d
feat(tasks): projects get a short key and every task a readable key s…
rubenvdlinde Sep 29, 2026
94f38ef
feat(projects): project owners restore an archived project from the s…
rubenvdlinde Sep 29, 2026
e8a40ef
feat(projects): admins limit project creation to members of chosen gr…
rubenvdlinde Sep 29, 2026
395ae3c
feat(projects): people outside the creation policy request a project,…
rubenvdlinde Sep 29, 2026
a4d7b6e
feat(tasks): the creator is a task's reporter, and only the reporter,…
rubenvdlinde Sep 29, 2026
35d373b
feat(tasks): members create, quick-add, edit and delete tasks, with M…
rubenvdlinde Sep 29, 2026
740d73a
fix(timetable): only the timetable group, the named teacher and admin…
rubenvdlinde Sep 29, 2026
6ac687d
chore(tasks): translate the task editing strings, e2e, archive tasks-…
rubenvdlinde Sep 29, 2026
944a5ab
style(tasks): wrap the delete refusal call
rubenvdlinde Sep 29, 2026
7ffebc0
Merge remote-tracking branch 'origin/development' into feat/tasks-cre…
rubenvdlinde Sep 29, 2026
2acb6c2
feat(tasks): a task can be shared with more people, who get its activity
rubenvdlinde Sep 29, 2026
15828c9
feat(tasks): members pick who is responsible, share a task, set its p…
rubenvdlinde Sep 29, 2026
17072dc
chore(tasks): translate, e2e, archive tasks-assignment-priority-label…
rubenvdlinde Sep 29, 2026
5e4bd1a
feat(tasks): a task keeps a checklist; helpers for subtasks, rollups …
rubenvdlinde Sep 29, 2026
e712e75
feat(tasks): subtasks one level deep, a checklist, rollups on the par…
rubenvdlinde Sep 29, 2026
ce3c70f
chore(tasks): translate, e2e, archive tasks-subtasks-checklist and se…
rubenvdlinde Sep 29, 2026
836ab0f
feat(portfolio): group open work per person across projects
rubenvdlinde Sep 29, 2026
4bbc76c
feat(portfolio): the Capacity report shows open work per person, with…
rubenvdlinde Sep 29, 2026
0b00b6b
chore(portfolio): e2e, archive portfolio-people-capacity and set prt-…
rubenvdlinde Sep 29, 2026
f4a4135
feat(dashboard): a user's own order of pinned projects is kept in the…
rubenvdlinde Sep 29, 2026
a4fa223
feat(tasks): read my tasks across projects and group them as overdue,…
rubenvdlinde Sep 29, 2026
d607e9f
feat(tasks): a My tasks page, my task figures on the dashboard and my…
rubenvdlinde Sep 29, 2026
8886e59
fix(l10n): every string the interface translates has a catalogue entr…
rubenvdlinde Sep 29, 2026
f21c257
feat(setup): example data gives the admin three projects they own, wi…
rubenvdlinde Sep 29, 2026
106b207
chore(openspec): archive platform-demo-data, plt-demo-data built
rubenvdlinde Sep 29, 2026
e81669f
wip: mid-task state when WSL ran out of memory (29 Sep 19:38); not ve…
rubenvdlinde Sep 29, 2026
4b2106b
chore(openspec): archive school-timetable-target, int-push-events built
rubenvdlinde Sep 29, 2026
44b77d8
feat(timetable): a lesson can be a draft only its teacher and admins …
rubenvdlinde Sep 29, 2026
97afc61
feat(timetable): contract, docs and e2e for draft timetables; archive…
rubenvdlinde Sep 29, 2026
87e1717
refactor(timetable): the publish window check lives in TimetableSessi…
rubenvdlinde Sep 29, 2026
0e355e9
Merge pull request #771 from ConductionNL/feat/timetable-draft-review
rubenvdlinde Sep 29, 2026
79dffdb
feat(roadmap): plan releases, link tasks to epics and see both on a p…
rubenvdlinde Sep 29, 2026
22b3f9a
docs(openspec): timetabling-generator change; tt-hard-soft-wishes and…
rubenvdlinde Sep 29, 2026
7a588fc
feat(board): colour cards by label or priority and group the board in…
rubenvdlinde Sep 29, 2026
19711e0
feat(timetable): store timetable wishes and scenarios, and set the sc…
rubenvdlinde Sep 29, 2026
43b983d
feat(timetable): the generator input from learniq's event or two uplo…
rubenvdlinde Sep 29, 2026
e40b82c
style(timetable): two lines under 150 characters (phpcs)
rubenvdlinde Sep 29, 2026
621476e
feat(timetable): the scorer measures clashes, wishes, gaps, lessons p…
rubenvdlinde Sep 29, 2026
388850a
feat(timetable): a timetabler lists, adds and edits wishes, hard or s…
rubenvdlinde Sep 30, 2026
3a1ccee
feat(timetable): generate a timetable scenario that keeps every hard …
rubenvdlinde Sep 30, 2026
9f23200
fix(timetable): phpcs, phpmd static access and the job's spec tag
rubenvdlinde Sep 30, 2026
832a28c
feat(timetable): take the current timetable into a scenario, scored l…
rubenvdlinde Sep 30, 2026
6bc8cd5
style(timetable): wrap the importer's input line under 150 characters…
rubenvdlinde Sep 30, 2026
a94982a
feat(timetable): compare two or three scenarios side by side, best va…
rubenvdlinde Sep 30, 2026
3d871ed
chore(parity): tt-scenario-compare built
rubenvdlinde Sep 30, 2026
e10b787
feat(timetable): publish a generated scenario as draft lessons for ev…
rubenvdlinde Sep 30, 2026
d1686d0
style(timetable): phpmd, a longer method name and no static date pars…
rubenvdlinde Sep 30, 2026
e291f91
docs(timetable): the generator's feature page, a Newman folder and e2…
rubenvdlinde Sep 30, 2026
2ebf34d
chore(openspec): archive timetabling-generator; spec tags and both ma…
rubenvdlinde Sep 30, 2026
d28cb90
wip: saved by the coordinator after the 30 Sep 09:51 WSL restart, not…
rubenvdlinde Sep 30, 2026
524271b
Merge pull request #799 from ConductionNL/feat/timetable-generator-docs
rubenvdlinde Sep 30, 2026
f5aacab
Merge remote-tracking branch 'origin/development' into feat/boards-co…
rubenvdlinde Sep 30, 2026
279e342
feat(boards): column rules run in the same save when a task enters th…
rubenvdlinde Sep 30, 2026
c233287
feat(boards): the owner edits column rules on the board, and a moved …
rubenvdlinde Sep 30, 2026
115fc24
l10n(boards): column rules strings in all 36 locales
rubenvdlinde Sep 30, 2026
8cee740
chore(openspec): archive boards-column-automation; brd-column-automat…
rubenvdlinde Sep 30, 2026
4af287a
feat(boards): the board filter model and saved filters in the register
rubenvdlinde Sep 30, 2026
388da46
feat(boards): run rules on a card when it enters a board column (#802)
rubenvdlinde Sep 30, 2026
e375c55
feat(boards): filter the board by assignee, label, priority and due d…
rubenvdlinde Sep 30, 2026
aaaf5ad
style(boards): phpmd, the owner listener's update path in its own method
rubenvdlinde Sep 30, 2026
bba7999
Merge remote-tracking branch 'origin/development' into feat/boards-fi…
rubenvdlinde Sep 30, 2026
675c24b
feat(boards): save a cross-project view of several projects, owned by…
rubenvdlinde Sep 30, 2026
024ff2a
feat(boards): filter the board by person, label, priority and due dat…
rubenvdlinde Sep 30, 2026
3350f3d
wip(boards): cross-project view page, status lanes, project chip (not…
rubenvdlinde Sep 30, 2026
01162d8
Merge remote-tracking branch 'origin/development' into feat/cross-pro…
rubenvdlinde Sep 30, 2026
b6de438
Merge branch 'feat/cross-project-views-schema' into feat/cross-projec…
rubenvdlinde Sep 30, 2026
ae081bb
feat(boards): open a cross-project view and move its cards through ea…
rubenvdlinde Sep 30, 2026
b784b08
feat(boards): save a cross-project view of several projects, owned by…
rubenvdlinde Sep 30, 2026
9012943
feat(boards): save, share, edit and delete cross-project views from t…
rubenvdlinde Sep 30, 2026
4639cfc
Merge remote-tracking branch 'origin/development' into feat/cross-pro…
rubenvdlinde Sep 30, 2026
57a1241
Merge branch 'feat/cross-project-views-page' into feat/cross-project-…
rubenvdlinde Sep 30, 2026
2e1b171
feat(notifications): tell people when a task is assigned to them, wit…
rubenvdlinde Sep 30, 2026
8dd7bc4
Merge pull request #811 from ConductionNL/feat/cross-project-views-bo…
rubenvdlinde Sep 30, 2026
da6f277
refactor(notifications): the assignment switch in its own service, ap…
rubenvdlinde Sep 30, 2026
711cc7a
style(notifications): the switch read is private; values() is its cal…
rubenvdlinde Sep 30, 2026
4f78ac0
Merge remote-tracking branch 'origin/development' into feat/assignmen…
rubenvdlinde Sep 30, 2026
374b2a5
feat(notifications): get assignment and due-date notifications by ema…
rubenvdlinde Sep 30, 2026
5ce547f
test(notifications): the resolver stub carries no OpenRegister spec a…
rubenvdlinde Sep 30, 2026
bf48fad
Merge pull request #814 from ConductionNL/feat/assignment-notifications
rubenvdlinde Sep 30, 2026
3619e75
Merge remote-tracking branch 'origin/development' into feat/email-not…
rubenvdlinde Sep 30, 2026
d2ba960
feat(tasks): see and add the commits, branches and merge requests tha…
rubenvdlinde Sep 30, 2026
b7da045
Merge pull request #816 from ConductionNL/feat/email-notifications
rubenvdlinde Sep 30, 2026
a88bc79
feat(tasks): link GitHub commits and pull requests to tasks through i…
rubenvdlinde Sep 30, 2026
1602163
feat(settings): find the GitHub setup for code links in the admin set…
rubenvdlinde Sep 30, 2026
0dd7d50
Merge remote-tracking branch 'origin/development' into feat/code-forg…
rubenvdlinde Sep 30, 2026
32ba907
refactor(tasks): look up a code link's task in ForgeLinkService
rubenvdlinde Sep 30, 2026
3774b78
docs(openspec): the design names ForgeLinkService for the task lookup
rubenvdlinde Sep 30, 2026
5880dff
docs(tasks): tag the forge link helpers with their spec task (gate-16)
rubenvdlinde Sep 30, 2026
7c9ff8d
Merge pull request #819 from ConductionNL/feat/code-forge-links
rubenvdlinde Sep 30, 2026
37e6b42
wip(calendar): task calendar pages, tabs and links (helper pending re…
rubenvdlinde Sep 30, 2026
7153ee2
feat(calendar): see a project's tasks and your own on a calendar
rubenvdlinde Sep 30, 2026
1534fcc
test(calendar): visual baseline for My calendar (gate-26)
rubenvdlinde Sep 30, 2026
edc46e8
wip(calendar): export assigned tasks to a Planninq task list (tests g…
rubenvdlinde Sep 30, 2026
2db8f38
feat(calendar): show your planninq tasks in Nextcloud Tasks, one way
rubenvdlinde Sep 30, 2026
bf20e34
refactor(calendar): OpenRegister reads of the task export in TaskCale…
rubenvdlinde Sep 30, 2026
8c6971c
feat(timeline): plan in working days: admin working week, holidays an…
rubenvdlinde Sep 30, 2026
25ac090
feat(timeline): move and resize tasks on the timeline, by pointer and…
rubenvdlinde Sep 30, 2026
cf7090d
feat(timeline): move blocked tasks along when a task slips, after a p…
rubenvdlinde Sep 30, 2026
065239c
Merge pull request #826 from ConductionNL/feat/timeline-autoschedule
rubenvdlinde Sep 30, 2026
89de10f
docs(openspec): archive planning-calendar; point its rows and @spec t…
rubenvdlinde Sep 30, 2026
014d803
feat(mobile): work on tasks from a phone browser; archive platform-mo…
rubenvdlinde Sep 30, 2026
d05b373
fix(mobile): sort imports, point the phone helpers' @spec tags at the…
rubenvdlinde Oct 1, 2026
ed5b65b
wip(flow): flow history replay, service and endpoints (portfolio-flow…
rubenvdlinde Oct 1, 2026
2bdeefb
Merge pull request #830 from ConductionNL/feat/phone-web
rubenvdlinde Oct 1, 2026
9b5e601
feat(flow): read a project's or portfolio's cumulative flow and lead …
rubenvdlinde Oct 1, 2026
69d84e1
refactor(flow): window parsing in the service, no inline ifs, split f…
rubenvdlinde Oct 1, 2026
886ef76
feat(flow): see a project's and a portfolio's cumulative flow and cyc…
rubenvdlinde Oct 1, 2026
61c096e
Merge pull request #834 from ConductionNL/feat/flow-history
rubenvdlinde Oct 1, 2026
95d1336
Merge remote-tracking branch 'origin/development' into feat/flow-screens
rubenvdlinde Oct 1, 2026
27e7e55
test(flow): the project tabs include Flow
rubenvdlinde Oct 1, 2026
6703cc6
Merge pull request #836 from ConductionNL/feat/flow-screens
rubenvdlinde Oct 1, 2026
a3a8637
fix(boards): a saved cross-project view gets its owner again
rubenvdlinde Oct 1, 2026
602b4d4
feat(reports): build, save and share your own report over tasks
rubenvdlinde Oct 1, 2026
5cb2403
fix(reports): schema slug taskReport, titled filter fields, null for …
rubenvdlinde Oct 1, 2026
d1c6ad0
Merge remote-tracking branch 'origin/development' into feat/custom-re…
rubenvdlinde Oct 1, 2026
7756a0e
fix(l10n): the report filter fields in every shipped locale
rubenvdlinde Oct 1, 2026
9dbb06a
Merge pull request #839 from ConductionNL/feat/custom-reports
rubenvdlinde Oct 1, 2026
58dcbd4
feat(projects): managers, viewers and groups on a project, enforced o…
rubenvdlinde Oct 1, 2026
be2d8de
refactor(projects): stamping in its own method, membersFromProject pr…
rubenvdlinde Oct 1, 2026
537ef97
Merge remote-tracking branch 'origin/development' into feat/project-r…
rubenvdlinde Oct 1, 2026
5c2a18e
Merge pull request #842 from ConductionNL/feat/project-roles-schema
rubenvdlinde Oct 1, 2026
5b4202e
wip: member search through core autocomplete, names on the Members ta…
rubenvdlinde Oct 1, 2026
262d2e8
feat(projects): find colleagues and groups on the Members tab without…
rubenvdlinde Oct 1, 2026
a520ff4
Merge remote-tracking branch 'origin/development' into feat/member-se…
rubenvdlinde Oct 1, 2026
d5b4dc2
wip: roles in the interface, group ids through initial state (not ver…
rubenvdlinde Oct 1, 2026
35c1811
Merge pull request #844 from ConductionNL/feat/member-search
rubenvdlinde Oct 1, 2026
a2ea6ae
feat(projects): roles in the interface: role picker, read-only board …
rubenvdlinde Oct 1, 2026
d984170
style(tests): one entry per line in the member list expectation
rubenvdlinde Oct 1, 2026
f6ece6a
Merge remote-tracking branch 'origin/development' into feat/project-r…
rubenvdlinde Oct 1, 2026
e08d64e
feat(projects): a project shared with a group lets its members link t…
rubenvdlinde Oct 1, 2026
f51795f
Merge pull request #846 from ConductionNL/feat/project-roles-ui
rubenvdlinde Oct 1, 2026
538a108
feat(projects): leaving a project takes you off every list and hands …
rubenvdlinde Oct 1, 2026
f77a3da
refactor(projects): ProjectRoles as an instance, so phpmd's static-ac…
rubenvdlinde Oct 1, 2026
38b5e8a
Merge remote-tracking branch 'origin/development' into feat/project-r…
rubenvdlinde Oct 1, 2026
741a599
Merge pull request #848 from ConductionNL/feat/project-roles-ownership
rubenvdlinde Oct 2, 2026
128dc34
feat(projects): a deleted account or group leaves every project, and …
rubenvdlinde Oct 2, 2026
329c66d
Merge pull request #850 from ConductionNL/feat/project-principal-cleanup
rubenvdlinde Oct 2, 2026
575a48a
feat(projects): a group can own a project, and its creator can leave …
rubenvdlinde Oct 2, 2026
fb5263d
fix(projects): import order, a typed Page import, @spec on the picker…
rubenvdlinde Oct 2, 2026
999ba69
Merge remote-tracking branch 'origin/development' into feat/project-o…
rubenvdlinde Oct 2, 2026
14fe146
Merge pull request #852 from ConductionNL/feat/project-owner-group
rubenvdlinde Oct 2, 2026
f13121d
feat(tasks): people and free text on a task are read by signed-in use…
rubenvdlinde Oct 2, 2026
5cdab4b
chore(deps-dev): bump conduction/hydra-gates from 1.16.1 to 1.18.0 (#…
dependabot[bot] Oct 2, 2026
2ece160
Merge remote-tracking branch 'origin/development' into feat/public-sh…
rubenvdlinde Oct 2, 2026
9712193
Merge pull request #855 from ConductionNL/feat/public-share-private-f…
rubenvdlinde Oct 2, 2026
b8c3dfc
chore(openspec): tick four tasks whose live checks passed
rubenvdlinde Oct 2, 2026
462643c
Merge pull request #857 from ConductionNL/chore/livepass-planninq-ticks
rubenvdlinde Oct 2, 2026
053195f
test(repair): the members back-fill reads the register the import jus…
rubenvdlinde Oct 2, 2026
cef8574
fix(repair): drop OpenRegister's cached register after the import so …
rubenvdlinde Oct 2, 2026
71d0218
fix(board): a project OpenRegister hides opens with the no-access mes…
rubenvdlinde Oct 2, 2026
967cfac
fix(repair): narrow the register mapper to an object before calling i…
rubenvdlinde Oct 2, 2026
6aaeedf
wip: saved by the coordinator after the 2 Oct 23:45 session limit
rubenvdlinde Oct 2, 2026
72e9c93
test(members): mock the session in the member search spec, which now …
rubenvdlinde Oct 3, 2026
2182aed
test(e2e): release a user the membership specs create from the first-…
rubenvdlinde Oct 3, 2026
4dccfcf
Merge pull request #859 from ConductionNL/fix/backfill-members-fresh-…
rubenvdlinde Oct 3, 2026
d5faec2
test(timetable): a course query answers one course's lessons, and eve…
rubenvdlinde Oct 3, 2026
c3463b0
feat(timetable): answer a timetable query by course, and carry a less…
rubenvdlinde Oct 3, 2026
e203655
Merge remote-tracking branch 'origin/development' into feat/timetable…
rubenvdlinde Oct 3, 2026
58a4572
refactor(timetable): keep the course and link rules beside the row sh…
rubenvdlinde Oct 3, 2026
b82ffb0
Merge pull request #861 from ConductionNL/fix/board-no-access-and-vie…
rubenvdlinde Oct 3, 2026
f2d4ff4
Merge pull request #862 from ConductionNL/fix/members-own-display-name
rubenvdlinde Oct 3, 2026
c276b1a
Merge pull request #863 from ConductionNL/fix/e2e-fresh-users
rubenvdlinde Oct 3, 2026
18ac14c
Merge remote-tracking branch 'origin/development' into feat/timetable…
rubenvdlinde Oct 3, 2026
e20f551
Merge pull request #865 from ConductionNL/feat/timetable-course-query
rubenvdlinde Oct 3, 2026
d0eb3c7
chore(openspec): tick the timetable course query's live check, which …
rubenvdlinde Oct 3, 2026
9782f94
Merge pull request #867 from ConductionNL/chore/livepass-tick-timetab…
rubenvdlinde Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:

jobs:
quality:
if: (github.event_name != 'pull_request' || github.head_ref != 'development')
# ConductionNL, NOT Conduction. Commit 5f4069ac ("org rename", 2026-06-01)
# pointed every reusable-workflow call in this repo at `Conduction/.github`,
# an org that does not exist. Actions cannot resolve it, so from that date
Expand Down Expand Up @@ -151,6 +152,17 @@ jobs:
# and say why — it is still honoured. To roll back for everyone, revert on
# ConductionNL/.github main.
enable-hydra-gates: true
# ── Cost controls (see ConductionNL/.github#596, #599) ───────────────
# Run PHPUnit and Playwright only when the diff could change their
# verdict. Fails safe TOWARDS running: an unreadable diff, a force-push,
# a branch creation or a dispatch all run everything, and a filtered
# skip is a declared state in the Quality Report, not a missing one.
enable-path-filtering: true
# PR-time PHPUnit runs the primary PHP against the newest declared
# Nextcloud; the full matrix still runs on every push to a default
# branch and on the release PR into beta. Breadth moves from
# per-commit to per-merge, it is not dropped.
reduce-pr-matrix: true

# Translation-completeness gate: every required European locale must carry a
# real translation for every key in l10n/en.json. Dependency-free pure Node
Expand Down
46 changes: 45 additions & 1 deletion appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Vrij en open source onder de EUPL-1.2-licentie.

**Ondersteuning:** Voor ondersteuning, neem contact op via support@conduction.nl.
]]></description>
<version>0.2.17</version>
<version>0.2.23-unstable.20261003100000</version>
<licence>EUPL-1.2</licence>
<author mail="info@conduction.nl" homepage="https://www.conduction.nl/">Conduction</author>
<namespace>Planninq</namespace>
Expand Down Expand Up @@ -161,7 +161,45 @@ Vrij en open source onder de EUPL-1.2-licentie.
<step>OCA\Planninq\Repair\MigrateAppConfigKeys</step>
<step>OCA\Planninq\Repair\MigrateUserPreferences</step>
<step>OCA\Planninq\Repair\MigrateRegisterSlug</step>
<!--
ONE LEVEL DOWN FROM MigrateRegisterSlug, AND THE SAME TRAP.
`timeEntry` is a slug three apps declared — humaniq's HR
booking, pipelinq's billing record and this app's project
booking — and a slug is global per organisation, so
SchemaMapper::find() answered whichever row it reached first.
humaniq owns the hours; this record is the PLANNING side of one,
and keeps a `timeEntry` reference to the humaniq booking.

Renaming the row BEFORE InitializeSettings is what makes it a
rename: the import matches by (application, slug) and its
not-found branch CREATES a second schema, orphaning every
existing entry silently while the app reads an empty list.
-->
<step>OCA\Planninq\Repair\RenameTimeEntrySchemaSlug</step>
<step>OCA\Planninq\Repair\InitializeSettings</step>
<!--
AFTER InitializeSettings, in BOTH blocks (planninq#681). The
import adds the `members` property that task, column,
projectPhase and plannedTimeEntry are now scoped by; before it
there is no column to fill. Rows stored before this release
have no list, and the new rule hides them from every member
until this step has run. Idempotent and never throws.
-->
<step>OCA\Planninq\Repair\BackfillProjectMembers</step>
<!--
AFTER InitializeSettings and BackfillProjectMembers, in BOTH
blocks (boards-configurable-columns). The board groups cards by
column now, and a task stored before this release has none, so
it would drop off the board. The import adds the column's
`status`; this step then creates default columns where a
project has none and places each column-less, not cancelled
task. Idempotent and never throws.
-->
<step>OCA\Planninq\Repair\AssignBoardColumns</step>
<!-- AFTER InitializeSettings (projects-lifecycle-policy): the import
rewrites the project schema, so the reviewers of project
requests are written back in. Never throws. -->
<step>OCA\Planninq\Repair\ApplyProjectPolicy</step>
<step>OCA\Planninq\Repair\ReconcileDueReminderOverrides</step>
</post-migration>
<install>
Expand All @@ -178,7 +216,13 @@ Vrij en open source onder de EUPL-1.2-licentie.
happen here or the import below forks a second, empty register.
-->
<step>OCA\Planninq\Repair\MigrateRegisterSlug</step>
<!-- See the note in <post-migration>. -->
<step>OCA\Planninq\Repair\RenameTimeEntrySchemaSlug</step>
<step>OCA\Planninq\Repair\InitializeSettings</step>
<!-- See the note in <post-migration>. -->
<step>OCA\Planninq\Repair\BackfillProjectMembers</step>
<step>OCA\Planninq\Repair\AssignBoardColumns</step>
<step>OCA\Planninq\Repair\ApplyProjectPolicy</step>
</install>
</repair-steps>

Expand Down
30 changes: 30 additions & 0 deletions appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@
// First-time setup wizard (ADR-042) - the standard CnSetupWizard contract.
['name' => 'setup#status', 'url' => '/api/setup/status', 'verb' => 'GET'],
['name' => 'setup#runAction', 'url' => '/api/setup/action/{actionId}', 'verb' => 'POST', 'requirements' => ['actionId' => '[a-z0-9\\-]+']],
['name' => 'setup#saveConfig', 'url' => '/api/setup/config', 'verb' => 'POST'],
['name' => 'settings#updateUser', 'url' => '/api/settings/user', 'verb' => 'POST'],

// Project creation policy check — enforces allow_project_creation server-side.
['name' => 'project#checkCreatePolicy', 'url' => '/api/projects/check-create-policy', 'verb' => 'GET'],
// Project create proxy — C1: enforces policy then calls OR ObjectService server-side.
['name' => 'project#keyAvailable', 'url' => '/api/projects/key-available', 'verb' => 'GET'],
['name' => 'project#create', 'url' => '/api/projects', 'verb' => 'POST'],
// Leave-project proxy — C3: allows non-owner members to remove themselves (_rbac: false).
['name' => 'project#leaveProject', 'url' => '/api/projects/{projectId}/leave', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']],
Expand All @@ -32,6 +34,34 @@
// Dependency edge delete — project-member guarded.
['name' => 'dependency#destroy', 'url' => '/api/dependencies/{id}', 'verb' => 'DELETE', 'requirements' => ['id' => '[^/]+']],

// Microsoft Project plan import: preview (writes nothing), then import. Owner or admin, checked per project.
['name' => 'projectImport#preview', 'url' => '/api/projects/{projectId}/import/msproject/preview', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']],
['name' => 'projectImport#import', 'url' => '/api/projects/{projectId}/import/msproject', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']],

// Case handover: copy a project's files and metadata to its linked case. Owner or admin, checked per project.
['name' => 'caseHandover#status', 'url' => '/api/projects/{projectId}/case-handover', 'verb' => 'GET', 'requirements' => ['projectId' => '[^/]+']],
['name' => 'caseHandover#handOver', 'url' => '/api/projects/{projectId}/case-handover', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']],

// Read-only per-project timeline (Gantt) — RBAC-scoped through OR ObjectService.
['name' => 'timeline#forProject', 'url' => '/api/projects/{projectId}/timeline', 'verb' => 'GET', 'requirements' => ['projectId' => '[^/]+']],
// Several projects on one axis (portfolio timeline), same RBAC-scoped read per project.
['name' => 'timeline#forProjects', 'url' => '/api/timeline', 'verb' => 'GET'],
// Cumulative flow and lead/cycle time, replayed from the audit trail (portfolio-flow-reports).
['name' => 'flow#forProject', 'url' => '/api/projects/{projectId}/flow', 'verb' => 'GET', 'requirements' => ['projectId' => '[^/]+']],
['name' => 'flow#forPortfolio', 'url' => '/api/portfolios/{portfolioId}/flow', 'verb' => 'GET', 'requirements' => ['portfolioId' => '[^/]+']],

// School timetable (school-timetable-target, decision D10): signed-in users
// read a cohort's, group's or teacher's sessions; admins upsert a batch by hand.
['name' => 'timetable#sessions', 'url' => '/api/timetable/sessions', 'verb' => 'GET'],
['name' => 'timetable#upsert', 'url' => '/api/timetable/sessions/upsert', 'verb' => 'POST'],
// Admins publish a source's draft lessons in a window (timetable-draft-review).
['name' => 'timetable#publish', 'url' => '/api/timetable/sessions/publish', 'verb' => 'POST'],
// Admins upload the activities and rooms sheets for the timetable generator (timetabling-generator 2.2).
['name' => 'timetableInput#upload', 'url' => '/api/timetable/input/upload', 'verb' => 'POST'],
// Admins start a generator run for a timetable scenario (timetabling-generator 5.2).
['name' => 'timetableScenario#generate', 'url' => '/api/timetable/scenarios/{id}/generate', 'verb' => 'POST'],
// Admins take the current timetable into an imported scenario (timetabling-generator 6.1).
['name' => 'timetableScenario#importCurrent', 'url' => '/api/timetable/scenarios/{id}/import', 'verb' => 'POST'],
// Admins publish a scenario as draft lessons for its window (timetabling-generator 8.1).
['name' => 'timetableScenario#publishDrafts', 'url' => '/api/timetable/scenarios/{id}/publish-drafts', 'verb' => 'POST'],
]);
8 changes: 4 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
},
"require-dev": {
"conduction/coding-standard": "^1.0",
"conduction/hydra-gates": "^1.7.1",
"conduction/hydra-gates": "^1.14.0",
"cyclonedx/cyclonedx-php-composer": "^6.2",
"edgedesign/phpqa": "^1.27",
"nextcloud/ocp": "^34.0",
"nextcloud/ocp": "^35.0",
"phpcsstandards/phpcsextra": "^1.4",
"phpmd/phpmd": "^2.15",
"phpmetrics/phpmetrics": "^2.8",
Expand All @@ -39,9 +39,9 @@
"phpcs": "./vendor/bin/phpcs --standard=phpcs.xml",
"phpcs:fix": "./vendor/bin/phpcbf --standard=phpcs.xml",
"phpcs:output": "./vendor/bin/phpcs --standard=phpcs.xml --report=json lib/ 2>/dev/null | tail -1 > phpcs-output.json",
"phpmd": "E=0; ./vendor/bin/phpmd lib text phpmd.xml || E=$?; ./vendor/bin/phpmd lib text vendor/conduction/hydra-gates/quality-config/phpmd-unusedparams.xml || E=$?; exit $E",
"phpmd": "E=0; php -d memory_limit=2G ./vendor/bin/phpmd lib text phpmd.xml || E=$?; php -d memory_limit=2G ./vendor/bin/phpmd lib text vendor/conduction/hydra-gates/quality-config/phpmd-unusedparams.xml || E=$?; exit $E",
"phpmetrics": "./vendor/bin/phpmetrics --report-html=phpmetrics lib/",
"psalm": "if [ -f vendor/bin/psalm ]; then ./vendor/bin/psalm --threads=1 --no-cache; else echo 'Psalm not installed, skipping...'; fi",
"psalm": "if [ -f vendor/bin/psalm ]; then ./vendor/bin/psalm --threads=1 --no-cache --memory-limit=2G; else echo 'Psalm not installed, skipping...'; fi",
"phpstan": "if [ -f vendor/bin/phpstan ]; then ./vendor/bin/phpstan analyse --memory-limit=1G; else echo 'PHPStan not installed, skipping...'; fi",
"test:unit": "if [ ! -f vendor/bin/phpunit ]; then echo 'phpunit not installed - run composer install' >&2; exit 1; elif [ -f ../../lib/base.php ]; then ./vendor/bin/phpunit -c phpunit.xml --colors=always; else echo 'No Nextcloud server tree (../../lib/base.php) - running the pure unit suite via phpunit-unit.xml, which stubs OCP from vendor/nextcloud/ocp.'; ./vendor/bin/phpunit -c phpunit-unit.xml --colors=always --no-coverage; fi",
"test:all": "if [ ! -f vendor/bin/phpunit ]; then echo 'phpunit not installed - run composer install' >&2; exit 1; elif [ -f ../../lib/base.php ]; then ./vendor/bin/phpunit -c phpunit.xml --colors=always; else echo 'No Nextcloud server tree (../../lib/base.php) - running the pure unit suite via phpunit-unit.xml, which stubs OCP from vendor/nextcloud/ocp.'; ./vendor/bin/phpunit -c phpunit-unit.xml --colors=always --no-coverage; fi",
Expand Down
Loading
Loading