@conduction/nextcloud-vue 2.147.0 → 2.149.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  2. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +24 -7
  3. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  6. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +12 -1
  7. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +2 -1
  9. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  10. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
  11. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js +23 -1
  12. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
  13. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js +1 -1
  14. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +34 -1
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +71 -8
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -2
  21. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
  24. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue.js +1 -1
  26. package/dist/esm/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue2.js.map +1 -1
  27. package/dist/esm/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue.js +1 -1
  29. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue2.js +64 -8
  30. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue3.js +14 -4
  32. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  34. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +32 -4
  35. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +10 -2
  37. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  39. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +84 -1
  40. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +61 -33
  42. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  43. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue.js +1 -1
  44. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +49 -2
  45. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  46. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +90 -59
  47. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue2.js +3 -1
  49. package/dist/esm/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue2.js.map +1 -1
  50. package/dist/esm/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue3.js.map +1 -1
  51. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  52. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js +10 -0
  53. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  54. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  55. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  56. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +11 -0
  57. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  58. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +28 -21
  59. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  60. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  61. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +8 -0
  62. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  65. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +1 -1
  66. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  67. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  69. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +3 -15
  70. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  71. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +123 -115
  72. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  73. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  74. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +4 -0
  75. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  76. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  77. package/dist/esm/components/CnStepper/CnStepper.vue.js +1 -1
  78. package/dist/esm/components/CnStepper/CnStepper.vue2.js.map +1 -1
  79. package/dist/esm/components/CnStepper/CnStepper.vue3.js.map +1 -1
  80. package/dist/esm/dialogs/CnAccessPurposeDialog.vue.js +1 -1
  81. package/dist/esm/dialogs/CnAccessPurposeDialog.vue2.js +3 -1
  82. package/dist/esm/dialogs/CnAccessPurposeDialog.vue2.js.map +1 -1
  83. package/dist/esm/dialogs/CnAccessPurposeDialog.vue3.js +26 -15
  84. package/dist/esm/dialogs/CnAccessPurposeDialog.vue3.js.map +1 -1
  85. package/dist/esm/l10n/en.json.js +3 -1
  86. package/dist/esm/l10n/en.json.js.map +1 -1
  87. package/dist/esm/l10n/nl.json.js +3 -1
  88. package/dist/esm/l10n/nl.json.js.map +1 -1
  89. package/dist/esm/library-style.js +1 -1
  90. package/dist/esm/nextcloud-vue.css +785 -518
  91. package/dist/esm/utils/builtInFormatters.js +53 -1
  92. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  93. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  94. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  95. package/dist/nextcloud-vue.cjs.js +2688 -2154
  96. package/dist/nextcloud-vue.cjs.js.map +2 -2
  97. package/dist/nextcloud-vue.css +785 -518
  98. package/l10n/en.json +3 -1
  99. package/l10n/nl.json +3 -1
  100. package/package.json +1 -1
  101. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +24 -7
  102. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +13 -1
  103. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +29 -2
  104. package/src/components/CnDataTable/CnDataTable.vue +34 -1
  105. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  106. package/src/components/CnDetailPage/CnDetailPage.vue +73 -10
  107. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +6 -1
  108. package/src/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue +1 -0
  109. package/src/components/CnDuplicateWarning/CnDuplicateWarning.vue +74 -10
  110. package/src/components/CnFactsWidget/CnFactsWidget.vue +41 -4
  111. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +131 -3
  112. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +103 -5
  113. package/src/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue +3 -1
  114. package/src/components/CnNotesCard/CnNotesCard.vue +10 -0
  115. package/src/components/CnObjectCard/CnObjectCard.vue +16 -0
  116. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
  117. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +8 -0
  118. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +1 -1
  119. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +19 -19
  120. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +4 -0
  121. package/src/components/CnStepper/CnStepper.vue +10 -2
  122. package/src/css/dialog.css +22 -2
  123. package/src/css/look-board-detail.css +52 -3
  124. package/src/css/look-board-index.css +51 -1
  125. package/src/css/look-board.css +48 -5
  126. package/src/css/table.css +5 -2
  127. package/src/dialogs/CnAccessPurposeDialog.vue +27 -12
  128. package/src/schemas/app-manifest-v2.schema.json +4 -2
  129. package/src/utils/builtInFormatters.js +52 -0
  130. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CnObjectDataWidget.vue2.js","sources":["../../../../src/components/CnObjectDataWidget/CnObjectDataWidget.vue"],"sourcesContent":["<!--\n CnObjectDataWidget — Schema-driven editable data grid widget.\n\n Displays object properties in a CSS grid layout, auto-generated from a JSON Schema.\n Each cell shows a formatted value. Clicking an editable cell opens an inline editor\n matching the property type (text, select, date, checkbox, textarea, etc.).\n When any value is changed, a Save button appears in the widget header.\n\n Supports per-property overrides for order, grid span, visibility, editability, and widget type.\n-->\n<template>\n\t<CnWidgetWrapper\n\t\t:title=\"title\"\n\t\t:showTitle=\"showTitle\"\n\t\t:showActions=\"showActions\"\n\t\t:borderless=\"borderless\"\n\t\t:flush=\"flush\"\n\t\t:chromeless=\"chromeless\"\n\t\t:widgetId=\"widgetId || objectType\"\n\t\t:documentationUrl=\"documentationUrl\"\n\t\t:titleIconPosition=\"(iconComponent || iconName) ? 'left' : 'right'\">\n\t\t<template v-if=\"iconName\" #title-icon>\n\t\t\t<CnIcon :name=\"iconName\" :size=\"20\" />\n\t\t</template>\n\t\t<template v-else-if=\"iconComponent\" #title-icon>\n\t\t\t<component :is=\"iconComponent\" :size=\"20\" />\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"isDirty\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"saving\"\n\t\t\t\t@click=\"save\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"saving\" :size=\"20\" />\n\t\t\t\t\t<ContentSaveOutline v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saveLabel }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"isDirty\"\n\t\t\t\t@click=\"discard\">\n\t\t\t\t{{ discardLabel }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\t\t<!-- Object-specific item appended after the built-in\n\t\t Refresh / Documentation / Request-a-feature trio. -->\n\t\t<template #action-items>\n\t\t\t<NcActionButton\n\t\t\t\tv-if=\"editable\"\n\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t@click=\"editModalOpen = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Pencil :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ editLabel }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionButton\n\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t@click=\"metadataModalOpen = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<InformationOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ metadataLabel }}\n\t\t\t</NcActionButton>\n\t\t</template>\n\n\t\t<!-- Empty state -->\n\t\t<div v-if=\"!resolvedFields.length\" class=\"cn-object-data-widget__empty\">\n\t\t\t{{ emptyLabel }}\n\t\t</div>\n\n\t\t<!-- Collapsed, the grid shows the fields that fit the cell (or the\n\t\t first `collapsedFields`); \"Show all N fields\" renders the rest. -->\n\t\t<div v-else class=\"cn-object-data-widget__grid-wrap\">\n\t\t\t<div ref=\"grid\" class=\"cn-object-data-widget__grid\" :style=\"gridStyle\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"field in visibleFields\"\n\t\t\t\t\t:key=\"field.key\"\n\t\t\t\t\tclass=\"cn-object-data-widget__cell\"\n\t\t\t\t\t:style=\"cellStyle(field)\">\n\t\t\t\t\t<!-- Label -->\n\t\t\t\t\t<div class=\"cn-object-data-widget__label\">\n\t\t\t\t\t\t{{ field.label }}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Editing mode for this field -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"editingField === field.key\"\n\t\t\t\t\t\tclass=\"cn-object-data-widget__editor\">\n\t\t\t\t\t\t<!-- Per-field slot override -->\n\t\t\t\t\t\t<slot\n\t\t\t\t\t\t\tv-if=\"$slots['field-' + field.key]\"\n\t\t\t\t\t\t\t:name=\"'field-' + field.key\"\n\t\t\t\t\t\t\t:field=\"field\"\n\t\t\t\t\t\t\t:value=\"editData[field.key]\"\n\t\t\t\t\t\t\t:update=\"(val) => updateField(field.key, val)\"\n\t\t\t\t\t\t\t:cancel=\"cancelEdit\" />\n\n\t\t\t\t\t\t<!-- Auto-generated editor -->\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t<!-- Text / Email / URL -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-if=\"field.widget === 'text' || field.widget === 'email' || field.widget === 'url'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] != null ? String(editData[field.key]) : ''\"\n\t\t\t\t\t\t\t\t:type=\"field.widget === 'email' ? 'email' : field.widget === 'url' ? 'url' : 'text'\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Number -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] != null ? String(editData[field.key]) : ''\"\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val !== '' ? Number(val) : null)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Textarea -->\n\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__textarea\"\n\t\t\t\t\t\t\t\t:value=\"editData[field.key] || ''\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\trows=\"4\"\n\t\t\t\t\t\t\t\t@input=\"updateField(field.key, $event.target.value)\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Relation ($ref / x-openregister-relation): pick the\n\t\t\t\t\t\t referenced object by NAME — the raw uuid is never a\n\t\t\t\t\t\t user-facing value (ADR-062). Options load from the\n\t\t\t\t\t\t target schema on edit start. Array relations keep\n\t\t\t\t\t\t their generic editor for now. -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"isSingleRelationField(field.key)\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:options=\"relationOptions[field.key] || []\"\n\t\t\t\t\t\t\t\t:modelValue=\"relationSelectedOption(field)\"\n\t\t\t\t\t\t\t\t:loading=\"relationOptionsLoading\"\n\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onRelationChange(field, $event)\"\n\t\t\t\t\t\t\t\t@close=\"commitEdit\" />\n\n\t\t\t\t\t\t\t<!-- Nextcloud group or user (`referenceType: nextcloud-group`\n\t\t\t\t\t\t / `nextcloud-user`, one or a list): pick by display name,\n\t\t\t\t\t\t store the group id or uid. The same search the create and\n\t\t\t\t\t\t edit dialogs use. -->\n\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t:is=\"isUserPicker(field) ? 'NcSelectUsers' : 'NcSelect'\"\n\t\t\t\t\t\t\t\tv-else-if=\"isPersonPicker(field)\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:inputLabel=\"field.label\"\n\t\t\t\t\t\t\t\t:labelOutside=\"true\"\n\t\t\t\t\t\t\t\t:options=\"personOptions[field.key] || []\"\n\t\t\t\t\t\t\t\t:modelValue=\"personSelected(field)\"\n\t\t\t\t\t\t\t\t:multiple=\"isPersonMultiple(field)\"\n\t\t\t\t\t\t\t\t:keepOpen=\"isPersonMultiple(field)\"\n\t\t\t\t\t\t\t\t:loading=\"personLoading === field.key\"\n\t\t\t\t\t\t\t\t:filterable=\"false\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t@search=\"(q) => searchPeople(field, q)\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onPersonChange(field, $event)\"\n\t\t\t\t\t\t\t\t@close=\"isPersonMultiple(field) ? undefined : commitEdit()\" />\n\n\t\t\t\t\t\t\t<!-- Select -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'select'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:options=\"getSelectOptions(field)\"\n\t\t\t\t\t\t\t\t:modelValue=\"getSelectedOption(field)\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onSelectChange(field, $event)\"\n\t\t\t\t\t\t\t\t@close=\"commitEdit\" />\n\n\t\t\t\t\t\t\t<!-- Multiselect -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'multiselect'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:options=\"getMultiselectOptions(field)\"\n\t\t\t\t\t\t\t\t:modelValue=\"getSelectedMultiselectOptions(field)\"\n\t\t\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t\t\t:keepOpen=\"true\"\n\t\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onMultiselectChange(field, $event)\" />\n\n\t\t\t\t\t\t\t<!-- Tags -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'tags'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] || []\"\n\t\t\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t\t\t:keepOpen=\"true\"\n\t\t\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\" />\n\n\t\t\t\t\t\t\t<!-- Checkbox / Switch -->\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t\t\t\t:modelValue=\"!!editData[field.key]\"\n\t\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => { updateField(field.key, val); commitEdit() }\">\n\t\t\t\t\t\t\t\t{{ editData[field.key] ? 'Yes' : 'No' }}\n\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t\t\t\t<!-- Date -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'date'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] || ''\"\n\t\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Datetime -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'datetime'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] || ''\"\n\t\t\t\t\t\t\t\ttype=\"datetime-local\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Fallback: text -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] != null ? String(editData[field.key]) : ''\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t<!-- Confirm/Cancel for non-auto-committing editors -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.widget !== 'checkbox'\"\n\t\t\t\t\t\t\tclass=\"cn-object-data-widget__editor-actions\">\n\t\t\t\t\t\t\t<NcButton variant=\"tertiary-no-background\" @click=\"commitEdit\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Check :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton variant=\"tertiary-no-background\" @click=\"cancelEdit\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Display mode -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tclass=\"cn-object-data-widget__value\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'cn-object-data-widget__value--editable': isEditable(field),\n\t\t\t\t\t\t\t'cn-object-data-widget__value--empty': isValueEmpty(field.key),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:tabindex=\"isEditable(field) ? 0 : -1\"\n\t\t\t\t\t\t:role=\"isEditable(field) ? 'button' : undefined\"\n\t\t\t\t\t\t:aria-label=\"isEditable(field) ? t('nextcloud-vue', 'Edit {title}', { title: field.label }) : undefined\"\n\t\t\t\t\t\t@click=\"isEditable(field) && startEdit(field)\"\n\t\t\t\t\t\t@keydown.enter=\"isEditable(field) && startEdit(field)\">\n\t\t\t\t\t\t<!-- Per-field display slot override -->\n\t\t\t\t\t\t<slot\n\t\t\t\t\t\t\tv-if=\"$slots['display-' + field.key]\"\n\t\t\t\t\t\t\t:name=\"'display-' + field.key\"\n\t\t\t\t\t\t\t:field=\"field\"\n\t\t\t\t\t\t\t:value=\"displayValues[field.key]\"\n\t\t\t\t\t\t\t:raw=\"(objectData || {})[field.key]\" />\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t<!-- A Nextcloud group (or list): its display name, cached\n\t\t\t\t\t\t\t per id; the id while the name loads or when unknown. -->\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"isGroupPicker(field) && groupIdsOf(field).length\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__groups\">\n\t\t\t\t\t\t\t\t<template v-for=\"(gid, gi) in groupIdsOf(field)\" :key=\"gid\">\n\t\t\t\t\t\t\t\t\t<span v-if=\"gi > 0\">, </span>\n\t\t\t\t\t\t\t\t\t<CnGroupNameCell :gid=\"gid\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<!-- A Nextcloud user (or list): the display name, the\n\t\t\t\t\t\t\t uid while it loads or when it cannot be found. -->\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-else-if=\"isUserPicker(field) && userIdsOf(field).length\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__users\"\n\t\t\t\t\t\t\t\t:title=\"userIdsOf(field).join(', ')\">\n\t\t\t\t\t\t\t\t{{ userIdsOf(field).map((uid) => personLabel(field, uid)).join(', ') }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<img v-else-if=\"isImageField(field) && rawOf(field)\"\n\t\t\t\t\t\t\t\t:src=\"rawOf(field)\"\n\t\t\t\t\t\t\t\t:alt=\"field.label\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__image\">\n\t\t\t\t\t\t\t<!-- Relation name still resolving: a quiet skeleton bar,\n\t\t\t\t\t\t never a raw uuid or a bare '…' (ADR-062). -->\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-else-if=\"isRelationPending(field)\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__skeleton\"\n\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Loading')\" />\n\t\t\t\t\t\t\t<!-- Array of OBJECTS → compact inline table (union of the\n\t\t\t\t\t\t first rows' keys, capped at 5 columns / 5 rows) so a\n\t\t\t\t\t\t structured value renders legibly instead of\n\t\t\t\t\t\t \"[object Object]\" (ADR-062). -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-else-if=\"fieldValueKind(field) === 'object-array'\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__mini-table-wrap\">\n\t\t\t\t\t\t\t\t<table class=\"cn-object-data-widget__mini-table\">\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th v-for=\"col in objectArrayColumns(rawOf(field))\" :key=\"col\">\n\t\t\t\t\t\t\t\t\t\t\t\t{{ col }}\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t<tr v-for=\"(row, ri) in objectArrayRows(rawOf(field))\" :key=\"ri\">\n\t\t\t\t\t\t\t\t\t\t\t<td v-for=\"col in objectArrayColumns(rawOf(field))\" :key=\"col\">\n\t\t\t\t\t\t\t\t\t\t\t\t{{ stringifyCell(row && row[col]) }}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t<div v-if=\"rawOf(field).length > 5\" class=\"cn-object-data-widget__more\">\n\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', '{count} more', { count: rawOf(field).length - 5 }) }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<!-- Array of SCALARS → comma-separated chips. -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-else-if=\"fieldValueKind(field) === 'scalar-array'\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__chips\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-for=\"(v, ci) in rawOf(field)\"\n\t\t\t\t\t\t\t\t\t:key=\"ci\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__chip\">\n\t\t\t\t\t\t\t\t\t{{ stringifyCell(v) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<!-- Single plain OBJECT → key: value definition list; a\n\t\t\t\t\t\t\t nested plain object (e.g. a per-language map) gets\n\t\t\t\t\t\t\t its own list one level down. -->\n\t\t\t\t\t\t\t<dl\n\t\t\t\t\t\t\t\tv-else-if=\"fieldValueKind(field) === 'object'\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__deflist\">\n\t\t\t\t\t\t\t\t<template v-for=\"(pair, pi) in objectEntries(rawOf(field))\" :key=\"pi\">\n\t\t\t\t\t\t\t\t\t<dt>\n\t\t\t\t\t\t\t\t\t\t{{ nestedLabel(field, [pair[0]]) }}\n\t\t\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t\t\t<dd>\n\t\t\t\t\t\t\t\t\t\t<dl\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"isPlainObject(pair[1])\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__deflist cn-object-data-widget__deflist--nested\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-for=\"(sub, si) in objectEntries(pair[1])\" :key=\"si\">\n\t\t\t\t\t\t\t\t\t\t\t\t<dt>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{ nestedLabel(field, [pair[0], sub[0]]) }}\n\t\t\t\t\t\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t\t\t\t\t\t<dd>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"cn-object-data-widget__deflist-text\">{{ stringifyNested(sub[1]) }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t\t\t\t<span v-else class=\"cn-object-data-widget__deflist-text\">{{ stringifyNested(pair[1]) }}</span>\n\t\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ displayValues[field.key] }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<Pencil\n\t\t\t\t\t\t\tv-if=\"isEditable(field)\"\n\t\t\t\t\t\t\tclass=\"cn-object-data-widget__edit-icon\"\n\t\t\t\t\t\t\t:size=\"14\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"hasHiddenFields\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\twide\n\t\t\t\tclass=\"cn-object-data-widget__toggle\"\n\t\t\t\t:aria-expanded=\"expanded ? 'true' : 'false'\"\n\t\t\t\t@click=\"toggleExpanded\">\n\t\t\t\t{{ expanded ? collapseFieldsLabel : showAllFieldsLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<p v-if=\"footnote\" class=\"cn-object-data-widget__footnote\" data-testid=\"cn-object-data-widget-footnote\">\n\t\t\t{{ cnTranslate(footnote) }}\n\t\t</p>\n\n\t\t<!-- Read-only @self metadata, surfaced on demand from the\n\t\t Metadata action item rather than as a permanent page widget. -->\n\t\t<CnObjectMetadataModal\n\t\t\tv-if=\"metadataModalOpen\"\n\t\t\t:objectData=\"objectData\"\n\t\t\t@close=\"metadataModalOpen = false\" />\n\n\t\t<!-- Full-form edit (alongside the per-field inline editing) — schema-driven\n\t\t dialog pre-filled with the current object; saves via the same path. -->\n\t\t<CnFormDialog\n\t\t\tv-if=\"editModalOpen\"\n\t\t\t:schema=\"schema\"\n\t\t\t:item=\"objectData\"\n\t\t\t:dialogTitle=\"editLabel\"\n\t\t\t:overrides=\"resolvedOverrides\"\n\t\t\t:excludeFields=\"exclude\"\n\t\t\t:includeFields=\"include\"\n\t\t\t:size=\"formSize\"\n\t\t\t:columns=\"formColumns\"\n\t\t\t@confirm=\"onEditConfirm\"\n\t\t\t@close=\"editModalOpen = false\" />\n\t</CnWidgetWrapper>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcActionButton, NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcSelect, NcSelectUsers, NcTextField } from '@nextcloud/vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentSaveOutline from 'vue-material-design-icons/ContentSaveOutline.vue'\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport CnGroupNameCell from '../CnCellRenderer/CnGroupNameCell.vue'\nimport CnFormDialog from '../CnFormDialog/CnFormDialog.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { useObjectStore } from '../../store/index.js'\nimport { foldDottedFields, isDottedKey, spreadDottedFields } from '../../utils/dottedFields.js'\nimport { groupDisplayName, loadGroupDisplayName, searchNextcloudGroups } from '../../utils/groupAutocomplete.js'\nimport { humaniseKey } from '../../utils/humaniseKey.js'\nimport { PANEL_ACTION_SINK } from '../../utils/panelActions.js'\nimport { resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\nimport { saveEdited } from '../../utils/saveEdited.js'\nimport { fieldsFromSchema, formatValue } from '../../utils/schema.js'\nimport { schemaRefSlug } from '../../utils/schemaRefSlug.js'\nimport { resolveNextcloudUser, searchNextcloudUsers } from '../../utils/userAutocomplete.js'\nimport { evaluateVisibleWhenLocal, isLocallyDecidableVisibleWhen } from '../../utils/visibleWhen.js'\nimport { CnIcon } from '../CnIcon/index.js'\nimport { CnObjectMetadataModal } from '../CnObjectMetadataModal/index.js'\nimport { CnWidgetWrapper } from '../CnWidgetWrapper/index.js'\n\n// Widgets whose value the inline text fallback would corrupt.\nconst STRUCTURED_WIDGETS = ['json', 'code', 'file', 'sub-objects', 'child-records']\n\n/**\n * CnObjectDataWidget — Schema-driven editable data grid widget.\n *\n * Renders object properties in a configurable CSS grid. Each property is displayed\n * as a label-value cell. Editable cells can be clicked to switch to inline editing.\n * Uses the objectStore to persist changes.\n *\n * Basic usage\n * ```vue\n * <CnObjectDataWidget\n * title=\"Character Info\"\n * :schema=\"schema\"\n * :object-data=\"character\"\n * object-type=\"characters\"\n * :overrides=\"{\n * name: { order: 1, gridColumn: 2 },\n * description: { order: 2, gridColumn: 3, gridRow: 2 },\n * status: { order: 3 },\n * internalId: { hidden: true },\n * }\" />\n * ```\n *\n * Read-only mode\n * ```vue\n * <CnObjectDataWidget\n * title=\"Summary\"\n * :schema=\"schema\"\n * :object-data=\"item\"\n * :editable=\"false\" />\n * ```\n */\nexport default {\n\tname: 'CnObjectDataWidget',\n\n\tcomponents: {\n\t\tCnIcon,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t\tNcSelect,\n\t\tNcSelectUsers,\n\t\tCnGroupNameCell,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcActionButton,\n\t\tCnWidgetWrapper,\n\t\tCnObjectMetadataModal,\n\t\tCnFormDialog,\n\t\tContentSaveOutline,\n\t\tInformationOutline,\n\t\tPencil,\n\t\tCheck,\n\t\tClose,\n\t},\n\n\tinject: {\n\t\t/** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/**\n\t\t * Detail-page object context (`{ objectId, register, schema }`) provided\n\t\t * by CnDetailPage. Supplies the register that bare-slug `$ref` relation\n\t\t * properties resolve against (an OpenRegister `$ref: \"caseType\"` means\n\t\t * \"schema caseType in the SAME register\"). Null on other surfaces —\n\t\t * bare-slug refs then stay unresolved (shortened id fallback).\n\t\t */\n\t\tcnObjectContext: { default: null },\n\t\t/**\n\t\t * Consumer translation function, provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). Field\n\t\t * labels/descriptions come from schema property titles, authored in\n\t\t * English as the canonical source; the visible label is resolved\n\t\t * through this function so it follows the user's language. Defaults to\n\t\t * identity when used standalone (no CnAppRoot ancestor).\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/**\n\t\t * Formatter registry, provided by CnAppRoot (`cnFormatters`: the\n\t\t * library's built-ins plus the app's `formatters`). A field override\n\t\t * `{ formatter: '<id>' }` renders the value through the same function a\n\t\t * table column with that `formatter` uses. Empty when used standalone.\n\t\t */\n\t\tcnFormatters: { default: () => ({}) },\n\t\t/**\n\t\t * The host surface's panel-action channel, when this widget is rendered\n\t\t * in a tab panel. Null everywhere else, which is every other surface.\n\t\t *\n\t\t * A panel draws no header, so the items this widget would put in its own\n\t\t * overflow menu have nowhere to go. Publishing them here puts them in\n\t\t * the strip's menu instead; see utils/panelActions.js.\n\t\t */\n\t\tpanelActionSink: { from: PANEL_ACTION_SINK, default: null },\n\t},\n\n\tprops: {\n\t\t/** Widget title shown in the widget header. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Data'),\n\t\t},\n\n\t\t/**\n\t\t * Draw the header's title row.\n\t\t *\n\t\t * Set false inside a tab panel, where the open tab already names the\n\t\t * panel. The header itself still renders whenever there are actions, so\n\t\t * the Save button an inline edit needs does not vanish with the title —\n\t\t * that is the whole reason this is separate from the actions.\n\t\t *\n\t\t * It exists because `title` carries a DEFAULT of \"Data\". A host that\n\t\t * wanted no title passed `undefined` and got the default instead, which\n\t\t * is how a tab panel ended up with a \"Data\" heading nobody chose.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tshowTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Show the overflow Actions menu in the header.\n\t\t *\n\t\t * Worth switching off where a host already offers one within a few\n\t\t * pixels. A tab panel is that case: the tab strip carries its own Actions\n\t\t * menu, so a second copy inside the panel bought a header band to hold\n\t\t * it and nothing else.\n\t\t *\n\t\t * Switching it off costs the widget nothing, because the two items it\n\t\t * holds travel instead of vanishing. Metadata and the full edit dialog are\n\t\t * published to the host surface and render in its menu, each still opening\n\t\t * THIS widget's dialog with this widget's `overrides`, `include` and\n\t\t * `exclude` applied. That scoping is the reason they are published rather\n\t\t * than left to the page: a detail page does carry its own record Edit, but\n\t\t * it opens the form the page configures, not the subset declared here. See\n\t\t * utils/panelActions.js. Inline editing never used the menu at all: a cell\n\t\t * opens its editor when clicked, and Save and Discard appear in the\n\t\t * `actions` slot from the moment there is an edit to commit.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tshowActions: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Drop the card border and background, for a host that draws its own.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tborderless: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Drop the content padding, for a host that supplies its own inset.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tflush: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Draw no card at all: no border, no background, no content padding,\n\t\t * no title row, no header divider. What a tab panel wants, in one word\n\t\t * instead of three, and the word `CnDetailWidgetHost` already uses for\n\t\t * this on its integration path.\n\t\t *\n\t\t * It had to become a real prop. Until it was one, a `chromeless` passed\n\t\t * here fell into `$attrs`, landed on the wrapper's root element as a\n\t\t * plain HTML attribute, and changed nothing — a caller asking for the\n\t\t * documented thing got a silent no-op with an attribute in the DOM to\n\t\t * suggest it had worked.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tchromeless: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Optional MDI icon component for the header. */\n\t\ticon: {\n\t\t\ttype: [Object, Function, String],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Documentation link surfaced in the widget's overflow Actions\n\t\t * menu. Empty (the default) hides the Documentation item; the\n\t\t * Refresh and Request-a-feature items always render.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Stable id forwarded to the widget chrome for the Refresh /\n\t\t * Request-a-feature payloads. Falls back to `objectType`, then to a\n\t\t * slugified title.\n\t\t */\n\t\twidgetId: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The JSON Schema describing the object's properties.\n\t\t * Must have a `properties` field.\n\t\t * Optional: null renders the empty state (no fields) — e.g. while the\n\t\t * schema is still being fetched on surfaces that mount before it loads\n\t\t * (a `data` tab in CnObjectSidebar).\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The object data to display and edit.\n\t\t * Keys should match the schema property keys.\n\t\t * Optional: null while the object is still loading; all internal reads\n\t\t * guard with `this.objectData || {}`.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The registered object type slug in the objectStore.\n\t\t * Required for saving via objectStore.saveObject().\n\t\t */\n\t\tobjectType: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Optional objectStore instance. When provided, used directly for saving.\n\t\t * When not provided, falls back to auto-detecting the store via Pinia.\n\t\t */\n\t\tstore: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Per-property configuration overrides.\n\t\t * Keys are property names, values are override objects.\n\t\t *\n\t\t * Supported overrides:\n\t\t * - `order` (number) — Display order (lower = first)\n\t\t * - `gridColumn` (number) — Number of grid columns to span (default 1)\n\t\t * - `gridRow` (number) — Number of grid rows to span (default 1)\n\t\t * - `hidden` (boolean) — Hide this property\n\t\t * - `editable` (boolean) — Override editability (default: based on schema readOnly)\n\t\t * - `label` (string) — Override the display label\n\t\t * - `emptyValue` (string) — Words shown, translated, for an empty or false value instead of a dash\n\t\t * - `widget` (string) — Override the widget type for editing\n\t\t * - `formatter` (string) — Display the value through the formatter\n\t\t * registered under this id on CnAppRoot (`cnFormatters`), called as\n\t\t * `(value, object, property)` like a table cell's formatter. An id\n\t\t * nobody registered, or a formatter that throws, keeps the default\n\t\t * rendering. Editing still writes the stored value.\n\t\t *\n\t\t * Accepts an Array too: an empty overrides map (`{}`) round-trips through\n\t\t * PHP/JSON as an empty Array (`[]`), so a persisted manifest can deliver\n\t\t * `[]`. `resolvedOverrides` coerces that back to `{}`.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\toverrides: {\n\t\t\ttype: [Object, Array],\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * Number of grid columns. The board look fits 200px columns instead,\n\t\t * except for one column, which it keeps.\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Number,\n\t\t\tdefault: 3,\n\t\t},\n\n\t\t/**\n\t\t * Number of fields shown while collapsed. `null` fits the cell: the\n\t\t * whole rows that fit stay, and only an overflowing cell gets the\n\t\t * \"Show all N fields\" button.\n\t\t */\n\t\tcollapsedFields: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether editing is enabled globally.\n\t\t * When false, no fields are editable regardless of per-field settings.\n\t\t */\n\t\teditable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Hide fields that have no value, instead of rendering them with an em dash.\n\t\t *\n\t\t * Use this for a schema whose properties are only relevant to a subset of its\n\t\t * objects — a discriminated supertype, say, where a `complaint` never carries\n\t\t * the telephony fields a `contactmoment` does. The read grid then shows only\n\t\t * what the object actually has, without the schema having to declare which\n\t\t * fields belong to which variant.\n\t\t *\n\t\t * Only affects the read grid: a field being edited, a field with an unsaved\n\t\t * change, and the full edit form all stay visible, so an empty field is always\n\t\t * still reachable to fill in.\n\t\t */\n\t\thideEmpty: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Properties to exclude from display.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\texclude: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Properties to include (whitelist mode). If provided, only these are shown.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tinclude: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => null,\n\t\t},\n\n\t\t/**\n\t\t * NcDialog size for the edit form dialog. This widget already scopes\n\t\t * the form with `include` / `exclude`, but a scoped form can still be\n\t\t * long enough to want the room.\n\t\t */\n\t\tformSize: {\n\t\t\ttype: String,\n\t\t\tdefault: 'normal',\n\t\t},\n\n\t\t/**\n\t\t * How many columns the edit form flows its fields into. Pair `2` with\n\t\t * `formSize: 'large'`, or the two columns are merely two narrow ones.\n\t\t */\n\t\tformColumns: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t\tvalidator: (value) => value === 1 || value === 2,\n\t\t},\n\n\t\t/** Label for the save button */\n\t\tsaveLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Save'),\n\t\t},\n\n\t\t/** Label for the discard button */\n\t\tdiscardLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Discard'),\n\t\t},\n\n\t\t/** Label shown when no properties to display */\n\t\temptyLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No data available'),\n\t\t},\n\n\t\t/**\n\t\t * A muted line under the fields, through the host translate\n\t\t * (DqZaakContact \"Ontvangstbevestiging\").\n\t\t *\n\t\t * @spec openspec/changes/data-widget-footnote/specs/data-widget-footnote/spec.md#requirement-a-data-card-can-end-with-a-footnote\n\t\t */\n\t\tfootnote: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Metadata item in the overflow Actions menu. */\n\t\tmetadataLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Metadata'),\n\t\t},\n\n\t\t/** Label for the Edit action item (opens the full-form edit dialog). */\n\t\teditLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Edit'),\n\t\t},\n\t},\n\n\temits: ['discard', 'save', 'save-error', 'saved'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Whether the read-only metadata modal is open. */\n\t\t\tmetadataModalOpen: false,\n\t\t\t/** Whether the full-form edit dialog is open. */\n\t\t\teditModalOpen: false,\n\t\t\t/** Currently editing field key, or null */\n\t\t\teditingField: null,\n\t\t\t/** Working copy of changed field values */\n\t\t\teditData: {},\n\t\t\t/** Set of field keys that have been modified */\n\t\t\tdirtyFields: {},\n\t\t\t/** Whether a save is in progress */\n\t\t\tsaving: false,\n\t\t\t/** Resolved display labels for related-object fields, keyed by field key */\n\t\t\trelatedLabels: {},\n\t\t\t/** Name-labeled picker options per relation field key ({ id, label }[]). */\n\t\t\trelationOptions: {},\n\t\t\t/** Whether relation picker options are being fetched. */\n\t\t\trelationOptionsLoading: false,\n\t\t\t/** Group and user picker options per field key ({ id, label }[]). */\n\t\t\tpersonOptions: {},\n\t\t\t/** Key of the group or user field whose options are loading, or null. */\n\t\t\tpersonLoading: null,\n\t\t\t/** Display names of users seen in a user picker, by uid. */\n\t\t\tuserLabels: {},\n\t\t\t/** Whether the user expanded the widget to see every field. */\n\t\t\texpanded: false,\n\t\t\t/** Fields that fit the cell while collapsed; null when all fit. */\n\t\t\tfitCount: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The items this widget offers to a host surface's overflow menu.\n\t\t *\n\t\t * Exactly the two that live in `#action-items` on its own header, as\n\t\t * plain descriptors. `run` closes over this component, so the button an\n\t\t * ancestor renders still opens THIS widget's dialog, pre-filled from its\n\t\t * own config and committing through its own save path.\n\t\t *\n\t\t * Edit is gated on `editable` for the same reason the header item is: a\n\t\t * read-only widget offering a full edit form is a dead end.\n\t\t *\n\t\t * @return {object[]} PanelAction descriptors.\n\t\t */\n\t\tpanelActionItems() {\n\t\t\tconst items = []\n\t\t\tif (this.editable) {\n\t\t\t\titems.push({\n\t\t\t\t\tkey: 'edit',\n\t\t\t\t\tlabel: this.editLabel,\n\t\t\t\t\ticon: 'Pencil',\n\t\t\t\t\trun: () => {\n\t\t\t\t\t\tthis.editModalOpen = true\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t\titems.push({\n\t\t\t\tkey: 'metadata',\n\t\t\t\tlabel: this.metadataLabel,\n\t\t\t\ticon: 'InformationOutline',\n\t\t\t\trun: () => {\n\t\t\t\t\tthis.metadataModalOpen = true\n\t\t\t\t},\n\t\t\t})\n\t\t\treturn items\n\t\t},\n\n\t\ticonComponent() {\n\t\t\treturn (this.icon && typeof this.icon !== 'string') ? this.icon : null\n\t\t},\n\n\t\t/** MDI icon NAME (String form of `icon`) — rendered via CnIcon. */\n\t\ticonName() {\n\t\t\treturn typeof this.icon === 'string' ? this.icon : ''\n\t\t},\n\n\t\t/**\n\t\t * The overrides map, coerced to a plain object. An empty `{}` persists\n\t\t * through PHP/JSON as `[]`; treat any Array as \"no overrides\" so lookups\n\t\t * (`overrides[key]`) stay well-defined.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tresolvedOverrides() {\n\t\t\treturn (this.overrides && !Array.isArray(this.overrides)) ? this.overrides : {}\n\t\t},\n\n\t\t/**\n\t\t * Resolved field definitions from schema + overrides.\n\t\t * Sorted by order, filtered by hidden/exclude/include.\n\t\t */\n\t\t/**\n\t\t * The keys the overrides and the include list name at a dotted path\n\t\t * (`handling.teams`), as fields for the dotted-field helpers.\n\t\t *\n\t\t * @return {Array<{key: string}>}\n\t\t * @spec openspec/changes/forms-dotted-path-fields/specs/form-dialog/spec.md#requirement-a-field-can-edit-one-key-inside-an-object-property\n\t\t */\n\t\tdottedFieldKeys() {\n\t\t\tconst keys = [...Object.keys(this.resolvedOverrides || {}), ...(Array.isArray(this.include) ? this.include : [])]\n\t\t\treturn [...new Set(keys)].filter(isDottedKey).map((key) => ({ key }))\n\t\t},\n\n\t\t/**\n\t\t * The object's values by field key: its own keys, plus each dotted\n\t\t * field's value read from inside its object.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tfieldValues() {\n\t\t\treturn spreadDottedFields(this.objectData || {}, this.dottedFieldKeys)\n\t\t},\n\n\t\tresolvedFields() {\n\t\t\t// The shared pipeline now honours per-key `hidden` (filter) and\n\t\t\t// `order` (sort) directly, so the overrides map is passed through\n\t\t\t// verbatim — no bespoke hidden→exclude merge or post-sort needed.\n\t\t\t// This keeps the data widget and the edit modal (CnFormDialog)\n\t\t\t// identical-by-construction from one config map.\n\t\t\tconst fields = fieldsFromSchema(this.schema, {\n\t\t\t\texclude: this.exclude,\n\t\t\t\tinclude: this.include,\n\t\t\t\toverrides: this.resolvedOverrides,\n\t\t\t\tincludeReadOnly: true,\n\t\t\t\ttranslate: this.cnTranslate,\n\t\t\t})\n\n\t\t\t// Attach grid span info (a display-only concern, not part of the\n\t\t\t// shared field pipeline) from the same overrides map.\n\t\t\tconst withSpans = fields.map((field) => ({\n\t\t\t\t...field,\n\t\t\t\tgridColumn: (this.resolvedOverrides[field.key] && this.resolvedOverrides[field.key].gridColumn) || 1,\n\t\t\t\tgridRow: (this.resolvedOverrides[field.key] && this.resolvedOverrides[field.key].gridRow) || 1,\n\t\t\t}))\n\n\t\t\t// Per-field condition: `overrides[key].visibleWhen` shows a field only\n\t\t\t// for the objects it belongs to, such as a person's preferred name on\n\t\t\t// a client that can also be an organisation.\n\t\t\tconst shown = withSpans.filter((field) => this.isVisibleByCondition(field))\n\n\t\t\tif (!this.hideEmpty) {\n\t\t\t\treturn shown\n\t\t\t}\n\n\t\t\t// Keep a field the user is currently editing or has pending changes for,\n\t\t\t// otherwise it would vanish mid-edit the moment its value is cleared.\n\t\t\treturn shown.filter((field) => field.key === this.editingField\n\t\t\t\t|| field.key in this.dirtyFields\n\t\t\t\t|| !this.isEmptyValue(this.fieldValues[field.key]))\n\t\t},\n\n\t\t/**\n\t\t * The translated display label for an enum value, or null when the field\n\t\t * is not an enum (or the value is absent) and normal formatting applies.\n\t\t *\n\t\t * The stored value is untouched — only what the user reads changes, so\n\t\t * inline editing still writes back the raw code.\n\t\t *\n\t\t * @return {(field: object, raw: unknown) => string|null} Given the resolved\n\t\t * field descriptor and the stored value, the label to display — or\n\t\t * null to fall through to `formatValue`.\n\t\t */\n\t\tenumDisplayLabel() {\n\t\t\treturn (field, raw) => {\n\t\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst values = Array.isArray(field.enum) ? field.enum : null\n\t\t\t\tif (values === null || !values.includes(raw)) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst labels = field.enumLabels || {}\n\t\t\t\treturn this.cnTranslate(labels[raw] || String(raw))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Display values of the fields whose override names a registered\n\t\t * formatter, keyed by field key. A field is left out when its formatter\n\t\t * id is not registered or the formatter throws, so it falls back to the\n\t\t * default rendering.\n\t\t *\n\t\t * @return {Record<string, string>}\n\t\t */\n\t\tformatterDisplayValues() {\n\t\t\tconst values = {}\n\t\t\tfor (const field of this.resolvedFields) {\n\t\t\t\tconst fn = field.formatter && this.cnFormatters && this.cnFormatters[field.formatter]\n\t\t\t\tif (typeof fn !== 'function') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst raw = field.key in this.dirtyFields\n\t\t\t\t\t? this.dirtyFields[field.key]\n\t\t\t\t\t: this.fieldValues[field.key]\n\t\t\t\tconst prop = (this.schema.properties && this.schema.properties[field.key]) || {}\n\t\t\t\ttry {\n\t\t\t\t\tconst formatted = fn(raw, this.objectData || {}, prop)\n\t\t\t\t\tvalues[field.key] = (formatted === null || formatted === undefined || formatted === '') ? '—' : String(formatted)\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`[CnObjectDataWidget] formatter \"${field.formatter}\" threw; falling back`, e)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Formatted display values for each field.\n\t\t */\n\t\tdisplayValues() {\n\t\t\tconst values = {}\n\t\t\tfor (const field of this.resolvedFields) {\n\t\t\t\tif (field.key in this.formatterDisplayValues) {\n\t\t\t\t\tvalues[field.key] = this.formatterDisplayValues[field.key]\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// Show pending edit value if dirty\n\t\t\t\tconst raw = field.key in this.dirtyFields\n\t\t\t\t\t? this.dirtyFields[field.key]\n\t\t\t\t\t: this.fieldValues[field.key]\n\t\t\t\tconst prop = this.schema.properties && this.schema.properties[field.key]\n\t\t\t\tif (this.isRelationField(prop) && raw !== null && raw !== undefined && raw !== '') {\n\t\t\t\t\tvalues[field.key] = this.relationLabel(raw)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// An enum renders its LABEL, the way the table cell and the form\n\t\t\t\t// dropdown do. Without this the detail page was the one surface\n\t\t\t\t// still showing the stored code — `submitted` under a Dutch\n\t\t\t\t// label, beside a list that already read \"Ingediend\".\n\t\t\t\tconst enumLabel = this.enumDisplayLabel(field, raw)\n\t\t\t\tconst empty = this.emptyValueFor(field, raw)\n\t\t\t\tvalues[field.key] = empty !== null ? empty : (enumLabel !== null ? enumLabel : formatValue(raw, prop || {}))\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Whether any fields have been modified.\n\t\t */\n\t\tisDirty() {\n\t\t\treturn Object.keys(this.dirtyFields).length > 0\n\t\t},\n\n\t\t/**\n\t\t * CSS grid template for the container.\n\t\t */\n\t\tgridStyle() {\n\t\t\t// The board look: as many 200px columns as the card has room for,\n\t\t\t// unless the config asks for one column (a stacked list of pairs).\n\t\t\tif (normalizeLook(this.cnLook) === 'board') {\n\t\t\t\tif (this.columns === 1) {\n\t\t\t\t\treturn { 'grid-template-columns': 'minmax(0, 1fr)' }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t'grid-template-columns': 'repeat(auto-fit, minmax(200px, 1fr))',\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t'grid-template-columns': `repeat(${this.columns}, 1fr)`,\n\t\t\t}\n\t\t},\n\n\t\t/** Fields shown while collapsed; null shows all of them. */\n\t\tcollapsedCount() {\n\t\t\tconst count = this.collapsedFields ?? this.fitCount\n\t\t\treturn count === null || count === undefined ? null : Math.max(1, count)\n\t\t},\n\n\t\t/** Whether some fields are left out while collapsed. */\n\t\thasHiddenFields() {\n\t\t\treturn this.collapsedCount !== null && this.resolvedFields.length > this.collapsedCount\n\t\t},\n\n\t\t/** The fields rendered: all of them when expanded, else the first few. */\n\t\tvisibleFields() {\n\t\t\tif (this.expanded || !this.hasHiddenFields) {\n\t\t\t\treturn this.resolvedFields\n\t\t\t}\n\t\t\treturn this.resolvedFields.slice(0, this.collapsedCount)\n\t\t},\n\n\t\t/** Pre-translated \"Show all N fields\" affordance label. */\n\t\tshowAllFieldsLabel() {\n\t\t\treturn t('nextcloud-vue', 'Show all {count} fields', { count: this.resolvedFields.length })\n\t\t},\n\n\t\t/** Pre-translated collapse label. */\n\t\tcollapseFieldsLabel() {\n\t\t\treturn t('nextcloud-vue', 'Show less')\n\t\t},\n\t},\n\n\twatch: {\n\t\t'resolvedFields.length': function() {\n\t\t\tthis.scheduleFit()\n\t\t},\n\n\t\tcollapsedFields() {\n\t\t\tthis.scheduleFit()\n\t\t},\n\n\t\tobjectData: {\n\t\t\tdeep: true,\n\t\t\thandler() {\n\t\t\t\t// If external data changes (e.g. after save), clear dirty state\n\t\t\t\t// for fields that now match the new data\n\t\t\t\tfor (const key of Object.keys(this.dirtyFields)) {\n\t\t\t\t\tif (this.dirtyFields[key] === this.fieldValues[key]) {\n\t\t\t\t\t\tconst { [key]: _, ...rest } = this.dirtyFields\n\t\t\t\t\t\tthis.dirtyFields = rest\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Resolve relation display names whenever the object changes.\n\t\t\t\tthis.resolveRelations()\n\t\t\t\tthis.resolveUserNames()\n\t\t\t},\n\t\t},\n\n\t\tschema: {\n\t\t\thandler() {\n\t\t\t\tthis.resolveRelations()\n\t\t\t\tthis.resolveUserNames()\n\t\t\t},\n\t\t},\n\n\t\t// Republish when the items change (a label retranslated, `editable`\n\t\t// flipped) and when the widget's own menu comes or goes. Not `immediate`:\n\t\t// an immediate watcher runs during this component's own setup, and\n\t\t// publishing then would mutate the ancestor's state mid-render. Mounted\n\t\t// does it once the tree is settled.\n\t\tpanelActionItems: {\n\t\t\thandler() {\n\t\t\t\tthis.publishPanelActions()\n\t\t\t},\n\t\t},\n\n\t\tshowActions: {\n\t\t\thandler() {\n\t\t\t\tthis.publishPanelActions()\n\t\t\t},\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.resolveRelations()\n\t\tthis.resolveUserNames()\n\t\tthis.publishPanelActions()\n\t\tthis.observeCell()\n\t\tthis.scheduleFit()\n\t},\n\n\tbeforeUnmount() {\n\t\tif (this._cellObserver) {\n\t\t\tthis._cellObserver.disconnect()\n\t\t}\n\t\tclearTimeout(this._fitTimer)\n\t\t// Leave nothing behind in the strip's menu. A closed tab's panel can be\n\t\t// torn down while the strip lives on, and an item whose widget is gone\n\t\t// would open a dialog belonging to nothing.\n\t\tif (this.panelActionSink) {\n\t\t\tthis.panelActionSink.clear()\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Publish or withdraw this widget's items on the host surface.\n\t\t *\n\t\t * Published only while the widget's OWN menu is suppressed. With a\n\t\t * header of its own the items already have a home, and publishing too\n\t\t * would put the same two entries in two menus on one screen.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tpublishPanelActions() {\n\t\t\tif (!this.panelActionSink) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.showActions) {\n\t\t\t\tthis.panelActionSink.clear()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.panelActionSink.set(this.panelActionItems)\n\t\t},\n\n\t\t/** Pre-translated string helper exposed to the template. */\n\t\tt,\n\n\t\t/** Toggle between the first few fields and all of them. */\n\t\ttoggleExpanded() {\n\t\t\tthis.expanded = !this.expanded\n\t\t\tif (!this.expanded) {\n\t\t\t\tthis.scheduleFit()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The wrapper's content node: the cell whose height the fields fit into.\n\t\t *\n\t\t * @return {HTMLElement|null}\n\t\t */\n\t\tcellContent() {\n\t\t\treturn this.$el?.querySelector?.('.cn-widget-wrapper__content')\n\t\t\t\t|| this.$el?.closest?.('.cn-widget-wrapper__content')\n\t\t\t\t|| null\n\t\t},\n\n\t\t/** Re-fit when the cell is resized. */\n\t\tobserveCell() {\n\t\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis._cellObserver = new ResizeObserver(() => this.scheduleFit())\n\t\t\tconst content = this.cellContent()\n\t\t\tif (content) {\n\t\t\t\tthis._cellObserver.observe(content)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Re-fit when the grid itself grows or shrinks: a fixed-height cell does\n\t\t * not resize when a relation label resolves or a field enters edit mode.\n\t\t * A re-fit of unchanged content lands on the same height, which the\n\t\t * observer does not report, so this settles after one extra pass.\n\t\t *\n\t\t * @param {HTMLElement} grid The grid element.\n\t\t * @return {void}\n\t\t */\n\t\tobserveGrid(grid) {\n\t\t\tif (!this._cellObserver || grid === this._observedGrid) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this._observedGrid) {\n\t\t\t\tthis._cellObserver.unobserve(this._observedGrid)\n\t\t\t}\n\t\t\tthis._cellObserver.observe(grid)\n\t\t\tthis._observedGrid = grid\n\t\t},\n\n\t\t/** Debounce fitFields so a data load's burst of changes fits once. */\n\t\tscheduleFit() {\n\t\t\tclearTimeout(this._fitTimer)\n\t\t\tthis._fitTimer = setTimeout(() => this.fitFields(), 30)\n\t\t},\n\n\t\t/**\n\t\t * In fit mode, render every field, then keep the whole rows that fit\n\t\t * the cell with room left for the toggle.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fitFields() {\n\t\t\tif (this.collapsedFields !== null || this.expanded) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.fitCount = null\n\t\t\tawait this.$nextTick()\n\t\t\tconst content = this.cellContent()\n\t\t\tconst grid = this.$refs.grid\n\t\t\tif (grid) {\n\t\t\t\tthis.observeGrid(grid)\n\t\t\t}\n\t\t\tif (!content || !grid || !content.clientHeight || content.scrollHeight <= content.clientHeight + 1) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst style = getComputedStyle(content)\n\t\t\tconst box = content.getBoundingClientRect()\n\t\t\tconst toggleReserve = 44\n\t\t\tconst limit = box.top + content.clientTop + content.clientHeight\n\t\t\t\t- parseFloat(style.paddingBottom || 0) - toggleReserve - content.scrollTop\n\t\t\tconst cells = Array.from(grid.querySelectorAll('.cn-object-data-widget__cell'))\n\t\t\t\t.map((el) => el.getBoundingClientRect())\n\t\t\tconst overflowing = cells.find((r) => r.bottom > limit)\n\t\t\t// Drop the whole row the first overflowing field sits in.\n\t\t\tconst count = overflowing ? cells.filter((r) => r.top < overflowing.top - 1).length : cells.length\n\t\t\tthis.fitCount = count < cells.length ? Math.max(1, count) : null\n\t\t},\n\n\t\t/**\n\t\t * Raw (possibly dirty) value for a field.\n\t\t *\n\t\t * @param {object} field The field descriptor (from `fieldsFromSchema`).\n\t\t */\n\t\trawOf(field) {\n\t\t\tconst o = this.objectData || {}\n\t\t\treturn (field.key in this.dirtyFields) ? this.dirtyFields[field.key] : o[field.key]\n\t\t},\n\n\t\t/**\n\t\t * Classify a field's raw value for display so the template can pick a\n\t\t * legible renderer (ADR-062: a structured value must never render as\n\t\t * \"[object Object]\"). Relation fields are excluded here — their\n\t\t * name-resolved label already flows through `displayValues`.\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @return {'object-array'|'scalar-array'|'object'|'scalar'} The value kind.\n\t\t */\n\t\tfieldValueKind(field) {\n\t\t\tif (field.key in this.formatterDisplayValues) {\n\t\t\t\treturn 'scalar'\n\t\t\t}\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tif (this.isRelationField(prop)) {\n\t\t\t\treturn 'scalar'\n\t\t\t}\n\t\t\tconst raw = this.rawOf(field)\n\t\t\tif (Array.isArray(raw)) {\n\t\t\t\tif (raw.length === 0) {\n\t\t\t\t\treturn 'scalar'\n\t\t\t\t}\n\t\t\t\treturn raw.some((v) => v !== null && typeof v === 'object' && !Array.isArray(v))\n\t\t\t\t\t? 'object-array'\n\t\t\t\t\t: 'scalar-array'\n\t\t\t}\n\t\t\tif (raw !== null && typeof raw === 'object') {\n\t\t\t\treturn 'object'\n\t\t\t}\n\t\t\treturn 'scalar'\n\t\t},\n\n\t\t/**\n\t\t * Column keys for an array-of-objects inline table: the union of the\n\t\t * keys of the first three items, capped at five columns.\n\t\t *\n\t\t * @param {Array<object>} raw The array value.\n\t\t * @return {string[]} Up to five column keys.\n\t\t */\n\t\tobjectArrayColumns(raw) {\n\t\t\tif (!Array.isArray(raw)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst keys = []\n\t\t\tfor (const item of raw.slice(0, 3)) {\n\t\t\t\tif (item && typeof item === 'object') {\n\t\t\t\t\tfor (const k of Object.keys(item)) {\n\t\t\t\t\t\tif (!keys.includes(k)) {\n\t\t\t\t\t\t\tkeys.push(k)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn keys.slice(0, 5)\n\t\t},\n\n\t\t/**\n\t\t * The first five rows of an array-of-objects value (the table caps at\n\t\t * five rows + an \"N more\" affordance).\n\t\t *\n\t\t * @param {Array<object>} raw The array value.\n\t\t * @return {Array<object>} Up to five row objects.\n\t\t */\n\t\tobjectArrayRows(raw) {\n\t\t\treturn Array.isArray(raw) ? raw.slice(0, 5) : []\n\t\t},\n\n\t\t/**\n\t\t * `[key, value]` pairs of a single plain-object value, for the compact\n\t\t * definition-list renderer.\n\t\t *\n\t\t * @param {object} raw The object value.\n\t\t * @return {Array<[string, unknown]>} The entries.\n\t\t */\n\t\tobjectEntries(raw) {\n\t\t\treturn (raw && typeof raw === 'object') ? Object.entries(raw) : []\n\t\t},\n\n\t\t/**\n\t\t * Whether a value is a plain object (not an array, not null).\n\t\t *\n\t\t * @param {unknown} v The value.\n\t\t * @return {boolean} True for a plain object.\n\t\t */\n\t\tisPlainObject(v) {\n\t\t\treturn v !== null && typeof v === 'object' && !Array.isArray(v)\n\t\t},\n\n\t\t/**\n\t\t * Label for a key inside an object value: the sub-schema's `title`\n\t\t * (translated) when the schema describes it, else the key, made\n\t\t * readable when it is identifier-shaped (`shortDescription` → \"Short\n\t\t * description\"; `nl` stays `nl`).\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @param {string[]} path Keys from the field's value down to this entry.\n\t\t * @return {string} The label.\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-nested-object-reads-as-a-list-per-key\n\t\t */\n\t\tnestedLabel(field, path) {\n\t\t\tlet prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tfor (const key of path) {\n\t\t\t\tif (!this.isPlainObject(prop)) {\n\t\t\t\t\tprop = null\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tprop = (prop.properties && prop.properties[key])\n\t\t\t\t\t|| (this.isPlainObject(prop.additionalProperties) ? prop.additionalProperties : null)\n\t\t\t}\n\t\t\tif (prop && typeof prop.title === 'string' && prop.title) {\n\t\t\t\treturn this.cnTranslate(prop.title)\n\t\t\t}\n\t\t\tconst key = String(path[path.length - 1])\n\t\t\treturn /[A-Z_-]/.test(key) ? humaniseKey(key) : key\n\t\t},\n\n\t\t/**\n\t\t * Stringify a value inside a definition list: a list of scalars reads\n\t\t * as a comma-separated line, anything else as `stringifyCell`.\n\t\t *\n\t\t * @param {unknown} v The value.\n\t\t * @return {string} The display string.\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-nested-object-reads-as-a-list-per-key\n\t\t */\n\t\tstringifyNested(v) {\n\t\t\tif (Array.isArray(v) && v.length && v.every((item) => item === null || typeof item !== 'object')) {\n\t\t\t\treturn v.map((item) => this.stringifyCell(item)).join(', ')\n\t\t\t}\n\t\t\treturn this.stringifyCell(v)\n\t\t},\n\n\t\t/**\n\t\t * Stringify a scalar cell value; a nested object/array collapses to\n\t\t * compact JSON (never \"[object Object]\").\n\t\t *\n\t\t * @param {unknown} v The cell value.\n\t\t * @return {string} The display string.\n\t\t */\n\t\tstringifyCell(v) {\n\t\t\tif (v === null || v === undefined || v === '') {\n\t\t\t\treturn '—'\n\t\t\t}\n\t\t\tif (typeof v === 'boolean') {\n\t\t\t\treturn v ? '✓' : '—'\n\t\t\t}\n\t\t\tif (typeof v === 'object') {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.stringify(v)\n\t\t\t\t} catch {\n\t\t\t\t\treturn '[Object]'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn String(v)\n\t\t},\n\n\t\t/**\n\t\t * Whether a field should render as an image preview.\n\t\t *\n\t\t * @param {object} field The field descriptor (from `fieldsFromSchema`).\n\t\t */\n\t\tisImageField(field) {\n\t\t\tif (field.widget === 'image') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst prop = this.schema.properties && this.schema.properties[field.key]\n\t\t\tconst fmt = (prop && (prop.format || prop.contentMediaType)) || ''\n\t\t\tif (fmt === 'image' || String(fmt).indexOf('image/') === 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn /(^|[._-])(photo|image|avatar|logo|thumb|picture)/i.test(field.key)\n\t\t},\n\n\t\t/**\n\t\t * The x-openregister-relation block for a property (scalar or array), or null.\n\t\t *\n\t\t * @param {object} prop The schema property definition.\n\t\t */\n\t\trelationProp(prop) {\n\t\t\tif (!prop) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (prop['x-openregister-relation']) {\n\t\t\t\treturn prop['x-openregister-relation']\n\t\t\t}\n\t\t\tif (prop.items && prop.items['x-openregister-relation']) {\n\t\t\t\treturn prop.items['x-openregister-relation']\n\t\t\t}\n\t\t\t// Canonical OpenRegister shorthand: `$ref` on a uuid-string\n\t\t\t// property (or its array items) references a schema in the SAME\n\t\t\t// register. Authored as the schema's TITLE (\"ReportPeriod\"), not\n\t\t\t// its slug — the live schema API may also rewrite it to the\n\t\t\t// numeric schema id (e.g. 85); accept both, the objects API\n\t\t\t// resolves either in its path, but a multi-word title 404s\n\t\t\t// unless kebab-cased first (defect 7: `ReportPeriod` 404s,\n\t\t\t// `report-period` 200). Register comes from the detail-page\n\t\t\t// object context (ADR-062: references display the target\n\t\t\t// object's NAME, never a raw uuid).\n\t\t\tconst rawRef = prop.$ref !== null && prop.$ref !== undefined ? prop.$ref : (prop.items ? prop.items.$ref : null)\n\t\t\tif (rawRef !== null && rawRef !== undefined && (typeof rawRef === 'string' || typeof rawRef === 'number')) {\n\t\t\t\tconst tail = String(rawRef).split('/').pop().replace(/\\.json$/, '')\n\t\t\t\tconst slug = schemaRefSlug(tail)\n\t\t\t\tconst reg = this.contextRegisterOf()\n\t\t\t\tif (slug && reg) {\n\t\t\t\t\treturn { target: `${reg}/${slug}` }\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/** The current register from the injected detail-page object context. */\n\t\tcontextRegisterOf() {\n\t\t\tconst c = this.cnObjectContext\n\t\t\tif (!c) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst v = (typeof c === 'object' && 'value' in c) ? c.value : c\n\t\t\treturn (v && v.register) || ''\n\t\t},\n\n\t\t/**\n\t\t * Whether a property is a relation.\n\t\t *\n\t\t * @param {object} prop The schema property definition.\n\t\t */\n\t\tisRelationField(prop) {\n\t\t\treturn this.relationProp(prop) !== null\n\t\t},\n\n\t\t/**\n\t\t * Whether a stored value counts as \"no value\" for `hideEmpty`.\n\t\t *\n\t\t * `false` and `0` are values, not absences, so they are deliberately kept —\n\t\t * hiding a boolean because it is false would lose information.\n\t\t *\n\t\t * @param {unknown} value The raw value from objectData.\n\t\t * @return {boolean} True when there is nothing to show.\n\t\t */\n\t\tisEmptyValue(value) {\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.length === 0\n\t\t\t}\n\t\t\tif (typeof value === 'object') {\n\t\t\t\treturn Object.keys(value).length === 0\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Display label(s) for a relation value, using resolved names. While a\n\t\t * name lookup is still in flight the placeholder '…' shows — a raw\n\t\t * uuid must never flash before the name arrives (ADR-062). Failed\n\t\t * lookups land in relatedLabels as the id itself (terminal fallback).\n\t\t *\n\t\t * @param {string|Array} raw The relation value(s).\n\t\t * @return {string} Resolved name(s), '…' while loading.\n\t\t */\n\t\trelationLabel(raw) {\n\t\t\tconst one = (v) => this.relatedLabels[v] || '…'\n\t\t\treturn Array.isArray(raw) ? raw.map(one).join(', ') : one(raw)\n\t\t},\n\n\t\t/**\n\t\t * Whether a relation field's display name(s) are still being fetched\n\t\t * (drives the skeleton placeholder in the display cell).\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRelationPending(field) {\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tif (!prop || this.relationProp(prop) === null) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst raw = this.fieldValues[field.key]\n\t\t\tconst ids = Array.isArray(raw) ? raw : (raw ? [raw] : [])\n\t\t\treturn ids.some((id) => id && !(id in this.relatedLabels))\n\t\t},\n\n\t\t/**\n\t\t * Whether a field is a SINGLE-VALUE relation (edited through the\n\t\t * name-labeled object picker). Array relations keep the generic\n\t\t * editor for now.\n\t\t *\n\t\t * @param {string} key Schema property key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSingleRelationField(key) {\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[key]\n\t\t\tif (!prop || prop.type === 'array') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.relationProp(prop) !== null\n\t\t},\n\n\t\t/**\n\t\t * Best display name for a referenced object.\n\t\t *\n\t\t * @param {object} obj The fetched object.\n\t\t * @param {string} id Fallback id.\n\t\t * @return {string}\n\t\t */\n\t\tobjectDisplayName(obj, id) {\n\t\t\tconst self = (obj && obj['@self']) || {}\n\t\t\t// `str()` rather than a bare truthiness chain. A property called\n\t\t\t// `name` is not necessarily a string — Haal Centraal naming gives a\n\t\t\t// person `name: { givenNames, namePrefix, surname }` — and taking the\n\t\t\t// first truthy candidate hands that OBJECT back as the label, which\n\t\t\t// renders as `[object Object]` where a name belongs. Skipping a\n\t\t\t// non-string lets the next candidate answer, and for these schemas\n\t\t\t// the next one is right.\n\t\t\tconst str = (v) => (typeof v === 'string' && v.trim() !== '' ? v : (typeof v === 'number' ? String(v) : ''))\n\t\t\tlet name = str(obj.name) || str(obj.title) || str(obj.displayName)\n\t\t\tif (!name && (str(obj.firstName) || str(obj.lastName))) {\n\t\t\t\tname = (str(obj.firstName) + ' ' + str(obj.lastName)).trim()\n\t\t\t}\n\t\t\tif (!name && str(self.name) && self.name !== id) {\n\t\t\t\tname = str(self.name)\n\t\t\t}\n\t\t\treturn name || id\n\t\t},\n\n\t\t/**\n\t\t * Load the picker options for a relation field from its target schema\n\t\t * (first 200 objects, labeled by display name).\n\t\t *\n\t\t * @param {string} key Schema property key.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadRelationOptions(key) {\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[key]\n\t\t\tconst rel = this.relationProp(prop)\n\t\t\tif (!rel) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst parts = String(rel.target || '').split('/')\n\t\t\tif (parts.length < 2) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.relationOptionsLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{reg}/{sch}', { reg: parts[0], sch: parts[1] })\n\t\t\t\tconst params = { _limit: 200 }\n\t\t\t\t// Declarative option scoping: `x-relation-filter` on the schema\n\t\t\t\t// property narrows the picker to objects that fit THIS object —\n\t\t\t\t// e.g. case.status: { \"caseType\": \"@object.caseType\" } offers\n\t\t\t\t// only the statuses of the case's own type. Values are\n\t\t\t\t// token-resolved (@objectId / @object.<field>); entries whose\n\t\t\t\t// token stays unresolved are dropped (unfiltered beats empty).\n\t\t\t\tconst rawFilter = prop['x-relation-filter']\n\t\t\t\tif (rawFilter && typeof rawFilter === 'object') {\n\t\t\t\t\t// Dirty values win: picking a new caseType must immediately\n\t\t\t\t\t// scope the status options to it, before any save.\n\t\t\t\t\tconst objData = { ...(this.objectData || {}), ...this.dirtyFields }\n\t\t\t\t\tconst ctx = { objectId: ((this.objectData || {})['@self'] && (this.objectData || {})['@self'].id) || (this.objectData || {}).id, object: objData }\n\t\t\t\t\tconst filter = resolveFilterTokens(rawFilter, ctx)\n\t\t\t\t\tfor (const [fk, fv] of Object.entries(filter)) {\n\t\t\t\t\t\tif (typeof fv === 'string' && fv.charAt(0) === '@') {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fv && typeof fv === 'object') {\n\t\t\t\t\t\t\tfor (const [op, ov] of Object.entries(fv)) {\n\t\t\t\t\t\t\t\tparams[`${fk}[${op}]`] = ov\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (fv !== '' && fv !== null && fv !== undefined) {\n\t\t\t\t\t\t\tparams[fk] = fv\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst res = await axios.get(url, { params })\n\t\t\t\tconst rows = (res && res.data && res.data.results) || []\n\t\t\t\tconst opts = rows.map((o) => {\n\t\t\t\t\tconst id = (o['@self'] && o['@self'].id) || o.id\n\t\t\t\t\treturn { id, label: this.objectDisplayName(o, id) }\n\t\t\t\t}).filter((o) => o.id)\n\t\t\t\tthis.relationOptions[key] = opts\n\t\t\t\t// Cache the labels so display resolution reuses them.\n\t\t\t\topts.forEach((o) => {\n\t\t\t\t\tif (!(o.id in this.relatedLabels)) {\n\t\t\t\t\t\tthis.relatedLabels[o.id] = o.label\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.relationOptions[key] = []\n\t\t\t} finally {\n\t\t\t\tthis.relationOptionsLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The currently selected picker option for a relation field.\n\t\t *\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {object|null} `{ id, label }` or null when unset.\n\t\t */\n\t\trelationSelectedOption(field) {\n\t\t\tconst v = this.editData[field.key]\n\t\t\tif (!v) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { id: v, label: this.relatedLabels[v] || String(v) }\n\t\t},\n\n\t\t/**\n\t\t * Apply a relation picker choice: store the referenced object's ID\n\t\t * (the persisted value stays a uuid; only the display is a name).\n\t\t *\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {object|null} opt Chosen option or null (cleared).\n\t\t */\n\t\tonRelationChange(field, opt) {\n\t\t\tif (opt && opt.id) {\n\t\t\t\tthis.relatedLabels[opt.id] = opt.label\n\t\t\t}\n\t\t\tthis.updateField(field.key, opt ? opt.id : null)\n\t\t},\n\n\t\t/** Fetch related objects' display names into relatedLabels. */\n\t\tasync resolveRelations() {\n\t\t\t// Collect every unresolved (target, id) pair first, then fetch them\n\t\t\t// ALL in parallel — sequential lookups made names trail the page by\n\t\t\t// seconds, leaving confusing placeholder values (ADR-062: names\n\t\t\t// must arrive with the page, uuids never show).\n\t\t\tconst props = (this.schema && this.schema.properties) || {}\n\t\t\tconst jobs = []\n\t\t\tfor (const key of Object.keys(props)) {\n\t\t\t\tconst rel = this.relationProp(props[key])\n\t\t\t\tif (!rel) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst parts = String(rel.target || '').split('/')\n\t\t\t\tif (parts.length < 2) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst raw = this.fieldValues[key]\n\t\t\t\tconst ids = Array.isArray(raw) ? raw : (raw ? [raw] : [])\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (!id || (id in this.relatedLabels) || jobs.some((j) => j.id === id)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tjobs.push({ reg: parts[0], sch: parts[1], id })\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait Promise.all(jobs.map(async ({ reg, sch, id }) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{reg}/{sch}/{id}', { reg, sch, id })\n\t\t\t\t\tconst res = await axios.get(url)\n\t\t\t\t\tconst d = (res && res.data) ? res.data : {}\n\t\t\t\t\tconst obj = (d.results && d.results[0]) ? d.results[0] : d\n\t\t\t\t\tthis.relatedLabels[id] = this.objectDisplayName(obj, id)\n\t\t\t\t} catch {\n\t\t\t\t\tthis.relatedLabels[id] = id\n\t\t\t\t}\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether a field's value cannot be edited inline: a structured widget\n\t\t * (json, code, file, sub-objects, child-records), or a plain-object /\n\t\t * list-of-objects value that is not a relation. Scalar widgets without\n\t\t * a dedicated editor (duration, language, …) keep the text fallback.\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @return {boolean} True when only the form dialog can edit it.\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-structured-value-is-never-edited-inline\n\t\t */\n\t\thasNoInlineEditor(field) {\n\t\t\tif (STRUCTURED_WIDGETS.includes(field.widget)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tif (this.isRelationField(prop)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// A list of objects by schema, also while empty (it resolves to `tags`).\n\t\t\tif (prop && prop.type === 'array' && prop.items && prop.items.type === 'object') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Classify the raw value itself: fieldValueKind reports a formatter\n\t\t\t// field as 'scalar' whatever it holds.\n\t\t\tconst raw = this.rawOf(field)\n\t\t\tif (Array.isArray(raw)) {\n\t\t\t\treturn raw.some((v) => this.isPlainObject(v))\n\t\t\t}\n\t\t\treturn this.isPlainObject(raw)\n\t\t},\n\n\t\t/**\n\t\t * The words an override gives an empty or false value\n\t\t * (`overrides[key].emptyValue`, translated), or null to format it as usual.\n\t\t *\n\t\t * @param {object} field - Resolved field definition from resolvedFields\n\t\t * @param {*} raw - The field's value\n\t\t * @return {string|null}\n\t\t * @spec openspec/changes/data-widget-empty-value-one-column/specs/data-widget/spec.md\n\t\t */\n\t\temptyValueFor(field, raw) {\n\t\t\tconst override = this.resolvedOverrides[field.key]\n\t\t\tconst words = override && typeof override.emptyValue === 'string' ? override.emptyValue : ''\n\t\t\tif (words === '' || !(raw === null || raw === undefined || raw === '' || raw === false)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cnTranslate(words)\n\t\t},\n\n\t\t/**\n\t\t * Check if a field is editable.\n\t\t *\n\t\t * @param {object} field - Resolved field definition from resolvedFields\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-structured-value-is-never-edited-inline\n\t\t */\n\t\tisEditable(field) {\n\t\t\tif (!this.editable) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// No inline editor exists for structured values: the text fallback\n\t\t\t// would commit \"[object Object]\". Those edit through the form dialog,\n\t\t\t// unless the consumer supplies its own `field-<key>` editor slot.\n\t\t\tif (!this.$slots['field-' + field.key] && this.hasNoInlineEditor(field)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Per-field override takes priority\n\t\t\tconst override = this.resolvedOverrides[field.key]\n\t\t\tif (override && typeof override.editable === 'boolean') {\n\t\t\t\treturn override.editable\n\t\t\t}\n\t\t\t// Conditional immutability: a field declares it becomes read-only when\n\t\t\t// another field on this object holds a given value (schema\n\t\t\t// `x-openregister-readonly-when`). Evaluated against the live object —\n\t\t\t// e.g. a hybrid app's identity fields lock when appType === 'hybrid'.\n\t\t\tif (this.isReadOnlyByCondition(field)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Schema readOnly\n\t\t\treturn !field.readOnly\n\t\t},\n\n\t\t/**\n\t\t * Evaluate a field's `visibleWhen` override against the object.\n\t\t *\n\t\t * The rule is the shared visibility predicate in its LOCAL mode\n\t\t * (`{ field, op, value }`, `all` / `any`, `appInstalled`), evaluated by\n\t\t * `evaluateVisibleWhenLocal` against the object with its unsaved\n\t\t * changes, so a field appears or goes the moment the field it depends\n\t\t * on changes. A rule that needs a request (`endpoint`, `source`) cannot\n\t\t * be decided here and is ignored: the field shows, as it did before\n\t\t * the rule existed.\n\t\t *\n\t\t * @param {object} field - Resolved field definition.\n\t\t * @return {boolean} True when the field is shown.\n\t\t */\n\t\tisVisibleByCondition(field) {\n\t\t\tconst override = this.resolvedOverrides[field.key]\n\t\t\tconst rule = override ? override.visibleWhen : undefined\n\t\t\tif (rule === undefined || rule === null || !isLocallyDecidableVisibleWhen(rule)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn evaluateVisibleWhenLocal(rule, { ...(this.objectData || {}), ...this.dirtyFields })\n\t\t},\n\n\t\t/**\n\t\t * Evaluate a field's conditional read-only rule against the object data.\n\t\t *\n\t\t * @param {object} field - Resolved field definition (may carry `readOnlyWhen`).\n\t\t * @return {boolean} True when the condition holds and the field is locked.\n\t\t */\n\t\tisReadOnlyByCondition(field) {\n\t\t\tconst rule = field.readOnlyWhen\n\t\t\tif (!rule || !rule.field) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst current = this.objectData ? this.objectData[rule.field] : undefined\n\t\t\tif (Array.isArray(rule.in)) {\n\t\t\t\treturn rule.in.includes(current)\n\t\t\t}\n\t\t\tif ('equals' in rule) {\n\t\t\t\treturn current === rule.equals\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Check if a field's current value is empty.\n\t\t *\n\t\t * @param {string} key - Field key to check\n\t\t */\n\t\tisValueEmpty(key) {\n\t\t\tconst val = key in this.dirtyFields\n\t\t\t\t? this.dirtyFields[key]\n\t\t\t\t: this.fieldValues[key]\n\t\t\treturn val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0)\n\t\t},\n\n\t\t/**\n\t\t * Start inline editing for a field.\n\t\t *\n\t\t * @param {object} field - Resolved field definition from resolvedFields\n\t\t */\n\t\tstartEdit(field) {\n\t\t\t// Set working value: dirty value > current object value\n\t\t\tconst currentValue = field.key in this.dirtyFields\n\t\t\t\t? this.dirtyFields[field.key]\n\t\t\t\t: this.fieldValues[field.key]\n\t\t\tthis.editData = { ...this.editData, [field.key]: currentValue }\n\t\t\tthis.editingField = field.key\n\t\t\t// Relation fields edit through a name-labeled object picker.\n\t\t\t// Options reload on every edit start: an `x-relation-filter` can\n\t\t\t// depend on the object's CURRENT values (e.g. status options scoped\n\t\t\t// to the just-changed caseType), so a per-field cache would serve\n\t\t\t// stale sets.\n\t\t\tif (this.isSingleRelationField(field.key)) {\n\t\t\t\tthis.loadRelationOptions(field.key)\n\t\t\t}\n\t\t\t// Group and user fields pick from Nextcloud's own directory.\n\t\t\tif (this.isPersonPicker(field)) {\n\t\t\t\tthis.searchPeople(field, '')\n\t\t\t\tthis.resolvePersonLabels(field, currentValue)\n\t\t\t}\n\n\t\t\tthis.$nextTick(() => {\n\t\t\t\t// Focus the editor\n\t\t\t\tconst editor = this.$refs.activeEditor\n\t\t\t\tif (editor) {\n\t\t\t\t\tconst el = Array.isArray(editor) ? editor[0] : editor\n\t\t\t\t\tif (el && el.$el) {\n\t\t\t\t\t\tconst input = el.$el.querySelector('input, textarea, select')\n\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\tinput.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (el && el.focus) {\n\t\t\t\t\t\tel.focus()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Update the working edit value for a field.\n\t\t *\n\t\t * @param {string} key - Field key to update\n\t\t * @param {unknown} value - New value for the field\n\t\t */\n\t\tupdateField(key, value) {\n\t\t\tthis.editData = { ...this.editData, [key]: value }\n\t\t},\n\n\t\t/**\n\t\t * Commit the current inline edit — stage the field as dirty and persist\n\t\t * it immediately so a click-to-edit confirm saves in one step (matching\n\t\t * user expectation). The header Save/Discard still work for any remaining\n\t\t * dirty state (e.g. checkbox edits queued without a per-field confirm).\n\t\t */\n\t\tasync commitEdit() {\n\t\t\tif (!this.editingField) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst key = this.editingField\n\t\t\tconst newValue = this.editData[key]\n\t\t\tconst originalValue = this.fieldValues[key]\n\n\t\t\tthis.editingField = null\n\n\t\t\t// Only mark dirty if actually changed\n\t\t\tif (newValue !== originalValue) {\n\t\t\t\tthis.dirtyFields = { ...this.dirtyFields, [key]: newValue }\n\t\t\t} else {\n\t\t\t\t// Remove from dirty if reverted to original\n\t\t\t\tconst { [key]: _, ...rest } = this.dirtyFields\n\t\t\t\tthis.dirtyFields = rest\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Persist immediately (single-step inline save).\n\t\t\tawait this.save()\n\t\t},\n\n\t\t/**\n\t\t * Cancel the current inline edit without saving.\n\t\t */\n\t\tcancelEdit() {\n\t\t\tthis.editingField = null\n\t\t},\n\n\t\t/**\n\t\t * Discard all pending changes.\n\t\t */\n\t\tdiscard() {\n\t\t\tthis.dirtyFields = {}\n\t\t\tthis.editData = {}\n\t\t\tthis.editingField = null\n\t\t\tthis.$emit('discard')\n\t\t},\n\n\t\t/**\n\t\t * Save all dirty fields via the objectStore or emit event.\n\t\t */\n\t\tasync save() {\n\t\t\tif (!this.isDirty) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst mergedData = foldDottedFields({\n\t\t\t\t...this.objectData,\n\t\t\t\t...this.dirtyFields,\n\t\t\t}, this.dottedFieldKeys)\n\n\t\t\tthis.saving = true\n\n\t\t\ttry {\n\t\t\t\t// Try objectStore first if objectType is registered\n\t\t\t\tif (this.objectType) {\n\t\t\t\t\tconst store = this._getObjectStore()\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\t// Only the fields edited inline are written (a PATCH).\n\t\t\t\t\t\tconst result = await saveEdited(store, this.objectType, this.objectData, mergedData)\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tthis.dirtyFields = {}\n\t\t\t\t\t\t\tthis.editData = {}\n\t\t\t\t\t\t\tthis.$emit('saved', result)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst error = store.getError(this.objectType)\n\t\t\t\t\t\t\tthis.$emit('save-error', error)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fallback: emit for parent to handle\n\t\t\t\tthis.$emit('save', mergedData)\n\t\t\t} finally {\n\t\t\t\tthis.saving = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Persist the full-form edit dialog result, merged onto the current\n\t\t * object, via the same store path as inline save. Closes on success.\n\t\t *\n\t\t * @param {object} formData The submitted form payload.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onEditConfirm(formData) {\n\t\t\tconst mergedData = foldDottedFields({ ...this.objectData, ...formData }, this.dottedFieldKeys)\n\t\t\tthis.saving = true\n\t\t\ttry {\n\t\t\t\tif (this.objectType) {\n\t\t\t\t\tconst store = this._getObjectStore()\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\tconst result = await saveEdited(store, this.objectType, this.objectData, mergedData)\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tthis.dirtyFields = {}\n\t\t\t\t\t\t\tthis.editData = {}\n\t\t\t\t\t\t\tthis.editModalOpen = false\n\t\t\t\t\t\t\tthis.$emit('saved', result)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$emit('save-error', store.getError(this.objectType))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Fallback: emit for parent to persist.\n\t\t\t\tthis.editModalOpen = false\n\t\t\t\tthis.$emit('save', mergedData)\n\t\t\t} finally {\n\t\t\t\tthis.saving = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the objectStore instance.\n\t\t * Uses the `store` prop if provided, otherwise tries Pinia auto-detection.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\t_getObjectStore() {\n\t\t\t// Prefer explicit store prop\n\t\t\tif (this.store) {\n\t\t\t\treturn this.store\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// useObjectStore is a static import (top of file) — bundler\n\t\t\t\t// resolves it at lib build time so consumer apps don't need\n\t\t\t\t// to resolve the relative path. The try/catch still guards\n\t\t\t\t// the case where the consumer hasn't set up pinia.\n\t\t\t\tconst pinia = this.$pinia\n\t\t\t\tif (!pinia) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn useObjectStore()\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Compute CSS grid placement for a field cell.\n\t\t *\n\t\t * @param {object} field - The field configuration object.\n\t\t */\n\t\tcellStyle(field) {\n\t\t\tconst style = {}\n\t\t\tif (field.gridColumn > 1) {\n\t\t\t\tstyle.gridColumn = `span ${field.gridColumn}`\n\t\t\t}\n\t\t\tif (field.gridRow > 1) {\n\t\t\t\tstyle.gridRow = `span ${field.gridRow}`\n\t\t\t}\n\t\t\treturn style\n\t\t},\n\n\t\t// ── Select helpers ──\n\n\t\t/**\n\t\t * Normalize an option to { id, label } format.\n\t\t * Accepts plain strings or objects with id/label properties.\n\t\t *\n\t\t * @param {string|object} val - Raw option value to normalize.\n\t\t */\n\t\t_normalizeOption(val) {\n\t\t\tif (val && typeof val === 'object' && val.id !== undefined) {\n\t\t\t\treturn { id: val.id, label: val.label || val.id }\n\t\t\t}\n\t\t\treturn { id: val, label: String(val) }\n\t\t},\n\n\t\tgetSelectOptions(field) {\n\t\t\tif (field.enum) {\n\t\t\t\treturn field.enum.map((val) => this._normalizeOption(val))\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\tgetSelectedOption(field) {\n\t\t\tconst val = this.editData[field.key]\n\t\t\tif (val === null || val === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Find matching option from enum for proper label display\n\t\t\tconst options = this.getSelectOptions(field)\n\t\t\treturn options.find((opt) => opt.id === val) || { id: val, label: String(val) }\n\t\t},\n\n\t\t/**\n\t\t * Whether a field picks a Nextcloud group (widget `group` or\n\t\t * `group-multiselect`, from `referenceType: nextcloud-group`).\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisGroupPicker(field) {\n\t\t\treturn !!field && (field.widget === 'group' || field.widget === 'group-multiselect')\n\t\t},\n\n\t\t/**\n\t\t * Whether a field picks a Nextcloud user (widget `user` or\n\t\t * `user-multiselect`, from `referenceType: nextcloud-user`).\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisUserPicker(field) {\n\t\t\treturn !!field && (field.widget === 'user' || field.widget === 'user-multiselect')\n\t\t},\n\n\t\t/**\n\t\t * Whether a field picks a group or a user.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisPersonPicker(field) {\n\t\t\treturn this.isGroupPicker(field) || this.isUserPicker(field)\n\t\t},\n\n\t\t/**\n\t\t * Whether a group or user field holds a list.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisPersonMultiple(field) {\n\t\t\treturn !!field && (field.widget === 'group-multiselect' || field.widget === 'user-multiselect')\n\t\t},\n\n\t\t/**\n\t\t * The group ids a group field holds, for the display mode.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {string[]}\n\t\t */\n\t\tgroupIdsOf(field) {\n\t\t\tconst raw = this.rawOf(field)\n\t\t\tconst list = Array.isArray(raw) ? raw : [raw]\n\t\t\treturn list.filter((v) => typeof v === 'string' && v !== '')\n\t\t},\n\n\t\t/**\n\t\t * The uids a user field holds, for the display mode. The same list\n\t\t * shape a group field holds.\n\t\t *\n\t\t * @spec openspec/changes/a-user-field-reads-its-display-name/specs/data-display/spec.md#requirement-a-user-field-shows-the-users-display-name\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {string[]}\n\t\t */\n\t\tuserIdsOf(field) {\n\t\t\treturn this.groupIdsOf(field)\n\t\t},\n\n\t\t/**\n\t\t * Look up the display names of every user field's value, so the read\n\t\t * mode shows \"Thomas Kuiper\" rather than `thomas.kuiper`. Each uid is\n\t\t * asked once per widget.\n\t\t *\n\t\t * @spec openspec/changes/a-user-field-reads-its-display-name/specs/data-display/spec.md#requirement-a-user-field-shows-the-users-display-name\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync resolveUserNames() {\n\t\t\tconst fields = (this.resolvedFields || []).filter((field) => this.isUserPicker(field))\n\t\t\tawait Promise.all(fields.map((field) => this.resolvePersonLabels(field, this.rawOf(field))))\n\t\t},\n\n\t\t/**\n\t\t * The display name of a group id or uid, falling back to the id.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {string} id The group id or uid.\n\t\t * @return {string}\n\t\t */\n\t\tpersonLabel(field, id) {\n\t\t\tif (this.isGroupPicker(field)) {\n\t\t\t\treturn groupDisplayName(id) || String(id)\n\t\t\t}\n\t\t\treturn this.userLabels[id] || String(id)\n\t\t},\n\n\t\t/**\n\t\t * Search Nextcloud groups or users for a picker. Fails soft (the\n\t\t * helpers return `[]`), so the picker stays usable with what it has.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {string} query The search term.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync searchPeople(field, query) {\n\t\t\tthis.personLoading = field.key\n\t\t\ttry {\n\t\t\t\tconst options = this.isGroupPicker(field)\n\t\t\t\t\t? await searchNextcloudGroups(query || '')\n\t\t\t\t\t: await searchNextcloudUsers(query || '')\n\t\t\t\tconst list = Array.isArray(options) ? options : []\n\t\t\t\tif (this.isUserPicker(field)) {\n\t\t\t\t\tconst labels = { ...this.userLabels }\n\t\t\t\t\tfor (const opt of list) {\n\t\t\t\t\t\tlabels[opt.id] = opt.label\n\t\t\t\t\t}\n\t\t\t\t\tthis.userLabels = labels\n\t\t\t\t}\n\t\t\t\tthis.personOptions = { ...this.personOptions, [field.key]: list }\n\t\t\t} finally {\n\t\t\t\tif (this.personLoading === field.key) {\n\t\t\t\t\tthis.personLoading = null\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Look up the display names of the value a group or user field holds,\n\t\t * so the open editor shows names rather than ids.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {unknown} value The held value (an id or a list of ids).\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync resolvePersonLabels(field, value) {\n\t\t\tconst ids = (Array.isArray(value) ? value : [value])\n\t\t\t\t.filter((v) => typeof v === 'string' && v !== '')\n\t\t\tif (this.isGroupPicker(field)) {\n\t\t\t\tawait Promise.all(ids.map((gid) => loadGroupDisplayName(gid)))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst unknown = ids.filter((uid) => !this.userLabels[uid])\n\t\t\tconst options = await Promise.all(unknown.map((uid) => resolveNextcloudUser(uid)))\n\t\t\tif (options.length > 0) {\n\t\t\t\tconst labels = { ...this.userLabels }\n\t\t\t\tfor (const opt of options) {\n\t\t\t\t\tif (opt && opt.id) {\n\t\t\t\t\t\tlabels[opt.id] = opt.label || opt.id\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.userLabels = labels\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The selected option(s) of a group or user picker.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {object|object[]|null}\n\t\t */\n\t\tpersonSelected(field) {\n\t\t\tconst toOption = (id) => {\n\t\t\t\tconst label = this.personLabel(field, id)\n\t\t\t\treturn { id, label, displayName: label }\n\t\t\t}\n\t\t\tconst v = this.editData[field.key]\n\t\t\tif (this.isPersonMultiple(field)) {\n\t\t\t\treturn (Array.isArray(v) ? v : [])\n\t\t\t\t\t.filter((id) => typeof id === 'string' && id !== '')\n\t\t\t\t\t.map(toOption)\n\t\t\t}\n\t\t\treturn (typeof v === 'string' && v !== '') ? toOption(v) : null\n\t\t},\n\n\t\t/**\n\t\t * Store a group or user choice as the id (or list of ids).\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {object|object[]|null} selected The chosen option(s).\n\t\t */\n\t\tonPersonChange(field, selected) {\n\t\t\tif (this.isPersonMultiple(field)) {\n\t\t\t\tconst ids = (Array.isArray(selected) ? selected : [])\n\t\t\t\t\t.map((opt) => (opt && typeof opt === 'object' ? opt.id : opt))\n\t\t\t\t\t.filter((id) => typeof id === 'string' && id !== '')\n\t\t\t\tthis.updateField(field.key, ids)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (selected && this.isUserPicker(field) && selected.id) {\n\t\t\t\tthis.userLabels = { ...this.userLabels, [selected.id]: selected.label || selected.id }\n\t\t\t}\n\t\t\tthis.updateField(field.key, selected && selected.id ? selected.id : null)\n\t\t},\n\n\t\tonSelectChange(field, option) {\n\t\t\tthis.updateField(field.key, option ? option.id : null)\n\t\t},\n\n\t\tgetMultiselectOptions(field) {\n\t\t\t// Check override enum first, then schema items.enum\n\t\t\tif (field.enum) {\n\t\t\t\treturn field.enum.map((val) => this._normalizeOption(val))\n\t\t\t}\n\t\t\tconst itemsEnum = field.items && field.items.enum\n\t\t\tif (itemsEnum) {\n\t\t\t\treturn itemsEnum.map((val) => this._normalizeOption(val))\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\tgetSelectedMultiselectOptions(field) {\n\t\t\tconst val = this.editData[field.key]\n\t\t\tif (!Array.isArray(val)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\t// Map selected IDs to option objects with labels\n\t\t\tconst options = this.getMultiselectOptions(field)\n\t\t\treturn val.map((v) => options.find((opt) => opt.id === v) || { id: v, label: String(v) })\n\t\t},\n\n\t\tonMultiselectChange(field, selected) {\n\t\t\tconst values = Array.isArray(selected)\n\t\t\t\t? selected.map((opt) => opt.id || opt)\n\t\t\t\t: []\n\t\t\tthis.updateField(field.key, values)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-data-widget__image {\n\tmax-width: 100%;\n\tmax-height: 160px;\n\tborder-radius: 8px;\n\tobject-fit: cover;\n}\n\n/* Shimmering placeholder while a relation's display name resolves. */\n.cn-object-data-widget__skeleton {\n\tdisplay: inline-block;\n\twidth: 90px;\n\theight: 1em;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-background-dark) 25%, var(--color-background-hover) 50%, var(--color-background-dark) 75%);\n\tbackground-size: 200% 100%;\n\tanimation: cn-odw-shimmer 1.2s ease-in-out infinite;\n}\n\n@keyframes cn-odw-shimmer {\n\tfrom { background-position: 200% 0; }\n\tto { background-position: -200% 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.cn-object-data-widget__skeleton { animation: none; }\n}\n\n.cn-object-data-widget__grid {\n\tdisplay: grid;\n\tgap: calc(2 * var(--default-grid-baseline, 4px)) calc(4 * var(--default-grid-baseline, 4px));\n}\n\n.cn-object-data-widget__toggle {\n\tmargin-top: 4px;\n}\n\n.cn-object-data-widget__cell {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tpadding: calc(2 * var(--default-grid-baseline, 4px)) 0;\n\tborder-bottom: 1px solid var(--color-border-dark);\n\tmin-width: 0;\n}\n\n.cn-object-data-widget__label {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-weight: 500;\n}\n\n.cn-object-data-widget__value {\n\tfont-size: 1em;\n\tcolor: var(--color-main-text);\n\toverflow-wrap: anywhere;\n\tposition: relative;\n\tpadding-right: 20px;\n}\n\n/* The hover box bleeds 4px past the text on the top, bottom and start so the\n fill reads as a hit area rather than a highlight. Not on the end: the cell is\n the last column's full width, and 4px past it is 4px past the scroll region,\n which drew a horizontal scrollbar under every data widget in a tab (dossiq's\n case page, Data tab). The end padding drops by the same 4px so the text and\n the edit icon sit where they sat. */\n.cn-object-data-widget__value--editable {\n\tcursor: pointer;\n\tborder-radius: var(--border-radius);\n\tpadding: 4px 20px 4px 4px;\n\tmargin: -4px 0 -4px -4px;\n}\n\n.cn-object-data-widget__value--editable:hover {\n\tbackground: var(--color-background-dark);\n}\n\n.cn-object-data-widget__value--editable:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n.cn-object-data-widget__value--empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-style: italic;\n}\n\n.cn-object-data-widget__edit-icon {\n\tposition: absolute;\n\tright: 4px;\n\ttop: 50%;\n\ttransform: translateY(-50%);\n\tcolor: var(--color-text-maxcontrast);\n\topacity: 0;\n\ttransition: opacity 0.15s ease;\n}\n\n.cn-object-data-widget__value--editable:hover .cn-object-data-widget__edit-icon,\n.cn-object-data-widget__value--editable:focus-visible .cn-object-data-widget__edit-icon {\n\topacity: 1;\n}\n\n.cn-object-data-widget__editor {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-object-data-widget__editor-actions {\n\tdisplay: flex;\n\tgap: 2px;\n\tjustify-content: flex-end;\n}\n\n.cn-object-data-widget__textarea {\n\twidth: 100%;\n\tmin-height: 80px;\n\tpadding: 8px;\n\tborder: 2px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tresize: vertical;\n}\n\n.cn-object-data-widget__textarea:focus {\n\tborder-color: var(--color-primary-element);\n\toutline: none;\n}\n\n.cn-object-data-widget__footnote {\n\tmargin: calc(var(--default-grid-baseline, 4px) * 3) 0 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-object-data-widget__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-style: italic;\n\tpadding: calc(2 * var(--default-grid-baseline, 4px));\n}\n\n/* Compact inline table for array-of-objects values. Dense + unstyled-simple;\n fits the card and participates in the whole-row overflow handling. */\n.cn-object-data-widget__mini-table-wrap {\n\tmax-width: 100%;\n}\n\n.cn-object-data-widget__mini-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 0.9em;\n}\n\n.cn-object-data-widget__mini-table th,\n.cn-object-data-widget__mini-table td {\n\ttext-align: start;\n\tpadding: 2px 8px 2px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tvertical-align: top;\n\toverflow-wrap: anywhere;\n\t/* The cells wrap whatever an ancestor says: a `nowrap` inherited from the\n\t surface made a message and a timestamp column 766px wide in a 212px value\n\t cell, and the card 8px wider than its cell (pipelinq's ticket page). */\n\twhite-space: normal;\n}\n\n.cn-object-data-widget__mini-table th {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-weight: 500;\n}\n\n.cn-object-data-widget__more {\n\tmargin-top: 2px;\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n/* Comma-less chip row for array-of-scalars values. */\n.cn-object-data-widget__chips {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n}\n\n.cn-object-data-widget__chip {\n\tpadding: 1px 8px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 0.9em;\n}\n\n/* Key: value definition list for a single plain-object value. */\n.cn-object-data-widget__deflist {\n\tdisplay: grid;\n\tgrid-template-columns: auto 1fr;\n\tgap: 2px 8px;\n\tmargin: 0;\n}\n\n.cn-object-data-widget__deflist dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n}\n\n.cn-object-data-widget__deflist dd {\n\tmargin: 0;\n\toverflow-wrap: anywhere;\n}\n\n/* A long description keeps its own paragraphs. Set on an inline span with no\n surrounding template whitespace, so only the value's own line breaks show. */\n.cn-object-data-widget__deflist-text {\n\twhite-space: pre-wrap;\n}\n\n.cn-object-data-widget__deflist--nested {\n\tpadding-inline-start: 8px;\n\tborder-inline-start: 2px solid var(--color-border);\n}\n\n/* Responsive: collapse to single column on narrow widths */\n@media (max-width: 600px) {\n\t.cn-object-data-widget__grid {\n\t\tgrid-template-columns: 1fr !important;\n\t}\n\n\t.cn-object-data-widget__cell {\n\t\tgrid-column: span 1 !important;\n\t\tgrid-row: span 1 !important;\n\t}\n}\n</style>\n"],"names":["CnIcon","CnGroupNameCell","CnWidgetWrapper","CnObjectMetadataModal","CnFormDialog","t","axios"],"mappings":"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"}
1
+ {"version":3,"file":"CnObjectDataWidget.vue2.js","sources":["../../../../src/components/CnObjectDataWidget/CnObjectDataWidget.vue"],"sourcesContent":["<!--\n CnObjectDataWidget — Schema-driven editable data grid widget.\n\n Displays object properties in a CSS grid layout, auto-generated from a JSON Schema.\n Each cell shows a formatted value. Clicking an editable cell opens an inline editor\n matching the property type (text, select, date, checkbox, textarea, etc.).\n When any value is changed, a Save button appears in the widget header.\n\n Supports per-property overrides for order, grid span, visibility, editability, and widget type.\n-->\n<template>\n\t<CnWidgetWrapper\n\t\t:title=\"title\"\n\t\t:showTitle=\"showTitle\"\n\t\t:showActions=\"showActions\"\n\t\t:borderless=\"borderless\"\n\t\t:flush=\"flush\"\n\t\t:chromeless=\"chromeless\"\n\t\t:widgetId=\"widgetId || objectType\"\n\t\t:documentationUrl=\"documentationUrl\"\n\t\t:titleIconPosition=\"(iconComponent || iconName) ? 'left' : 'right'\">\n\t\t<template v-if=\"iconName\" #title-icon>\n\t\t\t<CnIcon :name=\"iconName\" :size=\"20\" />\n\t\t</template>\n\t\t<template v-else-if=\"iconComponent\" #title-icon>\n\t\t\t<component :is=\"iconComponent\" :size=\"20\" />\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"isDirty\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"saving\"\n\t\t\t\t@click=\"save\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"saving\" :size=\"20\" />\n\t\t\t\t\t<ContentSaveOutline v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saveLabel }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"isDirty\"\n\t\t\t\t@click=\"discard\">\n\t\t\t\t{{ discardLabel }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\t\t<!-- Object-specific item appended after the built-in\n\t\t Refresh / Documentation / Request-a-feature trio. -->\n\t\t<template #action-items>\n\t\t\t<NcActionButton\n\t\t\t\tv-if=\"editable\"\n\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t@click=\"editModalOpen = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Pencil :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ editLabel }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionButton\n\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t@click=\"metadataModalOpen = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<InformationOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ metadataLabel }}\n\t\t\t</NcActionButton>\n\t\t</template>\n\n\t\t<!-- Empty state -->\n\t\t<div v-if=\"!resolvedFields.length\" class=\"cn-object-data-widget__empty\">\n\t\t\t{{ emptyLabel }}\n\t\t</div>\n\n\t\t<!-- Collapsed, the grid shows the fields that fit the cell (or the\n\t\t first `collapsedFields`); \"Show all N fields\" renders the rest. -->\n\t\t<div v-else class=\"cn-object-data-widget__grid-wrap\">\n\t\t\t<div ref=\"grid\" class=\"cn-object-data-widget__grid\" :style=\"gridStyle\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"field in visibleFields\"\n\t\t\t\t\t:key=\"field.key\"\n\t\t\t\t\tclass=\"cn-object-data-widget__cell\"\n\t\t\t\t\t:style=\"cellStyle(field)\">\n\t\t\t\t\t<!-- Label -->\n\t\t\t\t\t<div class=\"cn-object-data-widget__label\">\n\t\t\t\t\t\t{{ field.label }}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Editing mode for this field -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"editingField === field.key\"\n\t\t\t\t\t\tclass=\"cn-object-data-widget__editor\">\n\t\t\t\t\t\t<!-- Per-field slot override -->\n\t\t\t\t\t\t<slot\n\t\t\t\t\t\t\tv-if=\"$slots['field-' + field.key]\"\n\t\t\t\t\t\t\t:name=\"'field-' + field.key\"\n\t\t\t\t\t\t\t:field=\"field\"\n\t\t\t\t\t\t\t:value=\"editData[field.key]\"\n\t\t\t\t\t\t\t:update=\"(val) => updateField(field.key, val)\"\n\t\t\t\t\t\t\t:cancel=\"cancelEdit\" />\n\n\t\t\t\t\t\t<!-- Auto-generated editor -->\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t<!-- Text / Email / URL -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-if=\"field.widget === 'text' || field.widget === 'email' || field.widget === 'url'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] != null ? String(editData[field.key]) : ''\"\n\t\t\t\t\t\t\t\t:type=\"field.widget === 'email' ? 'email' : field.widget === 'url' ? 'url' : 'text'\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Number -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] != null ? String(editData[field.key]) : ''\"\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val !== '' ? Number(val) : null)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Textarea -->\n\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__textarea\"\n\t\t\t\t\t\t\t\t:value=\"editData[field.key] || ''\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\trows=\"4\"\n\t\t\t\t\t\t\t\t@input=\"updateField(field.key, $event.target.value)\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Relation ($ref / x-openregister-relation): pick the\n\t\t\t\t\t\t referenced object by NAME — the raw uuid is never a\n\t\t\t\t\t\t user-facing value (ADR-062). Options load from the\n\t\t\t\t\t\t target schema on edit start. Array relations keep\n\t\t\t\t\t\t their generic editor for now. -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"isSingleRelationField(field.key)\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:options=\"relationOptions[field.key] || []\"\n\t\t\t\t\t\t\t\t:modelValue=\"relationSelectedOption(field)\"\n\t\t\t\t\t\t\t\t:loading=\"relationOptionsLoading\"\n\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onRelationChange(field, $event)\"\n\t\t\t\t\t\t\t\t@close=\"commitEdit\" />\n\n\t\t\t\t\t\t\t<!-- Nextcloud group or user (`referenceType: nextcloud-group`\n\t\t\t\t\t\t / `nextcloud-user`, one or a list): pick by display name,\n\t\t\t\t\t\t store the group id or uid. The same search the create and\n\t\t\t\t\t\t edit dialogs use. -->\n\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t:is=\"isUserPicker(field) ? 'NcSelectUsers' : 'NcSelect'\"\n\t\t\t\t\t\t\t\tv-else-if=\"isPersonPicker(field)\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:inputLabel=\"field.label\"\n\t\t\t\t\t\t\t\t:labelOutside=\"true\"\n\t\t\t\t\t\t\t\t:options=\"personOptions[field.key] || []\"\n\t\t\t\t\t\t\t\t:modelValue=\"personSelected(field)\"\n\t\t\t\t\t\t\t\t:multiple=\"isPersonMultiple(field)\"\n\t\t\t\t\t\t\t\t:keepOpen=\"isPersonMultiple(field)\"\n\t\t\t\t\t\t\t\t:loading=\"personLoading === field.key\"\n\t\t\t\t\t\t\t\t:filterable=\"false\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t@search=\"(q) => searchPeople(field, q)\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onPersonChange(field, $event)\"\n\t\t\t\t\t\t\t\t@close=\"isPersonMultiple(field) ? undefined : commitEdit()\" />\n\n\t\t\t\t\t\t\t<!-- Select -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'select'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:options=\"getSelectOptions(field)\"\n\t\t\t\t\t\t\t\t:modelValue=\"getSelectedOption(field)\"\n\t\t\t\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onSelectChange(field, $event)\"\n\t\t\t\t\t\t\t\t@close=\"commitEdit\" />\n\n\t\t\t\t\t\t\t<!-- Multiselect -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'multiselect'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:options=\"getMultiselectOptions(field)\"\n\t\t\t\t\t\t\t\t:modelValue=\"getSelectedMultiselectOptions(field)\"\n\t\t\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t\t\t:keepOpen=\"true\"\n\t\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"onMultiselectChange(field, $event)\" />\n\n\t\t\t\t\t\t\t<!-- Tags -->\n\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'tags'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] || []\"\n\t\t\t\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t\t\t\t:keepOpen=\"true\"\n\t\t\t\t\t\t\t\t:taggable=\"true\"\n\t\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\" />\n\n\t\t\t\t\t\t\t<!-- Checkbox / Switch -->\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t\t\t\t:modelValue=\"!!editData[field.key]\"\n\t\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => { updateField(field.key, val); commitEdit() }\">\n\t\t\t\t\t\t\t\t{{ editData[field.key] ? 'Yes' : 'No' }}\n\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t\t\t\t<!-- Date -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'date'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] || ''\"\n\t\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Datetime -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else-if=\"field.widget === 'datetime'\"\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] || ''\"\n\t\t\t\t\t\t\t\ttype=\"datetime-local\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\n\t\t\t\t\t\t\t<!-- Fallback: text -->\n\t\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\tref=\"activeEditor\"\n\t\t\t\t\t\t\t\t:modelValue=\"editData[field.key] != null ? String(editData[field.key]) : ''\"\n\t\t\t\t\t\t\t\t:placeholder=\"field.description\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"val => updateField(field.key, val)\"\n\t\t\t\t\t\t\t\t@keydown.enter=\"commitEdit\"\n\t\t\t\t\t\t\t\t@keydown.escape=\"cancelEdit\" />\n\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t<!-- Confirm/Cancel for non-auto-committing editors -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.widget !== 'checkbox'\"\n\t\t\t\t\t\t\tclass=\"cn-object-data-widget__editor-actions\">\n\t\t\t\t\t\t\t<NcButton variant=\"tertiary-no-background\" @click=\"commitEdit\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Check :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton variant=\"tertiary-no-background\" @click=\"cancelEdit\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Display mode -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tclass=\"cn-object-data-widget__value\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'cn-object-data-widget__value--editable': isEditable(field),\n\t\t\t\t\t\t\t'cn-object-data-widget__value--empty': isValueEmpty(field.key),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:tabindex=\"isEditable(field) ? 0 : -1\"\n\t\t\t\t\t\t:role=\"isEditable(field) ? 'button' : undefined\"\n\t\t\t\t\t\t:aria-label=\"isEditable(field) ? t('nextcloud-vue', 'Edit {title}', { title: field.label }) : undefined\"\n\t\t\t\t\t\t@click=\"isEditable(field) && startEdit(field)\"\n\t\t\t\t\t\t@keydown.enter=\"isEditable(field) && startEdit(field)\">\n\t\t\t\t\t\t<!-- Per-field display slot override -->\n\t\t\t\t\t\t<slot\n\t\t\t\t\t\t\tv-if=\"$slots['display-' + field.key]\"\n\t\t\t\t\t\t\t:name=\"'display-' + field.key\"\n\t\t\t\t\t\t\t:field=\"field\"\n\t\t\t\t\t\t\t:value=\"displayValues[field.key]\"\n\t\t\t\t\t\t\t:raw=\"(objectData || {})[field.key]\" />\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t<!-- A Nextcloud group (or list): its display name, cached\n\t\t\t\t\t\t\t per id; the id while the name loads or when unknown. -->\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"isGroupPicker(field) && groupIdsOf(field).length\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__groups\">\n\t\t\t\t\t\t\t\t<template v-for=\"(gid, gi) in groupIdsOf(field)\" :key=\"gid\">\n\t\t\t\t\t\t\t\t\t<span v-if=\"gi > 0\">, </span>\n\t\t\t\t\t\t\t\t\t<CnGroupNameCell :gid=\"gid\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<!-- A Nextcloud user (or list): the display name, the\n\t\t\t\t\t\t\t uid while it loads or when it cannot be found. -->\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-else-if=\"isUserPicker(field) && userIdsOf(field).length\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__users\"\n\t\t\t\t\t\t\t\t:title=\"userIdsOf(field).join(', ')\">\n\t\t\t\t\t\t\t\t{{ userIdsOf(field).map((uid) => personLabel(field, uid)).join(', ') }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<img v-else-if=\"isImageField(field) && rawOf(field)\"\n\t\t\t\t\t\t\t\t:src=\"rawOf(field)\"\n\t\t\t\t\t\t\t\t:alt=\"field.label\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__image\">\n\t\t\t\t\t\t\t<!-- Relation name still resolving: a quiet skeleton bar,\n\t\t\t\t\t\t never a raw uuid or a bare '…' (ADR-062). -->\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-else-if=\"isRelationPending(field)\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__skeleton\"\n\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Loading')\" />\n\t\t\t\t\t\t\t<!-- Array of OBJECTS → compact inline table (union of the\n\t\t\t\t\t\t first rows' keys, capped at 5 columns / 5 rows) so a\n\t\t\t\t\t\t structured value renders legibly instead of\n\t\t\t\t\t\t \"[object Object]\" (ADR-062). -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-else-if=\"fieldValueKind(field) === 'object-array'\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__mini-table-wrap\">\n\t\t\t\t\t\t\t\t<table class=\"cn-object-data-widget__mini-table\">\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th v-for=\"col in objectArrayColumns(rawOf(field))\" :key=\"col\">\n\t\t\t\t\t\t\t\t\t\t\t\t{{ col }}\n\t\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t<tr v-for=\"(row, ri) in objectArrayRows(rawOf(field))\" :key=\"ri\">\n\t\t\t\t\t\t\t\t\t\t\t<td v-for=\"col in objectArrayColumns(rawOf(field))\" :key=\"col\">\n\t\t\t\t\t\t\t\t\t\t\t\t{{ stringifyCell(row && row[col]) }}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t<div v-if=\"rawOf(field).length > 5\" class=\"cn-object-data-widget__more\">\n\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', '{count} more', { count: rawOf(field).length - 5 }) }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<!-- Array of SCALARS → comma-separated chips. -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-else-if=\"fieldValueKind(field) === 'scalar-array'\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__chips\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-for=\"(v, ci) in rawOf(field)\"\n\t\t\t\t\t\t\t\t\t:key=\"ci\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__chip\">\n\t\t\t\t\t\t\t\t\t{{ stringifyCell(v) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<!-- Single plain OBJECT → key: value definition list; a\n\t\t\t\t\t\t\t nested plain object (e.g. a per-language map) gets\n\t\t\t\t\t\t\t its own list one level down. -->\n\t\t\t\t\t\t\t<dl\n\t\t\t\t\t\t\t\tv-else-if=\"fieldValueKind(field) === 'object'\"\n\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__deflist\">\n\t\t\t\t\t\t\t\t<template v-for=\"(pair, pi) in objectEntries(rawOf(field))\" :key=\"pi\">\n\t\t\t\t\t\t\t\t\t<dt>\n\t\t\t\t\t\t\t\t\t\t{{ nestedLabel(field, [pair[0]]) }}\n\t\t\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t\t\t<dd>\n\t\t\t\t\t\t\t\t\t\t<dl\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"isPlainObject(pair[1])\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"cn-object-data-widget__deflist cn-object-data-widget__deflist--nested\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-for=\"(sub, si) in objectEntries(pair[1])\" :key=\"si\">\n\t\t\t\t\t\t\t\t\t\t\t\t<dt>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{ nestedLabel(field, [pair[0], sub[0]]) }}\n\t\t\t\t\t\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t\t\t\t\t\t<dd>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"cn-object-data-widget__deflist-text\">{{ stringifyNested(sub[1]) }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t\t\t\t<span v-else class=\"cn-object-data-widget__deflist-text\">{{ stringifyNested(pair[1]) }}</span>\n\t\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ displayValues[field.key] }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<Pencil\n\t\t\t\t\t\t\tv-if=\"isEditable(field)\"\n\t\t\t\t\t\t\tclass=\"cn-object-data-widget__edit-icon\"\n\t\t\t\t\t\t\t:size=\"14\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"hasHiddenFields\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\twide\n\t\t\t\tclass=\"cn-object-data-widget__toggle\"\n\t\t\t\t:aria-expanded=\"expanded ? 'true' : 'false'\"\n\t\t\t\t@click=\"toggleExpanded\">\n\t\t\t\t{{ expanded ? collapseFieldsLabel : showAllFieldsLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<p v-if=\"footnote\" class=\"cn-object-data-widget__footnote\" data-testid=\"cn-object-data-widget-footnote\">\n\t\t\t{{ cnTranslate(footnote) }}\n\t\t</p>\n\n\t\t<!-- Read-only @self metadata, surfaced on demand from the\n\t\t Metadata action item rather than as a permanent page widget. -->\n\t\t<CnObjectMetadataModal\n\t\t\tv-if=\"metadataModalOpen\"\n\t\t\t:objectData=\"objectData\"\n\t\t\t@close=\"metadataModalOpen = false\" />\n\n\t\t<!-- Full-form edit (alongside the per-field inline editing) — schema-driven\n\t\t dialog pre-filled with the current object; saves via the same path. -->\n\t\t<CnFormDialog\n\t\t\tv-if=\"editModalOpen\"\n\t\t\t:schema=\"schema\"\n\t\t\t:item=\"objectData\"\n\t\t\t:dialogTitle=\"editLabel\"\n\t\t\t:overrides=\"resolvedOverrides\"\n\t\t\t:excludeFields=\"exclude\"\n\t\t\t:includeFields=\"include\"\n\t\t\t:size=\"formSize\"\n\t\t\t:columns=\"formColumns\"\n\t\t\t@confirm=\"onEditConfirm\"\n\t\t\t@close=\"editModalOpen = false\" />\n\t</CnWidgetWrapper>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcActionButton, NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcSelect, NcSelectUsers, NcTextField } from '@nextcloud/vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentSaveOutline from 'vue-material-design-icons/ContentSaveOutline.vue'\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport CnGroupNameCell from '../CnCellRenderer/CnGroupNameCell.vue'\nimport CnFormDialog from '../CnFormDialog/CnFormDialog.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { useObjectStore } from '../../store/index.js'\nimport { formatTermDuration } from '../../utils/builtInFormatters.js'\nimport { foldDottedFields, isDottedKey, spreadDottedFields } from '../../utils/dottedFields.js'\nimport { groupDisplayName, loadGroupDisplayName, searchNextcloudGroups } from '../../utils/groupAutocomplete.js'\nimport { humaniseKey } from '../../utils/humaniseKey.js'\nimport { PANEL_ACTION_SINK } from '../../utils/panelActions.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\nimport { saveEdited } from '../../utils/saveEdited.js'\nimport { fieldsFromSchema, formatValue } from '../../utils/schema.js'\nimport { schemaRefSlug } from '../../utils/schemaRefSlug.js'\nimport { resolveNextcloudUser, searchNextcloudUsers } from '../../utils/userAutocomplete.js'\nimport { evaluateVisibleWhenLocal, isLocallyDecidableVisibleWhen } from '../../utils/visibleWhen.js'\nimport { CnIcon } from '../CnIcon/index.js'\nimport { CnObjectMetadataModal } from '../CnObjectMetadataModal/index.js'\nimport { CnWidgetWrapper } from '../CnWidgetWrapper/index.js'\n\n// Widgets whose value the inline text fallback would corrupt.\nconst STRUCTURED_WIDGETS = ['json', 'code', 'file', 'sub-objects', 'child-records']\n\n/**\n * CnObjectDataWidget — Schema-driven editable data grid widget.\n *\n * Renders object properties in a configurable CSS grid. Each property is displayed\n * as a label-value cell. Editable cells can be clicked to switch to inline editing.\n * Uses the objectStore to persist changes.\n *\n * Basic usage\n * ```vue\n * <CnObjectDataWidget\n * title=\"Character Info\"\n * :schema=\"schema\"\n * :object-data=\"character\"\n * object-type=\"characters\"\n * :overrides=\"{\n * name: { order: 1, gridColumn: 2 },\n * description: { order: 2, gridColumn: 3, gridRow: 2 },\n * status: { order: 3 },\n * internalId: { hidden: true },\n * }\" />\n * ```\n *\n * Read-only mode\n * ```vue\n * <CnObjectDataWidget\n * title=\"Summary\"\n * :schema=\"schema\"\n * :object-data=\"item\"\n * :editable=\"false\" />\n * ```\n */\nexport default {\n\tname: 'CnObjectDataWidget',\n\n\tcomponents: {\n\t\tCnIcon,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t\tNcSelect,\n\t\tNcSelectUsers,\n\t\tCnGroupNameCell,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcActionButton,\n\t\tCnWidgetWrapper,\n\t\tCnObjectMetadataModal,\n\t\tCnFormDialog,\n\t\tContentSaveOutline,\n\t\tInformationOutline,\n\t\tPencil,\n\t\tCheck,\n\t\tClose,\n\t},\n\n\tinject: {\n\t\t/** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/**\n\t\t * Detail-page object context (`{ objectId, register, schema }`) provided\n\t\t * by CnDetailPage. Supplies the register that bare-slug `$ref` relation\n\t\t * properties resolve against (an OpenRegister `$ref: \"caseType\"` means\n\t\t * \"schema caseType in the SAME register\"). Null on other surfaces —\n\t\t * bare-slug refs then stay unresolved (shortened id fallback).\n\t\t */\n\t\tcnObjectContext: { default: null },\n\t\t/**\n\t\t * Consumer translation function, provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). Field\n\t\t * labels/descriptions come from schema property titles, authored in\n\t\t * English as the canonical source; the visible label is resolved\n\t\t * through this function so it follows the user's language. Defaults to\n\t\t * identity when used standalone (no CnAppRoot ancestor).\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/**\n\t\t * Formatter registry, provided by CnAppRoot (`cnFormatters`: the\n\t\t * library's built-ins plus the app's `formatters`). A field override\n\t\t * `{ formatter: '<id>' }` renders the value through the same function a\n\t\t * table column with that `formatter` uses. Empty when used standalone.\n\t\t */\n\t\tcnFormatters: { default: () => ({}) },\n\t\t/**\n\t\t * The host surface's panel-action channel, when this widget is rendered\n\t\t * in a tab panel. Null everywhere else, which is every other surface.\n\t\t *\n\t\t * A panel draws no header, so the items this widget would put in its own\n\t\t * overflow menu have nowhere to go. Publishing them here puts them in\n\t\t * the strip's menu instead; see utils/panelActions.js.\n\t\t */\n\t\tpanelActionSink: { from: PANEL_ACTION_SINK, default: null },\n\t},\n\n\tprops: {\n\t\t/** Widget title shown in the widget header. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Data'),\n\t\t},\n\n\t\t/**\n\t\t * Draw the header's title row.\n\t\t *\n\t\t * Set false inside a tab panel, where the open tab already names the\n\t\t * panel. The header itself still renders whenever there are actions, so\n\t\t * the Save button an inline edit needs does not vanish with the title —\n\t\t * that is the whole reason this is separate from the actions.\n\t\t *\n\t\t * It exists because `title` carries a DEFAULT of \"Data\". A host that\n\t\t * wanted no title passed `undefined` and got the default instead, which\n\t\t * is how a tab panel ended up with a \"Data\" heading nobody chose.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tshowTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Show the overflow Actions menu in the header.\n\t\t *\n\t\t * Worth switching off where a host already offers one within a few\n\t\t * pixels. A tab panel is that case: the tab strip carries its own Actions\n\t\t * menu, so a second copy inside the panel bought a header band to hold\n\t\t * it and nothing else.\n\t\t *\n\t\t * Switching it off costs the widget nothing, because the two items it\n\t\t * holds travel instead of vanishing. Metadata and the full edit dialog are\n\t\t * published to the host surface and render in its menu, each still opening\n\t\t * THIS widget's dialog with this widget's `overrides`, `include` and\n\t\t * `exclude` applied. That scoping is the reason they are published rather\n\t\t * than left to the page: a detail page does carry its own record Edit, but\n\t\t * it opens the form the page configures, not the subset declared here. See\n\t\t * utils/panelActions.js. Inline editing never used the menu at all: a cell\n\t\t * opens its editor when clicked, and Save and Discard appear in the\n\t\t * `actions` slot from the moment there is an edit to commit.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tshowActions: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Drop the card border and background, for a host that draws its own.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tborderless: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Drop the content padding, for a host that supplies its own inset.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tflush: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Draw no card at all: no border, no background, no content padding,\n\t\t * no title row, no header divider. What a tab panel wants, in one word\n\t\t * instead of three, and the word `CnDetailWidgetHost` already uses for\n\t\t * this on its integration path.\n\t\t *\n\t\t * It had to become a real prop. Until it was one, a `chromeless` passed\n\t\t * here fell into `$attrs`, landed on the wrapper's root element as a\n\t\t * plain HTML attribute, and changed nothing — a caller asking for the\n\t\t * documented thing got a silent no-op with an attribute in the DOM to\n\t\t * suggest it had worked.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tchromeless: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Optional MDI icon component for the header. */\n\t\ticon: {\n\t\t\ttype: [Object, Function, String],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Documentation link surfaced in the widget's overflow Actions\n\t\t * menu. Empty (the default) hides the Documentation item; the\n\t\t * Refresh and Request-a-feature items always render.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Stable id forwarded to the widget chrome for the Refresh /\n\t\t * Request-a-feature payloads. Falls back to `objectType`, then to a\n\t\t * slugified title.\n\t\t */\n\t\twidgetId: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The JSON Schema describing the object's properties.\n\t\t * Must have a `properties` field.\n\t\t * Optional: null renders the empty state (no fields) — e.g. while the\n\t\t * schema is still being fetched on surfaces that mount before it loads\n\t\t * (a `data` tab in CnObjectSidebar).\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The object data to display and edit.\n\t\t * Keys should match the schema property keys.\n\t\t * Optional: null while the object is still loading; all internal reads\n\t\t * guard with `this.objectData || {}`.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The registered object type slug in the objectStore.\n\t\t * Required for saving via objectStore.saveObject().\n\t\t */\n\t\tobjectType: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Optional objectStore instance. When provided, used directly for saving.\n\t\t * When not provided, falls back to auto-detecting the store via Pinia.\n\t\t */\n\t\tstore: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Per-property configuration overrides.\n\t\t * Keys are property names, values are override objects.\n\t\t *\n\t\t * Supported overrides:\n\t\t * - `order` (number) — Display order (lower = first)\n\t\t * - `gridColumn` (number) — Number of grid columns to span (default 1)\n\t\t * - `gridRow` (number) — Number of grid rows to span (default 1)\n\t\t * - `hidden` (boolean) — Hide this property\n\t\t * - `editable` (boolean) — Override editability (default: based on schema readOnly)\n\t\t * - `label` (string) — Override the display label\n\t\t * - `emptyValue` (string) — Words shown, translated, for an empty or false value instead of a dash\n\t\t * - `widget` (string) — Override the widget type for editing\n\t\t * - `formatter` (string) — Display the value through the formatter\n\t\t * registered under this id on CnAppRoot (`cnFormatters`), called as\n\t\t * `(value, object, property)` like a table cell's formatter. An id\n\t\t * nobody registered, or a formatter that throws, keeps the default\n\t\t * rendering. Editing still writes the stored value.\n\t\t *\n\t\t * Accepts an Array too: an empty overrides map (`{}`) round-trips through\n\t\t * PHP/JSON as an empty Array (`[]`), so a persisted manifest can deliver\n\t\t * `[]`. `resolvedOverrides` coerces that back to `{}`.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\toverrides: {\n\t\t\ttype: [Object, Array],\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * Number of grid columns. The board look fits 200px columns instead,\n\t\t * except for one column, which it keeps.\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Number,\n\t\t\tdefault: 3,\n\t\t},\n\n\t\t/**\n\t\t * Number of fields shown while collapsed. `null` fits the cell: the\n\t\t * whole rows that fit stay, and only an overflowing cell gets the\n\t\t * \"Show all N fields\" button.\n\t\t */\n\t\tcollapsedFields: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether editing is enabled globally.\n\t\t * When false, no fields are editable regardless of per-field settings.\n\t\t */\n\t\teditable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Hide fields that have no value, instead of rendering them with an em dash.\n\t\t *\n\t\t * Use this for a schema whose properties are only relevant to a subset of its\n\t\t * objects — a discriminated supertype, say, where a `complaint` never carries\n\t\t * the telephony fields a `contactmoment` does. The read grid then shows only\n\t\t * what the object actually has, without the schema having to declare which\n\t\t * fields belong to which variant.\n\t\t *\n\t\t * Only affects the read grid: a field being edited, a field with an unsaved\n\t\t * change, and the full edit form all stay visible, so an empty field is always\n\t\t * still reachable to fill in.\n\t\t */\n\t\thideEmpty: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Properties to exclude from display.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\texclude: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Properties to include (whitelist mode). If provided, only these are shown.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tinclude: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => null,\n\t\t},\n\n\t\t/**\n\t\t * NcDialog size for the edit form dialog. This widget already scopes\n\t\t * the form with `include` / `exclude`, but a scoped form can still be\n\t\t * long enough to want the room.\n\t\t */\n\t\tformSize: {\n\t\t\ttype: String,\n\t\t\tdefault: 'normal',\n\t\t},\n\n\t\t/**\n\t\t * How many columns the edit form flows its fields into. Pair `2` with\n\t\t * `formSize: 'large'`, or the two columns are merely two narrow ones.\n\t\t */\n\t\tformColumns: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t\tvalidator: (value) => value === 1 || value === 2,\n\t\t},\n\n\t\t/** Label for the save button */\n\t\tsaveLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Save'),\n\t\t},\n\n\t\t/** Label for the discard button */\n\t\tdiscardLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Discard'),\n\t\t},\n\n\t\t/** Label shown when no properties to display */\n\t\temptyLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No data available'),\n\t\t},\n\n\t\t/**\n\t\t * A muted line under the fields, through the host translate\n\t\t * (DqZaakContact \"Ontvangstbevestiging\").\n\t\t *\n\t\t * @spec openspec/changes/data-widget-footnote/specs/data-widget-footnote/spec.md#requirement-a-data-card-can-end-with-a-footnote\n\t\t */\n\t\tfootnote: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Metadata item in the overflow Actions menu. */\n\t\tmetadataLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Metadata'),\n\t\t},\n\n\t\t/** Label for the Edit action item (opens the full-form edit dialog). */\n\t\teditLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Edit'),\n\t\t},\n\t},\n\n\temits: ['discard', 'save', 'save-error', 'saved'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Whether the read-only metadata modal is open. */\n\t\t\tmetadataModalOpen: false,\n\t\t\t/** Whether the full-form edit dialog is open. */\n\t\t\teditModalOpen: false,\n\t\t\t/** Currently editing field key, or null */\n\t\t\teditingField: null,\n\t\t\t/** Working copy of changed field values */\n\t\t\teditData: {},\n\t\t\t/** Set of field keys that have been modified */\n\t\t\tdirtyFields: {},\n\t\t\t/** Whether a save is in progress */\n\t\t\tsaving: false,\n\t\t\t/** Resolved display labels for related-object fields, keyed by field key */\n\t\t\trelatedLabels: {},\n\t\t\t/** Name-labeled picker options per relation field key ({ id, label }[]). */\n\t\t\trelationOptions: {},\n\t\t\t/** Whether relation picker options are being fetched. */\n\t\t\trelationOptionsLoading: false,\n\t\t\t/** Group and user picker options per field key ({ id, label }[]). */\n\t\t\tpersonOptions: {},\n\t\t\t/** Key of the group or user field whose options are loading, or null. */\n\t\t\tpersonLoading: null,\n\t\t\t/** Display names of users seen in a user picker, by uid. */\n\t\t\tuserLabels: {},\n\t\t\t/** Whether the user expanded the widget to see every field. */\n\t\t\texpanded: false,\n\t\t\t/** Fields that fit the cell while collapsed; null when all fit. */\n\t\t\tfitCount: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The items this widget offers to a host surface's overflow menu.\n\t\t *\n\t\t * Exactly the two that live in `#action-items` on its own header, as\n\t\t * plain descriptors. `run` closes over this component, so the button an\n\t\t * ancestor renders still opens THIS widget's dialog, pre-filled from its\n\t\t * own config and committing through its own save path.\n\t\t *\n\t\t * Edit is gated on `editable` for the same reason the header item is: a\n\t\t * read-only widget offering a full edit form is a dead end.\n\t\t *\n\t\t * @return {object[]} PanelAction descriptors.\n\t\t */\n\t\tpanelActionItems() {\n\t\t\tconst items = []\n\t\t\tif (this.editable) {\n\t\t\t\titems.push({\n\t\t\t\t\tkey: 'edit',\n\t\t\t\t\tlabel: this.editLabel,\n\t\t\t\t\ticon: 'Pencil',\n\t\t\t\t\trun: () => {\n\t\t\t\t\t\tthis.editModalOpen = true\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t\titems.push({\n\t\t\t\tkey: 'metadata',\n\t\t\t\tlabel: this.metadataLabel,\n\t\t\t\ticon: 'InformationOutline',\n\t\t\t\trun: () => {\n\t\t\t\t\tthis.metadataModalOpen = true\n\t\t\t\t},\n\t\t\t})\n\t\t\treturn items\n\t\t},\n\n\t\ticonComponent() {\n\t\t\treturn (this.icon && typeof this.icon !== 'string') ? this.icon : null\n\t\t},\n\n\t\t/** MDI icon NAME (String form of `icon`) — rendered via CnIcon. */\n\t\ticonName() {\n\t\t\treturn typeof this.icon === 'string' ? this.icon : ''\n\t\t},\n\n\t\t/**\n\t\t * The overrides map, coerced to a plain object. An empty `{}` persists\n\t\t * through PHP/JSON as `[]`; treat any Array as \"no overrides\" so lookups\n\t\t * (`overrides[key]`) stay well-defined.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tresolvedOverrides() {\n\t\t\treturn (this.overrides && !Array.isArray(this.overrides)) ? this.overrides : {}\n\t\t},\n\n\t\t/**\n\t\t * Resolved field definitions from schema + overrides.\n\t\t * Sorted by order, filtered by hidden/exclude/include.\n\t\t */\n\t\t/**\n\t\t * The keys the overrides and the include list name at a dotted path\n\t\t * (`handling.teams`), as fields for the dotted-field helpers.\n\t\t *\n\t\t * @return {Array<{key: string}>}\n\t\t * @spec openspec/changes/forms-dotted-path-fields/specs/form-dialog/spec.md#requirement-a-field-can-edit-one-key-inside-an-object-property\n\t\t */\n\t\tdottedFieldKeys() {\n\t\t\tconst keys = [...Object.keys(this.resolvedOverrides || {}), ...(Array.isArray(this.include) ? this.include : [])]\n\t\t\treturn [...new Set(keys)].filter(isDottedKey).map((key) => ({ key }))\n\t\t},\n\n\t\t/**\n\t\t * The object's values by field key: its own keys, plus each dotted\n\t\t * field's value read from inside its object.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tfieldValues() {\n\t\t\treturn spreadDottedFields(this.objectData || {}, this.dottedFieldKeys)\n\t\t},\n\n\t\tresolvedFields() {\n\t\t\t// The shared pipeline now honours per-key `hidden` (filter) and\n\t\t\t// `order` (sort) directly, so the overrides map is passed through\n\t\t\t// verbatim — no bespoke hidden→exclude merge or post-sort needed.\n\t\t\t// This keeps the data widget and the edit modal (CnFormDialog)\n\t\t\t// identical-by-construction from one config map.\n\t\t\tconst fields = fieldsFromSchema(this.schema, {\n\t\t\t\texclude: this.exclude,\n\t\t\t\tinclude: this.include,\n\t\t\t\toverrides: this.resolvedOverrides,\n\t\t\t\tincludeReadOnly: true,\n\t\t\t\ttranslate: this.cnTranslate,\n\t\t\t})\n\n\t\t\t// Attach grid span info (a display-only concern, not part of the\n\t\t\t// shared field pipeline) from the same overrides map.\n\t\t\tconst withSpans = fields.map((field) => ({\n\t\t\t\t...field,\n\t\t\t\tgridColumn: (this.resolvedOverrides[field.key] && this.resolvedOverrides[field.key].gridColumn) || 1,\n\t\t\t\tgridRow: (this.resolvedOverrides[field.key] && this.resolvedOverrides[field.key].gridRow) || 1,\n\t\t\t}))\n\n\t\t\t// Per-field condition: `overrides[key].visibleWhen` shows a field only\n\t\t\t// for the objects it belongs to, such as a person's preferred name on\n\t\t\t// a client that can also be an organisation.\n\t\t\tconst shown = withSpans.filter((field) => this.isVisibleByCondition(field))\n\n\t\t\tif (!this.hideEmpty) {\n\t\t\t\treturn shown\n\t\t\t}\n\n\t\t\t// Keep a field the user is currently editing or has pending changes for,\n\t\t\t// otherwise it would vanish mid-edit the moment its value is cleared.\n\t\t\treturn shown.filter((field) => field.key === this.editingField\n\t\t\t\t|| field.key in this.dirtyFields\n\t\t\t\t|| !this.isEmptyValue(this.fieldValues[field.key]))\n\t\t},\n\n\t\t/**\n\t\t * The translated display label for an enum value, or null when the field\n\t\t * is not an enum (or the value is absent) and normal formatting applies.\n\t\t *\n\t\t * The stored value is untouched — only what the user reads changes, so\n\t\t * inline editing still writes back the raw code.\n\t\t *\n\t\t * @return {(field: object, raw: unknown) => string|null} Given the resolved\n\t\t * field descriptor and the stored value, the label to display — or\n\t\t * null to fall through to `formatValue`.\n\t\t */\n\t\tenumDisplayLabel() {\n\t\t\treturn (field, raw) => {\n\t\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst values = Array.isArray(field.enum) ? field.enum : null\n\t\t\t\tif (values === null || !values.includes(raw)) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst labels = field.enumLabels || {}\n\t\t\t\treturn this.cnTranslate(labels[raw] || String(raw))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Display values of the fields whose override names a registered\n\t\t * formatter, keyed by field key. A field is left out when its formatter\n\t\t * id is not registered or the formatter throws, so it falls back to the\n\t\t * default rendering.\n\t\t *\n\t\t * @return {Record<string, string>}\n\t\t */\n\t\tformatterDisplayValues() {\n\t\t\tconst values = {}\n\t\t\tfor (const field of this.resolvedFields) {\n\t\t\t\tconst fn = field.formatter && this.cnFormatters && this.cnFormatters[field.formatter]\n\t\t\t\tif (typeof fn !== 'function') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst raw = field.key in this.dirtyFields\n\t\t\t\t\t? this.dirtyFields[field.key]\n\t\t\t\t\t: this.fieldValues[field.key]\n\t\t\t\tconst prop = (this.schema.properties && this.schema.properties[field.key]) || {}\n\t\t\t\ttry {\n\t\t\t\t\tconst formatted = fn(raw, this.objectData || {}, prop)\n\t\t\t\t\tvalues[field.key] = (formatted === null || formatted === undefined || formatted === '') ? '—' : String(formatted)\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`[CnObjectDataWidget] formatter \"${field.formatter}\" threw; falling back`, e)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Formatted display values for each field.\n\t\t */\n\t\tdisplayValues() {\n\t\t\tconst values = {}\n\t\t\tfor (const field of this.resolvedFields) {\n\t\t\t\tif (field.key in this.formatterDisplayValues) {\n\t\t\t\t\tvalues[field.key] = this.formatterDisplayValues[field.key]\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// Show pending edit value if dirty\n\t\t\t\tconst raw = field.key in this.dirtyFields\n\t\t\t\t\t? this.dirtyFields[field.key]\n\t\t\t\t\t: this.fieldValues[field.key]\n\t\t\t\tconst prop = this.schema.properties && this.schema.properties[field.key]\n\t\t\t\tif (this.isRelationField(prop) && raw !== null && raw !== undefined && raw !== '') {\n\t\t\t\t\tvalues[field.key] = this.relationLabel(raw)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// An enum renders its LABEL, the way the table cell and the form\n\t\t\t\t// dropdown do. Without this the detail page was the one surface\n\t\t\t\t// still showing the stored code — `submitted` under a Dutch\n\t\t\t\t// label, beside a list that already read \"Ingediend\".\n\t\t\t\tconst enumLabel = this.enumDisplayLabel(field, raw)\n\t\t\t\tconst empty = this.emptyValueFor(field, raw)\n\t\t\t\tif (empty === null && field.format === 'duration' && raw !== null && raw !== undefined && raw !== '') {\n\t\t\t\t\t// A term in words, with the extension at `extendBy` when the object holds one.\n\t\t\t\t\tconst extension = typeof field.extendBy === 'string' ? readPath(this.objectData || {}, field.extendBy) : null\n\t\t\t\t\tvalues[field.key] = formatTermDuration(raw, extension)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvalues[field.key] = empty !== null ? empty : (enumLabel !== null ? enumLabel : formatValue(raw, prop || {}))\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Whether any fields have been modified.\n\t\t */\n\t\tisDirty() {\n\t\t\treturn Object.keys(this.dirtyFields).length > 0\n\t\t},\n\n\t\t/**\n\t\t * CSS grid template for the container.\n\t\t */\n\t\tgridStyle() {\n\t\t\t// The board look: as many 200px columns as the card has room for,\n\t\t\t// unless the config asks for one column (a stacked list of pairs).\n\t\t\tif (normalizeLook(this.cnLook) === 'board') {\n\t\t\t\tif (this.columns === 1) {\n\t\t\t\t\treturn { 'grid-template-columns': 'minmax(0, 1fr)' }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t'grid-template-columns': 'repeat(auto-fit, minmax(200px, 1fr))',\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t'grid-template-columns': `repeat(${this.columns}, 1fr)`,\n\t\t\t}\n\t\t},\n\n\t\t/** Fields shown while collapsed; null shows all of them. */\n\t\tcollapsedCount() {\n\t\t\tconst count = this.collapsedFields ?? this.fitCount\n\t\t\treturn count === null || count === undefined ? null : Math.max(1, count)\n\t\t},\n\n\t\t/** Whether some fields are left out while collapsed. */\n\t\thasHiddenFields() {\n\t\t\treturn this.collapsedCount !== null && this.resolvedFields.length > this.collapsedCount\n\t\t},\n\n\t\t/** The fields rendered: all of them when expanded, else the first few. */\n\t\tvisibleFields() {\n\t\t\tif (this.expanded || !this.hasHiddenFields) {\n\t\t\t\treturn this.resolvedFields\n\t\t\t}\n\t\t\treturn this.resolvedFields.slice(0, this.collapsedCount)\n\t\t},\n\n\t\t/** Pre-translated \"Show all N fields\" affordance label. */\n\t\tshowAllFieldsLabel() {\n\t\t\treturn t('nextcloud-vue', 'Show all {count} fields', { count: this.resolvedFields.length })\n\t\t},\n\n\t\t/** Pre-translated collapse label. */\n\t\tcollapseFieldsLabel() {\n\t\t\treturn t('nextcloud-vue', 'Show less')\n\t\t},\n\t},\n\n\twatch: {\n\t\t'resolvedFields.length': function() {\n\t\t\tthis.scheduleFit()\n\t\t},\n\n\t\tcollapsedFields() {\n\t\t\tthis.scheduleFit()\n\t\t},\n\n\t\tobjectData: {\n\t\t\tdeep: true,\n\t\t\thandler() {\n\t\t\t\t// If external data changes (e.g. after save), clear dirty state\n\t\t\t\t// for fields that now match the new data\n\t\t\t\tfor (const key of Object.keys(this.dirtyFields)) {\n\t\t\t\t\tif (this.dirtyFields[key] === this.fieldValues[key]) {\n\t\t\t\t\t\tconst { [key]: _, ...rest } = this.dirtyFields\n\t\t\t\t\t\tthis.dirtyFields = rest\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Resolve relation display names whenever the object changes.\n\t\t\t\tthis.resolveRelations()\n\t\t\t\tthis.resolveUserNames()\n\t\t\t},\n\t\t},\n\n\t\tschema: {\n\t\t\thandler() {\n\t\t\t\tthis.resolveRelations()\n\t\t\t\tthis.resolveUserNames()\n\t\t\t},\n\t\t},\n\n\t\t// Republish when the items change (a label retranslated, `editable`\n\t\t// flipped) and when the widget's own menu comes or goes. Not `immediate`:\n\t\t// an immediate watcher runs during this component's own setup, and\n\t\t// publishing then would mutate the ancestor's state mid-render. Mounted\n\t\t// does it once the tree is settled.\n\t\tpanelActionItems: {\n\t\t\thandler() {\n\t\t\t\tthis.publishPanelActions()\n\t\t\t},\n\t\t},\n\n\t\tshowActions: {\n\t\t\thandler() {\n\t\t\t\tthis.publishPanelActions()\n\t\t\t},\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.resolveRelations()\n\t\tthis.resolveUserNames()\n\t\tthis.publishPanelActions()\n\t\tthis.observeCell()\n\t\tthis.scheduleFit()\n\t},\n\n\tbeforeUnmount() {\n\t\tif (this._cellObserver) {\n\t\t\tthis._cellObserver.disconnect()\n\t\t}\n\t\tclearTimeout(this._fitTimer)\n\t\t// Leave nothing behind in the strip's menu. A closed tab's panel can be\n\t\t// torn down while the strip lives on, and an item whose widget is gone\n\t\t// would open a dialog belonging to nothing.\n\t\tif (this.panelActionSink) {\n\t\t\tthis.panelActionSink.clear()\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Publish or withdraw this widget's items on the host surface.\n\t\t *\n\t\t * Published only while the widget's OWN menu is suppressed. With a\n\t\t * header of its own the items already have a home, and publishing too\n\t\t * would put the same two entries in two menus on one screen.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tpublishPanelActions() {\n\t\t\tif (!this.panelActionSink) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.showActions) {\n\t\t\t\tthis.panelActionSink.clear()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.panelActionSink.set(this.panelActionItems)\n\t\t},\n\n\t\t/** Pre-translated string helper exposed to the template. */\n\t\tt,\n\n\t\t/** Toggle between the first few fields and all of them. */\n\t\ttoggleExpanded() {\n\t\t\tthis.expanded = !this.expanded\n\t\t\tif (!this.expanded) {\n\t\t\t\tthis.scheduleFit()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The wrapper's content node: the cell whose height the fields fit into.\n\t\t *\n\t\t * @return {HTMLElement|null}\n\t\t */\n\t\tcellContent() {\n\t\t\treturn this.$el?.querySelector?.('.cn-widget-wrapper__content')\n\t\t\t\t|| this.$el?.closest?.('.cn-widget-wrapper__content')\n\t\t\t\t|| null\n\t\t},\n\n\t\t/** Re-fit when the cell is resized. */\n\t\tobserveCell() {\n\t\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis._cellObserver = new ResizeObserver(() => this.scheduleFit())\n\t\t\tconst content = this.cellContent()\n\t\t\tif (content) {\n\t\t\t\tthis._cellObserver.observe(content)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Re-fit when the grid itself grows or shrinks: a fixed-height cell does\n\t\t * not resize when a relation label resolves or a field enters edit mode.\n\t\t * A re-fit of unchanged content lands on the same height, which the\n\t\t * observer does not report, so this settles after one extra pass.\n\t\t *\n\t\t * @param {HTMLElement} grid The grid element.\n\t\t * @return {void}\n\t\t */\n\t\tobserveGrid(grid) {\n\t\t\tif (!this._cellObserver || grid === this._observedGrid) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this._observedGrid) {\n\t\t\t\tthis._cellObserver.unobserve(this._observedGrid)\n\t\t\t}\n\t\t\tthis._cellObserver.observe(grid)\n\t\t\tthis._observedGrid = grid\n\t\t},\n\n\t\t/** Debounce fitFields so a data load's burst of changes fits once. */\n\t\tscheduleFit() {\n\t\t\tclearTimeout(this._fitTimer)\n\t\t\tthis._fitTimer = setTimeout(() => this.fitFields(), 30)\n\t\t},\n\n\t\t/**\n\t\t * In fit mode, render every field, then keep the whole rows that fit\n\t\t * the cell with room left for the toggle.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fitFields() {\n\t\t\tif (this.collapsedFields !== null || this.expanded) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.fitCount = null\n\t\t\tawait this.$nextTick()\n\t\t\tconst content = this.cellContent()\n\t\t\tconst grid = this.$refs.grid\n\t\t\tif (grid) {\n\t\t\t\tthis.observeGrid(grid)\n\t\t\t}\n\t\t\tif (!content || !grid || !content.clientHeight || content.scrollHeight <= content.clientHeight + 1) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst style = getComputedStyle(content)\n\t\t\tconst box = content.getBoundingClientRect()\n\t\t\tconst toggleReserve = 44\n\t\t\tconst limit = box.top + content.clientTop + content.clientHeight\n\t\t\t\t- parseFloat(style.paddingBottom || 0) - toggleReserve - content.scrollTop\n\t\t\tconst cells = Array.from(grid.querySelectorAll('.cn-object-data-widget__cell'))\n\t\t\t\t.map((el) => el.getBoundingClientRect())\n\t\t\tconst overflowing = cells.find((r) => r.bottom > limit)\n\t\t\t// Drop the whole row the first overflowing field sits in.\n\t\t\tconst count = overflowing ? cells.filter((r) => r.top < overflowing.top - 1).length : cells.length\n\t\t\tthis.fitCount = count < cells.length ? Math.max(1, count) : null\n\t\t},\n\n\t\t/**\n\t\t * Raw (possibly dirty) value for a field.\n\t\t *\n\t\t * @param {object} field The field descriptor (from `fieldsFromSchema`).\n\t\t */\n\t\trawOf(field) {\n\t\t\tconst o = this.objectData || {}\n\t\t\treturn (field.key in this.dirtyFields) ? this.dirtyFields[field.key] : o[field.key]\n\t\t},\n\n\t\t/**\n\t\t * Classify a field's raw value for display so the template can pick a\n\t\t * legible renderer (ADR-062: a structured value must never render as\n\t\t * \"[object Object]\"). Relation fields are excluded here — their\n\t\t * name-resolved label already flows through `displayValues`.\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @return {'object-array'|'scalar-array'|'object'|'scalar'} The value kind.\n\t\t */\n\t\tfieldValueKind(field) {\n\t\t\tif (field.key in this.formatterDisplayValues) {\n\t\t\t\treturn 'scalar'\n\t\t\t}\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tif (this.isRelationField(prop)) {\n\t\t\t\treturn 'scalar'\n\t\t\t}\n\t\t\tconst raw = this.rawOf(field)\n\t\t\tif (Array.isArray(raw)) {\n\t\t\t\tif (raw.length === 0) {\n\t\t\t\t\treturn 'scalar'\n\t\t\t\t}\n\t\t\t\treturn raw.some((v) => v !== null && typeof v === 'object' && !Array.isArray(v))\n\t\t\t\t\t? 'object-array'\n\t\t\t\t\t: 'scalar-array'\n\t\t\t}\n\t\t\tif (raw !== null && typeof raw === 'object') {\n\t\t\t\treturn 'object'\n\t\t\t}\n\t\t\treturn 'scalar'\n\t\t},\n\n\t\t/**\n\t\t * Column keys for an array-of-objects inline table: the union of the\n\t\t * keys of the first three items, capped at five columns.\n\t\t *\n\t\t * @param {Array<object>} raw The array value.\n\t\t * @return {string[]} Up to five column keys.\n\t\t */\n\t\tobjectArrayColumns(raw) {\n\t\t\tif (!Array.isArray(raw)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst keys = []\n\t\t\tfor (const item of raw.slice(0, 3)) {\n\t\t\t\tif (item && typeof item === 'object') {\n\t\t\t\t\tfor (const k of Object.keys(item)) {\n\t\t\t\t\t\tif (!keys.includes(k)) {\n\t\t\t\t\t\t\tkeys.push(k)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn keys.slice(0, 5)\n\t\t},\n\n\t\t/**\n\t\t * The first five rows of an array-of-objects value (the table caps at\n\t\t * five rows + an \"N more\" affordance).\n\t\t *\n\t\t * @param {Array<object>} raw The array value.\n\t\t * @return {Array<object>} Up to five row objects.\n\t\t */\n\t\tobjectArrayRows(raw) {\n\t\t\treturn Array.isArray(raw) ? raw.slice(0, 5) : []\n\t\t},\n\n\t\t/**\n\t\t * `[key, value]` pairs of a single plain-object value, for the compact\n\t\t * definition-list renderer.\n\t\t *\n\t\t * @param {object} raw The object value.\n\t\t * @return {Array<[string, unknown]>} The entries.\n\t\t */\n\t\tobjectEntries(raw) {\n\t\t\treturn (raw && typeof raw === 'object') ? Object.entries(raw) : []\n\t\t},\n\n\t\t/**\n\t\t * Whether a value is a plain object (not an array, not null).\n\t\t *\n\t\t * @param {unknown} v The value.\n\t\t * @return {boolean} True for a plain object.\n\t\t */\n\t\tisPlainObject(v) {\n\t\t\treturn v !== null && typeof v === 'object' && !Array.isArray(v)\n\t\t},\n\n\t\t/**\n\t\t * Label for a key inside an object value: the sub-schema's `title`\n\t\t * (translated) when the schema describes it, else the key, made\n\t\t * readable when it is identifier-shaped (`shortDescription` → \"Short\n\t\t * description\"; `nl` stays `nl`).\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @param {string[]} path Keys from the field's value down to this entry.\n\t\t * @return {string} The label.\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-nested-object-reads-as-a-list-per-key\n\t\t */\n\t\tnestedLabel(field, path) {\n\t\t\tlet prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tfor (const key of path) {\n\t\t\t\tif (!this.isPlainObject(prop)) {\n\t\t\t\t\tprop = null\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tprop = (prop.properties && prop.properties[key])\n\t\t\t\t\t|| (this.isPlainObject(prop.additionalProperties) ? prop.additionalProperties : null)\n\t\t\t}\n\t\t\tif (prop && typeof prop.title === 'string' && prop.title) {\n\t\t\t\treturn this.cnTranslate(prop.title)\n\t\t\t}\n\t\t\tconst key = String(path[path.length - 1])\n\t\t\treturn /[A-Z_-]/.test(key) ? humaniseKey(key) : key\n\t\t},\n\n\t\t/**\n\t\t * Stringify a value inside a definition list: a list of scalars reads\n\t\t * as a comma-separated line, anything else as `stringifyCell`.\n\t\t *\n\t\t * @param {unknown} v The value.\n\t\t * @return {string} The display string.\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-nested-object-reads-as-a-list-per-key\n\t\t */\n\t\tstringifyNested(v) {\n\t\t\tif (Array.isArray(v) && v.length && v.every((item) => item === null || typeof item !== 'object')) {\n\t\t\t\treturn v.map((item) => this.stringifyCell(item)).join(', ')\n\t\t\t}\n\t\t\treturn this.stringifyCell(v)\n\t\t},\n\n\t\t/**\n\t\t * Stringify a scalar cell value; a nested object/array collapses to\n\t\t * compact JSON (never \"[object Object]\").\n\t\t *\n\t\t * @param {unknown} v The cell value.\n\t\t * @return {string} The display string.\n\t\t */\n\t\tstringifyCell(v) {\n\t\t\tif (v === null || v === undefined || v === '') {\n\t\t\t\treturn '—'\n\t\t\t}\n\t\t\tif (typeof v === 'boolean') {\n\t\t\t\treturn v ? '✓' : '—'\n\t\t\t}\n\t\t\tif (typeof v === 'object') {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.stringify(v)\n\t\t\t\t} catch {\n\t\t\t\t\treturn '[Object]'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn String(v)\n\t\t},\n\n\t\t/**\n\t\t * Whether a field should render as an image preview.\n\t\t *\n\t\t * @param {object} field The field descriptor (from `fieldsFromSchema`).\n\t\t */\n\t\tisImageField(field) {\n\t\t\tif (field.widget === 'image') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst prop = this.schema.properties && this.schema.properties[field.key]\n\t\t\tconst fmt = (prop && (prop.format || prop.contentMediaType)) || ''\n\t\t\tif (fmt === 'image' || String(fmt).indexOf('image/') === 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn /(^|[._-])(photo|image|avatar|logo|thumb|picture)/i.test(field.key)\n\t\t},\n\n\t\t/**\n\t\t * The x-openregister-relation block for a property (scalar or array), or null.\n\t\t *\n\t\t * @param {object} prop The schema property definition.\n\t\t */\n\t\trelationProp(prop) {\n\t\t\tif (!prop) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (prop['x-openregister-relation']) {\n\t\t\t\treturn prop['x-openregister-relation']\n\t\t\t}\n\t\t\tif (prop.items && prop.items['x-openregister-relation']) {\n\t\t\t\treturn prop.items['x-openregister-relation']\n\t\t\t}\n\t\t\t// Canonical OpenRegister shorthand: `$ref` on a uuid-string\n\t\t\t// property (or its array items) references a schema in the SAME\n\t\t\t// register. Authored as the schema's TITLE (\"ReportPeriod\"), not\n\t\t\t// its slug — the live schema API may also rewrite it to the\n\t\t\t// numeric schema id (e.g. 85); accept both, the objects API\n\t\t\t// resolves either in its path, but a multi-word title 404s\n\t\t\t// unless kebab-cased first (defect 7: `ReportPeriod` 404s,\n\t\t\t// `report-period` 200). Register comes from the detail-page\n\t\t\t// object context (ADR-062: references display the target\n\t\t\t// object's NAME, never a raw uuid).\n\t\t\tconst rawRef = prop.$ref !== null && prop.$ref !== undefined ? prop.$ref : (prop.items ? prop.items.$ref : null)\n\t\t\tif (rawRef !== null && rawRef !== undefined && (typeof rawRef === 'string' || typeof rawRef === 'number')) {\n\t\t\t\tconst tail = String(rawRef).split('/').pop().replace(/\\.json$/, '')\n\t\t\t\tconst slug = schemaRefSlug(tail)\n\t\t\t\tconst reg = this.contextRegisterOf()\n\t\t\t\tif (slug && reg) {\n\t\t\t\t\treturn { target: `${reg}/${slug}` }\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/** The current register from the injected detail-page object context. */\n\t\tcontextRegisterOf() {\n\t\t\tconst c = this.cnObjectContext\n\t\t\tif (!c) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst v = (typeof c === 'object' && 'value' in c) ? c.value : c\n\t\t\treturn (v && v.register) || ''\n\t\t},\n\n\t\t/**\n\t\t * Whether a property is a relation.\n\t\t *\n\t\t * @param {object} prop The schema property definition.\n\t\t */\n\t\tisRelationField(prop) {\n\t\t\treturn this.relationProp(prop) !== null\n\t\t},\n\n\t\t/**\n\t\t * Whether a stored value counts as \"no value\" for `hideEmpty`.\n\t\t *\n\t\t * `false` and `0` are values, not absences, so they are deliberately kept —\n\t\t * hiding a boolean because it is false would lose information.\n\t\t *\n\t\t * @param {unknown} value The raw value from objectData.\n\t\t * @return {boolean} True when there is nothing to show.\n\t\t */\n\t\tisEmptyValue(value) {\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.length === 0\n\t\t\t}\n\t\t\tif (typeof value === 'object') {\n\t\t\t\treturn Object.keys(value).length === 0\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Display label(s) for a relation value, using resolved names. While a\n\t\t * name lookup is still in flight the placeholder '…' shows — a raw\n\t\t * uuid must never flash before the name arrives (ADR-062). Failed\n\t\t * lookups land in relatedLabels as the id itself (terminal fallback).\n\t\t *\n\t\t * @param {string|Array} raw The relation value(s).\n\t\t * @return {string} Resolved name(s), '…' while loading.\n\t\t */\n\t\trelationLabel(raw) {\n\t\t\tconst one = (v) => this.relatedLabels[v] || '…'\n\t\t\treturn Array.isArray(raw) ? raw.map(one).join(', ') : one(raw)\n\t\t},\n\n\t\t/**\n\t\t * Whether a relation field's display name(s) are still being fetched\n\t\t * (drives the skeleton placeholder in the display cell).\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRelationPending(field) {\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tif (!prop || this.relationProp(prop) === null) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst raw = this.fieldValues[field.key]\n\t\t\tconst ids = Array.isArray(raw) ? raw : (raw ? [raw] : [])\n\t\t\treturn ids.some((id) => id && !(id in this.relatedLabels))\n\t\t},\n\n\t\t/**\n\t\t * Whether a field is a SINGLE-VALUE relation (edited through the\n\t\t * name-labeled object picker). Array relations keep the generic\n\t\t * editor for now.\n\t\t *\n\t\t * @param {string} key Schema property key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSingleRelationField(key) {\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[key]\n\t\t\tif (!prop || prop.type === 'array') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.relationProp(prop) !== null\n\t\t},\n\n\t\t/**\n\t\t * Best display name for a referenced object.\n\t\t *\n\t\t * @param {object} obj The fetched object.\n\t\t * @param {string} id Fallback id.\n\t\t * @return {string}\n\t\t */\n\t\tobjectDisplayName(obj, id) {\n\t\t\tconst self = (obj && obj['@self']) || {}\n\t\t\t// `str()` rather than a bare truthiness chain. A property called\n\t\t\t// `name` is not necessarily a string — Haal Centraal naming gives a\n\t\t\t// person `name: { givenNames, namePrefix, surname }` — and taking the\n\t\t\t// first truthy candidate hands that OBJECT back as the label, which\n\t\t\t// renders as `[object Object]` where a name belongs. Skipping a\n\t\t\t// non-string lets the next candidate answer, and for these schemas\n\t\t\t// the next one is right.\n\t\t\tconst str = (v) => (typeof v === 'string' && v.trim() !== '' ? v : (typeof v === 'number' ? String(v) : ''))\n\t\t\tlet name = str(obj.name) || str(obj.title) || str(obj.displayName)\n\t\t\tif (!name && (str(obj.firstName) || str(obj.lastName))) {\n\t\t\t\tname = (str(obj.firstName) + ' ' + str(obj.lastName)).trim()\n\t\t\t}\n\t\t\tif (!name && str(self.name) && self.name !== id) {\n\t\t\t\tname = str(self.name)\n\t\t\t}\n\t\t\treturn name || id\n\t\t},\n\n\t\t/**\n\t\t * Load the picker options for a relation field from its target schema\n\t\t * (first 200 objects, labeled by display name).\n\t\t *\n\t\t * @param {string} key Schema property key.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadRelationOptions(key) {\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[key]\n\t\t\tconst rel = this.relationProp(prop)\n\t\t\tif (!rel) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst parts = String(rel.target || '').split('/')\n\t\t\tif (parts.length < 2) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.relationOptionsLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{reg}/{sch}', { reg: parts[0], sch: parts[1] })\n\t\t\t\tconst params = { _limit: 200 }\n\t\t\t\t// Declarative option scoping: `x-relation-filter` on the schema\n\t\t\t\t// property narrows the picker to objects that fit THIS object —\n\t\t\t\t// e.g. case.status: { \"caseType\": \"@object.caseType\" } offers\n\t\t\t\t// only the statuses of the case's own type. Values are\n\t\t\t\t// token-resolved (@objectId / @object.<field>); entries whose\n\t\t\t\t// token stays unresolved are dropped (unfiltered beats empty).\n\t\t\t\tconst rawFilter = prop['x-relation-filter']\n\t\t\t\tif (rawFilter && typeof rawFilter === 'object') {\n\t\t\t\t\t// Dirty values win: picking a new caseType must immediately\n\t\t\t\t\t// scope the status options to it, before any save.\n\t\t\t\t\tconst objData = { ...(this.objectData || {}), ...this.dirtyFields }\n\t\t\t\t\tconst ctx = { objectId: ((this.objectData || {})['@self'] && (this.objectData || {})['@self'].id) || (this.objectData || {}).id, object: objData }\n\t\t\t\t\tconst filter = resolveFilterTokens(rawFilter, ctx)\n\t\t\t\t\tfor (const [fk, fv] of Object.entries(filter)) {\n\t\t\t\t\t\tif (typeof fv === 'string' && fv.charAt(0) === '@') {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fv && typeof fv === 'object') {\n\t\t\t\t\t\t\tfor (const [op, ov] of Object.entries(fv)) {\n\t\t\t\t\t\t\t\tparams[`${fk}[${op}]`] = ov\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (fv !== '' && fv !== null && fv !== undefined) {\n\t\t\t\t\t\t\tparams[fk] = fv\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst res = await axios.get(url, { params })\n\t\t\t\tconst rows = (res && res.data && res.data.results) || []\n\t\t\t\tconst opts = rows.map((o) => {\n\t\t\t\t\tconst id = (o['@self'] && o['@self'].id) || o.id\n\t\t\t\t\treturn { id, label: this.objectDisplayName(o, id) }\n\t\t\t\t}).filter((o) => o.id)\n\t\t\t\tthis.relationOptions[key] = opts\n\t\t\t\t// Cache the labels so display resolution reuses them.\n\t\t\t\topts.forEach((o) => {\n\t\t\t\t\tif (!(o.id in this.relatedLabels)) {\n\t\t\t\t\t\tthis.relatedLabels[o.id] = o.label\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.relationOptions[key] = []\n\t\t\t} finally {\n\t\t\t\tthis.relationOptionsLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The currently selected picker option for a relation field.\n\t\t *\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {object|null} `{ id, label }` or null when unset.\n\t\t */\n\t\trelationSelectedOption(field) {\n\t\t\tconst v = this.editData[field.key]\n\t\t\tif (!v) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { id: v, label: this.relatedLabels[v] || String(v) }\n\t\t},\n\n\t\t/**\n\t\t * Apply a relation picker choice: store the referenced object's ID\n\t\t * (the persisted value stays a uuid; only the display is a name).\n\t\t *\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {object|null} opt Chosen option or null (cleared).\n\t\t */\n\t\tonRelationChange(field, opt) {\n\t\t\tif (opt && opt.id) {\n\t\t\t\tthis.relatedLabels[opt.id] = opt.label\n\t\t\t}\n\t\t\tthis.updateField(field.key, opt ? opt.id : null)\n\t\t},\n\n\t\t/** Fetch related objects' display names into relatedLabels. */\n\t\tasync resolveRelations() {\n\t\t\t// Collect every unresolved (target, id) pair first, then fetch them\n\t\t\t// ALL in parallel — sequential lookups made names trail the page by\n\t\t\t// seconds, leaving confusing placeholder values (ADR-062: names\n\t\t\t// must arrive with the page, uuids never show).\n\t\t\tconst props = (this.schema && this.schema.properties) || {}\n\t\t\tconst jobs = []\n\t\t\tfor (const key of Object.keys(props)) {\n\t\t\t\tconst rel = this.relationProp(props[key])\n\t\t\t\tif (!rel) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst parts = String(rel.target || '').split('/')\n\t\t\t\tif (parts.length < 2) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst raw = this.fieldValues[key]\n\t\t\t\tconst ids = Array.isArray(raw) ? raw : (raw ? [raw] : [])\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tif (!id || (id in this.relatedLabels) || jobs.some((j) => j.id === id)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tjobs.push({ reg: parts[0], sch: parts[1], id })\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait Promise.all(jobs.map(async ({ reg, sch, id }) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{reg}/{sch}/{id}', { reg, sch, id })\n\t\t\t\t\tconst res = await axios.get(url)\n\t\t\t\t\tconst d = (res && res.data) ? res.data : {}\n\t\t\t\t\tconst obj = (d.results && d.results[0]) ? d.results[0] : d\n\t\t\t\t\tthis.relatedLabels[id] = this.objectDisplayName(obj, id)\n\t\t\t\t} catch {\n\t\t\t\t\tthis.relatedLabels[id] = id\n\t\t\t\t}\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether a field's value cannot be edited inline: a structured widget\n\t\t * (json, code, file, sub-objects, child-records), or a plain-object /\n\t\t * list-of-objects value that is not a relation. Scalar widgets without\n\t\t * a dedicated editor (duration, language, …) keep the text fallback.\n\t\t *\n\t\t * @param {object} field Resolved field definition.\n\t\t * @return {boolean} True when only the form dialog can edit it.\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-structured-value-is-never-edited-inline\n\t\t */\n\t\thasNoInlineEditor(field) {\n\t\t\tif (STRUCTURED_WIDGETS.includes(field.widget)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst prop = ((this.schema && this.schema.properties) || {})[field.key]\n\t\t\tif (this.isRelationField(prop)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// A list of objects by schema, also while empty (it resolves to `tags`).\n\t\t\tif (prop && prop.type === 'array' && prop.items && prop.items.type === 'object') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Classify the raw value itself: fieldValueKind reports a formatter\n\t\t\t// field as 'scalar' whatever it holds.\n\t\t\tconst raw = this.rawOf(field)\n\t\t\tif (Array.isArray(raw)) {\n\t\t\t\treturn raw.some((v) => this.isPlainObject(v))\n\t\t\t}\n\t\t\treturn this.isPlainObject(raw)\n\t\t},\n\n\t\t/**\n\t\t * The words an override gives an empty or false value\n\t\t * (`overrides[key].emptyValue`, translated), or null to format it as usual.\n\t\t *\n\t\t * @param {object} field - Resolved field definition from resolvedFields\n\t\t * @param {*} raw - The field's value\n\t\t * @return {string|null}\n\t\t * @spec openspec/changes/data-widget-empty-value-one-column/specs/data-widget/spec.md\n\t\t */\n\t\temptyValueFor(field, raw) {\n\t\t\tconst override = this.resolvedOverrides[field.key]\n\t\t\tconst words = override && typeof override.emptyValue === 'string' ? override.emptyValue : ''\n\t\t\tif (words === '' || !(raw === null || raw === undefined || raw === '' || raw === false)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cnTranslate(words)\n\t\t},\n\n\t\t/**\n\t\t * Check if a field is editable.\n\t\t *\n\t\t * @param {object} field - Resolved field definition from resolvedFields\n\t\t * @spec openspec/changes/data-widget-nested-objects/specs/data-widget-nested-objects/spec.md#requirement-a-structured-value-is-never-edited-inline\n\t\t */\n\t\tisEditable(field) {\n\t\t\tif (!this.editable) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// No inline editor exists for structured values: the text fallback\n\t\t\t// would commit \"[object Object]\". Those edit through the form dialog,\n\t\t\t// unless the consumer supplies its own `field-<key>` editor slot.\n\t\t\tif (!this.$slots['field-' + field.key] && this.hasNoInlineEditor(field)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Per-field override takes priority\n\t\t\tconst override = this.resolvedOverrides[field.key]\n\t\t\tif (override && typeof override.editable === 'boolean') {\n\t\t\t\treturn override.editable\n\t\t\t}\n\t\t\t// Conditional immutability: a field declares it becomes read-only when\n\t\t\t// another field on this object holds a given value (schema\n\t\t\t// `x-openregister-readonly-when`). Evaluated against the live object —\n\t\t\t// e.g. a hybrid app's identity fields lock when appType === 'hybrid'.\n\t\t\tif (this.isReadOnlyByCondition(field)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Schema readOnly\n\t\t\treturn !field.readOnly\n\t\t},\n\n\t\t/**\n\t\t * Evaluate a field's `visibleWhen` override against the object.\n\t\t *\n\t\t * The rule is the shared visibility predicate in its LOCAL mode\n\t\t * (`{ field, op, value }`, `all` / `any`, `appInstalled`), evaluated by\n\t\t * `evaluateVisibleWhenLocal` against the object with its unsaved\n\t\t * changes, so a field appears or goes the moment the field it depends\n\t\t * on changes. A rule that needs a request (`endpoint`, `source`) cannot\n\t\t * be decided here and is ignored: the field shows, as it did before\n\t\t * the rule existed.\n\t\t *\n\t\t * @param {object} field - Resolved field definition.\n\t\t * @return {boolean} True when the field is shown.\n\t\t */\n\t\tisVisibleByCondition(field) {\n\t\t\tconst override = this.resolvedOverrides[field.key]\n\t\t\tconst rule = override ? override.visibleWhen : undefined\n\t\t\tif (rule === undefined || rule === null || !isLocallyDecidableVisibleWhen(rule)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn evaluateVisibleWhenLocal(rule, { ...(this.objectData || {}), ...this.dirtyFields })\n\t\t},\n\n\t\t/**\n\t\t * Evaluate a field's conditional read-only rule against the object data.\n\t\t *\n\t\t * @param {object} field - Resolved field definition (may carry `readOnlyWhen`).\n\t\t * @return {boolean} True when the condition holds and the field is locked.\n\t\t */\n\t\tisReadOnlyByCondition(field) {\n\t\t\tconst rule = field.readOnlyWhen\n\t\t\tif (!rule || !rule.field) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst current = this.objectData ? this.objectData[rule.field] : undefined\n\t\t\tif (Array.isArray(rule.in)) {\n\t\t\t\treturn rule.in.includes(current)\n\t\t\t}\n\t\t\tif ('equals' in rule) {\n\t\t\t\treturn current === rule.equals\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\t/**\n\t\t * Check if a field's current value is empty.\n\t\t *\n\t\t * @param {string} key - Field key to check\n\t\t */\n\t\tisValueEmpty(key) {\n\t\t\tconst val = key in this.dirtyFields\n\t\t\t\t? this.dirtyFields[key]\n\t\t\t\t: this.fieldValues[key]\n\t\t\treturn val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0)\n\t\t},\n\n\t\t/**\n\t\t * Start inline editing for a field.\n\t\t *\n\t\t * @param {object} field - Resolved field definition from resolvedFields\n\t\t */\n\t\tstartEdit(field) {\n\t\t\t// Set working value: dirty value > current object value\n\t\t\tconst currentValue = field.key in this.dirtyFields\n\t\t\t\t? this.dirtyFields[field.key]\n\t\t\t\t: this.fieldValues[field.key]\n\t\t\tthis.editData = { ...this.editData, [field.key]: currentValue }\n\t\t\tthis.editingField = field.key\n\t\t\t// Relation fields edit through a name-labeled object picker.\n\t\t\t// Options reload on every edit start: an `x-relation-filter` can\n\t\t\t// depend on the object's CURRENT values (e.g. status options scoped\n\t\t\t// to the just-changed caseType), so a per-field cache would serve\n\t\t\t// stale sets.\n\t\t\tif (this.isSingleRelationField(field.key)) {\n\t\t\t\tthis.loadRelationOptions(field.key)\n\t\t\t}\n\t\t\t// Group and user fields pick from Nextcloud's own directory.\n\t\t\tif (this.isPersonPicker(field)) {\n\t\t\t\tthis.searchPeople(field, '')\n\t\t\t\tthis.resolvePersonLabels(field, currentValue)\n\t\t\t}\n\n\t\t\tthis.$nextTick(() => {\n\t\t\t\t// Focus the editor\n\t\t\t\tconst editor = this.$refs.activeEditor\n\t\t\t\tif (editor) {\n\t\t\t\t\tconst el = Array.isArray(editor) ? editor[0] : editor\n\t\t\t\t\tif (el && el.$el) {\n\t\t\t\t\t\tconst input = el.$el.querySelector('input, textarea, select')\n\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\tinput.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (el && el.focus) {\n\t\t\t\t\t\tel.focus()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Update the working edit value for a field.\n\t\t *\n\t\t * @param {string} key - Field key to update\n\t\t * @param {unknown} value - New value for the field\n\t\t */\n\t\tupdateField(key, value) {\n\t\t\tthis.editData = { ...this.editData, [key]: value }\n\t\t},\n\n\t\t/**\n\t\t * Commit the current inline edit — stage the field as dirty and persist\n\t\t * it immediately so a click-to-edit confirm saves in one step (matching\n\t\t * user expectation). The header Save/Discard still work for any remaining\n\t\t * dirty state (e.g. checkbox edits queued without a per-field confirm).\n\t\t */\n\t\tasync commitEdit() {\n\t\t\tif (!this.editingField) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst key = this.editingField\n\t\t\tconst newValue = this.editData[key]\n\t\t\tconst originalValue = this.fieldValues[key]\n\n\t\t\tthis.editingField = null\n\n\t\t\t// Only mark dirty if actually changed\n\t\t\tif (newValue !== originalValue) {\n\t\t\t\tthis.dirtyFields = { ...this.dirtyFields, [key]: newValue }\n\t\t\t} else {\n\t\t\t\t// Remove from dirty if reverted to original\n\t\t\t\tconst { [key]: _, ...rest } = this.dirtyFields\n\t\t\t\tthis.dirtyFields = rest\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Persist immediately (single-step inline save).\n\t\t\tawait this.save()\n\t\t},\n\n\t\t/**\n\t\t * Cancel the current inline edit without saving.\n\t\t */\n\t\tcancelEdit() {\n\t\t\tthis.editingField = null\n\t\t},\n\n\t\t/**\n\t\t * Discard all pending changes.\n\t\t */\n\t\tdiscard() {\n\t\t\tthis.dirtyFields = {}\n\t\t\tthis.editData = {}\n\t\t\tthis.editingField = null\n\t\t\tthis.$emit('discard')\n\t\t},\n\n\t\t/**\n\t\t * Save all dirty fields via the objectStore or emit event.\n\t\t */\n\t\tasync save() {\n\t\t\tif (!this.isDirty) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst mergedData = foldDottedFields({\n\t\t\t\t...this.objectData,\n\t\t\t\t...this.dirtyFields,\n\t\t\t}, this.dottedFieldKeys)\n\n\t\t\tthis.saving = true\n\n\t\t\ttry {\n\t\t\t\t// Try objectStore first if objectType is registered\n\t\t\t\tif (this.objectType) {\n\t\t\t\t\tconst store = this._getObjectStore()\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\t// Only the fields edited inline are written (a PATCH).\n\t\t\t\t\t\tconst result = await saveEdited(store, this.objectType, this.objectData, mergedData)\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tthis.dirtyFields = {}\n\t\t\t\t\t\t\tthis.editData = {}\n\t\t\t\t\t\t\tthis.$emit('saved', result)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst error = store.getError(this.objectType)\n\t\t\t\t\t\t\tthis.$emit('save-error', error)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fallback: emit for parent to handle\n\t\t\t\tthis.$emit('save', mergedData)\n\t\t\t} finally {\n\t\t\t\tthis.saving = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Persist the full-form edit dialog result, merged onto the current\n\t\t * object, via the same store path as inline save. Closes on success.\n\t\t *\n\t\t * @param {object} formData The submitted form payload.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onEditConfirm(formData) {\n\t\t\tconst mergedData = foldDottedFields({ ...this.objectData, ...formData }, this.dottedFieldKeys)\n\t\t\tthis.saving = true\n\t\t\ttry {\n\t\t\t\tif (this.objectType) {\n\t\t\t\t\tconst store = this._getObjectStore()\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\tconst result = await saveEdited(store, this.objectType, this.objectData, mergedData)\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tthis.dirtyFields = {}\n\t\t\t\t\t\t\tthis.editData = {}\n\t\t\t\t\t\t\tthis.editModalOpen = false\n\t\t\t\t\t\t\tthis.$emit('saved', result)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.$emit('save-error', store.getError(this.objectType))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Fallback: emit for parent to persist.\n\t\t\t\tthis.editModalOpen = false\n\t\t\t\tthis.$emit('save', mergedData)\n\t\t\t} finally {\n\t\t\t\tthis.saving = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the objectStore instance.\n\t\t * Uses the `store` prop if provided, otherwise tries Pinia auto-detection.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\t_getObjectStore() {\n\t\t\t// Prefer explicit store prop\n\t\t\tif (this.store) {\n\t\t\t\treturn this.store\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// useObjectStore is a static import (top of file) — bundler\n\t\t\t\t// resolves it at lib build time so consumer apps don't need\n\t\t\t\t// to resolve the relative path. The try/catch still guards\n\t\t\t\t// the case where the consumer hasn't set up pinia.\n\t\t\t\tconst pinia = this.$pinia\n\t\t\t\tif (!pinia) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn useObjectStore()\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Compute CSS grid placement for a field cell.\n\t\t *\n\t\t * @param {object} field - The field configuration object.\n\t\t */\n\t\tcellStyle(field) {\n\t\t\tconst style = {}\n\t\t\tif (field.gridColumn > 1) {\n\t\t\t\tstyle.gridColumn = `span ${field.gridColumn}`\n\t\t\t}\n\t\t\tif (field.gridRow > 1) {\n\t\t\t\tstyle.gridRow = `span ${field.gridRow}`\n\t\t\t}\n\t\t\treturn style\n\t\t},\n\n\t\t// ── Select helpers ──\n\n\t\t/**\n\t\t * Normalize an option to { id, label } format.\n\t\t * Accepts plain strings or objects with id/label properties.\n\t\t *\n\t\t * @param {string|object} val - Raw option value to normalize.\n\t\t */\n\t\t_normalizeOption(val) {\n\t\t\tif (val && typeof val === 'object' && val.id !== undefined) {\n\t\t\t\treturn { id: val.id, label: val.label || val.id }\n\t\t\t}\n\t\t\treturn { id: val, label: String(val) }\n\t\t},\n\n\t\tgetSelectOptions(field) {\n\t\t\tif (field.enum) {\n\t\t\t\treturn field.enum.map((val) => this._normalizeOption(val))\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\tgetSelectedOption(field) {\n\t\t\tconst val = this.editData[field.key]\n\t\t\tif (val === null || val === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Find matching option from enum for proper label display\n\t\t\tconst options = this.getSelectOptions(field)\n\t\t\treturn options.find((opt) => opt.id === val) || { id: val, label: String(val) }\n\t\t},\n\n\t\t/**\n\t\t * Whether a field picks a Nextcloud group (widget `group` or\n\t\t * `group-multiselect`, from `referenceType: nextcloud-group`).\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisGroupPicker(field) {\n\t\t\treturn !!field && (field.widget === 'group' || field.widget === 'group-multiselect')\n\t\t},\n\n\t\t/**\n\t\t * Whether a field picks a Nextcloud user (widget `user` or\n\t\t * `user-multiselect`, from `referenceType: nextcloud-user`).\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisUserPicker(field) {\n\t\t\treturn !!field && (field.widget === 'user' || field.widget === 'user-multiselect')\n\t\t},\n\n\t\t/**\n\t\t * Whether a field picks a group or a user.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisPersonPicker(field) {\n\t\t\treturn this.isGroupPicker(field) || this.isUserPicker(field)\n\t\t},\n\n\t\t/**\n\t\t * Whether a group or user field holds a list.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisPersonMultiple(field) {\n\t\t\treturn !!field && (field.widget === 'group-multiselect' || field.widget === 'user-multiselect')\n\t\t},\n\n\t\t/**\n\t\t * The group ids a group field holds, for the display mode.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {string[]}\n\t\t */\n\t\tgroupIdsOf(field) {\n\t\t\tconst raw = this.rawOf(field)\n\t\t\tconst list = Array.isArray(raw) ? raw : [raw]\n\t\t\treturn list.filter((v) => typeof v === 'string' && v !== '')\n\t\t},\n\n\t\t/**\n\t\t * The uids a user field holds, for the display mode. The same list\n\t\t * shape a group field holds.\n\t\t *\n\t\t * @spec openspec/changes/a-user-field-reads-its-display-name/specs/data-display/spec.md#requirement-a-user-field-shows-the-users-display-name\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {string[]}\n\t\t */\n\t\tuserIdsOf(field) {\n\t\t\treturn this.groupIdsOf(field)\n\t\t},\n\n\t\t/**\n\t\t * Look up the display names of every user field's value, so the read\n\t\t * mode shows \"Thomas Kuiper\" rather than `thomas.kuiper`. Each uid is\n\t\t * asked once per widget.\n\t\t *\n\t\t * @spec openspec/changes/a-user-field-reads-its-display-name/specs/data-display/spec.md#requirement-a-user-field-shows-the-users-display-name\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync resolveUserNames() {\n\t\t\tconst fields = (this.resolvedFields || []).filter((field) => this.isUserPicker(field))\n\t\t\tawait Promise.all(fields.map((field) => this.resolvePersonLabels(field, this.rawOf(field))))\n\t\t},\n\n\t\t/**\n\t\t * The display name of a group id or uid, falling back to the id.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {string} id The group id or uid.\n\t\t * @return {string}\n\t\t */\n\t\tpersonLabel(field, id) {\n\t\t\tif (this.isGroupPicker(field)) {\n\t\t\t\treturn groupDisplayName(id) || String(id)\n\t\t\t}\n\t\t\treturn this.userLabels[id] || String(id)\n\t\t},\n\n\t\t/**\n\t\t * Search Nextcloud groups or users for a picker. Fails soft (the\n\t\t * helpers return `[]`), so the picker stays usable with what it has.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {string} query The search term.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync searchPeople(field, query) {\n\t\t\tthis.personLoading = field.key\n\t\t\ttry {\n\t\t\t\tconst options = this.isGroupPicker(field)\n\t\t\t\t\t? await searchNextcloudGroups(query || '')\n\t\t\t\t\t: await searchNextcloudUsers(query || '')\n\t\t\t\tconst list = Array.isArray(options) ? options : []\n\t\t\t\tif (this.isUserPicker(field)) {\n\t\t\t\t\tconst labels = { ...this.userLabels }\n\t\t\t\t\tfor (const opt of list) {\n\t\t\t\t\t\tlabels[opt.id] = opt.label\n\t\t\t\t\t}\n\t\t\t\t\tthis.userLabels = labels\n\t\t\t\t}\n\t\t\t\tthis.personOptions = { ...this.personOptions, [field.key]: list }\n\t\t\t} finally {\n\t\t\t\tif (this.personLoading === field.key) {\n\t\t\t\t\tthis.personLoading = null\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Look up the display names of the value a group or user field holds,\n\t\t * so the open editor shows names rather than ids.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {unknown} value The held value (an id or a list of ids).\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync resolvePersonLabels(field, value) {\n\t\t\tconst ids = (Array.isArray(value) ? value : [value])\n\t\t\t\t.filter((v) => typeof v === 'string' && v !== '')\n\t\t\tif (this.isGroupPicker(field)) {\n\t\t\t\tawait Promise.all(ids.map((gid) => loadGroupDisplayName(gid)))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst unknown = ids.filter((uid) => !this.userLabels[uid])\n\t\t\tconst options = await Promise.all(unknown.map((uid) => resolveNextcloudUser(uid)))\n\t\t\tif (options.length > 0) {\n\t\t\t\tconst labels = { ...this.userLabels }\n\t\t\t\tfor (const opt of options) {\n\t\t\t\t\tif (opt && opt.id) {\n\t\t\t\t\t\tlabels[opt.id] = opt.label || opt.id\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.userLabels = labels\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The selected option(s) of a group or user picker.\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @return {object|object[]|null}\n\t\t */\n\t\tpersonSelected(field) {\n\t\t\tconst toOption = (id) => {\n\t\t\t\tconst label = this.personLabel(field, id)\n\t\t\t\treturn { id, label, displayName: label }\n\t\t\t}\n\t\t\tconst v = this.editData[field.key]\n\t\t\tif (this.isPersonMultiple(field)) {\n\t\t\t\treturn (Array.isArray(v) ? v : [])\n\t\t\t\t\t.filter((id) => typeof id === 'string' && id !== '')\n\t\t\t\t\t.map(toOption)\n\t\t\t}\n\t\t\treturn (typeof v === 'string' && v !== '') ? toOption(v) : null\n\t\t},\n\n\t\t/**\n\t\t * Store a group or user choice as the id (or list of ids).\n\t\t *\n\t\t * @spec openspec/changes/nextcloud-group-surfaces/specs/data-display/spec.md#requirement-the-inline-editor-picks-a-nextcloud-group-or-user\n\t\t * @param {object} field Field descriptor.\n\t\t * @param {object|object[]|null} selected The chosen option(s).\n\t\t */\n\t\tonPersonChange(field, selected) {\n\t\t\tif (this.isPersonMultiple(field)) {\n\t\t\t\tconst ids = (Array.isArray(selected) ? selected : [])\n\t\t\t\t\t.map((opt) => (opt && typeof opt === 'object' ? opt.id : opt))\n\t\t\t\t\t.filter((id) => typeof id === 'string' && id !== '')\n\t\t\t\tthis.updateField(field.key, ids)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (selected && this.isUserPicker(field) && selected.id) {\n\t\t\t\tthis.userLabels = { ...this.userLabels, [selected.id]: selected.label || selected.id }\n\t\t\t}\n\t\t\tthis.updateField(field.key, selected && selected.id ? selected.id : null)\n\t\t},\n\n\t\tonSelectChange(field, option) {\n\t\t\tthis.updateField(field.key, option ? option.id : null)\n\t\t},\n\n\t\tgetMultiselectOptions(field) {\n\t\t\t// Check override enum first, then schema items.enum\n\t\t\tif (field.enum) {\n\t\t\t\treturn field.enum.map((val) => this._normalizeOption(val))\n\t\t\t}\n\t\t\tconst itemsEnum = field.items && field.items.enum\n\t\t\tif (itemsEnum) {\n\t\t\t\treturn itemsEnum.map((val) => this._normalizeOption(val))\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\tgetSelectedMultiselectOptions(field) {\n\t\t\tconst val = this.editData[field.key]\n\t\t\tif (!Array.isArray(val)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\t// Map selected IDs to option objects with labels\n\t\t\tconst options = this.getMultiselectOptions(field)\n\t\t\treturn val.map((v) => options.find((opt) => opt.id === v) || { id: v, label: String(v) })\n\t\t},\n\n\t\tonMultiselectChange(field, selected) {\n\t\t\tconst values = Array.isArray(selected)\n\t\t\t\t? selected.map((opt) => opt.id || opt)\n\t\t\t\t: []\n\t\t\tthis.updateField(field.key, values)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-data-widget__image {\n\tmax-width: 100%;\n\tmax-height: 160px;\n\tborder-radius: 8px;\n\tobject-fit: cover;\n}\n\n/* Shimmering placeholder while a relation's display name resolves. */\n.cn-object-data-widget__skeleton {\n\tdisplay: inline-block;\n\twidth: 90px;\n\theight: 1em;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-background-dark) 25%, var(--color-background-hover) 50%, var(--color-background-dark) 75%);\n\tbackground-size: 200% 100%;\n\tanimation: cn-odw-shimmer 1.2s ease-in-out infinite;\n}\n\n@keyframes cn-odw-shimmer {\n\tfrom { background-position: 200% 0; }\n\tto { background-position: -200% 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.cn-object-data-widget__skeleton { animation: none; }\n}\n\n.cn-object-data-widget__grid {\n\tdisplay: grid;\n\tgap: calc(2 * var(--default-grid-baseline, 4px)) calc(4 * var(--default-grid-baseline, 4px));\n}\n\n.cn-object-data-widget__toggle {\n\tmargin-top: 4px;\n}\n\n.cn-object-data-widget__cell {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tpadding: calc(2 * var(--default-grid-baseline, 4px)) 0;\n\tborder-bottom: 1px solid var(--color-border-dark);\n\tmin-width: 0;\n}\n\n.cn-object-data-widget__label {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-weight: 500;\n}\n\n.cn-object-data-widget__value {\n\tfont-size: 1em;\n\tcolor: var(--color-main-text);\n\toverflow-wrap: anywhere;\n\tposition: relative;\n\tpadding-right: 20px;\n}\n\n/* The hover box bleeds 4px past the text on the top, bottom and start so the\n fill reads as a hit area rather than a highlight. Not on the end: the cell is\n the last column's full width, and 4px past it is 4px past the scroll region,\n which drew a horizontal scrollbar under every data widget in a tab (dossiq's\n case page, Data tab). The end padding drops by the same 4px so the text and\n the edit icon sit where they sat. */\n.cn-object-data-widget__value--editable {\n\tcursor: pointer;\n\tborder-radius: var(--border-radius);\n\tpadding: 4px 20px 4px 4px;\n\tmargin: -4px 0 -4px -4px;\n}\n\n.cn-object-data-widget__value--editable:hover {\n\tbackground: var(--color-background-dark);\n}\n\n.cn-object-data-widget__value--editable:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n.cn-object-data-widget__value--empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-style: italic;\n}\n\n.cn-object-data-widget__edit-icon {\n\tposition: absolute;\n\tright: 4px;\n\ttop: 50%;\n\ttransform: translateY(-50%);\n\tcolor: var(--color-text-maxcontrast);\n\topacity: 0;\n\ttransition: opacity 0.15s ease;\n}\n\n.cn-object-data-widget__value--editable:hover .cn-object-data-widget__edit-icon,\n.cn-object-data-widget__value--editable:focus-visible .cn-object-data-widget__edit-icon {\n\topacity: 1;\n}\n\n.cn-object-data-widget__editor {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-object-data-widget__editor-actions {\n\tdisplay: flex;\n\tgap: 2px;\n\tjustify-content: flex-end;\n}\n\n.cn-object-data-widget__textarea {\n\twidth: 100%;\n\tmin-height: 80px;\n\tpadding: 8px;\n\tborder: 2px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tresize: vertical;\n}\n\n.cn-object-data-widget__textarea:focus {\n\tborder-color: var(--color-primary-element);\n\toutline: none;\n}\n\n.cn-object-data-widget__footnote {\n\tmargin: calc(var(--default-grid-baseline, 4px) * 3) 0 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-object-data-widget__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-style: italic;\n\tpadding: calc(2 * var(--default-grid-baseline, 4px));\n}\n\n/* Compact inline table for array-of-objects values. Dense + unstyled-simple;\n fits the card and participates in the whole-row overflow handling. */\n.cn-object-data-widget__mini-table-wrap {\n\tmax-width: 100%;\n}\n\n.cn-object-data-widget__mini-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 0.9em;\n}\n\n.cn-object-data-widget__mini-table th,\n.cn-object-data-widget__mini-table td {\n\ttext-align: start;\n\tpadding: 2px 8px 2px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tvertical-align: top;\n\toverflow-wrap: anywhere;\n\t/* The cells wrap whatever an ancestor says: a `nowrap` inherited from the\n\t surface made a message and a timestamp column 766px wide in a 212px value\n\t cell, and the card 8px wider than its cell (pipelinq's ticket page). */\n\twhite-space: normal;\n}\n\n.cn-object-data-widget__mini-table th {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-weight: 500;\n}\n\n.cn-object-data-widget__more {\n\tmargin-top: 2px;\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n/* Comma-less chip row for array-of-scalars values. */\n.cn-object-data-widget__chips {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n}\n\n.cn-object-data-widget__chip {\n\tpadding: 1px 8px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 0.9em;\n}\n\n/* Key: value definition list for a single plain-object value. */\n.cn-object-data-widget__deflist {\n\tdisplay: grid;\n\tgrid-template-columns: auto 1fr;\n\tgap: 2px 8px;\n\tmargin: 0;\n}\n\n.cn-object-data-widget__deflist dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n}\n\n.cn-object-data-widget__deflist dd {\n\tmargin: 0;\n\toverflow-wrap: anywhere;\n}\n\n/* A long description keeps its own paragraphs. Set on an inline span with no\n surrounding template whitespace, so only the value's own line breaks show. */\n.cn-object-data-widget__deflist-text {\n\twhite-space: pre-wrap;\n}\n\n.cn-object-data-widget__deflist--nested {\n\tpadding-inline-start: 8px;\n\tborder-inline-start: 2px solid var(--color-border);\n}\n\n/* Responsive: collapse to single column on narrow widths */\n@media (max-width: 600px) {\n\t.cn-object-data-widget__grid {\n\t\tgrid-template-columns: 1fr !important;\n\t}\n\n\t.cn-object-data-widget__cell {\n\t\tgrid-column: span 1 !important;\n\t\tgrid-row: span 1 !important;\n\t}\n}\n</style>\n"],"names":["CnIcon","CnGroupNameCell","CnWidgetWrapper","CnObjectMetadataModal","CnFormDialog","t","axios"],"mappings":"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"}