Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

Development to beta#1303

Merged
remko48 merged 335 commits into
betafrom
development
Apr 22, 2026
Merged

Development to beta#1303
remko48 merged 335 commits into
betafrom
development

Conversation

@remko48

@remko48 remko48 commented Apr 22, 2026

Copy link
Copy Markdown
Member

No description provided.

…ints

Adds all new API routes to routes.php:
- Email relations: GET/POST/DELETE /emails, GET /emails/search
- Calendar events: GET/POST /events, POST /events/link, DELETE /events/{eventId}
- Contacts: GET/POST/PUT/DELETE /contacts, GET /contacts/{uid}/objects
- Deck cards: GET/POST/DELETE /deck, GET /deck/boards/{boardId}/objects
- Unified: GET /relations

Closes #1090
All 9 tasks implemented with 48 unit tests across 5 test files.
Displays OpenRegister objects referencing the selected file in a semantic
<ul> list with register/schema context and links to object detail pages.
Shows NcLoadingIcon during API calls, NcEmptyContent for empty/error states.
Uses @nextcloud/axios and @nextcloud/router for API calls and URL generation.

Closes #1101
…s, approval chains, test hooks

Implements the workflow-operations change (#1005):

Backend:
- WorkflowExecution entity/mapper for persisting hook execution history
- ScheduledWorkflow entity/mapper and ScheduledWorkflowJob TimedJob
- ApprovalChain/ApprovalStep entities, mappers, and ApprovalService
- WorkflowExecutionController with filtered list, detail, and admin delete
- ScheduledWorkflowController with full CRUD
- ApprovalController with chain CRUD, step approve/reject, and progress queries
- testHook dry-run endpoint on WorkflowEngineController
- ExecutionHistoryCleanupJob for configurable retention pruning
- HookExecutor modified to persist execution history alongside logging
- Three database migrations for new tables
- Routes registered in routes.php, TimedJobs in Application.php boot()
Vue components:
- SchemaWorkflowTab — main tab for schema workflow settings
- HookList/HookForm — hook CRUD in schema settings
- TestHookDialog — dry-run test modal with JSON editor
- WorkflowExecutionPanel/Detail — execution history table and detail view
- ScheduledWorkflowPanel — scheduled workflow management
- ApprovalChainPanel/ApprovalStepList — approval chain config and step progress

Unit tests (10 test files):
- Entity tests for WorkflowExecution, ScheduledWorkflow, ApprovalChain, ApprovalStep
- ApprovalServiceTest with role verification and status checks
- Controller tests for WorkflowExecution, ScheduledWorkflow, Approval
- BackgroundJob tests for ScheduledWorkflowJob and ExecutionHistoryCleanupJob
Create MyAccount.vue page at /mijn-account with sections for:
- Password change (with backend capability detection)
- Avatar upload/delete (with file type validation)
- Notification preferences (toggles and digest frequency)
- Activity timeline (paginated, filterable by type)
- API token management (create, list, revoke with clipboard)
- Personal data export (GDPR, with rate limit feedback)
- Account deactivation (double confirmation with username)

All components use Nextcloud Vue, NL Design System tokens, and i18n.
Mark all OpenRegister-scoped tasks as completed. Phases 4-7 marked
as out of scope (separate repos). Added spec.md and plan.json with
GitHub issue cross-references.
…atus

Archives completed change to openspec/changes/archive/2026-03-25-archival-destruction-workflow/.
Updates main spec implementation status to reflect Phase 1 completion.
Displays extraction status, chunk count, entity breakdown (expandable),
risk level with accessible color-coded badges (text always visible),
anonymization status, and an Extract Now button for unextracted files.
Uses CSS variables for all colors (no hardcoded values, WCAG AA compliant).

Closes #1103
- Register ObjectReferenceProvider in Application::register() alongside
  the existing search provider registration
- Add IReferenceManager and IURLGenerator to ObjectService constructor
- Invalidate reference cache in saveObject() after successful persistence
  to ensure Smart Picker previews refresh when objects are updated

Closes #1123
Implements ADiscoverableReferenceProvider and ISearchableReferenceProvider
to enable OpenRegister objects in the Nextcloud Smart Picker. Features:

- URL pattern matching for hash-routed UI, API, and direct object URLs
- Rich object resolution with title, description, schema/register context
- Deep link registry integration for consuming-app URL resolution
- Per-user caching with register/schema/uuid cache prefix
- Graceful error handling preventing metadata leakage on RBAC failures
- Up to 4 preview properties extracted from object data

Closes #1122
Add 28 new test methods across UserControllerTest and
UserServiceProfileActionsTest covering:
- Password change (success, incorrect, rate limited, unsupported)
- Avatar upload/delete (success, unsupported type/size, backend)
- Notification preferences (defaults, stored, invalid digest)
- Activity history (success, pagination)
- API token CRUD (create, list masked, revoke, max limit, not found)
- Account deactivation (request, duplicate, status, cancel)
- Data export (rate limiting)
- Authentication checks on all endpoints
Adds translations for all user-visible strings in the Register Objects
and Extraction sidebar tab components, including tab names, empty states,
error messages, button labels, status labels, and risk level labels.
- Create ObjectReferenceWidget.vue with card-style preview rendering
  (icon, title, schema/register subtitle, properties, updated timestamp)
- Create init.ts with lazy-loaded widget registration via @nextcloud/vue-richtext
- Add 'reference' entry point to webpack.config.js
- Add @nextcloud/vue-richtext dependency
- Use CSS custom properties for NL Design System compatibility
- Responsive layout with WCAG AA contrast compliance

Closes #1124
All backend (16), frontend (9), and unit test (2) tasks completed.
Integration tests deferred as they require a running Nextcloud instance.
- Add _tmlo JSON metadata column to MagicMapper getMetadataColumns
- Add tmlo to metadata field mapping for magic table insert/hydration
- Add buildTmloFilterConditionsSql for tmlo.* query parameters
- Support exact match on tmlo.archiefstatus, tmlo.archiefnominatie, etc.
- Support date range on tmlo.archiefactiedatum[from]/[to]
- Closes #1147, closes #1148
Mark spec status as implemented. All backend endpoints, frontend
components, and unit tests are complete. Integration tests deferred
to running Nextcloud environment.
- Add English strings: Register Objects, Unknown Object, View object
- Add/fix Dutch translations: Register Objecten, Onbekend object,
  Onbekend register, Onbekend schema, Object bekijken
- Fix existing untranslated Dutch strings for Unknown Register/Schema

Closes #1125
- TmloServiceTest: 18 tests covering populateDefaults, validateStatusTransition,
  validateFieldValues, calculateArchiefactiedatum, getSchemaDefaults, isTmloEnabled
- TmloExportTest: 7 tests covering generateMdtoXml, generateBatchMdtoXml,
  missing metadata error, XML escaping, batch skip logic
- ObjectEntityTmloTest: 7 tests covering tmlo getter defaults, set/get round-trip,
  getObjectArray, jsonSerialize, hydrate, null reset, full field set
- Closes #1149, closes #1150, closes #1151
20 test methods covering:
- getId, getTitle, getOrder, getSupportedSearchProviderIds, getIconUrl
- matchReference for hash-routed, API, direct URLs (with/without index.php)
- matchReference for non-matching URLs (different server, non-OR paths)
- resolveReference success with rich object data
- resolveReference returns null for object-not-found
- resolveReference returns null on authorization exception
- resolveReference returns null for non-matching URL
- getCachePrefix format (registerId/schemaId/uuid)
- getCachePrefix fallback for non-matching URL
- getCacheKey returns userId and empty string for anonymous
- parseReference extracts correct register/schema/uuid from API URL

Closes #1126
All automated tasks complete. Manual testing tasks remain.
GitHub issues: #1122-#1126, tracking: #1002
remko48 and others added 25 commits April 20, 2026 11:56
…er-accessor-removals-3

fix(nc34): replace removed \OC::$server named accessors with constructor DI + enforcement
…-compatibility-multischemas

fix(MagicMapper): CAST(col AS CHAR) for MariaDB in UNION queries
Fixed datepicker not sending the selected date and showing the date when editing
…ing-date-conversion

Fix empty-string date fields silently becoming "now" + document property-level RBAC
…ccess

Co-authored-by: Robert Zondervan <robert@conduction.nl>
…k state; drop _limit ceiling

Listing `/api/objects/{r}/{s}/{id}/files` was capped at _limit=100 and
returned HTTP 500 whenever a single file was NC-locked. Root cause: the
ownership probe in `FileValidationHandler::checkOwnership()` called
`$file->getContent()` for every file in the loop — an O(file-size) read
that also acquired a shared lock and threw `LockedException` on any
locked file.

Changes:
- `FileValidationHandler::checkOwnership()` uses `Node::isReadable()`
  (permission-bitmask check against oc_filecache, no byte read, no lock)
- `FileFormattingHandler::formatFiles()` wraps per-file formatting in a
  `try/catch LockedException`; locked files no longer crash the listing
- `FileFormattingHandler::formatFile()` appends `locked` / `lock`
  metadata only for authenticated callers (via ILockManager +
  IUserSession); anonymous callers get the pre-change envelope
- `_limit` upper ceiling removed: `max(1, (int)$limit)` (default 30,
  floor 1, no cap)
- Unit tests cover isReadable probe, lock envelope (authenticated /
  anonymous / provider-unavailable), LockedException resilience, and
  _limit boundaries
- Docs: `docs/Features/files.md` documents new fields, auth gate, and
  the removed ceiling

Refs #1295
…operand

fix: resolve $now in raw SQL RBAC conditions, unblocking date-based access
…les-listing-lock-and-limit

fix(files): drop _limit cap; survive NC-locked files; expose lock state (auth-gated)
@remko48 remko48 merged commit 1daf16e into beta Apr 22, 2026
21 of 25 checks passed
@remko48 remko48 deleted the development branch April 22, 2026 12:38
@remko48 remko48 restored the development branch April 22, 2026 12:38
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants