@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":"AUserMetadataForm.js","names":["_sfc_main","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","AUserMetadataForm_default"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`).\n * The cross-system repair form always passes `true`. It writes to many systems, and a loose\n * form could put an empty name into cms, which cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is entered at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this gives three states that `readonly` alone cannot: not drawn, editable, or read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do.\n * Deliberately not passed by the cross-system repair form. It is strict, so\n * it would invent a colour on open and mark it as a change in every system.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * Dirty flags: the derived fields recompute until someone edits them, then stop.\n * Flags are seeded from the data. A stored value that differs from the derived one was set on purpose\n * (cms fixtures have `Anzu` + `User 1` with full name `Anzu User1`), and renaming must not overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record is replaced, not only when its id changes.\n * The metadata repair dialog swaps between two systems' records for the same person, so the\n * id stays the same. Stale flags would overwrite the chosen source's deliberate full name.\n * Declared before the derive watcher so the flags are updated first.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names as a string, not an array. A new array on every read\n// would fire on any object replacement, even one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states: not drawn where the backend resolves the id; editable while creating; read-only\n once the record exists, because every other system looks the person up by this key.\n -->\n <!--\n `.number` is required. Vue applies model modifiers inside `emit`, so without it the field\n returns the string \"42\" for an `IntegerIdNullable`, and the create body carries that string.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` fires only on a real edit. The watcher assigns\n through the model, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserMetadataForm.js","names":["AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","AUserMetadataForm_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserMetadataForm.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","ASystemEntityScope","_withCtx","_createVNode","_component_VRow","_component_VCol","_component_VAlert","_createTextVNode","_toDisplayString","_createCommentVNode","AFormTextField","_unref","ARow","ACopyText","AAvatarColorPicker","_createElementBlock","AAvatarColorPicker_default","ACopyText_default","ARow_default","AFormTextField_default","ASystemEntityScope_default","_hoisted_1","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","ANZU_USER_ENTITY","\"user\"","\"userModifiers\"","props","__props","user","useModel","useI18n","useUserMetadataValidation","derivedFullName","firstName","lastName","derivedAvatarText","fullNameTouched","ref","avatarTextTouched","seedTouchedFlags","onMounted","watch","next","previous","openBlock","createBlock","withCtx","createVNode","VRow","VCol","VAlert","createTextVNode","toDisplayString","createCommentVNode","_cache","$event","unref","v$","t","createElementBlock"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`).\n * The cross-system repair form always passes `true`. It writes to many systems, and a loose\n * form could put an empty name into cms, which cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is entered at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this gives three states that `readonly` alone cannot: not drawn, editable, or read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do.\n * Deliberately not passed by the cross-system repair form. It is strict, so\n * it would invent a colour on open and mark it as a change in every system.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * Dirty flags: the derived fields recompute until someone edits them, then stop.\n * Flags are seeded from the data. A stored value that differs from the derived one was set on purpose\n * (cms fixtures have `Anzu` + `User 1` with full name `Anzu User1`), and renaming must not overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record is replaced, not only when its id changes.\n * The metadata repair dialog swaps between two systems' records for the same person, so the\n * id stays the same. Stale flags would overwrite the chosen source's deliberate full name.\n * Declared before the derive watcher so the flags are updated first.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names as a string, not an array. A new array on every read\n// would fire on any object replacement, even one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states: not drawn where the backend resolves the id; editable while creating; read-only\n once the record exists, because every other system looks the person up by this key.\n -->\n <!--\n `.number` is required. Vue applies model modifiers inside `emit`, so without it the field\n returns the string \"42\" for an `IntegerIdNullable`, and the create body carries that string.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` fires only on a real edit. The watcher assigns\n through the model, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AUserMetadataForm.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","ASystemEntityScope","_withCtx","_createVNode","_component_VRow","_component_VCol","_component_VAlert","_createTextVNode","_toDisplayString","AFormTextField","_unref","ARow","ACopyText","AAvatarColorPicker","_createElementBlock","AAvatarColorPicker_default","ACopyText_default","ARow_default","AFormTextField_default","ASystemEntityScope_default","_hoisted_1","AUserMetadataForm_vue_vue_type_script_setup_true_lang_default","ANZU_USER_ENTITY","\"user\"","\"userModifiers\"","props","__props","user","useModel","useI18n","useUserMetadataValidation","derivedFullName","firstName","lastName","derivedAvatarText","fullNameTouched","ref","avatarTextTouched","seedTouchedFlags","onMounted","watch","next","previous","openBlock","createBlock","withCtx","createVNode","VRow","VCol","VAlert","createTextVNode","toDisplayString","createCommentVNode","_cache","$event","unref","v$","t","createElementBlock"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataForm.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport AAvatarColorPicker from '@/domains/ui/components/AAvatarColorPicker.vue'\nimport ACopyText from '@/domains/ui/components/ACopyText.vue'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormTextField from '@/domains/form/components/AFormTextField.vue'\nimport ASystemEntityScope from '@/domains/form/components/ASystemEntityScope.vue'\nimport { ANZU_USER_ENTITY } from '@/domains/anzuUser/api/anzuUserApi'\nimport { useUserMetadataValidation } from '@/domains/anzuUser/composables/anzuUserValidations'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The system's validation profile (`requiredMetadata`).\n * The cross-system repair form always passes `true`. It writes to many systems, and a loose\n * form could put an empty name into cms, which cms's own form would then refuse to save.\n */\n required?: boolean\n /**\n * Whether the id is entered at all. False only in cms, whose backend resolves it from SSO.\n * With `isEdit` this gives three states that `readonly` alone cannot: not drawn, editable, or read-only.\n */\n idInput?: boolean\n isEdit?: boolean\n readonly?: boolean\n /**\n * Random colour on an empty value, as all four admins do.\n * Deliberately not passed by the cross-system repair form. It is strict, so\n * it would invent a colour on open and mark it as a change in every system.\n */\n randomColor?: boolean\n /** The system's `metadataNote` -- the same sentence the cross-system dialog shows. */\n note?: string | undefined\n /** i18n namespace for the field labels; the backend identity does not belong here. */\n scopeSystem?: string\n scopeSubject?: string\n /** Vuelidate scope. Omitted means the page's own collector picks these rules up. */\n validationScope?: string | symbol | false | undefined\n }>(),\n {\n required: false,\n idInput: true,\n isEdit: false,\n readonly: false,\n randomColor: false,\n note: undefined,\n scopeSystem: 'common',\n scopeSubject: ANZU_USER_ENTITY,\n validationScope: undefined,\n }\n)\n\nconst user = defineModel<BaseUser>('user', { required: true })\n\nconst { t } = useI18n()\n\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst { v$ } = useUserMetadataValidation(user, {\n required: () => props.required,\n idInput: () => props.idInput,\n isEdit: () => props.isEdit,\n scope: props.validationScope,\n})\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\nconst derivedFullName = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName + ' ' + lastName\n}\n\nconst derivedAvatarText = () => {\n const { firstName, lastName } = user.value.person\n if (firstName.length === 0 || lastName.length === 0) return ''\n return firstName.slice(0, 1) + lastName.slice(0, 1)\n}\n\n/**\n * Dirty flags: the derived fields recompute until someone edits them, then stop.\n * Flags are seeded from the data. A stored value that differs from the derived one was set on purpose\n * (cms fixtures have `Anzu` + `User 1` with full name `Anzu User1`), and renaming must not overwrite it.\n */\nconst fullNameTouched = ref(false)\nconst avatarTextTouched = ref(false)\n\nconst seedTouchedFlags = () => {\n fullNameTouched.value = user.value.person.fullName.length > 0 && user.value.person.fullName !== derivedFullName()\n avatarTextTouched.value = user.value.avatar.text.length > 0 && user.value.avatar.text !== derivedAvatarText()\n}\n\nonMounted(seedTouchedFlags)\n\n/**\n * Re-seeded whenever the record is replaced, not only when its id changes.\n * The metadata repair dialog swaps between two systems' records for the same person, so the\n * id stays the same. Stale flags would overwrite the chosen source's deliberate full name.\n * Declared before the derive watcher so the flags are updated first.\n */\nwatch(\n () => user.value,\n () => seedTouchedFlags()\n)\n\n// Keyed on the names as a string, not an array. A new array on every read\n// would fire on any object replacement, even one that changed nothing.\nwatch(\n () => `${user.value.person.firstName}\\u0000${user.value.person.lastName}`,\n (next, previous) => {\n if (props.readonly || next === previous) return\n if (!fullNameTouched.value) user.value.person.fullName = derivedFullName()\n if (!avatarTextTouched.value) user.value.avatar.text = derivedAvatarText()\n }\n)\n</script>\n\n<template>\n <ASystemEntityScope\n :system=\"scopeSystem\"\n :subject=\"scopeSubject\"\n >\n <VRow>\n <VCol cols=\"12\">\n <VAlert\n v-if=\"note\"\n type=\"info\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-4\"\n >\n {{ note }}\n </VAlert>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <!--\n Three states: not drawn where the backend resolves the id; editable while creating; read-only\n once the record exists, because every other system looks the person up by this key.\n -->\n <!--\n `.number` is required. Vue applies model modifiers inside `emit`, so without it the field\n returns the string \"42\" for an `IntegerIdNullable`, and the create body carries that string.\n -->\n <AFormTextField\n v-if=\"idInput && !isEdit && !readonly\"\n v-model.number=\"user.id\"\n type=\"number\"\n :v=\"v$.user.id\"\n :label=\"t('common.anzuUser.model.id')\"\n :hint=\"t('common.anzuUser.hint.idReadonlyOnEdit')\"\n persistent-hint\n />\n <ARow\n v-else-if=\"user.id\"\n :title=\"t('common.anzuUser.model.id')\"\n >\n <ACopyText :value=\"user.id\" />\n </ARow>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"9\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.email')\"\n :value=\"user.email\"\n />\n <AFormTextField\n v-else\n v-model=\"user.email\"\n :v=\"v$.user.email\"\n data-cy=\"user-email\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.firstName')\"\n :value=\"user.person.firstName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.firstName\"\n :v=\"v$.user.person.firstName\"\n data-cy=\"user-firstName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.lastName')\"\n :value=\"user.person.lastName\"\n />\n <AFormTextField\n v-else\n v-model=\"user.person.lastName\"\n :v=\"v$.user.person.lastName\"\n data-cy=\"user-lastName\"\n />\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"6\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.person.fullName')\"\n :value=\"user.person.fullName\"\n />\n <!--\n `@update:model-value` fires only on a real edit. The watcher assigns\n through the model, so recomputing never marks the field touched.\n -->\n <AFormTextField\n v-else\n v-model=\"user.person.fullName\"\n :v=\"v$.user.person.fullName\"\n :hint=\"fullNameTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!fullNameTouched\"\n data-cy=\"user-fullName\"\n @update:model-value=\"fullNameTouched = true\"\n />\n </VCol>\n </VRow>\n <VRow>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <AAvatarColorPicker\n v-model=\"user.avatar.color\"\n :label=\"t('common.anzuUser.model.avatar.color')\"\n :readonly=\"readonly\"\n :required=\"required\"\n :random-color=\"randomColor\"\n />\n <div\n v-if=\"v$.user.avatar.color.$error\"\n class=\"text-error text-body-small\"\n >\n {{ v$.user.avatar.color.$errors[0]?.$message }}\n </div>\n </VCol>\n <VCol\n cols=\"12\"\n sm=\"3\"\n >\n <ARow\n v-if=\"readonly\"\n :title=\"t('common.anzuUser.model.avatar.text')\"\n :value=\"user.avatar.text\"\n />\n <AFormTextField\n v-else\n v-model=\"user.avatar.text\"\n :v=\"v$.user.avatar.text\"\n :maxlength=\"3\"\n :hint=\"avatarTextTouched ? undefined : t('common.anzuUser.hint.derivedFromName')\"\n :persistent-hint=\"!avatarTextTouched\"\n data-cy=\"user-avatarText\"\n @update:model-value=\"avatarTextTouched = true\"\n />\n </VCol>\n </VRow>\n </VCol>\n </VRow>\n </ASystemEntityScope>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserMetadataRepairDialog.js","names":["_sfc_main","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","AUserMetadataRepairDialog_default"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector, so the strict rules are checked before writing. Without it an empty\n// name or colour from the source (common in blog and cms) was written blank to every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Target systems. Ticked by default and untickable one by one, like the enable/disable\n * dialog, so an operator can skip a system whose value is intentionally different.\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, like the enable/disable one.\n * Closing on confirm hid failures: a 422 on one system looked like a successful repair.\n */\nconst showingLog = ref(false)\n\n/**\n * Pre-fill from the first system in configured order that has a record, not\n * the first to answer. The fan-out is parallel, so that would differ per run.\n * The source is shown and can be changed.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only systems whose value differs and that may be written. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Re-tick everything that differs whenever the set changes: on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** Retries the same value on systems it did not reach, 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids share one e-mail. Writing under either could put this person's\n metadata on someone else's account, and no admin can delete an AnzuUser.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target profiles say. It writes to many systems, and a loose\n form could put an empty name into cms, which cms's form would then refuse to save.\n `randomColor` is deliberately not passed: the strict form would\n invent a colour on open and mark it as a change everywhere.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserMetadataRepairDialog.js","names":["AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","AUserMetadataRepairDialog_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_resolveComponent","_openBlock","_createBlock","_component_VDialog","_withCtx","_createVNode","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VCardText","_component_VAlert","_createCommentVNode","_component_VSelect","AUserMetadataForm","_createElementVNode","_createElementBlock","_Fragment","_renderList","_component_VCheckbox","AUserSystemStatusChip","_component_VCardActions","_withModifiers","_component_VSpacer","ADialogToolbar_default","AUserMetadataForm_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","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","__emit","props","__props","emit","open","useModel","useI18n","store","useUserCrossSystemStore","v$","records","computed","map","descriptor","user","sourceSystem","ref","target","selected","showingLog","watch","value","order","pickPrefillSource","source","isUndefined","cloneDeep","system","sourceOptions","mayUpdate","item","descriptorMayWrite","allDiffering","systemsNeedingWrite","differing","differingWithoutRight","affected","systems","changes","current","USER_METADATA_FIELDS","readMetadataField","field","currentLog","entry","BulkAction","failed","BulkOutcome","noteFor","labelFor","confirm","retryFailed","_component_ABtnTertiary","resolveComponent","_component_ABtnPrimary","openBlock","createBlock","VDialog","_cache","$event","withCtx","createVNode","VCard","createTextVNode","toDisplayString","unref","t","VCardText","VAlert","createCommentVNode","VSelect","createElementVNode","createElementBlock","Fragment","renderList","VCheckbox","change","VCardActions","withModifiers","VSpacer"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector, so the strict rules are checked before writing. Without it an empty\n// name or colour from the source (common in blog and cms) was written blank to every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Target systems. Ticked by default and untickable one by one, like the enable/disable\n * dialog, so an operator can skip a system whose value is intentionally different.\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, like the enable/disable one.\n * Closing on confirm hid failures: a 422 on one system looked like a successful repair.\n */\nconst showingLog = ref(false)\n\n/**\n * Pre-fill from the first system in configured order that has a record, not\n * the first to answer. The fan-out is parallel, so that would differ per run.\n * The source is shown and can be changed.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only systems whose value differs and that may be written. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Re-tick everything that differs whenever the set changes: on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** Retries the same value on systems it did not reach, 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids share one e-mail. Writing under either could put this person's\n metadata on someone else's account, and no admin can delete an AnzuUser.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target profiles say. It writes to many systems, and a loose\n form could put an empty name into cms, which cms's form would then refuse to save.\n `randomColor` is deliberately not passed: the strict form would\n invent a colour on open and mark it as a change everywhere.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VDialog","_withCtx","_createVNode","_component_VCard","ADialogToolbar","_createTextVNode","_toDisplayString","_unref","_component_VCardText","_component_VAlert","_component_VSelect","AUserMetadataForm","_createElementVNode","_createElementBlock","_Fragment","_renderList","_component_VCheckbox","AUserSystemStatusChip","_component_VCardActions","_withModifiers","_component_VSpacer","ADialogToolbar_default","AUserMetadataForm_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","AUserMetadataRepairDialog_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","__emit","props","__props","emit","open","useModel","useI18n","store","useUserCrossSystemStore","v$","records","computed","map","descriptor","user","sourceSystem","ref","target","selected","showingLog","watch","value","order","pickPrefillSource","source","isUndefined","cloneDeep","system","sourceOptions","mayUpdate","item","descriptorMayWrite","allDiffering","systemsNeedingWrite","differing","differingWithoutRight","affected","systems","changes","current","USER_METADATA_FIELDS","readMetadataField","field","currentLog","entry","BulkAction","failed","BulkOutcome","noteFor","labelFor","confirm","retryFailed","_component_ABtnTertiary","resolveComponent","_component_ABtnPrimary","openBlock","createBlock","VDialog","_cache","$event","withCtx","createVNode","VCard","createTextVNode","toDisplayString","unref","t","VCardText","VAlert","createCommentVNode","VSelect","createElementVNode","createElementBlock","Fragment","renderList","VCheckbox","change","VCardActions","withModifiers","VSpacer"],"sources":["../../../../src/domains/anzuUser/components/AUserMetadataRepairDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\nimport useVuelidate from '@vuelidate/core'\nimport { useI18n } from 'vue-i18n'\nimport ADialogToolbar from '@/domains/ui/components/ADialogToolbar.vue'\nimport AUserMetadataForm from '@/domains/anzuUser/components/AUserMetadataForm.vue'\nimport AUserSystemStatusChip from '@/domains/anzuUser/components/AUserSystemStatusChip.vue'\nimport { type AnyUserSystemDescriptor, descriptorMayWrite } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport {\n pickPrefillSource,\n readMetadataField,\n systemsNeedingWrite,\n USER_METADATA_FIELDS,\n} from '@/domains/anzuUser/utils/userMetadataDiff'\nimport { BulkAction, BulkOutcome, useUserCrossSystemStore } from '@/domains/anzuUser/store/userCrossSystemStore'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport { cloneDeep, isUndefined } from '@/shared/utils/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'confirm', payload: { target: BaseUser; systems: string[] }): void\n}>()\n\nconst open = defineModel<boolean>('open', { required: true })\n\nconst { t } = useI18n()\nconst store = useUserCrossSystemStore()\n\n// The form's own collector, so the strict rules are checked before writing. Without it an empty\n// name or colour from the source (common in blog and cms) was written blank to every ticked system.\nconst v$ = useVuelidate()\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 sourceSystem = ref<string | null>(null)\nconst target = ref<BaseUser | null>(null)\n/**\n * Target systems. Ticked by default and untickable one by one, like the enable/disable\n * dialog, so an operator can skip a system whose value is intentionally different.\n */\nconst selected = ref<string[]>([])\n/**\n * The dialog stays open after confirm and shows the run, like the enable/disable one.\n * Closing on confirm hid failures: a 422 on one system looked like a successful repair.\n */\nconst showingLog = ref(false)\n\n/**\n * Pre-fill from the first system in configured order that has a record, not\n * the first to answer. The fan-out is parallel, so that would differ per run.\n * The source is shown and can be changed.\n */\nwatch(\n open,\n (value) => {\n if (!value) return\n showingLog.value = false\n const order = props.descriptors.map((descriptor) => descriptor.system)\n sourceSystem.value = pickPrefillSource(order, records.value)\n const source = sourceSystem.value === null ? undefined : records.value.get(sourceSystem.value)\n target.value = isUndefined(source)\n ? null\n : cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n },\n { immediate: true }\n)\n\nwatch(sourceSystem, (system) => {\n if (system === null) return\n const source = records.value.get(system)\n if (isUndefined(source)) return\n target.value = cloneDeep({ id: source.id, email: source.email, person: source.person, avatar: source.avatar })\n})\n\nconst sourceOptions = computed(() =>\n props.descriptors\n .filter((descriptor) => records.value.has(descriptor.system))\n .map((descriptor) => ({ value: descriptor.system, title: descriptor.label ?? descriptor.system }))\n)\n\nconst mayUpdate = (system: string) => {\n const descriptor = props.descriptors.find((item) => item.system === system)\n return isUndefined(descriptor) || descriptorMayWrite(descriptor, 'update')\n}\n\nconst allDiffering = computed(() => (target.value === null ? [] : systemsNeedingWrite(target.value, records.value)))\n\n/** Only systems whose value differs and that may be written. */\nconst differing = computed(() => allDiffering.value.filter(mayUpdate))\n\n/** Differing, but the operator may not write them: listed so the repair does not look complete. */\nconst differingWithoutRight = computed(() => allDiffering.value.filter((system) => !mayUpdate(system)))\n\nconst affected = computed(() => differing.value.filter((system) => selected.value.includes(system)))\n\n// Re-tick everything that differs whenever the set changes: on open and on a source switch.\nwatch(\n differing,\n (systems) => {\n selected.value = [...systems]\n },\n { immediate: true }\n)\n\nconst changes = computed(() => {\n if (target.value === null) return []\n return differing.value.flatMap((system) => {\n const current = records.value.get(system)\n if (isUndefined(current)) return []\n return USER_METADATA_FIELDS.filter(\n (field) => readMetadataField(current, field) !== readMetadataField(target.value as BaseUser, field)\n ).map((field) => ({\n system,\n field,\n from: readMetadataField(current, field),\n to: readMetadataField(target.value as BaseUser, field),\n }))\n })\n})\n\nconst currentLog = computed(() =>\n store.bulkLog.filter((entry) => entry.action === BulkAction.Metadata && entry.subjectId === store.resolvedId)\n)\n\nconst failed = computed(() =>\n currentLog.value.filter((entry) => entry.outcome !== BulkOutcome.Done && entry.outcome !== BulkOutcome.Pending)\n)\n\nconst noteFor = (system: string) => props.descriptors.find((item) => item.system === system)?.metadataNote\n\nconst labelFor = (system: string) => props.descriptors.find((item) => item.system === system)?.label ?? system\n\nconst confirm = async () => {\n if (target.value === null || store.identityConflict !== null || affected.value.length === 0) return\n // Strict because it writes to up to nine places: only a value that passes in every system may go.\n if (!(await v$.value.$validate())) return\n showingLog.value = true\n emit('confirm', { target: target.value, systems: affected.value })\n}\n\n/** Retries the same value on systems it did not reach, 403 included: rights may have been granted since. */\nconst retryFailed = () => {\n if (target.value === null) return\n emit('confirm', { target: target.value, systems: failed.value.map((entry) => entry.system) })\n}\n</script>\n\n<template>\n <VDialog\n v-model=\"open\"\n :max-width=\"900\"\n data-cy=\"user-metadata-repair-dialog\"\n >\n <VCard>\n <ADialogToolbar @cancel=\"open = false\">\n {{ t('common.userSystem.repair.title') }}\n </ADialogToolbar>\n <VCardText v-if=\"target && !showingLog\">\n <!--\n Two ids share one e-mail. Writing under either could put this person's\n metadata on someone else's account, and no admin can delete an AnzuUser.\n -->\n <VAlert\n v-if=\"store.identityConflict\"\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n class=\"mb-3\"\n data-cy=\"repair-identity-conflict\"\n >\n {{ t('common.userSystem.search.identityConflict') }}\n </VAlert>\n <VSelect\n v-model=\"sourceSystem\"\n :items=\"sourceOptions\"\n :label=\"t('common.userSystem.repair.source')\"\n density=\"compact\"\n data-cy=\"repair-source\"\n />\n <!--\n Always strict, whatever the target profiles say. It writes to many systems, and a loose\n form could put an empty name into cms, which cms's form would then refuse to save.\n `randomColor` is deliberately not passed: the strict form would\n invent a colour on open and mark it as a change everywhere.\n -->\n <AUserMetadataForm\n v-model:user=\"target\"\n required\n :id-input=\"false\"\n is-edit\n />\n <div class=\"mt-4 text-label-large\">{{ t('common.userSystem.repair.changes') }}</div>\n <div\n v-for=\"system in differing\"\n :key=\"system\"\n class=\"mt-2 d-flex align-start ga-2\"\n >\n <VCheckbox\n v-model=\"selected\"\n :value=\"system\"\n :disabled=\"!!store.identityConflict\"\n :data-cy=\"`repair-system-${system}`\"\n density=\"compact\"\n hide-details\n />\n <div>\n <div class=\"d-flex align-center ga-2\">\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <AUserSystemStatusChip\n v-if=\"store.results.get(system)\"\n :axes=\"store.results.get(system)!.axes\"\n />\n </div>\n <div\n v-if=\"noteFor(system)\"\n class=\"text-body-small text-warning\"\n >\n {{ noteFor(system) }}\n </div>\n <div\n v-for=\"change in changes.filter((item) => item.system === system)\"\n :key=\"change.field\"\n class=\"text-body-small\"\n >\n {{ change.field }}: <s>{{ change.from || '—' }}</s> → {{ change.to || '—' }}\n </div>\n </div>\n </div>\n <div\n v-for=\"system in differingWithoutRight\"\n :key=\"system\"\n class=\"mt-2 d-flex align-center ga-2\"\n :data-cy=\"`repair-system-no-right-${system}`\"\n >\n <VCheckbox\n :model-value=\"false\"\n disabled\n density=\"compact\"\n hide-details\n />\n <span class=\"font-weight-medium\">{{ labelFor(system) }}</span>\n <span class=\"text-body-small text-medium-emphasis\">{{ t('common.userSystem.state.noWriteRight') }}</span>\n </div>\n </VCardText>\n <VCardText v-else-if=\"showingLog\">\n <div class=\"text-label-large mb-2\">{{ t('common.userSystem.bulk.log') }}</div>\n <!-- `polite`: nine systems finishing one after another would flood a screen reader. -->\n <div\n aria-live=\"polite\"\n data-cy=\"repair-log\"\n >\n <div\n v-for=\"entry in currentLog\"\n :key=\"entry.system\"\n class=\"d-flex align-center ga-2 py-1\"\n >\n <div class=\"font-weight-medium\">{{ labelFor(entry.system) }}</div>\n <div class=\"text-body-small\">{{ t(`common.userSystem.bulk.outcome.${entry.outcome}`) }}</div>\n <div\n v-if=\"entry.detail\"\n class=\"text-body-small text-warning\"\n >\n {{ entry.detail }}\n </div>\n </div>\n </div>\n </VCardText>\n <VCardActions>\n <ABtnTertiary @click.stop=\"open = false\">\n {{ showingLog ? t('common.userSystem.bulk.close') : t('common.button.cancel') }}\n </ABtnTertiary>\n <VSpacer />\n <ABtnTertiary\n v-if=\"showingLog && failed.length > 0 && !store.bulkRunning\"\n data-cy=\"repair-retry\"\n @click.stop=\"retryFailed\"\n >\n {{ t('common.userSystem.bulk.retryFailed') }}\n </ABtnTertiary>\n <ABtnPrimary\n v-if=\"!showingLog\"\n :disabled=\"affected.length === 0 || !!store.identityConflict\"\n data-cy=\"repair-confirm\"\n @click.stop=\"confirm\"\n >\n {{ t('common.userSystem.bulk.metadata.confirm', { count: affected.length }, affected.length) }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserOtherSystemsTable.js","names":["_sfc_main","AUserOtherSystemsTable_vue_vue_type_script_setup_true_lang_default","AUserOtherSystemsTable_default"],"sources":["../../../../src/domains/anzuUser/components/AUserOtherSystemsTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport AUserSystemPanel from '@/domains/anzuUser/components/AUserSystemPanel.vue'\nimport type { AnyUserSystemDescriptor } from '@/domains/anzuUser/composables/userSystemDescriptor'\nimport type { BaseUser } from '@/shared/types/AnzuUser'\nimport type { IntegerId } from '@/shared/types/common'\n\nconst props = defineProps<{\n descriptors: AnyUserSystemDescriptor[]\n userId: IntegerId\n readonly?: boolean\n /** Whether an account created from here would be switched on. The dialog states it. */\n createEnabled?: boolean\n /** What the owning system holds, to prefill the create form. */\n source?: BaseUser | null\n creatingSystem?: string | null\n}>()\n\nconst emit = defineEmits<{\n (e: 'create', descriptor: AnyUserSystemDescriptor, user: BaseUser): void\n}>()\n\n/**\n * A read-only list of panels, not `AUserSystemOverview`. The overview adds search, bulk\n * actions and inconsistency detection, and building on it would make task 2 depend on task 3.\n */\nconst panels = ref<InstanceType<typeof AUserSystemPanel>[]>([])\n\nconst refreshSystem = (system: string) => {\n const index = props.descriptors.findIndex((descriptor) => descriptor.system === system)\n panels.value[index]?.refresh()\n}\n\ndefineExpose({\n refresh: () => panels.value.forEach((panel) => panel?.refresh()),\n refreshSystem,\n})\n</script>\n\n<template>\n <VCard variant=\"flat\">\n <VCardText class=\"d-flex flex-column ga-4\">\n <AUserSystemPanel\n v-for=\"descriptor in descriptors\"\n :key=\"descriptor.system\"\n ref=\"panels\"\n :descriptor=\"descriptor\"\n :user-id=\"userId\"\n :readonly=\"readonly\"\n :create-enabled=\"createEnabled\"\n :source=\"source\"\n :creating=\"creatingSystem === descriptor.system\"\n @create=\"(target, user) => emit('create', target, user)\"\n />\n </VCardText>\n </VCard>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AUserOtherSystemsTable.js","names":["AUserOtherSystemsTable_vue_vue_type_script_setup_true_lang_default","AUserOtherSystemsTable_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AUserSystemOverview.js","names":["_sfc_main","AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","AUserSystemOverview_default"],"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":""}
1
+ {"version":3,"file":"AUserSystemOverview.js","names":["AUserSystemOverview_vue_vue_type_script_setup_true_lang_default","AUserSystemOverview_default"],"sources":[],"mappings":""}