@conduction/nextcloud-vue 2.119.0 → 2.120.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 (126) hide show
  1. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js +9 -0
  2. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js.map +1 -0
  3. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js +226 -0
  4. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js.map +1 -0
  5. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js +211 -0
  6. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js.map +1 -0
  7. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js +9 -0
  8. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js.map +1 -0
  9. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js +64 -0
  10. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js.map +1 -0
  11. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js +89 -0
  12. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js.map +1 -0
  13. package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
  14. package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
  15. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js +9 -0
  16. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js.map +1 -0
  17. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js +257 -0
  18. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js.map +1 -0
  19. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js +266 -0
  20. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js.map +1 -0
  21. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue.js +1 -1
  22. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js +14 -7
  23. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js.map +1 -1
  24. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue3.js.map +1 -1
  25. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js +9 -0
  26. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js.map +1 -0
  27. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js +278 -0
  28. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js.map +1 -0
  29. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js +128 -0
  30. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js.map +1 -0
  31. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js +10 -0
  32. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js.map +1 -0
  33. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js +944 -0
  34. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js.map +1 -0
  35. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js +276 -0
  36. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js.map +1 -0
  37. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js +9 -0
  38. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js.map +1 -0
  39. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js +354 -0
  40. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js.map +1 -0
  41. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js +392 -0
  42. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js.map +1 -0
  43. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js +9 -0
  44. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js.map +1 -0
  45. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js +180 -0
  46. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js.map +1 -0
  47. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js +208 -0
  48. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js.map +1 -0
  49. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js +9 -0
  50. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js.map +1 -0
  51. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js +244 -0
  52. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js.map +1 -0
  53. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js +76 -0
  54. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js.map +1 -0
  55. package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js +290 -0
  56. package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js.map +1 -0
  57. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +9 -0
  58. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js.map +1 -0
  59. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +448 -0
  60. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -0
  61. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +303 -0
  62. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -0
  63. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
  64. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +19 -2
  65. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
  66. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js +73 -62
  67. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +6 -0
  69. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  70. package/dist/esm/index.js +5 -0
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/esm/l10n/en.json.js +166 -1
  73. package/dist/esm/l10n/en.json.js.map +1 -1
  74. package/dist/esm/l10n/nl.json.js +166 -1
  75. package/dist/esm/l10n/nl.json.js.map +1 -1
  76. package/dist/esm/library-style.js +1 -1
  77. package/dist/esm/nextcloud-vue.css +889 -101
  78. package/dist/esm/utils/aiFeatures.js +245 -0
  79. package/dist/esm/utils/aiFeatures.js.map +1 -0
  80. package/dist/esm/utils/aiSuggestionTracker.js +182 -0
  81. package/dist/esm/utils/aiSuggestionTracker.js.map +1 -0
  82. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  83. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  84. package/dist/esm/utils/objectPermissions.js +552 -0
  85. package/dist/esm/utils/objectPermissions.js.map +1 -0
  86. package/dist/esm/utils/objectTranslations.js +180 -0
  87. package/dist/esm/utils/objectTranslations.js.map +1 -0
  88. package/dist/esm/utils/stateMachineValidation.js +254 -0
  89. package/dist/esm/utils/stateMachineValidation.js.map +1 -0
  90. package/dist/esm/utils/widgetDispatch.js +3 -1
  91. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  92. package/dist/nextcloud-vue.cjs.js +20052 -13138
  93. package/dist/nextcloud-vue.cjs.js.map +2 -2
  94. package/dist/nextcloud-vue.css +889 -101
  95. package/l10n/en.json +166 -1
  96. package/l10n/nl.json +166 -1
  97. package/package.json +1 -1
  98. package/src/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue +416 -0
  99. package/src/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue +136 -0
  100. package/src/components/CnAiFeaturesWidget/__tests__/CnAiFeaturesWidget.spec.js +213 -0
  101. package/src/components/CnAiFeaturesWidget/index.js +14 -0
  102. package/src/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue +499 -0
  103. package/src/components/CnObjectPermissionsTab/__tests__/CnObjectPermissionsTab.spec.js +186 -0
  104. package/src/components/CnObjectPermissionsTab/index.js +13 -0
  105. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +8 -1
  106. package/src/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue +424 -0
  107. package/src/components/CnObjectTranslationsWidget/__tests__/CnObjectTranslationsWidget.spec.js +189 -0
  108. package/src/components/CnObjectTranslationsWidget/index.js +13 -0
  109. package/src/components/CnStateMachineEditor/CnStateMachineEditor.vue +1332 -0
  110. package/src/components/CnStateMachineEditor/CnStateMachineFields.vue +791 -0
  111. package/src/components/CnStateMachineEditor/CnStateMachineNode.vue +442 -0
  112. package/src/components/CnStateMachineEditor/CnStateMachinePanel.vue +326 -0
  113. package/src/components/CnStateMachineEditor/index.js +8 -0
  114. package/src/components/CnStateMachineEditor/stateMachineFields.js +287 -0
  115. package/src/components/CnTimelineWidget/CnTimelineManage.vue +827 -0
  116. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +29 -3
  117. package/src/components/CnWidgetGrid/builtInWidgets.js +6 -0
  118. package/src/components/index.js +4 -0
  119. package/src/index.js +5 -0
  120. package/src/utils/aiFeatures.js +241 -0
  121. package/src/utils/aiSuggestionTracker.js +178 -0
  122. package/src/utils/libraryWidgetKeys.js +1 -0
  123. package/src/utils/objectPermissions.js +548 -0
  124. package/src/utils/objectTranslations.js +176 -0
  125. package/src/utils/stateMachineValidation.js +250 -0
  126. package/src/utils/widgetDispatch.js +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnObjectPermissionsTab.vue2.js","sources":["../../../../src/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue"],"sourcesContent":["<!--\n SPDX-FileCopyrightText: 2026 Conduction B.V.\n SPDX-License-Identifier: EUPL-1.2\n\n CnObjectPermissionsTab — who holds which right on one OpenRegister object, and\n where each grant came from. Read-only: it renders OpenRegister's answer and\n computes none of it. One row per rule; a deny is its own row beside the grant\n it removes. A failed read is named, never shown as an empty list.\n-->\n<template>\n\t<div class=\"cn-object-permissions-tab\">\n\t\t<h3>{{ title || t('nextcloud-vue', 'Who holds which right') }}</h3>\n\n\t\t<div v-if=\"loading\" class=\"cn-object-permissions-tab__loading\">\n\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t{{ t('nextcloud-vue', 'Reading the grants on this record') }}\n\t\t</div>\n\n\t\t<template v-else>\n\t\t\t<p v-if=\"reviewRefused\" class=\"cn-object-permissions-tab__unreadable\">\n\t\t\t\t{{ t('nextcloud-vue', 'You may open this record. You may not review who else can.') }}\n\t\t\t</p>\n\n\t\t\t<p v-else-if=\"unreadable.length > 0\" class=\"cn-object-permissions-tab__unreadable\">\n\t\t\t\t{{ t('nextcloud-vue', 'OpenRegister could not be asked for {sources}. This list is incomplete, not empty.', { sources: unreadable.join(', ') }) }}\n\t\t\t</p>\n\n\t\t\t<p v-if=\"enforcement\" class=\"cn-object-permissions-tab__enforcement\">\n\t\t\t\t{{ enforcementSentence }}\n\t\t\t</p>\n\n\t\t\t<p v-if=\"rows.length === 0\" class=\"cn-object-permissions-tab__empty\">\n\t\t\t\t{{ t('nextcloud-vue', 'OpenRegister reports no rule on this record.') }}\n\t\t\t</p>\n\n\t\t\t<table v-else class=\"cn-object-permissions-tab__table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Holder') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Right') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Where it comes from') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr v-for=\"(row, index) in rows\"\n\t\t\t\t\t\t:key=\"`${row.holder}-${row.right}-${row.source}-${index}`\"\n\t\t\t\t\t\tclass=\"cn-object-permissions-tab__row\">\n\t\t\t\t\t\t<td>{{ row.holder || t('nextcloud-vue', 'Not named') }}</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<span class=\"cn-object-permissions-tab__right\">{{ row.right }}</span>\n\t\t\t\t\t\t\t<span v-if=\"describe(row.right)\" class=\"cn-object-permissions-tab__hint\">{{ describe(row.right) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"row.declared === false\" class=\"cn-object-permissions-tab__hint\">{{ t('nextcloud-vue', 'OpenRegister does not publish this right.') }}</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<span class=\"cn-object-permissions-tab__source\">{{ sourceLabel(row.source) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"roleHint(row)\" class=\"cn-object-permissions-tab__hint\">{{ roleHint(row) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"inheritedHint(row)\" class=\"cn-object-permissions-tab__hint cn-object-permissions-tab__inherited\">{{ inheritedHint(row) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"row.until\" class=\"cn-object-permissions-tab__hint\">{{ endsHint(row) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"areaHint(row)\" class=\"cn-object-permissions-tab__hint\">{{ areaHint(row) }}</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\n\t\t\t<section v-if=\"historyEnabled && historyReadable\" class=\"cn-object-permissions-tab__history\">\n\t\t\t\t<h4>{{ t('nextcloud-vue', 'Who held a right on a date') }}</h4>\n\n\t\t\t\t<label class=\"cn-object-permissions-tab__moment\">\n\t\t\t\t\t<span>{{ t('nextcloud-vue', 'Report the rights as they stood on') }}</span>\n\t\t\t\t\t<input v-model=\"moment\"\n\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t:max=\"today\"\n\t\t\t\t\t\t@change=\"loadMoment\">\n\t\t\t\t</label>\n\n\t\t\t\t<p v-if=\"momentLoading\" class=\"cn-object-permissions-tab__empty\" role=\"status\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Reading the trail for that date') }}\n\t\t\t\t</p>\n\n\t\t\t\t<template v-else-if=\"asOf\">\n\t\t\t\t\t<p v-if=\"asOf.answered === false\" class=\"cn-object-permissions-tab__empty\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'The trail does not reach {date}, so nobody can be reported for it.', { date: moment }) }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<p class=\"cn-object-permissions-tab__enforcement\">\n\t\t\t\t\t\t\t{{ setBySentence }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p v-if=\"asOf.changedAfterwardsBy\" class=\"cn-object-permissions-tab__enforcement\">\n\t\t\t\t\t\t\t{{ changedAfterwardsSentence }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<table class=\"cn-object-permissions-tab__table\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Holder') }}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Right') }}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Where it came from') }}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr v-for=\"(row, index) in asOf.rows\"\n\t\t\t\t\t\t\t\t\t:key=\"`asof-${row.holder}-${row.right}-${index}`\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-object-permissions-tab__row\">\n\t\t\t\t\t\t\t\t\t<td>{{ row.holder || t('nextcloud-vue', 'Not named') }}</td>\n\t\t\t\t\t\t\t\t\t<td>{{ row.right }}</td>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<span class=\"cn-object-permissions-tab__source\">{{ sourceLabel(row.source) }}</span>\n\t\t\t\t\t\t\t\t\t\t<span v-if=\"roleHint(row)\" class=\"cn-object-permissions-tab__hint\">{{ roleHint(row) }}</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t</section>\n\n\t\t\t<section v-if=\"fieldRows.length\" class=\"cn-object-permissions-tab__fields\">\n\t\t\t\t<h4>{{ t('nextcloud-vue', 'Which fields each role reads') }}</h4>\n\t\t\t\t<p class=\"cn-object-permissions-tab__hint\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'A field missing from this record is missing because of a rule below, not because it is empty.') }}\n\t\t\t\t</p>\n\t\t\t\t<table class=\"cn-object-permissions-tab__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', 'Field') }}\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{{ t('nextcloud-vue', 'Rule') }}\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{{ t('nextcloud-vue', 'Who it affects') }}\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<tr v-for=\"(row, index) in fieldRows\"\n\t\t\t\t\t\t\t:key=\"`field-${row.field}-${row.rule}-${index}`\"\n\t\t\t\t\t\t\tclass=\"cn-object-permissions-tab__row\">\n\t\t\t\t\t\t\t<td>{{ row.field }}</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t{{ ruleLabels[row.rule] }}\n\t\t\t\t\t\t\t\t<span v-if=\"row.appliesToMe\" class=\"cn-object-permissions-tab__source\">{{ t('nextcloud-vue', 'applies to you') }}</span>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t{{ sentenceFor(row) }}\n\t\t\t\t\t\t\t\t<span v-if=\"row.reason\" class=\"cn-object-permissions-tab__hint\">{{ row.reason }}</span>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</section>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport {\n\tasOfRows,\n\tDEFAULT_API_BASE,\n\tfetchAccessHistory,\n\tfetchCallerScope,\n\tfetchDenyRules,\n\tfetchFieldRoleRules,\n\tfetchObjectGrants,\n\tfetchObjectPermissions,\n\tfetchPermissionCatalogue,\n\tfetchRoleGrants,\n\tfieldRoleRows,\n\tgrantRows,\n\troleRuleLabels,\n\troleRuleSentence,\n} from '../../utils/objectPermissions.js'\n\n/** OpenRegister's answer to a reader who may open the object and not review it. */\nconst REVIEW_REFUSED = 403\n\nexport default {\n\tname: 'CnObjectPermissionsTab',\n\tcomponents: { NcLoadingIcon },\n\n\tprops: {\n\t\t/** The object uuid (injected by CnObjectSidebar). */\n\t\tobjectId: { type: String, default: '' },\n\t\t/** Register slug or uuid (injected by CnObjectSidebar). */\n\t\tregister: { type: String, default: '' },\n\t\t/** Schema slug or uuid (injected by CnObjectSidebar). */\n\t\tschema: { type: String, default: '' },\n\t\t/** OpenRegister API root. */\n\t\tapiBase: { type: String, default: DEFAULT_API_BASE },\n\t\t/** Offer \"who held a right on a date\" when OpenRegister answers the history read. */\n\t\thistoryEnabled: { type: Boolean, default: true },\n\t\t/**\n\t\t * Where the per-role field rules are declared:\n\t\t * `{ typeField, typeSchema, declarationField? }`. The object's\n\t\t * `typeField` references a `typeSchema` object in the same register\n\t\t * whose `declarationField` (default `fieldRoleRules`) lists the rules.\n\t\t * `null` leaves the field-rules section out.\n\t\t */\n\t\tfieldRules: { type: Object, default: null },\n\t\t/** Heading; empty uses the translated default. */\n\t\ttitle: { type: String, default: '' },\n\t\t/**\n\t\t * Labels per source key, overriding the defaults (e.g. `{ group: '…' }`).\n\t\t * An unknown key renders as itself.\n\t\t */\n\t\tsourceLabels: { type: Object, default: () => ({}) },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\trows: [],\n\t\t\tcatalogue: [],\n\t\t\tenforcement: '',\n\t\t\tunreadable: [],\n\t\t\treviewRefused: false,\n\t\t\thistoryReadable: false,\n\t\t\tfieldRows: [],\n\t\t\tmoment: '',\n\t\t\tmomentLoading: false,\n\t\t\tasOf: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\ttarget() {\n\t\t\treturn { register: this.register, schema: this.schema, apiBase: this.apiBase }\n\t\t},\n\n\t\truleLabels() {\n\t\t\treturn roleRuleLabels()\n\t\t},\n\n\t\t/** Today, so nobody asks the trail about a date that has not happened. */\n\t\ttoday() {\n\t\t\treturn new Date().toISOString().slice(0, 10)\n\t\t},\n\n\t\tsetBySentence() {\n\t\t\tif (!this.asOf?.setBy) {\n\t\t\t\treturn t('nextcloud-vue', 'These rights stood on that date. Nobody is named as setting them.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{who} set these rights.', { who: this.asOf.setBy })\n\t\t},\n\n\t\tchangedAfterwardsSentence() {\n\t\t\tconst change = this.asOf?.changedAfterwardsBy\n\t\t\tif (!change) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{who} changed them afterwards, on {date}.', {\n\t\t\t\twho: change.by || t('nextcloud-vue', 'Somebody'),\n\t\t\t\tdate: change.at || t('nextcloud-vue', 'a date the trail does not give'),\n\t\t\t})\n\t\t},\n\n\t\tenforcementSentence() {\n\t\t\tif (this.enforcement === 'enforcing') {\n\t\t\t\treturn t('nextcloud-vue', 'A refusal below is in force now.')\n\t\t\t}\n\t\t\tif (this.enforcement === 'off') {\n\t\t\t\treturn t('nextcloud-vue', 'Refusals are switched off, so no rule below removes a right.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Refusals are staged: a rule below is recorded, and removes a right once it is switched on.')\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId() {\n\t\t\tthis.asOf = null\n\t\t\tthis.moment = ''\n\t\t\tthis.load()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.load()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tsentenceFor(row) {\n\t\t\treturn roleRuleSentence(row)\n\t\t},\n\n\t\t/**\n\t\t * Ask OpenRegister once and render what came back.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync load() {\n\t\t\tthis.loading = true\n\t\t\tconst permissions = this.objectId\n\t\t\t\t? await fetchObjectPermissions(this.target, this.objectId)\n\t\t\t\t: { status: 0, set: null }\n\n\t\t\t// A 403 is OpenRegister answering \"not you\", not a failed read.\n\t\t\tthis.reviewRefused = permissions.status === REVIEW_REFUSED\n\t\t\tthis.historyReadable = permissions.set !== null\n\t\t\tconst fallback = permissions.set === null\n\n\t\t\tconst [catalogue, objectGrants, roleGrants, callerScope, denyRules, fieldRules] = await Promise.all([\n\t\t\t\tfetchPermissionCatalogue(this.target),\n\t\t\t\tfallback && this.objectId ? fetchObjectGrants(this.target, this.objectId) : null,\n\t\t\t\tfallback ? fetchRoleGrants(this.target) : null,\n\t\t\t\tfetchCallerScope(this.target),\n\t\t\t\tfallback ? fetchDenyRules(this.target) : null,\n\t\t\t\tthis.fieldRules ? fetchFieldRoleRules(this.target, this.objectId, this.fieldRules) : { decided: null, declared: null },\n\t\t\t])\n\n\t\t\tthis.fieldRows = fieldRoleRows(fieldRules.declared, fieldRules.decided)\n\n\t\t\t// Each failed read is named: an auditor reading a short list has to\n\t\t\t// know which source is missing from it.\n\t\t\tconst missing = []\n\t\t\tif (catalogue === null) {\n\t\t\t\tmissing.push(t('nextcloud-vue', 'the rights it publishes'))\n\t\t\t}\n\t\t\tif (permissions.set === null) {\n\t\t\t\tif (objectGrants === null) {\n\t\t\t\t\tmissing.push(t('nextcloud-vue', 'the shares on this record'))\n\t\t\t\t}\n\t\t\t\tif (roleGrants === null) {\n\t\t\t\t\tmissing.push(t('nextcloud-vue', 'the roles'))\n\t\t\t\t}\n\t\t\t\tif (denyRules === null) {\n\t\t\t\t\tmissing.push(t('nextcloud-vue', 'the refusals'))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (callerScope === null) {\n\t\t\t\tmissing.push(t('nextcloud-vue', 'your own rights'))\n\t\t\t}\n\n\t\t\tthis.catalogue = catalogue?.permissions || []\n\t\t\tthis.enforcement = permissions.set?.denyEnforcement || catalogue?.denyEnforcement || denyRules?.denyEnforcement || ''\n\t\t\tthis.unreadable = this.reviewRefused ? [] : missing\n\t\t\tthis.rows = grantRows({ objectPermissions: permissions.set, objectGrants, roleGrants, callerScope, denyRules })\n\t\t\tthis.loading = false\n\t\t},\n\n\t\t/**\n\t\t * Ask the trail who held a right at the end of the picked day.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadMoment() {\n\t\t\tif (this.moment === '' || this.objectId === '') {\n\t\t\t\tthis.asOf = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.momentLoading = true\n\t\t\t// End of that day, so a grant written during it counts as standing on it.\n\t\t\tconst { history } = await fetchAccessHistory(this.target, this.objectId, `${this.moment}T23:59:59`)\n\t\t\tthis.asOf = asOfRows(history)\n\t\t\tthis.momentLoading = false\n\t\t},\n\n\t\troleHint(row) {\n\t\t\tif (!row?.role) {\n\t\t\t\treturn row?.detail || ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Through the role {role}', { role: row.role })\n\t\t},\n\n\t\t/**\n\t\t * Which record handed this rule down, named inside a sentence, never bare.\n\t\t *\n\t\t * @param {object} row One row.\n\t\t * @return {string} The sentence, or ''.\n\t\t */\n\t\tinheritedHint(row) {\n\t\t\tif (!row?.inheritedFrom) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Granted on record {record}, which this one hangs under', { record: row.inheritedFrom })\n\t\t},\n\n\t\t/**\n\t\t * The end as OpenRegister wrote it: printed, never judged against a clock.\n\t\t *\n\t\t * @param {object} row One row.\n\t\t * @return {string} The sentence.\n\t\t */\n\t\tendsHint(row) {\n\t\t\treturn t('nextcloud-vue', 'Written to end on {date}', { date: row.until })\n\t\t},\n\n\t\tareaHint(row) {\n\t\t\tconst named = [...(row?.scopedTo?.registers || []), ...(row?.scopedTo?.schemas || [])]\n\t\t\t\t.filter((name) => typeof name === 'string' && name !== '')\n\t\t\tif (named.length === 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Only in {areas}', { areas: named.join(', ') })\n\t\t},\n\n\t\tdescribe(right) {\n\t\t\tconst entry = this.catalogue.find((permission) => permission?.action === right)\n\t\t\treturn entry?.description || ''\n\t\t},\n\n\t\tsourceLabel(source) {\n\t\t\tif (this.sourceLabels && this.sourceLabels[source]) {\n\t\t\t\treturn this.sourceLabels[source]\n\t\t\t}\n\t\t\tconst labels = {\n\t\t\t\tshare: t('nextcloud-vue', 'A share on this record'),\n\t\t\t\trole: t('nextcloud-vue', 'A role'),\n\t\t\t\tgroup: t('nextcloud-vue', 'A grant on a group of types'),\n\t\t\t\tobject: t('nextcloud-vue', 'A rule on this record'),\n\t\t\t\tschema: t('nextcloud-vue', 'A rule on every record of this type'),\n\t\t\t\tregister: t('nextcloud-vue', 'A rule on the register'),\n\t\t\t\tdeny: t('nextcloud-vue', 'A rule that refuses'),\n\t\t\t\t'staged-deny': t('nextcloud-vue', 'A rule that will refuse'),\n\t\t\t\t'default-open': t('nextcloud-vue', 'No rule, so it is open'),\n\t\t\t\tnone: t('nextcloud-vue', 'No rule grants it'),\n\t\t\t\tinherited: t('nextcloud-vue', 'A grant on a record this one hangs under'),\n\t\t\t}\n\t\t\treturn labels[source] || source\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-permissions-tab {\n\tpadding: 12px;\n}\n\n.cn-object-permissions-tab__loading {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-object-permissions-tab__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n}\n\n.cn-object-permissions-tab__table th,\n.cn-object-permissions-tab__table td {\n\ttext-align: start;\n\tpadding: 4px 8px;\n\tborder-bottom: 1px solid var(--color-border);\n\tvertical-align: top;\n}\n\n.cn-object-permissions-tab__right,\n.cn-object-permissions-tab__source {\n\tdisplay: block;\n}\n\n.cn-object-permissions-tab__hint {\n\tdisplay: block;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n}\n\n.cn-object-permissions-tab__unreadable {\n\tcolor: var(--color-warning-text, var(--color-main-text));\n}\n\n.cn-object-permissions-tab__enforcement,\n.cn-object-permissions-tab__empty {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-object-permissions-tab__history,\n.cn-object-permissions-tab__fields {\n\tmargin-block-start: 24px;\n\tborder-top: 1px solid var(--color-border);\n\tpadding-block-start: 12px;\n}\n\n.cn-object-permissions-tab__moment {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n\tmargin-block-end: 8px;\n}\n</style>\n"],"names":["t"],"mappings":"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"}
@@ -0,0 +1,266 @@
1
+ import { resolveComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, createVNode, createTextVNode, Fragment, createCommentVNode, renderList, withDirectives, vModelText } from 'vue';
2
+
3
+ const _hoisted_1 = { class: "cn-object-permissions-tab" };
4
+ const _hoisted_2 = {
5
+ key: 0,
6
+ class: "cn-object-permissions-tab__loading"
7
+ };
8
+ const _hoisted_3 = {
9
+ key: 0,
10
+ class: "cn-object-permissions-tab__unreadable"
11
+ };
12
+ const _hoisted_4 = {
13
+ key: 1,
14
+ class: "cn-object-permissions-tab__unreadable"
15
+ };
16
+ const _hoisted_5 = {
17
+ key: 2,
18
+ class: "cn-object-permissions-tab__enforcement"
19
+ };
20
+ const _hoisted_6 = {
21
+ key: 3,
22
+ class: "cn-object-permissions-tab__empty"
23
+ };
24
+ const _hoisted_7 = {
25
+ key: 4,
26
+ class: "cn-object-permissions-tab__table"
27
+ };
28
+ const _hoisted_8 = { scope: "col" };
29
+ const _hoisted_9 = { scope: "col" };
30
+ const _hoisted_10 = { scope: "col" };
31
+ const _hoisted_11 = { class: "cn-object-permissions-tab__right" };
32
+ const _hoisted_12 = {
33
+ key: 0,
34
+ class: "cn-object-permissions-tab__hint"
35
+ };
36
+ const _hoisted_13 = {
37
+ key: 1,
38
+ class: "cn-object-permissions-tab__hint"
39
+ };
40
+ const _hoisted_14 = { class: "cn-object-permissions-tab__source" };
41
+ const _hoisted_15 = {
42
+ key: 0,
43
+ class: "cn-object-permissions-tab__hint"
44
+ };
45
+ const _hoisted_16 = {
46
+ key: 1,
47
+ class: "cn-object-permissions-tab__hint cn-object-permissions-tab__inherited"
48
+ };
49
+ const _hoisted_17 = {
50
+ key: 2,
51
+ class: "cn-object-permissions-tab__hint"
52
+ };
53
+ const _hoisted_18 = {
54
+ key: 3,
55
+ class: "cn-object-permissions-tab__hint"
56
+ };
57
+ const _hoisted_19 = {
58
+ key: 5,
59
+ class: "cn-object-permissions-tab__history"
60
+ };
61
+ const _hoisted_20 = { class: "cn-object-permissions-tab__moment" };
62
+ const _hoisted_21 = ["max"];
63
+ const _hoisted_22 = {
64
+ key: 0,
65
+ class: "cn-object-permissions-tab__empty",
66
+ role: "status"
67
+ };
68
+ const _hoisted_23 = {
69
+ key: 0,
70
+ class: "cn-object-permissions-tab__empty"
71
+ };
72
+ const _hoisted_24 = { class: "cn-object-permissions-tab__enforcement" };
73
+ const _hoisted_25 = {
74
+ key: 0,
75
+ class: "cn-object-permissions-tab__enforcement"
76
+ };
77
+ const _hoisted_26 = { class: "cn-object-permissions-tab__table" };
78
+ const _hoisted_27 = { scope: "col" };
79
+ const _hoisted_28 = { scope: "col" };
80
+ const _hoisted_29 = { scope: "col" };
81
+ const _hoisted_30 = { class: "cn-object-permissions-tab__source" };
82
+ const _hoisted_31 = {
83
+ key: 0,
84
+ class: "cn-object-permissions-tab__hint"
85
+ };
86
+ const _hoisted_32 = {
87
+ key: 6,
88
+ class: "cn-object-permissions-tab__fields"
89
+ };
90
+ const _hoisted_33 = { class: "cn-object-permissions-tab__hint" };
91
+ const _hoisted_34 = { class: "cn-object-permissions-tab__table" };
92
+ const _hoisted_35 = { scope: "col" };
93
+ const _hoisted_36 = { scope: "col" };
94
+ const _hoisted_37 = { scope: "col" };
95
+ const _hoisted_38 = {
96
+ key: 0,
97
+ class: "cn-object-permissions-tab__source"
98
+ };
99
+ const _hoisted_39 = {
100
+ key: 0,
101
+ class: "cn-object-permissions-tab__hint"
102
+ };
103
+
104
+ function render(_ctx, _cache, $props, $setup, $data, $options) {
105
+ const _component_NcLoadingIcon = resolveComponent("NcLoadingIcon");
106
+
107
+ return (openBlock(), createElementBlock("div", _hoisted_1, [
108
+ createElementVNode("h3", null, toDisplayString($props.title || $options.t('nextcloud-vue', 'Who holds which right')), 1 /* TEXT */),
109
+ ($data.loading)
110
+ ? (openBlock(), createElementBlock("div", _hoisted_2, [
111
+ createVNode(_component_NcLoadingIcon, { size: 20 }),
112
+ createTextVNode(" " + toDisplayString($options.t('nextcloud-vue', 'Reading the grants on this record')), 1 /* TEXT */)
113
+ ]))
114
+ : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
115
+ ($data.reviewRefused)
116
+ ? (openBlock(), createElementBlock("p", _hoisted_3, toDisplayString($options.t('nextcloud-vue', 'You may open this record. You may not review who else can.')), 1 /* TEXT */))
117
+ : ($data.unreadable.length > 0)
118
+ ? (openBlock(), createElementBlock("p", _hoisted_4, toDisplayString($options.t('nextcloud-vue', 'OpenRegister could not be asked for {sources}. This list is incomplete, not empty.', { sources: $data.unreadable.join(', ') })), 1 /* TEXT */))
119
+ : createCommentVNode("v-if", true),
120
+ ($data.enforcement)
121
+ ? (openBlock(), createElementBlock("p", _hoisted_5, toDisplayString($options.enforcementSentence), 1 /* TEXT */))
122
+ : createCommentVNode("v-if", true),
123
+ ($data.rows.length === 0)
124
+ ? (openBlock(), createElementBlock("p", _hoisted_6, toDisplayString($options.t('nextcloud-vue', 'OpenRegister reports no rule on this record.')), 1 /* TEXT */))
125
+ : (openBlock(), createElementBlock("table", _hoisted_7, [
126
+ createElementVNode("thead", null, [
127
+ createElementVNode("tr", null, [
128
+ createElementVNode("th", _hoisted_8, toDisplayString($options.t('nextcloud-vue', 'Holder')), 1 /* TEXT */),
129
+ createElementVNode("th", _hoisted_9, toDisplayString($options.t('nextcloud-vue', 'Right')), 1 /* TEXT */),
130
+ createElementVNode("th", _hoisted_10, toDisplayString($options.t('nextcloud-vue', 'Where it comes from')), 1 /* TEXT */)
131
+ ])
132
+ ]),
133
+ createElementVNode("tbody", null, [
134
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.rows, (row, index) => {
135
+ return (openBlock(), createElementBlock("tr", {
136
+ key: `${row.holder}-${row.right}-${row.source}-${index}`,
137
+ class: "cn-object-permissions-tab__row"
138
+ }, [
139
+ createElementVNode("td", null, toDisplayString(row.holder || $options.t('nextcloud-vue', 'Not named')), 1 /* TEXT */),
140
+ createElementVNode("td", null, [
141
+ createElementVNode("span", _hoisted_11, toDisplayString(row.right), 1 /* TEXT */),
142
+ ($options.describe(row.right))
143
+ ? (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString($options.describe(row.right)), 1 /* TEXT */))
144
+ : createCommentVNode("v-if", true),
145
+ (row.declared === false)
146
+ ? (openBlock(), createElementBlock("span", _hoisted_13, toDisplayString($options.t('nextcloud-vue', 'OpenRegister does not publish this right.')), 1 /* TEXT */))
147
+ : createCommentVNode("v-if", true)
148
+ ]),
149
+ createElementVNode("td", null, [
150
+ createElementVNode("span", _hoisted_14, toDisplayString($options.sourceLabel(row.source)), 1 /* TEXT */),
151
+ ($options.roleHint(row))
152
+ ? (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString($options.roleHint(row)), 1 /* TEXT */))
153
+ : createCommentVNode("v-if", true),
154
+ ($options.inheritedHint(row))
155
+ ? (openBlock(), createElementBlock("span", _hoisted_16, toDisplayString($options.inheritedHint(row)), 1 /* TEXT */))
156
+ : createCommentVNode("v-if", true),
157
+ (row.until)
158
+ ? (openBlock(), createElementBlock("span", _hoisted_17, toDisplayString($options.endsHint(row)), 1 /* TEXT */))
159
+ : createCommentVNode("v-if", true),
160
+ ($options.areaHint(row))
161
+ ? (openBlock(), createElementBlock("span", _hoisted_18, toDisplayString($options.areaHint(row)), 1 /* TEXT */))
162
+ : createCommentVNode("v-if", true)
163
+ ])
164
+ ]))
165
+ }), 128 /* KEYED_FRAGMENT */))
166
+ ])
167
+ ])),
168
+ ($props.historyEnabled && $data.historyReadable)
169
+ ? (openBlock(), createElementBlock("section", _hoisted_19, [
170
+ createElementVNode("h4", null, toDisplayString($options.t('nextcloud-vue', 'Who held a right on a date')), 1 /* TEXT */),
171
+ createElementVNode("label", _hoisted_20, [
172
+ createElementVNode("span", null, toDisplayString($options.t('nextcloud-vue', 'Report the rights as they stood on')), 1 /* TEXT */),
173
+ withDirectives(createElementVNode("input", {
174
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => (($data.moment) = $event)),
175
+ type: "date",
176
+ max: $options.today,
177
+ onChange: _cache[1] || (_cache[1] = (...args) => ($options.loadMoment && $options.loadMoment(...args)))
178
+ }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_21), [
179
+ [vModelText, $data.moment]
180
+ ])
181
+ ]),
182
+ ($data.momentLoading)
183
+ ? (openBlock(), createElementBlock("p", _hoisted_22, toDisplayString($options.t('nextcloud-vue', 'Reading the trail for that date')), 1 /* TEXT */))
184
+ : ($data.asOf)
185
+ ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
186
+ ($data.asOf.answered === false)
187
+ ? (openBlock(), createElementBlock("p", _hoisted_23, toDisplayString($options.t('nextcloud-vue', 'The trail does not reach {date}, so nobody can be reported for it.', { date: $data.moment })), 1 /* TEXT */))
188
+ : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
189
+ createElementVNode("p", _hoisted_24, toDisplayString($options.setBySentence), 1 /* TEXT */),
190
+ ($data.asOf.changedAfterwardsBy)
191
+ ? (openBlock(), createElementBlock("p", _hoisted_25, toDisplayString($options.changedAfterwardsSentence), 1 /* TEXT */))
192
+ : createCommentVNode("v-if", true),
193
+ createElementVNode("table", _hoisted_26, [
194
+ createElementVNode("thead", null, [
195
+ createElementVNode("tr", null, [
196
+ createElementVNode("th", _hoisted_27, toDisplayString($options.t('nextcloud-vue', 'Holder')), 1 /* TEXT */),
197
+ createElementVNode("th", _hoisted_28, toDisplayString($options.t('nextcloud-vue', 'Right')), 1 /* TEXT */),
198
+ createElementVNode("th", _hoisted_29, toDisplayString($options.t('nextcloud-vue', 'Where it came from')), 1 /* TEXT */)
199
+ ])
200
+ ]),
201
+ createElementVNode("tbody", null, [
202
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.asOf.rows, (row, index) => {
203
+ return (openBlock(), createElementBlock("tr", {
204
+ key: `asof-${row.holder}-${row.right}-${index}`,
205
+ class: "cn-object-permissions-tab__row"
206
+ }, [
207
+ createElementVNode("td", null, toDisplayString(row.holder || $options.t('nextcloud-vue', 'Not named')), 1 /* TEXT */),
208
+ createElementVNode("td", null, toDisplayString(row.right), 1 /* TEXT */),
209
+ createElementVNode("td", null, [
210
+ createElementVNode("span", _hoisted_30, toDisplayString($options.sourceLabel(row.source)), 1 /* TEXT */),
211
+ ($options.roleHint(row))
212
+ ? (openBlock(), createElementBlock("span", _hoisted_31, toDisplayString($options.roleHint(row)), 1 /* TEXT */))
213
+ : createCommentVNode("v-if", true)
214
+ ])
215
+ ]))
216
+ }), 128 /* KEYED_FRAGMENT */))
217
+ ])
218
+ ])
219
+ ], 64 /* STABLE_FRAGMENT */))
220
+ ], 64 /* STABLE_FRAGMENT */))
221
+ : createCommentVNode("v-if", true)
222
+ ]))
223
+ : createCommentVNode("v-if", true),
224
+ ($data.fieldRows.length)
225
+ ? (openBlock(), createElementBlock("section", _hoisted_32, [
226
+ createElementVNode("h4", null, toDisplayString($options.t('nextcloud-vue', 'Which fields each role reads')), 1 /* TEXT */),
227
+ createElementVNode("p", _hoisted_33, toDisplayString($options.t('nextcloud-vue', 'A field missing from this record is missing because of a rule below, not because it is empty.')), 1 /* TEXT */),
228
+ createElementVNode("table", _hoisted_34, [
229
+ createElementVNode("thead", null, [
230
+ createElementVNode("tr", null, [
231
+ createElementVNode("th", _hoisted_35, toDisplayString($options.t('nextcloud-vue', 'Field')), 1 /* TEXT */),
232
+ createElementVNode("th", _hoisted_36, toDisplayString($options.t('nextcloud-vue', 'Rule')), 1 /* TEXT */),
233
+ createElementVNode("th", _hoisted_37, toDisplayString($options.t('nextcloud-vue', 'Who it affects')), 1 /* TEXT */)
234
+ ])
235
+ ]),
236
+ createElementVNode("tbody", null, [
237
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.fieldRows, (row, index) => {
238
+ return (openBlock(), createElementBlock("tr", {
239
+ key: `field-${row.field}-${row.rule}-${index}`,
240
+ class: "cn-object-permissions-tab__row"
241
+ }, [
242
+ createElementVNode("td", null, toDisplayString(row.field), 1 /* TEXT */),
243
+ createElementVNode("td", null, [
244
+ createTextVNode(toDisplayString($options.ruleLabels[row.rule]) + " ", 1 /* TEXT */),
245
+ (row.appliesToMe)
246
+ ? (openBlock(), createElementBlock("span", _hoisted_38, toDisplayString($options.t('nextcloud-vue', 'applies to you')), 1 /* TEXT */))
247
+ : createCommentVNode("v-if", true)
248
+ ]),
249
+ createElementVNode("td", null, [
250
+ createTextVNode(toDisplayString($options.sentenceFor(row)) + " ", 1 /* TEXT */),
251
+ (row.reason)
252
+ ? (openBlock(), createElementBlock("span", _hoisted_39, toDisplayString(row.reason), 1 /* TEXT */))
253
+ : createCommentVNode("v-if", true)
254
+ ])
255
+ ]))
256
+ }), 128 /* KEYED_FRAGMENT */))
257
+ ])
258
+ ])
259
+ ]))
260
+ : createCommentVNode("v-if", true)
261
+ ], 64 /* STABLE_FRAGMENT */))
262
+ ]))
263
+ }
264
+
265
+ export { render };
266
+ //# sourceMappingURL=CnObjectPermissionsTab.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnObjectPermissionsTab.vue3.js","sources":["../../../../src/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue?vue&type=template&id=7b7204e8&lang.js"],"sourcesContent":["<!--\n SPDX-FileCopyrightText: 2026 Conduction B.V.\n SPDX-License-Identifier: EUPL-1.2\n\n CnObjectPermissionsTab — who holds which right on one OpenRegister object, and\n where each grant came from. Read-only: it renders OpenRegister's answer and\n computes none of it. One row per rule; a deny is its own row beside the grant\n it removes. A failed read is named, never shown as an empty list.\n-->\n<template>\n\t<div class=\"cn-object-permissions-tab\">\n\t\t<h3>{{ title || t('nextcloud-vue', 'Who holds which right') }}</h3>\n\n\t\t<div v-if=\"loading\" class=\"cn-object-permissions-tab__loading\">\n\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t{{ t('nextcloud-vue', 'Reading the grants on this record') }}\n\t\t</div>\n\n\t\t<template v-else>\n\t\t\t<p v-if=\"reviewRefused\" class=\"cn-object-permissions-tab__unreadable\">\n\t\t\t\t{{ t('nextcloud-vue', 'You may open this record. You may not review who else can.') }}\n\t\t\t</p>\n\n\t\t\t<p v-else-if=\"unreadable.length > 0\" class=\"cn-object-permissions-tab__unreadable\">\n\t\t\t\t{{ t('nextcloud-vue', 'OpenRegister could not be asked for {sources}. This list is incomplete, not empty.', { sources: unreadable.join(', ') }) }}\n\t\t\t</p>\n\n\t\t\t<p v-if=\"enforcement\" class=\"cn-object-permissions-tab__enforcement\">\n\t\t\t\t{{ enforcementSentence }}\n\t\t\t</p>\n\n\t\t\t<p v-if=\"rows.length === 0\" class=\"cn-object-permissions-tab__empty\">\n\t\t\t\t{{ t('nextcloud-vue', 'OpenRegister reports no rule on this record.') }}\n\t\t\t</p>\n\n\t\t\t<table v-else class=\"cn-object-permissions-tab__table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Holder') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Right') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Where it comes from') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr v-for=\"(row, index) in rows\"\n\t\t\t\t\t\t:key=\"`${row.holder}-${row.right}-${row.source}-${index}`\"\n\t\t\t\t\t\tclass=\"cn-object-permissions-tab__row\">\n\t\t\t\t\t\t<td>{{ row.holder || t('nextcloud-vue', 'Not named') }}</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<span class=\"cn-object-permissions-tab__right\">{{ row.right }}</span>\n\t\t\t\t\t\t\t<span v-if=\"describe(row.right)\" class=\"cn-object-permissions-tab__hint\">{{ describe(row.right) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"row.declared === false\" class=\"cn-object-permissions-tab__hint\">{{ t('nextcloud-vue', 'OpenRegister does not publish this right.') }}</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<span class=\"cn-object-permissions-tab__source\">{{ sourceLabel(row.source) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"roleHint(row)\" class=\"cn-object-permissions-tab__hint\">{{ roleHint(row) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"inheritedHint(row)\" class=\"cn-object-permissions-tab__hint cn-object-permissions-tab__inherited\">{{ inheritedHint(row) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"row.until\" class=\"cn-object-permissions-tab__hint\">{{ endsHint(row) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"areaHint(row)\" class=\"cn-object-permissions-tab__hint\">{{ areaHint(row) }}</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\n\t\t\t<section v-if=\"historyEnabled && historyReadable\" class=\"cn-object-permissions-tab__history\">\n\t\t\t\t<h4>{{ t('nextcloud-vue', 'Who held a right on a date') }}</h4>\n\n\t\t\t\t<label class=\"cn-object-permissions-tab__moment\">\n\t\t\t\t\t<span>{{ t('nextcloud-vue', 'Report the rights as they stood on') }}</span>\n\t\t\t\t\t<input v-model=\"moment\"\n\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t:max=\"today\"\n\t\t\t\t\t\t@change=\"loadMoment\">\n\t\t\t\t</label>\n\n\t\t\t\t<p v-if=\"momentLoading\" class=\"cn-object-permissions-tab__empty\" role=\"status\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Reading the trail for that date') }}\n\t\t\t\t</p>\n\n\t\t\t\t<template v-else-if=\"asOf\">\n\t\t\t\t\t<p v-if=\"asOf.answered === false\" class=\"cn-object-permissions-tab__empty\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'The trail does not reach {date}, so nobody can be reported for it.', { date: moment }) }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<p class=\"cn-object-permissions-tab__enforcement\">\n\t\t\t\t\t\t\t{{ setBySentence }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p v-if=\"asOf.changedAfterwardsBy\" class=\"cn-object-permissions-tab__enforcement\">\n\t\t\t\t\t\t\t{{ changedAfterwardsSentence }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<table class=\"cn-object-permissions-tab__table\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Holder') }}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Right') }}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Where it came from') }}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr v-for=\"(row, index) in asOf.rows\"\n\t\t\t\t\t\t\t\t\t:key=\"`asof-${row.holder}-${row.right}-${index}`\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-object-permissions-tab__row\">\n\t\t\t\t\t\t\t\t\t<td>{{ row.holder || t('nextcloud-vue', 'Not named') }}</td>\n\t\t\t\t\t\t\t\t\t<td>{{ row.right }}</td>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<span class=\"cn-object-permissions-tab__source\">{{ sourceLabel(row.source) }}</span>\n\t\t\t\t\t\t\t\t\t\t<span v-if=\"roleHint(row)\" class=\"cn-object-permissions-tab__hint\">{{ roleHint(row) }}</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t</section>\n\n\t\t\t<section v-if=\"fieldRows.length\" class=\"cn-object-permissions-tab__fields\">\n\t\t\t\t<h4>{{ t('nextcloud-vue', 'Which fields each role reads') }}</h4>\n\t\t\t\t<p class=\"cn-object-permissions-tab__hint\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'A field missing from this record is missing because of a rule below, not because it is empty.') }}\n\t\t\t\t</p>\n\t\t\t\t<table class=\"cn-object-permissions-tab__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', 'Field') }}\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{{ t('nextcloud-vue', 'Rule') }}\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{{ t('nextcloud-vue', 'Who it affects') }}\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<tr v-for=\"(row, index) in fieldRows\"\n\t\t\t\t\t\t\t:key=\"`field-${row.field}-${row.rule}-${index}`\"\n\t\t\t\t\t\t\tclass=\"cn-object-permissions-tab__row\">\n\t\t\t\t\t\t\t<td>{{ row.field }}</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t{{ ruleLabels[row.rule] }}\n\t\t\t\t\t\t\t\t<span v-if=\"row.appliesToMe\" class=\"cn-object-permissions-tab__source\">{{ t('nextcloud-vue', 'applies to you') }}</span>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t{{ sentenceFor(row) }}\n\t\t\t\t\t\t\t\t<span v-if=\"row.reason\" class=\"cn-object-permissions-tab__hint\">{{ row.reason }}</span>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</section>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport {\n\tasOfRows,\n\tDEFAULT_API_BASE,\n\tfetchAccessHistory,\n\tfetchCallerScope,\n\tfetchDenyRules,\n\tfetchFieldRoleRules,\n\tfetchObjectGrants,\n\tfetchObjectPermissions,\n\tfetchPermissionCatalogue,\n\tfetchRoleGrants,\n\tfieldRoleRows,\n\tgrantRows,\n\troleRuleLabels,\n\troleRuleSentence,\n} from '../../utils/objectPermissions.js'\n\n/** OpenRegister's answer to a reader who may open the object and not review it. */\nconst REVIEW_REFUSED = 403\n\nexport default {\n\tname: 'CnObjectPermissionsTab',\n\tcomponents: { NcLoadingIcon },\n\n\tprops: {\n\t\t/** The object uuid (injected by CnObjectSidebar). */\n\t\tobjectId: { type: String, default: '' },\n\t\t/** Register slug or uuid (injected by CnObjectSidebar). */\n\t\tregister: { type: String, default: '' },\n\t\t/** Schema slug or uuid (injected by CnObjectSidebar). */\n\t\tschema: { type: String, default: '' },\n\t\t/** OpenRegister API root. */\n\t\tapiBase: { type: String, default: DEFAULT_API_BASE },\n\t\t/** Offer \"who held a right on a date\" when OpenRegister answers the history read. */\n\t\thistoryEnabled: { type: Boolean, default: true },\n\t\t/**\n\t\t * Where the per-role field rules are declared:\n\t\t * `{ typeField, typeSchema, declarationField? }`. The object's\n\t\t * `typeField` references a `typeSchema` object in the same register\n\t\t * whose `declarationField` (default `fieldRoleRules`) lists the rules.\n\t\t * `null` leaves the field-rules section out.\n\t\t */\n\t\tfieldRules: { type: Object, default: null },\n\t\t/** Heading; empty uses the translated default. */\n\t\ttitle: { type: String, default: '' },\n\t\t/**\n\t\t * Labels per source key, overriding the defaults (e.g. `{ group: '…' }`).\n\t\t * An unknown key renders as itself.\n\t\t */\n\t\tsourceLabels: { type: Object, default: () => ({}) },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\trows: [],\n\t\t\tcatalogue: [],\n\t\t\tenforcement: '',\n\t\t\tunreadable: [],\n\t\t\treviewRefused: false,\n\t\t\thistoryReadable: false,\n\t\t\tfieldRows: [],\n\t\t\tmoment: '',\n\t\t\tmomentLoading: false,\n\t\t\tasOf: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\ttarget() {\n\t\t\treturn { register: this.register, schema: this.schema, apiBase: this.apiBase }\n\t\t},\n\n\t\truleLabels() {\n\t\t\treturn roleRuleLabels()\n\t\t},\n\n\t\t/** Today, so nobody asks the trail about a date that has not happened. */\n\t\ttoday() {\n\t\t\treturn new Date().toISOString().slice(0, 10)\n\t\t},\n\n\t\tsetBySentence() {\n\t\t\tif (!this.asOf?.setBy) {\n\t\t\t\treturn t('nextcloud-vue', 'These rights stood on that date. Nobody is named as setting them.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{who} set these rights.', { who: this.asOf.setBy })\n\t\t},\n\n\t\tchangedAfterwardsSentence() {\n\t\t\tconst change = this.asOf?.changedAfterwardsBy\n\t\t\tif (!change) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{who} changed them afterwards, on {date}.', {\n\t\t\t\twho: change.by || t('nextcloud-vue', 'Somebody'),\n\t\t\t\tdate: change.at || t('nextcloud-vue', 'a date the trail does not give'),\n\t\t\t})\n\t\t},\n\n\t\tenforcementSentence() {\n\t\t\tif (this.enforcement === 'enforcing') {\n\t\t\t\treturn t('nextcloud-vue', 'A refusal below is in force now.')\n\t\t\t}\n\t\t\tif (this.enforcement === 'off') {\n\t\t\t\treturn t('nextcloud-vue', 'Refusals are switched off, so no rule below removes a right.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Refusals are staged: a rule below is recorded, and removes a right once it is switched on.')\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId() {\n\t\t\tthis.asOf = null\n\t\t\tthis.moment = ''\n\t\t\tthis.load()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.load()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tsentenceFor(row) {\n\t\t\treturn roleRuleSentence(row)\n\t\t},\n\n\t\t/**\n\t\t * Ask OpenRegister once and render what came back.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync load() {\n\t\t\tthis.loading = true\n\t\t\tconst permissions = this.objectId\n\t\t\t\t? await fetchObjectPermissions(this.target, this.objectId)\n\t\t\t\t: { status: 0, set: null }\n\n\t\t\t// A 403 is OpenRegister answering \"not you\", not a failed read.\n\t\t\tthis.reviewRefused = permissions.status === REVIEW_REFUSED\n\t\t\tthis.historyReadable = permissions.set !== null\n\t\t\tconst fallback = permissions.set === null\n\n\t\t\tconst [catalogue, objectGrants, roleGrants, callerScope, denyRules, fieldRules] = await Promise.all([\n\t\t\t\tfetchPermissionCatalogue(this.target),\n\t\t\t\tfallback && this.objectId ? fetchObjectGrants(this.target, this.objectId) : null,\n\t\t\t\tfallback ? fetchRoleGrants(this.target) : null,\n\t\t\t\tfetchCallerScope(this.target),\n\t\t\t\tfallback ? fetchDenyRules(this.target) : null,\n\t\t\t\tthis.fieldRules ? fetchFieldRoleRules(this.target, this.objectId, this.fieldRules) : { decided: null, declared: null },\n\t\t\t])\n\n\t\t\tthis.fieldRows = fieldRoleRows(fieldRules.declared, fieldRules.decided)\n\n\t\t\t// Each failed read is named: an auditor reading a short list has to\n\t\t\t// know which source is missing from it.\n\t\t\tconst missing = []\n\t\t\tif (catalogue === null) {\n\t\t\t\tmissing.push(t('nextcloud-vue', 'the rights it publishes'))\n\t\t\t}\n\t\t\tif (permissions.set === null) {\n\t\t\t\tif (objectGrants === null) {\n\t\t\t\t\tmissing.push(t('nextcloud-vue', 'the shares on this record'))\n\t\t\t\t}\n\t\t\t\tif (roleGrants === null) {\n\t\t\t\t\tmissing.push(t('nextcloud-vue', 'the roles'))\n\t\t\t\t}\n\t\t\t\tif (denyRules === null) {\n\t\t\t\t\tmissing.push(t('nextcloud-vue', 'the refusals'))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (callerScope === null) {\n\t\t\t\tmissing.push(t('nextcloud-vue', 'your own rights'))\n\t\t\t}\n\n\t\t\tthis.catalogue = catalogue?.permissions || []\n\t\t\tthis.enforcement = permissions.set?.denyEnforcement || catalogue?.denyEnforcement || denyRules?.denyEnforcement || ''\n\t\t\tthis.unreadable = this.reviewRefused ? [] : missing\n\t\t\tthis.rows = grantRows({ objectPermissions: permissions.set, objectGrants, roleGrants, callerScope, denyRules })\n\t\t\tthis.loading = false\n\t\t},\n\n\t\t/**\n\t\t * Ask the trail who held a right at the end of the picked day.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadMoment() {\n\t\t\tif (this.moment === '' || this.objectId === '') {\n\t\t\t\tthis.asOf = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.momentLoading = true\n\t\t\t// End of that day, so a grant written during it counts as standing on it.\n\t\t\tconst { history } = await fetchAccessHistory(this.target, this.objectId, `${this.moment}T23:59:59`)\n\t\t\tthis.asOf = asOfRows(history)\n\t\t\tthis.momentLoading = false\n\t\t},\n\n\t\troleHint(row) {\n\t\t\tif (!row?.role) {\n\t\t\t\treturn row?.detail || ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Through the role {role}', { role: row.role })\n\t\t},\n\n\t\t/**\n\t\t * Which record handed this rule down, named inside a sentence, never bare.\n\t\t *\n\t\t * @param {object} row One row.\n\t\t * @return {string} The sentence, or ''.\n\t\t */\n\t\tinheritedHint(row) {\n\t\t\tif (!row?.inheritedFrom) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Granted on record {record}, which this one hangs under', { record: row.inheritedFrom })\n\t\t},\n\n\t\t/**\n\t\t * The end as OpenRegister wrote it: printed, never judged against a clock.\n\t\t *\n\t\t * @param {object} row One row.\n\t\t * @return {string} The sentence.\n\t\t */\n\t\tendsHint(row) {\n\t\t\treturn t('nextcloud-vue', 'Written to end on {date}', { date: row.until })\n\t\t},\n\n\t\tareaHint(row) {\n\t\t\tconst named = [...(row?.scopedTo?.registers || []), ...(row?.scopedTo?.schemas || [])]\n\t\t\t\t.filter((name) => typeof name === 'string' && name !== '')\n\t\t\tif (named.length === 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Only in {areas}', { areas: named.join(', ') })\n\t\t},\n\n\t\tdescribe(right) {\n\t\t\tconst entry = this.catalogue.find((permission) => permission?.action === right)\n\t\t\treturn entry?.description || ''\n\t\t},\n\n\t\tsourceLabel(source) {\n\t\t\tif (this.sourceLabels && this.sourceLabels[source]) {\n\t\t\t\treturn this.sourceLabels[source]\n\t\t\t}\n\t\t\tconst labels = {\n\t\t\t\tshare: t('nextcloud-vue', 'A share on this record'),\n\t\t\t\trole: t('nextcloud-vue', 'A role'),\n\t\t\t\tgroup: t('nextcloud-vue', 'A grant on a group of types'),\n\t\t\t\tobject: t('nextcloud-vue', 'A rule on this record'),\n\t\t\t\tschema: t('nextcloud-vue', 'A rule on every record of this type'),\n\t\t\t\tregister: t('nextcloud-vue', 'A rule on the register'),\n\t\t\t\tdeny: t('nextcloud-vue', 'A rule that refuses'),\n\t\t\t\t'staged-deny': t('nextcloud-vue', 'A rule that will refuse'),\n\t\t\t\t'default-open': t('nextcloud-vue', 'No rule, so it is open'),\n\t\t\t\tnone: t('nextcloud-vue', 'No rule grants it'),\n\t\t\t\tinherited: t('nextcloud-vue', 'A grant on a record this one hangs under'),\n\t\t\t}\n\t\t\treturn labels[source] || source\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-permissions-tab {\n\tpadding: 12px;\n}\n\n.cn-object-permissions-tab__loading {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-object-permissions-tab__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n}\n\n.cn-object-permissions-tab__table th,\n.cn-object-permissions-tab__table td {\n\ttext-align: start;\n\tpadding: 4px 8px;\n\tborder-bottom: 1px solid var(--color-border);\n\tvertical-align: top;\n}\n\n.cn-object-permissions-tab__right,\n.cn-object-permissions-tab__source {\n\tdisplay: block;\n}\n\n.cn-object-permissions-tab__hint {\n\tdisplay: block;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n}\n\n.cn-object-permissions-tab__unreadable {\n\tcolor: var(--color-warning-text, var(--color-main-text));\n}\n\n.cn-object-permissions-tab__enforcement,\n.cn-object-permissions-tab__empty {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-object-permissions-tab__history,\n.cn-object-permissions-tab__fields {\n\tmargin-block-start: 24px;\n\tborder-top: 1px solid var(--color-border);\n\tpadding-block-start: 12px;\n}\n\n.cn-object-permissions-tab__moment {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n\tmargin-block-end: 8px;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","_createTextVNode","_Fragment","_renderList"],"mappings":"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"}
@@ -2,7 +2,7 @@ import script from './CnObjectSidebar.vue2.js';
2
2
  import { render } from './CnObjectSidebar.vue3.js';
3
3
 
4
4
  script.render = render;
5
- script.__scopeId = "data-v-09402703";
5
+ script.__scopeId = "data-v-4cf1a7bc";
6
6
  const __sfc_main = script;
7
7
 
8
8
  export { __sfc_main as default };
@@ -6,7 +6,7 @@ import CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue
6
6
  import History from 'vue-material-design-icons/History.vue';
7
7
  import Paperclip from 'vue-material-design-icons/Paperclip.vue';
8
8
  import TagOutline from 'vue-material-design-icons/TagOutline.vue';
9
- import __sfc_main$9 from '../CnWidgetObjectTable/CnWidgetObjectTable.vue.js';
9
+ import __sfc_main$a from '../CnWidgetObjectTable/CnWidgetObjectTable.vue.js';
10
10
  import __sfc_main$4 from './CnAuditTrailTab.vue.js';
11
11
  import __sfc_main from './CnFilesTab.vue.js';
12
12
  import __sfc_main$1 from './CnNotesTab.vue.js';
@@ -16,16 +16,20 @@ import { useIntegrationRegistry } from '../../composables/useIntegrationRegistry
16
16
  import { useObjectSubscription } from '../../composables/useObjectSubscription.js';
17
17
  import { pickDeclaredProps } from '../../utils/declaredProps.js';
18
18
  import { labelLang } from '../../utils/manifestTranslate.js';
19
+ import __sfc_main$7 from '../CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js';
19
20
  import __sfc_main$5 from '../CnIcon/CnIcon.vue.js';
20
21
  import __sfc_main$6 from '../CnLeafMountHost/CnLeafMountHost.vue.js';
21
- import __sfc_main$7 from '../CnObjectDataWidget/CnObjectDataWidget.vue.js';
22
- import __sfc_main$8 from '../CnObjectMetadataWidget/CnObjectMetadataWidget.vue.js';
22
+ import __sfc_main$8 from '../CnObjectDataWidget/CnObjectDataWidget.vue.js';
23
+ import __sfc_main$9 from '../CnObjectMetadataWidget/CnObjectMetadataWidget.vue.js';
24
+ import __sfc_main$b from '../CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js';
23
25
 
24
26
  /**
25
27
  * Built-in widget registry used by the open-enum `tabs` prop.
26
28
  * - `data` → CnObjectDataWidget (schema-driven editable grid)
27
29
  * - `metadata` → CnObjectMetadataWidget (read-only system metadata)
28
30
  * - `audit` → CnAuditTrailTab (the object's change log / audit trail)
31
+ * - `object-permissions` → CnObjectPermissionsTab (read-only: who holds which
32
+ * right on the object, where each grant came from, and on a past date)
29
33
  * - `object-table` → CnWidgetObjectTable (a declarative list scoped to the
30
34
  * parent object — the full source / endpointSource / columns / actions
31
35
  * contract). Resolves `@objectId` / `@object.<field>` filter tokens against
@@ -37,8 +41,10 @@ import __sfc_main$8 from '../CnObjectMetadataWidget/CnObjectMetadataWidget.vue.j
37
41
  * customComponents registry (prop, then injected `cnCustomComponents`).
38
42
  */
39
43
  const BUILTIN_WIDGETS = {
40
- data: __sfc_main$7,
41
- metadata: __sfc_main$8,
44
+ // The hermiq AI features a record's type switches on (CnAiFeaturesWidget).
45
+ 'ai-features': __sfc_main$7,
46
+ data: __sfc_main$8,
47
+ metadata: __sfc_main$9,
42
48
  audit: __sfc_main$4,
43
49
  // Alias matching the dashboard/detail-page widget key `audit-trail` so a
44
50
  // manifest can declare a sidebar tab with `widgets: [{ type: 'audit-trail' }]`
@@ -48,7 +54,8 @@ const BUILTIN_WIDGETS = {
48
54
  // The declarative list widget (same key as the detail-page body widget), so
49
55
  // a sidebar tab can render a related-object list scoped to the parent
50
56
  // object via `@objectId` / `@object.<field>` tokens in its `source.filter`.
51
- 'object-table': __sfc_main$9,
57
+ 'object-table': __sfc_main$a,
58
+ 'object-permissions': __sfc_main$b,
52
59
  };
53
60
 
54
61
  /**
@@ -794,7 +801,7 @@ var script = {
794
801
  return reg[type]
795
802
  }
796
803
  // eslint-disable-next-line no-console
797
- console.warn(`[CnObjectSidebar] Unknown widget type "${type}" — not in built-ins (data, metadata, audit, audit-trail, object-table), the registry or customComponents.`);
804
+ console.warn(`[CnObjectSidebar] Unknown widget type "${type}" — not in built-ins (data, metadata, audit, audit-trail, object-table, object-permissions), the registry or customComponents.`);
798
805
  return null
799
806
  },
800
807