@anzusystems/common-admin 2.0.0-rc.11 → 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 (457) 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
@@ -1 +1 @@
1
- {"version":3,"file":"AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_unref","_hoisted_1","SEARCH_DEBOUNCE_MS","AFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","submitResetCounter","inject","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","filterInnerConfig","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","filterConfigCurrent","computed","selected","ref","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","onBlur","label","t","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","item","requestsRunning","loading","byIdsCounter","resetToEmptyState","isArray","value","updateFilterSelected","updateSelected","findItem","obj","id","loadListItems","requestId","idsArray","ids","res","selectedNewValue","useAlerts","apiSearch","query","pagination","requestCounter","error","tryAutoFetch","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","useFilterClearHelpers","watchedValue","clearField","clearOne","onClickClear","isEmpty","newValue","oldValue","checkFirstLoad","placeholderComputed","noDataText","onSelectedUpdate","final","onChipCloseClick","closedItem","watch","newValueFilterData","oldValueFilterData","isBoolean","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","unref"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isArray, isBoolean, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterSortBy: null,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\n\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loading = computed(() => requestsRunning.value > 0)\n\nlet byIdsCounter = 0\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n selected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n updateFilterSelected(selected.value)\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n try {\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n selected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n }\n return selectedItemsCache.value\n } finally {\n requestsRunning.value--\n }\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted') => {\n if (props.prefetch === false || props.prefetch !== mode) return\n if (loading.value) return\n if (prefetchCompleted.value) return\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n await tryAutoFetch('focus')\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover')\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst { clearOne } = useFilterClearHelpers()\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\n// Clearing empties the filter in one step, so the filter watcher\n// fetches once for an empty search and keeps only the newest answer.\n// A single-value filter cleared onto its own default does not\n// change, so its watcher does nothing. Its item is restored here.\n// A clear that ends on a default value fetches the empty search here\n// through the counter, because the watcher only fetches for an empty value.\nconst onClickClear = () => {\n clearField()\n const value = filterData[props.name]\n if (isEmpty(value)) return\n if (value === watchedValue) loadListItems(value as T[] | T)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nconst checkFirstLoad = async () => {\n await tryAutoFetch('mounted')\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst noDataText = computed(() => {\n if (loading.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Closing a chip (`closable-chips`) removes its value from the filter, like unticking it in the list.\n// A single-value filter is cleared like the field's clear, since the chip slot draws its value as a chip too.\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (!isArray(selected.value)) {\n selected.value = null\n onSelectedUpdate(null)\n onClickClear()\n return\n }\n selected.value = (selected.value as ValueObjectOption<T>[]).filter((item) => item.value !== closedItem.value)\n onSelectedUpdate(selected.value)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValueFilterData, oldValueFilterData) => {\n watchedValue = newValueFilterData\n if (newValueFilterData === oldValueFilterData || isBoolean(newValueFilterData)) return\n const newValue = newValueFilterData as ModelValueType\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await checkFirstLoad()\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n if (!isUndefined(oldValueFilterData)) {\n apiRequestCounter.value++\n await apiSearch('', apiRequestCounter.value)\n }\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n :no-data-text=\"noDataText\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_unref","_hoisted_1","SEARCH_DEBOUNCE_MS","AFilterRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","submitResetCounter","inject","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","filterInnerConfig","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","filterConfigCurrent","computed","selected","ref","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","onBlur","label","t","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","item","requestsRunning","loading","byIdsCounter","resetToEmptyState","isArray","value","updateFilterSelected","updateSelected","findItem","obj","id","loadListItems","requestId","idsArray","ids","res","selectedNewValue","useAlerts","apiSearch","query","pagination","requestCounter","error","tryAutoFetch","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","useFilterClearHelpers","watchedValue","clearField","clearOne","onClickClear","isEmpty","newValue","oldValue","checkFirstLoad","placeholderComputed","noDataText","onSelectedUpdate","final","onChipCloseClick","closedItem","watch","newValueFilterData","oldValueFilterData","isBoolean","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","unref"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isArray, isBoolean, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n placeholder?: string | undefined\n }>(),\n {\n filterSortBy: null,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n placeholder: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\n\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loading = computed(() => requestsRunning.value > 0)\n\nlet byIdsCounter = 0\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n selected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n updateFilterSelected(selected.value)\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n try {\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n selected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n }\n return selectedItemsCache.value\n } finally {\n requestsRunning.value--\n }\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted') => {\n if (props.prefetch === false || props.prefetch !== mode) return\n if (loading.value) return\n if (prefetchCompleted.value) return\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n await tryAutoFetch('focus')\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover')\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst { clearOne } = useFilterClearHelpers()\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\n// Clearing empties the filter in one step, so the filter watcher\n// fetches once for an empty search and keeps only the newest answer.\n// A single-value filter cleared onto its own default does not\n// change, so its watcher does nothing. Its item is restored here.\n// A clear that ends on a default value fetches the empty search here\n// through the counter, because the watcher only fetches for an empty value.\nconst onClickClear = () => {\n clearField()\n const value = filterData[props.name]\n if (isEmpty(value)) return\n if (value === watchedValue) loadListItems(value as T[] | T)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nconst checkFirstLoad = async () => {\n await tryAutoFetch('mounted')\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst noDataText = computed(() => {\n if (loading.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Closing a chip (`closable-chips`) removes its value from the filter, like unticking it in the list.\n// A single-value filter is cleared like the field's clear, since the chip slot draws its value as a chip too.\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (!isArray(selected.value)) {\n selected.value = null\n onSelectedUpdate(null)\n onClickClear()\n return\n }\n selected.value = (selected.value as ValueObjectOption<T>[]).filter((item) => item.value !== closedItem.value)\n onSelectedUpdate(selected.value)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValueFilterData, oldValueFilterData) => {\n watchedValue = newValueFilterData\n if (newValueFilterData === oldValueFilterData || isBoolean(newValueFilterData)) return\n const newValue = newValueFilterData as ModelValueType\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await checkFirstLoad()\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n if (!isUndefined(oldValueFilterData)) {\n apiRequestCounter.value++\n await apiSearch('', apiRequestCounter.value)\n }\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n :no-data-text=\"noDataText\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AFilterRemoteAutocompleteWithMinimal.js","names":["_sfc_main","AFilterRemoteAutocompleteWithMinimal_vue_vue_type_script_setup_true_lang_default","AFilterRemoteAutocompleteWithMinimal_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, onBeforeUnmount, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isBoolean, isNull, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { isOneOf } from '@/shared/utils/enum'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype FetchItemsMinimalByIdsType = ((ids: IntegerId[]) => Promise<any[]>) | ((ids: DocId[]) => Promise<any[]>)\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItemsMinimal: FetchItemsMinimalType\n fetchItemsMinimalByIds: FetchItemsMinimalByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n itemTitle?: string\n itemValue?: string\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n itemTitle: 'name',\n itemValue: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(filterSelected) ||\n isUndefined(filterData) ||\n isUndefined(filterConfig) ||\n isUndefined(filterInnerConfig) ||\n isUndefined(filterInnerData)\n) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter config. ` +\n `Name is '${props.name}' and available options are ${Object.keys(filterData).join(', ')}.`\n )\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\n// The setup above throws unless the field is configured.\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name]!)\n\nconst onBlur = () => {\n isFocused.value = false\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\nconst fetchedItems = ref<any[]>([])\nconst selectedItemsCache = ref<any[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n selectedItemsCache.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n fetchedItems.value.forEach((value) => {\n if (value.raw) {\n final.set(value.raw[props.itemValue], value.raw[props.itemTitle])\n finalRaw.set(value.raw[props.itemValue], cloneDeep(value.raw))\n } else {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n }\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loading = computed(() => requestsRunning.value > 0)\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[props.filterByField] = query\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nonBeforeUnmount(clearAutoFetchTimer)\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n requestsRunning.value++\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!filterConfigCurrent.value.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n filterConfig.touched = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n emit('change')\n}\n\n// Clearing empties the filter in one step and fetches the list once for an empty search through the search counter.\n// So the auto-fetch for an empty filter is not needed. A single-value filter cleared\n// onto its default does not change for its watcher, so its value is shown again here.\nconst onClickClear = () => {\n clearField()\n clearAutoFetchTimer()\n autoFetched.value = true\n const value = filterData[props.name]\n if (!isEmptyValue(value) && value === watchedValue) showValue(value as string | number | Array<string | number>)\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'search') return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nconst isEmptyValue = (value: unknown) => isNull(value) || isUndefined(value) || (isArray(value) && value.length === 0)\n\n/** The value of the filter its watcher (below) saw last. */\nlet watchedValue: unknown\n\n/** Puts a value of the filter into the field and the chips: from the items it has, or read by their ids. */\nconst showValue = async (newValue: string | number | Array<string | number>) => {\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n return\n }\n requestsRunning.value++\n try {\n selectedItemsCache.value = await props.fetchItemsMinimalByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({\n title: item.title,\n value: item.value,\n }))[0]\n updateFilterSelected(selected.value)\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n watchedValue = newValue\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isEmptyValue(newValue)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus', false])) return\n // One pending auto-fetch at a time: a second empty value would otherwise orphan the first timer.\n clearAutoFetchTimer()\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n await showValue(newValue as string | number | Array<string | number>)\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query.length < props.searchMinChars) return\n if (query !== (oldValue ?? '')) {\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n autocomplete=\"off\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :item=\"itemItem\"\n :props=\"itemProps\"\n >\n <VListItem\n v-bind=\"itemProps\"\n :title=\"itemItem.raw.title\"\n :subtitle=\"itemItem.raw.subtitle\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AFilterRemoteAutocompleteWithMinimal.js","names":["AFilterRemoteAutocompleteWithMinimal_vue_vue_type_script_setup_true_lang_default","AFilterRemoteAutocompleteWithMinimal_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AFormRemoteAutocomplete.js","names":["_sfc_main","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","AFormRemoteAutocomplete_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Decremented before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// Empties the value at once and fetches the list once for an empty search\n// through the search counter, so a stale answer cannot overwrite it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AFormRemoteAutocomplete.js","names":["AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","AFormRemoteAutocomplete_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["$slots","_useModel","_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_renderSlot","ACollabLockedByUser","ACollabLockedByUser_default","_hoisted_1","_hoisted_2","SEARCH_DEBOUNCE_MS","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"selected\"","\"selectedModifiers\"","__expose","__emit","props","__props","emit","filterInnerConfig","inject","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","modelValue","useModel","isArray","newValue","cloneDeep","modelValueSelected","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","system","SystemScopeKey","subject","SubjectScopeKey","onBlur","errorMessageComputed","computed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","requestsRunning","loadingLocal","loadingComputed","resetToEmptyState","value","updateSelected","findItem","obj","id","byIdsCounter","loadListItems","requestId","idsArray","ids","res","selectedNewValue","tryLoadModelValue","idsToFetch","tryLoadValue","fetchedData","showErrorsDefault","prefetch","tryAutoFetch","useAlerts","apiSearch","query","pagination","requestCounter","error","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","onClickClear","onChipCloseClick","closedItem","watchDebounced","oldValue","onAutocompleteModelUpdate","cloned","noDataText","isEmpty","openBlock","createBlock","VAutocomplete","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","renderSlot","_ctx"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Decremented before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// Empties the value at once and fetches the list once for an empty search\n// through the search counter, so a stale answer cannot overwrite it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js","names":["$slots","_useModel","_openBlock","_createBlock","_component_VAutocomplete","_withCtx","_createVNode","_component_VListItem","_mergeProps","_component_VChip","_createTextVNode","_toDisplayString","_createElementBlock","_renderSlot","ACollabLockedByUser","ACollabLockedByUser_default","_hoisted_1","_hoisted_2","SEARCH_DEBOUNCE_MS","AFormRemoteAutocomplete_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"selected\"","\"selectedModifiers\"","__expose","__emit","props","__props","emit","filterInnerConfig","inject","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","filterByFieldProp","filterSortByProp","modelValue","useModel","isArray","newValue","cloneDeep","modelValueSelected","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","search","isFocused","modelValueAutocomplete","apiRequestCounter","useI18n","system","SystemScopeKey","subject","SubjectScopeKey","onBlur","errorMessageComputed","computed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","usePagination","isNull","fetchedItems","selectedItemsCache","isFirstLoad","prefetchCompleted","allItems","itemsMap","addToMap","requestsRunning","loadingLocal","loadingComputed","resetToEmptyState","value","updateSelected","findItem","obj","id","byIdsCounter","loadListItems","requestId","idsArray","ids","res","selectedNewValue","tryLoadModelValue","idsToFetch","tryLoadValue","fetchedData","showErrorsDefault","prefetch","tryAutoFetch","useAlerts","apiSearch","query","pagination","requestCounter","error","mode","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","text","onClickClear","onChipCloseClick","closedItem","watchDebounced","oldValue","onAutocompleteModelUpdate","cloned","noDataText","isEmpty","openBlock","createBlock","VAutocomplete","createSlots","withCtx","itemProps","createVNode","VListItem","mergeProps","internalItem","chipProps","VChip","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","renderSlot","_ctx"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { cloneDeep, isArray, isDefined, isEmpty, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId, IntegerIdNullable } from '@/shared/types/common'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { type Pagination, usePagination } from '@/domains/api/composables/pagination'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype ModelValueType = T | T[] | null | undefined\n\nconst props = withDefaults(\n defineProps<{\n label?: string | undefined\n required?: boolean | undefined\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideDetails?: boolean\n hideLabel?: boolean\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<T>[]>\n fetchItemsByIds: (ids: T[]) => Promise<ValueObjectOption<T>[]>\n filterByField: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n collab?: CollabComponentConfig\n disabled?: boolean | undefined\n readonly?: boolean\n chips?: boolean\n closableChips?: boolean\n disableAutoSingleSelect?: boolean // auto select works only when modelValue is empty/null and prefetch is set to 'mounted'\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideDetails: false,\n hideLabel: false,\n filterSortBy: null,\n loading: false,\n collab: undefined,\n disabled: undefined,\n chips: false,\n closableChips: false,\n disableAutoSingleSelect: false,\n prefetch: false,\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n (e: 'blur', data: ModelValueType): void\n (e: 'focus', data: ModelValueType): void\n (e: 'click:chipClose', data: ValueObjectOption<T>): void\n}>()\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterByFieldProp = props.filterByField\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst filterSortByProp = props.filterSortBy\n\nif (isUndefined(filterInnerConfig.fields[filterByFieldProp]) || isUndefined(filterInnerData[filterByFieldProp])) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${filterByFieldProp}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\nconst modelValue = defineModel<ModelValueType>({\n required: true,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\nconst modelValueSelected = defineModel<ValueObjectOption<T> | ValueObjectOption<T>[] | null>('selected', {\n required: false,\n default: null,\n set(newValue) {\n return isArray(newValue) ? cloneDeep(newValue) : newValue\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst search = ref('')\nconst isFocused = ref(false)\nconst modelValueAutocomplete = ref<ValueObjectOption<T> | ValueObjectOption<T>[] | null>(null)\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', modelValue.value)\n props.v?.$touch()\n releaseFieldLock.value(modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst { pagination } = usePagination(isNull(filterSortByProp) ? null : filterSortByProp.key, filterSortByProp?.order)\nconst fetchedItems = ref<ValueObjectOption<T>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<T>[]>([])\nconst isFirstLoad = ref(true)\nconst prefetchCompleted = ref(false)\n\nconst allItems = computed<ValueObjectOption<T>[]>(() => {\n const itemsMap = new Map<T, ValueObjectOption<T>>()\n const addToMap = (items: ValueObjectOption<T>[]) => {\n items.forEach((item) => {\n itemsMap.set(item.value, {\n value: item.value,\n title: item.title,\n subtitle: item.subtitle,\n } as ValueObjectOption<T>)\n })\n }\n\n addToMap(selectedItemsCache.value as ValueObjectOption<T>[])\n addToMap(fetchedItems.value as ValueObjectOption<T>[])\n\n return Array.from(itemsMap.values())\n})\n\n// Counts running requests (by ids, search, prefetch). The spinner stays on until the last one ends.\n// A single flag let a read by ids hide the spinner of a search still running, and the reverse.\nconst requestsRunning = ref(0)\nconst loadingLocal = computed(() => requestsRunning.value > 0)\nconst loadingComputed = computed(() => {\n if (loadingLocal.value) return true\n return props.loading\n})\n\nconst resetToEmptyState = (value: ModelValueType) => {\n byIdsCounter++\n selectedItemsCache.value = []\n modelValueSelected.value = isArray(value) ? [] : null\n modelValueAutocomplete.value = isArray(value) ? [] : null\n}\n\nconst updateSelected = (value: T[] | T) => {\n const findItem = (id: T): ValueObjectOption<T> =>\n allItems.value.find((obj) => obj.value === id) ?? ({ title: `${id}`, value: id } as ValueObjectOption<T>)\n return isArray(value) ? value.map(findItem) : findItem(value)\n}\n\nlet byIdsCounter = 0\nconst loadListItems = async (ids: T[] | T) => {\n const requestId = ++byIdsCounter\n requestsRunning.value++\n\n try {\n const idsArray = isArray(ids) ? ids : [ids]\n const res = await props.fetchItemsByIds(idsArray)\n if (requestId !== byIdsCounter) return selectedItemsCache.value\n selectedItemsCache.value = res\n const selectedNewValue = updateSelected(ids)\n modelValueSelected.value = selectedNewValue\n modelValueAutocomplete.value = selectedNewValue\n return selectedItemsCache.value\n } catch (e) {\n // Mirror tryLoadModelValue: don't let a failed by-ids resolve become a generic global toast (QA 85050).\n showErrorsDefault(e)\n return undefined\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryLoadModelValue = async (tryLoadValue: ModelValueType, prefetch = false) => {\n const idsToFetch = isArray(tryLoadValue) ? tryLoadValue : [tryLoadValue]\n let fetchedData: ValueObjectOption<T>[]\n requestsRunning.value++\n try {\n fetchedData = await props.fetchItemsByIds(idsToFetch as Array<IntegerId & DocId>)\n } catch (e) {\n showErrorsDefault(e)\n return false\n } finally {\n // Decremented before the prefetch below, which bails out while a request of the component runs.\n requestsRunning.value--\n }\n if (!isArray(fetchedData) || fetchedData.length === 0) return false\n selectedItemsCache.value = fetchedData\n const value = props.multiple ? fetchedData.map((item) => item.value) : fetchedData[0]!.value\n modelValue.value = value\n if (prefetch) await tryAutoFetch('force', value)\n return true\n}\n\nconst { showErrorsDefault } = useAlerts()\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n requestsRunning.value++\n filterInnerData[filterByFieldProp] = query\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n } catch (error) {\n showErrorsDefault(error)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst tryAutoFetch = async (mode: 'focus' | 'hover' | 'mounted' | 'force', newValue: ModelValueType) => {\n if (loadingLocal.value) return\n if (mode !== 'force') {\n if (props.prefetch === false || props.prefetch !== mode || prefetchCompleted.value) return\n }\n\n requestsRunning.value++\n try {\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) {\n fetchedItems.value = res\n if (\n !props.disableAutoSingleSelect &&\n mode === 'mounted' &&\n res.length === 1 &&\n (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0))\n ) {\n modelValue.value = props.multiple ? [res[0]!.value] : res[0]!.value\n }\n }\n prefetchCompleted.value = true\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n requestsRunning.value--\n }\n}\n\nconst onFocus = async () => {\n isFocused.value = true\n acquireFieldLock.value()\n await tryAutoFetch('focus', modelValue.value)\n emit('focus', modelValue.value)\n}\n\nconst onMouseEnter = async () => {\n await tryAutoFetch('hover', modelValue.value)\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!props.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\n// Clearing the field first emits a `null` search. Reading its length threw when the field had no focus.\nconst onSearchUpdate = (query: string | null) => {\n const text = query ?? ''\n if (!props.multiple && !isFocused.value && text.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === text) return\n search.value = text\n}\n\n// Empties the value at once and fetches the list once for an empty search\n// through the search counter, so a stale answer cannot overwrite it.\nconst onClickClear = () => {\n modelValue.value = props.multiple ? [] : null\n apiRequestCounter.value++\n apiSearch('', apiRequestCounter.value)\n}\n\nconst onChipCloseClick = (closedItem: ValueObjectOption<T>) => {\n if (isArray(modelValue.value)) {\n modelValue.value = modelValue.value.filter((item) => item !== closedItem.value)\n return\n }\n if (closedItem.value === modelValue.value && props.clearable) {\n modelValue.value = null\n }\n}\n\nwatchDebounced(\n search,\n (newValue: string | null, oldValue: string | null) => {\n const query = newValue ?? ''\n if (query === (oldValue ?? '')) return\n if (query.length > 0 && query.length < props.minSearchChars) return\n if (query.length === 0 && props.prefetch === false) {\n fetchedItems.value = []\n return\n }\n apiRequestCounter.value++\n apiSearch(query, apiRequestCounter.value)\n emit('searchChangeDebounced', query)\n },\n { debounce: SEARCH_DEBOUNCE_MS }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nconst onAutocompleteModelUpdate = (newValue: ValueObjectOption<T> | readonly ValueObjectOption<T>[] | null) => {\n const cloned = cloneDeep(newValue) as ValueObjectOption<T> | ValueObjectOption<T>[] | null\n modelValueSelected.value = cloned\n if (isNull(cloned) || isUndefined(cloned)) {\n modelValue.value = null\n return\n }\n if (isArray(cloned)) {\n modelValue.value = cloned.map((item) => item.value)\n return\n }\n modelValue.value = cloned.value\n}\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItems.value.length === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (isFirstLoad.value) {\n isFirstLoad.value = false\n await tryAutoFetch('mounted', newValue)\n }\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n if (isEmpty(newValue)) {\n resetToEmptyState(newValue)\n return\n }\n await loadListItems(newValue as T[] | T)\n },\n { immediate: true }\n)\n\ndefineExpose({\n tryLoadModelValue,\n})\n</script>\n\n<template>\n <VAutocomplete\n :model-value=\"modelValueAutocomplete as any\"\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :chips=\"chips || multiple || closableChips\"\n :hide-details=\"hideDetails\"\n :loading=\"loadingComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :no-data-text=\"noDataText\"\n return-object\n autocomplete=\"off\"\n :hide-selected=\"closableChips\"\n :closable-chips=\"closableChips && !loadingComputed && !disabledComputed && !readonly\"\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onAutocompleteModelUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template #item=\"{ props: itemProps, internalItem }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"internalItem.raw.title\"\n :subtitle=\"internalItem.raw.subtitle\"\n />\n </template>\n <template #chip=\"{ props: chipProps, internalItem }\">\n <VChip\n :closable=\"chipProps.closable as boolean\"\n close-label=\"common.button.remove\"\n size=\"small\"\n :text=\"`${internalItem.title} (${internalItem.raw.subtitle})`\"\n :disabled=\"internalItem.props.disabled\"\n @click:close=\"onChipCloseClick(internalItem.raw)\"\n >\n {{ internalItem.raw.title }}\n <span\n v-if=\"internalItem.raw.subtitle\"\n class=\"font-italic pl-1\"\n >\n ({{ internalItem.raw.subtitle }})\n </span>\n </VChip>\n </template>\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"$slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AFormRemoteAutocompleteWithCached.js","names":["_sfc_main","AFormRemoteAutocompleteWithCached_vue_vue_type_script_setup_true_lang_default","AFormRemoteAutocompleteWithCached_default"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { usePagination } from '@/domains/api/composables/pagination'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { cloneDeep, isArray, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\ntype UseCachedType = () => {\n fetch: any\n add: any\n addManualMinimal: any\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n label?: string | undefined\n required?: boolean\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideLabel?: boolean\n fetchItemsMinimal: FetchItemsMinimalType\n filterByField?: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n useCached: UseCachedType\n itemTitle?: string\n itemValue?: string\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideLabel: false,\n filterByField: 'name',\n filterSortBy: null,\n loading: false,\n itemTitle: 'name',\n itemValue: 'id',\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'blur', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'focus', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n}>()\n\nconst search = defineModel<string>('search', { default: '', required: false })\nconst loadingLocal = defineModel<boolean>('loadingLocal', { default: false, required: false })\nconst fetchedItemsMinimal = defineModel<Map<IntegerId | DocId, any>>('fetchedItemsMinimal', {\n required: true,\n})\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetch, add, addManualMinimal } = props.useCached()\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItemsMinimal.value.size === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined) {\n emit('update:modelValue', cloneDeep<DocId | IntegerId | DocId[] | IntegerId[] | null | undefined>(newValue))\n },\n})\n\nconst { t } = useI18n()\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst isFocused = ref(false)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', modelValue.value)\n}\n\nconst onBlur = () => {\n isFocused.value = false\n props.v?.$touch()\n emit('blur', modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (!isUndefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (!isUndefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (!isUndefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst { showErrorsDefault } = useAlerts()\n\nlet searchCounter = 0\nconst apiSearch = async (query: string | null) => {\n const requestId = ++searchCounter\n if (isNull(query) || query.length < props.minSearchChars) {\n fetchedItemsMinimal.value.clear()\n // The request in flight, if any, is stale now and leaves the loader alone.\n loadingLocal.value = false\n return\n }\n loadingLocal.value = true\n filterInnerData[props.filterByField] = query\n fetchedItemsMinimal.value.clear()\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestId !== searchCounter) return\n res.forEach((item: any) => {\n fetchedItemsMinimal.value.set(item[props.itemValue], item)\n })\n } catch (e) {\n if (requestId === searchCounter) showErrorsDefault(e)\n } finally {\n if (requestId === searchCounter) loadingLocal.value = false\n }\n}\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final: Map<IntegerId | DocId, string> = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n if (isArray(modelValue.value)) {\n modelValue.value.forEach((value: any) => {\n final.set(value, '')\n })\n } else if (modelValue.value) {\n final.set(modelValue.value, '')\n }\n fetchedItemsMinimal.value.forEach((value) => {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\n})\n\nconst tryToAddFromFetchedItems = (ids: Set<DocId | IntegerId>) => {\n return new Promise<boolean>((resolve) => {\n fetchedItemsMinimal.value.forEach((value, key) => {\n if (ids.has(key)) {\n addManualMinimal(cloneDeep(value))\n }\n })\n return resolve(true)\n })\n}\n\nconst onClickClear = () => {\n search.value = ''\n apiSearch('')\n if (props.multiple) {\n modelValue.value = []\n return\n }\n modelValue.value = null\n}\n\nwatchDebounced(\n search,\n (newValueBug, oldValueBug) => {\n // todo rollback fix when fixed on vuetify/vue use side\n const newValue = newValueBug as unknown as string\n const oldValue = oldValueBug as unknown as string | undefined\n if (newValue !== oldValue) {\n apiSearch(newValue)\n emit('searchChangeDebounced', newValue)\n }\n },\n { debounce: 300 }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nwatch(\n modelValue,\n async (newValue) => {\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n const values = isArray(newValue) ? newValue : [newValue]\n const idsToFetch = new Set(values)\n await tryToAddFromFetchedItems(idsToFetch)\n\n if (idsToFetch.size > 0) {\n add(Array.from(idsToFetch) as Array<DocId & IntegerId>)\n fetch()\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n v-model:search=\"search\"\n chips\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :loading=\"loadingLocal\"\n :no-data-text=\"noDataText\"\n autocomplete=\"off\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @click:clear=\"onClickClear\"\n >\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template #append-item>\n <slot name=\"append-item\" />\n </template>\n <template\n v-if=\"!multiple\"\n #selection\n />\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :props=\"itemProps\"\n :item=\"itemItem\"\n >\n <VListItem :props=\"itemProps\" />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AFormRemoteAutocompleteWithCached.js","names":["AFormRemoteAutocompleteWithCached_vue_vue_type_script_setup_true_lang_default","AFormRemoteAutocompleteWithCached_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AFormRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js","names":["_useModel","oldValue","_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createElementBlock","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_createVNode","_component_VChip","_mergeProps","_component_VListItem","_hoisted_1","AFormRemoteAutocompleteWithCached_vue_vue_type_script_setup_true_lang_default","\"search\"","\"searchModifiers\"","\"loadingLocal\"","\"loadingLocalModifiers\"","\"fetchedItemsMinimal\"","\"fetchedItemsMinimalModifiers\"","__emit","props","__props","emit","search","useModel","loadingLocal","fetchedItemsMinimal","filterInnerConfig","inject","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","noDataText","computed","t","modelValue","cloneDeep","newValue","useI18n","system","SystemScopeKey","subject","SubjectScopeKey","isFocused","ref","usePagination","isNull","onFocus","onBlur","errorMessageComputed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","requiredComputed","useAlerts","searchCounter","apiSearch","requestId","query","res","pagination","showErrorsDefault","allItems","final","finalRaw","isArray","value","key","tryToAddFromFetchedItems","ids","addManualMinimal","resolve","onClickClear","watchDebounced","newValueBug","oldValueBug","watch","oldValue","values","idsToFetch","add","fetch","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","createCommentVNode","createElementBlock","createTextVNode","toDisplayString","renderSlot","_ctx","chipProps","chipItem","createVNode","VChip","mergeProps","itemProps","itemItem","VListItem"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { usePagination } from '@/domains/api/composables/pagination'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { cloneDeep, isArray, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\ntype UseCachedType = () => {\n fetch: any\n add: any\n addManualMinimal: any\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n label?: string | undefined\n required?: boolean\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideLabel?: boolean\n fetchItemsMinimal: FetchItemsMinimalType\n filterByField?: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n useCached: UseCachedType\n itemTitle?: string\n itemValue?: string\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideLabel: false,\n filterByField: 'name',\n filterSortBy: null,\n loading: false,\n itemTitle: 'name',\n itemValue: 'id',\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'blur', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'focus', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n}>()\n\nconst search = defineModel<string>('search', { default: '', required: false })\nconst loadingLocal = defineModel<boolean>('loadingLocal', { default: false, required: false })\nconst fetchedItemsMinimal = defineModel<Map<IntegerId | DocId, any>>('fetchedItemsMinimal', {\n required: true,\n})\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetch, add, addManualMinimal } = props.useCached()\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItemsMinimal.value.size === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined) {\n emit('update:modelValue', cloneDeep<DocId | IntegerId | DocId[] | IntegerId[] | null | undefined>(newValue))\n },\n})\n\nconst { t } = useI18n()\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst isFocused = ref(false)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', modelValue.value)\n}\n\nconst onBlur = () => {\n isFocused.value = false\n props.v?.$touch()\n emit('blur', modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (!isUndefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (!isUndefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (!isUndefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst { showErrorsDefault } = useAlerts()\n\nlet searchCounter = 0\nconst apiSearch = async (query: string | null) => {\n const requestId = ++searchCounter\n if (isNull(query) || query.length < props.minSearchChars) {\n fetchedItemsMinimal.value.clear()\n // The request in flight, if any, is stale now and leaves the loader alone.\n loadingLocal.value = false\n return\n }\n loadingLocal.value = true\n filterInnerData[props.filterByField] = query\n fetchedItemsMinimal.value.clear()\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestId !== searchCounter) return\n res.forEach((item: any) => {\n fetchedItemsMinimal.value.set(item[props.itemValue], item)\n })\n } catch (e) {\n if (requestId === searchCounter) showErrorsDefault(e)\n } finally {\n if (requestId === searchCounter) loadingLocal.value = false\n }\n}\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final: Map<IntegerId | DocId, string> = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n if (isArray(modelValue.value)) {\n modelValue.value.forEach((value: any) => {\n final.set(value, '')\n })\n } else if (modelValue.value) {\n final.set(modelValue.value, '')\n }\n fetchedItemsMinimal.value.forEach((value) => {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\n})\n\nconst tryToAddFromFetchedItems = (ids: Set<DocId | IntegerId>) => {\n return new Promise<boolean>((resolve) => {\n fetchedItemsMinimal.value.forEach((value, key) => {\n if (ids.has(key)) {\n addManualMinimal(cloneDeep(value))\n }\n })\n return resolve(true)\n })\n}\n\nconst onClickClear = () => {\n search.value = ''\n apiSearch('')\n if (props.multiple) {\n modelValue.value = []\n return\n }\n modelValue.value = null\n}\n\nwatchDebounced(\n search,\n (newValueBug, oldValueBug) => {\n // todo rollback fix when fixed on vuetify/vue use side\n const newValue = newValueBug as unknown as string\n const oldValue = oldValueBug as unknown as string | undefined\n if (newValue !== oldValue) {\n apiSearch(newValue)\n emit('searchChangeDebounced', newValue)\n }\n },\n { debounce: 300 }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nwatch(\n modelValue,\n async (newValue) => {\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n const values = isArray(newValue) ? newValue : [newValue]\n const idsToFetch = new Set(values)\n await tryToAddFromFetchedItems(idsToFetch)\n\n if (idsToFetch.size > 0) {\n add(Array.from(idsToFetch) as Array<DocId & IntegerId>)\n fetch()\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n v-model:search=\"search\"\n chips\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :loading=\"loadingLocal\"\n :no-data-text=\"noDataText\"\n autocomplete=\"off\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @click:clear=\"onClickClear\"\n >\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template #append-item>\n <slot name=\"append-item\" />\n </template>\n <template\n v-if=\"!multiple\"\n #selection\n />\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :props=\"itemProps\"\n :item=\"itemItem\"\n >\n <VListItem :props=\"itemProps\" />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AFormRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js","names":["_useModel","oldValue","_openBlock","_createBlock","_component_VAutocomplete","_withCtx","_createElementBlock","_createTextVNode","_toDisplayString","_renderSlot","_createVNode","_component_VChip","_mergeProps","_component_VListItem","_hoisted_1","AFormRemoteAutocompleteWithCached_vue_vue_type_script_setup_true_lang_default","\"search\"","\"searchModifiers\"","\"loadingLocal\"","\"loadingLocalModifiers\"","\"fetchedItemsMinimal\"","\"fetchedItemsMinimalModifiers\"","__emit","props","__props","emit","search","useModel","loadingLocal","fetchedItemsMinimal","filterInnerConfig","inject","FilterInnerConfigKey","filterInnerData","FilterInnerDataKey","componentName","getCurrentInstance","isUndefined","noDataText","computed","t","modelValue","cloneDeep","newValue","useI18n","system","SystemScopeKey","subject","SubjectScopeKey","isFocused","ref","usePagination","isNull","onFocus","onBlur","errorMessageComputed","unref","item","labelComputed","path","stringSplitOnFirstOccurrence","requiredComputed","useAlerts","searchCounter","apiSearch","requestId","query","res","pagination","showErrorsDefault","allItems","final","finalRaw","isArray","value","key","tryToAddFromFetchedItems","ids","addManualMinimal","resolve","onClickClear","watchDebounced","newValueBug","oldValueBug","watch","oldValue","values","idsToFetch","add","fetch","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","createCommentVNode","createElementBlock","createTextVNode","toDisplayString","renderSlot","_ctx","chipProps","chipItem","createVNode","VChip","mergeProps","itemProps","itemItem","VListItem"],"sources":["../../../../src/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, getCurrentInstance, inject, type Ref, ref, watch, unref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { usePagination } from '@/domains/api/composables/pagination'\nimport type { DocId, IntegerId } from '@/shared/types/common'\nimport { cloneDeep, isArray, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport type { FilterConfig, FilterData } from '@/domains/filters/composables/filterFactory'\nimport { FilterInnerConfigKey, FilterInnerDataKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport type { DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { useAlerts } from '@/domains/system/composables/alerts'\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\ntype UseCachedType = () => {\n fetch: any\n add: any\n addManualMinimal: any\n}\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n label?: string | undefined\n required?: boolean\n multiple?: boolean\n clearable?: boolean\n v?: AFormFieldValidation | null\n errorMessage?: string\n hideLabel?: boolean\n fetchItemsMinimal: FetchItemsMinimalType\n filterByField?: string\n filterSortBy?: DatatableSortBy\n loading?: boolean\n useCached: UseCachedType\n itemTitle?: string\n itemValue?: string\n minSearchChars?: number\n minSearchText?: string | undefined\n }>(),\n {\n label: undefined,\n required: undefined,\n multiple: false,\n clearable: false,\n v: null,\n errorMessage: undefined,\n hideLabel: false,\n filterByField: 'name',\n filterSortBy: null,\n loading: false,\n itemTitle: 'name',\n itemValue: 'id',\n minSearchChars: 2,\n minSearchText: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'blur', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'focus', data: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined): void\n (e: 'searchChange', data: string): void\n (e: 'searchChangeDebounced', data: string): void\n}>()\n\nconst search = defineModel<string>('search', { default: '', required: false })\nconst loadingLocal = defineModel<boolean>('loadingLocal', { default: false, required: false })\nconst fetchedItemsMinimal = defineModel<Map<IntegerId | DocId, any>>('fetchedItemsMinimal', {\n required: true,\n})\n\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nconst componentName = getCurrentInstance()?.type.__name\n\nif (isUndefined(filterInnerConfig) || isUndefined(filterInnerData)) {\n throw new Error(`[${componentName}] Incorrect provide/inject config.`)\n}\n\nif (\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error(\n `[${componentName}] Incorrect filter inner config. ` +\n `FilterByField is '${props.filterByField}' and available options are ${Object.keys(filterInnerData).join(', ')}.`\n )\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { fetch, add, addManualMinimal } = props.useCached()\n\nconst noDataText = computed(() => {\n if (loadingLocal.value) {\n return '$vuetify.loading'\n }\n if (fetchedItemsMinimal.value.size === 0 && search.value.length < props.minSearchChars) {\n return isUndefined(props.minSearchText)\n ? t('common.filter.filterMinChars', { min: props.minSearchChars })\n : props.minSearchText\n }\n return undefined\n})\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue: DocId | IntegerId | DocId[] | IntegerId[] | null | undefined) {\n emit('update:modelValue', cloneDeep<DocId | IntegerId | DocId[] | IntegerId[] | null | undefined>(newValue))\n },\n})\n\nconst { t } = useI18n()\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst isFocused = ref(false)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { pagination } = usePagination(\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isNull(props.filterSortBy) ? null : props.filterSortBy.key,\n props.filterSortBy?.order\n)\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', modelValue.value)\n}\n\nconst onBlur = () => {\n isFocused.value = false\n props.v?.$touch()\n emit('blur', modelValue.value)\n}\n\nconst errorMessageComputed = computed(() => {\n if (!isUndefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (!isUndefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (!isUndefined(props.required)) return props.required\n return (props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required'\n})\n\nconst { showErrorsDefault } = useAlerts()\n\nlet searchCounter = 0\nconst apiSearch = async (query: string | null) => {\n const requestId = ++searchCounter\n if (isNull(query) || query.length < props.minSearchChars) {\n fetchedItemsMinimal.value.clear()\n // The request in flight, if any, is stale now and leaves the loader alone.\n loadingLocal.value = false\n return\n }\n loadingLocal.value = true\n filterInnerData[props.filterByField] = query\n fetchedItemsMinimal.value.clear()\n try {\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestId !== searchCounter) return\n res.forEach((item: any) => {\n fetchedItemsMinimal.value.set(item[props.itemValue], item)\n })\n } catch (e) {\n if (requestId === searchCounter) showErrorsDefault(e)\n } finally {\n if (requestId === searchCounter) loadingLocal.value = false\n }\n}\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final: Map<IntegerId | DocId, string> = new Map()\n const finalRaw: Map<IntegerId | DocId, any> = new Map()\n if (isArray(modelValue.value)) {\n modelValue.value.forEach((value: any) => {\n final.set(value, '')\n })\n } else if (modelValue.value) {\n final.set(modelValue.value, '')\n }\n fetchedItemsMinimal.value.forEach((value) => {\n final.set(value[props.itemValue], value[props.itemTitle])\n finalRaw.set(value[props.itemValue], cloneDeep(value))\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value, raw: finalRaw.get(key) }\n })\n})\n\nconst tryToAddFromFetchedItems = (ids: Set<DocId | IntegerId>) => {\n return new Promise<boolean>((resolve) => {\n fetchedItemsMinimal.value.forEach((value, key) => {\n if (ids.has(key)) {\n addManualMinimal(cloneDeep(value))\n }\n })\n return resolve(true)\n })\n}\n\nconst onClickClear = () => {\n search.value = ''\n apiSearch('')\n if (props.multiple) {\n modelValue.value = []\n return\n }\n modelValue.value = null\n}\n\nwatchDebounced(\n search,\n (newValueBug, oldValueBug) => {\n // todo rollback fix when fixed on vuetify/vue use side\n const newValue = newValueBug as unknown as string\n const oldValue = oldValueBug as unknown as string | undefined\n if (newValue !== oldValue) {\n apiSearch(newValue)\n emit('searchChangeDebounced', newValue)\n }\n },\n { debounce: 300 }\n)\n\nwatch(search, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('searchChange', newValue)\n }\n})\n\nwatch(\n modelValue,\n async (newValue) => {\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n const values = isArray(newValue) ? newValue : [newValue]\n const idsToFetch = new Set(values)\n await tryToAddFromFetchedItems(idsToFetch)\n\n if (idsToFetch.size > 0) {\n add(Array.from(idsToFetch) as Array<DocId & IntegerId>)\n fetch()\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n v-model:search=\"search\"\n chips\n :items=\"allItems\"\n no-filter\n :multiple=\"multiple\"\n :clearable=\"clearable\"\n :error-messages=\"errorMessageComputed\"\n :loading=\"loadingLocal\"\n :no-data-text=\"noDataText\"\n autocomplete=\"off\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @click:clear=\"onClickClear\"\n >\n <template #label>\n <span\n v-if=\"!hideLabel\"\n :key=\"requiredComputed + ''\"\n >\n {{ labelComputed }}\n <span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n />\n </span>\n </template>\n <template #append-item>\n <slot name=\"append-item\" />\n </template>\n <template\n v-if=\"!multiple\"\n #selection\n />\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, internalItem: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n close-label=\"common.button.remove\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, internalItem: itemItem }\">\n <slot\n name=\"item\"\n :props=\"itemProps\"\n :item=\"itemItem\"\n >\n <VListItem :props=\"itemProps\" />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AFilterWrapperSubjectSelect.js","names":["_sfc_main","AFilterWrapperSubjectSelect_vue_vue_type_script_setup_true_lang_default","AFilterWrapperSubjectSelect_default"],"sources":["../../../../src/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterSubmitButton from '@/domains/filters/components/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/domains/filters/components/AFilterResetButton.vue'\nimport { computed, inject, nextTick, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n SubjectSelectCloseSidebarKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isBoolean, isDefined, isUndefined } from '@/shared/utils/common'\nimport { type FilterStoreIdentifier, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { datatableSlotName } from '@/domains/filters/datatable/utils/datatable'\nimport FilterDetailItem from '@/domains/filters/components/FilterDetailItem.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport type { AxiosInstance } from 'axios'\nimport AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\n\nconst props = withDefaults(\n defineProps<{\n hideButtons?: boolean\n formName?: string\n disableFilterUrlSync?: boolean\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n }>(),\n {\n hideButtons: false,\n formName: 'search',\n disableFilterUrlSync: false,\n userId: undefined,\n client: undefined,\n store: true,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'reset'): void\n (e: 'bookmarkLoadAfter'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: false,\n})\n\nconst closeSidebarOnMobile = inject(SubjectSelectCloseSidebarKey, () => {})\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst identifier = ref<Partial<FilterStoreIdentifier>>({\n system: filterConfig.general.system,\n subject: filterConfig.general.subject,\n})\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isBoolean(props.store)) {\n identifier.value.system = props.store.system\n identifier.value.subject = props.store.subject\n} else if (false === props.store) {\n identifier.value.system = undefined\n identifier.value.subject = undefined\n}\n\nconst submitResetCounter = ref(0)\nprovide(FilterSubmitResetCounterKey, submitResetCounter)\nconst filterSelected = ref<Map<string, ValueObjectOption<string | number>[]>>(new Map())\nprovide(FilterSelectedKey, filterSelected)\n\nconst submitFilter = () => {\n submitResetCounter.value++\n nextTick(() => {\n emit('submit')\n closeSidebarOnMobile()\n })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n closeSidebarOnMobile()\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n closeSidebarOnMobile()\n })\n}\n\nconst touched = computed(() => {\n return filterConfig.touched\n})\n\n// Names of `filterConfig.fields` itself, so the template's lookups by them always hit.\nconst renderedFieldNames = computed(() => {\n return Object.entries(filterConfig.fields)\n .filter(([, field]) => !field.render.skip)\n .map(([fieldName]) => fieldName)\n})\n\ndefineExpose({\n submit: submitFilter,\n reset: resetFilter,\n})\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <div class=\"subject-select-filter__content px-2 py-4\">\n <slot name=\"bookmarks\">\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <div class=\"d-flex flex-wrap align-center\">\n <FilterBookmarks\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n v-model:datatable-hidden-columns=\"datatableHiddenColumns\"\n :client=\"client\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :user-id=\"userId\"\n @submit=\"submitFilterBookmark\"\n />\n </div>\n </VCol>\n </VRow>\n </slot>\n <slot name=\"detail\">\n <VRow>\n <VCol\n v-for=\"fieldName in renderedFieldNames\"\n :key=\"fieldName\"\n :cols=\"filterConfig.fields[fieldName]!.render.xs || 12\"\n :sm=\"filterConfig.fields[fieldName]!.render.sm || 12\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 12\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 12\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 12\"\n >\n <slot\n :name=\"datatableSlotName(fieldName)\"\n :item-config=\"filterConfig.fields[fieldName]\"\n >\n <FilterDetailItem :name=\"fieldName\" />\n </slot>\n </VCol>\n </VRow>\n </slot>\n </div>\n <div\n v-if=\"!hideButtons\"\n class=\"subject-select-filter__actions\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n <AFilterBookmarkButton\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n :client=\"client\"\n :user=\"userId\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n />\n </slot>\n </div>\n </VForm>\n</template>\n\n<style lang=\"scss\">\n@use 'vuetify/tools' as *;\n\n.a-filter {\n &__container {\n width: 100%;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"AFilterWrapperSubjectSelect.js","names":["AFilterWrapperSubjectSelect_vue_vue_type_script_setup_true_lang_default","AFilterWrapperSubjectSelect_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AFilterWrapperSubjectSelect.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VForm","_withModifiers","_withCtx","_createElementVNode","_renderSlot","_createVNode","_component_VRow","_unref","_component_VCol","FilterBookmarks","_createCommentVNode","_createElementBlock","_Fragment","_renderList","FilterDetailItem","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","AFilterSubmitButton_default","AFilterResetButton_default","FilterDetailItem_default","FilterBookmarks_default","AFilterBookmarkButton_default","_hoisted_1","_hoisted_2","_hoisted_3","AFilterWrapperSubjectSelect_vue_vue_type_script_setup_true_lang_default","\"datatableHiddenColumns\"","\"datatableHiddenColumnsModifiers\"","__expose","__emit","props","__props","emit","datatableHiddenColumns","useModel","closeSidebarOnMobile","inject","SubjectSelectCloseSidebarKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","isUndefined","identifier","ref","isBoolean","submitResetCounter","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","submitFilter","nextTick","useFilterClearHelpers","submitFilterBookmark","resetFilter","clearAll","clearAllFilterSelected","touched","computed","renderedFieldNames","field","fieldName","openBlock","createBlock","VForm","withModifiers","withCtx","createElementVNode","renderSlot","_ctx","createVNode","VRow","unref","isDefined","VCol","_cache","$event","createCommentVNode","createElementBlock","Fragment","renderList","datatableSlotName"],"sources":["../../../../src/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterSubmitButton from '@/domains/filters/components/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/domains/filters/components/AFilterResetButton.vue'\nimport { computed, inject, nextTick, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n SubjectSelectCloseSidebarKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isBoolean, isDefined, isUndefined } from '@/shared/utils/common'\nimport { type FilterStoreIdentifier, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { datatableSlotName } from '@/domains/filters/datatable/utils/datatable'\nimport FilterDetailItem from '@/domains/filters/components/FilterDetailItem.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport type { AxiosInstance } from 'axios'\nimport AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\n\nconst props = withDefaults(\n defineProps<{\n hideButtons?: boolean\n formName?: string\n disableFilterUrlSync?: boolean\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n }>(),\n {\n hideButtons: false,\n formName: 'search',\n disableFilterUrlSync: false,\n userId: undefined,\n client: undefined,\n store: true,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'reset'): void\n (e: 'bookmarkLoadAfter'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: false,\n})\n\nconst closeSidebarOnMobile = inject(SubjectSelectCloseSidebarKey, () => {})\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst identifier = ref<Partial<FilterStoreIdentifier>>({\n system: filterConfig.general.system,\n subject: filterConfig.general.subject,\n})\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isBoolean(props.store)) {\n identifier.value.system = props.store.system\n identifier.value.subject = props.store.subject\n} else if (false === props.store) {\n identifier.value.system = undefined\n identifier.value.subject = undefined\n}\n\nconst submitResetCounter = ref(0)\nprovide(FilterSubmitResetCounterKey, submitResetCounter)\nconst filterSelected = ref<Map<string, ValueObjectOption<string | number>[]>>(new Map())\nprovide(FilterSelectedKey, filterSelected)\n\nconst submitFilter = () => {\n submitResetCounter.value++\n nextTick(() => {\n emit('submit')\n closeSidebarOnMobile()\n })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n closeSidebarOnMobile()\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n closeSidebarOnMobile()\n })\n}\n\nconst touched = computed(() => {\n return filterConfig.touched\n})\n\n// Names of `filterConfig.fields` itself, so the template's lookups by them always hit.\nconst renderedFieldNames = computed(() => {\n return Object.entries(filterConfig.fields)\n .filter(([, field]) => !field.render.skip)\n .map(([fieldName]) => fieldName)\n})\n\ndefineExpose({\n submit: submitFilter,\n reset: resetFilter,\n})\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <div class=\"subject-select-filter__content px-2 py-4\">\n <slot name=\"bookmarks\">\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <div class=\"d-flex flex-wrap align-center\">\n <FilterBookmarks\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n v-model:datatable-hidden-columns=\"datatableHiddenColumns\"\n :client=\"client\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :user-id=\"userId\"\n @submit=\"submitFilterBookmark\"\n />\n </div>\n </VCol>\n </VRow>\n </slot>\n <slot name=\"detail\">\n <VRow>\n <VCol\n v-for=\"fieldName in renderedFieldNames\"\n :key=\"fieldName\"\n :cols=\"filterConfig.fields[fieldName]!.render.xs || 12\"\n :sm=\"filterConfig.fields[fieldName]!.render.sm || 12\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 12\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 12\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 12\"\n >\n <slot\n :name=\"datatableSlotName(fieldName)\"\n :item-config=\"filterConfig.fields[fieldName]\"\n >\n <FilterDetailItem :name=\"fieldName\" />\n </slot>\n </VCol>\n </VRow>\n </slot>\n </div>\n <div\n v-if=\"!hideButtons\"\n class=\"subject-select-filter__actions\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n <AFilterBookmarkButton\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n :client=\"client\"\n :user=\"userId\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n />\n </slot>\n </div>\n </VForm>\n</template>\n\n<style lang=\"scss\">\n@use 'vuetify/tools' as *;\n\n.a-filter {\n &__container {\n width: 100%;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBA,IAAMkC,IAAQC,GAkBRC,IAAOH,GAMPI,IAAyBrC,EAAiCmC,GAAC,wBAGhE,GAEKI,IAAuBC,EAAOC,UAAoC,CAAC,CAAC,GAEpEC,IAAeF,EAAOG,CAAe,GACrCC,IAAaJ,EAAOK,CAAa;EACvC,IAAIC,EAAYJ,CAAY,KAAKI,EAAYF,CAAU,GACrD,MAAU,MAAM,kCAAkC;EAGpD,IAAMG,IAAaC,EAAoC;GACrD,QAAQN,EAAa,QAAQ;GAC7B,SAASA,EAAa,QAAQ;EAChC,CAAC;EAED,AAAKO,EAAUf,EAAM,KAAK,IAGf,OAAUA,EAAM,UACzB,EAAW,MAAM,SAAS,KAAA,GAC1B,EAAW,MAAM,UAAU,KAAA,MAJ3B,EAAW,MAAM,SAASA,EAAM,MAAM,QACtC,EAAW,MAAM,UAAUA,EAAM,MAAM;EAMzC,IAAMgB,IAAqBF,EAAI,CAAC;EAChC,EAAQG,GAA6BD,CAAkB;EACvD,IAAME,IAAiBJ,kBAAuD,IAAI,IAAI,CAAC;EACvF,EAAQK,GAAmBD,CAAc;EAEzC,IAAME,UAAqB;GAEzB,AADA,EAAmB,SACnBC,QAAe;IAEb,AADAnB,EAAK,QAAQ,GACbG,EAAqB;GACvB,CAAC;EACH,GAEM,EAAE,aAAU,8BAA2BiB,EAAsB,GAE7DC,WAA6B;GACjC,QAAe;IAGb,AAFA,EAAmB,SACnBrB,EAAK,mBAAmB,GACxBG,EAAqB;GACvB,CAAC;EACH,GAEMmB,UAAoB;GAGxB,AAFAC,EAASf,GAAYF,CAAY,GACjCkB,EAAuBhB,GAAYF,GAAcU,CAAc,GAC/DG,QAAe;IAGb,AAFA,EAAmB,SACnBnB,EAAK,OAAO,GACZG,EAAqB;GACvB,CAAC;EACH,GAEMsB,KAAUC,QACPpB,EAAa,OACrB,GAGKqB,KAAqBD,QAClB,OAAO,QAAQpB,EAAa,MAAM,CAAA,CACtC,QAAQ,GAAGsB,OAAW,CAACA,EAAM,OAAO,IAAI,CAAA,CACxC,KAAK,CAACC,OAAeA,CAAS,CAClC;E,OAEDjC,EAAa;GACX,QAAQsB;GACR,OAAOI;EACT,CAAC,I,UAICzD,EAAA,GAAAC,EA4DQC,GAAA;GA3DL,MAAMgC,EAAA;GACN,UAAM/B,EAAUkD,GAAY,CAAA,SAAA,CAAA;;GAE7B,SAAAjD,QAsCM,CAtCNC,EAsCM,OAtCNoB,GAsCM,CArCJnB,EAgBOkE,EAAA,QAAA,aAAA,CAAA,SAAA,CAfLjE,EAcOC,GAAA,EAdD,SAAQ,UAAS,GAAA;IACrB,SAAAJ,QAYO,CAZK8B,EAAA,SAASA,EAAA,UAAUzB,EAAAmE,CAAA,CAAS,CAAC1C,EAAA,MAAM,KAA/ClC,EAAA,GAAAC,EAYOS,GAAA,EAAA,KAAA,EAAA,GAAA;KAXL,SAAAN,QAUM,CAVNC,EAUM,OAVNqB,GAUM,CARIoB,EAAA,MAAW,UAAUA,EAAA,MAAW,WAAWZ,EAAA,UAAUzB,EAAAmE,CAAA,CAAS,CAAC1C,EAAA,MAAM,KAD7ElC,EAAA,GAAAC,EAQEU,GAAA;;MANQ,4BAA0ByB,EAAA;MAAA,mCAAA,AAAA0C,EAAA,QAAA,MAAA,EAAsB,QAAAC;MACvD,QAAQ7C,EAAA;MACR,QAAQY,EAAA,MAAW;MACnB,SAASA,EAAA,MAAW;MACpB,WAASZ,EAAA;MACT,UAAQsB;;;;;;;;;;;G,MAMnBlD,EAmBOkE,EAAA,QAAA,UAAA,CAAA,SAAA,CAlBLjE,EAiBOC,GAAA,MAAA;IAfH,SAAAJ,QAAuC,EADzCJ,EAAA,EAAA,GAAAa,EAeOC,GAAA,MAAAC,EAde+C,GAAA,QAAb,OADT9D,EAAA,GAAAC,EAeOS,GAAA;KAbJ,KAAKsD;KACL,MAAMvD,EAAAgC,CAAA,CAAY,CAAC,OAAOuB,EAAS,CAAG,OAAO,MAAE;KAC/C,IAAIvD,EAAAgC,CAAA,CAAY,CAAC,OAAOuB,EAAS,CAAG,OAAO,MAAE;KAC7C,IAAIvD,EAAAgC,CAAA,CAAY,CAAC,OAAOuB,EAAS,CAAG,OAAO,MAAE;KAC7C,IAAIvD,EAAAgC,CAAA,CAAY,CAAC,OAAOuB,EAAS,CAAG,OAAO,MAAE;KAC7C,IAAIvD,EAAAgC,CAAA,CAAY,CAAC,OAAOuB,EAAS,CAAG,OAAO,MAAE;;KAE9C,SAAA5D,QAKO,CALPE,EAKOkE,EAAA,QAJE/D,EAAA2E,CAAA,CAAiB,CAACpB,CAAS,GAAA,EACjC,YAAavD,EAAAgC,CAAA,CAAY,CAAC,OAAOuB,GAFpC,SAKO,CADLzD,EAAsCS,GAAA,EAAnB,MAAMgD,EAAS,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,C;;;;;;;;;;G,QAOnC9B,EAAA,c,aADTlC,EAAA,GAAAa,EAgBM,OAhBNc,GAgBM,CAZJrB,EAWOkE,EAAA,QAAA,WAAA,CAAA,SAAA;IAVLjE,EAA0CU,GAAA,EAApB,SAAS2C,GAAA,MAAO,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA;IACtCrD,EAA2CW,GAAA,EAAtB,SAAOuC,EAAW,CAAA;IAE/BX,EAAA,MAAW,UAAUA,EAAA,MAAW,WAAWZ,EAAA,UAAUzB,EAAAmE,CAAA,CAAS,CAAC1C,EAAA,MAAM,KAD7ElC,EAAA,GAAAC,EAOEkB,GAAA;;KALC,QAAQe,EAAA;KACR,MAAMA,EAAA;KACN,QAAQY,EAAA,MAAW;KACnB,SAASA,EAAA,MAAW;KACpB,4BAA0BV,EAAA"}
1
+ {"version":3,"file":"AFilterWrapperSubjectSelect.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VForm","_withModifiers","_withCtx","_createElementVNode","_renderSlot","_createVNode","_component_VRow","_unref","_component_VCol","FilterBookmarks","_createElementBlock","_Fragment","_renderList","FilterDetailItem","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","AFilterSubmitButton_default","AFilterResetButton_default","FilterDetailItem_default","FilterBookmarks_default","AFilterBookmarkButton_default","_hoisted_1","_hoisted_2","_hoisted_3","AFilterWrapperSubjectSelect_vue_vue_type_script_setup_true_lang_default","\"datatableHiddenColumns\"","\"datatableHiddenColumnsModifiers\"","__expose","__emit","props","__props","emit","datatableHiddenColumns","useModel","closeSidebarOnMobile","inject","SubjectSelectCloseSidebarKey","filterConfig","FilterConfigKey","filterData","FilterDataKey","isUndefined","identifier","ref","isBoolean","submitResetCounter","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","submitFilter","nextTick","useFilterClearHelpers","submitFilterBookmark","resetFilter","clearAll","clearAllFilterSelected","touched","computed","renderedFieldNames","field","fieldName","openBlock","createBlock","VForm","withModifiers","withCtx","createElementVNode","renderSlot","_ctx","createVNode","VRow","unref","isDefined","VCol","_cache","$event","createCommentVNode","createElementBlock","Fragment","renderList","datatableSlotName"],"sources":["../../../../src/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterSubmitButton from '@/domains/filters/components/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/domains/filters/components/AFilterResetButton.vue'\nimport { computed, inject, nextTick, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n SubjectSelectCloseSidebarKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\nimport { isBoolean, isDefined, isUndefined } from '@/shared/utils/common'\nimport { type FilterStoreIdentifier, useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\nimport { datatableSlotName } from '@/domains/filters/datatable/utils/datatable'\nimport FilterDetailItem from '@/domains/filters/components/FilterDetailItem.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport type { AxiosInstance } from 'axios'\nimport AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\n\nconst props = withDefaults(\n defineProps<{\n hideButtons?: boolean\n formName?: string\n disableFilterUrlSync?: boolean\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n }>(),\n {\n hideButtons: false,\n formName: 'search',\n disableFilterUrlSync: false,\n userId: undefined,\n client: undefined,\n store: true,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'reset'): void\n (e: 'bookmarkLoadAfter'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: false,\n})\n\nconst closeSidebarOnMobile = inject(SubjectSelectCloseSidebarKey, () => {})\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst identifier = ref<Partial<FilterStoreIdentifier>>({\n system: filterConfig.general.system,\n subject: filterConfig.general.subject,\n})\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (!isBoolean(props.store)) {\n identifier.value.system = props.store.system\n identifier.value.subject = props.store.subject\n} else if (false === props.store) {\n identifier.value.system = undefined\n identifier.value.subject = undefined\n}\n\nconst submitResetCounter = ref(0)\nprovide(FilterSubmitResetCounterKey, submitResetCounter)\nconst filterSelected = ref<Map<string, ValueObjectOption<string | number>[]>>(new Map())\nprovide(FilterSelectedKey, filterSelected)\n\nconst submitFilter = () => {\n submitResetCounter.value++\n nextTick(() => {\n emit('submit')\n closeSidebarOnMobile()\n })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n closeSidebarOnMobile()\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n closeSidebarOnMobile()\n })\n}\n\nconst touched = computed(() => {\n return filterConfig.touched\n})\n\n// Names of `filterConfig.fields` itself, so the template's lookups by them always hit.\nconst renderedFieldNames = computed(() => {\n return Object.entries(filterConfig.fields)\n .filter(([, field]) => !field.render.skip)\n .map(([fieldName]) => fieldName)\n})\n\ndefineExpose({\n submit: submitFilter,\n reset: resetFilter,\n})\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <div class=\"subject-select-filter__content px-2 py-4\">\n <slot name=\"bookmarks\">\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <div class=\"d-flex flex-wrap align-center\">\n <FilterBookmarks\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n v-model:datatable-hidden-columns=\"datatableHiddenColumns\"\n :client=\"client\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :user-id=\"userId\"\n @submit=\"submitFilterBookmark\"\n />\n </div>\n </VCol>\n </VRow>\n </slot>\n <slot name=\"detail\">\n <VRow>\n <VCol\n v-for=\"fieldName in renderedFieldNames\"\n :key=\"fieldName\"\n :cols=\"filterConfig.fields[fieldName]!.render.xs || 12\"\n :sm=\"filterConfig.fields[fieldName]!.render.sm || 12\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 12\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 12\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 12\"\n >\n <slot\n :name=\"datatableSlotName(fieldName)\"\n :item-config=\"filterConfig.fields[fieldName]\"\n >\n <FilterDetailItem :name=\"fieldName\" />\n </slot>\n </VCol>\n </VRow>\n </slot>\n </div>\n <div\n v-if=\"!hideButtons\"\n class=\"subject-select-filter__actions\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n <AFilterBookmarkButton\n v-if=\"identifier.system && identifier.subject && userId && isDefined(client)\"\n :client=\"client\"\n :user=\"userId\"\n :system=\"identifier.system\"\n :subject=\"identifier.subject\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n />\n </slot>\n </div>\n </VForm>\n</template>\n\n<style lang=\"scss\">\n@use 'vuetify/tools' as *;\n\n.a-filter {\n &__container {\n width: 100%;\n }\n}\n</style>\n"],"mappings":"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"}