@anzusystems/common-admin 2.0.0-rc.10 → 2.0.0-rc.12

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 (465) hide show
  1. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
  2. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  3. package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
  4. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
  6. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
  8. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
  9. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
  11. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
  13. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
  15. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
  17. package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
  18. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
  20. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
  22. package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
  23. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
  25. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
  27. package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
  28. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/domains/auth/components/Acl.js.map +1 -1
  30. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  31. package/dist/domains/cached/components/ACachedChip.js.map +1 -1
  32. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
  34. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/domains/collab/components/ACollabCountdown.js.map +1 -1
  36. package/dist/domains/collab/components/ACollabCountdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
  38. package/dist/domains/collab/components/ACollabManagement.js.map +1 -1
  39. package/dist/domains/collab/components/ACollabManagement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
  41. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
  43. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
  45. package/dist/domains/dam/assetDetail/components/AColorBox.js.map +1 -1
  46. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
  47. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
  49. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
  51. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/domains/dam/assetDetail/components/AssetDetailDialogLoader.js.map +1 -1
  53. package/dist/domains/dam/assetDetail/components/AssetDetailDialogSidebar.js.map +1 -1
  54. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsTeleportTarget.js.map +1 -1
  55. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.js.map +1 -1
  56. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
  58. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
  60. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
  62. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.js.map +1 -1
  64. package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  65. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
  66. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/domains/dam/assetDetail/components/AssetFileRotate.js.map +1 -1
  68. package/dist/domains/dam/assetDetail/components/AssetFileRotate.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
  70. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
  72. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
  74. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
  76. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.js.map +1 -1
  78. package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.vue_vue_type_script_setup_true_lang.js.map +1 -1
  79. package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
  80. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  81. package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
  82. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  83. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
  84. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
  86. package/dist/domains/dam/assetSelect/components/AssetImagePreview.js.map +1 -1
  87. package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/domains/dam/assetSelect/components/AssetSelectFilter.js.map +1 -1
  89. package/dist/domains/dam/assetSelect/components/AssetSelectFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.js.map +1 -1
  91. package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  92. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
  93. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  94. package/dist/domains/dam/assetSelect/components/AssetSelectListTable.js.map +1 -1
  95. package/dist/domains/dam/assetSelect/components/AssetSelectListTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  96. package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.js.map +1 -1
  97. package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
  99. package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.js.map +1 -1
  100. package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/domains/dam/assetSelect/components/FilterPodcastRemoteAutocomplete.js.map +1 -1
  102. package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
  103. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
  105. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
  107. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  108. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
  109. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
  111. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  112. package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
  113. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  114. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
  116. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  117. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.js.map +1 -1
  118. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
  120. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
  122. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  123. package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
  124. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  125. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
  126. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/domains/dam/imageWidget/components/AImageWidgetMultipleSimple.js.map +1 -1
  128. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.js.map +1 -1
  129. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.js.map +1 -1
  131. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
  133. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  134. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
  135. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
  137. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
  139. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
  141. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  142. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
  143. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  144. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
  145. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.js.map +1 -1
  147. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  148. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
  149. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
  150. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  151. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
  152. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
  154. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  155. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
  156. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  157. package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.js.map +1 -1
  158. package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
  160. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
  162. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  163. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
  164. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
  165. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
  167. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
  169. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
  171. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  172. package/dist/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.js.map +1 -1
  173. package/dist/domains/dam/user/components/DamAssetLicenceGroupRemoteAutocomplete.js.map +1 -1
  174. package/dist/domains/dam/user/components/DamAssetLicenceRemoteAutocomplete.js.map +1 -1
  175. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
  176. package/dist/domains/dam/user/components/DamExtSystemRemoteAutocomplete.js.map +1 -1
  177. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
  178. package/dist/domains/dam/user/components/DamUserFilterRemoteAutocomplete.js.map +1 -1
  179. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
  180. package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.js.map +1 -1
  181. package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  182. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
  183. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  184. package/dist/domains/filters/bookmarks/components/FilterBookmarks.js.map +1 -1
  185. package/dist/domains/filters/bookmarks/components/FilterBookmarks.vue_vue_type_script_setup_true_lang.js.map +1 -1
  186. package/dist/domains/filters/components/AFilterAdvancedButton.js.map +1 -1
  187. package/dist/domains/filters/components/AFilterBooleanSelect.js.map +1 -1
  188. package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
  189. package/dist/domains/filters/components/AFilterEmpty.js.map +1 -1
  190. package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
  191. package/dist/domains/filters/components/AFilterResetButton.js.map +1 -1
  192. package/dist/domains/filters/components/AFilterString.js.map +1 -1
  193. package/dist/domains/filters/components/AFilterString.vue.d.ts +3 -0
  194. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js +8 -2
  195. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
  196. package/dist/domains/filters/components/AFilterSubmitButton.js.map +1 -1
  197. package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
  198. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
  199. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
  200. package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
  201. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  202. package/dist/domains/filters/components/AFilterWrapperSidebar.js.map +1 -1
  203. package/dist/domains/filters/components/FilterDetailItem.js.map +1 -1
  204. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  205. package/dist/domains/filters/datatable/components/ADatatableConfigButton.js.map +1 -1
  206. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  207. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  208. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  209. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  210. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  212. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  213. package/dist/domains/form/components/AFormRemoteCheckbox.js.map +1 -1
  214. package/dist/domains/form/components/AFormRemoteCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/domains/form/components/AFormRemoteSwitch.js.map +1 -1
  216. package/dist/domains/form/components/AFormRemoteSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/domains/form/components/AFormSwitch.js.map +1 -1
  218. package/dist/domains/form/components/AFormSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  220. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  221. package/dist/domains/form/components/AFormTextarea.js.map +1 -1
  222. package/dist/domains/form/components/AFormTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/domains/form/components/AFormValueObjectOptionsSelect.js.map +1 -1
  224. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  225. package/dist/domains/form/components/ASystemEntityScope.js.map +1 -1
  226. package/dist/domains/job/components/AJobBaseCreateForm.js.map +1 -1
  227. package/dist/domains/job/components/AJobBaseCreateForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/domains/job/components/AJobDetailCommon.js.map +1 -1
  229. package/dist/domains/job/components/AJobPriorityChip.js.map +1 -1
  230. package/dist/domains/job/components/AJobStatusChip.js.map +1 -1
  231. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  232. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  233. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  234. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  235. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  236. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  237. package/dist/domains/listEditor/components/internal/LeChangeParentDialog.js.map +1 -1
  238. package/dist/domains/listEditor/components/internal/LeChangeParentDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  239. package/dist/domains/listEditor/components/internal/LeDeleteDialog.js.map +1 -1
  240. package/dist/domains/listEditor/components/internal/LeDeleteDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/domains/listEditor/components/internal/LeDragHandle.js.map +1 -1
  242. package/dist/domains/listEditor/components/internal/LeEmptyState.js.map +1 -1
  243. package/dist/domains/listEditor/components/internal/LeEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.js.map +1 -1
  245. package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  246. package/dist/domains/listEditor/components/internal/LeNestedRow.js.map +1 -1
  247. package/dist/domains/listEditor/components/internal/LeNestedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/domains/listEditor/components/internal/LeStatus.js.map +1 -1
  249. package/dist/domains/listEditor/components/internal/LeStatus.vue_vue_type_script_setup_true_lang.js.map +1 -1
  250. package/dist/domains/listEditor/components/internal/LeUnsavedLabel.js.map +1 -1
  251. package/dist/domains/listEditor/components/internal/LeUnsavedLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  253. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  254. package/dist/domains/log/components/ALogDetail.js.map +1 -1
  255. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  256. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  257. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  258. package/dist/domains/log/components/ALogLevelChip.js.map +1 -1
  259. package/dist/domains/log/components/ALogLevelChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  260. package/dist/domains/log/components/ALogListView.js.map +1 -1
  261. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  262. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  263. package/dist/domains/permission/components/APermissionGrantEditor.js.map +1 -1
  264. package/dist/domains/permission/components/APermissionValueChip.js.map +1 -1
  265. package/dist/domains/permission/components/APermissionValueChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  266. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  267. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  269. package/dist/domains/permission/group/components/APermissionGroupFilter.js.map +1 -1
  270. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  271. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/domains/permission/group/components/APermissionGroupRemoteAutocomplete.js.map +1 -1
  273. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  274. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  276. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  277. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  278. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.js.map +1 -1
  279. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  280. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.js.map +1 -1
  281. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  283. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/domains/system/appShell/components/AActionbar.js.map +1 -1
  285. package/dist/domains/system/appShell/components/AActionbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  286. package/dist/domains/system/appShell/components/AActionbarTarget.js.map +1 -1
  287. package/dist/domains/system/appShell/components/ALayoutLoader.js.map +1 -1
  288. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  289. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  290. package/dist/domains/system/components/AAdminSwitcher.js.map +1 -1
  291. package/dist/domains/system/components/AAdminSwitcher.vue_vue_type_script_setup_true_lang.js.map +1 -1
  292. package/dist/domains/system/components/AAlerts.js.map +1 -1
  293. package/dist/domains/system/components/ALanguageSelect.js.map +1 -1
  294. package/dist/domains/system/components/AThemeSelect.js.map +1 -1
  295. package/dist/domains/system/components/AThemeSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  296. package/dist/domains/system/flags/components/FlagCountry.js.map +1 -1
  297. package/dist/domains/system/flags/components/FlagEn.js.map +1 -1
  298. package/dist/domains/system/flags/components/FlagSk.js.map +1 -1
  299. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  300. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  301. package/dist/domains/system/systemBar/components/ASystemBarNewVersion.js.map +1 -1
  302. package/dist/domains/system/systemBar/components/ASystemBarNewVersion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  303. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  304. package/dist/domains/ui/buttons/action/components/AActionCreateButton.js.map +1 -1
  305. package/dist/domains/ui/buttons/action/components/AActionCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  306. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  307. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  308. package/dist/domains/ui/buttons/action/components/AActionEditButton.js.map +1 -1
  309. package/dist/domains/ui/buttons/action/components/AActionEditButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  310. package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.js.map +1 -1
  311. package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  312. package/dist/domains/ui/buttons/action/components/AActionSaveButton.js.map +1 -1
  313. package/dist/domains/ui/buttons/action/components/AActionSaveButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  314. package/dist/domains/ui/buttons/components/ABtnSplit.js.map +1 -1
  315. package/dist/domains/ui/buttons/components/ABtnSplit.vue_vue_type_script_setup_true_lang.js.map +1 -1
  316. package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.js.map +1 -1
  317. package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  318. package/dist/domains/ui/buttons/table/components/ATableDetailButton.js.map +1 -1
  319. package/dist/domains/ui/buttons/table/components/ATableDetailButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  320. package/dist/domains/ui/buttons/table/components/ATableEditButton.js.map +1 -1
  321. package/dist/domains/ui/buttons/table/components/ATableEditButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  322. package/dist/domains/ui/components/AAnzuUserAvatar.js.map +1 -1
  323. package/dist/domains/ui/components/AAnzuUserAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  324. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  325. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  326. package/dist/domains/ui/components/ABooleanSelect.js.map +1 -1
  327. package/dist/domains/ui/components/ABooleanValue.js.map +1 -1
  328. package/dist/domains/ui/components/ACard.js.map +1 -1
  329. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  330. package/dist/domains/ui/components/AChipNoLink.js.map +1 -1
  331. package/dist/domains/ui/components/ACopyText.js.map +1 -1
  332. package/dist/domains/ui/components/ACopyText.vue_vue_type_script_setup_true_lang.js.map +1 -1
  333. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  334. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  335. package/dist/domains/ui/components/ACurrentUserDropdown.js.map +1 -1
  336. package/dist/domains/ui/components/ACurrentUserDropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  337. package/dist/domains/ui/components/ADialogToolbar.js.map +1 -1
  338. package/dist/domains/ui/components/AIconGroup.js.map +1 -1
  339. package/dist/domains/ui/components/AProgress.js.map +1 -1
  340. package/dist/domains/ui/components/ARow.js.map +1 -1
  341. package/dist/domains/ui/components/ARow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  342. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  343. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  344. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  345. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  346. package/dist/domains/ui/datetime/components/ADatetime.js.map +1 -1
  347. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  348. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  349. package/dist/domains/ui/datetime/components/TimePicker.js.map +1 -1
  350. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  351. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  352. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  353. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  354. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  355. package/dist/domains/ui/view/components/AGenericView.js.map +1 -1
  356. package/dist/domains/ui/view/components/AGenericView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  357. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  358. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  359. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  360. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  361. package/dist/domains/ui/view/components/AUnauthorizedView.js.map +1 -1
  362. package/dist/domains/ui/view/components/AUnauthorizedView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  363. package/dist/domains/unsavedGuard/components/AUnsavedConfirmDialog.js.map +1 -1
  364. package/dist/locales/cs/common/alert.js.map +1 -1
  365. package/dist/locales/cs/common/anzuUser.js.map +1 -1
  366. package/dist/locales/cs/common/assetSelect.js.map +1 -1
  367. package/dist/locales/cs/common/button.js.map +1 -1
  368. package/dist/locales/cs/common/collab.js.map +1 -1
  369. package/dist/locales/cs/common/confirmDialog.js.map +1 -1
  370. package/dist/locales/cs/common/customForm.js.map +1 -1
  371. package/dist/locales/cs/common/customFormElement.js.map +1 -1
  372. package/dist/locales/cs/common/damImage.js.map +1 -1
  373. package/dist/locales/cs/common/dayOfWeek.js.map +1 -1
  374. package/dist/locales/cs/common/filter.js.map +1 -1
  375. package/dist/locales/cs/common/job.js.map +1 -1
  376. package/dist/locales/cs/common/linkDto.js.map +1 -1
  377. package/dist/locales/cs/common/listItemDto.js.map +1 -1
  378. package/dist/locales/cs/common/log.js.map +1 -1
  379. package/dist/locales/cs/common/model.js.map +1 -1
  380. package/dist/locales/cs/common/permission.js.map +1 -1
  381. package/dist/locales/cs/common/permissionEditor.js.map +1 -1
  382. package/dist/locales/cs/common/permissionGroup.js.map +1 -1
  383. package/dist/locales/cs/common/routeSettings.js.map +1 -1
  384. package/dist/locales/cs/common/sortable.js.map +1 -1
  385. package/dist/locales/cs/common/subjectSelect.js.map +1 -1
  386. package/dist/locales/cs/common/system.js.map +1 -1
  387. package/dist/locales/cs/common/time.js.map +1 -1
  388. package/dist/locales/cs/common/userSystem.js.map +1 -1
  389. package/dist/locales/cs/error/apiDependencyExists.js.map +1 -1
  390. package/dist/locales/cs/error/apiForbiddenOperation.js.map +1 -1
  391. package/dist/locales/cs/error/apiTimedOut.js.map +1 -1
  392. package/dist/locales/cs/error/apiValidation.js.map +1 -1
  393. package/dist/locales/cs/error/jsValidation.js.map +1 -1
  394. package/dist/locales/cs/vuetify.js.map +1 -1
  395. package/dist/locales/en/common/alert.js.map +1 -1
  396. package/dist/locales/en/common/anzuUser.js.map +1 -1
  397. package/dist/locales/en/common/assetSelect.js.map +1 -1
  398. package/dist/locales/en/common/button.js.map +1 -1
  399. package/dist/locales/en/common/collab.js.map +1 -1
  400. package/dist/locales/en/common/confirmDialog.js.map +1 -1
  401. package/dist/locales/en/common/customForm.js.map +1 -1
  402. package/dist/locales/en/common/customFormElement.js.map +1 -1
  403. package/dist/locales/en/common/damImage.js.map +1 -1
  404. package/dist/locales/en/common/dayOfWeek.js.map +1 -1
  405. package/dist/locales/en/common/filter.js.map +1 -1
  406. package/dist/locales/en/common/job.js.map +1 -1
  407. package/dist/locales/en/common/linkDto.js.map +1 -1
  408. package/dist/locales/en/common/listItemDto.js.map +1 -1
  409. package/dist/locales/en/common/log.js.map +1 -1
  410. package/dist/locales/en/common/model.js.map +1 -1
  411. package/dist/locales/en/common/permission.js.map +1 -1
  412. package/dist/locales/en/common/permissionEditor.js.map +1 -1
  413. package/dist/locales/en/common/permissionGroup.js.map +1 -1
  414. package/dist/locales/en/common/routeSettings.js.map +1 -1
  415. package/dist/locales/en/common/sortable.js.map +1 -1
  416. package/dist/locales/en/common/subjectSelect.js.map +1 -1
  417. package/dist/locales/en/common/system.js.map +1 -1
  418. package/dist/locales/en/common/time.js.map +1 -1
  419. package/dist/locales/en/common/userSystem.js.map +1 -1
  420. package/dist/locales/en/error/apiDependencyExists.js.map +1 -1
  421. package/dist/locales/en/error/apiForbiddenOperation.js.map +1 -1
  422. package/dist/locales/en/error/apiTimedOut.js.map +1 -1
  423. package/dist/locales/en/error/apiValidation.js.map +1 -1
  424. package/dist/locales/en/error/jsValidation.js.map +1 -1
  425. package/dist/locales/en/vuetify.js.map +1 -1
  426. package/dist/locales/sk/common/alert.js.map +1 -1
  427. package/dist/locales/sk/common/anzuUser.js.map +1 -1
  428. package/dist/locales/sk/common/assetSelect.js.map +1 -1
  429. package/dist/locales/sk/common/button.js.map +1 -1
  430. package/dist/locales/sk/common/collab.js.map +1 -1
  431. package/dist/locales/sk/common/confirmDialog.js.map +1 -1
  432. package/dist/locales/sk/common/customForm.js.map +1 -1
  433. package/dist/locales/sk/common/customFormElement.js.map +1 -1
  434. package/dist/locales/sk/common/damImage.js.map +1 -1
  435. package/dist/locales/sk/common/dayOfWeek.js.map +1 -1
  436. package/dist/locales/sk/common/filter.js.map +1 -1
  437. package/dist/locales/sk/common/job.js.map +1 -1
  438. package/dist/locales/sk/common/linkDto.js.map +1 -1
  439. package/dist/locales/sk/common/listItemDto.js.map +1 -1
  440. package/dist/locales/sk/common/log.js.map +1 -1
  441. package/dist/locales/sk/common/model.js.map +1 -1
  442. package/dist/locales/sk/common/permission.js.map +1 -1
  443. package/dist/locales/sk/common/permissionEditor.js.map +1 -1
  444. package/dist/locales/sk/common/permissionGroup.js.map +1 -1
  445. package/dist/locales/sk/common/routeSettings.js.map +1 -1
  446. package/dist/locales/sk/common/sortable.js.map +1 -1
  447. package/dist/locales/sk/common/subjectSelect.js.map +1 -1
  448. package/dist/locales/sk/common/system.js.map +1 -1
  449. package/dist/locales/sk/common/time.js.map +1 -1
  450. package/dist/locales/sk/common/userSystem.js.map +1 -1
  451. package/dist/locales/sk/error/apiDependencyExists.js.map +1 -1
  452. package/dist/locales/sk/error/apiForbiddenOperation.js.map +1 -1
  453. package/dist/locales/sk/error/apiTimedOut.js.map +1 -1
  454. package/dist/locales/sk/error/apiValidation.js.map +1 -1
  455. package/dist/locales/sk/error/jsValidation.js.map +1 -1
  456. package/dist/locales/sk/vuetify.js.map +1 -1
  457. package/package.json +15 -15
  458. package/src/e2e/env.d.mts +46 -0
  459. package/src/e2e/env.mjs +78 -0
  460. package/src/e2e/index.d.mts +3 -0
  461. package/src/e2e/index.mjs +2 -0
  462. package/src/e2e/routeWalk.mjs +2 -1
  463. package/src/e2e/routeWalkConfig.d.mts +16 -0
  464. package/src/e2e/routeWalkConfig.mjs +52 -0
  465. package/src/e2e/types.d.mts +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AUserSystemOverview.vue_vue_type_script_setup_true_lang.js","names":["_resolveComponent","_openBlock","_createElementBlock","_createVNode","_component_VCard","_withCtx","_component_VCardText","_createElementVNode","_component_VTextField","_unref","_withKeys","_withModifiers","_createTextVNode","_toDisplayString","_createCommentVNode","_createBlock","_component_VAlert","_Fragment","_renderList","AUserSystemStatusChip","_component_VChip","_component_VSpacer","_component_VBtn","AUserManageButton","AUserCreateInSystemButton","AUserBulkActionDialog","AUserMetadataRepairDialog","_component_VDialog","ADialogToolbar","_component_VSelect","AUserMetadataForm","_component_VCardActions","ADialogToolbar_default","AUserBulkActionDialog_default","AUserCreateInSystemButton_default","AUserManageButton_default","AUserMetadataForm_default","AUserMetadataRepairDialog_default","AUserSystemStatusChip_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","useAlerts","store","useUserCrossSystemStore","useAnzuUserFactory","writes","useUserCrossSystemWrites","v$","useUserCrossSystemSearch","term","ref","rowBusy","runSearch","value","search","records","computed","map","descriptor","user","differences","findMetadataDifferences","foundAnywhere","anyFoundWritable","item","descriptorMayWrite","searchDone","CrossSystemPhase","searchedByEmail","isEmailTerm","canOfferCreateAnywhere","unresolvedSystems","blockedByConflict","labelFor","manageTargetFor","isUndefined","isNull","extraStateFor","EXTRA_STATE_COLOR","reportOutcome","outcome","BulkOutcome","showError","label","t","detailFor","fields","withRowBusy","system","run","next","toggleOne","id","result","enabled","refreshSystem","createFromSource","sourceSystem","source","sourceEnabled","body","createAnzuUser","metadata","cloneDeep","prefillSource","first","bulkOpen","bulkAction","BulkAction","repairOpen","openBulk","action","writableSystems","systems","runBulk","requested","runRepair","payload","seenBefore","createAnywhereOpen","createAnywhereSystem","createAnywhereUser","createAnywhereChecking","createAnywhereConflict","createAnywhereError","left","openCreateAnywhere","confirmCreateAnywhere","createAnywhereRequiredMetadata","createAnywhereNote","createSystemOptions","onBeforeUnmount","cancel","_component_ABtnPrimary","resolveComponent","_component_ABtnTertiary","openBlock","createElementBlock","createVNode","VCard","withCtx","VCardText","createElementVNode","VTextField","_cache","$event","unref","withKeys","withModifiers","createTextVNode","toDisplayString","createCommentVNode","createBlock","VAlert","Fragment","renderList","VChip","VSpacer","isActionable","VBtn","difference","systemValue","VDialog","VSelect","VCardActions"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemOverview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport AUserBulkActionDialog from '@/domains/anzuUser/components/AUserBulkActionDialog.vue'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserMetadataRepairDialog from '@/domains/anzuUser/components/AUserMetadataRepairDialog.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport {\n BulkAction,\n BulkOutcome,\n CrossSystemPhase,\n useUserCrossSystemStore,\n type BulkActionType,\n type BulkOutcomeType,\n} from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { isEmailTerm, useUserCrossSystemSearch } from '@/domains/anzuUser/composables/userCrossSystemSearch'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport { findMetadataDifferences, type UserMetadataField } from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isActionable } from '@/domains/anzuUser/utils/userSystemState'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n /** Order matters twice: the order of the rows, and the priority when pre-filling. */\n descriptors: AnyUserSystemDescriptor[]\n refreshHook?: UserSystemRefreshHook | undefined\n}>()\n\nconst emit = defineEmits<{\n (e: 'searched', term: string): void\n}>()\n\nconst { t } = useI18n()\nconst { showError } = useAlerts()\nconst store = useUserCrossSystemStore()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst writes = useUserCrossSystemWrites()\n\n// Collector for the metadata form in the create dialog. Without it the rules register\n// on some ancestor, and the dialog cannot validate the fields before sending.\nconst v$ = useVuelidate()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { search, refreshSystem, unresolvedSystems, cancel } = useUserCrossSystemSearch({\n descriptors: props.descriptors,\n refreshHook: props.refreshHook,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst term = ref('')\nconst rowBusy = ref(new Set<string>())\n\nconst runSearch = async () => {\n const value = term.value.trim()\n if (value.length === 0) return\n emit('searched', value)\n await search(value)\n}\n\nconst records = computed(() => {\n const map = new Map<string, BaseUser>()\n for (const descriptor of props.descriptors) {\n const user = store.results.get(descriptor.system)?.user\n if (user) map.set(descriptor.system, user)\n }\n return map\n})\n\nconst differences = computed(() => findMetadataDifferences(records.value))\n\nconst foundAnywhere = computed(() => records.value.size > 0)\n\n/** Bulk actions only write where the person was found, so offer them when at least one of those systems is writable. */\nconst anyFoundWritable = computed(() =>\n props.descriptors.some((item) => records.value.has(item.system) && descriptorMayWrite(item, 'update'))\n)\nconst searchDone = computed(() => store.phase === CrossSystemPhase.Done)\n\nconst searchedByEmail = computed(() => isEmailTerm(store.searchTerm))\n\n/**\n * When to offer creating an account after a search that found nobody.\n * By id: only if every relevant probe returned an authoritative 404. An\n * unreadable record may exist, and a duplicate identity cannot be deleted.\n * By e-mail: always. An address search cannot prove absence, and the dialog\n * asks for the id and runs its own authoritative check before writing.\n * Refusing here would block the decision 21 flow for the search people actually use, since they do not know the id yet.\n */\nconst canOfferCreateAnywhere = computed(\n () =>\n searchDone.value &&\n !foundAnywhere.value &&\n (searchedByEmail.value || unresolvedSystems.value.length === 0) &&\n props.descriptors.some((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n)\n\n/** A conflict is not a state to act from: writes would land on somebody else's account. */\nconst blockedByConflict = computed(() => store.identityConflict !== null)\n\nconst labelFor = (descriptor: AnyUserSystemDescriptor) => descriptor.label ?? descriptor.system\n\nconst manageTargetFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.manage)) return null\n return descriptor.manage(user)\n}\n\nconst extraStateFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.extraState)) return null\n return descriptor.extraState(user)\n}\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\n/**\n * Report a failed row action to the user.\n * Without this a 403 on Vypnúť leaves a spinner and an unchanged row, because the api helpers only write to the logger.\n */\nconst reportOutcome = (label: string, outcome: BulkOutcomeType) => {\n if (outcome === BulkOutcome.Done) return\n showError(label + ': ' + t('common.userSystem.bulk.outcome.' + outcome))\n}\n\nconst detailFor = (fields: UserMetadataField[] | undefined) =>\n isUndefined(fields) || fields.length === 0\n ? undefined\n : t('common.userSystem.bulk.concurrentChange', { fields: fields.join(', ') })\n\nconst withRowBusy = async (system: string, run: () => Promise<void>) => {\n rowBusy.value = new Set([...rowBusy.value, system])\n try {\n await run()\n } finally {\n const next = new Set(rowBusy.value)\n next.delete(system)\n rowBusy.value = next\n }\n}\n\n/** The touched row is read again after every write. Otherwise it keeps showing the old state. */\nconst toggleOne = async (descriptor: AnyUserSystemDescriptor, enabled: boolean) => {\n const id = store.resolvedId\n if (isNull(id)) return\n await withRowBusy(descriptor.system, async () => {\n const result = await writes.setEnabled(descriptor, id, enabled)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\nconst createFromSource = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const sourceSystem = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(sourceSystem)) return\n\n await withRowBusy(descriptor.system, async () => {\n // Read from the server, never from search results or a form's store.\n // An unsaved switch would otherwise be copied into a system where it means a working public account.\n const source = await writes.readSourceUser(sourceSystem, id)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(sourceSystem) }))\n return\n }\n // The dialog already told the operator whether the account will be switched on, based on the search result.\n // If the server disagrees now, someone changed it. In blog and forum that means a working public account.\n if (source.enabled !== sourceEnabled.value) {\n // Re-read instead of patching the record. The chip uses the probe's axes, so\n // replacing only the user leaves the chip stale next to an updated toggle.\n await refreshSystem(sourceSystem.system)\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Metadata comes from the dialog, which was validated against the target's profile.\n // The source may leave `person` empty (blog never fills it) where the target requires it.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n // Copying a person into another system copies whether they are switched on. Roles stay empty.\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\n/** The record the create form is prefilled from: the first configured system that has one. */\nconst prefillSource = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n return isUndefined(first) ? null : (records.value.get(first.system) ?? null)\n})\n\nconst sourceEnabled = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(first)) return false\n return store.results.get(first.system)?.user?.enabled === true\n})\n\nconst bulkOpen = ref(false)\nconst bulkAction = ref<BulkActionType>(BulkAction.Disable)\nconst repairOpen = ref(false)\n\nconst openBulk = (action: BulkActionType) => {\n bulkAction.value = action\n bulkOpen.value = true\n}\n\n/** Every bulk write passes through here, retries included. A system the descriptor refuses is not written. */\nconst writableSystems = (systems: string[]) =>\n systems.filter((system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return !isUndefined(descriptor) && descriptorMayWrite(descriptor, 'update')\n })\n\nconst runBulk = async (requested: string[]) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(requested)\n if (systems.length === 0) return\n const enabled = bulkAction.value === BulkAction.Enable\n store.startBulk(bulkAction.value, systems, id)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.setEnabled(descriptor, id, enabled)\n store.setBulkEntry(system, result.outcome)\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst runRepair = async (payload: { target: BaseUser; systems: string[] }) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(payload.systems)\n if (systems.length === 0) return\n store.startBulk(BulkAction.Metadata, systems, id)\n // Captured before any write, so the comparison uses the values the operator saw, not a row a sibling write refreshed.\n const seenBefore = new Map(records.value)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.writeMetadata(\n descriptor,\n id,\n payload.target,\n undefined,\n seenBefore.get(system) ?? null\n )\n store.setBulkEntry(system, result.outcome, detailFor(result.concurrentFields))\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst createAnywhereOpen = ref(false)\nconst createAnywhereSystem = ref<string | null>(null)\nconst createAnywhereUser = ref<AnzuUser>(createAnzuUser())\nconst createAnywhereChecking = ref(false)\nconst createAnywhereConflict = ref<string[]>([])\nconst createAnywhereError = ref<string | null>(null)\n\n/** Set when the page goes away, so work that finishes afterwards does not refill it. */\nlet left = false\n\nconst openCreateAnywhere = () => {\n // Pick the first enabled system, not the first listed. A system disabled in the configuration\n // is not an option, and preselecting it would POST through a client with no base URL.\n createAnywhereSystem.value =\n props.descriptors.find((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))?.system ?? null\n createAnywhereUser.value = createAnzuUser(createAnywhereSystem.value ?? '')\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n createAnywhereOpen.value = true\n}\n\n/**\n * Before creating, the typed id is looked up across the systems.\n * cms, dam and contentHub skip the SSO lookup for a numeric id, and the validators check id and e-mail separately. A\n * typo would create an account with one person's id and another's e-mail, and later fan-outs follow the wrong identity.\n * If a probe answers 401, 403 or nothing, creating is blocked, because the id's owner is unknown.\n */\nconst confirmCreateAnywhere = async () => {\n const id = createAnywhereUser.value.id\n const system = createAnywhereSystem.value\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n if (isNull(system)) return\n // The id is checked here, not only by the form. A term the search refuses probes\n // nothing, and that empty result would read as \"this id belongs to nobody\".\n if (isNull(id) || isUndefined(id) || !Number.isInteger(id) || id <= 0) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (!(await v$.value.$validate())) return\n createAnywhereChecking.value = true\n try {\n if (!(await search(String(id)))) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (left) return\n if (records.value.size > 0) {\n createAnywhereConflict.value = [...records.value.keys()]\n return\n }\n if (unresolvedSystems.value.length > 0) {\n createAnywhereConflict.value = unresolvedSystems.value\n return\n }\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor) || !descriptor.isEnabled() || !descriptorMayWrite(descriptor, 'create')) return\n const body = createAnzuUser(system)\n body.id = id\n body.email = createAnywhereUser.value.email\n body.person = cloneDeep(createAnywhereUser.value.person)\n body.avatar = cloneDeep(createAnywhereUser.value.avatar)\n // Nobody to copy from, so the account is created switched off, as on an ordinary new-user page.\n body.enabled = false\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n if (result.outcome !== BulkOutcome.Done) return\n // The dialog is not persistent, so the operator can navigate away while the POST is pending.\n // The following search takes a fresh generation that `cancel()`\n // cannot stop, and would refill the store the unmount just emptied.\n if (left) return\n createAnywhereOpen.value = false\n await search(String(id))\n } finally {\n createAnywhereChecking.value = false\n }\n}\n\n/**\n * Uses the chosen target's own profile, not a blanket strict one.\n * The repair dialog is strict because it writes to nine systems. This creates one account\n * in one system, and strict would demand an avatar colour that blog does not require.\n */\nconst createAnywhereRequiredMetadata = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.requiredMetadata ?? true\n)\n\n/** What is special about an account in the chosen system. For blog and forum it is a public one. */\nconst createAnywhereNote = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.createNote\n)\n\nconst createSystemOptions = computed(() =>\n props.descriptors\n .filter((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n .map((item) => ({ value: item.system, title: labelFor(item) }))\n)\n\n// The store exists so a closed dialog does not stop a running bulk action, not to keep a person across navigation.\n// Without this reset, returning through the menu showed the last\n// person's rows and live buttons under an empty search box.\nonBeforeUnmount(() => {\n left = true\n cancel()\n store.reset()\n})\n\ndefineExpose({\n search: async (value: string) => {\n term.value = value\n await runSearch()\n },\n})\n</script>\n\n<template>\n <div>\n <VCard variant=\"flat\">\n <VCardText>\n <div class=\"d-flex align-center ga-2\">\n <VTextField\n v-model=\"term\"\n :label=\"t('common.userSystem.search.label')\"\n :hint=\"t('common.userSystem.search.hint')\"\n persistent-hint\n density=\"compact\"\n data-cy=\"cross-system-search\"\n @keyup.enter=\"runSearch\"\n />\n <ABtnPrimary\n data-cy=\"cross-system-search-submit\"\n @click.stop=\"runSearch\"\n >\n {{ t('common.userSystem.search.submit') }}\n </ABtnPrimary>\n </div>\n <!--\n The two rounds are named while they run. Between them a row is neither present nor absent.\n Showing \"no account here\" would invite a Create for an account that exists under another address.\n -->\n <div\n v-if=\"store.phase === CrossSystemPhase.MatchingEmail\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.matchingEmail') }}\n </div>\n <div\n v-else-if=\"store.phase === CrossSystemPhase.VerifyingById\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.verifyingById') }}\n </div>\n </VCardText>\n </VCard>\n\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n\n <!-- Neither an address nor an id. The previous person's rows are gone, and this says why. -->\n <VAlert\n v-if=\"store.termRejected\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"cross-system-term-rejected\"\n >\n {{ t('common.userSystem.search.termRejected') }}\n </VAlert>\n\n <VCard\n v-if=\"searchDone\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText class=\"d-flex flex-column ga-3\">\n <div\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`cross-system-row-${descriptor.system}`\"\n >\n <div\n class=\"font-weight-medium\"\n style=\"min-width: 8rem\"\n >\n {{ labelFor(descriptor) }}\n </div>\n <AUserSystemStatusChip\n v-if=\"store.results.get(descriptor.system)\"\n :axes=\"store.results.get(descriptor.system)!.axes\"\n />\n <VChip\n v-if=\"extraStateFor(descriptor)\"\n :color=\"EXTRA_STATE_COLOR[extraStateFor(descriptor)!.tone]\"\n label\n size=\"small\"\n >\n {{ extraStateFor(descriptor)!.label }}: {{ extraStateFor(descriptor)!.value }}\n </VChip>\n <div class=\"text-body-small text-medium-emphasis\">\n {{ store.results.get(descriptor.system)?.user?.person.fullName }}\n <template v-if=\"store.results.get(descriptor.system)?.user\">\n · {{ store.results.get(descriptor.system)?.user?.email }}\n </template>\n </div>\n <VSpacer />\n <template\n v-if=\"store.results.get(descriptor.system) && isActionable(store.results.get(descriptor.system)!.axes)\"\n >\n <VBtn\n v-if=\"descriptorMayWrite(descriptor, 'update')\"\n size=\"small\"\n variant=\"text\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :data-cy=\"`cross-system-toggle-${descriptor.system}`\"\n @click=\"toggleOne(descriptor, !store.results.get(descriptor.system)!.user!.enabled)\"\n >\n {{\n store.results.get(descriptor.system)!.user!.enabled\n ? t('common.userSystem.bulk.disable.title')\n : t('common.userSystem.bulk.enable.title')\n }}\n </VBtn>\n <AUserManageButton\n v-if=\"manageTargetFor(descriptor) && descriptorMayWrite(descriptor, 'update')\"\n :target=\"manageTargetFor(descriptor)!\"\n :system-label=\"labelFor(descriptor)\"\n />\n </template>\n <!--\n Create is offered only when the person exists somewhere. That is the only way their global id is known.\n -->\n <AUserCreateInSystemButton\n v-else-if=\"\n foundAnywhere &&\n store.results.get(descriptor.system) &&\n store.results.get(descriptor.system)!.axes.presence === 'absent' &&\n descriptorMayWrite(descriptor, 'create')\n \"\n :system-label=\"labelFor(descriptor)\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"sourceEnabled\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"store.resolvedId\"\n :source=\"prefillSource\"\n @confirm=\"(user) => createFromSource(descriptor, user)\"\n />\n </div>\n </VCardText>\n </VCard>\n\n <VCard\n v-if=\"differences.length > 0\"\n variant=\"flat\"\n class=\"mt-3\"\n data-cy=\"cross-system-differences\"\n >\n <VCardText>\n <div class=\"text-label-large\">{{ t('common.userSystem.inconsistency.title') }}</div>\n <div\n v-for=\"difference in differences\"\n :key=\"difference.field\"\n class=\"text-body-small\"\n >\n <strong>{{ difference.field }}</strong>\n <span\n v-for=\"[system, systemValue] in difference.values\"\n :key=\"system\"\n class=\"ml-2\"\n >\n {{ system }}: {{ systemValue || '—' }}\n </span>\n </div>\n </VCardText>\n </VCard>\n\n <div\n v-if=\"searchDone && foundAnywhere && anyFoundWritable\"\n class=\"d-flex ga-2 mt-3\"\n >\n <!-- All three open a dialog. None of them acts straight away. -->\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-disable\"\n @click=\"openBulk(BulkAction.Disable)\"\n >\n {{ t('common.userSystem.bulk.openDisable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-enable\"\n @click=\"openBulk(BulkAction.Enable)\"\n >\n {{ t('common.userSystem.bulk.openEnable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-metadata\"\n @click=\"repairOpen = true\"\n >\n {{ t('common.userSystem.bulk.openMetadata') }}\n </ABtnTertiary>\n <div\n v-if=\"store.bulkRunning\"\n class=\"text-body-small align-self-center\"\n >\n {{ t('common.userSystem.bulk.runningElsewhere') }}\n </div>\n </div>\n\n <VCard\n v-if=\"searchDone && !foundAnywhere\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText>\n <div data-cy=\"cross-system-not-found\">{{ t('common.userSystem.search.notFound') }}</div>\n <ABtnPrimary\n v-if=\"canOfferCreateAnywhere\"\n class=\"mt-2\"\n data-cy=\"cross-system-create-anywhere\"\n @click=\"openCreateAnywhere\"\n >\n {{ t('common.userSystem.search.createAnywhere') }}\n </ABtnPrimary>\n <!-- Not offered for want of a create right: then nothing is left unconfirmed to retry. -->\n <template v-else-if=\"!searchedByEmail && unresolvedSystems.length > 0\">\n <div class=\"text-body-small mt-2\">\n {{ t('common.userSystem.create.notAuthoritative', { systems: unresolvedSystems.join(', ') }) }}\n </div>\n <ABtnTertiary\n class=\"mt-2\"\n data-cy=\"cross-system-retry-search\"\n @click=\"runSearch\"\n >\n {{ t('common.userSystem.button.retry') }}\n </ABtnTertiary>\n </template>\n </VCardText>\n </VCard>\n\n <AUserBulkActionDialog\n v-model:open=\"bulkOpen\"\n :action=\"bulkAction\"\n :descriptors=\"descriptors\"\n @run=\"runBulk\"\n />\n\n <AUserMetadataRepairDialog\n v-model:open=\"repairOpen\"\n :descriptors=\"descriptors\"\n @confirm=\"runRepair\"\n />\n\n <VDialog\n v-model=\"createAnywhereOpen\"\n :max-width=\"720\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"createAnywhereOpen = false\">\n {{ t('common.userSystem.search.createAnywhere') }}\n </ADialogToolbar>\n <VCardText>\n <VSelect\n v-model=\"createAnywhereSystem\"\n :items=\"createSystemOptions\"\n :label=\"t('common.userSystem.table.system')\"\n density=\"compact\"\n data-cy=\"create-anywhere-system\"\n />\n <!-- Id and e-mail are both asked for: the e-mail is required by the backend. -->\n <AUserMetadataForm\n v-model:user=\"createAnywhereUser\"\n :required=\"createAnywhereRequiredMetadata\"\n id-input\n />\n <p\n v-if=\"createAnywhereNote\"\n class=\"mt-2\"\n >\n {{ createAnywhereNote }}\n </p>\n <VAlert\n v-if=\"createAnywhereError\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-error\"\n >\n {{ createAnywhereError }}\n </VAlert>\n <VAlert\n v-if=\"createAnywhereConflict.length > 0\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-conflict\"\n >\n {{ t('common.userSystem.create.notAuthoritative', { systems: createAnywhereConflict.join(', ') }) }}\n </VAlert>\n <p class=\"mt-2\">{{ t('common.userSystem.create.note') }}</p>\n <p>{{ t('common.userSystem.create.willBeDisabled') }}</p>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"createAnywhereOpen = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnPrimary\n :loading=\"createAnywhereChecking\"\n data-cy=\"create-anywhere-confirm\"\n @click.stop=\"confirmCreateAnywhere\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AUserSystemOverview.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_component_VCard","_withCtx","_component_VCardText","_createElementVNode","_component_VTextField","_unref","_withKeys","_withModifiers","_createTextVNode","_toDisplayString","_createBlock","_component_VAlert","_Fragment","_renderList","AUserSystemStatusChip","_component_VChip","_component_VSpacer","_component_VBtn","AUserManageButton","AUserCreateInSystemButton","AUserBulkActionDialog","AUserMetadataRepairDialog","_component_VDialog","ADialogToolbar","_component_VSelect","AUserMetadataForm","_component_VCardActions","ADialogToolbar_default","AUserBulkActionDialog_default","AUserCreateInSystemButton_default","AUserManageButton_default","AUserMetadataForm_default","AUserMetadataRepairDialog_default","AUserSystemStatusChip_default","useVuelidate","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","useAlerts","store","useUserCrossSystemStore","useAnzuUserFactory","writes","useUserCrossSystemWrites","v$","useUserCrossSystemSearch","term","ref","rowBusy","runSearch","value","search","records","computed","map","descriptor","user","differences","findMetadataDifferences","foundAnywhere","anyFoundWritable","item","descriptorMayWrite","searchDone","CrossSystemPhase","searchedByEmail","isEmailTerm","canOfferCreateAnywhere","unresolvedSystems","blockedByConflict","labelFor","manageTargetFor","isUndefined","isNull","extraStateFor","EXTRA_STATE_COLOR","reportOutcome","outcome","BulkOutcome","showError","label","t","detailFor","fields","withRowBusy","system","run","next","toggleOne","id","result","enabled","refreshSystem","createFromSource","sourceSystem","source","sourceEnabled","body","createAnzuUser","metadata","cloneDeep","prefillSource","first","bulkOpen","bulkAction","BulkAction","repairOpen","openBulk","action","writableSystems","systems","runBulk","requested","runRepair","payload","seenBefore","createAnywhereOpen","createAnywhereSystem","createAnywhereUser","createAnywhereChecking","createAnywhereConflict","createAnywhereError","left","openCreateAnywhere","confirmCreateAnywhere","createAnywhereRequiredMetadata","createAnywhereNote","createSystemOptions","onBeforeUnmount","cancel","_component_ABtnPrimary","resolveComponent","_component_ABtnTertiary","openBlock","createElementBlock","createVNode","VCard","withCtx","VCardText","createElementVNode","VTextField","_cache","$event","unref","withKeys","withModifiers","createTextVNode","toDisplayString","createCommentVNode","createBlock","VAlert","Fragment","renderList","VChip","VSpacer","isActionable","VBtn","difference","systemValue","VDialog","VSelect","VCardActions"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemOverview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, ref } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport AUserBulkActionDialog from '@/domains/anzuUser/components/AUserBulkActionDialog.vue'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserMetadataRepairDialog from '@/domains/anzuUser/components/AUserMetadataRepairDialog.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport {\n BulkAction,\n BulkOutcome,\n CrossSystemPhase,\n useUserCrossSystemStore,\n type BulkActionType,\n type BulkOutcomeType,\n} from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { isEmailTerm, useUserCrossSystemSearch } from '@/domains/anzuUser/composables/userCrossSystemSearch'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport { findMetadataDifferences, type UserMetadataField } from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isActionable } from '@/domains/anzuUser/utils/userSystemState'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n /** Order matters twice: the order of the rows, and the priority when pre-filling. */\n descriptors: AnyUserSystemDescriptor[]\n refreshHook?: UserSystemRefreshHook | undefined\n}>()\n\nconst emit = defineEmits<{\n (e: 'searched', term: string): void\n}>()\n\nconst { t } = useI18n()\nconst { showError } = useAlerts()\nconst store = useUserCrossSystemStore()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst writes = useUserCrossSystemWrites()\n\n// Collector for the metadata form in the create dialog. Without it the rules register\n// on some ancestor, and the dialog cannot validate the fields before sending.\nconst v$ = useVuelidate()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { search, refreshSystem, unresolvedSystems, cancel } = useUserCrossSystemSearch({\n descriptors: props.descriptors,\n refreshHook: props.refreshHook,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst term = ref('')\nconst rowBusy = ref(new Set<string>())\n\nconst runSearch = async () => {\n const value = term.value.trim()\n if (value.length === 0) return\n emit('searched', value)\n await search(value)\n}\n\nconst records = computed(() => {\n const map = new Map<string, BaseUser>()\n for (const descriptor of props.descriptors) {\n const user = store.results.get(descriptor.system)?.user\n if (user) map.set(descriptor.system, user)\n }\n return map\n})\n\nconst differences = computed(() => findMetadataDifferences(records.value))\n\nconst foundAnywhere = computed(() => records.value.size > 0)\n\n/** Bulk actions only write where the person was found, so offer them when at least one of those systems is writable. */\nconst anyFoundWritable = computed(() =>\n props.descriptors.some((item) => records.value.has(item.system) && descriptorMayWrite(item, 'update'))\n)\nconst searchDone = computed(() => store.phase === CrossSystemPhase.Done)\n\nconst searchedByEmail = computed(() => isEmailTerm(store.searchTerm))\n\n/**\n * When to offer creating an account after a search that found nobody.\n * By id: only if every relevant probe returned an authoritative 404. An\n * unreadable record may exist, and a duplicate identity cannot be deleted.\n * By e-mail: always. An address search cannot prove absence, and the dialog\n * asks for the id and runs its own authoritative check before writing.\n * Refusing here would block the decision 21 flow for the search people actually use, since they do not know the id yet.\n */\nconst canOfferCreateAnywhere = computed(\n () =>\n searchDone.value &&\n !foundAnywhere.value &&\n (searchedByEmail.value || unresolvedSystems.value.length === 0) &&\n props.descriptors.some((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n)\n\n/** A conflict is not a state to act from: writes would land on somebody else's account. */\nconst blockedByConflict = computed(() => store.identityConflict !== null)\n\nconst labelFor = (descriptor: AnyUserSystemDescriptor) => descriptor.label ?? descriptor.system\n\nconst manageTargetFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.manage)) return null\n return descriptor.manage(user)\n}\n\nconst extraStateFor = (descriptor: AnyUserSystemDescriptor) => {\n const user = store.results.get(descriptor.system)?.user\n if (isUndefined(user) || isNull(user) || isUndefined(descriptor.extraState)) return null\n return descriptor.extraState(user)\n}\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\n/**\n * Report a failed row action to the user.\n * Without this a 403 on Vypnúť leaves a spinner and an unchanged row, because the api helpers only write to the logger.\n */\nconst reportOutcome = (label: string, outcome: BulkOutcomeType) => {\n if (outcome === BulkOutcome.Done) return\n showError(label + ': ' + t('common.userSystem.bulk.outcome.' + outcome))\n}\n\nconst detailFor = (fields: UserMetadataField[] | undefined) =>\n isUndefined(fields) || fields.length === 0\n ? undefined\n : t('common.userSystem.bulk.concurrentChange', { fields: fields.join(', ') })\n\nconst withRowBusy = async (system: string, run: () => Promise<void>) => {\n rowBusy.value = new Set([...rowBusy.value, system])\n try {\n await run()\n } finally {\n const next = new Set(rowBusy.value)\n next.delete(system)\n rowBusy.value = next\n }\n}\n\n/** The touched row is read again after every write. Otherwise it keeps showing the old state. */\nconst toggleOne = async (descriptor: AnyUserSystemDescriptor, enabled: boolean) => {\n const id = store.resolvedId\n if (isNull(id)) return\n await withRowBusy(descriptor.system, async () => {\n const result = await writes.setEnabled(descriptor, id, enabled)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\nconst createFromSource = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const sourceSystem = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(sourceSystem)) return\n\n await withRowBusy(descriptor.system, async () => {\n // Read from the server, never from search results or a form's store.\n // An unsaved switch would otherwise be copied into a system where it means a working public account.\n const source = await writes.readSourceUser(sourceSystem, id)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(sourceSystem) }))\n return\n }\n // The dialog already told the operator whether the account will be switched on, based on the search result.\n // If the server disagrees now, someone changed it. In blog and forum that means a working public account.\n if (source.enabled !== sourceEnabled.value) {\n // Re-read instead of patching the record. The chip uses the probe's axes, so\n // replacing only the user leaves the chip stale next to an updated toggle.\n await refreshSystem(sourceSystem.system)\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Metadata comes from the dialog, which was validated against the target's profile.\n // The source may leave `person` empty (blog never fills it) where the target requires it.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n // Copying a person into another system copies whether they are switched on. Roles stay empty.\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n await refreshSystem(descriptor.system)\n })\n}\n\n/** The record the create form is prefilled from: the first configured system that has one. */\nconst prefillSource = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n return isUndefined(first) ? null : (records.value.get(first.system) ?? null)\n})\n\nconst sourceEnabled = computed(() => {\n const first = props.descriptors.find((item) => records.value.has(item.system))\n if (isUndefined(first)) return false\n return store.results.get(first.system)?.user?.enabled === true\n})\n\nconst bulkOpen = ref(false)\nconst bulkAction = ref<BulkActionType>(BulkAction.Disable)\nconst repairOpen = ref(false)\n\nconst openBulk = (action: BulkActionType) => {\n bulkAction.value = action\n bulkOpen.value = true\n}\n\n/** Every bulk write passes through here, retries included. A system the descriptor refuses is not written. */\nconst writableSystems = (systems: string[]) =>\n systems.filter((system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return !isUndefined(descriptor) && descriptorMayWrite(descriptor, 'update')\n })\n\nconst runBulk = async (requested: string[]) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(requested)\n if (systems.length === 0) return\n const enabled = bulkAction.value === BulkAction.Enable\n store.startBulk(bulkAction.value, systems, id)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.setEnabled(descriptor, id, enabled)\n store.setBulkEntry(system, result.outcome)\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst runRepair = async (payload: { target: BaseUser; systems: string[] }) => {\n const id = store.resolvedId\n if (isNull(id)) return\n const systems = writableSystems(payload.systems)\n if (systems.length === 0) return\n store.startBulk(BulkAction.Metadata, systems, id)\n // Captured before any write, so the comparison uses the values the operator saw, not a row a sibling write refreshed.\n const seenBefore = new Map(records.value)\n await Promise.allSettled(\n systems.map(async (system) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor)) return\n store.setBulkEntry(system, BulkOutcome.Running)\n const result = await writes.writeMetadata(\n descriptor,\n id,\n payload.target,\n undefined,\n seenBefore.get(system) ?? null\n )\n store.setBulkEntry(system, result.outcome, detailFor(result.concurrentFields))\n await refreshSystem(system)\n })\n )\n store.finishBulk()\n}\n\nconst createAnywhereOpen = ref(false)\nconst createAnywhereSystem = ref<string | null>(null)\nconst createAnywhereUser = ref<AnzuUser>(createAnzuUser())\nconst createAnywhereChecking = ref(false)\nconst createAnywhereConflict = ref<string[]>([])\nconst createAnywhereError = ref<string | null>(null)\n\n/** Set when the page goes away, so work that finishes afterwards does not refill it. */\nlet left = false\n\nconst openCreateAnywhere = () => {\n // Pick the first enabled system, not the first listed. A system disabled in the configuration\n // is not an option, and preselecting it would POST through a client with no base URL.\n createAnywhereSystem.value =\n props.descriptors.find((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))?.system ?? null\n createAnywhereUser.value = createAnzuUser(createAnywhereSystem.value ?? '')\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n createAnywhereOpen.value = true\n}\n\n/**\n * Before creating, the typed id is looked up across the systems.\n * cms, dam and contentHub skip the SSO lookup for a numeric id, and the validators check id and e-mail separately. A\n * typo would create an account with one person's id and another's e-mail, and later fan-outs follow the wrong identity.\n * If a probe answers 401, 403 or nothing, creating is blocked, because the id's owner is unknown.\n */\nconst confirmCreateAnywhere = async () => {\n const id = createAnywhereUser.value.id\n const system = createAnywhereSystem.value\n createAnywhereConflict.value = []\n createAnywhereError.value = null\n if (isNull(system)) return\n // The id is checked here, not only by the form. A term the search refuses probes\n // nothing, and that empty result would read as \"this id belongs to nobody\".\n if (isNull(id) || isUndefined(id) || !Number.isInteger(id) || id <= 0) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (!(await v$.value.$validate())) return\n createAnywhereChecking.value = true\n try {\n if (!(await search(String(id)))) {\n createAnywhereError.value = t('common.userSystem.create.invalidId')\n return\n }\n if (left) return\n if (records.value.size > 0) {\n createAnywhereConflict.value = [...records.value.keys()]\n return\n }\n if (unresolvedSystems.value.length > 0) {\n createAnywhereConflict.value = unresolvedSystems.value\n return\n }\n const descriptor = props.descriptors.find((item) => item.system === system)\n if (isUndefined(descriptor) || !descriptor.isEnabled() || !descriptorMayWrite(descriptor, 'create')) return\n const body = createAnzuUser(system)\n body.id = id\n body.email = createAnywhereUser.value.email\n body.person = cloneDeep(createAnywhereUser.value.person)\n body.avatar = cloneDeep(createAnywhereUser.value.avatar)\n // Nobody to copy from, so the account is created switched off, as on an ordinary new-user page.\n body.enabled = false\n const result = await writes.createInSystem(descriptor, body)\n reportOutcome(labelFor(descriptor), result.outcome)\n if (result.outcome !== BulkOutcome.Done) return\n // The dialog is not persistent, so the operator can navigate away while the POST is pending.\n // The following search takes a fresh generation that `cancel()`\n // cannot stop, and would refill the store the unmount just emptied.\n if (left) return\n createAnywhereOpen.value = false\n await search(String(id))\n } finally {\n createAnywhereChecking.value = false\n }\n}\n\n/**\n * Uses the chosen target's own profile, not a blanket strict one.\n * The repair dialog is strict because it writes to nine systems. This creates one account\n * in one system, and strict would demand an avatar colour that blog does not require.\n */\nconst createAnywhereRequiredMetadata = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.requiredMetadata ?? true\n)\n\n/** What is special about an account in the chosen system. For blog and forum it is a public one. */\nconst createAnywhereNote = computed(\n () => props.descriptors.find((item) => item.system === createAnywhereSystem.value)?.createNote\n)\n\nconst createSystemOptions = computed(() =>\n props.descriptors\n .filter((item) => item.isEnabled() && descriptorMayWrite(item, 'create'))\n .map((item) => ({ value: item.system, title: labelFor(item) }))\n)\n\n// The store exists so a closed dialog does not stop a running bulk action, not to keep a person across navigation.\n// Without this reset, returning through the menu showed the last\n// person's rows and live buttons under an empty search box.\nonBeforeUnmount(() => {\n left = true\n cancel()\n store.reset()\n})\n\ndefineExpose({\n search: async (value: string) => {\n term.value = value\n await runSearch()\n },\n})\n</script>\n\n<template>\n <div>\n <VCard variant=\"flat\">\n <VCardText>\n <div class=\"d-flex align-center ga-2\">\n <VTextField\n v-model=\"term\"\n :label=\"t('common.userSystem.search.label')\"\n :hint=\"t('common.userSystem.search.hint')\"\n persistent-hint\n density=\"compact\"\n data-cy=\"cross-system-search\"\n @keyup.enter=\"runSearch\"\n />\n <ABtnPrimary\n data-cy=\"cross-system-search-submit\"\n @click.stop=\"runSearch\"\n >\n {{ t('common.userSystem.search.submit') }}\n </ABtnPrimary>\n </div>\n <!--\n The two rounds are named while they run. Between them a row is neither present nor absent.\n Showing \"no account here\" would invite a Create for an account that exists under another address.\n -->\n <div\n v-if=\"store.phase === CrossSystemPhase.MatchingEmail\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.matchingEmail') }}\n </div>\n <div\n v-else-if=\"store.phase === CrossSystemPhase.VerifyingById\"\n class=\"text-body-small mt-2\"\n >\n {{ t('common.userSystem.search.phase.verifyingById') }}\n </div>\n </VCardText>\n </VCard>\n\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n\n <!-- Neither an address nor an id. The previous person's rows are gone, and this says why. -->\n <VAlert\n v-if=\"store.termRejected\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"my-3\"\n data-cy=\"cross-system-term-rejected\"\n >\n {{ t('common.userSystem.search.termRejected') }}\n </VAlert>\n\n <VCard\n v-if=\"searchDone\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText class=\"d-flex flex-column ga-3\">\n <div\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`cross-system-row-${descriptor.system}`\"\n >\n <div\n class=\"font-weight-medium\"\n style=\"min-width: 8rem\"\n >\n {{ labelFor(descriptor) }}\n </div>\n <AUserSystemStatusChip\n v-if=\"store.results.get(descriptor.system)\"\n :axes=\"store.results.get(descriptor.system)!.axes\"\n />\n <VChip\n v-if=\"extraStateFor(descriptor)\"\n :color=\"EXTRA_STATE_COLOR[extraStateFor(descriptor)!.tone]\"\n label\n size=\"small\"\n >\n {{ extraStateFor(descriptor)!.label }}: {{ extraStateFor(descriptor)!.value }}\n </VChip>\n <div class=\"text-body-small text-medium-emphasis\">\n {{ store.results.get(descriptor.system)?.user?.person.fullName }}\n <template v-if=\"store.results.get(descriptor.system)?.user\">\n · {{ store.results.get(descriptor.system)?.user?.email }}\n </template>\n </div>\n <VSpacer />\n <template\n v-if=\"store.results.get(descriptor.system) && isActionable(store.results.get(descriptor.system)!.axes)\"\n >\n <VBtn\n v-if=\"descriptorMayWrite(descriptor, 'update')\"\n size=\"small\"\n variant=\"text\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :data-cy=\"`cross-system-toggle-${descriptor.system}`\"\n @click=\"toggleOne(descriptor, !store.results.get(descriptor.system)!.user!.enabled)\"\n >\n {{\n store.results.get(descriptor.system)!.user!.enabled\n ? t('common.userSystem.bulk.disable.title')\n : t('common.userSystem.bulk.enable.title')\n }}\n </VBtn>\n <AUserManageButton\n v-if=\"manageTargetFor(descriptor) && descriptorMayWrite(descriptor, 'update')\"\n :target=\"manageTargetFor(descriptor)!\"\n :system-label=\"labelFor(descriptor)\"\n />\n </template>\n <!--\n Create is offered only when the person exists somewhere. That is the only way their global id is known.\n -->\n <AUserCreateInSystemButton\n v-else-if=\"\n foundAnywhere &&\n store.results.get(descriptor.system) &&\n store.results.get(descriptor.system)!.axes.presence === 'absent' &&\n descriptorMayWrite(descriptor, 'create')\n \"\n :system-label=\"labelFor(descriptor)\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"sourceEnabled\"\n :loading=\"rowBusy.has(descriptor.system)\"\n :disabled=\"blockedByConflict\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"store.resolvedId\"\n :source=\"prefillSource\"\n @confirm=\"(user) => createFromSource(descriptor, user)\"\n />\n </div>\n </VCardText>\n </VCard>\n\n <VCard\n v-if=\"differences.length > 0\"\n variant=\"flat\"\n class=\"mt-3\"\n data-cy=\"cross-system-differences\"\n >\n <VCardText>\n <div class=\"text-label-large\">{{ t('common.userSystem.inconsistency.title') }}</div>\n <div\n v-for=\"difference in differences\"\n :key=\"difference.field\"\n class=\"text-body-small\"\n >\n <strong>{{ difference.field }}</strong>\n <span\n v-for=\"[system, systemValue] in difference.values\"\n :key=\"system\"\n class=\"ml-2\"\n >\n {{ system }}: {{ systemValue || '—' }}\n </span>\n </div>\n </VCardText>\n </VCard>\n\n <div\n v-if=\"searchDone && foundAnywhere && anyFoundWritable\"\n class=\"d-flex ga-2 mt-3\"\n >\n <!-- All three open a dialog. None of them acts straight away. -->\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-disable\"\n @click=\"openBulk(BulkAction.Disable)\"\n >\n {{ t('common.userSystem.bulk.openDisable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-enable\"\n @click=\"openBulk(BulkAction.Enable)\"\n >\n {{ t('common.userSystem.bulk.openEnable') }}\n </ABtnTertiary>\n <ABtnTertiary\n :disabled=\"store.bulkRunning || blockedByConflict\"\n data-cy=\"cross-system-bulk-metadata\"\n @click=\"repairOpen = true\"\n >\n {{ t('common.userSystem.bulk.openMetadata') }}\n </ABtnTertiary>\n <div\n v-if=\"store.bulkRunning\"\n class=\"text-body-small align-self-center\"\n >\n {{ t('common.userSystem.bulk.runningElsewhere') }}\n </div>\n </div>\n\n <VCard\n v-if=\"searchDone && !foundAnywhere\"\n variant=\"flat\"\n class=\"mt-3\"\n >\n <VCardText>\n <div data-cy=\"cross-system-not-found\">{{ t('common.userSystem.search.notFound') }}</div>\n <ABtnPrimary\n v-if=\"canOfferCreateAnywhere\"\n class=\"mt-2\"\n data-cy=\"cross-system-create-anywhere\"\n @click=\"openCreateAnywhere\"\n >\n {{ t('common.userSystem.search.createAnywhere') }}\n </ABtnPrimary>\n <!-- Not offered for want of a create right: then nothing is left unconfirmed to retry. -->\n <template v-else-if=\"!searchedByEmail && unresolvedSystems.length > 0\">\n <div class=\"text-body-small mt-2\">\n {{ t('common.userSystem.create.notAuthoritative', { systems: unresolvedSystems.join(', ') }) }}\n </div>\n <ABtnTertiary\n class=\"mt-2\"\n data-cy=\"cross-system-retry-search\"\n @click=\"runSearch\"\n >\n {{ t('common.userSystem.button.retry') }}\n </ABtnTertiary>\n </template>\n </VCardText>\n </VCard>\n\n <AUserBulkActionDialog\n v-model:open=\"bulkOpen\"\n :action=\"bulkAction\"\n :descriptors=\"descriptors\"\n @run=\"runBulk\"\n />\n\n <AUserMetadataRepairDialog\n v-model:open=\"repairOpen\"\n :descriptors=\"descriptors\"\n @confirm=\"runRepair\"\n />\n\n <VDialog\n v-model=\"createAnywhereOpen\"\n :max-width=\"720\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"createAnywhereOpen = false\">\n {{ t('common.userSystem.search.createAnywhere') }}\n </ADialogToolbar>\n <VCardText>\n <VSelect\n v-model=\"createAnywhereSystem\"\n :items=\"createSystemOptions\"\n :label=\"t('common.userSystem.table.system')\"\n density=\"compact\"\n data-cy=\"create-anywhere-system\"\n />\n <!-- Id and e-mail are both asked for: the e-mail is required by the backend. -->\n <AUserMetadataForm\n v-model:user=\"createAnywhereUser\"\n :required=\"createAnywhereRequiredMetadata\"\n id-input\n />\n <p\n v-if=\"createAnywhereNote\"\n class=\"mt-2\"\n >\n {{ createAnywhereNote }}\n </p>\n <VAlert\n v-if=\"createAnywhereError\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-error\"\n >\n {{ createAnywhereError }}\n </VAlert>\n <VAlert\n v-if=\"createAnywhereConflict.length > 0\"\n type=\"warning\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mt-2\"\n data-cy=\"create-anywhere-conflict\"\n >\n {{ t('common.userSystem.create.notAuthoritative', { systems: createAnywhereConflict.join(', ') }) }}\n </VAlert>\n <p class=\"mt-2\">{{ t('common.userSystem.create.note') }}</p>\n <p>{{ t('common.userSystem.create.willBeDisabled') }}</p>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"createAnywhereOpen = false\">\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnPrimary\n :loading=\"createAnywhereChecking\"\n data-cy=\"create-anywhere-confirm\"\n @click.stop=\"confirmCreateAnywhere\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserSystemPanel.js","names":["_sfc_main","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","AUserSystemPanel_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create, because no read-only screen offers a write action.\n * Manage stays because it only navigates.\n */\n readonly?: boolean\n /** Whether the account about to be created would be switched on. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creating?: boolean\n }>(),\n {\n readonly: false,\n createEnabled: false,\n source: null,\n creating: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\nconst { t } = useI18n()\n\n// Provided once per page rather than passed down through every row.\nconst refreshHook = inject(UserSystemRefreshHookKey, undefined)\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { axes, user, probe, cancel } = useUserSystemProbe({ descriptor: props.descriptor, refreshHook })\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst label = computed(() => props.descriptor.label ?? props.descriptor.system)\n\n/**\n * The buttons depend on the probe's answer, not on `<Acl>`, except that the descriptor can deny writing (`canWrite`).\n * On a cross-system surface no current user is loaded for other backends, so `can()` would throw and\n * `<Acl>` would render nothing. The probe is the only signal, so its 401 handling must be right.\n */\nconst showManage = computed(\n () =>\n axes.value.load === UserSystemLoad.Loaded &&\n user.value !== null &&\n !isUndefined(props.descriptor.manage) &&\n descriptorMayWrite(props.descriptor, 'update')\n)\nconst showCreate = computed(\n () => !props.readonly && isAuthoritativelyAbsent(axes.value) && descriptorMayWrite(props.descriptor, 'create')\n)\n\nconst manageTarget = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.manage)) return null\n return props.descriptor.manage(user.value)\n})\n\nconst extraState = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.extraState)) return null\n return props.descriptor.extraState(user.value)\n})\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\nconst canRetry = computed(\n () => axes.value.access === UserSystemAccess.Unavailable || axes.value.access === UserSystemAccess.Unauthenticated\n)\n\nconst run = () => probe(props.userId)\n\nonMounted(run)\n\n// The panel is never re-created because `VWindowItem` hides it\n// with `v-show`. A new id has to reach it through this watcher.\nwatch(() => props.userId, run)\n\nonBeforeUnmount(cancel)\n\ndefineExpose({\n refresh: run,\n})\n</script>\n\n<template>\n <div\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`user-system-panel-${descriptor.system}`\"\n >\n <div class=\"font-weight-medium\">{{ label }}</div>\n <AUserSystemStatusChip :axes=\"axes\" />\n <VChip\n v-if=\"extraState\"\n :color=\"EXTRA_STATE_COLOR[extraState.tone]\"\n label\n size=\"small\"\n >\n {{ extraState.label }}: {{ extraState.value }}\n </VChip>\n <div\n v-if=\"user\"\n class=\"text-body-small text-medium-emphasis\"\n >\n {{ user.person.fullName }} · {{ user.email }}\n </div>\n <div\n v-if=\"descriptor.enabledNote\"\n class=\"text-body-small text-medium-emphasis w-100\"\n >\n {{ descriptor.enabledNote }}\n </div>\n <VSpacer />\n <AUserManageButton\n v-if=\"showManage && manageTarget\"\n :target=\"manageTarget\"\n :system-label=\"label\"\n />\n <AUserCreateInSystemButton\n v-if=\"showCreate\"\n :system-label=\"label\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"createEnabled\"\n :loading=\"creating\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"userId\"\n :source=\"source\"\n @confirm=\"(user) => emit('create', descriptor, user)\"\n />\n <VBtn\n v-if=\"canRetry\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"user-system-retry\"\n @click=\"run\"\n >\n {{ t('common.userSystem.button.retry') }}\n </VBtn>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserSystemPanel.js","names":["AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","AUserSystemPanel_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserSystemPanel.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","AUserSystemStatusChip","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_createCommentVNode","_component_VSpacer","AUserManageButton","AUserCreateInSystemButton","_component_VBtn","AUserCreateInSystemButton_default","AUserManageButton_default","AUserSystemStatusChip_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","refreshHook","inject","UserSystemRefreshHookKey","useUserSystemProbe","label","computed","showManage","axes","UserSystemLoad","user","isUndefined","descriptorMayWrite","showCreate","isAuthoritativelyAbsent","manageTarget","extraState","EXTRA_STATE_COLOR","canRetry","UserSystemAccess","run","probe","onMounted","watch","onBeforeUnmount","cancel","openBlock","createElementBlock","createElementVNode","toDisplayString","createVNode","unref","createBlock","VChip","withCtx","createTextVNode","createCommentVNode","VSpacer","_cache","VBtn","t"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create, because no read-only screen offers a write action.\n * Manage stays because it only navigates.\n */\n readonly?: boolean\n /** Whether the account about to be created would be switched on. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creating?: boolean\n }>(),\n {\n readonly: false,\n createEnabled: false,\n source: null,\n creating: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\nconst { t } = useI18n()\n\n// Provided once per page rather than passed down through every row.\nconst refreshHook = inject(UserSystemRefreshHookKey, undefined)\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { axes, user, probe, cancel } = useUserSystemProbe({ descriptor: props.descriptor, refreshHook })\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst label = computed(() => props.descriptor.label ?? props.descriptor.system)\n\n/**\n * The buttons depend on the probe's answer, not on `<Acl>`, except that the descriptor can deny writing (`canWrite`).\n * On a cross-system surface no current user is loaded for other backends, so `can()` would throw and\n * `<Acl>` would render nothing. The probe is the only signal, so its 401 handling must be right.\n */\nconst showManage = computed(\n () =>\n axes.value.load === UserSystemLoad.Loaded &&\n user.value !== null &&\n !isUndefined(props.descriptor.manage) &&\n descriptorMayWrite(props.descriptor, 'update')\n)\nconst showCreate = computed(\n () => !props.readonly && isAuthoritativelyAbsent(axes.value) && descriptorMayWrite(props.descriptor, 'create')\n)\n\nconst manageTarget = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.manage)) return null\n return props.descriptor.manage(user.value)\n})\n\nconst extraState = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.extraState)) return null\n return props.descriptor.extraState(user.value)\n})\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\nconst canRetry = computed(\n () => axes.value.access === UserSystemAccess.Unavailable || axes.value.access === UserSystemAccess.Unauthenticated\n)\n\nconst run = () => probe(props.userId)\n\nonMounted(run)\n\n// The panel is never re-created because `VWindowItem` hides it\n// with `v-show`. A new id has to reach it through this watcher.\nwatch(() => props.userId, run)\n\nonBeforeUnmount(cancel)\n\ndefineExpose({\n refresh: run,\n})\n</script>\n\n<template>\n <div\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`user-system-panel-${descriptor.system}`\"\n >\n <div class=\"font-weight-medium\">{{ label }}</div>\n <AUserSystemStatusChip :axes=\"axes\" />\n <VChip\n v-if=\"extraState\"\n :color=\"EXTRA_STATE_COLOR[extraState.tone]\"\n label\n size=\"small\"\n >\n {{ extraState.label }}: {{ extraState.value }}\n </VChip>\n <div\n v-if=\"user\"\n class=\"text-body-small text-medium-emphasis\"\n >\n {{ user.person.fullName }} · {{ user.email }}\n </div>\n <div\n v-if=\"descriptor.enabledNote\"\n class=\"text-body-small text-medium-emphasis w-100\"\n >\n {{ descriptor.enabledNote }}\n </div>\n <VSpacer />\n <AUserManageButton\n v-if=\"showManage && manageTarget\"\n :target=\"manageTarget\"\n :system-label=\"label\"\n />\n <AUserCreateInSystemButton\n v-if=\"showCreate\"\n :system-label=\"label\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"createEnabled\"\n :loading=\"creating\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"userId\"\n :source=\"source\"\n @confirm=\"(user) => emit('create', descriptor, user)\"\n />\n <VBtn\n v-if=\"canRetry\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"user-system-retry\"\n @click=\"run\"\n >\n {{ t('common.userSystem.button.retry') }}\n </VBtn>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AUserSystemPanel.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","AUserSystemStatusChip","_unref","_createBlock","_component_VChip","_withCtx","_createTextVNode","_component_VSpacer","AUserManageButton","AUserCreateInSystemButton","_component_VBtn","AUserCreateInSystemButton_default","AUserManageButton_default","AUserSystemStatusChip_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AUserSystemPanel_vue_vue_type_script_setup_true_lang_default","__expose","__emit","props","__props","emit","useI18n","refreshHook","inject","UserSystemRefreshHookKey","useUserSystemProbe","label","computed","showManage","axes","UserSystemLoad","user","isUndefined","descriptorMayWrite","showCreate","isAuthoritativelyAbsent","manageTarget","extraState","EXTRA_STATE_COLOR","canRetry","UserSystemAccess","run","probe","onMounted","watch","onBeforeUnmount","cancel","openBlock","createElementBlock","createElementVNode","toDisplayString","createVNode","unref","createBlock","VChip","withCtx","createTextVNode","createCommentVNode","VSpacer","_cache","VBtn","t"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemPanel.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AUserCreateInSystemButton from '@/domains/anzuUser/components/AUserCreateInSystemButton.vue'\nimport AUserManageButton from '@/domains/anzuUser/components/AUserManageButton.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport { useUserSystemProbe, UserSystemRefreshHookKey } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { isAuthoritativelyAbsent, UserSystemAccess, UserSystemLoad } from '@/domains/anzuUser/utils/userSystemState'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { isUndefined } from '@/shared/utils/common'\n\nconst props = withDefaults(\n defineProps<{\n descriptor: AnyUserSystemDescriptor\n userId: IntegerId\n /**\n * On a viewing page there is no Create, because no read-only screen offers a write action.\n * Manage stays because it only navigates.\n */\n readonly?: boolean\n /** Whether the account about to be created would be switched on. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creating?: boolean\n }>(),\n {\n readonly: false,\n createEnabled: false,\n source: null,\n creating: false,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\nconst { t } = useI18n()\n\n// Provided once per page rather than passed down through every row.\nconst refreshHook = inject(UserSystemRefreshHookKey, undefined)\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { axes, user, probe, cancel } = useUserSystemProbe({ descriptor: props.descriptor, refreshHook })\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst label = computed(() => props.descriptor.label ?? props.descriptor.system)\n\n/**\n * The buttons depend on the probe's answer, not on `<Acl>`, except that the descriptor can deny writing (`canWrite`).\n * On a cross-system surface no current user is loaded for other backends, so `can()` would throw and\n * `<Acl>` would render nothing. The probe is the only signal, so its 401 handling must be right.\n */\nconst showManage = computed(\n () =>\n axes.value.load === UserSystemLoad.Loaded &&\n user.value !== null &&\n !isUndefined(props.descriptor.manage) &&\n descriptorMayWrite(props.descriptor, 'update')\n)\nconst showCreate = computed(\n () => !props.readonly && isAuthoritativelyAbsent(axes.value) && descriptorMayWrite(props.descriptor, 'create')\n)\n\nconst manageTarget = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.manage)) return null\n return props.descriptor.manage(user.value)\n})\n\nconst extraState = computed(() => {\n if (user.value === null || isUndefined(props.descriptor.extraState)) return null\n return props.descriptor.extraState(user.value)\n})\n\nconst EXTRA_STATE_COLOR = { ok: 'success', warn: 'warning', error: 'error' } as const\n\nconst canRetry = computed(\n () => axes.value.access === UserSystemAccess.Unavailable || axes.value.access === UserSystemAccess.Unauthenticated\n)\n\nconst run = () => probe(props.userId)\n\nonMounted(run)\n\n// The panel is never re-created because `VWindowItem` hides it\n// with `v-show`. A new id has to reach it through this watcher.\nwatch(() => props.userId, run)\n\nonBeforeUnmount(cancel)\n\ndefineExpose({\n refresh: run,\n})\n</script>\n\n<template>\n <div\n class=\"d-flex align-center flex-wrap ga-2\"\n :data-cy=\"`user-system-panel-${descriptor.system}`\"\n >\n <div class=\"font-weight-medium\">{{ label }}</div>\n <AUserSystemStatusChip :axes=\"axes\" />\n <VChip\n v-if=\"extraState\"\n :color=\"EXTRA_STATE_COLOR[extraState.tone]\"\n label\n size=\"small\"\n >\n {{ extraState.label }}: {{ extraState.value }}\n </VChip>\n <div\n v-if=\"user\"\n class=\"text-body-small text-medium-emphasis\"\n >\n {{ user.person.fullName }} · {{ user.email }}\n </div>\n <div\n v-if=\"descriptor.enabledNote\"\n class=\"text-body-small text-medium-emphasis w-100\"\n >\n {{ descriptor.enabledNote }}\n </div>\n <VSpacer />\n <AUserManageButton\n v-if=\"showManage && manageTarget\"\n :target=\"manageTarget\"\n :system-label=\"label\"\n />\n <AUserCreateInSystemButton\n v-if=\"showCreate\"\n :system-label=\"label\"\n :create-note=\"descriptor.createNote\"\n :will-be-enabled=\"createEnabled\"\n :loading=\"creating\"\n :required-metadata=\"descriptor.requiredMetadata\"\n :user-id=\"userId\"\n :source=\"source\"\n @confirm=\"(user) => emit('create', descriptor, user)\"\n />\n <VBtn\n v-if=\"canRetry\"\n size=\"small\"\n variant=\"text\"\n data-cy=\"user-system-retry\"\n @click=\"run\"\n >\n {{ t('common.userSystem.button.retry') }}\n </VBtn>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaA,IAAMyB,IAAQC,GAuBRC,IAAOH,GAIP,EAAE,SAAMI,EAAQ,GAGhBC,IAAcC,EAAOC,GAA0B,KAAA,CAAS,GAGxD,EAAE,SAAM,SAAM,UAAO,cAAWC,EAAmB;GAAE,YAAYP,EAAM;GAAY;EAAY,CAAC,GAGhGQ,IAAQC,QAAeT,EAAM,WAAW,SAASA,EAAM,WAAW,MAAM,GAOxEU,IAAaD,QAEfE,EAAK,MAAM,SAASC,EAAe,UACnCC,EAAK,UAAU,QACf,CAACC,EAAYd,EAAM,WAAW,MAAM,KACpCe,EAAmBf,EAAM,YAAY,QAAQ,CACjD,GACMgB,IAAaP,QACX,CAACT,EAAM,YAAYiB,EAAwBN,EAAK,KAAK,KAAKI,EAAmBf,EAAM,YAAY,QAAQ,CAC/G,GAEMkB,IAAeT,QACfI,EAAK,UAAU,QAAQC,EAAYd,EAAM,WAAW,MAAM,IAAU,OACjEA,EAAM,WAAW,OAAOa,EAAK,KAAK,CAC1C,GAEKM,IAAaV,QACbI,EAAK,UAAU,QAAQC,EAAYd,EAAM,WAAW,UAAU,IAAU,OACrEA,EAAM,WAAW,WAAWa,EAAK,KAAK,CAC9C,GAEKO,IAAoB;GAAE,IAAI;GAAW,MAAM;GAAW,OAAO;EAAQ,GAErEC,IAAWZ,QACTE,EAAK,MAAM,WAAWW,EAAiB,eAAeX,EAAK,MAAM,WAAWW,EAAiB,eACrG,GAEMC,UAAYC,EAAMxB,EAAM,MAAM;E,OAEpCyB,EAAUF,CAAG,GAIbG,QAAY1B,EAAM,QAAQuB,CAAG,GAE7BI,EAAgBC,CAAM,GAEtB9B,EAAa,EACX,SAASyB,EACX,CAAC,I,UAIChD,EAAA,GAAAC,EAoDM,OAAA;GAnDJ,OAAM;GACL,WAAO,qBAAuByB,EAAA,WAAW;;GAE1CxB,EAAiD,OAAjDiB,GAAiDhB,EAAd8B,EAAA,KAAK,GAAA,CAAA;GACxC7B,EAAsCC,GAAA,EAAd,MAAMC,EAAA8B,CAAA,EAAI,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA;GAE1BQ,EAAA,SADR5C,EAAA,GAAAO,EAOQC,GAAA;;IALL,OAAOqC,EAAkBD,EAAA,MAAW;IACrC,OAAA;IACA,MAAK;;IAEL,SAAAnC,QAAsB,CAAnBC,EAAAP,EAAAyC,EAAA,MAAW,KAAK,IAAG,OAAEzC,EAAGyC,EAAA,MAAW,KAAK,GAAA,CAAA,C;;;GAGrCtC,EAAAgC,CAAA,KADRtC,EAAA,GAAAC,EAKM,OALNmB,GAKMjB,EADDG,EAAAgC,CAAA,CAAI,CAAC,OAAO,QAAQ,IAAG,QAAGnC,EAAGG,EAAAgC,CAAA,CAAI,CAAC,KAAK,GAAA,CAAA,K;GAGpCZ,EAAA,WAAW,eADnB1B,EAAA,GAAAC,EAKM,OALNoB,GAKMlB,EADDuB,EAAA,WAAW,WAAW,GAAA,CAAA,K;GAE3BtB,EAAWO,CAAA;GAEHwB,EAAA,SAAcQ,EAAA,SADtB3C,EAAA,GAAAO,EAIEK,GAAA;;IAFC,QAAQ+B,EAAA;IACR,gBAAcV,EAAA;;GAGTQ,EAAA,SADRzC,EAAA,GAAAO,EAUEM,GAAA;;IARC,gBAAcoB,EAAA;IACd,eAAaP,EAAA,WAAW;IACxB,mBAAiBA,EAAA;IACjB,SAASA,EAAA;IACT,qBAAmBA,EAAA,WAAW;IAC9B,WAASA,EAAA;IACT,QAAQA,EAAA;IACR,WAAO,AAAAwC,EAAA,QAAG,MAASvC,EAAI,UAAWD,EAAA,YAAYY,CAAI;;;;;;;;;;GAG7CQ,EAAA,SADR9C,EAAA,GAAAO,EAQOO,GAAA;;IANL,MAAK;IACL,SAAQ;IACR,WAAQ;IACP,SAAOkC;;IAER,SAAAvC,QAAyC,CAAtCC,EAAAP,EAAAG,EAAA8D,CAAA,CAAC,CAAA,gCAAA,CAAA,GAAA,CAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserSystemStatusChip.js","names":["_sfc_main","AUserSystemStatusChip_vue_vue_type_script_setup_true_lang_default","AUserSystemStatusChip_default"],"sources":["../../../../src/domains/anzuUser/components/AUserSystemStatusChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n resolveUserSystemState,\n UserSystemState,\n type UserSystemAxes,\n type UserSystemStateType,\n} from '@/domains/anzuUser/utils/userSystemState'\n\nconst props = defineProps<{\n axes: UserSystemAxes\n}>()\n\nconst { t } = useI18n()\n\nconst state = computed<UserSystemStateType>(() => resolveUserSystemState(props.axes))\n\n/**\n * Shared appearance for the \"other systems\" table, cross-system rows, bulk-action rows and the log.\n * A text chip, not a tooltip: tooltips do not work on touch, cannot be scanned\n * down a column, and would make \"no account here\" and \"no access\" look alike.\n */\nconst APPEARANCE: Record<UserSystemStateType, { color: string; icon: string; muted: boolean }> = {\n [UserSystemState.Loading]: { color: 'default', icon: 'mdi-dots-horizontal', muted: true },\n [UserSystemState.Enabled]: { color: 'success', icon: 'mdi-check-circle-outline', muted: false },\n [UserSystemState.Disabled]: { color: 'warning', icon: 'mdi-alert-circle-outline', muted: false },\n [UserSystemState.Absent]: { color: 'default', icon: 'mdi-close-circle-outline', muted: false },\n [UserSystemState.Forbidden]: { color: 'default', icon: 'mdi-cancel', muted: false },\n [UserSystemState.Unavailable]: { color: 'error', icon: 'mdi-alert-outline', muted: false },\n [UserSystemState.ConfigDisabled]: { color: 'default', icon: 'mdi-cancel', muted: true },\n}\n\nconst appearance = computed(() => APPEARANCE[state.value])\n</script>\n\n<template>\n <VChip\n :color=\"appearance.color\"\n close-label=\"common.button.remove\"\n :prepend-icon=\"appearance.icon\"\n :class=\"{ 'text-disabled': appearance.muted }\"\n :data-cy=\"`user-system-state-${state}`\"\n label\n size=\"small\"\n >\n {{ t(`common.userSystem.state.${state}`) }}\n </VChip>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserSystemStatusChip.js","names":["AUserSystemStatusChip_vue_vue_type_script_setup_true_lang_default","AUserSystemStatusChip_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserTabsShell.js","names":["_sfc_main","AUserTabsShell_vue_vue_type_script_setup_true_lang_default","AUserTabsShell_default"],"sources":["../../../../src/domains/anzuUser/components/AUserTabsShell.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onMounted, provide, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\nimport { BulkOutcome } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport AUnsavedConfirmDialog from '@/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue'\nimport { useUnsavedChangesGuard } from '@/domains/unsavedGuard/composables/useUnsavedChangesGuard'\nimport AUserOtherSystemsTable from '@/domains/anzuUser/components/AUserOtherSystemsTable.vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { UserSystemRefreshHookKey, type UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { OTHER_SYSTEMS_TAB } from '@/domains/anzuUser/utils/userTabs'\n\nconst props = withDefaults(\n defineProps<{\n userId: IntegerId\n /** Which tab carries the owning form, i.e. gets the slot. */\n owner: string\n /**\n * The tabs in draw order. This component appends \"other systems\".\n * A prop, not derived from descriptors, because it depends on the route. admin-inhouse\n * owns four systems but has two tabs, since the system is part of the path.\n */\n ownedTabs: string[]\n /** Every system this admin can reach. The \"other systems\" tab lists the ones not in a tab. */\n descriptors: AnyUserSystemDescriptor[]\n /**\n * After a 401, refresh once and retry.\n * Each app refreshes differently (inhouse `refreshSession`, cms and contentHub a\n * `refresh-token` call), so the library cannot do it. Without it an expired token shows as \"no\n * account in this system\", which decision 16 forbids. Every panel in this shell receives it.\n */\n refreshHook?: UserSystemRefreshHook | undefined\n readonly?: boolean\n /**\n * Whether the owning form has unsaved edits.\n * It drives the dot on the owning tab. The Save button stays visible\n * everywhere, because a hidden button would read as read-only.\n * It also drives the leave guard. Switching tabs is not navigation,\n * so nothing else asks before a panel button leaves the page.\n */\n unsavedChanges?: boolean\n tabQueryKey?: string\n }>(),\n {\n refreshHook: undefined,\n readonly: false,\n unsavedChanges: false,\n tabQueryKey: 'tab',\n }\n)\n\nconst emit = defineEmits<{\n /** After an account was created in another system, so a page can react if it wants to. */\n (e: 'created', descriptor: AnyUserSystemDescriptor): void\n}>()\n\nconst activeTab = defineModel<string>('activeTab', { required: false, default: '' })\n\nconst { t } = useI18n()\nconst route = useRoute()\nconst router = useRouter()\n\nconst bySystem = computed(() => new Map(props.descriptors.map((item) => [item.system, item])))\n\nconst tabs = computed(() => [...props.ownedTabs, OTHER_SYSTEMS_TAB])\n\nconst otherDescriptors = computed(() => props.descriptors.filter((item) => !props.ownedTabs.includes(item.system)))\n\nconst labelFor = (system: string) => bySystem.value.get(system)?.label ?? system\n\nconst isValidTab = (value: unknown): value is string => typeof value === 'string' && tabs.value.includes(value)\n\nonMounted(() => {\n const fromUrl = route.query[props.tabQueryKey]\n // An unknown tab, for example a system removed from the configuration\n // since the link was sent, is ignored silently and the owning tab opens.\n activeTab.value = isValidTab(fromUrl) ? fromUrl : props.owner\n})\n\nwatch(activeTab, (value) => {\n if (!isValidTab(value)) return\n // `replace`, not `push`: with `push` the back button would walk through the tabs instead of\n // leaving the page.\n void router.replace({ query: { ...route.query, [props.tabQueryKey]: value } })\n})\n\n/**\n * Registered here, not in the page, because an internal \"manage in X\" link inside a\n * panel leaves from here and `onBeforeRouteLeave` must be bound inside the route.\n * An external link opens a new tab and needs no guard.\n */\nconst unsavedSource = computed(() => props.unsavedChanges)\nconst { hasUnsavedChanges, dirtyLabels, promptOpen, resolvePrompt } = useUnsavedChangesGuard({\n sources: [unsavedSource],\n})\n\nconst otherSystems = ref<InstanceType<typeof AUserOtherSystemsTable> | null>(null)\nconst ownedPanels = ref<InstanceType<typeof AUserSystemPanel>[]>([])\n\n/**\n * Creating this person's account in another system.\n * Handled here because the panel offering it lives here and the\n * operation belongs to the library. The page would only pass it through.\n */\nconst writes = useUserCrossSystemWrites()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst { showError, showRecordWas } = useAlerts()\n\n// Provide only when present. Providing `undefined` explicitly would signal a hook to code that only checks for the key.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isUndefined(props.refreshHook)) provide(UserSystemRefreshHookKey, props.refreshHook)\n\nconst ownerDescriptor = computed(() => bySystem.value.get(props.owner))\n/**\n * The owning system's record as the server holds it, not as the form does.\n * Read together with the panels, so the owning tab costs nothing, and read again before each POST. An unsaved\n * switch in the form must not be copied, because in blog and forum it would mean a working public account.\n */\nconst sourceUser = ref<AnzuUser | null>(null)\nconst creatingSystem = ref<string | null>(null)\n\nconst loadSource = async () => {\n const descriptor = ownerDescriptor.value\n if (isUndefined(descriptor)) return\n sourceUser.value = await writes.readSourceUser(descriptor, props.userId)\n}\n\n/** Copying a person into another system copies whether they are switched on. Roles stay empty. */\nconst createEnabled = computed(() => sourceUser.value?.enabled === true)\n\nconst onCreate = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const owner = ownerDescriptor.value\n if (isUndefined(owner)) return\n creatingSystem.value = descriptor.system\n try {\n const source = await writes.readSourceUser(owner, props.userId)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(owner.system) }))\n return\n }\n // The dialog already promised \"created ready to use\" or \"created switched off\" from the earlier read. If the\n // server now disagrees, the promise was wrong, and in blog and forum that means a working public account.\n // Usually the first read failed, leaving `sourceUser` null and the dialog saying \"disabled\"\n // for an enabled account. Nothing is written until the corrected row is confirmed again.\n if (source.enabled !== createEnabled.value) {\n sourceUser.value = source\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Built by the library factory, never by hand. A body of base fields\n // alone makes the backend add `ROLE_USER`, a role nobody granted.\n // Metadata comes from the dialog, validated against the target's profile. The source may leave fields empty\n // (blog never fills `person`) that the target requires. The id and `enabled` come from the fresh read.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n if (result.outcome !== BulkOutcome.Done) {\n // Without this message the failure looked like success: the\n // re-probed row still said \"absent\" with no explanation.\n showError(labelFor(descriptor.system) + ': ' + t('common.userSystem.bulk.outcome.' + result.outcome))\n return\n }\n showRecordWas('created')\n emit('created', descriptor)\n otherSystems.value?.refreshSystem(descriptor.system)\n ownedPanels.value.forEach((panel) => panel?.refresh())\n } finally {\n creatingSystem.value = null\n }\n}\n\n/**\n * Called by the page after the owning form saved.\n * `VWindowItem` hides panels with `v-show`, so a mounted panel never re-fetches by itself. Without\n * this it shows pre-save data, and create-in-another-system would copy that stale snapshot.\n * Not a refetch on every tab activation: that would cost eight calls per tab switch.\n */\nconst refresh = () => {\n void loadSource()\n otherSystems.value?.refresh()\n ownedPanels.value.forEach((panel) => panel?.refresh())\n}\n\n// Read on the first activation of a non-owning tab, so the owning tab makes no foreign call.\nwatch(\n activeTab,\n (value) => {\n // `isValidTab` first: before mount settles, the model is an empty string.\n // Treating it as a non-owning tab would fetch on the owning tab too.\n if (!isValidTab(value) || value === props.owner) return\n if (isNull(sourceUser.value)) void loadSource()\n },\n { immediate: true }\n)\n\ndefineExpose({ refresh })\n</script>\n\n<template>\n <div>\n <!--\n No tab navigates. Tabs only switch content, and leaving the page is done by the Manage\n anchor inside a panel. `VTab` renders `role=\"tab\"` and cannot carry navigation semantically.\n -->\n <VTabs\n v-model=\"activeTab\"\n data-cy=\"user-tabs\"\n >\n <VTab\n v-for=\"tab in tabs\"\n :key=\"tab\"\n :value=\"tab\"\n :data-cy=\"`user-tab-${tab}`\"\n >\n {{ tab === OTHER_SYSTEMS_TAB ? t('common.userSystem.tab.otherSystems') : labelFor(tab) }}\n <!-- The owning tab says it holds unsaved work; the Save button itself is always visible. -->\n <VIcon\n v-if=\"tab === owner && hasUnsavedChanges\"\n class=\"ml-1\"\n size=\"x-small\"\n color=\"warning\"\n icon=\"mdi-circle\"\n data-cy=\"user-tab-unsaved\"\n />\n </VTab>\n </VTabs>\n <VWindow\n v-model=\"activeTab\"\n class=\"mt-4\"\n >\n <VWindowItem\n v-for=\"tab in ownedTabs\"\n :key=\"tab\"\n :value=\"tab\"\n >\n <!-- The owning system of the current route: the full form. -->\n <slot v-if=\"tab === owner\" />\n <!--\n Another system this admin owns whose route is not open: a probe\n with a summary and a Manage button, like any other system.\n -->\n <AUserSystemPanel\n v-else-if=\"!isUndefined(bySystem.get(tab))\"\n ref=\"ownedPanels\"\n :descriptor=\"bySystem.get(tab)!\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"sourceUser\"\n :creating=\"creatingSystem === tab\"\n @create=\"onCreate\"\n />\n </VWindowItem>\n <VWindowItem :value=\"OTHER_SYSTEMS_TAB\">\n <!-- `VWindowItem` renders content on first activation, so opening a user makes no foreign calls. -->\n <AUserOtherSystemsTable\n ref=\"otherSystems\"\n :descriptors=\"otherDescriptors\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"sourceUser\"\n :creating-system=\"creatingSystem\"\n @create=\"onCreate\"\n />\n </VWindowItem>\n </VWindow>\n <AUnsavedConfirmDialog\n v-model=\"promptOpen\"\n :dirty-labels=\"dirtyLabels\"\n @resolve=\"resolvePrompt\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserTabsShell.js","names":["AUserTabsShell_vue_vue_type_script_setup_true_lang_default","AUserTabsShell_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserTabsShell.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_createVNode","_component_VTabs","_withCtx","_Fragment","_renderList","_createBlock","_component_VTab","_createTextVNode","_toDisplayString","_unref","_component_VIcon","_createCommentVNode","_component_VWindow","_component_VWindowItem","_renderSlot","AUserSystemPanel","AUserOtherSystemsTable","AUnsavedConfirmDialog","_isRef","AUnsavedConfirmDialog_default","AUserOtherSystemsTable_default","AUserSystemPanel_default","AUserTabsShell_vue_vue_type_script_setup_true_lang_default","\"activeTab\"","\"activeTabModifiers\"","__expose","__emit","props","__props","emit","activeTab","useModel","useI18n","route","useRoute","router","useRouter","bySystem","computed","item","tabs","OTHER_SYSTEMS_TAB","otherDescriptors","labelFor","system","isValidTab","value","onMounted","fromUrl","watch","unsavedSource","useUnsavedChangesGuard","otherSystems","ref","ownedPanels","writes","useUserCrossSystemWrites","useAnzuUserFactory","useAlerts","isUndefined","provide","UserSystemRefreshHookKey","ownerDescriptor","sourceUser","creatingSystem","loadSource","descriptor","createEnabled","onCreate","owner","source","isNull","t","showError","descriptorMayWrite","body","createAnzuUser","metadata","cloneDeep","result","BulkOutcome","showRecordWas","panel","openBlock","createElementBlock","createVNode","VTabs","_cache","$event","withCtx","Fragment","renderList","createBlock","VTab","tab","createTextVNode","toDisplayString","unref","hasUnsavedChanges","VIcon","createCommentVNode","VWindow","VWindowItem","renderSlot","_ctx","promptOpen","isRef","dirtyLabels","resolvePrompt"],"sources":["../../../../src/domains/anzuUser/components/AUserTabsShell.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onMounted, provide, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\nimport { BulkOutcome } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport AUnsavedConfirmDialog from '@/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue'\nimport { useUnsavedChangesGuard } from '@/domains/unsavedGuard/composables/useUnsavedChangesGuard'\nimport AUserOtherSystemsTable from '@/domains/anzuUser/components/AUserOtherSystemsTable.vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { UserSystemRefreshHookKey, type UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { OTHER_SYSTEMS_TAB } from '@/domains/anzuUser/utils/userTabs'\n\nconst props = withDefaults(\n defineProps<{\n userId: IntegerId\n /** Which tab carries the owning form, i.e. gets the slot. */\n owner: string\n /**\n * The tabs in draw order. This component appends \"other systems\".\n * A prop, not derived from descriptors, because it depends on the route. admin-inhouse\n * owns four systems but has two tabs, since the system is part of the path.\n */\n ownedTabs: string[]\n /** Every system this admin can reach. The \"other systems\" tab lists the ones not in a tab. */\n descriptors: AnyUserSystemDescriptor[]\n /**\n * After a 401, refresh once and retry.\n * Each app refreshes differently (inhouse `refreshSession`, cms and contentHub a\n * `refresh-token` call), so the library cannot do it. Without it an expired token shows as \"no\n * account in this system\", which decision 16 forbids. Every panel in this shell receives it.\n */\n refreshHook?: UserSystemRefreshHook | undefined\n readonly?: boolean\n /**\n * Whether the owning form has unsaved edits.\n * It drives the dot on the owning tab. The Save button stays visible\n * everywhere, because a hidden button would read as read-only.\n * It also drives the leave guard. Switching tabs is not navigation,\n * so nothing else asks before a panel button leaves the page.\n */\n unsavedChanges?: boolean\n tabQueryKey?: string\n }>(),\n {\n refreshHook: undefined,\n readonly: false,\n unsavedChanges: false,\n tabQueryKey: 'tab',\n }\n)\n\nconst emit = defineEmits<{\n /** After an account was created in another system, so a page can react if it wants to. */\n (e: 'created', descriptor: AnyUserSystemDescriptor): void\n}>()\n\nconst activeTab = defineModel<string>('activeTab', { required: false, default: '' })\n\nconst { t } = useI18n()\nconst route = useRoute()\nconst router = useRouter()\n\nconst bySystem = computed(() => new Map(props.descriptors.map((item) => [item.system, item])))\n\nconst tabs = computed(() => [...props.ownedTabs, OTHER_SYSTEMS_TAB])\n\nconst otherDescriptors = computed(() => props.descriptors.filter((item) => !props.ownedTabs.includes(item.system)))\n\nconst labelFor = (system: string) => bySystem.value.get(system)?.label ?? system\n\nconst isValidTab = (value: unknown): value is string => typeof value === 'string' && tabs.value.includes(value)\n\nonMounted(() => {\n const fromUrl = route.query[props.tabQueryKey]\n // An unknown tab, for example a system removed from the configuration\n // since the link was sent, is ignored silently and the owning tab opens.\n activeTab.value = isValidTab(fromUrl) ? fromUrl : props.owner\n})\n\nwatch(activeTab, (value) => {\n if (!isValidTab(value)) return\n // `replace`, not `push`: with `push` the back button would walk through the tabs instead of\n // leaving the page.\n void router.replace({ query: { ...route.query, [props.tabQueryKey]: value } })\n})\n\n/**\n * Registered here, not in the page, because an internal \"manage in X\" link inside a\n * panel leaves from here and `onBeforeRouteLeave` must be bound inside the route.\n * An external link opens a new tab and needs no guard.\n */\nconst unsavedSource = computed(() => props.unsavedChanges)\nconst { hasUnsavedChanges, dirtyLabels, promptOpen, resolvePrompt } = useUnsavedChangesGuard({\n sources: [unsavedSource],\n})\n\nconst otherSystems = ref<InstanceType<typeof AUserOtherSystemsTable> | null>(null)\nconst ownedPanels = ref<InstanceType<typeof AUserSystemPanel>[]>([])\n\n/**\n * Creating this person's account in another system.\n * Handled here because the panel offering it lives here and the\n * operation belongs to the library. The page would only pass it through.\n */\nconst writes = useUserCrossSystemWrites()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst { showError, showRecordWas } = useAlerts()\n\n// Provide only when present. Providing `undefined` explicitly would signal a hook to code that only checks for the key.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isUndefined(props.refreshHook)) provide(UserSystemRefreshHookKey, props.refreshHook)\n\nconst ownerDescriptor = computed(() => bySystem.value.get(props.owner))\n/**\n * The owning system's record as the server holds it, not as the form does.\n * Read together with the panels, so the owning tab costs nothing, and read again before each POST. An unsaved\n * switch in the form must not be copied, because in blog and forum it would mean a working public account.\n */\nconst sourceUser = ref<AnzuUser | null>(null)\nconst creatingSystem = ref<string | null>(null)\n\nconst loadSource = async () => {\n const descriptor = ownerDescriptor.value\n if (isUndefined(descriptor)) return\n sourceUser.value = await writes.readSourceUser(descriptor, props.userId)\n}\n\n/** Copying a person into another system copies whether they are switched on. Roles stay empty. */\nconst createEnabled = computed(() => sourceUser.value?.enabled === true)\n\nconst onCreate = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const owner = ownerDescriptor.value\n if (isUndefined(owner)) return\n creatingSystem.value = descriptor.system\n try {\n const source = await writes.readSourceUser(owner, props.userId)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(owner.system) }))\n return\n }\n // The dialog already promised \"created ready to use\" or \"created switched off\" from the earlier read. If the\n // server now disagrees, the promise was wrong, and in blog and forum that means a working public account.\n // Usually the first read failed, leaving `sourceUser` null and the dialog saying \"disabled\"\n // for an enabled account. Nothing is written until the corrected row is confirmed again.\n if (source.enabled !== createEnabled.value) {\n sourceUser.value = source\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Built by the library factory, never by hand. A body of base fields\n // alone makes the backend add `ROLE_USER`, a role nobody granted.\n // Metadata comes from the dialog, validated against the target's profile. The source may leave fields empty\n // (blog never fills `person`) that the target requires. The id and `enabled` come from the fresh read.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n if (result.outcome !== BulkOutcome.Done) {\n // Without this message the failure looked like success: the\n // re-probed row still said \"absent\" with no explanation.\n showError(labelFor(descriptor.system) + ': ' + t('common.userSystem.bulk.outcome.' + result.outcome))\n return\n }\n showRecordWas('created')\n emit('created', descriptor)\n otherSystems.value?.refreshSystem(descriptor.system)\n ownedPanels.value.forEach((panel) => panel?.refresh())\n } finally {\n creatingSystem.value = null\n }\n}\n\n/**\n * Called by the page after the owning form saved.\n * `VWindowItem` hides panels with `v-show`, so a mounted panel never re-fetches by itself. Without\n * this it shows pre-save data, and create-in-another-system would copy that stale snapshot.\n * Not a refetch on every tab activation: that would cost eight calls per tab switch.\n */\nconst refresh = () => {\n void loadSource()\n otherSystems.value?.refresh()\n ownedPanels.value.forEach((panel) => panel?.refresh())\n}\n\n// Read on the first activation of a non-owning tab, so the owning tab makes no foreign call.\nwatch(\n activeTab,\n (value) => {\n // `isValidTab` first: before mount settles, the model is an empty string.\n // Treating it as a non-owning tab would fetch on the owning tab too.\n if (!isValidTab(value) || value === props.owner) return\n if (isNull(sourceUser.value)) void loadSource()\n },\n { immediate: true }\n)\n\ndefineExpose({ refresh })\n</script>\n\n<template>\n <div>\n <!--\n No tab navigates. Tabs only switch content, and leaving the page is done by the Manage\n anchor inside a panel. `VTab` renders `role=\"tab\"` and cannot carry navigation semantically.\n -->\n <VTabs\n v-model=\"activeTab\"\n data-cy=\"user-tabs\"\n >\n <VTab\n v-for=\"tab in tabs\"\n :key=\"tab\"\n :value=\"tab\"\n :data-cy=\"`user-tab-${tab}`\"\n >\n {{ tab === OTHER_SYSTEMS_TAB ? t('common.userSystem.tab.otherSystems') : labelFor(tab) }}\n <!-- The owning tab says it holds unsaved work; the Save button itself is always visible. -->\n <VIcon\n v-if=\"tab === owner && hasUnsavedChanges\"\n class=\"ml-1\"\n size=\"x-small\"\n color=\"warning\"\n icon=\"mdi-circle\"\n data-cy=\"user-tab-unsaved\"\n />\n </VTab>\n </VTabs>\n <VWindow\n v-model=\"activeTab\"\n class=\"mt-4\"\n >\n <VWindowItem\n v-for=\"tab in ownedTabs\"\n :key=\"tab\"\n :value=\"tab\"\n >\n <!-- The owning system of the current route: the full form. -->\n <slot v-if=\"tab === owner\" />\n <!--\n Another system this admin owns whose route is not open: a probe\n with a summary and a Manage button, like any other system.\n -->\n <AUserSystemPanel\n v-else-if=\"!isUndefined(bySystem.get(tab))\"\n ref=\"ownedPanels\"\n :descriptor=\"bySystem.get(tab)!\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"sourceUser\"\n :creating=\"creatingSystem === tab\"\n @create=\"onCreate\"\n />\n </VWindowItem>\n <VWindowItem :value=\"OTHER_SYSTEMS_TAB\">\n <!-- `VWindowItem` renders content on first activation, so opening a user makes no foreign calls. -->\n <AUserOtherSystemsTable\n ref=\"otherSystems\"\n :descriptors=\"otherDescriptors\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"sourceUser\"\n :creating-system=\"creatingSystem\"\n @create=\"onCreate\"\n />\n </VWindowItem>\n </VWindow>\n <AUnsavedConfirmDialog\n v-model=\"promptOpen\"\n :dirty-labels=\"dirtyLabels\"\n @resolve=\"resolvePrompt\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,IAAM8B,IAAQC,GAuCRC,IAAOH,GAKPI,IAAYjC,EAAmB+B,GAAC,WAA6C,GAE7E,EAAE,SAAMI,GAAQ,GAChBC,IAAQC,EAAS,GACjBC,IAASC,EAAU,GAEnBC,IAAWC,QAAe,IAAI,IAAIX,EAAM,YAAY,KAAK,MAAS,CAACY,EAAK,QAAQA,CAAI,CAAC,CAAC,CAAC,GAEvFC,IAAOF,QAAe,CAAC,GAAGX,EAAM,WAAWc,CAAiB,CAAC,GAE7DC,IAAmBJ,QAAeX,EAAM,YAAY,QAAQ,MAAS,CAACA,EAAM,UAAU,SAASY,EAAK,MAAM,CAAC,CAAC,GAE5GI,KAAY,MAAmBN,EAAS,MAAM,IAAIO,CAAM,CAAC,EAAE,SAASA,GAEpEC,KAAc,MAAoC,OAAOC,KAAU,YAAYN,EAAK,MAAM,SAASM,CAAK;EAS9G,AAPAC,SAAgB;GACd,IAAMC,IAAUf,EAAM,MAAMN,EAAM;GAGlC,EAAU,QAAQkB,EAAWG,CAAO,IAAIA,IAAUrB,EAAM;EAC1D,CAAC,GAEDsB,EAAMnB,IAAY,MAAU;GAC1B,AAAKe,EAAWC,CAAK,KAGrBX,EAAY,QAAQ,EAAE,OAAO;IAAE,GAAGF,EAAM;KAAQN,EAAM,cAAcmB;GAAM,EAAE,CAAC;EAC/E,CAAC;EAOD,IAAMI,KAAgBZ,QAAeX,EAAM,cAAc,GACnD,EAAE,uBAAmB,iBAAa,eAAY,sBAAkBwB,EAAuB,EAC3F,SAAS,CAACD,EAAa,EACzB,CAAC,GAEKE,IAAeC,EAAwD,IAAI,GAC3EC,IAAcD,EAA6C,CAAC,CAAC,GAO7DE,IAASC,EAAyB,GAClC,EAAE,uBAAmBC,EAAmB,GACxC,EAAE,cAAW,sBAAkBC,EAAU;EAI/C,AAAKC,EAAYhC,EAAM,WAAW,KAAGiC,GAAQC,IAA0BlC,EAAM,WAAW;EAExF,IAAMmC,IAAkBxB,QAAeD,EAAS,MAAM,IAAIV,EAAM,KAAK,CAAC,GAMhEoC,IAAaV,EAAqB,IAAI,GACtCW,IAAiBX,EAAmB,IAAI,GAExCY,IAAa,YAAY;GAC7B,IAAMC,IAAaJ,EAAgB;GACnC,AAAIH,EAAYO,CAAU,MAC1B,EAAW,QAAQ,MAAMX,EAAO,eAAeW,GAAYvC,EAAM,MAAM;EACzE,GAGMwC,IAAgB7B,QAAeyB,EAAW,OAAO,YAAY,EAAI,GAEjEK,IAAW,OAAO,GAAqC,MAAuB;GAClF,IAAMC,IAAQP,EAAgB;GAC9B,IAAI,GAAYO,CAAK,GACrB;MAAe,QAAQH,EAAW;IAClC,IAAI;KACF,IAAMI,IAAS,MAAMf,EAAO,eAAec,GAAO1C,EAAM,MAAM;KAC9D,IAAI4C,EAAOD,CAAM,GAAG;MAClB,EAAUE,EAAE,6CAA6C,EAAE,QAAQ7B,EAAS0B,EAAM,MAAM,EAAE,CAAC,CAAC;MAC5F;KACF;KAKA,IAAIC,EAAO,YAAYH,EAAc,OAAO;MAE1C,AADA,EAAW,QAAQG,GACnBG,EAAUD,EAAE,wCAAwC,CAAC;MACrD;KACF;KAEA,IAAI,CAACE,EAAmBR,GAAY,QAAQ,GAAG;KAK/C,IAAMS,IAAOC,GAAeV,EAAW,MAAM;KAK7C,AAJA,EAAK,KAAKI,EAAO,IACjB,EAAK,QAAQO,EAAS,OACtB,EAAK,SAASC,EAAUD,EAAS,MAAM,GACvC,EAAK,SAASC,EAAUD,EAAS,MAAM,GACvC,EAAK,UAAUP,EAAO;KACtB,IAAMS,IAAS,MAAMxB,EAAO,eAAeW,GAAYS,CAAI;KAC3D,IAAII,EAAO,YAAYC,EAAY,MAAM;MAGvC,EAAUrC,EAASuB,EAAW,MAAM,IAAI,OAAOM,EAAE,oCAAoCO,EAAO,OAAO,CAAC;MACpG;KACF;KAIA,AAHAE,GAAc,SAAS,GACvBpD,EAAK,WAAWqC,CAAU,GAC1Bd,EAAa,OAAO,cAAcc,EAAW,MAAM,GACnDZ,EAAY,MAAM,SAAS,MAAU4B,GAAO,QAAQ,CAAC;IACvD,UAAU;KACR,EAAe,QAAQ;IACzB;GAzCkC;EA0CpC;E,OAeAjC,EACEnB,IACC,MAAU;GAGT,AAAKe,EAAWC,CAAK,KAAKA,MAAUnB,EAAM,SACtC4C,EAAOR,EAAW,KAAK,KAAGE,EAAgB;EAChD,GACA,EAAE,WAAW,GAAK,CACpB,GAEAxC,EAAa,EAAE,eAlBO;GAGpB,AAFAwC,EAAgB,GAChBb,EAAa,OAAO,QAAQ,GAC5BE,EAAY,MAAM,SAAS,MAAU4B,GAAO,QAAQ,CAAC;EACvD,EAcuB,CAAC,I,UAItBpF,EAAA,GAAAC,EAyEM,OAAA,MAAA;GApEJC,EAqBQC,IAAA;IApBG,YAAA6B,EAAA;IAAA,uBAAA,AAAAyD,EAAA,QAAA,MAAA,EAAS,QAAAC;IAClB,WAAQ;;IAGN,SAAAtF,QAAmB,EADrBJ,EAAA,EAAA,GAAAC,EAgBOI,GAAA,MAAAC,EAfSoC,EAAA,QAAP,OADT1C,EAAA,GAAAO,EAgBOC,GAAA;KAdJ,KAAKwF;KACL,OAAOA;KACP,WAAO,YAAcA;;KAEtB,SAAA5F,QAAyF,CAAtFK,GAAAC,GAAAsF,MAAQrF,EAAAA,gBAAA,IAAoBA,EAAA+D,CAAA,CAAC,CAAA,oCAAA,IAAyC7B,EAASmD,CAAG,CAAA,IAAI,KAEzF,CAAA,GACQA,MAAQlE,EAAA,SAASnB,EAAAyF,EAAA,KADzBpG,EAAA,GAAAO,EAOEK,IAAA;;MALA,OAAM;MACN,MAAK;MACL,OAAM;MACN,MAAK;MACL,WAAQ;;;;;;GAIdV,EAwCUY,IAAA;IAvCC,YAAAkB,EAAA;IAAA,uBAAA,AAAAyD,EAAA,QAAA,MAAA,EAAS,QAAAC;IAClB,OAAM;;IAGJ,SAAAtF,QAAwB,EAD1BJ,EAAA,EAAA,GAAAC,EAsBcI,GAAA,MAAAC,EArBEwB,EAAA,YAAP,OADT9B,EAAA,GAAAO,EAsBcQ,GAAA;KApBX,KAAKiF;KACL,OAAOA;;KAGR,SAAA5F,QAA6B,CAAjB4F,MAAQlE,EAAA,QAApBd,GAA6B0F,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAMf/F,EAAAkD,CAAA,CAAW,CAACtB,EAAA,MAAS,IAAIyD,CAAG,CAAA,I,aAD1ChG,EAAA,GAAAO,EAUEU,IAAA;;;MARI,SAAA;MAAJ,KAAIuC;MACH,YAAYjB,EAAA,MAAS,IAAIyD,CAAG;MAC5B,WAASlE,EAAA;MACT,UAAUA,EAAA;MACV,kBAAgBuC,EAAA;MAChB,QAAQJ,EAAA;MACR,UAAUC,EAAA,UAAmB8B;MACrB;;;;;;;;;;I,8BAGb9F,EAYca,GAAA,EAZA,OAAOJ,EAAAgC,CAAA,EAAiB,GAAA;KAEpC,SAAAvC,QASE,CATFF,EASEgB,IAAA;MARI,SAAA;MAAJ,KAAIoC;MACH,aAAaV,EAAA;MACb,WAASd,EAAA;MACT,UAAUA,EAAA;MACV,kBAAgBuC,EAAA;MAChB,QAAQJ,EAAA;MACR,mBAAiBC,EAAA;MACT;;;;;;;;;;;;;GAIfhE,EAIEiB,GAAA;IAHS,YAAAR,EAAAgG,CAAA;IAAA,uBAAA,AAAAlB,EAAA,QAAA,MAAArE,EAAAuF,CAAA,IAAA,EAAU,QAAAjB,IAAA;IAClB,gBAAc/E,EAAAkG,EAAA;IACd,WAASlG,EAAAmG,EAAA"}
1
+ {"version":3,"file":"AUserTabsShell.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_createVNode","_component_VTabs","_withCtx","_Fragment","_renderList","_createBlock","_component_VTab","_createTextVNode","_toDisplayString","_unref","_component_VIcon","_component_VWindow","_component_VWindowItem","_renderSlot","AUserSystemPanel","AUserOtherSystemsTable","AUnsavedConfirmDialog","_isRef","AUnsavedConfirmDialog_default","AUserOtherSystemsTable_default","AUserSystemPanel_default","AUserTabsShell_vue_vue_type_script_setup_true_lang_default","\"activeTab\"","\"activeTabModifiers\"","__expose","__emit","props","__props","emit","activeTab","useModel","useI18n","route","useRoute","router","useRouter","bySystem","computed","item","tabs","OTHER_SYSTEMS_TAB","otherDescriptors","labelFor","system","isValidTab","value","onMounted","fromUrl","watch","unsavedSource","useUnsavedChangesGuard","otherSystems","ref","ownedPanels","writes","useUserCrossSystemWrites","useAnzuUserFactory","useAlerts","isUndefined","provide","UserSystemRefreshHookKey","ownerDescriptor","sourceUser","creatingSystem","loadSource","descriptor","createEnabled","onCreate","owner","source","isNull","t","showError","descriptorMayWrite","body","createAnzuUser","metadata","cloneDeep","result","BulkOutcome","showRecordWas","panel","openBlock","createElementBlock","createVNode","VTabs","_cache","$event","withCtx","Fragment","renderList","createBlock","VTab","tab","createTextVNode","toDisplayString","unref","hasUnsavedChanges","VIcon","createCommentVNode","VWindow","VWindowItem","renderSlot","_ctx","promptOpen","isRef","dirtyLabels","resolvePrompt"],"sources":["../../../../src/domains/anzuUser/components/AUserTabsShell.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, onMounted, provide, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { useAnzuUserFactory } from '@/domains/anzuUser/factory/AnzuUserFactory'\nimport { cloneDeep, isNull, isUndefined } from '@/shared/utils/common'\nimport { BulkOutcome } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport { useUserCrossSystemWrites } from '@/domains/anzuUser/composables/userCrossSystemWrites'\nimport AUnsavedConfirmDialog from '@/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue'\nimport { useUnsavedChangesGuard } from '@/domains/unsavedGuard/composables/useUnsavedChangesGuard'\nimport AUserOtherSystemsTable from '@/domains/anzuUser/components/AUserOtherSystemsTable.vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { AnzuUser, BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\nimport { UserSystemRefreshHookKey, type UserSystemRefreshHook } from '@/domains/anzuUser/composables/userSystemProbe'\nimport { OTHER_SYSTEMS_TAB } from '@/domains/anzuUser/utils/userTabs'\n\nconst props = withDefaults(\n defineProps<{\n userId: IntegerId\n /** Which tab carries the owning form, i.e. gets the slot. */\n owner: string\n /**\n * The tabs in draw order. This component appends \"other systems\".\n * A prop, not derived from descriptors, because it depends on the route. admin-inhouse\n * owns four systems but has two tabs, since the system is part of the path.\n */\n ownedTabs: string[]\n /** Every system this admin can reach. The \"other systems\" tab lists the ones not in a tab. */\n descriptors: AnyUserSystemDescriptor[]\n /**\n * After a 401, refresh once and retry.\n * Each app refreshes differently (inhouse `refreshSession`, cms and contentHub a\n * `refresh-token` call), so the library cannot do it. Without it an expired token shows as \"no\n * account in this system\", which decision 16 forbids. Every panel in this shell receives it.\n */\n refreshHook?: UserSystemRefreshHook | undefined\n readonly?: boolean\n /**\n * Whether the owning form has unsaved edits.\n * It drives the dot on the owning tab. The Save button stays visible\n * everywhere, because a hidden button would read as read-only.\n * It also drives the leave guard. Switching tabs is not navigation,\n * so nothing else asks before a panel button leaves the page.\n */\n unsavedChanges?: boolean\n tabQueryKey?: string\n }>(),\n {\n refreshHook: undefined,\n readonly: false,\n unsavedChanges: false,\n tabQueryKey: 'tab',\n }\n)\n\nconst emit = defineEmits<{\n /** After an account was created in another system, so a page can react if it wants to. */\n (e: 'created', descriptor: AnyUserSystemDescriptor): void\n}>()\n\nconst activeTab = defineModel<string>('activeTab', { required: false, default: '' })\n\nconst { t } = useI18n()\nconst route = useRoute()\nconst router = useRouter()\n\nconst bySystem = computed(() => new Map(props.descriptors.map((item) => [item.system, item])))\n\nconst tabs = computed(() => [...props.ownedTabs, OTHER_SYSTEMS_TAB])\n\nconst otherDescriptors = computed(() => props.descriptors.filter((item) => !props.ownedTabs.includes(item.system)))\n\nconst labelFor = (system: string) => bySystem.value.get(system)?.label ?? system\n\nconst isValidTab = (value: unknown): value is string => typeof value === 'string' && tabs.value.includes(value)\n\nonMounted(() => {\n const fromUrl = route.query[props.tabQueryKey]\n // An unknown tab, for example a system removed from the configuration\n // since the link was sent, is ignored silently and the owning tab opens.\n activeTab.value = isValidTab(fromUrl) ? fromUrl : props.owner\n})\n\nwatch(activeTab, (value) => {\n if (!isValidTab(value)) return\n // `replace`, not `push`: with `push` the back button would walk through the tabs instead of\n // leaving the page.\n void router.replace({ query: { ...route.query, [props.tabQueryKey]: value } })\n})\n\n/**\n * Registered here, not in the page, because an internal \"manage in X\" link inside a\n * panel leaves from here and `onBeforeRouteLeave` must be bound inside the route.\n * An external link opens a new tab and needs no guard.\n */\nconst unsavedSource = computed(() => props.unsavedChanges)\nconst { hasUnsavedChanges, dirtyLabels, promptOpen, resolvePrompt } = useUnsavedChangesGuard({\n sources: [unsavedSource],\n})\n\nconst otherSystems = ref<InstanceType<typeof AUserOtherSystemsTable> | null>(null)\nconst ownedPanels = ref<InstanceType<typeof AUserSystemPanel>[]>([])\n\n/**\n * Creating this person's account in another system.\n * Handled here because the panel offering it lives here and the\n * operation belongs to the library. The page would only pass it through.\n */\nconst writes = useUserCrossSystemWrites()\nconst { createAnzuUser } = useAnzuUserFactory()\nconst { showError, showRecordWas } = useAlerts()\n\n// Provide only when present. Providing `undefined` explicitly would signal a hook to code that only checks for the key.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isUndefined(props.refreshHook)) provide(UserSystemRefreshHookKey, props.refreshHook)\n\nconst ownerDescriptor = computed(() => bySystem.value.get(props.owner))\n/**\n * The owning system's record as the server holds it, not as the form does.\n * Read together with the panels, so the owning tab costs nothing, and read again before each POST. An unsaved\n * switch in the form must not be copied, because in blog and forum it would mean a working public account.\n */\nconst sourceUser = ref<AnzuUser | null>(null)\nconst creatingSystem = ref<string | null>(null)\n\nconst loadSource = async () => {\n const descriptor = ownerDescriptor.value\n if (isUndefined(descriptor)) return\n sourceUser.value = await writes.readSourceUser(descriptor, props.userId)\n}\n\n/** Copying a person into another system copies whether they are switched on. Roles stay empty. */\nconst createEnabled = computed(() => sourceUser.value?.enabled === true)\n\nconst onCreate = async (descriptor: AnyUserSystemDescriptor, metadata: BaseUser) => {\n const owner = ownerDescriptor.value\n if (isUndefined(owner)) return\n creatingSystem.value = descriptor.system\n try {\n const source = await writes.readSourceUser(owner, props.userId)\n if (isNull(source)) {\n showError(t('common.userSystem.create.sourceUnreadable', { system: labelFor(owner.system) }))\n return\n }\n // The dialog already promised \"created ready to use\" or \"created switched off\" from the earlier read. If the\n // server now disagrees, the promise was wrong, and in blog and forum that means a working public account.\n // Usually the first read failed, leaving `sourceUser` null and the dialog saying \"disabled\"\n // for an enabled account. Nothing is written until the corrected row is confirmed again.\n if (source.enabled !== createEnabled.value) {\n sourceUser.value = source\n showError(t('common.userSystem.create.sourceChanged'))\n return\n }\n // The create right may have been lost while the source was read. Nothing is offered then, so nothing is reported.\n if (!descriptorMayWrite(descriptor, 'create')) return\n // Built by the library factory, never by hand. A body of base fields\n // alone makes the backend add `ROLE_USER`, a role nobody granted.\n // Metadata comes from the dialog, validated against the target's profile. The source may leave fields empty\n // (blog never fills `person`) that the target requires. The id and `enabled` come from the fresh read.\n const body = createAnzuUser(descriptor.system)\n body.id = source.id\n body.email = metadata.email\n body.person = cloneDeep(metadata.person)\n body.avatar = cloneDeep(metadata.avatar)\n body.enabled = source.enabled\n const result = await writes.createInSystem(descriptor, body)\n if (result.outcome !== BulkOutcome.Done) {\n // Without this message the failure looked like success: the\n // re-probed row still said \"absent\" with no explanation.\n showError(labelFor(descriptor.system) + ': ' + t('common.userSystem.bulk.outcome.' + result.outcome))\n return\n }\n showRecordWas('created')\n emit('created', descriptor)\n otherSystems.value?.refreshSystem(descriptor.system)\n ownedPanels.value.forEach((panel) => panel?.refresh())\n } finally {\n creatingSystem.value = null\n }\n}\n\n/**\n * Called by the page after the owning form saved.\n * `VWindowItem` hides panels with `v-show`, so a mounted panel never re-fetches by itself. Without\n * this it shows pre-save data, and create-in-another-system would copy that stale snapshot.\n * Not a refetch on every tab activation: that would cost eight calls per tab switch.\n */\nconst refresh = () => {\n void loadSource()\n otherSystems.value?.refresh()\n ownedPanels.value.forEach((panel) => panel?.refresh())\n}\n\n// Read on the first activation of a non-owning tab, so the owning tab makes no foreign call.\nwatch(\n activeTab,\n (value) => {\n // `isValidTab` first: before mount settles, the model is an empty string.\n // Treating it as a non-owning tab would fetch on the owning tab too.\n if (!isValidTab(value) || value === props.owner) return\n if (isNull(sourceUser.value)) void loadSource()\n },\n { immediate: true }\n)\n\ndefineExpose({ refresh })\n</script>\n\n<template>\n <div>\n <!--\n No tab navigates. Tabs only switch content, and leaving the page is done by the Manage\n anchor inside a panel. `VTab` renders `role=\"tab\"` and cannot carry navigation semantically.\n -->\n <VTabs\n v-model=\"activeTab\"\n data-cy=\"user-tabs\"\n >\n <VTab\n v-for=\"tab in tabs\"\n :key=\"tab\"\n :value=\"tab\"\n :data-cy=\"`user-tab-${tab}`\"\n >\n {{ tab === OTHER_SYSTEMS_TAB ? t('common.userSystem.tab.otherSystems') : labelFor(tab) }}\n <!-- The owning tab says it holds unsaved work; the Save button itself is always visible. -->\n <VIcon\n v-if=\"tab === owner && hasUnsavedChanges\"\n class=\"ml-1\"\n size=\"x-small\"\n color=\"warning\"\n icon=\"mdi-circle\"\n data-cy=\"user-tab-unsaved\"\n />\n </VTab>\n </VTabs>\n <VWindow\n v-model=\"activeTab\"\n class=\"mt-4\"\n >\n <VWindowItem\n v-for=\"tab in ownedTabs\"\n :key=\"tab\"\n :value=\"tab\"\n >\n <!-- The owning system of the current route: the full form. -->\n <slot v-if=\"tab === owner\" />\n <!--\n Another system this admin owns whose route is not open: a probe\n with a summary and a Manage button, like any other system.\n -->\n <AUserSystemPanel\n v-else-if=\"!isUndefined(bySystem.get(tab))\"\n ref=\"ownedPanels\"\n :descriptor=\"bySystem.get(tab)!\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"sourceUser\"\n :creating=\"creatingSystem === tab\"\n @create=\"onCreate\"\n />\n </VWindowItem>\n <VWindowItem :value=\"OTHER_SYSTEMS_TAB\">\n <!-- `VWindowItem` renders content on first activation, so opening a user makes no foreign calls. -->\n <AUserOtherSystemsTable\n ref=\"otherSystems\"\n :descriptors=\"otherDescriptors\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"sourceUser\"\n :creating-system=\"creatingSystem\"\n @create=\"onCreate\"\n />\n </VWindowItem>\n </VWindow>\n <AUnsavedConfirmDialog\n v-model=\"promptOpen\"\n :dirty-labels=\"dirtyLabels\"\n @resolve=\"resolvePrompt\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Acl.js","names":["_sfc_main","Acl_vue_vue_type_script_setup_true_lang_default","Acl_default"],"sources":["../../../../src/domains/auth/components/Acl.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TAclValue extends RegisteredAclValue\">\nimport { computed } from 'vue'\nimport type { RegisteredAclValue } from '@/domains/auth/types/Permission'\nimport { useAuthHelpers } from '@/domains/auth/composables/defineAuth'\n\nconst props = withDefaults(\n defineProps<{\n // An array is evaluated with AND. Values from different systems work:\n // every involved system must be loaded, or the slot stays hidden.\n // Prefer values from one system for clarity.\n permission: TAclValue | TAclValue[]\n subject?: object\n }>(),\n {\n subject: undefined,\n }\n)\n\nconst { canSafeHelper } = useAuthHelpers<TAclValue>()\n\n/**\n * A computed, not a watcher latching on the first `true`. It re-evaluates when its\n * system's current user arrives, and a revoked permission applies without a reload.\n * Uses `canSafeHelper` because the template may render before its system is loaded. `canHelper` would throw.\n */\nconst allowed = computed<boolean>(() => canSafeHelper(props.permission, props.subject, 'Acl'))\n</script>\n\n<template>\n <slot v-if=\"allowed\" />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"Acl.js","names":["Acl_vue_vue_type_script_setup_true_lang_default","Acl_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Acl.vue_vue_type_script_setup_true_lang.js","names":["_renderSlot","_createCommentVNode","Acl_vue_vue_type_script_setup_true_lang_default","props","__props","useAuthHelpers","allowed","computed","canSafeHelper","renderSlot","_ctx","createCommentVNode"],"sources":["../../../../src/domains/auth/components/Acl.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TAclValue extends RegisteredAclValue\">\nimport { computed } from 'vue'\nimport type { RegisteredAclValue } from '@/domains/auth/types/Permission'\nimport { useAuthHelpers } from '@/domains/auth/composables/defineAuth'\n\nconst props = withDefaults(\n defineProps<{\n // An array is evaluated with AND. Values from different systems work:\n // every involved system must be loaded, or the slot stays hidden.\n // Prefer values from one system for clarity.\n permission: TAclValue | TAclValue[]\n subject?: object\n }>(),\n {\n subject: undefined,\n }\n)\n\nconst { canSafeHelper } = useAuthHelpers<TAclValue>()\n\n/**\n * A computed, not a watcher latching on the first `true`. It re-evaluates when its\n * system's current user arrives, and a revoked permission applies without a reload.\n * Uses `canSafeHelper` because the template may render before its system is loaded. `canHelper` would throw.\n */\nconst allowed = computed<boolean>(() => canSafeHelper(props.permission, props.subject, 'Acl'))\n</script>\n\n<template>\n <slot v-if=\"allowed\" />\n</template>\n"],"mappings":";;;;;;;;;;EAKA,IAAMG,IAAQC,GAaR,EAAE,qBAAkBC,EAA0B,GAO9CC,IAAUC,QAAwBC,EAAcL,EAAM,YAAYA,EAAM,SAAS,KAAK,CAAC;E,iBAI/EG,EAAA,QAAZN,EAAuBU,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,I"}
1
+ {"version":3,"file":"Acl.vue_vue_type_script_setup_true_lang.js","names":["_renderSlot","Acl_vue_vue_type_script_setup_true_lang_default","props","__props","useAuthHelpers","allowed","computed","canSafeHelper","renderSlot","_ctx","createCommentVNode"],"sources":["../../../../src/domains/auth/components/Acl.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"TAclValue extends RegisteredAclValue\">\nimport { computed } from 'vue'\nimport type { RegisteredAclValue } from '@/domains/auth/types/Permission'\nimport { useAuthHelpers } from '@/domains/auth/composables/defineAuth'\n\nconst props = withDefaults(\n defineProps<{\n // An array is evaluated with AND. Values from different systems work:\n // every involved system must be loaded, or the slot stays hidden.\n // Prefer values from one system for clarity.\n permission: TAclValue | TAclValue[]\n subject?: object\n }>(),\n {\n subject: undefined,\n }\n)\n\nconst { canSafeHelper } = useAuthHelpers<TAclValue>()\n\n/**\n * A computed, not a watcher latching on the first `true`. It re-evaluates when its\n * system's current user arrives, and a revoked permission applies without a reload.\n * Uses `canSafeHelper` because the template may render before its system is loaded. `canHelper` would throw.\n */\nconst allowed = computed<boolean>(() => canSafeHelper(props.permission, props.subject, 'Acl'))\n</script>\n\n<template>\n <slot v-if=\"allowed\" />\n</template>\n"],"mappings":";;;;;;;;;;EAKA,IAAME,IAAQC,GAaR,EAAE,qBAAkBC,EAA0B,GAO9CC,IAAUC,QAAwBC,EAAcL,EAAM,YAAYA,EAAM,SAAS,KAAK,CAAC;E,iBAI/EG,EAAA,QAAZL,EAAuBS,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,I"}
@@ -1 +1 @@
1
- {"version":3,"file":"ACachedChip.js","names":["_sfc_main","ACachedChip_vue_vue_type_script_setup_true_lang_default","ACachedChip_default"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve shows only its id placeholder.\n// It gets no link, because its detail would not load either.\nconst linkDisabled = computed(() => props.disableClick || unresolved.value)\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\n// A title given by the caller still wins over the placeholder.\nconst showUnresolved = computed(() => unresolved.value && props.title.length === 0)\n\nconst displayTitle = computed(() => {\n if (showUnresolved.value) return '#' + props.id\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">-</slot>\n </template>\n <div\n v-else-if=\"textOnly\"\n :title=\"unresolved ? t('common.model.cachedUnavailable') : undefined\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"linkDisabled\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click:close=\"() => emit('close', id)\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VTooltip\n v-if=\"unresolved\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.cachedUnavailable') }}\n </VTooltip>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('close', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ACachedChip.js","names":["ACachedChip_vue_vue_type_script_setup_true_lang_default","ACachedChip_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ACachedChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createBlock","_component_VProgressCircular","_createCommentVNode","_component_VChip","_withCtx","_component_VTooltip","_withModifiers","_hoisted_1","ACachedChip_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","useI18n","router","useRouter","useCachedItem","linkDisabled","computed","unresolved","containerClassComputed","showUnresolved","displayTitle","cached","customTitle","objectGetValueByPath","onClick","openBlock","createElementBlock","normalizeClass","unref","isNull","isUndefined","renderSlot","_ctx","_cache","createTextVNode","t","toDisplayString","Fragment","loaded","createBlock","VProgressCircular","createCommentVNode","VChip","withCtx","VTooltip","COMMON_CONFIG","withModifiers"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve shows only its id placeholder.\n// It gets no link, because its detail would not load either.\nconst linkDisabled = computed(() => props.disableClick || unresolved.value)\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\n// A title given by the caller still wins over the placeholder.\nconst showUnresolved = computed(() => unresolved.value && props.title.length === 0)\n\nconst displayTitle = computed(() => {\n if (showUnresolved.value) return '#' + props.id\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">-</slot>\n </template>\n <div\n v-else-if=\"textOnly\"\n :title=\"unresolved ? t('common.model.cachedUnavailable') : undefined\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"linkDisabled\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click:close=\"() => emit('close', id)\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VTooltip\n v-if=\"unresolved\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.cachedUnavailable') }}\n </VTooltip>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('close', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ACachedChip.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createBlock","_component_VProgressCircular","_component_VChip","_withCtx","_component_VTooltip","_withModifiers","_hoisted_1","ACachedChip_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","useI18n","router","useRouter","useCachedItem","linkDisabled","computed","unresolved","containerClassComputed","showUnresolved","displayTitle","cached","customTitle","objectGetValueByPath","onClick","openBlock","createElementBlock","normalizeClass","unref","isNull","isUndefined","renderSlot","_ctx","_cache","createTextVNode","t","toDisplayString","Fragment","loaded","createBlock","VProgressCircular","createCommentVNode","VChip","withCtx","VTooltip","COMMON_CONFIG","withModifiers"],"sources":["../../../../src/domains/cached/components/ACachedChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { objectGetValueByPath } from '@/shared/utils/object'\nimport { isNull, isUndefined } from '@/shared/utils/common'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id?: null | undefined | IntegerId | DocId\n title?: string\n containerClass?: undefined | string\n getCachedFn: (id: any) => any\n displayTextPath: string\n route: string\n disableClick?: boolean\n openInNew?: boolean\n size?: string\n forceRounded?: boolean\n textOnly?: boolean\n fallbackIdText?: boolean\n wrapText?: boolean\n closable?: boolean\n customTitleFn?: (\n cachedItem: any,\n defaultTitle: string,\n displayTextPath: string,\n fallbackIdText: boolean\n ) => string | undefined\n }>(),\n {\n id: null,\n title: '',\n containerClass: 'd-inline-flex',\n disableClick: false,\n openInNew: false,\n size: 'small',\n forceRounded: false,\n textOnly: false,\n fallbackIdText: false,\n wrapText: false,\n closable: false,\n customTitleFn: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'close', id: null | undefined | IntegerId | DocId): void\n}>()\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { cached, loaded, unresolved } = useCachedItem(() => props.getCachedFn(props.id as any))\n\n// An item the fetch could not resolve shows only its id placeholder.\n// It gets no link, because its detail would not load either.\nconst linkDisabled = computed(() => props.disableClick || unresolved.value)\n\nconst containerClassComputed = computed(() => {\n return props.wrapText ? props.containerClass + ' a-chip--wrap' : props.containerClass\n})\n\n// A title given by the caller still wins over the placeholder.\nconst showUnresolved = computed(() => unresolved.value && props.title.length === 0)\n\nconst displayTitle = computed(() => {\n if (showUnresolved.value) return '#' + props.id\n if (props.customTitleFn && cached.value) {\n const customTitle = props.customTitleFn(cached.value, props.title, props.displayTextPath, props.fallbackIdText)\n if (customTitle !== undefined) {\n return customTitle\n }\n }\n if (props.title.length > 0) return props.title\n if (cached.value) {\n return objectGetValueByPath(cached.value, props.displayTextPath)\n }\n return props.fallbackIdText ? props.id : ''\n})\n\nconst onClick = () => {\n router.push({ name: props.route, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div :class=\"containerClassComputed\">\n <template v-if=\"isNull(id) || isUndefined(id)\">\n <slot name=\"empty\">-</slot>\n </template>\n <div\n v-else-if=\"textOnly\"\n :title=\"unresolved ? t('common.model.cachedUnavailable') : undefined\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </div>\n <VChip\n v-else-if=\"linkDisabled\"\n :size=\"size\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click:close=\"() => emit('close', id)\"\n >\n <slot\n v-if=\"showUnresolved\"\n :id=\"id\"\n name=\"unresolved\"\n >\n {{ displayTitle }}\n </slot>\n <template v-else>{{ displayTitle }}</template>\n <VTooltip\n v-if=\"unresolved\"\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.cachedUnavailable') }}\n </VTooltip>\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n <VChip\n v-else\n :size=\"size\"\n :append-icon=\"openInNew ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\"\n :label=\"forceRounded ? undefined : true\"\n :closable=\"closable\"\n close-label=\"common.button.remove\"\n @click.stop=\"onClick\"\n @click:close=\"() => emit('close', id)\"\n >\n {{ displayTitle }}\n <VProgressCircular\n v-if=\"!loaded && title.length === 0\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"mx-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-chip--wrap {\n .v-chip {\n height: auto !important;\n }\n\n .v-chip .v-chip__content {\n max-width: 100%;\n height: auto;\n min-height: 26px;\n white-space: pre-wrap;\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ACachedUserChip.js","names":["_sfc_main","ACachedUserChip_vue_vue_type_script_setup_true_lang_default","_plugin_vue_export_helper_default","ACachedUserChip_default"],"sources":["../../../../src/domains/cached/components/ACachedUserChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\nimport type { AnzuUserMinimal } from '@/shared/types/AnzuUser'\nimport type { CachedItem } from '@/domains/cached/composables/defineCached'\nimport { COMMON_CONFIG } from '@/shared/commonConfig'\nimport AAnzuUserAvatar from '@/domains/ui/components/AAnzuUserAvatar.vue'\nimport { replaceUrlParameters } from '@/domains/api/utils/apiHelper'\nimport { useCachedItem } from '@/domains/cached/composables/useCachedItem'\n\nconst props = withDefaults(\n defineProps<{\n id: IntegerIdNullable | undefined\n /** The admin's cache getter, e.g. `getCachedUser` of its `useCachedUsers()`. */\n getCachedFn: (id: IntegerIdNullable | undefined) => CachedItem<AnzuUserMinimal> | undefined\n routeName?: string | undefined\n externalUrlTemplate?: string | undefined\n /**\n * Label for caches whose users carry a better one than `person.fullName`, such as a nickname.\n * `any` because it reads the admin's own user type, which `AnzuUserMinimal` does not describe.\n */\n titleFn?: ((user: CachedItem<any>) => string) | undefined\n disableClick?: boolean\n /** Label of the close button when Vuetify defaults make the chip closable. Defaults to \"Remove\". */\n closeLabel?: string\n }>(),\n {\n routeName: undefined,\n externalUrlTemplate: undefined,\n titleFn: undefined,\n disableClick: false,\n closeLabel: 'common.button.remove',\n }\n)\n\nconst { t } = useI18n()\nconst router = useRouter()\n// 0 counts as no id, as in `defineCached`. A blank factory record carries it.\nconst { cached, loaded, unresolved } = useCachedItem(() => (props.id ? props.getCachedFn(props.id) : undefined))\n\n// Optional chaining on purpose. Each admin maps its own users into the cache.\n// A mapper that omits the name or e-mail falls through to the next label instead of throwing.\nconst text = computed(() => {\n const user = cached.value\n if (!user) return ''\n const title = props.titleFn ? props.titleFn(user) : ''\n if (title) return title\n if (user.person?.fullName) return user.person.fullName\n if (user.email) return user.email.split('@')[0]\n return '#' + props.id\n})\n\nconst clickable = computed(\n () => !props.disableClick && !unresolved.value && !!(props.externalUrlTemplate || props.routeName)\n)\n\nconst appendIcon = computed(() => {\n if (!clickable.value) return undefined\n return props.externalUrlTemplate ? COMMON_CONFIG.CHIP.ICON.LINK_EXTERNAL : COMMON_CONFIG.CHIP.ICON.LINK\n})\n\nconst onClick = () => {\n if (!clickable.value || !props.id) return\n if (props.externalUrlTemplate) {\n window.open(replaceUrlParameters(props.externalUrlTemplate, { id: props.id }), '_blank')\n return\n }\n if (props.routeName) router.push({ name: props.routeName, params: { id: props.id } })\n}\n</script>\n\n<template>\n <div class=\"d-inline-flex\">\n <span v-if=\"!id\">-</span>\n <VChip\n v-else-if=\"unresolved\"\n class=\"non-clickable\"\n size=\"small\"\n :close-label=\"closeLabel\"\n data-cy=\"cached-user-chip-unresolved\"\n >\n #{{ id }}\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t('common.model.tracking.userUnavailable') }}\n </VTooltip>\n </VChip>\n <VChip\n v-else\n class=\"pl-1\"\n :class=\"clickable ? '' : 'non-clickable'\"\n size=\"small\"\n :append-icon=\"appendIcon\"\n :close-label=\"closeLabel\"\n @click.stop=\"onClick\"\n >\n <AAnzuUserAvatar\n v-if=\"loaded\"\n :user=\"cached\"\n container-class=\"mr-1\"\n :size=\"20\"\n />\n {{ text }}\n <VProgressCircular\n v-if=\"!loaded\"\n :size=\"12\"\n :width=\"2\"\n indeterminate\n class=\"ml-1\"\n />\n </VChip>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.non-clickable {\n cursor: default;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ACachedUserChip.js","names":["ACachedUserChip_vue_vue_type_script_setup_true_lang_default","_plugin_vue_export_helper_default","ACachedUserChip_default"],"sources":[],"mappings":""}