@conduction/nextcloud-vue 2.135.0 → 2.137.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 (123) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +2 -1
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +65 -50
  5. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  7. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +9 -0
  8. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +4 -3
  10. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +4 -1
  12. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +61 -28
  14. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  15. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  16. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +6 -0
  17. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  18. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js +9 -1
  19. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  20. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  21. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  22. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +4 -11
  23. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +32 -0
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +34 -26
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +24 -0
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -2
  31. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +2 -1
  35. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  36. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +39 -2
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  38. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +6 -5
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  41. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +11 -0
  42. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  43. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +10 -2
  44. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  45. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  46. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +18 -0
  47. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +38 -23
  49. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  50. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  51. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  52. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +1 -0
  53. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  54. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
  55. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
  56. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue.js +1 -1
  58. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue2.js +14 -4
  59. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue2.js.map +1 -1
  60. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue3.js.map +1 -1
  61. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +1 -1
  62. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +10 -0
  63. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -1
  64. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +29 -13
  65. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -1
  66. package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js +3 -1
  67. package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js.map +1 -1
  68. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js +1 -1
  69. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js.map +1 -1
  70. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js.map +1 -1
  71. package/dist/esm/composables/indexSources.js +69 -3
  72. package/dist/esm/composables/indexSources.js.map +1 -1
  73. package/dist/esm/l10n/en.json.js +20 -20
  74. package/dist/esm/l10n/nl.json.js +21 -21
  75. package/dist/esm/library-style.js +1 -1
  76. package/dist/esm/nextcloud-vue.css +580 -324
  77. package/dist/esm/utils/contentHeaderLink.js +7 -1
  78. package/dist/esm/utils/contentHeaderLink.js.map +1 -1
  79. package/dist/esm/utils/savedViewMenu.js +4 -1
  80. package/dist/esm/utils/savedViewMenu.js.map +1 -1
  81. package/dist/esm/utils/savedViewSummary.js +11 -4
  82. package/dist/esm/utils/savedViewSummary.js.map +1 -1
  83. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  84. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  85. package/dist/esm/utils/widgetDispatch.js +3 -1
  86. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  87. package/dist/nextcloud-vue.cjs.js +1159 -812
  88. package/dist/nextcloud-vue.cjs.js.map +2 -2
  89. package/dist/nextcloud-vue.css +580 -324
  90. package/l10n/en.json +20 -20
  91. package/l10n/nl.json +21 -21
  92. package/package.json +1 -1
  93. package/src/components/CnActionDialog/CnActionDialog.vue +45 -4
  94. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +13 -1
  95. package/src/components/CnAppNav/CnAppNav.vue +28 -3
  96. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +15 -0
  97. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +2 -10
  98. package/src/components/CnDataTable/CnDataTable.md +1 -0
  99. package/src/components/CnDataTable/CnDataTable.vue +38 -1
  100. package/src/components/CnDetailPage/CnDetailPage.md +1 -0
  101. package/src/components/CnDetailPage/CnDetailPage.vue +26 -2
  102. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +1 -0
  103. package/src/components/CnIndexPage/CnIndexPage.vue +44 -6
  104. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -0
  105. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +21 -0
  106. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +38 -2
  107. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +7 -0
  108. package/src/components/CnRetentionWidget/CnRetentionWidget.vue +13 -0
  109. package/src/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue +14 -4
  110. package/src/components/CnTimelineWidget/CnTimelineManage.vue +23 -0
  111. package/src/components/CnTimelineWidget/dashboardRegistration.js +3 -1
  112. package/src/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue +7 -0
  113. package/src/composables/indexSources.js +69 -3
  114. package/src/css/look-board-detail.css +57 -1
  115. package/src/css/look-board-index.css +76 -1
  116. package/src/css/look-board.css +51 -4
  117. package/src/css/table.css +5 -0
  118. package/src/schemas/app-manifest-v2.schema.json +4 -2
  119. package/src/utils/contentHeaderLink.js +7 -1
  120. package/src/utils/savedViewMenu.js +4 -1
  121. package/src/utils/savedViewSummary.js +11 -4
  122. package/src/utils/validateManifestV2.compiled.js +2 -2
  123. package/src/utils/widgetDispatch.js +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CnRegisterMapping.vue3.js","sources":["../../../../src/components/CnRegisterMapping/CnRegisterMapping.vue?vue&type=template&id=75b309a6&lang.js"],"sourcesContent":["<template>\n\t<CnSettingsSection\n\t\t:name=\"name\"\n\t\t:description=\"description\"\n\t\t:docUrl=\"docUrl\"\n\t\t:loading=\"registersLoading\"\n\t\t:loadingMessage=\"t('nextcloud-vue', 'Loading registers…')\"\n\t\t:error=\"!!registersError\"\n\t\t:errorMessage=\"registersError || ''\"\n\t\t:onRetry=\"loadRegisters\">\n\t\t<!-- Action buttons -->\n\t\t<template v-if=\"hasHeaderActions\" #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showSaveButton && !isBoardLook\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t@click=\"handleSave\">\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<ContentSave v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showReimportButton\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"reimporting\"\n\t\t\t\t@click=\"$emit('reimport')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"reimporting\" :size=\"20\" />\n\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ reimporting ? t('nextcloud-vue', 'Importing…') : reimportButtonText }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\n\t\t<!-- `boardLayout: \"selects\"` (DqBeheerinstellingen Configuratie): per\n\t\t group the register select, then a schema select per type in a\n\t\t grid of three, and one save button at the end. -->\n\t\t<div\n\t\t\tv-if=\"isBoardLook && boardLayout === 'selects' && !registersLoading && !registersError\"\n\t\t\tclass=\"cn-register-mapping cn-register-mapping--board cn-register-mapping--selects\"\n\t\t\tdata-testid=\"cn-register-mapping-selects\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__selects-group\">\n\t\t\t\t<h3 v-if=\"groups.length > 1\" class=\"cn-register-mapping__board-title\">\n\t\t\t\t\t{{ group.name }}\n\t\t\t\t</h3>\n\t\t\t\t<div class=\"cn-register-mapping__selects-register\" data-testid=\"cn-register-mapping-register\">\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"selectedRegister(groupIdx)\"\n\t\t\t\t\tclass=\"cn-register-mapping__select-grid\"\n\t\t\t\t\t:style=\"{ '--cn-register-mapping-columns': 3 }\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-select-grid\">\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\tv-for=\"type in group.types\"\n\t\t\t\t\t\t:key=\"type.slug + '-select'\"\n\t\t\t\t\t\t:modelValue=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t:inputLabel=\"type.label\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t</div>\n\t\t\t\t<NcNoteCard\n\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0\"\n\t\t\t\t\ttype=\"warning\">\n\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t\t<div v-if=\"showSaveButton\" class=\"cn-register-mapping__board-save\">\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-board-save\"\n\t\t\t\t\t@click=\"handleSave\">\n\t\t\t\t\t<template v-if=\"saving\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Group sections -->\n\t\t<div\n\t\t\tv-else-if=\"isBoardLook && !registersLoading && !registersError\"\n\t\t\tclass=\"cn-register-mapping cn-register-mapping--board\"\n\t\t\tdata-testid=\"cn-register-mapping-board\">\n\t\t\t<div class=\"cn-register-mapping__board-group\" data-testid=\"cn-register-mapping-board-group\">\n\t\t\t\t<div class=\"cn-register-mapping__board-head\">\n\t\t\t\t\t<h3 class=\"cn-register-mapping__board-title\">\n\t\t\t\t\t\t{{ activeGroup.name }}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t:label=\"groupStatusLabel(activeGroupIdx, true)\"\n\t\t\t\t\t\t:variant=\"groupStatusVariant(activeGroupIdx)\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-board-status\" />\n\t\t\t\t</div>\n\t\t\t\t<p v-if=\"activeGroup.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t{{ activeGroup.description }}\n\t\t\t\t</p>\n\t\t\t\t<div class=\"cn-register-mapping__register-select cn-register-mapping__board-select\">\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"selectedRegister(activeGroupIdx)\"\n\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(activeGroupIdx, $event)\" />\n\t\t\t\t</div>\n\t\t\t\t<table v-if=\"selectedRegister(activeGroupIdx)\" class=\"cn-register-mapping__board-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Object type') }}\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t{{ labels.schema }}\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<template v-for=\"type in boardVisibleTypes\" :key=\"type.slug + '-board'\">\n\t\t\t\t\t\t\t<tr data-testid=\"cn-register-mapping-board-row\">\n\t\t\t\t\t\t\t\t<td>{{ type.label }}</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__board-schema\"\n\t\t\t\t\t\t\t\t\t\t:aria-expanded=\"String(isExpanded(activeGroupIdx, type.slug))\"\n\t\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Change the schema for {type}', { type: type.label })\"\n\t\t\t\t\t\t\t\t\t\t@click=\"toggleExpand(activeGroupIdx, type.slug)\">\n\t\t\t\t\t\t\t\t\t\t<CheckCircle\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"schemaValue(activeGroupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__board-check\"\n\t\t\t\t\t\t\t\t\t\t\t:size=\"16\" />\n\t\t\t\t\t\t\t\t\t\t{{ schemaLabel(activeGroupIdx, type) || t('nextcloud-vue', 'Not set') }}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"isExpanded(activeGroupIdx, type.slug)\" class=\"cn-register-mapping__board-detail\">\n\t\t\t\t\t\t\t\t<td colspan=\"2\">\n\t\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t\t:modelValue=\"selectedSchema(activeGroupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(activeGroupIdx)\"\n\t\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\t\t:inputLabel=\"labels.schema\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(activeGroupIdx, type, $event)\" />\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t\t<p\n\t\t\t\t\tv-if=\"selectedRegister(activeGroupIdx) && boardHiddenTypes.length > 0\"\n\t\t\t\t\tclass=\"cn-register-mapping__board-more\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-board-more\">\n\t\t\t\t\t{{ boardHiddenSummary }}\n\t\t\t\t\t<button type=\"button\" class=\"cn-register-mapping__board-link\" @click=\"showAllTypes = true\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Show all types') }}\n\t\t\t\t\t</button>\n\t\t\t\t</p>\n\t\t\t\t<NcNoteCard v-if=\"!selectedRegister(activeGroupIdx)\" type=\"info\">\n\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t</NcNoteCard>\n\t\t\t\t<NcNoteCard\n\t\t\t\t\tv-if=\"selectedRegister(activeGroupIdx) && schemaSelectOptions(activeGroupIdx).length === 0\"\n\t\t\t\t\ttype=\"warning\">\n\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t\t<ul v-if=\"boardOtherGroups.length > 0\" class=\"cn-register-mapping__board-groups\">\n\t\t\t\t<li v-for=\"item in boardOtherGroups\" :key=\"item.idx\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-register-mapping__board-group-row\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-board-group-row\"\n\t\t\t\t\t\t@click=\"openBoardGroup(item.idx)\">\n\t\t\t\t\t\t<ChevronRight :size=\"18\" class=\"cn-register-mapping__board-chevron\" />\n\t\t\t\t\t\t<strong class=\"cn-register-mapping__board-group-name\">{{ item.group.name }}</strong>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__board-group-count\">\n\t\t\t\t\t\t\t{{ n('nextcloud-vue', '%n type', '%n types', item.group.types.length) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t:label=\"groupStatusLabel(item.idx, false)\"\n\t\t\t\t\t\t\t:variant=\"groupStatusVariant(item.idx)\" />\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<div v-if=\"showSaveButton\" class=\"cn-register-mapping__board-save\">\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-board-save\"\n\t\t\t\t\t@click=\"handleSave\">\n\t\t\t\t\t<template v-if=\"saving\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-else-if=\"!registersLoading && !registersError\" class=\"cn-register-mapping\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__group\"\n\t\t\t\t:class=\"{ 'cn-register-mapping__group--collapsed': !isGroupOpen(groupIdx) }\"\n\t\t\t\tdata-testid=\"cn-register-mapping-group\">\n\t\t\t\t<!-- Group header. With collapsible groups a heading holds the button\n\t\t\t\t that opens and closes the group (the WAI-ARIA accordion); the\n\t\t\t\t count stays visible while it is closed. -->\n\t\t\t\t<h4 v-if=\"groupsCollapsible\" class=\"cn-register-mapping__group-heading\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-register-mapping__group-toggle\"\n\t\t\t\t\t\t:aria-expanded=\"String(isGroupOpen(groupIdx))\"\n\t\t\t\t\t\t:aria-controls=\"groupBodyId(groupIdx)\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-group-toggle\"\n\t\t\t\t\t\t@click=\"toggleGroup(groupIdx)\">\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-chevron\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<ChevronUp v-if=\"isGroupOpen(groupIdx)\" :size=\"20\" />\n\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<slot name=\"group-header\"\n\t\t\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-title\">{{ group.name }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\" data-testid=\"cn-register-mapping-group-count\">\n\t\t\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</slot>\n\t\t\t\t\t</button>\n\t\t\t\t</h4>\n\t\t\t\t<slot v-else\n\t\t\t\t\tname=\"group-header\"\n\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t<div class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t<h4 class=\"cn-register-mapping__group-title\">\n\t\t\t\t\t\t\t{{ group.name }}\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\">\n\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</slot>\n\n\t\t\t\t<div\n\t\t\t\t\tv-show=\"isGroupOpen(groupIdx)\"\n\t\t\t\t\t:id=\"groupBodyId(groupIdx)\"\n\t\t\t\t\tclass=\"cn-register-mapping__group-body\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-group-body\">\n\t\t\t\t\t<!-- Group description -->\n\t\t\t\t\t<p v-if=\"group.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t\t{{ group.description }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Register selector -->\n\t\t\t\t\t<div class=\"cn-register-mapping__register-select\">\n\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t:modelValue=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\t\t:loading=\"registersLoading\"\n\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Type list -->\n\t\t\t\t\t<div v-if=\"selectedRegister(groupIdx)\" class=\"cn-register-mapping__type-list\">\n\t\t\t\t\t\t<!-- Header row -->\n\t\t\t\t\t\t<div class=\"cn-register-mapping__type-list-header\">\n\t\t\t\t\t\t\t<span>{{ t('nextcloud-vue', 'Object type') }}</span>\n\t\t\t\t\t\t\t<span>{{ labels.schema }}</span>\n\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Type rows -->\n\t\t\t\t\t\t<template v-for=\"type in group.types\" :key=\"type.slug + '-row'\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-row\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-register-mapping__type-row--expanded': isExpanded(groupIdx, type.slug) }\"\n\t\t\t\t\t\t\t\t@click=\"toggleExpand(groupIdx, type.slug)\">\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-name\">{{ type.label }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-schema\">\n\t\t\t\t\t\t\t\t\t{{ schemaLabel(groupIdx, type) || labels.notConfigured }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-status\">\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__status-dot\"\n\t\t\t\t\t\t\t\t\t\t:class=\"schemaValue(groupIdx, type)\n\t\t\t\t\t\t\t\t\t\t\t? 'cn-register-mapping__status-dot--configured'\n\t\t\t\t\t\t\t\t\t\t\t: 'cn-register-mapping__status-dot--unconfigured'\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-chevron\">\n\t\t\t\t\t\t\t\t\t<ChevronUp v-if=\"isExpanded(groupIdx, type.slug)\" :size=\"20\" />\n\t\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Expanded detail -->\n\t\t\t\t\t\t\t<transition name=\"slide\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tv-if=\"isExpanded(groupIdx, type.slug)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-detail\">\n\t\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t\t:modelValue=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\t\t:inputLabel=\"labels.schema\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</transition>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- No register selected -->\n\t\t\t\t\t<NcNoteCard v-else-if=\"!registersLoading\" type=\"info\">\n\t\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t\t</NcNoteCard>\n\n\t\t\t\t\t<!-- No schemas available -->\n\t\t\t\t\t<NcNoteCard\n\t\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0 && !registersLoading\"\n\t\t\t\t\t\tvariant=\"warning\">\n\t\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t\t</NcNoteCard>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Footer -->\n\t\t<template v-if=\"$slots.footer\" #footer>\n\t\t\t<slot name=\"footer\" />\n\t\t</template>\n\t</CnSettingsSection>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcLoadingIcon, NcNoteCard, NcSelect } from '@nextcloud/vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport ContentSave from 'vue-material-design-icons/ContentSave.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\n\nlet mappingCount = 0\n\n/**\n * CnRegisterMapping - OpenRegister register/schema configuration component.\n *\n * Displays and manages register-to-schema mappings for app object types.\n * Self-fetches available registers and schemas from the OpenRegister API.\n * Supports multiple register groups (stacked sections) with expandable\n * type rows for manual schema override.\n *\n * Only the registers the configuration maps have their schemas fetched; the\n * register select lists every register without its schemas.\n *\n * In the board look one group is open as a type/schema table under a status\n * chip, the other groups are rows with their type count and status, and the\n * save button closes the section.\n *\n * Single register (Pipelinq)\n * ```vue\n * <CnRegisterMapping\n * name=\"Register Configuration\"\n * :groups=\"[{\n * name: 'Core Objects',\n * types: [\n * { slug: 'client', label: 'Client' },\n * { slug: 'contact', label: 'Contact' },\n * ],\n * }]\"\n * :configuration=\"config\"\n * :show-reimport-button=\"true\"\n * @save=\"saveConfig\"\n * @reimport=\"reimport\" />\n * ```\n *\n * Multi-register (Stackiq)\n * ```vue\n * <CnRegisterMapping\n * :groups=\"[\n * { name: 'Voorzieningen', registerConfigKey: 'voorzieningen_register', types: [...] },\n * { name: 'AMEF', registerConfigKey: 'amef_register', types: [...] },\n * ]\"\n * :configuration=\"config\"\n * @save=\"saveConfig\" />\n * ```\n */\nexport default {\n\tname: 'CnRegisterMapping',\n\n\tcomponents: {\n\t\tCnSettingsSection,\n\t\tCnStatusBadge,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcNoteCard,\n\t\tNcSelect,\n\t\tContentSave,\n\t\tRefresh,\n\t\tCheckCircle,\n\t\tChevronDown,\n\t\tChevronRight,\n\t\tChevronUp,\n\t},\n\n\tinject: {\n\t\t/** The look CnAppRoot or CnAdminSettingsShell provides. */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/** The app's translate, for register and schema titles; identity outside CnAppRoot. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Section title */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Register configuration'),\n\t\t},\n\n\t\t/** Section description */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Configure OpenRegister schema mappings for your object types'),\n\t\t},\n\n\t\t/** Documentation URL */\n\t\tdocUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Groups of object types that share a register.\n\t\t *\n\t\t * @type {Array<{ name: string, description: string, registerConfigKey: string, types: Array<{ slug: string, label: string, description: string, configKey: string }> }>}\n\t\t */\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator: (groups) => groups.length > 0\n\t\t\t\t&& groups.every((g) => g.name && Array.isArray(g.types) && g.types.length > 0),\n\t\t},\n\n\t\t/** Current configuration values: { register: '5', client_schema: '28', ... } */\n\t\tconfiguration: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Show save button */\n\t\tshowSaveButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether save is in progress */\n\t\tsaving: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show reimport button */\n\t\tshowReimportButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether reimport is in progress */\n\t\treimporting: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Save button text */\n\t\tsaveButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Save configuration'),\n\t\t},\n\n\t\t/** Reimport button text */\n\t\treimportButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Re-import configuration'),\n\t\t},\n\n\t\t/**\n\t\t * Draw each group as a header that opens and closes it, showing its\n\t\t * configured count while closed. The groups start closed. `null` (the\n\t\t * default) collapses them when there is more than one group, so a page\n\t\t * with several registers is not one long card.\n\t\t *\n\t\t * @type {boolean|null}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\tcollapseGroups: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The look the mapping is drawn in: `board` or `nextcloud`. Empty\n\t\t * follows the provided `cnLook`.\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\tlook: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Board look: how the types are drawn. `table` (default) is the open\n\t\t * group's type and schema table with the other groups as rows\n\t\t * (PqBeheer); `selects` is the register select and a schema select per\n\t\t * type in a grid of three for every group (DqBeheerinstellingen).\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-select-grid/specs/register-mapping-select-grid/spec.md#requirement-the-board-look-can-draw-the-schemas-as-a-grid-of-selects\n\t\t */\n\t\tboardLayout: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (value) => ['table', 'selects'].includes(value),\n\t\t},\n\n\t\t/**\n\t\t * Board look: how many types the open group lists before a \"show all\"\n\t\t * line. 0 lists every type.\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\tboardRowLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 4,\n\t\t},\n\n\t\t/** Auto-match schema titles to type slugs on register change */\n\t\tautoMatch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** UI labels (i18n) */\n\t\tlabels: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({\n\t\t\t\tregister: t('nextcloud-vue', 'Register'),\n\t\t\t\tschema: t('nextcloud-vue', 'Schema'),\n\t\t\t\tconfigured: t('nextcloud-vue', 'Configured'),\n\t\t\t\tnotConfigured: t('nextcloud-vue', 'Not configured'),\n\t\t\t\tnoSchemas: t('nextcloud-vue', 'No schemas available in this register'),\n\t\t\t\tselectRegister: t('nextcloud-vue', 'Select a register'),\n\t\t\t\tselectSchema: t('nextcloud-vue', 'Select a schema'),\n\t\t\t\tallConfigured: t('nextcloud-vue', 'All types configured'),\n\t\t\t\tpartiallyConfigured: t('nextcloud-vue', 'configured'),\n\t\t\t}),\n\t\t},\n\t},\n\n\temits: ['update:configuration', 'save', 'reimport'],\n\n\tdata() {\n\t\treturn {\n\t\t\t// Fetched data\n\t\t\tregisters: [],\n\t\t\tschemasByRegister: {},\n\t\t\tregistersLoading: false,\n\t\t\tregistersError: null,\n\t\t\t// Local state\n\t\t\tlocalConfig: {},\n\t\t\texpandedRows: {},\n\t\t\t// The groups opened by the reader, by index.\n\t\t\topenGroups: {},\n\t\t\t// Board look: the group drawn open, and whether it lists every type.\n\t\t\tactiveGroupIdx: 0,\n\t\t\t// Schema requests by register id, so a register is fetched once.\n\t\t\tschemaRequests: {},\n\t\t\tregistersLoaded: false,\n\t\t\tshowAllTypes: false,\n\t\t\tuid: ++mappingCount,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Register options for NcSelect */\n\t\tregisterSelectOptions() {\n\t\t\treturn this.registers.map((r) => ({\n\t\t\t\tlabel: (r.title && this.cnTranslate(r.title)) || r.slug || t('nextcloud-vue', 'Register {id}', { id: r.id }),\n\t\t\t\tvalue: String(r.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether the groups open and close.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\tgroupsCollapsible() {\n\t\t\treturn this.collapseGroups === null ? this.groups.length > 1 : this.collapseGroups\n\t\t},\n\n\t\t/**\n\t\t * Whether the board look applies.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLook() {\n\t\t\treturn normalizeLook(this.look || this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The group the board look draws open.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tactiveGroup() {\n\t\t\treturn this.groups[this.activeGroupIdx] || this.groups[0]\n\t\t},\n\n\t\t/**\n\t\t * The open group's types the board table lists.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tboardVisibleTypes() {\n\t\t\tconst types = this.activeGroup.types\n\t\t\tif (this.showAllTypes || this.boardRowLimit <= 0) {\n\t\t\t\treturn types\n\t\t\t}\n\t\t\treturn types.slice(0, this.boardRowLimit)\n\t\t},\n\n\t\t/**\n\t\t * The open group's types below the row limit.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tboardHiddenTypes() {\n\t\t\treturn this.activeGroup.types.slice(this.boardVisibleTypes.length)\n\t\t},\n\n\t\t/**\n\t\t * The line under the board table that counts the types not listed.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tboardHiddenSummary() {\n\t\t\tconst count = this.boardHiddenTypes.length\n\t\t\tconst allSet = this.boardHiddenTypes.every((type) => !!this.schemaValue(this.activeGroupIdx, type))\n\t\t\treturn allSet\n\t\t\t\t? n('nextcloud-vue', 'And %n more type in this group, set up.', 'And %n more types in this group, all set up.', count)\n\t\t\t\t: n('nextcloud-vue', 'And %n more type in this group.', 'And %n more types in this group.', count)\n\t\t},\n\n\t\t/**\n\t\t * The groups the board look draws as compact rows, with their index.\n\t\t *\n\t\t * @return {Array<{group: object, idx: number}>}\n\t\t */\n\t\tboardOtherGroups() {\n\t\t\treturn this.groups\n\t\t\t\t.map((group, idx) => ({ group, idx }))\n\t\t\t\t.filter((item) => item.idx !== this.activeGroupIdx)\n\t\t},\n\n\t\t/**\n\t\t * Whether the section header draws buttons; the board look saves at the end.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasHeaderActions() {\n\t\t\treturn (this.showSaveButton && !this.isBoardLook) || this.showReimportButton || !!this.$slots.actions\n\t\t},\n\n\t\t/** Whether local config differs from prop */\n\t\thasChanges() {\n\t\t\treturn JSON.stringify(this.localConfig) !== JSON.stringify(this.configuration)\n\t\t},\n\t},\n\n\twatch: {\n\t\tconfiguration: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.localConfig = { ...newVal }\n\t\t\t\tif (this.registersLoaded) {\n\t\t\t\t\tthis.mappedRegisterIds().forEach((id) => this.loadSchemasForRegister(id))\n\t\t\t\t}\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\n\t\tgroups() {\n\t\t\tif (this.activeGroupIdx >= this.groups.length) {\n\t\t\t\tthis.activeGroupIdx = 0\n\t\t\t}\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.loadRegisters()\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tn,\n\n\t\t/**\n\t\t * The status chip text of a group: every type set up, none, or how many.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {boolean} open Whether the group is the open one, which says \"All types set up\"\n\t\t * @return {string}\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\tgroupStatusLabel(groupIdx, open) {\n\t\t\tconst configured = this.configuredCount(groupIdx)\n\t\t\tconst total = this.groups[groupIdx].types.length\n\t\t\tif (configured === total) {\n\t\t\t\treturn open ? t('nextcloud-vue', 'All types set up') : t('nextcloud-vue', 'Set up')\n\t\t\t}\n\t\t\tif (configured === 0) {\n\t\t\t\treturn t('nextcloud-vue', 'Not set')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{configured} of {total} set up', { configured, total })\n\t\t},\n\n\t\t/**\n\t\t * The status chip variant of a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {'success'|'warning'|'default'}\n\t\t */\n\t\tgroupStatusVariant(groupIdx) {\n\t\t\tconst configured = this.configuredCount(groupIdx)\n\t\t\tif (configured === this.groups[groupIdx].types.length) {\n\t\t\t\treturn 'success'\n\t\t\t}\n\t\t\treturn configured === 0 ? 'default' : 'warning'\n\t\t},\n\n\t\t/**\n\t\t * Board look: draw another group open.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {void}\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\topenBoardGroup(groupIdx) {\n\t\t\tthis.activeGroupIdx = groupIdx\n\t\t\tthis.showAllTypes = false\n\t\t},\n\n\t\t/**\n\t\t * The register ids the configuration maps, one per distinct value.\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tmappedRegisterIds() {\n\t\t\tconst ids = this.groups\n\t\t\t\t.map((group, idx) => String(this.localConfig[this.registerConfigKey(idx)] || ''))\n\t\t\t\t.filter(Boolean)\n\t\t\treturn [...new Set(ids)]\n\t\t},\n\n\t\t/**\n\t\t * Whether a group's body shows.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {boolean}\n\t\t */\n\t\tisGroupOpen(groupIdx) {\n\t\t\treturn !this.groupsCollapsible || this.openGroups[groupIdx] === true\n\t\t},\n\n\t\t/**\n\t\t * Open a closed group, or close an open one.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {void}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\ttoggleGroup(groupIdx) {\n\t\t\tthis.openGroups = { ...this.openGroups, [groupIdx]: !this.isGroupOpen(groupIdx) }\n\t\t},\n\n\t\t/**\n\t\t * The id of a group's body, for the header's `aria-controls`.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string}\n\t\t */\n\t\tgroupBodyId(groupIdx) {\n\t\t\treturn `cn-register-mapping-${this.uid}-group-${groupIdx}`\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a group's register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string} Config key\n\t\t */\n\t\tregisterConfigKey(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tif (group.registerConfigKey) {\n\t\t\t\treturn group.registerConfigKey\n\t\t\t}\n\t\t\tif (this.groups.length === 1) {\n\t\t\t\treturn 'register'\n\t\t\t}\n\t\t\treturn group.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_register'\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a type's schema.\n\t\t *\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Config key\n\t\t */\n\t\tschemaConfigKey(type) {\n\t\t\treturn type.configKey || type.slug + '_schema'\n\t\t},\n\n\t\t/**\n\t\t * Get the selected register option for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedRegister(groupIdx) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.registerSelectOptions.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the selected schema option for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedSchema(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\t\t\treturn options.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the schema value (ID) for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema ID or empty string\n\t\t */\n\t\tschemaValue(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\treturn this.localConfig[key] || ''\n\t\t},\n\n\t\t/**\n\t\t * Get the display label for a type's current schema.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema label or empty string\n\t\t */\n\t\tschemaLabel(groupIdx, type) {\n\t\t\tconst selected = this.selectedSchema(groupIdx, type)\n\t\t\tif (selected) {\n\t\t\t\treturn selected.label\n\t\t\t}\n\t\t\tconst value = this.schemaValue(groupIdx, type)\n\t\t\treturn value ? t('nextcloud-vue', 'Schema {id}', { id: value }) : ''\n\t\t},\n\n\t\t/**\n\t\t * Get schema options for a group's selected register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {Array<{label: string, value: string}>} NcSelect options\n\t\t */\n\t\tschemaSelectOptions(groupIdx) {\n\t\t\tconst reg = this.selectedRegister(groupIdx)\n\t\t\tif (!reg) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst schemas = this.schemasByRegister[reg.value] || []\n\t\t\treturn schemas.map((s) => ({\n\t\t\t\tlabel: (s.title && this.cnTranslate(s.title)) || s.slug || t('nextcloud-vue', 'Schema {id}', { id: s.id }),\n\t\t\t\tvalue: String(s.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Count configured types in a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {number} Count\n\t\t */\n\t\tconfiguredCount(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\treturn group.types.filter((type) => !!this.schemaValue(groupIdx, type)).length\n\t\t},\n\n\t\t/**\n\t\t * Check if a type row is expanded.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t * @return {boolean}\n\t\t */\n\t\tisExpanded(groupIdx, slug) {\n\t\t\treturn !!this.expandedRows[groupIdx + '-' + slug]\n\t\t},\n\n\t\t/**\n\t\t * Toggle a type row expansion.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t */\n\t\ttoggleExpand(groupIdx, slug) {\n\t\t\tconst key = groupIdx + '-' + slug\n\t\t\tthis.expandedRows = {\n\t\t\t\t...this.expandedRows,\n\t\t\t\t[key]: !this.expandedRows[key],\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle register selection change for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\tasync handleRegisterChange(groupIdx, option) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\n\t\t\t// Clear schema selections for this group\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: '' }\n\t\t\t}\n\n\t\t\t// Fetch schemas for the new register\n\t\t\tif (value) {\n\t\t\t\tawait this.loadSchemasForRegister(value)\n\n\t\t\t\t// Auto-match schemas\n\t\t\t\tif (this.autoMatch) {\n\t\t\t\t\tthis.autoMatchSchemas(groupIdx)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Handle schema selection change for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\thandleSchemaChange(groupIdx, type, option) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Auto-match schema titles to type slugs/labels (case-insensitive).\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t */\n\t\tautoMatchSchemas(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\t// Skip if already has a value\n\t\t\t\tif (this.localConfig[schemaKey]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst slug = type.slug.toLowerCase()\n\t\t\t\tconst label = type.label.toLowerCase()\n\n\t\t\t\tconst match = options.find((o) => {\n\t\t\t\t\tconst optLabel = o.label.toLowerCase()\n\t\t\t\t\treturn optLabel === slug || optLabel === label\n\t\t\t\t\t\t|| optLabel.includes(slug) || slug.includes(optLabel)\n\t\t\t\t})\n\n\t\t\t\tif (match) {\n\t\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: match.value }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** Emit save event with current config */\n\t\thandleSave() {\n\t\t\tthis.$emit('save', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Fetch the registers for the select, without their schemas, and the\n\t\t * schemas of the registers the configuration maps. Expanding the schemas\n\t\t * of every register costs megabytes on a busy instance.\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-only-mapped-registers-have-their-schemas-fetched\n\t\t */\n\t\tasync loadRegisters() {\n\t\t\tthis.registersLoading = true\n\t\t\tthis.registersError = null\n\n\t\t\ttry {\n\t\t\t\tconst [response] = await Promise.all([\n\t\t\t\t\tfetch(prefixUrl('/apps/openregister/api/registers'), {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t\t}),\n\t\t\t\t\t...this.mappedRegisterIds().map((id) => this.loadSchemasForRegister(id)),\n\t\t\t\t])\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.registersError = t('nextcloud-vue', 'The registers could not be loaded: {reason}', { reason: response.statusText || response.status })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst results = data.results || data\n\t\t\t\tthis.registers = Array.isArray(results) ? results : []\n\t\t\t\tthis.registersLoaded = true\n\t\t\t} catch (error) {\n\t\t\t\tthis.registersError = error.message || t('nextcloud-vue', 'The registers could not be loaded: {reason}', { reason: t('nextcloud-vue', 'no connection') })\n\t\t\t} finally {\n\t\t\t\tthis.registersLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch the schemas of one register, through `registers/{id}/schemas`,\n\t\t * or the register with its schemas expanded where that route is missing.\n\t\t *\n\t\t * @param {string} registerId Register ID\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-only-mapped-registers-have-their-schemas-fetched\n\t\t */\n\t\tasync loadSchemasForRegister(registerId) {\n\t\t\tconst id = String(registerId)\n\n\t\t\tif (this.schemasByRegister[id]?.length > 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this.schemaRequests[id]) {\n\t\t\t\tthis.schemaRequests[id] = this.fetchSchemas(id).finally(() => {\n\t\t\t\t\tdelete this.schemaRequests[id]\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait this.schemaRequests[id]\n\t\t},\n\n\t\t/**\n\t\t * One schema request for a register; fills `schemasByRegister`.\n\t\t *\n\t\t * @param {string} id Register ID\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchSchemas(id) {\n\t\t\ttry {\n\t\t\t\tlet response = await fetch(\n\t\t\t\t\tprefixUrl(`/apps/openregister/api/registers/${encodeURIComponent(id)}/schemas`),\n\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t)\n\t\t\t\tif (response.status === 404) {\n\t\t\t\t\tresponse = await fetch(\n\t\t\t\t\t\tprefixUrl(`/apps/openregister/api/registers/${encodeURIComponent(id)}?_extend[]=schemas`),\n\t\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst list = data.results || data.schemas || []\n\t\t\t\tconst schemas = (Array.isArray(list) ? list : []).filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\tthis.schemasByRegister = { ...this.schemasByRegister, [id]: schemas }\n\t\t\t} catch {\n\t\t\t\t// The register stays selected; its schema select stays empty.\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-register-mapping__group {\n\tmargin-bottom: 24px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: 20px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__group:last-child {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 12px;\n}\n\n.cn-register-mapping__group-heading {\n\tmargin: 0 0 12px;\n\tfont: inherit;\n}\n\n.cn-register-mapping__group--collapsed .cn-register-mapping__group-heading {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-toggle {\n\tbox-sizing: border-box;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__group-toggle:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n\tborder-radius: var(--border-radius);\n}\n\n.cn-register-mapping__group-chevron {\n\tdisplay: inline-flex;\n\tflex: none;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-toggle .cn-register-mapping__group-header {\n\tflex: 1 1 auto;\n\tflex-wrap: wrap;\n\tgap: 4px 12px;\n\tmin-width: 0;\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-title {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__group-status {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 12px 0;\n}\n\n.cn-register-mapping__register-select {\n\tmargin-bottom: 16px;\n\tmax-width: 400px;\n}\n\n.cn-register-mapping__type-list {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\toverflow: hidden;\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-list-header {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 8px 16px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 10px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tcursor: pointer;\n\ttransition: background-color 0.15s ease;\n}\n\n.cn-register-mapping__type-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row--expanded {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-name {\n\tfont-weight: 500;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__type-schema {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-register-mapping__type-status {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.cn-register-mapping__type-chevron {\n\tdisplay: flex;\n\tjustify-content: center;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__status-dot {\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 50%;\n}\n\n.cn-register-mapping__status-dot--configured {\n\tbackground-color: var(--color-success);\n}\n\n.cn-register-mapping__status-dot--unconfigured {\n\tbackground-color: var(--color-warning);\n}\n\n.cn-register-mapping__type-detail {\n\tpadding: 12px 16px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 8px 0;\n}\n\n/* Board look (PqBeheer): one open group, compact rows for the others. */\n.cn-register-mapping--board {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 14px;\n}\n\n.cn-register-mapping__board-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tpadding: 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n}\n\n.cn-register-mapping__board-head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tgap: 10px 16px;\n}\n\n.cn-register-mapping__board-title {\n\tmargin: 0;\n\tfont-size: 15px;\n\tfont-weight: 700;\n}\n\n.cn-register-mapping__selects-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-register-mapping__selects-register {\n\tmax-width: 50%;\n}\n\n.cn-register-mapping__select-grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--cn-register-mapping-columns, 3), minmax(0, 1fr));\n\tgap: 16px;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__selects-register {\n\t\tmax-width: none;\n\t}\n\n\t.cn-register-mapping__select-grid {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n\n.cn-register-mapping__board-select {\n\tmax-width: 400px;\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__board-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n}\n\n.cn-register-mapping__board-table th {\n\tpadding: 8px 12px 8px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: start;\n\twhite-space: nowrap;\n}\n\n.cn-register-mapping__board-table td {\n\tpadding: 10px 12px 10px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tfont-size: 14px;\n\tvertical-align: middle;\n}\n\n.cn-register-mapping__board-schema {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 32px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__board-schema:hover {\n\ttext-decoration: underline;\n}\n\n.cn-register-mapping__board-schema:focus-visible,\n.cn-register-mapping__board-link:focus-visible,\n.cn-register-mapping__board-group-row:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n\tborder-radius: var(--border-radius);\n}\n\n.cn-register-mapping__board-check {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-register-mapping__board-more {\n\tmargin: 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__board-link {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: var(--color-primary-element);\n\tfont: inherit;\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__board-groups {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-register-mapping__board-group-row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\twidth: 100%;\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: 10px 2px;\n\tborder: 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\tfont-size: 14px;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__board-group-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__board-chevron,\n.cn-register-mapping__board-group-count {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__board-group-name {\n\tflex: 1;\n}\n\n.cn-register-mapping__board-save {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tgap: 10px;\n}\n\n/* Slide transition */\n.slide-enter-active,\n.slide-leave-active {\n\ttransition: all 0.2s ease;\n\tmax-height: 200px;\n\toverflow: hidden;\n}\n\n.slide-enter,\n.slide-leave-to {\n\tmax-height: 0;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\topacity: 0;\n}\n\n/* Last row in list should not have bottom border */\n.cn-register-mapping__type-list > :last-child {\n\tborder-bottom: none;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__type-list-header {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__type-row {\n\t\tgrid-template-columns: 1fr auto 32px;\n\t}\n\n\t.cn-register-mapping__type-schema {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__register-select {\n\t\tmax-width: none;\n\t}\n}\n</style>\n"],"names":["_createBlock","_openBlock","_createElementBlock","_Fragment","_renderList","_toDisplayString","_createElementVNode","_createVNode","_createTextVNode","_normalizeClass","_renderSlot","_Transition","_vShow"],"mappings":"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"}
1
+ {"version":3,"file":"CnRegisterMapping.vue3.js","sources":["../../../../src/components/CnRegisterMapping/CnRegisterMapping.vue?vue&type=template&id=26243e0a&lang.js"],"sourcesContent":["<template>\n\t<CnSettingsSection\n\t\t:name=\"name\"\n\t\t:description=\"description\"\n\t\t:docUrl=\"docUrl\"\n\t\t:loading=\"registersLoading\"\n\t\t:loadingMessage=\"t('nextcloud-vue', 'Loading registers…')\"\n\t\t:error=\"!!registersError\"\n\t\t:errorMessage=\"registersError || ''\"\n\t\t:onRetry=\"loadRegisters\">\n\t\t<!-- Action buttons -->\n\t\t<template v-if=\"hasHeaderActions\" #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showSaveButton && !isBoardLook\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t@click=\"handleSave\">\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<ContentSave v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showReimportButton\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"reimporting\"\n\t\t\t\t@click=\"$emit('reimport')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"reimporting\" :size=\"20\" />\n\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ reimporting ? t('nextcloud-vue', 'Importing…') : reimportButtonText }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\n\t\t<!-- `boardLayout: \"selects\"` (DqBeheerinstellingen Configuratie): per\n\t\t group the register select, then a schema select per type in a\n\t\t grid of three, and one save button at the end. -->\n\t\t<div\n\t\t\tv-if=\"isBoardLook && boardLayout === 'selects' && !registersLoading && !registersError\"\n\t\t\tclass=\"cn-register-mapping cn-register-mapping--board cn-register-mapping--selects\"\n\t\t\tdata-testid=\"cn-register-mapping-selects\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__selects-group\">\n\t\t\t\t<h3 v-if=\"groups.length > 1\" class=\"cn-register-mapping__board-title\">\n\t\t\t\t\t{{ group.name }}\n\t\t\t\t</h3>\n\t\t\t\t<div class=\"cn-register-mapping__selects-register\" data-testid=\"cn-register-mapping-register\">\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"selectedRegister(groupIdx)\"\n\t\t\t\t\tclass=\"cn-register-mapping__select-grid\"\n\t\t\t\t\t:style=\"{ '--cn-register-mapping-columns': 3 }\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-select-grid\">\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\tv-for=\"type in group.types\"\n\t\t\t\t\t\t:key=\"type.slug + '-select'\"\n\t\t\t\t\t\t:modelValue=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t:inputLabel=\"type.label\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t</div>\n\t\t\t\t<NcNoteCard\n\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0\"\n\t\t\t\t\ttype=\"warning\">\n\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t\t<div v-if=\"showSaveButton\" class=\"cn-register-mapping__board-save\">\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-board-save\"\n\t\t\t\t\t@click=\"handleSave\">\n\t\t\t\t\t<template v-if=\"saving\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Group sections -->\n\t\t<div\n\t\t\tv-else-if=\"isBoardLook && !registersLoading && !registersError\"\n\t\t\tclass=\"cn-register-mapping cn-register-mapping--board\"\n\t\t\tdata-testid=\"cn-register-mapping-board\">\n\t\t\t<div class=\"cn-register-mapping__board-group\" data-testid=\"cn-register-mapping-board-group\">\n\t\t\t\t<div class=\"cn-register-mapping__board-head\">\n\t\t\t\t\t<h3 class=\"cn-register-mapping__board-title\">\n\t\t\t\t\t\t{{ activeGroup.name }}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t:label=\"groupStatusLabel(activeGroupIdx, true)\"\n\t\t\t\t\t\t:variant=\"groupStatusVariant(activeGroupIdx)\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-board-status\" />\n\t\t\t\t</div>\n\t\t\t\t<p v-if=\"activeGroup.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t{{ activeGroup.description }}\n\t\t\t\t</p>\n\t\t\t\t<div class=\"cn-register-mapping__register-select cn-register-mapping__board-select\">\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"selectedRegister(activeGroupIdx)\"\n\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(activeGroupIdx, $event)\" />\n\t\t\t\t</div>\n\t\t\t\t<table v-if=\"selectedRegister(activeGroupIdx)\" class=\"cn-register-mapping__board-table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Object type') }}\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t{{ labels.schema }}\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<template v-for=\"type in boardVisibleTypes\" :key=\"type.slug + '-board'\">\n\t\t\t\t\t\t\t<tr data-testid=\"cn-register-mapping-board-row\">\n\t\t\t\t\t\t\t\t<td>{{ type.label }}</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__board-schema\"\n\t\t\t\t\t\t\t\t\t\t:aria-expanded=\"String(isExpanded(activeGroupIdx, type.slug))\"\n\t\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Change the schema for {type}', { type: type.label })\"\n\t\t\t\t\t\t\t\t\t\t@click=\"toggleExpand(activeGroupIdx, type.slug)\">\n\t\t\t\t\t\t\t\t\t\t<CheckCircle\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"schemaValue(activeGroupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__board-check\"\n\t\t\t\t\t\t\t\t\t\t\t:size=\"16\" />\n\t\t\t\t\t\t\t\t\t\t{{ schemaLabel(activeGroupIdx, type) || t('nextcloud-vue', 'Not set') }}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"isExpanded(activeGroupIdx, type.slug)\" class=\"cn-register-mapping__board-detail\">\n\t\t\t\t\t\t\t\t<td colspan=\"2\">\n\t\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t\t:modelValue=\"selectedSchema(activeGroupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(activeGroupIdx)\"\n\t\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\t\t:inputLabel=\"labels.schema\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(activeGroupIdx, type, $event)\" />\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t\t<p\n\t\t\t\t\tv-if=\"selectedRegister(activeGroupIdx) && boardHiddenTypes.length > 0\"\n\t\t\t\t\tclass=\"cn-register-mapping__board-more\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-board-more\">\n\t\t\t\t\t{{ boardHiddenSummary }}\n\t\t\t\t\t<button type=\"button\" class=\"cn-register-mapping__board-link\" @click=\"showAllTypes = true\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Show all types') }}\n\t\t\t\t\t</button>\n\t\t\t\t</p>\n\t\t\t\t<NcNoteCard v-if=\"!selectedRegister(activeGroupIdx)\" type=\"info\">\n\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t</NcNoteCard>\n\t\t\t\t<NcNoteCard\n\t\t\t\t\tv-if=\"selectedRegister(activeGroupIdx) && schemaSelectOptions(activeGroupIdx).length === 0\"\n\t\t\t\t\ttype=\"warning\">\n\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t\t<ul v-if=\"boardOtherGroups.length > 0\" class=\"cn-register-mapping__board-groups\">\n\t\t\t\t<li v-for=\"item in boardOtherGroups\" :key=\"item.idx\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-register-mapping__board-group-row\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-board-group-row\"\n\t\t\t\t\t\t@click=\"openBoardGroup(item.idx)\">\n\t\t\t\t\t\t<ChevronRight :size=\"18\" class=\"cn-register-mapping__board-chevron\" />\n\t\t\t\t\t\t<strong class=\"cn-register-mapping__board-group-name\">{{ item.group.name }}</strong>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__board-group-count\">\n\t\t\t\t\t\t\t{{ n('nextcloud-vue', '%n type', '%n types', item.group.types.length) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t:label=\"groupStatusLabel(item.idx, false)\"\n\t\t\t\t\t\t\t:variant=\"groupStatusVariant(item.idx)\" />\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<div v-if=\"showSaveButton\" class=\"cn-register-mapping__board-save\">\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-board-save\"\n\t\t\t\t\t@click=\"handleSave\">\n\t\t\t\t\t<template v-if=\"saving\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div v-else-if=\"!registersLoading && !registersError\" class=\"cn-register-mapping\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__group\"\n\t\t\t\t:class=\"{ 'cn-register-mapping__group--collapsed': !isGroupOpen(groupIdx) }\"\n\t\t\t\tdata-testid=\"cn-register-mapping-group\">\n\t\t\t\t<!-- Group header. With collapsible groups a heading holds the button\n\t\t\t\t that opens and closes the group (the WAI-ARIA accordion); the\n\t\t\t\t count stays visible while it is closed. -->\n\t\t\t\t<h4 v-if=\"groupsCollapsible\" class=\"cn-register-mapping__group-heading\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-register-mapping__group-toggle\"\n\t\t\t\t\t\t:aria-expanded=\"String(isGroupOpen(groupIdx))\"\n\t\t\t\t\t\t:aria-controls=\"groupBodyId(groupIdx)\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-group-toggle\"\n\t\t\t\t\t\t@click=\"toggleGroup(groupIdx)\">\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-chevron\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<ChevronUp v-if=\"isGroupOpen(groupIdx)\" :size=\"20\" />\n\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<slot name=\"group-header\"\n\t\t\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-title\">{{ group.name }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\" data-testid=\"cn-register-mapping-group-count\">\n\t\t\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</slot>\n\t\t\t\t\t</button>\n\t\t\t\t</h4>\n\t\t\t\t<slot v-else\n\t\t\t\t\tname=\"group-header\"\n\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t<div class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t<h4 class=\"cn-register-mapping__group-title\">\n\t\t\t\t\t\t\t{{ group.name }}\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\">\n\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</slot>\n\n\t\t\t\t<div\n\t\t\t\t\tv-show=\"isGroupOpen(groupIdx)\"\n\t\t\t\t\t:id=\"groupBodyId(groupIdx)\"\n\t\t\t\t\tclass=\"cn-register-mapping__group-body\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-group-body\">\n\t\t\t\t\t<!-- Group description -->\n\t\t\t\t\t<p v-if=\"group.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t\t{{ group.description }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Register selector -->\n\t\t\t\t\t<div class=\"cn-register-mapping__register-select\">\n\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t:modelValue=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\t\t:loading=\"registersLoading\"\n\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Type list -->\n\t\t\t\t\t<div v-if=\"selectedRegister(groupIdx)\" class=\"cn-register-mapping__type-list\">\n\t\t\t\t\t\t<!-- Header row -->\n\t\t\t\t\t\t<div class=\"cn-register-mapping__type-list-header\">\n\t\t\t\t\t\t\t<span>{{ t('nextcloud-vue', 'Object type') }}</span>\n\t\t\t\t\t\t\t<span>{{ labels.schema }}</span>\n\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Type rows -->\n\t\t\t\t\t\t<template v-for=\"type in group.types\" :key=\"type.slug + '-row'\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-row\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-register-mapping__type-row--expanded': isExpanded(groupIdx, type.slug) }\"\n\t\t\t\t\t\t\t\t@click=\"toggleExpand(groupIdx, type.slug)\">\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-name\">{{ type.label }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-schema\">\n\t\t\t\t\t\t\t\t\t{{ schemaLabel(groupIdx, type) || labels.notConfigured }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-status\">\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__status-dot\"\n\t\t\t\t\t\t\t\t\t\t:class=\"schemaValue(groupIdx, type)\n\t\t\t\t\t\t\t\t\t\t\t? 'cn-register-mapping__status-dot--configured'\n\t\t\t\t\t\t\t\t\t\t\t: 'cn-register-mapping__status-dot--unconfigured'\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-chevron\">\n\t\t\t\t\t\t\t\t\t<ChevronUp v-if=\"isExpanded(groupIdx, type.slug)\" :size=\"20\" />\n\t\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Expanded detail -->\n\t\t\t\t\t\t\t<transition name=\"slide\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tv-if=\"isExpanded(groupIdx, type.slug)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-detail\">\n\t\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t\t:modelValue=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\t\t:inputLabel=\"labels.schema\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</transition>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- No register selected -->\n\t\t\t\t\t<NcNoteCard v-else-if=\"!registersLoading\" type=\"info\">\n\t\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t\t</NcNoteCard>\n\n\t\t\t\t\t<!-- No schemas available -->\n\t\t\t\t\t<NcNoteCard\n\t\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0 && !registersLoading\"\n\t\t\t\t\t\tvariant=\"warning\">\n\t\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t\t</NcNoteCard>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Footer -->\n\t\t<template v-if=\"$slots.footer\" #footer>\n\t\t\t<slot name=\"footer\" />\n\t\t</template>\n\t</CnSettingsSection>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcLoadingIcon, NcNoteCard, NcSelect } from '@nextcloud/vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport ContentSave from 'vue-material-design-icons/ContentSave.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\n\nlet mappingCount = 0\n\n/**\n * CnRegisterMapping - OpenRegister register/schema configuration component.\n *\n * Displays and manages register-to-schema mappings for app object types.\n * Self-fetches available registers and schemas from the OpenRegister API.\n * Supports multiple register groups (stacked sections) with expandable\n * type rows for manual schema override.\n *\n * Only the registers the configuration maps have their schemas fetched; the\n * register select lists every register without its schemas.\n *\n * In the board look one group is open as a type/schema table under a status\n * chip, the other groups are rows with their type count and status, and the\n * save button closes the section.\n *\n * Single register (Pipelinq)\n * ```vue\n * <CnRegisterMapping\n * name=\"Register Configuration\"\n * :groups=\"[{\n * name: 'Core Objects',\n * types: [\n * { slug: 'client', label: 'Client' },\n * { slug: 'contact', label: 'Contact' },\n * ],\n * }]\"\n * :configuration=\"config\"\n * :show-reimport-button=\"true\"\n * @save=\"saveConfig\"\n * @reimport=\"reimport\" />\n * ```\n *\n * Multi-register (Stackiq)\n * ```vue\n * <CnRegisterMapping\n * :groups=\"[\n * { name: 'Voorzieningen', registerConfigKey: 'voorzieningen_register', types: [...] },\n * { name: 'AMEF', registerConfigKey: 'amef_register', types: [...] },\n * ]\"\n * :configuration=\"config\"\n * @save=\"saveConfig\" />\n * ```\n */\nexport default {\n\tname: 'CnRegisterMapping',\n\n\tcomponents: {\n\t\tCnSettingsSection,\n\t\tCnStatusBadge,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcNoteCard,\n\t\tNcSelect,\n\t\tContentSave,\n\t\tRefresh,\n\t\tCheckCircle,\n\t\tChevronDown,\n\t\tChevronRight,\n\t\tChevronUp,\n\t},\n\n\tinject: {\n\t\t/** The look CnAppRoot or CnAdminSettingsShell provides. */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/** The app's translate, for register and schema titles; identity outside CnAppRoot. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Section title */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Register configuration'),\n\t\t},\n\n\t\t/** Section description */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Configure OpenRegister schema mappings for your object types'),\n\t\t},\n\n\t\t/** Documentation URL */\n\t\tdocUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Groups of object types that share a register.\n\t\t *\n\t\t * @type {Array<{ name: string, description: string, registerConfigKey: string, types: Array<{ slug: string, label: string, description: string, configKey: string }> }>}\n\t\t */\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator: (groups) => groups.length > 0\n\t\t\t\t&& groups.every((g) => g.name && Array.isArray(g.types) && g.types.length > 0),\n\t\t},\n\n\t\t/** Current configuration values: { register: '5', client_schema: '28', ... } */\n\t\tconfiguration: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Show save button */\n\t\tshowSaveButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether save is in progress */\n\t\tsaving: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show reimport button */\n\t\tshowReimportButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether reimport is in progress */\n\t\treimporting: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Save button text */\n\t\tsaveButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Save configuration'),\n\t\t},\n\n\t\t/** Reimport button text */\n\t\treimportButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Re-import configuration'),\n\t\t},\n\n\t\t/**\n\t\t * Draw each group as a header that opens and closes it, showing its\n\t\t * configured count while closed. The groups start closed. `null` (the\n\t\t * default) collapses them when there is more than one group, so a page\n\t\t * with several registers is not one long card.\n\t\t *\n\t\t * @type {boolean|null}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\tcollapseGroups: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The look the mapping is drawn in: `board` or `nextcloud`. Empty\n\t\t * follows the provided `cnLook`.\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\tlook: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Board look: how the types are drawn. `table` (default) is the open\n\t\t * group's type and schema table with the other groups as rows\n\t\t * (PqBeheer); `selects` is the register select and a schema select per\n\t\t * type in a grid of three for every group (DqBeheerinstellingen).\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-select-grid/specs/register-mapping-select-grid/spec.md#requirement-the-board-look-can-draw-the-schemas-as-a-grid-of-selects\n\t\t */\n\t\tboardLayout: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (value) => ['table', 'selects'].includes(value),\n\t\t},\n\n\t\t/**\n\t\t * Board look: how many types the open group lists before a \"show all\"\n\t\t * line. 0 lists every type.\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\tboardRowLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 4,\n\t\t},\n\n\t\t/** Auto-match schema titles to type slugs on register change */\n\t\tautoMatch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** UI labels (i18n) */\n\t\tlabels: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({\n\t\t\t\tregister: t('nextcloud-vue', 'Register'),\n\t\t\t\tschema: t('nextcloud-vue', 'Schema'),\n\t\t\t\tconfigured: t('nextcloud-vue', 'Configured'),\n\t\t\t\tnotConfigured: t('nextcloud-vue', 'Not configured'),\n\t\t\t\tnoSchemas: t('nextcloud-vue', 'No schemas available in this register'),\n\t\t\t\tselectRegister: t('nextcloud-vue', 'Select a register'),\n\t\t\t\tselectSchema: t('nextcloud-vue', 'Select a schema'),\n\t\t\t\tallConfigured: t('nextcloud-vue', 'All types configured'),\n\t\t\t\tpartiallyConfigured: t('nextcloud-vue', 'configured'),\n\t\t\t}),\n\t\t},\n\t},\n\n\temits: ['update:configuration', 'save', 'reimport'],\n\n\tdata() {\n\t\treturn {\n\t\t\t// Fetched data\n\t\t\tregisters: [],\n\t\t\tschemasByRegister: {},\n\t\t\tregistersLoading: false,\n\t\t\tregistersError: null,\n\t\t\t// Local state\n\t\t\tlocalConfig: {},\n\t\t\texpandedRows: {},\n\t\t\t// The groups opened by the reader, by index.\n\t\t\topenGroups: {},\n\t\t\t// Board look: the group drawn open, and whether it lists every type.\n\t\t\tactiveGroupIdx: 0,\n\t\t\t// Schema requests by register id, so a register is fetched once.\n\t\t\tschemaRequests: {},\n\t\t\tregistersLoaded: false,\n\t\t\tshowAllTypes: false,\n\t\t\tuid: ++mappingCount,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Register options for NcSelect */\n\t\tregisterSelectOptions() {\n\t\t\treturn this.registers.map((r) => ({\n\t\t\t\tlabel: (r.title && this.cnTranslate(r.title)) || r.slug || t('nextcloud-vue', 'Register {id}', { id: r.id }),\n\t\t\t\tvalue: String(r.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether the groups open and close.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\tgroupsCollapsible() {\n\t\t\treturn this.collapseGroups === null ? this.groups.length > 1 : this.collapseGroups\n\t\t},\n\n\t\t/**\n\t\t * Whether the board look applies.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLook() {\n\t\t\treturn normalizeLook(this.look || this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The group the board look draws open.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tactiveGroup() {\n\t\t\treturn this.groups[this.activeGroupIdx] || this.groups[0]\n\t\t},\n\n\t\t/**\n\t\t * The open group's types the board table lists.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tboardVisibleTypes() {\n\t\t\tconst types = this.activeGroup.types\n\t\t\tif (this.showAllTypes || this.boardRowLimit <= 0) {\n\t\t\t\treturn types\n\t\t\t}\n\t\t\treturn types.slice(0, this.boardRowLimit)\n\t\t},\n\n\t\t/**\n\t\t * The open group's types below the row limit.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tboardHiddenTypes() {\n\t\t\treturn this.activeGroup.types.slice(this.boardVisibleTypes.length)\n\t\t},\n\n\t\t/**\n\t\t * The line under the board table that counts the types not listed.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tboardHiddenSummary() {\n\t\t\tconst count = this.boardHiddenTypes.length\n\t\t\tconst allSet = this.boardHiddenTypes.every((type) => !!this.schemaValue(this.activeGroupIdx, type))\n\t\t\treturn allSet\n\t\t\t\t? n('nextcloud-vue', 'And %n more type in this group, set up.', 'And %n more types in this group, all set up.', count)\n\t\t\t\t: n('nextcloud-vue', 'And %n more type in this group.', 'And %n more types in this group.', count)\n\t\t},\n\n\t\t/**\n\t\t * The groups the board look draws as compact rows, with their index.\n\t\t *\n\t\t * @return {Array<{group: object, idx: number}>}\n\t\t */\n\t\tboardOtherGroups() {\n\t\t\treturn this.groups\n\t\t\t\t.map((group, idx) => ({ group, idx }))\n\t\t\t\t.filter((item) => item.idx !== this.activeGroupIdx)\n\t\t},\n\n\t\t/**\n\t\t * Whether the section header draws buttons; the board look saves at the end.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasHeaderActions() {\n\t\t\treturn (this.showSaveButton && !this.isBoardLook) || this.showReimportButton || !!this.$slots.actions\n\t\t},\n\n\t\t/** Whether local config differs from prop */\n\t\thasChanges() {\n\t\t\treturn JSON.stringify(this.localConfig) !== JSON.stringify(this.configuration)\n\t\t},\n\t},\n\n\twatch: {\n\t\tconfiguration: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.localConfig = { ...newVal }\n\t\t\t\tif (this.registersLoaded) {\n\t\t\t\t\tthis.mappedRegisterIds().forEach((id) => this.loadSchemasForRegister(id))\n\t\t\t\t}\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\n\t\tgroups() {\n\t\t\tif (this.activeGroupIdx >= this.groups.length) {\n\t\t\t\tthis.activeGroupIdx = 0\n\t\t\t}\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.loadRegisters()\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tn,\n\n\t\t/**\n\t\t * The status chip text of a group: every type set up, none, or how many.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {boolean} open Whether the group is the open one, which says \"All types set up\"\n\t\t * @return {string}\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\tgroupStatusLabel(groupIdx, open) {\n\t\t\tconst configured = this.configuredCount(groupIdx)\n\t\t\tconst total = this.groups[groupIdx].types.length\n\t\t\tif (configured === total) {\n\t\t\t\treturn open ? t('nextcloud-vue', 'All types set up') : t('nextcloud-vue', 'Set up')\n\t\t\t}\n\t\t\tif (configured === 0) {\n\t\t\t\treturn t('nextcloud-vue', 'Not set')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{configured} of {total} set up', { configured, total })\n\t\t},\n\n\t\t/**\n\t\t * The status chip variant of a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {'success'|'warning'|'default'}\n\t\t */\n\t\tgroupStatusVariant(groupIdx) {\n\t\t\tconst configured = this.configuredCount(groupIdx)\n\t\t\tif (configured === this.groups[groupIdx].types.length) {\n\t\t\t\treturn 'success'\n\t\t\t}\n\t\t\treturn configured === 0 ? 'default' : 'warning'\n\t\t},\n\n\t\t/**\n\t\t * Board look: draw another group open.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {void}\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-the-board-look-draws-one-open-group-and-compact-rows\n\t\t */\n\t\topenBoardGroup(groupIdx) {\n\t\t\tthis.activeGroupIdx = groupIdx\n\t\t\tthis.showAllTypes = false\n\t\t},\n\n\t\t/**\n\t\t * The register ids the configuration maps, one per distinct value.\n\t\t *\n\t\t * @return {string[]}\n\t\t */\n\t\tmappedRegisterIds() {\n\t\t\tconst ids = this.groups\n\t\t\t\t.map((group, idx) => String(this.localConfig[this.registerConfigKey(idx)] || ''))\n\t\t\t\t.filter(Boolean)\n\t\t\treturn [...new Set(ids)]\n\t\t},\n\n\t\t/**\n\t\t * Whether a group's body shows.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {boolean}\n\t\t */\n\t\tisGroupOpen(groupIdx) {\n\t\t\treturn !this.groupsCollapsible || this.openGroups[groupIdx] === true\n\t\t},\n\n\t\t/**\n\t\t * Open a closed group, or close an open one.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {void}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\ttoggleGroup(groupIdx) {\n\t\t\tthis.openGroups = { ...this.openGroups, [groupIdx]: !this.isGroupOpen(groupIdx) }\n\t\t},\n\n\t\t/**\n\t\t * The id of a group's body, for the header's `aria-controls`.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string}\n\t\t */\n\t\tgroupBodyId(groupIdx) {\n\t\t\treturn `cn-register-mapping-${this.uid}-group-${groupIdx}`\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a group's register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string} Config key\n\t\t */\n\t\tregisterConfigKey(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tif (group.registerConfigKey) {\n\t\t\t\treturn group.registerConfigKey\n\t\t\t}\n\t\t\tif (this.groups.length === 1) {\n\t\t\t\treturn 'register'\n\t\t\t}\n\t\t\treturn group.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_register'\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a type's schema.\n\t\t *\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Config key\n\t\t */\n\t\tschemaConfigKey(type) {\n\t\t\treturn type.configKey || type.slug + '_schema'\n\t\t},\n\n\t\t/**\n\t\t * Get the selected register option for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedRegister(groupIdx) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.registerSelectOptions.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the selected schema option for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedSchema(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\t\t\treturn options.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the schema value (ID) for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema ID or empty string\n\t\t */\n\t\tschemaValue(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\treturn this.localConfig[key] || ''\n\t\t},\n\n\t\t/**\n\t\t * Get the display label for a type's current schema.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema label or empty string\n\t\t */\n\t\tschemaLabel(groupIdx, type) {\n\t\t\tconst selected = this.selectedSchema(groupIdx, type)\n\t\t\tif (selected) {\n\t\t\t\treturn selected.label\n\t\t\t}\n\t\t\tconst value = this.schemaValue(groupIdx, type)\n\t\t\treturn value ? t('nextcloud-vue', 'Schema {id}', { id: value }) : ''\n\t\t},\n\n\t\t/**\n\t\t * Get schema options for a group's selected register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {Array<{label: string, value: string}>} NcSelect options\n\t\t */\n\t\tschemaSelectOptions(groupIdx) {\n\t\t\tconst reg = this.selectedRegister(groupIdx)\n\t\t\tif (!reg) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst schemas = this.schemasByRegister[reg.value] || []\n\t\t\treturn schemas.map((s) => ({\n\t\t\t\tlabel: (s.title && this.cnTranslate(s.title)) || s.slug || t('nextcloud-vue', 'Schema {id}', { id: s.id }),\n\t\t\t\tvalue: String(s.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Count configured types in a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {number} Count\n\t\t */\n\t\tconfiguredCount(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\treturn group.types.filter((type) => !!this.schemaValue(groupIdx, type)).length\n\t\t},\n\n\t\t/**\n\t\t * Check if a type row is expanded.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t * @return {boolean}\n\t\t */\n\t\tisExpanded(groupIdx, slug) {\n\t\t\treturn !!this.expandedRows[groupIdx + '-' + slug]\n\t\t},\n\n\t\t/**\n\t\t * Toggle a type row expansion.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t */\n\t\ttoggleExpand(groupIdx, slug) {\n\t\t\tconst key = groupIdx + '-' + slug\n\t\t\tthis.expandedRows = {\n\t\t\t\t...this.expandedRows,\n\t\t\t\t[key]: !this.expandedRows[key],\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle register selection change for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\tasync handleRegisterChange(groupIdx, option) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\n\t\t\t// Clear schema selections for this group\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: '' }\n\t\t\t}\n\n\t\t\t// Fetch schemas for the new register\n\t\t\tif (value) {\n\t\t\t\tawait this.loadSchemasForRegister(value)\n\n\t\t\t\t// Auto-match schemas\n\t\t\t\tif (this.autoMatch) {\n\t\t\t\t\tthis.autoMatchSchemas(groupIdx)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Handle schema selection change for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\thandleSchemaChange(groupIdx, type, option) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Auto-match schema titles to type slugs/labels (case-insensitive).\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t */\n\t\tautoMatchSchemas(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\t// Skip if already has a value\n\t\t\t\tif (this.localConfig[schemaKey]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst slug = type.slug.toLowerCase()\n\t\t\t\tconst label = type.label.toLowerCase()\n\n\t\t\t\tconst match = options.find((o) => {\n\t\t\t\t\tconst optLabel = o.label.toLowerCase()\n\t\t\t\t\treturn optLabel === slug || optLabel === label\n\t\t\t\t\t\t|| optLabel.includes(slug) || slug.includes(optLabel)\n\t\t\t\t})\n\n\t\t\t\tif (match) {\n\t\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: match.value }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** Emit save event with current config */\n\t\thandleSave() {\n\t\t\tthis.$emit('save', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Fetch the registers for the select, without their schemas, and the\n\t\t * schemas of the registers the configuration maps. Expanding the schemas\n\t\t * of every register costs megabytes on a busy instance.\n\t\t *\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-only-mapped-registers-have-their-schemas-fetched\n\t\t */\n\t\tasync loadRegisters() {\n\t\t\tthis.registersLoading = true\n\t\t\tthis.registersError = null\n\n\t\t\ttry {\n\t\t\t\tconst [response] = await Promise.all([\n\t\t\t\t\tfetch(prefixUrl('/apps/openregister/api/registers'), {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t\t}),\n\t\t\t\t\t...this.mappedRegisterIds().map((id) => this.loadSchemasForRegister(id)),\n\t\t\t\t])\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.registersError = t('nextcloud-vue', 'The registers could not be loaded: {reason}', { reason: response.statusText || response.status })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst results = data.results || data\n\t\t\t\tthis.registers = Array.isArray(results) ? results : []\n\t\t\t\tthis.registersLoaded = true\n\t\t\t} catch (error) {\n\t\t\t\tthis.registersError = error.message || t('nextcloud-vue', 'The registers could not be loaded: {reason}', { reason: t('nextcloud-vue', 'no connection') })\n\t\t\t} finally {\n\t\t\t\tthis.registersLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch the schemas of one register, through `registers/{id}/schemas`,\n\t\t * or the register with its schemas expanded where that route is missing.\n\t\t *\n\t\t * @param {string} registerId Register ID\n\t\t * @spec openspec/changes/register-mapping-board-look/specs/register-mapping/spec.md#requirement-only-mapped-registers-have-their-schemas-fetched\n\t\t */\n\t\tasync loadSchemasForRegister(registerId) {\n\t\t\tconst id = String(registerId)\n\n\t\t\tif (this.schemasByRegister[id]?.length > 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this.schemaRequests[id]) {\n\t\t\t\tthis.schemaRequests[id] = this.fetchSchemas(id).finally(() => {\n\t\t\t\t\tdelete this.schemaRequests[id]\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait this.schemaRequests[id]\n\t\t},\n\n\t\t/**\n\t\t * One schema request for a register; fills `schemasByRegister`.\n\t\t *\n\t\t * @param {string} id Register ID\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchSchemas(id) {\n\t\t\ttry {\n\t\t\t\tlet response = await fetch(\n\t\t\t\t\tprefixUrl(`/apps/openregister/api/registers/${encodeURIComponent(id)}/schemas`),\n\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t)\n\t\t\t\tif (response.status === 404) {\n\t\t\t\t\tresponse = await fetch(\n\t\t\t\t\t\tprefixUrl(`/apps/openregister/api/registers/${encodeURIComponent(id)}?_extend[]=schemas`),\n\t\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst list = data.results || data.schemas || []\n\t\t\t\tconst schemas = (Array.isArray(list) ? list : []).filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\tthis.schemasByRegister = { ...this.schemasByRegister, [id]: schemas }\n\t\t\t} catch {\n\t\t\t\t// The register stays selected; its schema select stays empty.\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-register-mapping__group {\n\tmargin-bottom: 24px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: 20px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__group:last-child {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 12px;\n}\n\n.cn-register-mapping__group-heading {\n\tmargin: 0 0 12px;\n\tfont: inherit;\n}\n\n.cn-register-mapping__group--collapsed .cn-register-mapping__group-heading {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-toggle {\n\tbox-sizing: border-box;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__group-toggle:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n\tborder-radius: var(--border-radius);\n}\n\n.cn-register-mapping__group-chevron {\n\tdisplay: inline-flex;\n\tflex: none;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-toggle .cn-register-mapping__group-header {\n\tflex: 1 1 auto;\n\tflex-wrap: wrap;\n\tgap: 4px 12px;\n\tmin-width: 0;\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-title {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__group-status {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 12px 0;\n}\n\n.cn-register-mapping__register-select {\n\tmargin-bottom: 16px;\n\tmax-width: 400px;\n}\n\n.cn-register-mapping__type-list {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\toverflow: hidden;\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-list-header {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 8px 16px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 10px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tcursor: pointer;\n\ttransition: background-color 0.15s ease;\n}\n\n.cn-register-mapping__type-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row--expanded {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-name {\n\tfont-weight: 500;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__type-schema {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-register-mapping__type-status {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.cn-register-mapping__type-chevron {\n\tdisplay: flex;\n\tjustify-content: center;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__status-dot {\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 50%;\n}\n\n.cn-register-mapping__status-dot--configured {\n\tbackground-color: var(--color-success);\n}\n\n.cn-register-mapping__status-dot--unconfigured {\n\tbackground-color: var(--color-warning);\n}\n\n.cn-register-mapping__type-detail {\n\tpadding: 12px 16px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 8px 0;\n}\n\n/* Board look (PqBeheer): one open group, compact rows for the others. */\n.cn-register-mapping--board {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 14px;\n}\n\n.cn-register-mapping__board-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tpadding: 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n}\n\n.cn-register-mapping__board-head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tgap: 10px 16px;\n}\n\n.cn-register-mapping__board-title {\n\tmargin: 0;\n\tfont-size: 15px;\n\tfont-weight: 700;\n}\n\n.cn-register-mapping__selects-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-register-mapping__selects-register {\n\tmax-width: 50%;\n}\n\n/* DqBeheerinstellingen: the register select fills its half of the card. */\n.cn-register-mapping__selects-register :deep(.v-select) {\n\twidth: 100%;\n\tmax-width: none;\n}\n\n.cn-register-mapping__select-grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--cn-register-mapping-columns, 3), minmax(0, 1fr));\n\tgap: 16px;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__selects-register {\n\t\tmax-width: none;\n\t}\n\n\t.cn-register-mapping__select-grid {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n\n.cn-register-mapping__board-select {\n\tmax-width: 400px;\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__board-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n}\n\n.cn-register-mapping__board-table th {\n\tpadding: 8px 12px 8px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: start;\n\twhite-space: nowrap;\n}\n\n.cn-register-mapping__board-table td {\n\tpadding: 10px 12px 10px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tfont-size: 14px;\n\tvertical-align: middle;\n}\n\n.cn-register-mapping__board-schema {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 32px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__board-schema:hover {\n\ttext-decoration: underline;\n}\n\n.cn-register-mapping__board-schema:focus-visible,\n.cn-register-mapping__board-link:focus-visible,\n.cn-register-mapping__board-group-row:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n\tborder-radius: var(--border-radius);\n}\n\n.cn-register-mapping__board-check {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-register-mapping__board-more {\n\tmargin: 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__board-link {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: var(--color-primary-element);\n\tfont: inherit;\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__board-groups {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-register-mapping__board-group-row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\twidth: 100%;\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: 10px 2px;\n\tborder: 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\tfont-size: 14px;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__board-group-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__board-chevron,\n.cn-register-mapping__board-group-count {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__board-group-name {\n\tflex: 1;\n}\n\n.cn-register-mapping__board-save {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tgap: 10px;\n}\n\n/* Slide transition */\n.slide-enter-active,\n.slide-leave-active {\n\ttransition: all 0.2s ease;\n\tmax-height: 200px;\n\toverflow: hidden;\n}\n\n.slide-enter,\n.slide-leave-to {\n\tmax-height: 0;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\topacity: 0;\n}\n\n/* Last row in list should not have bottom border */\n.cn-register-mapping__type-list > :last-child {\n\tborder-bottom: none;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__type-list-header {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__type-row {\n\t\tgrid-template-columns: 1fr auto 32px;\n\t}\n\n\t.cn-register-mapping__type-schema {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__register-select {\n\t\tmax-width: none;\n\t}\n}\n</style>\n"],"names":["_createBlock","_openBlock","_createElementBlock","_Fragment","_renderList","_toDisplayString","_createElementVNode","_createVNode","_createTextVNode","_normalizeClass","_renderSlot","_Transition","_vShow"],"mappings":";;;;AA0CG,EAAA,KAAK,EAAC,6EAA4E;AAClF,EAAA,aAAW,EAAC,6BAA6B;;;;AAKX,EAAA,KAAK,EAAC,kCAAkC;;;AAGhE,EAAA,KAAK,EAAC,uCAAwC;AAAA,EAAA,aAAW,EAAC,8BAA8B;;;;AAa5F,EAAA,KAAK,EAAC,kCAAiC;AACtC,EAAA,KAAK,EAAE,EAAsC,+BAAA,EAAA,CAAA,EAAA;AAC9C,EAAA,aAAW,EAAC,iCAAiC;;;;AAmBpB,EAAA,KAAK,EAAC,iCAAiC;;;;AAiBlE,EAAA,KAAK,EAAC,gDAA+C;AACrD,EAAA,aAAW,EAAC,2BAA2B;;;AAClC,EAAA,KAAK,EAAC,kCAAiC;AAAE,EAAA,aAAW,EAAC,iCAAiC;;AACrF,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,iCAAiC,GAAA;AACvC,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,kCAAkC,GAAA;;;AAQX,EAAA,KAAK,EAAC,wCAAwC;;AAG3E,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,wEAAwE,GAAA;;;AAUpC,EAAA,KAAK,EAAC,kCAAkC;;AAGhF,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,KAAK,GAAA;AAGX,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,KAAK,GAAA;AAOX,MAAA,WAAA,GAAA,EAAA,aAAW,EAAC,+BAA+B,GAAA;;;;AAiBE,EAAA,KAAK,EAAC,mCAAmC;;AACrF,MAAA,WAAA,GAAA,EAAA,OAAO,EAAC,GAAG,GAAA;;;AACa,EAAA,KAAK,EAAC,uCAAuC;;;;AAkB5E,EAAA,KAAK,EAAC,iCAAgC;AACtC,EAAA,aAAW,EAAC,gCAAgC;;;;AAeP,EAAA,KAAK,EAAC,mCAAmC;;;AAQrE,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,uCAAuC,GAAA;AAC/C,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,wCAAwC,GAAA;;;AAS5B,EAAA,KAAK,EAAC,iCAAiC;;;;AAcb,EAAA,KAAK,EAAC,qBAAqB;;;;AAUlD,EAAA,KAAK,EAAC,oCAAoC;;;;AAQ/D,EAAA,KAAK,EAAC;AAAqC,EAAA,aAAW,EAAC,MAAM;;AAQ5D,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,mCAAmC,GAAA;AACxC,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,kCAAkC,GAAA;;AACxC,EAAA,KAAK,EAAC,mCAAoC;AAAA,EAAA,aAAW,EAAC,iCAAiC;;AAY3F,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,mCAAmC,GAAA;AACzC,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,kCAAkC,GAAA;AAGtC,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,mCAAmC,GAAA;;;;AAYpB,EAAA,KAAK,EAAC,wCAAwC;;AAKrE,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,sCAAsC,GAAA;;;AAaV,EAAA,KAAK,EAAC,gCAAgC;;AAEvE,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,uCAAuC,GAAA;;AAa1C,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,gCAAgC,GAAA;AACtC,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,kCAAkC,GAAA;AAGxC,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,kCAAkC,GAAA;AAOxC,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,mCAAmC,GAAA;;;AAU9C,EAAA,KAAK,EAAC,kCAAkC;;;;AACb,EAAA,KAAK,EAAC,uCAAuC;;;;;;;;;;;;;;;;;uBA/UhFA,WAkXmB,CAAA,4BAAA,EAAA;AAjXjB,IAAA,IAAI,EAAE,MAAI,CAAA,IAAA;AACV,IAAA,WAAW,EAAE,MAAW,CAAA,WAAA;AACxB,IAAA,MAAM,EAAE,MAAM,CAAA,MAAA;AACd,IAAA,OAAO,EAAE,KAAgB,CAAA,gBAAA;AACzB,IAAA,cAAc,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,oBAAA,CAAA;AACjB,IAAA,KAAK,IAAI,KAAc,CAAA,cAAA;AACvB,IAAA,YAAY,EAAE,KAAa,CAAA,cAAA,IAAA,EAAA;AAC3B,IAAA,OAAO,EAAE,QAAa,CAAA,aAAA;;qBA+BvB,MAyDK;AAxDE,MAAA,CAAA,QAAA,CAAA,eAAe,MAAA,CAAA,WAAY,KAAkB,SAAA,IAAA,CAAA,KAAA,CAAA,gBAAe,KAAM,KAAc,CAAA,cAAA;AADvF,WAAAC,SAAA,EAAA,EAAAC,kBAAA,CAyDK,OAzDL,UAyDK,EAAA;AArDJ,aAAAD,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA,CAwCKC,QAvCwB,EAAA,IAAA,EAAAC,UAAA,CAAA,MAAA,CAAA,MAAM,EAA1B,CAAA,KAAK,EAAE,QAAQ,KAAA;mCADxBF,kBAwCK,CAAA,KAAA,EAAA;AAtCH,gBAAA,GAAG,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAC,oCAAoC;;AAChC,gBAAA,CAAA,MAAA,CAAA,MAAM,CAAC,MAAO,GAAA,CAAA;AAAxB,qBAAAD,SAAA,EAAA,EAAAC,kBAAA,CAEI,IAFJ,EAAA,UAEI,EADAG,eAAA,CAAA,KAAK,CAAC,IAAG,CAAA,EAAA,CAAA,YAAA;;AAEb,gBAAAC,kBAAA,CAUK,OAVL,UAUK,EAAA;kBATJC,WAQ8D,CAAA,mBAAA,EAAA;oBAP5D,UAAU,EAAE,QAAgB,CAAA,gBAAA,CAAC,QAAQ,CAAA;AACrC,oBAAA,OAAO,EAAE,QAAqB,CAAA,qBAAA;oBAC9B,WAAW,EAAE,MAAM,CAAA,MAAA,CAAC,cAAc;oBAClC,UAAU,EAAE,MAAM,CAAA,MAAA,CAAC,QAAQ;AAC3B,oBAAA,SAAS,EAAE,KAAK;AACjB,oBAAA,KAAK,EAAC,OAAM;AACZ,oBAAA,OAAO,EAAC,OAAM;AACb,oBAAA,qBAAiB,EAAE,MAAA,KAAA,QAAA,CAAA,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAA,CAAA;;;AAGpD,gBAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,QAAQ,CAAA;AADhC,qBAAAN,SAAA,EAAA,EAAAC,kBAAA,CAgBK,OAhBL,UAgBK,EAAA;AAXJ,uBAAAD,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA,CAUkEC,QATlD,EAAA,IAAA,EAAAC,UAAA,CAAA,KAAK,CAAC,KAAK,GAAnB,IAAK,KAAA;6CADbJ,WAUkE,CAAA,mBAAA,EAAA;0BARhE,GAAG,EAAE,IAAI,CAAC,IAAG,GAAA,SAAA;AACb,0BAAA,UAAU,EAAE,QAAA,CAAA,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAA;0BACzC,OAAO,EAAE,QAAmB,CAAA,mBAAA,CAAC,QAAQ,CAAA;0BACrC,WAAW,EAAE,MAAM,CAAA,MAAA,CAAC,YAAY;0BAChC,UAAU,EAAE,IAAI,CAAC,KAAK;AACtB,0BAAA,SAAS,EAAE,KAAK;AACjB,0BAAA,KAAK,EAAC,OAAM;AACZ,0BAAA,OAAO,EAAC,OAAM;AACb,0BAAA,qBAAiB,aAAE,QAAkB,CAAA,kBAAA,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAA,CAAA;;;;;AAGxD,gBAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,QAAQ,CAAA,IAAK,4BAAmB,CAAC,QAAQ,EAAE,MAAK,KAAA,CAAA;kCADxEA,WAIY,CAAA,qBAAA,EAAA;;AAFX,sBAAA,IAAI,EAAC,SAAS;;uCACd,MAAqB;AAAlB,wBAAAQ,eAAA,CAAAH,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC;;;;;;;aAGD,MAAc,CAAA,cAAA;AAAzB,iBAAAJ,SAAA,EAAA,EAAAC,kBAAA,CAWK,OAXL,UAWK,EAAA;kBAVJK,WASU,CAAA,mBAAA,EAAA;AART,oBAAA,OAAO,EAAC,SAAQ;oBACf,QAAQ,EAAE,MAAK,CAAA,MAAA,IAAA,CAAM,QAAU,CAAA,UAAA;AAChC,oBAAA,aAAW,EAAC,gCAA+B;AAC1C,oBAAA,OAAK,EAAE,QAAU,CAAA,UAAA;;qCAGR,MACV;AADU,sBAAAC,eAAA,CAAA,GACV,GAAGH,eAAA,CAAA,MAAA,CAAA,MAAK,GAAI,QAAA,CAAA,CAAC,+BAA+B,MAAa,CAAA,cAAA,CAAA,EAAA,CAAA,YAAA;;;;qBAHzC,MAAM,CAAA,MAAA;;gCAAG,MAAI;sCAC5B,MAA2B;4BAA3BE,WAA2B,CAAA,wBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;;;;;;;;WAShB,QAAY,CAAA,WAAA,IAAA,CAAI,KAAiB,CAAA,gBAAA,IAAA,CAAI,KAAc,CAAA,cAAA;AAD/D,aAAAN,SAAA,EAAA,EAAAC,kBAAA,CA2HK,OA3HL,UA2HK,EAAA;AAvHJ,cAAAI,kBAAA,CAwFK,OAxFL,UAwFK,EAAA;AAvFJ,gBAAAA,kBAAA,CAQK,OARL,UAQK,EAAA;AAPJ,kBAAAA,kBAAA,CAEI,IAFJ,EAAA,UAEI,EADAD,eAAA,CAAA,QAAA,CAAA,WAAW,CAAC;kBAEhBE,WAGiD,CAAA,wBAAA,EAAA;oBAF/C,KAAK,EAAE,QAAgB,CAAA,gBAAA,CAAC,KAAc,CAAA,cAAA,EAAA,IAAA,CAAA;oBACtC,OAAO,EAAE,QAAkB,CAAA,kBAAA,CAAC,KAAc,CAAA,cAAA,CAAA;AAC3C,oBAAA,aAAW,EAAC,kCAAiC;;;AAEtC,gBAAA,CAAA,QAAA,CAAA,WAAW,CAAC,WAAW;AAAhC,qBAAAN,SAAA,EAAA,EAAAC,kBAAA,CAEG,GAFH,EAAA,WAEG,EADCG,eAAA,CAAA,QAAA,CAAA,WAAW,CAAC,WAAU,CAAA,EAAA,CAAA,YAAA;;AAE1B,gBAAAC,kBAAA,CASK,OATL,WASK,EAAA;kBARJC,WAOoE,CAAA,mBAAA,EAAA;oBANlE,UAAU,EAAE,QAAgB,CAAA,gBAAA,CAAC,KAAc,CAAA,cAAA,CAAA;AAC3C,oBAAA,OAAO,EAAE,QAAqB,CAAA,qBAAA;oBAC9B,WAAW,EAAE,MAAM,CAAA,MAAA,CAAC,cAAc;oBAClC,UAAU,EAAE,MAAM,CAAA,MAAA,CAAC,QAAQ;AAC5B,oBAAA,KAAK,EAAC,OAAM;AACZ,oBAAA,OAAO,EAAC,OAAM;AACb,oBAAA,qBAAiB,EAAE,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAA,MAAA,KAAA,QAAA,CAAA,oBAAoB,CAAC,KAAA,CAAA,cAAc,EAAE,MAAM,CAAA,CAAA,CAAA;;;AAEpD,gBAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,KAAc,CAAA,cAAA,CAAA;AAA5C,qBAAAN,SAAA,EAAA,EAAAC,kBAAA,CA+CO,SA/CP,WA+CO,EAAA;sBA9CNI,kBASO,CAAA,OAAA,EAAA,IAAA,EAAA;wBARNA,kBAOI,CAAA,IAAA,EAAA,IAAA,EAAA;0BANHA,kBAEI,CAAA,IAAA,EAFJ,WAEI,EAAAD,eAAA,CADA,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,aAAA,CAAA,CAAA,EAAA,CAAA,YAAA;AAEL,0BAAAC,kBAAA,CAEI,IAFJ,EAAA,WAEI,EADAD,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC;;;sBAIbC,kBAmCO,CAAA,OAAA,EAAA,IAAA,EAAA;0CAlCNJ,kBAiCU,CAAAC,QAAA,EAAA,IAAA,EAAAC,UAAA,CAjCe,QAAiB,CAAA,iBAAA,EAAA,CAAzB,IAAK,KAAA;;AAA4B,4BAAA,GAAA,EAAA,IAAI,CAAC,IAAG,GAAA,QAAA;;AACzD,4BAAAE,kBAAA,CAgBI,MAhBJ,WAgBI,EAAA;8BAfHA,kBAAwB,CAAA,IAAA,EAAA,IAAA,EAAAD,eAAA,CAAjB,IAAI,CAAC,KAAM,CAAA,EAAA,CAAA,YAAA;8BAClBC,kBAaI,CAAA,IAAA,EAAA,IAAA,EAAA;gCAZHA,kBAWQ,CAAA,QAAA,EAAA;AAVP,kCAAA,IAAI,EAAC,QAAO;AACZ,kCAAA,KAAK,EAAC,mCAAkC;kCACvC,eAAa,EAAE,MAAM,CAAC,QAAA,CAAA,UAAU,CAAC,KAAc,CAAA,cAAA,EAAE,IAAI,CAAC,IAAI,CAAA,CAAA;AAC1D,kCAAA,YAAU,EAAE,QAAA,CAAA,CAAC,CAA0D,eAAA,EAAA,8BAAA,EAAA,EAAA,IAAA,EAAA,IAAI,CAAC,KAAI,EAAA,CAAA;AAChF,kCAAA,OAAK,aAAE,QAAY,CAAA,YAAA,CAAC,oBAAc,EAAE,IAAI,CAAC,IAAI,CAAA,CAAA;;mCAEvC,QAAW,CAAA,WAAA,CAAC,KAAc,CAAA,cAAA,EAAE,IAAI,CAAA;oDADvCN,WAGa,CAAA,sBAAA,EAAA;;AADZ,wCAAA,KAAK,EAAC,kCAAiC;AACtC,wCAAA,IAAI,EAAE,EAAE;;;AAAG,kCAAAQ,eAAA,CAAA,GACb,mBAAG,QAAW,CAAA,WAAA,CAAC,oBAAc,EAAE,IAAI,KAAK,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;AAIlC,4BAAA,CAAA,QAAA,CAAA,UAAU,CAAC,KAAA,CAAA,cAAc,EAAE,IAAI,CAAC,IAAI,CAAA;AAA9C,iCAAAP,SAAA,EAAA,EAAAC,kBAAA,CAcI,MAdJ,WAcI,EAAA;AAbH,kCAAAI,kBAAA,CAYI,MAZJ,WAYI,EAAA;AAXM,oCAAA,CAAA,IAAI,CAAC,WAAW;AAAzB,yCAAAL,SAAA,EAAA,EAAAC,kBAAA,CAEG,GAFH,EAAA,WAEG,EADCG,eAAA,CAAA,IAAI,CAAC;;oCAETE,WAOwE,CAAA,mBAAA,EAAA;AANtE,sCAAA,UAAU,EAAE,QAAA,CAAA,cAAc,CAAC,KAAA,CAAA,cAAc,EAAE,IAAI,CAAA;sCAC/C,OAAO,EAAE,QAAmB,CAAA,mBAAA,CAAC,KAAc,CAAA,cAAA,CAAA;sCAC3C,WAAW,EAAE,MAAM,CAAA,MAAA,CAAC,YAAY;sCAChC,UAAU,EAAE,MAAM,CAAA,MAAA,CAAC,MAAM;AAC1B,sCAAA,KAAK,EAAC,OAAM;AACZ,sCAAA,OAAO,EAAC,OAAM;AACb,sCAAA,qBAAiB,aAAE,QAAkB,CAAA,kBAAA,CAAC,oBAAc,EAAE,IAAI,EAAE,MAAM,CAAA,CAAA;;;;;;;;;;AAOlE,gBAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,KAAA,CAAA,cAAc,CAAK,IAAA,QAAA,CAAA,gBAAgB,CAAC,MAAK,GAAA,CAAA;AADjE,qBAAAN,SAAA,EAAA,EAAAC,kBAAA,CAQG,KARH,WAQG,EAAA;AAJC,sBAAAM,eAAA,CAAAH,eAAA,CAAA,QAAA,CAAA,sBAAoB,GACvB,EAAA,CAAA,YAAA;sBAAAC,kBAEQ,CAAA,QAAA,EAAA;AAFA,wBAAA,IAAI,EAAC,QAAO;AAAE,wBAAA,KAAK,EAAC;AAAmC,wBAAA,OAAK,uCAAE,KAAa,CAAA,YAAA,GAAA,IAAA,CAAA,CAAA;yCAC/E,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;AAGa,gBAAA,CAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,KAAc,CAAA,cAAA,CAAA;kCAAlDN,WAEY,CAAA,qBAAA,EAAA;;AAFyC,sBAAA,IAAI,EAAC,MAAM;;uCAC/D,MAA0B;AAAvB,wBAAAQ,eAAA,CAAAH,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC,cAAa,CAAA,EAAA,CAAA,YAAA;;;;;AAGjB,gBAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,KAAc,CAAA,cAAA,CAAA,IAAK,4BAAmB,CAAC,KAAA,CAAA,cAAc,EAAE;kCAD/EL,WAIY,CAAA,qBAAA,EAAA;;AAFX,sBAAA,IAAI,EAAC,SAAS;;uCACd,MAAqB;AAAlB,wBAAAQ,eAAA,CAAAH,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC;;;;;;AAGF,cAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,MAAO,GAAA,CAAA;AAAlC,mBAAAJ,SAAA,EAAA,EAAAC,kBAAA,CAiBI,MAjBJ,WAiBI,EAAA;sCAhBHA,kBAeI,CAAAC,QAAA,EAAA,IAAA,EAAAC,UAAA,CAfe,QAAgB,CAAA,gBAAA,EAAA,CAAxB,IAAG,KAAA;2CAAdF,kBAeI,CAAA,IAAA,EAAA;wBAfkC,GAAG,EAAE,IAAI,CAAC,GAAG;;wBAClDI,kBAaQ,CAAA,QAAA,EAAA;AAZP,0BAAA,IAAI,EAAC,QAAO;AACZ,0BAAA,KAAK,EAAC,sCAAqC;AAC3C,0BAAA,aAAW,EAAC,qCAAoC;AAC/C,0BAAA,OAAK,EAAE,MAAA,KAAA,QAAA,CAAA,cAAc,CAAC,IAAI,CAAC,GAAG,CAAA,CAAA;;0BAC/BC,WAAqE,CAAA,uBAAA,EAAA;AAAtD,4BAAA,IAAI,EAAE,EAAE;AAAE,4BAAA,KAAK,EAAC;;AAC/B,0BAAAD,kBAAA,CAAmF,UAAnF,WAAmF,EAAAD,eAAA,CAA1B,IAAI,CAAC,KAAK,CAAC,IAAG,CAAA,EAAA,CAAA,YAAA;0BACvEC,kBAEM,CAAA,MAAA,EAFN,WAEM,EAAAD,eAAA,CADF,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAyC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA,CAAA,EAAA,CAAA,YAAA;0BAErEE,WAE0C,CAAA,wBAAA,EAAA;AADxC,4BAAA,KAAK,EAAE,QAAA,CAAA,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAA,KAAA,CAAA;AAChC,4BAAA,OAAO,EAAE,QAAA,CAAA,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAA;;;;;;;eAI9B,MAAc,CAAA,cAAA;AAAzB,mBAAAN,SAAA,EAAA,EAAAC,kBAAA,CAWK,OAXL,WAWK,EAAA;oBAVJK,WASU,CAAA,mBAAA,EAAA;AART,sBAAA,OAAO,EAAC,SAAQ;sBACf,QAAQ,EAAE,MAAK,CAAA,MAAA,IAAA,CAAM,QAAU,CAAA,UAAA;AAChC,sBAAA,aAAW,EAAC,gCAA+B;AAC1C,sBAAA,OAAK,EAAE,QAAU,CAAA,UAAA;;uCAGR,MACV;AADU,wBAAAC,eAAA,CAAA,GACV,GAAGH,eAAA,CAAA,MAAA,CAAA,MAAK,GAAI,QAAA,CAAA,CAAC,+BAA+B,MAAa,CAAA,cAAA,CAAA,EAAA,CAAA,YAAA;;;;uBAHzC,MAAM,CAAA,MAAA;;kCAAG,MAAI;wCAC5B,MAA2B;8BAA3BE,WAA2B,CAAA,wBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;;;;;;;;AAOX,YAAA,CAAA,CAAA,KAAA,CAAA,gBAAiB,KAAI,KAAc,CAAA,cAAA;AAApD,eAAAN,SAAA,EAAA,EAAAC,kBAAA,CA4IK,OA5IL,WA4IK,EAAA;AA3IJ,iBAAAD,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA,CA0IKC,QAzIwB,EAAA,IAAA,EAAAC,UAAA,CAAA,MAAA,CAAA,MAAM,EAA1B,CAAA,KAAK,EAAE,QAAQ,KAAA;uCADxBF,kBA0IK,CAAA,KAAA,EAAA;AAxIH,oBAAA,GAAG,EAAE,QAAQ;AACd,oBAAA,KAAK,EAACO,cAAA,CAAA,CAAA,4BAA2B,EACmB,EAAA,uCAAA,EAAA,CAAA,QAAA,CAAA,WAAW,CAAC,QAAQ,CAAA,EAAA,CAAA,CAAA;AACxE,oBAAA,aAAW,EAAC,2BAA2B;;qBAI7B,QAAiB,CAAA,iBAAA;AAA3B,yBAAAR,SAAA,EAAA,EAAAC,kBAAA,CAwBI,MAxBJ,WAwBI,EAAA;0BAvBHI,kBAsBQ,CAAA,QAAA,EAAA;AArBP,4BAAA,IAAI,EAAC,QAAO;AACZ,4BAAA,KAAK,EAAC,mCAAkC;AACvC,4BAAA,eAAa,EAAE,MAAM,CAAC,QAAA,CAAA,WAAW,CAAC,QAAQ,CAAA,CAAA;4BAC1C,eAAa,EAAE,QAAW,CAAA,WAAA,CAAC,QAAQ,CAAA;AACpC,4BAAA,aAAW,EAAC,kCAAiC;4BAC5C,OAAK,EAAA,MAAA,KAAE,QAAW,CAAA,WAAA,CAAC,QAAQ,CAAA,CAAA;;AAC5B,4BAAAA,kBAAA,CAGM,QAHN,WAGM,EAAA;AAFY,8BAAA,CAAA,QAAA,CAAA,WAAW,CAAC,QAAQ,CAAA;gDAArCN,WAAoD,CAAA,oBAAA,EAAA;;AAAX,oCAAA,IAAI,EAAE,EAAE;;gDACjDA,WAAgC,CAAA,sBAAA,EAAA;;AAAX,oCAAA,IAAI,EAAE,EAAE;;;4BAE9BU,UAUM,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,EAAA;AATJ,8BAAA,KAAK,EAAE,KAAK;8BACZ,eAAe,EAAE,QAAe,CAAA,eAAA,CAAC,QAAQ,CAAA;AACzC,8BAAA,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;+BAHhC,MAUM;AANL,8BAAAJ,kBAAA,CAKM,QALN,WAKM,EAAA;AAJL,gCAAAA,kBAAA,CAAqE,MAArE,EAAA,WAAqE,EAAnBD,eAAA,CAAA,KAAK,CAAC,IAAG,CAAA,EAAA,CAAA,YAAA;AAC3D,gCAAAC,kBAAA,CAEM,QAFN,WAEM,EAAAD,eAAA,CADF,wBAAe,CAAC,QAAQ,KAAI,GAAC,GAAAA,eAAA,CAAG,KAAK,CAAC,KAAK,CAAC,MAAK,CAAA,GAAG,GAAE,GAAGA,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC;;;;;wBAMxEK,UAaM,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,EAAA;AAXJ,0BAAA,KAAK,EAAE,KAAK;0BACZ,eAAe,EAAE,QAAe,CAAA,eAAA,CAAC,QAAQ,CAAA;AACzC,0BAAA,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;2BAJhC,MAaM;AARL,0BAAAJ,kBAAA,CAOK,OAPL,WAOK,EAAA;AANJ,4BAAAA,kBAAA,CAEI,IAFJ,EAAA,WAEI,EADAD,eAAA,CAAA,KAAK,CAAC,IAAG,CAAA,EAAA,CAAA,YAAA;AAEb,4BAAAC,kBAAA,CAEM,QAFN,WAEM,EAAAD,eAAA,CADF,wBAAe,CAAC,QAAQ,KAAI,GAAC,GAAAA,eAAA,CAAG,KAAK,CAAC,KAAK,CAAC,MAAK,CAAA,GAAG,GAAE,GAAGA,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC;;;mCAKtEC,kBAwFK,CAAA,KAAA,EAAA;sBAtFH,EAAE,EAAE,QAAW,CAAA,WAAA,CAAC,QAAQ,CAAA;AACzB,sBAAA,KAAK,EAAC,iCAAgC;AACtC,sBAAA,aAAW,EAAC,gCAAgC;;AAEnC,sBAAA,CAAA,KAAK,CAAC,WAAW;AAA1B,2BAAAL,SAAA,EAAA,EAAAC,kBAAA,CAEG,GAFH,EAAA,WAEG,EADCG,eAAA,CAAA,KAAK,CAAC;;AAIV,sBAAAC,kBAAA,CAUK,OAVL,WAUK,EAAA;wBATJC,WAQ8D,CAAA,mBAAA,EAAA;0BAP5D,UAAU,EAAE,QAAgB,CAAA,gBAAA,CAAC,QAAQ,CAAA;AACrC,0BAAA,OAAO,EAAE,QAAqB,CAAA,qBAAA;0BAC9B,WAAW,EAAE,MAAM,CAAA,MAAA,CAAC,cAAc;0BAClC,UAAU,EAAE,MAAM,CAAA,MAAA,CAAC,QAAQ;AAC3B,0BAAA,OAAO,EAAE,KAAgB,CAAA,gBAAA;AAC1B,0BAAA,KAAK,EAAC,OAAM;AACZ,0BAAA,OAAO,EAAC,OAAM;AACb,0BAAA,qBAAiB,EAAE,MAAA,KAAA,QAAA,CAAA,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAA,CAAA;;;AAIhD,sBAAA,CAAA,QAAA,CAAA,gBAAgB,CAAC,QAAQ,CAAA;AAApC,2BAAAN,SAAA,EAAA,EAAAC,kBAAA,CAmDK,OAnDL,WAmDK,EAAA;AAjDJ,4BAAAI,kBAAA,CAKK,OALL,WAKK,EAAA;AAJJ,8BAAAA,kBAAA,CAAmD,8BAA1C,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,aAAA,CAAA,CAAA,EAAA,CAAA,YAAA;8BACVA,kBAA+B,CAAA,MAAA,EAAA,IAAA,EAAAD,eAAA,CAAtB,MAAM,CAAA,MAAA,CAAC,MAAO,CAAA,EAAA,CAAA,YAAA;wDACvBC,kBAAO,CAAA,MAAA,EAAA,IAAA,EAAA,IAAA,EAAA,CAAA,CAAA,cAAA,CAAA;wDACPA,kBAAO,CAAA,MAAA,EAAA,IAAA,EAAA,IAAA,EAAA,CAAA,CAAA,cAAA,CAAA;;AAIR,6BAAAL,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA,CAwCUC,QAxCe,EAAA,IAAA,EAAAC,UAAA,CAAA,KAAK,CAAC,KAAK,GAAnB,IAAG,KAAA;;AAAwB,gCAAA,GAAA,EAAA,IAAI,CAAC,IAAK,GAAA,MAAA;;gCACrDE,kBAmBK,CAAA,KAAA,EAAA;kCAlBJ,KAAK,EAAAG,cAAA,CAAA,CAAC,+BAA8B,EACiB,EAAA,yCAAA,EAAA,QAAA,CAAA,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAA,EAAA,CAAA,CAAA;AAClF,kCAAA,OAAK,aAAE,QAAY,CAAA,YAAA,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAA,CAAA;;AACxC,kCAAAH,kBAAA,CAAmE,MAAnE,EAAA,WAAmE,EAAnBD,eAAA,CAAA,IAAI,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;kCACzDC,kBAEM,CAAA,MAAA,EAFN,WAEM,EAAAD,eAAA,CADF,QAAW,CAAA,WAAA,CAAC,QAAQ,EAAE,IAAI,CAAA,IAAK,MAAM,CAAA,MAAA,CAAC,aAAY,CAAA,EAAA,CAAA,YAAA;AAEtD,kCAAAC,kBAAA,CAMM,QANN,WAMM,EAAA;oCALLA,kBAIsD,CAAA,MAAA,EAAA;AAHrD,sCAAA,KAAK,kBAAC,iCAAgC,EAC9B,oBAAW,CAAC,QAAQ,EAAE,IAAI,CAAA;;;;;AAIpC,kCAAAA,kBAAA,CAGM,QAHN,WAGM,EAAA;AAFY,oCAAA,CAAA,QAAA,CAAA,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAA;sDAA/CN,WAA8D,CAAA,oBAAA,EAAA;;AAAX,0CAAA,IAAI,EAAE,EAAE;;sDAC3DA,WAAgC,CAAA,sBAAA,EAAA;;AAAX,0CAAA,IAAI,EAAE,EAAE;;;;gCAK/BO,WAgBY,CAAAI,UAAA,EAAA,EAhBA,IAAI,EAAC,OAAO,EAAA,EAAA;mDACvB,MAcK;AAbE,oCAAA,CAAA,QAAA,CAAA,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAA;AADrC,yCAAAV,SAAA,EAAA,EAAAC,kBAAA,CAcK,OAdL,WAcK,EAAA;AAXK,0CAAA,CAAA,IAAI,CAAC,WAAW;AAAzB,+CAAAD,SAAA,EAAA,EAAAC,kBAAA,CAEG,GAFH,EAAA,WAEG,EADCG,eAAA,CAAA,IAAI,CAAC;;0CAETE,WAOkE,CAAA,mBAAA,EAAA;AANhE,4CAAA,UAAU,EAAE,QAAA,CAAA,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAA;4CACzC,OAAO,EAAE,QAAmB,CAAA,mBAAA,CAAC,QAAQ,CAAA;4CACrC,WAAW,EAAE,MAAM,CAAA,MAAA,CAAC,YAAY;4CAChC,UAAU,EAAE,MAAM,CAAA,MAAA,CAAC,MAAM;AAC1B,4CAAA,KAAK,EAAC,OAAM;AACZ,4CAAA,OAAO,EAAC,OAAM;AACb,4CAAA,qBAAiB,aAAE,QAAkB,CAAA,kBAAA,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAA,CAAA;;;;;;;;;;4BAO1C,KAAgB,CAAA,gBAAA;0CAAxCP,WAEY,CAAA,qBAAA,EAAA;;AAF8B,8BAAA,IAAI,EAAC,MAAM;;+CACpD,MAA0B;AAAvB,gCAAAQ,eAAA,CAAAH,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC,cAAa,CAAA,EAAA,CAAA,YAAA;;;;;uBAKjB,QAAgB,CAAA,gBAAA,CAAC,QAAQ,CAAK,IAAA,QAAA,CAAA,mBAAmB,CAAC,QAAQ,CAAA,CAAE,MAAK,KAAA,CAAA,IAAA,CAAY,KAAgB,CAAA,gBAAA;wCADpGL,WAIY,CAAA,qBAAA,EAAA;;AAFX,4BAAA,OAAO,EAAC,SAAS;;6CACjB,MAAqB;AAAlB,8BAAAQ,eAAA,CAAAH,eAAA,CAAA,MAAA,CAAA,MAAM,CAAC;;;;;;AArFH,sBAAA,CAAAO,KAAA,EAAA,QAAA,CAAA,WAAW,CAAC,QAAQ,CAAA,CAAA;;;;;;;;;KAzQf,QAAgB,CAAA,gBAAA;;gBAAG,SAAO;sBACzC,MAUU;AATH,YAAA,CAAA,MAAA,CAAA,cAAe,KAAI,QAAW,CAAA,WAAA;8BADrCZ,WAUU,CAAA,mBAAA,EAAA;;AART,kBAAA,OAAO,EAAC,SAAQ;kBACf,QAAQ,EAAE,MAAK,CAAA,MAAA,IAAA,CAAM,QAAU,CAAA,UAAA;AAC/B,kBAAA,OAAK,EAAE,QAAU,CAAA,UAAA;;AACP,kBAAA,IAAI,UACd,MAAyC;qBAApB,MAAM,CAAA,MAAA;sCAA3BA,WAAyC,CAAA,wBAAA,EAAA;;AAAX,0BAAA,IAAI,EAAE,EAAE;;sCACtCA,WAAgC,CAAA,sBAAA,EAAA;;AAAX,0BAAA,IAAI,EAAE,EAAE;;;mCACpB,MACV;AADU,oBAAAQ,eAAA,CAAA,GACV,GAAGH,eAAA,CAAA,MAAA,CAAA,MAAK,GAAI,QAAA,CAAA,CAAC,+BAA+B,MAAa,CAAA,cAAA,CAAA,EAAA,CAAA,YAAA;;;;;aAGnD,MAAkB,CAAA,kBAAA;8BADzBL,WAUU,CAAA,mBAAA,EAAA;;AART,kBAAA,OAAO,EAAC,WAAU;AACjB,kBAAA,QAAQ,EAAE,MAAW,CAAA,WAAA;AACrB,kBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,UAAA,CAAA,CAAA,CAAA;;AACF,kBAAA,IAAI,UACd,MAA8C;qBAAzB,MAAW,CAAA,WAAA;sCAAhCA,WAA8C,CAAA,wBAAA,EAAA;;AAAX,0BAAA,IAAI,EAAE,EAAE;;sCAC3CA,WAA4B,CAAA,kBAAA,EAAA;;AAAX,0BAAA,IAAI,EAAE,EAAE;;;mCAChB,MACV;AADU,oBAAAQ,eAAA,CAAA,GACV,GAAGH,eAAA,CAAA,MAAA,CAAA,WAAU,GAAI,QAAA,CAAA,CAAC,kCAAkC;;;;;YAErDK,UAAsB,CAAA,IAAA,CAAA,MAAA,EAAA,SAAA,CAAA;;;;;AA8UP,IAAA,CAAA,IAAA,CAAA,MAAM,CAAC,MAAM;;gBAAG,QAAM;sBACrC,MAAqB;YAArBA,UAAqB,CAAA,IAAA,CAAA,MAAA,EAAA,QAAA,CAAA;;;;;;;;;;"}
@@ -2,7 +2,7 @@ import script from './CnRetentionWidget.vue2.js';
2
2
  import { render } from './CnRetentionWidget.vue3.js';
3
3
 
4
4
  script.render = render;
5
- script.__scopeId = "data-v-1d53d545";
5
+ script.__scopeId = "data-v-5415dbb4";
6
6
  const __sfc_main = script;
7
7
 
8
8
  export { __sfc_main as default };
@@ -1 +1 @@
1
- {"version":3,"file":"CnRetentionWidget.vue2.js","sources":["../../../../src/components/CnRetentionWidget/CnRetentionWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-retention\" data-testid=\"cn-retention\">\n\t\t<header class=\"cn-retention__head\">\n\t\t\t<div class=\"cn-retention__head-text\">\n\t\t\t\t<h3 class=\"cn-retention__title\">\n\t\t\t\t\t{{ text(content.title) || t('nextcloud-vue', 'Archiving') }}\n\t\t\t\t</h3>\n\t\t\t\t<p class=\"cn-retention__muted\">\n\t\t\t\t\t{{ text(content.subtitle) || t('nextcloud-vue', 'What happens to this record once it is closed') }}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<!-- Recompute starts in the header (board DqZaakArchivering); the\n\t\t\t dialog asks for the reason OpenRegister records with it. -->\n\t\t\t<NcButton\n\t\t\t\tv-if=\"content.recompute !== false && !loading && !error\"\n\t\t\t\t:disabled=\"!mayRecompute || busy\"\n\t\t\t\t:title=\"mayRecompute ? undefined : t('nextcloud-vue', 'Recomputing needs the archivist role')\"\n\t\t\t\t:aria-description=\"mayRecompute ? undefined : t('nextcloud-vue', 'Recomputing needs the archivist role')\"\n\t\t\t\t:data-testid=\"mayRecompute ? 'cn-retention-recompute-open' : 'cn-retention-recompute-denied'\"\n\t\t\t\t@click=\"recomputeOpen = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Refresh :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Recompute nomination') }}\n\t\t\t</NcButton>\n\t\t</header>\n\t\t<CnRetentionRecomputeDialog\n\t\t\tv-if=\"recomputeOpen\"\n\t\t\t:user=\"currentUid\"\n\t\t\t:busy=\"busy\"\n\t\t\t@close=\"recomputeOpen = false\"\n\t\t\t@confirm=\"recompute\" />\n\n\t\t<NcLoadingIcon v-if=\"loading\" :size=\"24\" />\n\t\t<NcEmptyContent v-else-if=\"error\"\n\t\t\t:name=\"t('nextcloud-vue', 'The archival facts are unavailable')\"\n\t\t\t:description=\"error\"\n\t\t\tdata-testid=\"cn-retention-error\">\n\t\t\t<template #action>\n\t\t\t\t<NcButton data-testid=\"cn-retention-retry\" @click=\"load\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Try again') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<template v-else>\n\t\t\t<p v-if=\"archived\" class=\"cn-retention__archived\" data-testid=\"cn-retention-archived\">\n\t\t\t\t{{ t('nextcloud-vue', 'Archived on {at} by {by}. {reason}', { at: String(archived.at ?? ''), by: String(archived.by ?? ''), reason: String(archived.reason ?? '') }) }}\n\t\t\t</p>\n\t\t\t<NcNoteCard v-if=\"disagrees\" type=\"warning\" data-testid=\"cn-retention-disagreement\">\n\t\t\t\t{{ t('nextcloud-vue', 'This record and OpenRegister do not agree on whether it is archived.') }}\n\t\t\t</NcNoteCard>\n\n\t\t\t<NcNoteCard v-if=\"nomination && nomination.status === 'unnominatable'\" type=\"warning\" data-testid=\"cn-retention-unnominatable\">\n\t\t\t\t{{ t('nextcloud-vue', 'Nothing could decide what happens to this record.') }}\n\t\t\t\t{{ String(nomination.unnominatableReason ?? '') }}\n\t\t\t</NcNoteCard>\n\t\t\t<div v-else-if=\"!nomination\" data-testid=\"cn-retention-pending\">\n\t\t\t\t<dl class=\"cn-retention__facts\">\n\t\t\t\t\t<div v-for=\"fact in pendingFacts\" :key=\"fact.key\" class=\"cn-retention__fact\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ fact.value }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t\t<NcNoteCard type=\"info\">\n\t\t\t\t\t{{ text(content.pendingNote) || t('nextcloud-vue', 'This record has not been closed yet. Its archival future is recorded when it closes.') }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t\t<dl v-else class=\"cn-retention__facts\" data-testid=\"cn-retention-facts\">\n\t\t\t\t<div v-for=\"fact in facts\" :key=\"fact.key\" class=\"cn-retention__fact\">\n\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t<dd :data-testid=\"`cn-retention-${fact.key}`\">\n\t\t\t\t\t\t{{ fact.value }}\n\t\t\t\t\t</dd>\n\t\t\t\t</div>\n\t\t\t</dl>\n\n\t\t\t<section v-if=\"content.legalHold\" class=\"cn-retention__section\" data-testid=\"cn-retention-hold\">\n\t\t\t\t<component :is=\"innerHeadingTag\" class=\"cn-inner-heading\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Kept for a procedure') }}\n\t\t\t\t</component>\n\t\t\t\t<ul class=\"cn-retention__rows\">\n\t\t\t\t\t<li v-for=\"hold in holds\" :key=\"hold.id\" class=\"cn-retention__row\">\n\t\t\t\t\t\t<span class=\"cn-retention__row-text\">\n\t\t\t\t\t\t\t<span class=\"cn-retention__row-title\">{{ hold.reason || t('nextcloud-vue', 'Legal hold') }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-retention__muted\">{{ t('nextcloud-vue', 'Placed on {date} by {by}', { date: hold.placedDate, by: hold.placedBy }) }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge :label=\"t('nextcloud-vue', 'Active')\" variant=\"warning\" />\n\t\t\t\t\t</li>\n\t\t\t\t\t<li v-if=\"holds.length === 0\" class=\"cn-retention__row\">\n\t\t\t\t\t\t<span class=\"cn-retention__row-text\">\n\t\t\t\t\t\t\t<span class=\"cn-retention__row-title\">{{ t('nextcloud-vue', 'No legal hold') }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-retention__muted\">{{ t('nextcloud-vue', 'If an objection or appeal runs, destruction is suspended') }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge :label=\"t('nextcloud-vue', 'None')\" />\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<section v-if=\"content.transfer\" class=\"cn-retention__section\" data-testid=\"cn-retention-transfer\">\n\t\t\t\t<component :is=\"innerHeadingTag\" class=\"cn-inner-heading\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Transfer to the e-Depot') }}\n\t\t\t\t</component>\n\t\t\t\t<ul class=\"cn-retention__rows\">\n\t\t\t\t\t<li class=\"cn-retention__row\">\n\t\t\t\t\t\t<span class=\"cn-retention__row-text\">\n\t\t\t\t\t\t\t<span class=\"cn-retention__row-title\">{{ transfers ? t('nextcloud-vue', 'Goes to the e-Depot') : t('nextcloud-vue', 'Not applicable') }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-retention__muted\">{{ transfers ? t('nextcloud-vue', 'After the retention period the record is transferred') : t('nextcloud-vue', 'Only records appraised to keep go to the e-Depot') }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge :label=\"transfers ? t('nextcloud-vue', 'Transfer') : t('nextcloud-vue', 'No transfer')\" :variant=\"transfers ? 'info' : 'default'\" />\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<div v-if=\"outcome\" class=\"cn-retention__outcome\" data-testid=\"cn-retention-outcome\">\n\t\t\t\t<component :is=\"innerHeadingTag\" class=\"cn-inner-heading\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Outcome') }}\n\t\t\t\t</component>\n\t\t\t\t<p>{{ t('nextcloud-vue', 'Handed over as {kind} on {at} by {by}.', { kind: String(outcome.kind ?? ''), at: String(outcome.at ?? ''), by: String(outcome.by ?? '') }) }}</p>\n\t\t\t\t<p v-if=\"outcome.transferListUuid\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Transfer list') }}: {{ outcome.transferListUuid }}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard } from '@nextcloud/vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'\nimport CnRetentionRecomputeDialog from './CnRetentionRecomputeDialog.vue'\nimport innerHeading from '../../mixins/innerHeading.js'\nimport { parseDuration } from '../../utils/isoDuration.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\n\n/**\n * CnRetentionWidget — the `retention` detail widget: what happens to a\n * record when its business use ends, as OpenRegister decided it. Every value\n * is read off the record's `@self._retention` (appraisal, disposal date,\n * retention period, selection list row, the rule and when it was written)\n * and `@self.archived`; the widget derives nothing, so it can never disagree\n * with the stored decision. A failed read is an error with a retry, never an\n * empty block. A record nothing could nominate is drawn apart from one that\n * is not closed yet. An archivist (or an admin) may ask OpenRegister to\n * recompute the nomination, with a reason. Any app on OpenRegister uses it;\n * dossiq's case Archiving tab is the first.\n *\n * `content`:\n * - `title`, `subtitle`: texts, through the host translate.\n * - `statusField`, `archivedValues`: a record field and the values that mean\n * archived (`archiveStatus`, `[\"archived\", ...]`); when set, a mismatch with\n * `@self.archived` is said out loud.\n * - `archivistGroups`: groups that may recompute (default `[\"archivaris\"]`;\n * admins always may); `recompute: false` hides the control.\n * - `expected`: before the record closes, the outcome its type expects.\n * `source: { register, schema, filter }` lists the candidate rules (a case\n * type's result types, `filter` tokens such as `@object.caseType`\n * resolved against the record); `fields: { appraisal, period,\n * selectionListRow }` names their fields; `appraisalLabels` names the\n * appraisal values; `periodText` writes the period (`{period} after the\n * decision`); `decidedBy` says who decides. When the candidates agree the\n * facts show that outcome, otherwise \"Depends on the result\". A failed\n * read keeps the plain facts.\n * - `pendingNote`: the note under the facts of a record not closed yet.\n * - `legalHold: true`: a section with the record's active legal holds\n * (`@self._retention.legalHold.holds`), or that none applies.\n * - `transfer: { keepValues }`: a section saying whether the record goes to\n * the e-Depot, from the stored or expected appraisal.\n *\n * The record is read fresh from OpenRegister by `register`, `schema` and\n * `objectId` (props, else the bound record's `@self`).\n */\nexport default {\n\tname: 'CnRetentionWidget',\n\n\tcomponents: { CnRetentionRecomputeDialog, CnStatusBadge, NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard, Refresh },\n\n\tmixins: [innerHeading],\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The bound record, on a detail page.\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/** The record's register (else the bound record's `@self.register`). */\n\t\tregister: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The record's schema (else the bound record's `@self.schema`); a schema object gives its slug.\n\t\t *\n\t\t * @type {string|number|object}\n\t\t */\n\t\tschema: {\n\t\t\ttype: [String, Number, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The record's id (else the bound record's). */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\terror: '',\n\t\t\trecord: null,\n\t\t\t/** Whether the recompute dialog is open. */\n\t\t\trecomputeOpen: false,\n\t\t\tbusy: false,\n\t\t\t/** The candidate rules `content.expected` reads, null until read or when unreadable. */\n\t\t\texpectedRows: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {object} The bound record's `@self`. */\n\t\tboundSelf() {\n\t\t\treturn (this.objectData && this.objectData['@self']) || {}\n\t\t},\n\n\t\t/** @return {string} The record id. */\n\t\tid() {\n\t\t\treturn String(this.objectId || (this.objectData && this.objectData.id) || this.boundSelf.id || '')\n\t\t},\n\n\t\t/** @return {string} The register. */\n\t\tregisterRef() {\n\t\t\treturn String(this.register || this.boundSelf.register || '')\n\t\t},\n\n\t\t/** @return {string} The schema. */\n\t\tschemaRef() {\n\t\t\tconst s = this.schema || this.boundSelf.schema || ''\n\t\t\treturn String(typeof s === 'object' ? (s.slug || s.id || '') : s)\n\t\t},\n\n\t\t/** @return {object} The record's `@self`. */\n\t\tself() {\n\t\t\treturn (this.record && this.record['@self']) || {}\n\t\t},\n\n\t\t/** @return {object|null} OpenRegister's stored retention decision. */\n\t\tretention() {\n\t\t\treturn this.self._retention || null\n\t\t},\n\n\t\t/** @return {object|null} The nomination. */\n\t\tnomination() {\n\t\t\treturn (this.retention && this.retention.nomination) || null\n\t\t},\n\n\t\t/** @return {object|null} The hand-over outcome. */\n\t\toutcome() {\n\t\t\treturn (this.retention && this.retention.outcome) || null\n\t\t},\n\n\t\t/** @return {object|null} OpenRegister's archived marker. */\n\t\tarchived() {\n\t\t\treturn this.self.archived || null\n\t\t},\n\n\t\t/**\n\t\t * Whether the record's own field and the platform marker disagree.\n\t\t *\n\t\t * @spec openspec/changes/retention-widget/specs/retention-widget/spec.md#requirement-a-record-shows-its-stored-retention\n\t\t * @return {boolean}\n\t\t */\n\t\tdisagrees() {\n\t\t\tconst field = this.content.statusField\n\t\t\tif (!field || !this.record) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst values = Array.isArray(this.content.archivedValues) ? this.content.archivedValues.map(String) : ['archived']\n\t\t\tconst saysArchived = values.includes(String(readPath(this.record, field) ?? ''))\n\t\t\treturn saysArchived !== Boolean(this.archived)\n\t\t},\n\n\t\t/**\n\t\t * The stored facts that have a value, in reading order.\n\t\t *\n\t\t * @spec openspec/changes/retention-widget/specs/retention-widget/spec.md#requirement-a-record-shows-its-stored-retention\n\t\t * @return {Array<{key: string, label: string, value: string}>}\n\t\t */\n\t\tfacts() {\n\t\t\tconst r = this.retention || {}\n\t\t\tconst n = this.nomination || {}\n\t\t\treturn [\n\t\t\t\t{ key: 'appraisal', label: t('nextcloud-vue', 'Appraisal'), value: r.appraisal },\n\t\t\t\t{ key: 'disposal-date', label: t('nextcloud-vue', 'Disposal date'), value: r.disposalDate },\n\t\t\t\t{ key: 'retention-period', label: t('nextcloud-vue', 'Retention period'), value: r.retentionPeriod },\n\t\t\t\t{ key: 'selection-list-row', label: t('nextcloud-vue', 'Selection list row'), value: r.selectionListRow },\n\t\t\t\t{ key: 'rule', label: t('nextcloud-vue', 'Decided by'), value: n.rule },\n\t\t\t\t{ key: 'decided-at', label: t('nextcloud-vue', 'Written on'), value: n.at },\n\t\t\t].filter((fact) => fact.value !== undefined && fact.value !== null && fact.value !== '').map((fact) => ({ ...fact, value: String(fact.value) }))\n\t\t},\n\n\t\t/**\n\t\t * The outcome the record's type expects before it closes: the agreed\n\t\t * appraisal, period and selection list row of the candidate rules, or\n\t\t * `mixed` when they disagree; null when nothing was read.\n\t\t *\n\t\t * @spec openspec/changes/retention-expected-outcome/specs/retention-widget/spec.md#requirement-an-open-record-shows-the-outcome-its-type-expects\n\t\t * @return {{appraisal: string, period: string, selectionListRow: string, mixed: boolean}|null}\n\t\t */\n\t\texpectedOutcome() {\n\t\t\tconst rows = this.expectedRows\n\t\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst fields = { appraisal: 'appraisal', period: 'period', selectionListRow: 'selectionListRow', ...(this.content.expected?.fields || {}) }\n\t\t\tconst pick = (row, key) => String(readPath(row, fields[key]) ?? '')\n\t\t\tconst outcomes = rows.map((row) => ({ appraisal: pick(row, 'appraisal'), period: pick(row, 'period'), selectionListRow: pick(row, 'selectionListRow') }))\n\t\t\tconst first = outcomes[0]\n\t\t\tconst agree = outcomes.every((o) => o.appraisal === first.appraisal && o.period === first.period)\n\t\t\tif (first.appraisal === '' && first.period === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn agree\n\t\t\t\t? { ...first, selectionListRow: outcomes.every((o) => o.selectionListRow === first.selectionListRow) ? first.selectionListRow : '', mixed: false }\n\t\t\t\t: { appraisal: '', period: '', selectionListRow: '', mixed: true }\n\t\t},\n\n\t\t/**\n\t\t * The facts of a record not closed yet: the expected outcome where the\n\t\t * type gives one, \"decided when it closes\" otherwise.\n\t\t *\n\t\t * @spec openspec/changes/retention-expected-outcome/specs/retention-widget/spec.md#requirement-an-open-record-shows-the-outcome-its-type-expects\n\t\t * @return {Array<{key: string, label: string, value: string}>}\n\t\t */\n\t\tpendingFacts() {\n\t\t\tconst atClosure = t('nextcloud-vue', 'Decided when it closes')\n\t\t\tconst expected = this.expectedOutcome\n\t\t\tif (!expected) {\n\t\t\t\treturn [\n\t\t\t\t\t{ key: 'appraisal', label: t('nextcloud-vue', 'Appraisal'), value: atClosure },\n\t\t\t\t\t{ key: 'retention-period', label: t('nextcloud-vue', 'Retention period'), value: atClosure },\n\t\t\t\t\t{ key: 'disposal-date', label: t('nextcloud-vue', 'Disposal date'), value: atClosure },\n\t\t\t\t\t{ key: 'decided-at', label: t('nextcloud-vue', 'Written on'), value: t('nextcloud-vue', 'Not yet') },\n\t\t\t\t]\n\t\t\t}\n\t\t\tconst depends = t('nextcloud-vue', 'Depends on the result')\n\t\t\tconst config = this.content.expected || {}\n\t\t\tconst facts = [\n\t\t\t\t{ key: 'appraisal', label: t('nextcloud-vue', 'Appraisal'), value: expected.mixed ? depends : this.appraisalLabel(expected.appraisal) },\n\t\t\t\t{ key: 'retention-period', label: t('nextcloud-vue', 'Retention period'), value: expected.mixed ? depends : this.periodLabel(expected.period) },\n\t\t\t]\n\t\t\tif (expected.selectionListRow) {\n\t\t\t\tfacts.push({ key: 'selection-list-row', label: t('nextcloud-vue', 'Selection list row'), value: expected.selectionListRow })\n\t\t\t}\n\t\t\tfacts.push({ key: 'disposal-date', label: t('nextcloud-vue', 'Disposal date'), value: atClosure })\n\t\t\tif (config.decidedBy) {\n\t\t\t\tfacts.push({ key: 'rule', label: t('nextcloud-vue', 'Decided by'), value: this.text(config.decidedBy) })\n\t\t\t}\n\t\t\tfacts.push({ key: 'decided-at', label: t('nextcloud-vue', 'Written on'), value: t('nextcloud-vue', 'Not yet') })\n\t\t\treturn facts.filter((fact) => fact.value !== '')\n\t\t},\n\n\t\t/** @return {Array<{id: string, reason: string, placedBy: string, placedDate: string}>} The active legal holds. */\n\t\tholds() {\n\t\t\tconst hold = (this.retention && this.retention.legalHold) || {}\n\t\t\tconst list = Array.isArray(hold.holds) ? hold.holds : []\n\t\t\treturn list.map((h, index) => ({ id: String(h.id ?? index), reason: String(h.reason ?? ''), placedBy: String(h.placedBy ?? ''), placedDate: String(h.placedDate ?? '') }))\n\t\t},\n\n\t\t/**\n\t\t * Whether the record goes to the e-Depot: its stored appraisal, else\n\t\t * the expected one, is one of `transfer.keepValues`.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\ttransfers() {\n\t\t\tconst keep = Array.isArray(this.content.transfer?.keepValues) ? this.content.transfer.keepValues.map(String) : ['bewaren', 'blijvend_bewaren', 'retain', 'keep']\n\t\t\tconst stored = this.retention && this.retention.appraisal\n\t\t\tconst appraisal = stored || (this.expectedOutcome && !this.expectedOutcome.mixed ? this.expectedOutcome.appraisal : '')\n\t\t\treturn keep.includes(String(appraisal || ''))\n\t\t},\n\n\t\t/** @return {string} The signed-in user's id. */\n\t\tcurrentUid() {\n\t\t\tconst user = getCurrentUser()\n\t\t\treturn String((user && user.uid) || '')\n\t\t},\n\n\t\t/**\n\t\t * Whether this user may recompute: an admin or an archivist group member.\n\t\t * Shown disabled otherwise, so the user learns which role it needs.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tmayRecompute() {\n\t\t\tconst user = getCurrentUser()\n\t\t\tif (user && user.isAdmin === true) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst groups = Array.isArray(user && user.groups) ? user.groups : []\n\t\t\tconst allowed = Array.isArray(this.content.archivistGroups) ? this.content.archivistGroups : ['archivaris']\n\t\t\treturn allowed.some((g) => groups.includes(g))\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.load()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * An appraisal value in words, through `expected.appraisalLabels`.\n\t\t *\n\t\t * @param {string} value The stored value.\n\t\t * @return {string}\n\t\t */\n\t\tappraisalLabel(value) {\n\t\t\tconst labels = this.content.expected?.appraisalLabels || {}\n\t\t\treturn labels[value] ? this.text(labels[value]) : value\n\t\t},\n\n\t\t/**\n\t\t * An ISO period in words (\"5 years\"), placed in `expected.periodText`.\n\t\t *\n\t\t * @param {string} value The ISO 8601 duration.\n\t\t * @return {string}\n\t\t */\n\t\tperiodLabel(value) {\n\t\t\tconst parsed = parseDuration(value)\n\t\t\tconst words = parsed\n\t\t\t\t? {\n\t\t\t\t\t\tyears: () => n('nextcloud-vue', '%n year', '%n years', parsed.amount),\n\t\t\t\t\t\tmonths: () => n('nextcloud-vue', '%n month', '%n months', parsed.amount),\n\t\t\t\t\t\tweeks: () => n('nextcloud-vue', '%n week', '%n weeks', parsed.amount),\n\t\t\t\t\t\tdays: () => n('nextcloud-vue', '%n day', '%n days', parsed.amount),\n\t\t\t\t\t}[parsed.unit]\n\t\t\t\t: null\n\t\t\tconst period = words ? words() : value\n\t\t\tconst template = this.content.expected?.periodText\n\t\t\treturn template ? this.text(template).replace('{period}', period) : period\n\t\t},\n\n\t\t/**\n\t\t * Read the record fresh from OpenRegister; a failure is an error, never an empty block.\n\t\t *\n\t\t * @spec openspec/changes/retention-widget/specs/retention-widget/spec.md#requirement-a-record-shows-its-stored-retention\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync load() {\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tif (!this.registerRef || !this.schemaRef || !this.id) {\n\t\t\t\t\tthrow new Error(t('nextcloud-vue', 'This widget has no record to read.'))\n\t\t\t\t}\n\t\t\t\tconst { data } = await axios.get(generateUrl(`/apps/openregister/api/objects/${encodeURIComponent(this.registerRef)}/${encodeURIComponent(this.schemaRef)}/${encodeURIComponent(this.id)}`))\n\t\t\t\tthis.record = data && typeof data === 'object' ? data : null\n\t\t\t\tawait this.loadExpected()\n\t\t\t} catch (failure) {\n\t\t\t\tconst body = failure && failure.response && failure.response.data\n\t\t\t\tthis.error = String((body && (body.message || body.error)) || (failure && failure.message) || failure)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read the candidate rules `content.expected` names, for a record that\n\t\t * is not nominated yet. A failure leaves the plain pending facts.\n\t\t *\n\t\t * @spec openspec/changes/retention-expected-outcome/specs/retention-widget/spec.md#requirement-an-open-record-shows-the-outcome-its-type-expects\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadExpected() {\n\t\t\tconst source = this.content.expected && this.content.expected.source\n\t\t\tthis.expectedRows = null\n\t\t\tif (!source || !source.register || !source.schema || this.nomination) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst filter = resolveFilterTokens(source.filter || {}, { objectId: this.id, object: this.record })\n\t\t\tif (hasUnresolvedTokens(filter)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst { data } = await axios.get(generateUrl(`/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}`), { params: { ...filter, _limit: 100 } })\n\t\t\t\tthis.expectedRows = Array.isArray(data?.results) ? data.results : []\n\t\t\t} catch {\n\t\t\t\tthis.expectedRows = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ask OpenRegister to derive the nomination again with the reason the\n\t\t * dialog asked for, then read it back.\n\t\t *\n\t\t * @spec openspec/changes/retention-recompute-header/specs/retention-recompute-header/spec.md#requirement-recomputing-the-nomination-starts-in-the-card-header-and-asks-for-a-reason\n\t\t * @param {string} reason Why it is recomputed.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync recompute(reason) {\n\t\t\tconst why = String(reason ?? '').trim()\n\t\t\tif (this.busy || why === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateUrl(`/apps/openregister/api/archival/objects/${encodeURIComponent(this.id)}/nomination/recompute`), { reason: why })\n\t\t\t\tthis.recomputeOpen = false\n\t\t\t\tawait this.load()\n\t\t\t} catch (failure) {\n\t\t\t\tconst body = failure && failure.response && failure.response.data\n\t\t\t\tthis.error = String((body && (body.message || body.error)) || (failure && failure.message) || failure)\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-retention {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-retention__head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tgap: 10px 16px;\n}\n\n.cn-retention__head-text {\n\tdisplay: flex;\n\tflex: 1 1 260px;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-retention__title {\n\tmargin: 0;\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n\n.cn-retention__muted {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-retention__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\tgap: 12px 24px;\n\tmargin: 0;\n}\n\n.cn-retention__fact dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-retention__fact dd {\n\tmargin: 0;\n\tfont-weight: 600;\n}\n\n.cn-retention__section {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-retention__rows {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-retention__row {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-border);\n}\n\n.cn-retention__row-text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-retention__row-title {\n\tfont-weight: 600;\n}\n\n</style>\n"],"names":["CnRetentionRecomputeDialog","CnStatusBadge","t","n","axios"],"mappings":"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"}
1
+ {"version":3,"file":"CnRetentionWidget.vue2.js","sources":["../../../../src/components/CnRetentionWidget/CnRetentionWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-retention\" data-testid=\"cn-retention\">\n\t\t<header class=\"cn-retention__head\">\n\t\t\t<div class=\"cn-retention__head-text\">\n\t\t\t\t<h3 class=\"cn-retention__title\">\n\t\t\t\t\t{{ text(content.title) || t('nextcloud-vue', 'Archiving') }}\n\t\t\t\t</h3>\n\t\t\t\t<p class=\"cn-retention__muted\">\n\t\t\t\t\t{{ text(content.subtitle) || t('nextcloud-vue', 'What happens to this record once it is closed') }}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<!-- Recompute starts in the header (board DqZaakArchivering); the\n\t\t\t dialog asks for the reason OpenRegister records with it. -->\n\t\t\t<NcButton\n\t\t\t\tv-if=\"content.recompute !== false && !loading && !error\"\n\t\t\t\t:disabled=\"!mayRecompute || busy\"\n\t\t\t\t:title=\"mayRecompute ? undefined : t('nextcloud-vue', 'Recomputing needs the archivist role')\"\n\t\t\t\t:aria-description=\"mayRecompute ? undefined : t('nextcloud-vue', 'Recomputing needs the archivist role')\"\n\t\t\t\t:data-testid=\"mayRecompute ? 'cn-retention-recompute-open' : 'cn-retention-recompute-denied'\"\n\t\t\t\t@click=\"recomputeOpen = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Refresh :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Recompute nomination') }}\n\t\t\t</NcButton>\n\t\t</header>\n\t\t<CnRetentionRecomputeDialog\n\t\t\tv-if=\"recomputeOpen\"\n\t\t\t:user=\"currentUid\"\n\t\t\t:busy=\"busy\"\n\t\t\t@close=\"recomputeOpen = false\"\n\t\t\t@confirm=\"recompute\" />\n\n\t\t<NcLoadingIcon v-if=\"loading\" :size=\"24\" />\n\t\t<NcEmptyContent v-else-if=\"error\"\n\t\t\t:name=\"t('nextcloud-vue', 'The archival facts are unavailable')\"\n\t\t\t:description=\"error\"\n\t\t\tdata-testid=\"cn-retention-error\">\n\t\t\t<template #action>\n\t\t\t\t<NcButton data-testid=\"cn-retention-retry\" @click=\"load\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Try again') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<template v-else>\n\t\t\t<p v-if=\"archived\" class=\"cn-retention__archived\" data-testid=\"cn-retention-archived\">\n\t\t\t\t{{ t('nextcloud-vue', 'Archived on {at} by {by}. {reason}', { at: String(archived.at ?? ''), by: String(archived.by ?? ''), reason: String(archived.reason ?? '') }) }}\n\t\t\t</p>\n\t\t\t<NcNoteCard v-if=\"disagrees\" type=\"warning\" data-testid=\"cn-retention-disagreement\">\n\t\t\t\t{{ t('nextcloud-vue', 'This record and OpenRegister do not agree on whether it is archived.') }}\n\t\t\t</NcNoteCard>\n\n\t\t\t<NcNoteCard v-if=\"nomination && nomination.status === 'unnominatable'\" type=\"warning\" data-testid=\"cn-retention-unnominatable\">\n\t\t\t\t{{ t('nextcloud-vue', 'Nothing could decide what happens to this record.') }}\n\t\t\t\t{{ String(nomination.unnominatableReason ?? '') }}\n\t\t\t</NcNoteCard>\n\t\t\t<div v-else-if=\"!nomination\" data-testid=\"cn-retention-pending\">\n\t\t\t\t<dl class=\"cn-retention__facts\">\n\t\t\t\t\t<div v-for=\"fact in pendingFacts\" :key=\"fact.key\" class=\"cn-retention__fact\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ fact.value }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t\t<NcNoteCard type=\"info\">\n\t\t\t\t\t{{ text(content.pendingNote) || t('nextcloud-vue', 'This record has not been closed yet. Its archival future is recorded when it closes.') }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t\t<dl v-else class=\"cn-retention__facts\" data-testid=\"cn-retention-facts\">\n\t\t\t\t<div v-for=\"fact in facts\" :key=\"fact.key\" class=\"cn-retention__fact\">\n\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t<dd :data-testid=\"`cn-retention-${fact.key}`\">\n\t\t\t\t\t\t{{ fact.value }}\n\t\t\t\t\t</dd>\n\t\t\t\t</div>\n\t\t\t</dl>\n\n\t\t\t<section v-if=\"content.legalHold\" class=\"cn-retention__section\" data-testid=\"cn-retention-hold\">\n\t\t\t\t<component :is=\"innerHeadingTag\" class=\"cn-inner-heading\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Kept for a procedure') }}\n\t\t\t\t</component>\n\t\t\t\t<ul class=\"cn-retention__rows\">\n\t\t\t\t\t<li v-for=\"hold in holds\" :key=\"hold.id\" class=\"cn-retention__row\">\n\t\t\t\t\t\t<span class=\"cn-retention__row-text\">\n\t\t\t\t\t\t\t<span class=\"cn-retention__row-title\">{{ hold.reason || t('nextcloud-vue', 'Legal hold') }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-retention__muted\">{{ t('nextcloud-vue', 'Placed on {date} by {by}', { date: hold.placedDate, by: hold.placedBy }) }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge :label=\"t('nextcloud-vue', 'Active')\" variant=\"warning\" />\n\t\t\t\t\t</li>\n\t\t\t\t\t<li v-if=\"holds.length === 0\" class=\"cn-retention__row\">\n\t\t\t\t\t\t<span class=\"cn-retention__row-text\">\n\t\t\t\t\t\t\t<span class=\"cn-retention__row-title\">{{ t('nextcloud-vue', 'No legal hold') }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-retention__muted\">{{ t('nextcloud-vue', 'If an objection or appeal runs, destruction is suspended') }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge :label=\"t('nextcloud-vue', 'None')\" />\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<section v-if=\"content.transfer\" class=\"cn-retention__section\" data-testid=\"cn-retention-transfer\">\n\t\t\t\t<component :is=\"innerHeadingTag\" class=\"cn-inner-heading\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Transfer to the e-Depot') }}\n\t\t\t\t</component>\n\t\t\t\t<ul class=\"cn-retention__rows\">\n\t\t\t\t\t<li class=\"cn-retention__row\">\n\t\t\t\t\t\t<span class=\"cn-retention__row-text\">\n\t\t\t\t\t\t\t<span class=\"cn-retention__row-title\">{{ transfers ? t('nextcloud-vue', 'Goes to the e-Depot') : t('nextcloud-vue', 'Not applicable') }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-retention__muted\">{{ transfers ? t('nextcloud-vue', 'After the retention period the record is transferred') : t('nextcloud-vue', 'Only records appraised to keep go to the e-Depot') }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<CnStatusBadge :label=\"transfers ? t('nextcloud-vue', 'Transfer') : t('nextcloud-vue', 'No transfer')\" :variant=\"transfers ? 'info' : 'default'\" />\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<div v-if=\"outcome\" class=\"cn-retention__outcome\" data-testid=\"cn-retention-outcome\">\n\t\t\t\t<component :is=\"innerHeadingTag\" class=\"cn-inner-heading\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Outcome') }}\n\t\t\t\t</component>\n\t\t\t\t<p>{{ t('nextcloud-vue', 'Handed over as {kind} on {at} by {by}.', { kind: String(outcome.kind ?? ''), at: String(outcome.at ?? ''), by: String(outcome.by ?? '') }) }}</p>\n\t\t\t\t<p v-if=\"outcome.transferListUuid\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Transfer list') }}: {{ outcome.transferListUuid }}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard } from '@nextcloud/vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'\nimport CnRetentionRecomputeDialog from './CnRetentionRecomputeDialog.vue'\nimport innerHeading from '../../mixins/innerHeading.js'\nimport { parseDuration } from '../../utils/isoDuration.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\n\n/**\n * CnRetentionWidget — the `retention` detail widget: what happens to a\n * record when its business use ends, as OpenRegister decided it. Every value\n * is read off the record's `@self._retention` (appraisal, disposal date,\n * retention period, selection list row, the rule and when it was written)\n * and `@self.archived`; the widget derives nothing, so it can never disagree\n * with the stored decision. A failed read is an error with a retry, never an\n * empty block. A record nothing could nominate is drawn apart from one that\n * is not closed yet. An archivist (or an admin) may ask OpenRegister to\n * recompute the nomination, with a reason. Any app on OpenRegister uses it;\n * dossiq's case Archiving tab is the first.\n *\n * `content`:\n * - `title`, `subtitle`: texts, through the host translate.\n * - `statusField`, `archivedValues`: a record field and the values that mean\n * archived (`archiveStatus`, `[\"archived\", ...]`); when set, a mismatch with\n * `@self.archived` is said out loud.\n * - `archivistGroups`: groups that may recompute (default `[\"archivaris\"]`;\n * admins always may); `recompute: false` hides the control.\n * - `expected`: before the record closes, the outcome its type expects.\n * `source: { register, schema, filter }` lists the candidate rules (a case\n * type's result types, `filter` tokens such as `@object.caseType`\n * resolved against the record); `fields: { appraisal, period,\n * selectionListRow }` names their fields; `appraisalLabels` names the\n * appraisal values; `periodText` writes the period (`{period} after the\n * decision`); `decidedBy` says who decides. When the candidates agree the\n * facts show that outcome, otherwise \"Depends on the result\". A failed\n * read keeps the plain facts.\n * - `pendingNote`: the note under the facts of a record not closed yet.\n * - `legalHold: true`: a section with the record's active legal holds\n * (`@self._retention.legalHold.holds`), or that none applies.\n * - `transfer: { keepValues }`: a section saying whether the record goes to\n * the e-Depot, from the stored or expected appraisal.\n *\n * The record is read fresh from OpenRegister by `register`, `schema` and\n * `objectId` (props, else the bound record's `@self`).\n */\nexport default {\n\tname: 'CnRetentionWidget',\n\n\tcomponents: { CnRetentionRecomputeDialog, CnStatusBadge, NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard, Refresh },\n\n\tmixins: [innerHeading],\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The bound record, on a detail page.\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/** The record's register (else the bound record's `@self.register`). */\n\t\tregister: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The record's schema (else the bound record's `@self.schema`); a schema object gives its slug.\n\t\t *\n\t\t * @type {string|number|object}\n\t\t */\n\t\tschema: {\n\t\t\ttype: [String, Number, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The record's id (else the bound record's). */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\terror: '',\n\t\t\trecord: null,\n\t\t\t/** Whether the recompute dialog is open. */\n\t\t\trecomputeOpen: false,\n\t\t\tbusy: false,\n\t\t\t/** The candidate rules `content.expected` reads, null until read or when unreadable. */\n\t\t\texpectedRows: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {object} The bound record's `@self`. */\n\t\tboundSelf() {\n\t\t\treturn (this.objectData && this.objectData['@self']) || {}\n\t\t},\n\n\t\t/** @return {string} The record id. */\n\t\tid() {\n\t\t\treturn String(this.objectId || (this.objectData && this.objectData.id) || this.boundSelf.id || '')\n\t\t},\n\n\t\t/** @return {string} The register. */\n\t\tregisterRef() {\n\t\t\treturn String(this.register || this.boundSelf.register || '')\n\t\t},\n\n\t\t/** @return {string} The schema. */\n\t\tschemaRef() {\n\t\t\tconst s = this.schema || this.boundSelf.schema || ''\n\t\t\treturn String(typeof s === 'object' ? (s.slug || s.id || '') : s)\n\t\t},\n\n\t\t/** @return {object} The record's `@self`. */\n\t\tself() {\n\t\t\treturn (this.record && this.record['@self']) || {}\n\t\t},\n\n\t\t/** @return {object|null} OpenRegister's stored retention decision. */\n\t\tretention() {\n\t\t\treturn this.self._retention || null\n\t\t},\n\n\t\t/** @return {object|null} The nomination. */\n\t\tnomination() {\n\t\t\treturn (this.retention && this.retention.nomination) || null\n\t\t},\n\n\t\t/** @return {object|null} The hand-over outcome. */\n\t\toutcome() {\n\t\t\treturn (this.retention && this.retention.outcome) || null\n\t\t},\n\n\t\t/** @return {object|null} OpenRegister's archived marker. */\n\t\tarchived() {\n\t\t\treturn this.self.archived || null\n\t\t},\n\n\t\t/**\n\t\t * Whether the record's own field and the platform marker disagree.\n\t\t *\n\t\t * @spec openspec/changes/retention-widget/specs/retention-widget/spec.md#requirement-a-record-shows-its-stored-retention\n\t\t * @return {boolean}\n\t\t */\n\t\tdisagrees() {\n\t\t\tconst field = this.content.statusField\n\t\t\tif (!field || !this.record) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst values = Array.isArray(this.content.archivedValues) ? this.content.archivedValues.map(String) : ['archived']\n\t\t\tconst saysArchived = values.includes(String(readPath(this.record, field) ?? ''))\n\t\t\treturn saysArchived !== Boolean(this.archived)\n\t\t},\n\n\t\t/**\n\t\t * The stored facts that have a value, in reading order.\n\t\t *\n\t\t * @spec openspec/changes/retention-widget/specs/retention-widget/spec.md#requirement-a-record-shows-its-stored-retention\n\t\t * @return {Array<{key: string, label: string, value: string}>}\n\t\t */\n\t\tfacts() {\n\t\t\tconst r = this.retention || {}\n\t\t\tconst n = this.nomination || {}\n\t\t\treturn [\n\t\t\t\t{ key: 'appraisal', label: t('nextcloud-vue', 'Appraisal'), value: r.appraisal },\n\t\t\t\t{ key: 'disposal-date', label: t('nextcloud-vue', 'Disposal date'), value: r.disposalDate },\n\t\t\t\t{ key: 'retention-period', label: t('nextcloud-vue', 'Retention period'), value: r.retentionPeriod },\n\t\t\t\t{ key: 'selection-list-row', label: t('nextcloud-vue', 'Selection list row'), value: r.selectionListRow },\n\t\t\t\t{ key: 'rule', label: t('nextcloud-vue', 'Decided by'), value: n.rule },\n\t\t\t\t{ key: 'decided-at', label: t('nextcloud-vue', 'Written on'), value: n.at },\n\t\t\t].filter((fact) => fact.value !== undefined && fact.value !== null && fact.value !== '').map((fact) => ({ ...fact, value: String(fact.value) }))\n\t\t},\n\n\t\t/**\n\t\t * The outcome the record's type expects before it closes: the agreed\n\t\t * appraisal, period and selection list row of the candidate rules, or\n\t\t * `mixed` when they disagree; null when nothing was read.\n\t\t *\n\t\t * @spec openspec/changes/retention-expected-outcome/specs/retention-widget/spec.md#requirement-an-open-record-shows-the-outcome-its-type-expects\n\t\t * @return {{appraisal: string, period: string, selectionListRow: string, mixed: boolean}|null}\n\t\t */\n\t\texpectedOutcome() {\n\t\t\tconst rows = this.expectedRows\n\t\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst fields = { appraisal: 'appraisal', period: 'period', selectionListRow: 'selectionListRow', ...(this.content.expected?.fields || {}) }\n\t\t\tconst pick = (row, key) => String(readPath(row, fields[key]) ?? '')\n\t\t\tconst outcomes = rows.map((row) => ({ appraisal: pick(row, 'appraisal'), period: pick(row, 'period'), selectionListRow: pick(row, 'selectionListRow') }))\n\t\t\tconst first = outcomes[0]\n\t\t\tconst agree = outcomes.every((o) => o.appraisal === first.appraisal && o.period === first.period)\n\t\t\tif (first.appraisal === '' && first.period === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn agree\n\t\t\t\t? { ...first, selectionListRow: outcomes.every((o) => o.selectionListRow === first.selectionListRow) ? first.selectionListRow : '', mixed: false }\n\t\t\t\t: { appraisal: '', period: '', selectionListRow: '', mixed: true }\n\t\t},\n\n\t\t/**\n\t\t * The facts of a record not closed yet: the expected outcome where the\n\t\t * type gives one, \"decided when it closes\" otherwise.\n\t\t *\n\t\t * @spec openspec/changes/retention-expected-outcome/specs/retention-widget/spec.md#requirement-an-open-record-shows-the-outcome-its-type-expects\n\t\t * @return {Array<{key: string, label: string, value: string}>}\n\t\t */\n\t\tpendingFacts() {\n\t\t\tconst atClosure = t('nextcloud-vue', 'Decided when it closes')\n\t\t\tconst expected = this.expectedOutcome\n\t\t\tif (!expected) {\n\t\t\t\treturn [\n\t\t\t\t\t{ key: 'appraisal', label: t('nextcloud-vue', 'Appraisal'), value: atClosure },\n\t\t\t\t\t{ key: 'retention-period', label: t('nextcloud-vue', 'Retention period'), value: atClosure },\n\t\t\t\t\t{ key: 'disposal-date', label: t('nextcloud-vue', 'Disposal date'), value: atClosure },\n\t\t\t\t\t{ key: 'decided-at', label: t('nextcloud-vue', 'Written on'), value: t('nextcloud-vue', 'Not yet') },\n\t\t\t\t]\n\t\t\t}\n\t\t\tconst depends = t('nextcloud-vue', 'Depends on the result')\n\t\t\tconst config = this.content.expected || {}\n\t\t\tconst facts = [\n\t\t\t\t{ key: 'appraisal', label: t('nextcloud-vue', 'Appraisal'), value: expected.mixed ? depends : this.appraisalLabel(expected.appraisal) },\n\t\t\t\t{ key: 'retention-period', label: t('nextcloud-vue', 'Retention period'), value: expected.mixed ? depends : this.periodLabel(expected.period) },\n\t\t\t]\n\t\t\tif (expected.selectionListRow) {\n\t\t\t\tfacts.push({ key: 'selection-list-row', label: t('nextcloud-vue', 'Selection list row'), value: expected.selectionListRow })\n\t\t\t}\n\t\t\tfacts.push({ key: 'disposal-date', label: t('nextcloud-vue', 'Disposal date'), value: atClosure })\n\t\t\tif (config.decidedBy) {\n\t\t\t\tfacts.push({ key: 'rule', label: t('nextcloud-vue', 'Decided by'), value: this.text(config.decidedBy) })\n\t\t\t}\n\t\t\tfacts.push({ key: 'decided-at', label: t('nextcloud-vue', 'Written on'), value: t('nextcloud-vue', 'Not yet') })\n\t\t\treturn facts.filter((fact) => fact.value !== '')\n\t\t},\n\n\t\t/** @return {Array<{id: string, reason: string, placedBy: string, placedDate: string}>} The active legal holds. */\n\t\tholds() {\n\t\t\tconst hold = (this.retention && this.retention.legalHold) || {}\n\t\t\tconst list = Array.isArray(hold.holds) ? hold.holds : []\n\t\t\treturn list.map((h, index) => ({ id: String(h.id ?? index), reason: String(h.reason ?? ''), placedBy: String(h.placedBy ?? ''), placedDate: String(h.placedDate ?? '') }))\n\t\t},\n\n\t\t/**\n\t\t * Whether the record goes to the e-Depot: its stored appraisal, else\n\t\t * the expected one, is one of `transfer.keepValues`.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\ttransfers() {\n\t\t\tconst keep = Array.isArray(this.content.transfer?.keepValues) ? this.content.transfer.keepValues.map(String) : ['bewaren', 'blijvend_bewaren', 'retain', 'keep']\n\t\t\tconst stored = this.retention && this.retention.appraisal\n\t\t\tconst appraisal = stored || (this.expectedOutcome && !this.expectedOutcome.mixed ? this.expectedOutcome.appraisal : '')\n\t\t\treturn keep.includes(String(appraisal || ''))\n\t\t},\n\n\t\t/** @return {string} The signed-in user's id. */\n\t\tcurrentUid() {\n\t\t\tconst user = getCurrentUser()\n\t\t\treturn String((user && user.uid) || '')\n\t\t},\n\n\t\t/**\n\t\t * Whether this user may recompute: an admin or an archivist group member.\n\t\t * Shown disabled otherwise, so the user learns which role it needs.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tmayRecompute() {\n\t\t\tconst user = getCurrentUser()\n\t\t\tif (user && user.isAdmin === true) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst groups = Array.isArray(user && user.groups) ? user.groups : []\n\t\t\tconst allowed = Array.isArray(this.content.archivistGroups) ? this.content.archivistGroups : ['archivaris']\n\t\t\treturn allowed.some((g) => groups.includes(g))\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.load()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * An appraisal value in words, through `expected.appraisalLabels`.\n\t\t *\n\t\t * @param {string} value The stored value.\n\t\t * @return {string}\n\t\t */\n\t\tappraisalLabel(value) {\n\t\t\tconst labels = this.content.expected?.appraisalLabels || {}\n\t\t\treturn labels[value] ? this.text(labels[value]) : value\n\t\t},\n\n\t\t/**\n\t\t * An ISO period in words (\"5 years\"), placed in `expected.periodText`.\n\t\t *\n\t\t * @param {string} value The ISO 8601 duration.\n\t\t * @return {string}\n\t\t */\n\t\tperiodLabel(value) {\n\t\t\tconst parsed = parseDuration(value)\n\t\t\tconst words = parsed\n\t\t\t\t? {\n\t\t\t\t\t\tyears: () => n('nextcloud-vue', '%n year', '%n years', parsed.amount),\n\t\t\t\t\t\tmonths: () => n('nextcloud-vue', '%n month', '%n months', parsed.amount),\n\t\t\t\t\t\tweeks: () => n('nextcloud-vue', '%n week', '%n weeks', parsed.amount),\n\t\t\t\t\t\tdays: () => n('nextcloud-vue', '%n day', '%n days', parsed.amount),\n\t\t\t\t\t}[parsed.unit]\n\t\t\t\t: null\n\t\t\tconst period = words ? words() : value\n\t\t\tconst template = this.content.expected?.periodText\n\t\t\treturn template ? this.text(template).replace('{period}', period) : period\n\t\t},\n\n\t\t/**\n\t\t * Read the record fresh from OpenRegister; a failure is an error, never an empty block.\n\t\t *\n\t\t * @spec openspec/changes/retention-widget/specs/retention-widget/spec.md#requirement-a-record-shows-its-stored-retention\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync load() {\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tif (!this.registerRef || !this.schemaRef || !this.id) {\n\t\t\t\t\tthrow new Error(t('nextcloud-vue', 'This widget has no record to read.'))\n\t\t\t\t}\n\t\t\t\tconst { data } = await axios.get(generateUrl(`/apps/openregister/api/objects/${encodeURIComponent(this.registerRef)}/${encodeURIComponent(this.schemaRef)}/${encodeURIComponent(this.id)}`))\n\t\t\t\tthis.record = data && typeof data === 'object' ? data : null\n\t\t\t\tawait this.loadExpected()\n\t\t\t} catch (failure) {\n\t\t\t\tconst body = failure && failure.response && failure.response.data\n\t\t\t\tthis.error = String((body && (body.message || body.error)) || (failure && failure.message) || failure)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read the candidate rules `content.expected` names, for a record that\n\t\t * is not nominated yet. A failure leaves the plain pending facts.\n\t\t *\n\t\t * @spec openspec/changes/retention-expected-outcome/specs/retention-widget/spec.md#requirement-an-open-record-shows-the-outcome-its-type-expects\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadExpected() {\n\t\t\tconst source = this.content.expected && this.content.expected.source\n\t\t\tthis.expectedRows = null\n\t\t\tif (!source || !source.register || !source.schema || this.nomination) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst filter = resolveFilterTokens(source.filter || {}, { objectId: this.id, object: this.record })\n\t\t\tif (hasUnresolvedTokens(filter)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst { data } = await axios.get(generateUrl(`/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}`), { params: { ...filter, _limit: 100 } })\n\t\t\t\tthis.expectedRows = Array.isArray(data?.results) ? data.results : []\n\t\t\t} catch {\n\t\t\t\tthis.expectedRows = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ask OpenRegister to derive the nomination again with the reason the\n\t\t * dialog asked for, then read it back.\n\t\t *\n\t\t * @spec openspec/changes/retention-recompute-header/specs/retention-recompute-header/spec.md#requirement-recomputing-the-nomination-starts-in-the-card-header-and-asks-for-a-reason\n\t\t * @param {string} reason Why it is recomputed.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync recompute(reason) {\n\t\t\tconst why = String(reason ?? '').trim()\n\t\t\tif (this.busy || why === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateUrl(`/apps/openregister/api/archival/objects/${encodeURIComponent(this.id)}/nomination/recompute`), { reason: why })\n\t\t\t\tthis.recomputeOpen = false\n\t\t\t\tawait this.load()\n\t\t\t} catch (failure) {\n\t\t\t\tconst body = failure && failure.response && failure.response.data\n\t\t\t\tthis.error = String((body && (body.message || body.error)) || (failure && failure.message) || failure)\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-retention {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-retention__head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tgap: 10px 16px;\n}\n\n.cn-retention__head-text {\n\tdisplay: flex;\n\tflex: 1 1 260px;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-retention__title {\n\tmargin: 0;\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n\n.cn-retention__muted {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-retention__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\tgap: 12px 24px;\n\tmargin: 0;\n}\n\n/* The server draws every dt as a 130px right-aligned inline block and pads\n dt and dd 12px; a fact is a label over its value. */\n.cn-retention__fact dt,\n.cn-retention__fact dd {\n\tdisplay: block;\n\twidth: auto;\n\twhite-space: normal;\n\ttext-align: start;\n}\n\n.cn-retention__fact dt {\n\tmargin: 0;\n\tpadding: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-retention__fact dd {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-weight: 600;\n}\n\n.cn-retention__section {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-retention__rows {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-retention__row {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-border);\n}\n\n.cn-retention__row-text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-retention__row-title {\n\tfont-weight: 600;\n}\n\n</style>\n"],"names":["CnRetentionRecomputeDialog","CnStatusBadge","t","n","axios"],"mappings":"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"}