Skip to content

Release: merge development into beta#18

Open
github-actions[bot] wants to merge 1157 commits into
betafrom
development
Open

Release: merge development into beta#18
github-actions[bot] wants to merge 1157 commits into
betafrom
development

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

rubenvdlinde and others added 27 commits July 6, 2026 11:00
…e-7 no-admin-idor)

The /api/manifest endpoint is authenticated-user scoped (never takes an object
id; returns only the case types the current user may see, RBAC-filtered by
ObjectService). Return an explicit 401 for a null user instead of an empty 200
so the endpoint carries a recognised authorization guard.
…ging (VNG Logging Verwerkingen / AVG art. 30)

- catalogue lib/Settings/verwerkingsactiviteiten.json (7 zaakgericht-werken activities,
  AVG art. 6 rechtsgronden within OR vocabulary) + SeedVerwerkingsactiviteiten repair step
  (upsert-by-code as draft via OR VerwerkingsactiviteitMapper; FG-published status preserved)
- x-openregister-processing (logReads + attribution + subjectIdFields) on case/role/
  customerContact (monolith in-place) and contactmoment (fragment); schema versions bumped
- FG view src/views/admin/VerwerkingenOverview.vue + InzageExportModal (src/modals, ADR-004)
  wired via registry + manifest /verwerkingen + settings menu; EN keys extracted, NL added
- docs/admin/verwerkingenlogging.md: VNG API consumption via OR endpoints + known limitations
  (per-case-type attribution and ZGW client identity are OR-side gaps, recorded not filed)
- tests: PHPUnit SeedVerwerkingsactiviteitenTest (7) + OR stubs, vitest verwerkingenApi (5),
  Playwright avg-verwerkingenlogging.spec.ts (gate-19), reason-bearing @e2e excludes
- openspec: sync avg-verwerkingenlogging spec, archive 2026-07-06-avg-verwerkingenlogging
- info.xml 0.2.36 (cache-bust; new repair step registered)
Baseline png is captured by the visual lane's first --update-snapshots run
on a deployed instance (cannot be generated from the worktree).
Manifest fleet audit 2026-07-06, item 18: 15/22 manifest apps already wire
check:manifest locally; this adds the missing wiring. The validator and
vendored v2.11.0 schema were already in the repo — only the npm script
was missing.
…24, audit item 18)' (#165) from chore/add-check-manifest-script into development
…a aiCompanion prop' (#161) from feat/ai-companion-opt-in into development
…tion/display

- ADR-037 fragment lib/Settings/register.d/25-brp-kvk.json: brpPerson (Haal Centraal
  naming, format: bsn via OR's validator) + kvkCompany (KvK Zoeken naming); seeds are
  the OFFICIAL fixtures — 10 personen-mock personas (verbatim from test-data.json, all
  11-proef valid; non-11-proef mock personas excluded since OR would reject them) and
  10 KvK test companies fetched from api.kvk.nl/test incl pinned
  69599084/68750110/69599068/55344526; every row marked as fictitious test data
- case schema: additive optional initiatorType/initiatorSourceId/initiatorDisplayName
  (projection of semantic-case-intake's canonical requester reference; one write path
  via initiatorProjection()); version 1.3.0 -> 1.4.0
- UI: InitiatorPicker (Person/Company/Contact tabs; register-tier search via object
  store; contacts via core contactsmenu, graceful empty state) + InitiatorPickerModal
  (ADR-004, optional/skippable) wired into StartCaseWidget; InitiatorSection on
  CaseDetail overview via page slots (widget-initiator), deep-links source record to
  OR #/objects; EN keys extracted + NL translations
- tests: PHPUnit BrpKvkRegisterSetsTest (6/214), vitest initiatorSearch (7),
  Playwright brp-kvk-initiator.spec.ts (6 @e2e scenarios); register-side scenarios
  carry reason-bearing @e2e excludes
- openspec: sync brp-register/kvk-register/initiator-selection/initiator-display,
  archive 2026-07-06-brp-kvk-register-sets; info.xml 0.2.37
…behind config tiers

- IntegrationMode config-tier resolver (integration.<name>.mode; default log, fail-closed to
  no external call; unknown mode -> log). Application.php factory bindings replace hardcoded
  Log/Mock aliases for BRP, KvK, DigiD, eHerkenning
- HaalCentraalBrpAdapter (BRP Personen bevragen; mock=ghcr.io/brp-api/personen-mock offline,
  test=proefomgeving; X-API-KEY; BSN never logged; fail-soft) + KvkApiAdapter (KvK Zoeken;
  test=api.kvk.nl/test, documented public test key; fail-soft)
- SimulatorDigidSamlAdapter + SimulatorEHerkenningSamlAdapter (maykinmedia pattern, no real
  SAML, simulator-flagged assertions) via integration.digid.mode=simulator; capped at beta
- DSO config-ready seam: DsoLvAuthService::getBaseUrl() reads integration.dso.baseUrl
- offline contract lane BrpKvkContractTest against REAL recorded mock/test-API responses
  (tests/fixtures/contracts/, aligned with brp-kvk seeds) + IntegrationTierTest
- features.overlay: brp-integration/kvk-integration/digid-eherkenning -> beta with reasons,
  dso reason added; docs/admin/integrations.md (config tiers, key docs, access-request register)
- DEVIATIONS (out of session scope, recorded honestly, no stubs): formal aansluittrajecten
  (BRP proefomgeving key, DSO pre-prod + PKIoverheid cert, Logius DigiD preprod real SAML,
  NA e-Depot) blocked-pending-grant; e-Depot MDTO/Preservica deferred to migrate-archival-to-or
- openspec: sync external-integration-test-wiring spec, archive change; info.xml 0.2.38
…d (backs Pipelinq Bridge)

- case schema declares implements: [ns#Case] + a COMPLETE handoffContract binding validated
  field-by-field against the REAL OR HandoffKindContracts (mandatory title/summary/channel/
  source; optional requester/priority). DC02 correction: landed contract names provenance
  'source' (mandatory) -> bound to handoffSource, not the brief's 'provenance'
- new ADR-048 semantic-reference properties: requester (canonical; initiator* fields are its
  projection, one write path) + handoffSource (provenance back-link); ADR-011 titles
- declarative caseHandoffIntake notification (x-openregister-notifications, created + notIn
  filter on handoffSource) — no imperative dispatch
- Werkvoorraad handoff provenance badge + CaseDetail InitiatorSection handoff origin/received-at/
  source-link (OR URN resolver); EN keys extracted + NL translations
- README Pipelinq Bridge claim graduated from roadmap pointer to shipped
- tests: PHPUnit SemanticCaseIntakeTest (5/48, binding vs real contract), Playwright
  semantic-case-intake.spec.ts (2 @e2e UI scenarios); backend/cross-app scenarios carry
  reason-bearing @e2e excludes
- openspec: sync semantic-case-intake spec, archive change; case v1.5.0; info.xml 0.2.39
…atus (DC01-03 verified)

OR archival-transfer-hardening is PROPOSED only (0/15) on openregister origin/development; the
three OR-side deltas it must consume are absent (BagIt/durable-retry/proof-of-transfer — 0 hits
each). OR's BASE archival engine is present, but the config migration (T01/T02) cannot activate
without the retirement (T07/T08), which is gated on those deltas (would else double-process
retention / lose functionality OR cannot replace). No procest code changed; change left ACTIVE,
not archived — re-run when OR archival-transfer-hardening lands.
…header-sw-and-status-aggregation

# Conflicts:
#	appinfo/info.xml
#	lib/Controller/ManifestController.php
#	src/main.js
#	src/manifest.json
… object-table/chart config (ADR-049)

The manifest Dashboard page's 6 signal widgets and 2 charts no longer resolve
through the app component registry via a per-page `slots` map. They are now
declared inline on the page as library built-ins that CnDashboardPage resolves
from the shared dashboard-widget catalog:

- open/overdue/stalled cases + my tasks/task reminders/deadline alerts →
  built-in `object-table` widgets. Overdue/stalled/tasks/reminders/deadline
  carry `source.extend:["calculations"]` so the OpenRegister virtual calc
  columns (daysOverdue / daysSinceActivity / daysUntilDue / daysUntilDeadline)
  ride the fetch and render via the `conditionalPhrase` formatter. Server-side
  filters use the materialised booleans isFinalStatus/isTerminalStatus (=false =
  open) plus stored deadline/dueDate ranges; @me for the current user's tasks.
- cases-by-status / cases-by-type → built-in `chart` widgets with an aggregate
  { groupBy, metric:count, labelResolve } over open cases + a drilldown to the
  Cases index.
- DashboardHeaderActions custom component → declarative `config.headerActions[]`
  (New Case open-form + refresh); actionsComponent removed.
- audit-trail registry adapter (AuditTrailWidget) replaced by the library
  built-in CnAuditTrailWidget (identical detail-context resolution); the app
  override in main.js is dropped so the built-in resolves everywhere.

DUAL-BINDING PRESERVED: the 6 signal widgets are ALSO native OCA.Dashboard
entries (src/*Widget.js → src/views/widgets/*Widget.vue). Only their app-registry
entries are removed; the .vue components and native entry points stay UNCHANGED
for the native Nextcloud Dashboard (which has no manifest). The two chart wrappers
and the header-actions component were registry-only (not native) so their now-
orphaned files are removed.

kind:"widget" registry entries: 11 → 1 (only InitiatorSection, a case-detail
overview widget outside this dissolution, remains).
…red manifest schema to v2.15.0

The ADR-049 dashboard dissolution consumes W3 (Wave-3) library features:
object-table `source.extend`, chart aggregate+drilldown, and the open-form /
refresh header-action types. Bump @conduction/nextcloud-vue to ^1.0.0-beta.157
and refresh the vendored gate schema (tests/schemas/app-manifest-v2.schema.json)
to the authoritative v2.15.0 so `check:manifest` validates the new action types.

NOTE: beta.157 is not published to npm yet (publish stuck), so this bump is
install-deferred — the actual merge waits on the publish. The change was built
and verified against the Wave-3 source via the ../nextcloud-vue symlink
(USE_LOCAL_LIB=false webpack localLib alias); package-lock.json is intentionally
left untouched and will regenerate once beta.157 lands.
…ults on case schema (T01/T02)

Retention terms per zaaktype (VNG selectielijst 2020) and TMLO archival
defaults move from the app-local BewaarTermijnRegel data + trigger daemon
onto OpenRegister's declarative x-openregister-archival annotation and
Schema.configuration.tmloDefaults, consumed by OR RetentionEvaluator and
TmloService. Part of migrate-archival-to-or (ADR-022).
…to OR (T03/T04)

T03: BezwaarLegalHoldListener places an OpenRegister legal hold on a case
when an Awb objection is registered and releases it on the final
bezwaarDecision/appealDecision — hold storage + enforcement are OR's
(LegalHoldService), replacing ArchivalTriggerService's
opgeschort-juridische-procedure trigger status.

T04: OpenRegisterArchivalAdapter replaces the app-local MockArchivalAdapter;
beschikking archival is governed by OR's declarative x-openregister-archival
pipeline, with retention duration validated via OR TmloService.
Part of migrate-archival-to-or (ADR-022).
MigrateArchivalToOpenRegister (idempotent, fail-closed) enables TMLO on the
register, places OR legal holds for cases suspended for a running Awb
procedure, and exports completed proof-of-transfer records as zaakdossier
documents before the app-local schemas retire. Replaces the SeedArchiefEdepotData
repair step. Admin doc rewritten for the OR-owned pipeline (e-Depot config now
in OpenRegister settings). Part of migrate-archival-to-or (ADR-022).
… + UI (T07/T08/T09)

Removes procest's app-local archival pipeline now owned by OpenRegister
(migrate-archival-to-or, ADR-022):
- services: ArchivalTriggerService, ArchivalBatchService, BagItBundlerService,
  ArchivalSubmissionRetryService, ArchiefEdepotSeedDataService,
  ProofOfTransferService, RollbackManager, MetadataBundlerService
- External/Tmlo submission + TMLO-builder adapter seams (6 files)
- ArchiefController + archief#* routes; ArchiefDetectReady/RetrySubmissions
  commands; ArchivalJob/ArchivalTriggerScanJob/ArchivalSubmissionRetryJob;
  SeedArchiefEdepotData repair step
- 6 archief schemas (register.d/62-archief-edepot.json) + seed data
- Archief dashboard/settings Vue views + menu/manifest/AdminRoot wiring
- corresponding unit tests + newman collection

Beschikking archival keeps a pluggable interface bound to the OR-backed
adapter. Every route still resolves; no dangling references to removed
classes remain.
Reduce cyclomatic complexity in the legal-hold listener and repair step
(extract resolveCaseObject / placeHoldOnCase), guard setConfiguration, and
drop the unused ObjectUpdatedEvent path. Mark migrate-archival-to-or tasks
T01-T09 + V01-V05 done with an honest verification record.
Change implemented + verified; archief-edepot-handover main spec now declares
the OR-owned model (retention declared not executed, legal-hold suspension,
OR e-Depot pipeline), retiring the 22 app-local pipeline requirements.
…depot-handover

The archival pipeline is OR-owned (ADR-022); its scenarios have no procest-only
browser surface, so they carry a reason-bearing @e2e exclude. Main spec Purpose
rewritten to the declarative/legal-hold model.
rubenvdlinde and others added 18 commits July 16, 2026 18:57
…) from wip/archive-compliance-and-tenant-fixes into development
InitializeSettings called loadConfiguration(force: true). OpenRegister's app-level import
fast-skip is gated on $force === false, so forcing re-parsed the register descriptor +
register.d fragments and walked every register/schema on EVERY upgrade, even when nothing
changed. Measured on a sibling app (shillinq): the same trap cost 711s (~70% of the whole
repair); procest's descriptor cost ~39s.

Safe to drop: the version passed to OR is already content-addressed (+frag.<md5>), so a
content change re-imports; OpenRegister#426 additionally makes the gate content-aware; and
reconcileSchemaConfig()/reconcileSchemaDeclarativeConfig() run unconditionally, so schema
config keys are still provisioned when the import is a no-op.

Refs: openregister#426
Vue 3 migration prep for procest (ADR-066). Ran the compile sweep from
@conduction/nextcloud-vue over procest's 230 components under @vue/compat MODE 2.

Result: 229/230 clean on the first pass. The one failure was a REAL Vue 3
breakage, not cosmetic: DsoCaseDetail.vue had three sub-dialogs + a transition
form as loose children of <NcDialog> OUTSIDE its explicit <template #default>.
Vue 2 renders those; Vue 3 IGNORES children when a default slot is explicitly
declared — so on Vue 3 the Beschikking/Samenwerk/Doorstuur dialogs would silently
never render. Fixed by moving them inside #default (behaviour-preserving on Vue 2).

Re-sweep: 230/230 clean. Added scripts/vue3-compile-sweep.cjs + check:vue3-compile
so compile-readiness is a repeatable ratchet, matching the lib.

Note: compile-clean is not runtime-ready, and procest CANNOT build on Vue 3 until
@conduction/nextcloud-vue ships its Vue 3 major (the hard gate, ADR-066) — this
branch is preparation. procest's remaining own-code burn-down: 36 .sync, 8
.native, 3 filters (all mechanical).
…pRoot compat crash

Real per-app v9 churn (the 'churn the apps' step, live-verified on 8080):

Toolchain (webpack.config.js + package.json):
- vue 2.7 -> 3.5 + @vue/compat 3.5 (aliased vue$ -> @vue/compat)
- @nextcloud/vue 8 -> 9 (aliased @nextcloud/vue$ -> dist/index.mjs; v9 is
  ESM-only, exports './components/*' with no main/module)
- vue-loader 15 -> 17 with compilerOptions.compatConfig {MODE:2, COMPILER_FILTERS}
- @vue/compiler-sfc 3.5; dropped vue-template-compiler
- vue-demi-fix (pinia 2.3 + @vueuse still import set/del from vue-demi; the fix
  points vue-demi at its Vue-3 shim that defines set/del)

Source (26 files, all v9 API):
- 35 deep-import paths '@nextcloud/vue/dist/Components/X.js' -> '/components/X'
- 15 '{ t }' -> '{ translate as t }' from @nextcloud/l10n (v9 dropped the t alias)

Build result: 0 errors, 35 chunks (was 1153 -> 368 -> 20 -> 10 -> 0 across the
dep-alignment passes). Bundle confirmed Vue-3 (createApp + configureCompat).

LIVE on 8080 (bind-mounted procest, js/ hot-swapped, backend untouched):
- Vue-3 bundle BOOTS; NC shell + procest nav render.
- But CnAppRoot CRASHES at render: 'Cannot read properties of null (reading ce)'.
  Sourcemap -> @vue/compat renderSlot reads currentRenderingInstance.ce when the
  instance is NULL, triggered from CnAppRoot.vue:543 (<NcContent> root) slot
  handling. This is the openspec task 3.1/3.2 area (Vue.extend/_Ctor renderer
  workarounds + the 2700-line Options/Composition hybrid) — now with an exact repro.
- A/B PROOF it's a Vue-3 regression, not backend: the ORIGINAL Vue-2 bundle renders
  the full procest Dashboard on the SAME instance with 0 console errors (the
  /api/manifest 500 is pre-existing OR-drift: ObjectService::searchObjects() undefined,
  and Vue-2 procest tolerates it).

Recipe is reusable for the app churn; CnAppRoot fix (task 3.2) is the blocker to a
fully-rendering app on Vue 3.
…ive-verified 8080)

The compat straddle needs FIVE fixes beyond the build (all live-verified on 8080,
prod bundle, 0 console errors; vue-router 4 nav works):

1. DUAL @vue/compat -> pin vue$ to ONE absolute file (dist/vue.esm-bundler.js).
   The aliased lib worktree + procest each had their own @vue/compat, so a bare
   alias gave two copies => two currentRenderingInstance states => CnAppRoot
   rendered with a null instance (renderSlot/resolveComponent crash on every child).
2. DUAL vue-router -> pin vue-router$ absolute (lib worktree shipped a different
   MAJOR). RouterLink got a different router than app.use(router) => NcAppNavigationItem
   <router-link> v-slot {href} undefined.
3. configureCompat({ RENDER_FUNCTION: false }) GLOBALLY. Every render here is a
   compiled Vue-3 render; left on, compat wraps pure-v9 @nextcloud/vue renders in
   compatRender and drops scoped-slot props.
4. Entry point -> createApp + vue-router 4 (createRouter/createWebHistory, catch-all
   '/:pathMatch(.*)*'), pinia via app.use, t/n/$mapFormatters via
   app.config.globalProperties. App.vue Vue.observable -> reactive.
5. package.json vue-router ^3 -> ^4 (so --no-save installs stop reverting it).

Dashboard: heading, 4 stat tiles, BOTH apexcharts, 6 data tables, AI chat, tour —
all render; tour close + Cases nav click work. Remaining: Cases page needs
NcTextField :value -> :model-value (task 4.3 v-model).
…put pages

The one-line fix for v9 defineModel components under @vue/compat. MODE 2 defaults
COMPONENT_V_MODEL ON, rewriting v-model to the Vue-2 value/@input convention, so v9
components built with defineModel()/useModel (NcTextField -> NcInputField via
useModel(props,'modelValue')) never receive modelValue -> modelValue.value undefined
-> crash at value: modelValue.value.toString() on EVERY input page. Disabling it =
v-model uses the Vue-3 modelValue convention.

Live-verified on PROD bundle, 0 console errors: procest Cases INDEX page (search +
11 filters + data table + folder sidebar) fully renders AND the search box accepts
typing; Dashboard still clean. Corrects the earlier 'must remove @vue/compat'
conclusion — the migration STAYS on compat; compat removal returns to being the
eventual finale, not a prerequisite. Pairs with the lib task-4.3 v-model codemod
(nc-vue e784d7a6).
Same per-tag-scoped codemod as the lib (task 4.3): NcTextField/NcTextArea/NcSelect/
NcColorPicker/NcDateTimePicker :value->:model-value, @update:value/@input->
@update:model-value; NcCheckboxRadioSwitch :checked->:model-value. Ratchets:
0-collateral diff (68 files, 422 ins / 422 del, every line only a value/checked->
model-value flip) + webpack build clean. ⚠️ codemod reads/writes with newline='' to
PRESERVE line endings — procest .vue files are mixed CRLF/LF; a first text-mode run
normalized CRLF files to LF (whole-file diffs) and was reverted.

Live-verified on Vue 3 (dev + about to confirm prod), 0 console errors: Dashboard,
Cases index (search/filters/table w/ 10 rows), Settings, and the CREATE CASE FORM
DIALOG — 16 inputs (NcSelect comboboxes showing wired model values 'manual'/'normal',
NcTextField textboxes); typed into Title field and it bound correctly. Pairs with
COMPONENT_V_MODEL:false (main.js) + lib codemod (nc-vue e784d7a6).
Toward @vue/compat removal (matches the lib work): $set(o,k,v)->o[k]=v (15);
.sync->v-model — checked/value.sync->v-model= (34, v9 modelValue), named->v-model:prop
(2); .native removed (8). Pure-Vue-3 equivalents that also work under compat — procest
still builds+renders on compat (verified). REMAINING for full compat removal:
WorkflowBoard Vue.set (4) + ~9 dashboard-widget/settings entry points still use
Vue.extend/new View().$mount() (need createApp), then flip webpack vue$->vue +
drop vue-loader compatConfig + configureCompat.
…or procest)

- WorkflowBoard Vue.set (4) -> assignment; dropped import Vue.
- 7 dashboard-widget entries: Vue.extend(X)+new View({pinia,propsData}).$mount(el)
  -> createApp(X, props)+app.use(pinia)+globalProperties.t/n+app.mount(el); dropped
  Vue.use(PiniaVuePlugin)/Vue.mixin.
- settings.js + emailSettings.js: new Vue({render}).$mount -> createApp.
- webpack: vue$ -> real vue/dist/vue.runtime.esm-bundler.js (ONE absolute copy);
  REMOVED vue-loader compatConfig (MODE 2/COMPILER_FILTERS).
- main.js: removed configureCompat().

Live-verified on PURE Vue 3 (NO @vue/compat runtime or compiler), 0 console errors:
Dashboard, Cases index, Create Case form (16 inputs) + typed Title. v-model works
with no COMPONENT_V_MODEL compat because the bindings are genuine Vue-3 :model-value
(task 4.3). Builds 'compiled successfully'.
- global-setup: seed cn-walkthrough-seen:<appId> into storageState so the
  ADR-043 product tour (a full-viewport modal dim that intercepts pointer
  events) never blocks sidebar navigation on a fresh context.
- nav.ts navToRoute: Vue 3 dropped the per-element __vue__ instance; read the
  router from #content.__vue_app__.config.globalProperties.$router instead
  (the old __vue__ scan matched Nextcloud's OWN Vue-2 chrome, not procest's,
  so client-side pushes silently no-op'd under Vue 3).
- nav.ts GROUP_LEAF_ALIAS: drop the stale Cases->'All cases' alias; the shipped
  manifest renders 'Cases' as a flat navigating leaf, so the alias matched zero
  links and left navTo(page,'Cases') stranded on the Dashboard.
- cases-crud + deelzaak: assert the ASSIGNED zaaknummer (from the create
  response), not the supplied identifier — procest's case schema auto-numbers
  (x-openregister-processing) and ignores any supplied identifier, so the seed
  value never reaches the row/detail.
- complaints-bezwaar: reach the bezwaar list via a bare deep-link
  (/apps/procest/bezwaren) instead of navTo('Bezwaren') — the nav-dedup pass
  retired that sidebar entry (menu-layout.json removals) while keeping the page
  routable, so the label matched no link and stranded on the Dashboard.

Note: case-lifecycle still red on a pre-existing OR RBAC issue (admin denied
'read' on the Case schema via the internal objectService->find() path, though
the public list API allows it) — same root as the dashboard-widget 403s;
tracked separately, not a Vue-3 concern.
…tail sidebar

- case-lifecycle openBoard: the 'Workflow board' leaf was relocated UNDER the
  'Work queue' group (menu-layout.json relocations), so navTo('Workflow Board')
  matches no top-level link and strands on the Dashboard — reach it by a bare
  deep-link (/apps/procest/workflow-board).
- deelzaak Email-tab: the CaseDetail object sidebar (NcAppSidebar) is collapsed
  by default; click the 'Open sidebar' toggle before asserting the hosted tab
  strip mounts (it does not render while the aside is closed).
…r (procest#674)

CaseEmailTab.vue was imported + registered in registry.js but referenced by NO
manifest tab, so the email correspondence surface never rendered (the CaseDetail
sidebar shipped only audit/version-history/notes/sharing). Add the `email` tab to
`pages[CaseDetail].config.sidebar.tabs`. Live-verified on pure Vue 3: the tab
mounts CaseEmailTab (Email Communication / Compose Email / empty state).

Also park the complaints-bezwaar specs as test.describe.fixme tracked to
procest#675 — the Bezwaren page filters cases by a RETIRED bezwaar caseType
(b3c1a000-…-be2a, now _caseTypes_disabled), so it can't pass until the
unified-case complaint model is reconciled.
…243) from perf/drop-forced-register-import into development
…stance relaxes)

Previously the workflow specs only passed with the case schema's
x-openregister-archival and x-openregister-lifecycle stripped. Make them assert
procest's ACTUAL behaviour on the production schema:

- cases-crud 'delete a case' now asserts Archiefwet immutability — a user-driven
  delete of an archival case is a 403 ArchivalImmutableException and the record
  persists (removal is reserved for the retention-sweep cron). Adds
  tryDeleteObject() returning the response status.
- case-lifecycle 'advancing a case status' advances through the GUARDED
  transition engine (executeTransition t1 → POST /api/case/{id}/transition),
  not a direct case.status write the lifecycle guard rejects (422).

Green on the real schema with OpenRegister#2040 (initial-only lifecycle no longer
fail-closes every status change): 13 passed / 3 skipped / 0 failed on a live
NC-32 matched instance, archival+lifecycle intact.
… (Vue-3 lib)

Point procest at the promoted Vue-3 library (2.0.1 under the vue3 dist-tag) instead
of the Vue-2 ^1.0.0-beta.213, completing the migration at the dependency level.
Add apexcharts ^4.7.0 explicitly: it is a transitive dependency of the lib
(vue3-apexcharts → apexcharts), but declaring it guards against npm not hoisting
it. Verified: procest compiles cleanly against the published dist (0 errors), and
the lib's leaflet images now resolve (fixed in nextcloud-vue 2.0.1).
feat(vue3): migrate procest to Vue 3 (pure, @vue/compat removed) on @conduction/nextcloud-vue@2.0.1
Rewrote 46 Dutch `title` values across lib/Settings/procest_register.json
to English (complaint/complaintDisposition/hearing, bezwaar/beroep/
bacAdviceRequest, voorstel/parafeerroute/parafeeractie/paraferingAuditEntry,
plus caseType/documentType/decisionType/case/location) so manifest-driven
UI labels are English-authored and translatable via l10n. Property keys,
enum values, and descriptions are unchanged (verified: identical property
key sets and enum values vs. merge-base). Register info.version bumped
0.13.0 -> 0.13.1.

Added 39 new EN/NL l10n key pairs (l10n/en.json, l10n/nl.json, l10n/en.js,
l10n/nl.js) so Dutch users still see Dutch labels; 3 titles (Category,
Handler, Participants) already had matching l10n entries. appinfo/info.xml
bumped 0.3.3 -> 0.3.4; CHANGELOG.md updated.
i18n(schema): author procest property titles in English + NL l10n
…-label translation

2.0.6 (vue3 tag) carries the cnTranslate display-layer translation. procest's
schema property titles are English + EN/NL l10n (#679), so index/table labels
resolve per user language. js/ is gitignored (CI builds); local build verified
via direct webpack (procest's prebuild vue-demi-switch 2.7 sabotages npm run
build — a known procest toolchain quirk, not this bump). info.xml 0.3.4→0.3.5.
chore(deps): nc-vue 2.0.6 (vue3) — activate schema-label translation
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.

3 participants