@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.7

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 (690) hide show
  1. package/README.md +4 -0
  2. package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
  3. package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
  4. package/dist/common-admin.css +1 -1
  5. package/dist/common-admin.js +282 -282
  6. package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
  7. package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
  8. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
  9. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
  10. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  11. package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
  12. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
  13. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
  15. package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
  16. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
  18. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
  20. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
  22. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
  23. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
  25. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
  26. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
  28. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
  29. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
  31. package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
  32. package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
  34. package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
  35. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
  37. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  38. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
  39. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
  40. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
  42. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
  44. package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
  45. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
  47. package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
  49. package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
  50. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
  52. package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
  53. package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
  54. package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
  55. package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
  56. package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
  57. package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
  58. package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
  59. package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
  60. package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
  61. package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
  62. package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
  63. package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
  64. package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
  65. package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
  66. package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
  67. package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
  68. package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
  69. package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
  70. package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
  71. package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
  72. package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
  73. package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
  74. package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
  75. package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
  76. package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
  77. package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
  78. package/dist/domains/api/composables/defineApiClient.js.map +1 -1
  79. package/dist/domains/api/composables/request.d.ts +18 -48
  80. package/dist/domains/api/composables/request.js.map +1 -1
  81. package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
  82. package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
  83. package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
  84. package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
  85. package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
  86. package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
  87. package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
  88. package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
  89. package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
  90. package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
  91. package/dist/domains/api/composables/useApiRequest.js.map +1 -1
  92. package/dist/domains/api/utils/apiErrors.d.ts +28 -55
  93. package/dist/domains/api/utils/apiErrors.js.map +1 -1
  94. package/dist/domains/api/utils/listBody.d.ts +22 -43
  95. package/dist/domains/api/utils/listBody.js.map +1 -1
  96. package/dist/domains/auth/components/Acl.js.map +1 -1
  97. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
  99. package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
  100. package/dist/domains/auth/composables/defineAuth.js.map +1 -1
  101. package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
  102. package/dist/domains/auth/composables/refreshSession.js.map +1 -1
  103. package/dist/domains/cached/components/ACachedChip.js.map +1 -1
  104. package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
  105. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/domains/cached/components/ACachedUserChip.js +1 -1
  107. package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
  108. package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
  109. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
  111. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
  112. package/dist/domains/cached/composables/defineCached.d.ts +13 -11
  113. package/dist/domains/cached/composables/defineCached.js.map +1 -1
  114. package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
  115. package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
  116. package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
  117. package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
  119. package/dist/domains/collab/composables/collabField.d.ts +5 -3
  120. package/dist/domains/collab/composables/collabField.js.map +1 -1
  121. package/dist/domains/collab/composables/collabInit.js +58 -54
  122. package/dist/domains/collab/composables/collabInit.js.map +1 -1
  123. package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
  124. package/dist/domains/collab/composables/collabRecovery.js +99 -0
  125. package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
  126. package/dist/domains/collab/composables/collabRoom.js +106 -106
  127. package/dist/domains/collab/composables/collabRoom.js.map +1 -1
  128. package/dist/domains/collab/composables/collabState.d.ts +11 -4
  129. package/dist/domains/collab/composables/collabState.js +34 -25
  130. package/dist/domains/collab/composables/collabState.js.map +1 -1
  131. package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
  132. package/dist/domains/collab/types/Collab.d.ts +31 -5
  133. package/dist/domains/collab/types/Collab.js +23 -11
  134. package/dist/domains/collab/types/Collab.js.map +1 -1
  135. package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
  136. package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
  137. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
  139. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
  141. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
  142. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
  144. package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
  145. package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
  146. package/dist/domains/dam/api/damAssetApi.js.map +1 -1
  147. package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
  148. package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
  149. package/dist/domains/dam/api/damConstants.js.map +1 -1
  150. package/dist/domains/dam/api/damEndPoints.js.map +1 -1
  151. package/dist/domains/dam/api/damImageApi.js.map +1 -1
  152. package/dist/domains/dam/api/uploadApi.js.map +1 -1
  153. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
  154. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
  155. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
  157. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  158. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
  159. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
  160. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
  162. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
  163. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
  165. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
  167. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
  169. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
  170. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
  172. package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
  173. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
  175. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
  176. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
  178. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  179. package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
  180. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
  182. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
  183. package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
  184. package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
  185. package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
  186. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
  187. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
  188. package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
  189. package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
  190. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
  191. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
  193. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
  194. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
  196. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
  197. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
  199. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  200. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
  201. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
  202. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  203. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
  204. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  205. package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
  206. package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
  207. package/dist/domains/dam/author/api/authorApi.js.map +1 -1
  208. package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
  209. package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
  210. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
  212. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
  213. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  214. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
  215. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  216. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
  217. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
  218. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
  219. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
  221. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
  222. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
  224. package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
  225. package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
  226. package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
  227. package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
  228. package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
  229. package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
  230. package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
  232. package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
  233. package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
  234. package/dist/domains/dam/composables/damConfigName.js.map +1 -1
  235. package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
  236. package/dist/domains/dam/composables/damNotifications.js.map +1 -1
  237. package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
  238. package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
  239. package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
  240. package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
  241. package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
  242. package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
  243. package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
  244. package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
  245. package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
  246. package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
  247. package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
  248. package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
  249. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
  250. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
  251. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  252. package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
  253. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  254. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
  255. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
  257. package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
  258. package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
  259. package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
  260. package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
  261. package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
  262. package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
  263. package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
  264. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
  265. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
  266. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
  267. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
  269. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  270. package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
  271. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
  273. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  274. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
  275. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
  276. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
  277. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
  278. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  279. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
  280. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
  281. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
  283. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
  284. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  285. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
  286. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
  287. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  288. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
  289. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
  290. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  291. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
  292. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  293. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
  294. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  295. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
  296. package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
  297. package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
  298. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
  299. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
  300. package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
  301. package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
  302. package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
  303. package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
  304. package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
  305. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
  306. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
  307. package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
  308. package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
  309. package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
  310. package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
  311. package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
  312. package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
  313. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
  314. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
  315. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  316. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
  317. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
  318. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  319. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
  320. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
  321. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
  322. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  323. package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
  324. package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
  325. package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
  326. package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
  327. package/dist/domains/dam/types/Asset.d.ts +1 -1
  328. package/dist/domains/dam/types/Asset.js.map +1 -1
  329. package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
  330. package/dist/domains/dam/types/UploadQueue.js.map +1 -1
  331. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
  332. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  333. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
  334. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
  335. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  336. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
  337. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  338. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
  339. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  340. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
  341. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
  342. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  343. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
  344. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
  345. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  346. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
  347. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  348. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
  349. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
  350. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  351. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
  352. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
  353. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  354. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
  355. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
  356. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
  357. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
  358. package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
  359. package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
  360. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
  361. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
  362. package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
  363. package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
  364. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
  365. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
  366. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
  367. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
  368. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
  369. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
  370. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
  371. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
  372. package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
  373. package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
  374. package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
  375. package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
  376. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
  377. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
  378. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
  379. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
  380. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
  381. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
  382. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
  383. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
  384. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
  385. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
  386. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
  387. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
  388. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
  389. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
  390. package/dist/domains/dam/user/api/userApi.d.ts +2 -2
  391. package/dist/domains/dam/user/api/userApi.js.map +1 -1
  392. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
  393. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
  394. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  395. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
  396. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
  397. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  398. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
  399. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
  400. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  401. package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
  402. package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
  403. package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
  404. package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
  405. package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
  406. package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
  407. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
  408. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  409. package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
  410. package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
  411. package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
  412. package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  413. package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
  414. package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  415. package/dist/domains/filters/components/AFilterString.js.map +1 -1
  416. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
  417. package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
  418. package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
  419. package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
  420. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
  421. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
  422. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  423. package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
  424. package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
  425. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +63 -62
  426. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  427. package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
  428. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  429. package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
  430. package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
  431. package/dist/domains/filters/composables/filterFactory.js +38 -31
  432. package/dist/domains/filters/composables/filterFactory.js.map +1 -1
  433. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  434. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
  435. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
  436. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  437. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
  438. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  439. package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
  440. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  441. package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
  442. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  443. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  444. package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
  445. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  446. package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
  447. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  448. package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
  449. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  450. package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
  451. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
  452. package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
  453. package/dist/domains/job/api/jobApi.js.map +1 -1
  454. package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
  455. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  456. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  457. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  458. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
  459. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  460. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  461. package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
  462. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  463. package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
  464. package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
  465. package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
  466. package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
  467. package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
  468. package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
  469. package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
  470. package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
  471. package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
  472. package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
  473. package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
  474. package/dist/domains/log/api/logApi.d.ts +2 -3
  475. package/dist/domains/log/api/logApi.js.map +1 -1
  476. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  477. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  478. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  479. package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
  480. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  481. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  482. package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  483. package/dist/domains/log/components/ALogListView.js.map +1 -1
  484. package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
  485. package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  486. package/dist/domains/log/composables/logActions.d.ts +4 -5
  487. package/dist/domains/log/composables/logActions.js.map +1 -1
  488. package/dist/domains/log/composables/logType.d.ts +6 -7
  489. package/dist/domains/log/composables/logType.js.map +1 -1
  490. package/dist/domains/log/filter/logFilter.d.ts +8 -11
  491. package/dist/domains/log/filter/logFilter.js.map +1 -1
  492. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  493. package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
  494. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  495. package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
  496. package/dist/domains/permission/composables/permissionActions.js.map +1 -1
  497. package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
  498. package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
  499. package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
  500. package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
  501. package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
  502. package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
  503. package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
  504. package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
  505. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  506. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
  507. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  508. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  509. package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
  510. package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  511. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  512. package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
  513. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  514. package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
  515. package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
  516. package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
  517. package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
  518. package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
  519. package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
  520. package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
  521. package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
  522. package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
  523. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  524. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  525. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  526. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  527. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  528. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  529. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
  530. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
  531. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
  532. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
  533. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  534. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  535. package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
  536. package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
  537. package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
  538. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  539. package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
  540. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  541. package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
  542. package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
  543. package/dist/domains/system/components/AAlerts.js.map +1 -1
  544. package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  545. package/dist/domains/system/composables/alerts.js.map +1 -1
  546. package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
  547. package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
  548. package/dist/domains/system/composables/languageSettings.js.map +1 -1
  549. package/dist/domains/system/composables/loginStatus.js.map +1 -1
  550. package/dist/domains/system/composables/navigationError.d.ts +6 -8
  551. package/dist/domains/system/composables/navigationError.js.map +1 -1
  552. package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
  553. package/dist/domains/system/composables/pageNavigation.js.map +1 -1
  554. package/dist/domains/system/composables/recordActions.d.ts +14 -22
  555. package/dist/domains/system/composables/recordActions.js.map +1 -1
  556. package/dist/domains/system/composables/recordPage.d.ts +23 -38
  557. package/dist/domains/system/composables/recordPage.js.map +1 -1
  558. package/dist/domains/system/composables/routeHistory.d.ts +4 -5
  559. package/dist/domains/system/composables/routeHistory.js.map +1 -1
  560. package/dist/domains/system/composables/sentry.js.map +1 -1
  561. package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
  562. package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
  563. package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
  564. package/dist/domains/system/store/datatablePageStore.js +10 -3
  565. package/dist/domains/system/store/datatablePageStore.js.map +1 -1
  566. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  567. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  568. package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
  569. package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
  570. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  571. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
  572. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
  573. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  574. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  575. package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
  576. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  577. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  578. package/dist/domains/ui/components/ACard.js.map +1 -1
  579. package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
  580. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
  581. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  582. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  583. package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
  584. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
  585. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  586. package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
  587. package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
  588. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  589. package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
  590. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  591. package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
  592. package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
  593. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  594. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  595. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  596. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
  597. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  598. package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
  599. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  600. package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
  601. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  602. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  603. package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
  604. package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  606. package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
  607. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  608. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  609. package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
  610. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  611. package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
  612. package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
  613. package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
  614. package/dist/domains/ui/view/components/ALoginView.js +1 -1
  615. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  616. package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
  617. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  618. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  619. package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  620. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  621. package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  622. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
  623. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
  624. package/dist/lib.d.ts +2 -2
  625. package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
  626. package/dist/plugins/commonVuetifyConfig.js.map +1 -1
  627. package/dist/plugins/i18n.d.ts +4 -5
  628. package/dist/plugins/i18n.js.map +1 -1
  629. package/dist/plugins/pluginOptions.d.ts +4 -2
  630. package/dist/plugins/pluginOptions.js.map +1 -1
  631. package/dist/plugins/webfontloader.js.map +1 -1
  632. package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
  633. package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
  634. package/dist/shared/error/AnzuError.d.ts +3 -5
  635. package/dist/shared/error/AnzuError.js.map +1 -1
  636. package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
  637. package/dist/shared/error/AuthUnavailableError.js.map +1 -1
  638. package/dist/shared/error/isInCauseChain.d.ts +2 -2
  639. package/dist/shared/error/isInCauseChain.js.map +1 -1
  640. package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
  641. package/dist/shared/types/Validation.d.ts +4 -5
  642. package/dist/shared/types/common.d.ts +1 -3
  643. package/dist/shared/types/globalComponents.d.ts +5 -6
  644. package/dist/shared/utils/common.js.map +1 -1
  645. package/dist/shared/utils/datetime.d.ts +0 -1
  646. package/dist/shared/utils/datetime.js.map +1 -1
  647. package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
  648. package/dist/shared/utils/datetimePickerValue.js.map +1 -1
  649. package/dist/shared/utils/development.d.ts +3 -3
  650. package/dist/shared/utils/development.js.map +1 -1
  651. package/dist/shared/utils/envConfig.d.ts +4 -4
  652. package/dist/shared/utils/envConfig.js.map +1 -1
  653. package/dist/shared/utils/json.d.ts +1 -1
  654. package/dist/shared/utils/json.js.map +1 -1
  655. package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
  656. package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
  657. package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
  658. package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
  659. package/dist/testing/appShell.d.ts +11 -11
  660. package/dist/testing/appShell.js.map +1 -1
  661. package/dist/testing/closeButtons.d.ts +9 -11
  662. package/dist/testing/closeButtons.js.map +1 -1
  663. package/dist/testing/declaredDependencies.d.ts +7 -7
  664. package/dist/testing/declaredDependencies.js.map +1 -1
  665. package/dist/testing/generatedRoutes.d.ts +6 -11
  666. package/dist/testing/generatedRoutes.js.map +1 -1
  667. package/dist/testing/routeHistory.d.ts +5 -12
  668. package/dist/testing/routeHistory.js.map +1 -1
  669. package/dist/testing/sortableLists.d.ts +16 -21
  670. package/dist/testing/sortableLists.js.map +1 -1
  671. package/dist/testing/typedRouter.d.ts +0 -1
  672. package/dist/testing/typedRouter.js.map +1 -1
  673. package/package.json +39 -29
  674. package/src/e2e/conventions.d.mts +4 -0
  675. package/src/e2e/conventions.mjs +15 -0
  676. package/src/e2e/index.d.mts +8 -0
  677. package/src/e2e/index.mjs +1 -0
  678. package/src/e2e/routeWalk.d.mts +43 -0
  679. package/src/e2e/routeWalk.mjs +606 -0
  680. package/src/e2e/types.d.mts +161 -0
  681. package/src/eslint/adminConfig.mjs +19 -27
  682. package/src/eslint/globalComponentNames.mjs +3 -4
  683. package/src/eslint/oxlint.mjs +7 -20
  684. package/src/eslint/plugin.d.mts +2 -4
  685. package/src/eslint/plugin.mjs +18 -34
  686. package/src/eslint/validRouteName.mjs +6 -7
  687. package/src/vite/devWatch.mjs +30 -43
  688. package/src/vite/index.d.mts +5 -5
  689. package/src/vite/sentry.mjs +7 -12
  690. package/src/vite/sourcemaps.mjs +4 -8
@@ -1 +1 @@
1
- {"version":3,"file":"AFilterWrapper.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VForm","_withModifiers","_withCtx","_component_VRow","_createVNode","_component_VCol","_renderSlot","_createCommentVNode","_unref","_createElementVNode","FilterBookmarks","AFilterAdvancedButton","FiltersSelected","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","_createElementBlock","_resolveDynamicComponent","_withDirectives","_normalizeClass","_Fragment","_renderList","FilterDetailItem","_vShow","AFilterSubmitButton_default","AFilterResetButton_default","FilterDetailItem_default","FilterBookmarks_default","AFilterBookmarkButton_default","AFilterAdvancedButton_default","FiltersSelected_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AFilterWrapper_vue_vue_type_script_setup_true_lang_default","\"datatableHiddenColumns\"","\"datatableHiddenColumnsModifiers\"","\"showDetail\"","\"showDetailModifiers\"","__expose","__emit","props","__props","emit","datatableHiddenColumns","useModel","showDetail","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","isUndefined","identifier","ref","isBoolean","submitResetCounter","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","submitFilter","nextTick","useFilterClearHelpers","submitFilterBookmark","resetFilter","clearAll","clearAllFilterSelected","toggleFilterDetail","touched","computed","renderedFieldNames","field","fieldName","openBlock","createBlock","VForm","withModifiers","withCtx","VRow","createVNode","VCol","renderSlot","_ctx","createCommentVNode","unref","isDefined","createElementVNode","_cache","$event","createElementBlock","resolveDynamicComponent","withDirectives","normalizeClass","Fragment","renderList","datatableSlotName","vShow"],"sources":["../../../../src/domains/filters/components/AFilterWrapper.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterAdvancedButton from '@/domains/filters/components/AFilterAdvancedButton.vue'\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} from '@/domains/filters/utils/filterInjectionKeys'\nimport FiltersSelected from '@/domains/filters/components/FiltersSelected.vue'\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 AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { type AxiosInstance } from 'axios'\n\nconst props = withDefaults(\n defineProps<{\n enableTop?: boolean\n hideButtons?: boolean\n formName?: string\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n alwaysVisible?: boolean\n hideMore?: boolean\n }>(),\n {\n enableTop: false,\n hideButtons: false,\n formName: 'search',\n userId: undefined,\n client: undefined,\n store: true,\n alwaysVisible: false,\n hideMore: false,\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})\nconst showDetail = defineModel<boolean>('showDetail', { default: false, required: false })\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\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}\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 })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n })\n}\n\nconst toggleFilterDetail = () => {\n showDetail.value = !showDetail.value\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\nif (props.alwaysVisible) {\n showDetail.value = true\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 <VRow\n v-if=\"enableTop\"\n density=\"compact\"\n >\n <VCol>\n <slot name=\"top\" />\n </VCol>\n </VRow>\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <slot name=\"bookmarks\">\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 </slot>\n </VCol>\n </VRow>\n <VRow\n v-if=\"!alwaysVisible\"\n density=\"compact\"\n >\n <VCol\n v-if=\"!hideMore\"\n cols=\"auto\"\n >\n <AFilterAdvancedButton\n :button-active=\"showDetail\"\n @advanced-filter=\"toggleFilterDetail\"\n />\n </VCol>\n <VCol>\n <div class=\"a-filter__container\">\n <div class=\"a-filter__search\">\n <slot name=\"search\" />\n </div>\n <FiltersSelected />\n </div>\n </VCol>\n <VCol\n v-if=\"!hideButtons\"\n class=\"text-right\"\n cols=\"auto\"\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 </VCol>\n </VRow>\n <div v-if=\"!hideMore\">\n <component :is=\"alwaysVisible ? 'div' : 'VSlideYTransition'\">\n <div\n v-show=\"showDetail\"\n :class=\"{ 'mt-6 pa-4 border': !alwaysVisible }\"\n >\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 || 6\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 4\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 3\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 2\"\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 </component>\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 &__search {\n display: inline-flex;\n vertical-align: middle;\n min-width: 100%;\n height: 34px;\n\n @include media-breakpoint-up(sm) {\n min-width: 50%;\n margin-right: 8px;\n }\n\n @include media-breakpoint-up(md) {\n min-width: 40%;\n }\n\n @include media-breakpoint-up(lg) {\n min-width: 30%;\n }\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AFilterWrapper.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_component_VForm","_withModifiers","_withCtx","_component_VRow","_createVNode","_component_VCol","_renderSlot","_createCommentVNode","_unref","_createElementVNode","FilterBookmarks","AFilterAdvancedButton","FiltersSelected","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","_createElementBlock","_resolveDynamicComponent","_withDirectives","_normalizeClass","_Fragment","_renderList","FilterDetailItem","_vShow","AFilterSubmitButton_default","AFilterResetButton_default","FilterDetailItem_default","FilterBookmarks_default","AFilterBookmarkButton_default","AFilterAdvancedButton_default","FiltersSelected_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","AFilterWrapper_vue_vue_type_script_setup_true_lang_default","\"datatableHiddenColumns\"","\"datatableHiddenColumnsModifiers\"","\"showDetail\"","\"showDetailModifiers\"","__expose","__emit","props","__props","emit","datatableHiddenColumns","useModel","showDetail","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","isUndefined","identifier","ref","isBoolean","submitResetCounter","FilterSubmitResetCounterKey","filterSelected","FilterSelectedKey","submitFilter","nextTick","useFilterClearHelpers","submitFilterBookmark","resetFilter","clearAll","clearAllFilterSelected","toggleFilterDetail","touched","computed","renderedFieldNames","field","fieldName","openBlock","createBlock","VForm","withModifiers","withCtx","VRow","createVNode","VCol","renderSlot","_ctx","createCommentVNode","unref","isDefined","createElementVNode","_cache","$event","createElementBlock","resolveDynamicComponent","VSlideYTransition","withDirectives","normalizeClass","Fragment","renderList","datatableSlotName","vShow"],"sources":["../../../../src/domains/filters/components/AFilterWrapper.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport AFilterAdvancedButton from '@/domains/filters/components/AFilterAdvancedButton.vue'\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} from '@/domains/filters/utils/filterInjectionKeys'\nimport FiltersSelected from '@/domains/filters/components/FiltersSelected.vue'\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 AFilterBookmarkButton from '@/domains/filters/bookmarks/components/AFilterBookmarkButton.vue'\nimport FilterBookmarks from '@/domains/filters/bookmarks/components/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { type AxiosInstance } from 'axios'\nimport { VSlideYTransition } from 'vuetify/components/transitions'\n\nconst props = withDefaults(\n defineProps<{\n enableTop?: boolean\n hideButtons?: boolean\n formName?: string\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n store?: FilterStoreIdentifier | boolean // false to disable, FilterStoreIdentifier to custom store key\n alwaysVisible?: boolean\n hideMore?: boolean\n }>(),\n {\n enableTop: false,\n hideButtons: false,\n formName: 'search',\n userId: undefined,\n client: undefined,\n store: true,\n alwaysVisible: false,\n hideMore: false,\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})\nconst showDetail = defineModel<boolean>('showDetail', { default: false, required: false })\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\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}\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 })\n}\n\nconst { clearAll, clearAllFilterSelected } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n })\n}\n\nconst resetFilter = () => {\n clearAll(filterData, filterConfig)\n clearAllFilterSelected(filterData, filterConfig, filterSelected)\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n })\n}\n\nconst toggleFilterDetail = () => {\n showDetail.value = !showDetail.value\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\nif (props.alwaysVisible) {\n showDetail.value = true\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 <VRow\n v-if=\"enableTop\"\n density=\"compact\"\n >\n <VCol>\n <slot name=\"top\" />\n </VCol>\n </VRow>\n <VRow density=\"compact\">\n <VCol v-if=\"store && userId && isDefined(client)\">\n <slot name=\"bookmarks\">\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 </slot>\n </VCol>\n </VRow>\n <VRow\n v-if=\"!alwaysVisible\"\n density=\"compact\"\n >\n <VCol\n v-if=\"!hideMore\"\n cols=\"auto\"\n >\n <AFilterAdvancedButton\n :button-active=\"showDetail\"\n @advanced-filter=\"toggleFilterDetail\"\n />\n </VCol>\n <VCol>\n <div class=\"a-filter__container\">\n <div class=\"a-filter__search\">\n <slot name=\"search\" />\n </div>\n <FiltersSelected />\n </div>\n </VCol>\n <VCol\n v-if=\"!hideButtons\"\n class=\"text-right\"\n cols=\"auto\"\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 </VCol>\n </VRow>\n <div v-if=\"!hideMore\">\n <component :is=\"alwaysVisible ? 'div' : VSlideYTransition\">\n <div\n v-show=\"showDetail\"\n :class=\"{ 'mt-6 pa-4 border': !alwaysVisible }\"\n >\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 || 6\"\n :md=\"filterConfig.fields[fieldName]!.render.md || 4\"\n :lg=\"filterConfig.fields[fieldName]!.render.lg || 3\"\n :xl=\"filterConfig.fields[fieldName]!.render.xl || 2\"\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 </component>\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 &__search {\n display: inline-flex;\n vertical-align: middle;\n min-width: 100%;\n height: 34px;\n\n @include media-breakpoint-up(sm) {\n min-width: 50%;\n margin-right: 8px;\n }\n\n @include media-breakpoint-up(md) {\n min-width: 40%;\n }\n\n @include media-breakpoint-up(lg) {\n min-width: 30%;\n }\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  type __VLS_Props = {
2
2
  formName?: string;
3
3
  };
4
- declare var __VLS_10: {};
5
- type __VLS_Slots = {} & {
6
- default?: (props: typeof __VLS_10) => any;
4
+ declare const __VLS_template: () => {
5
+ __VLS_Slots: {
6
+ default?: (props: {}) => any;
7
+ };
7
8
  };
9
+ type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
8
10
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
9
11
  resetFilter: () => void;
10
12
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
@@ -1 +1 @@
1
- {"version":3,"file":"FiltersSelected.js","names":["_sfc_main","FiltersSelected_vue_vue_type_script_setup_true_lang_default","FiltersSelected_default"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing means \"back to the default\", so on a field already holding its default there is\n * nothing to clear and the close button would do nothing at all - it would drop the chip, write\n * the same value back, and the chip would come straight back. Only fields with a non-null default\n * can reach that state; an array is different, because closing one chip removes one option.\n */\nconst canClear = (name: string) => {\n if (!isClearable(name, filterConfig)) return false\n // `isClearable` has just read this same config, so it is there.\n const config = filterConfig.fields[name]!\n // A time interval is a pair sharing one chip, and clearing writes the default into both. Only\n // `until` may differ - the custom dialog opens prefilled, so shortening just the upper bound\n // leaves `from` at its default - and the button still has work to do then.\n if (config.type === 'timeInterval' && config.related) {\n // `createFilter` checked that the related field is configured.\n const related = filterConfig.fields[config.related]!\n if (filterData[config.related] !== related.default) return true\n }\n const value = filterData[name]\n if (isArray(value)) return true\n return value !== config.default\n}\n\nconst clickClose = (name: string, optionValue: number | string) => {\n clearOneFilterSelected(name, optionValue, filterData, filterConfig, filterSelected)\n filterConfig.touched = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-body-small\">{{ item.title }}:</div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n v-if=\"canClear(item.name)\"\n closable\n close-label=\"common.button.remove\"\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n <VChip\n v-else\n size=\"small\"\n class=\"a-selected-filters__chip\"\n >\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n\n// Values above are hardcoded light, which renders white-on-white in dark theme.\n.v-theme--dark .a-selected-filters {\n background: rgb(var(--v-theme-on-surface), 0.08);\n\n .a-selected-filters__chip {\n background: rgb(var(--v-theme-on-surface), 0.16);\n color: rgb(var(--v-theme-on-surface));\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"FiltersSelected.js","names":["_sfc_main","FiltersSelected_vue_vue_type_script_setup_true_lang_default","FiltersSelected_default"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing restores the default. On a field already at its non-null default, the close\n * button would drop the chip, write the same value, and the chip would come back.\n * Arrays differ: closing one chip removes one option.\n */\nconst canClear = (name: string) => {\n if (!isClearable(name, filterConfig)) return false\n // `isClearable` has just read this same config, so it is there.\n const config = filterConfig.fields[name]!\n // A time interval is a pair sharing one chip, and clearing writes the default into both.\n // Only `until` may differ, because the custom dialog opens prefilled. The button still has work then.\n if (config.type === 'timeInterval' && config.related) {\n // `createFilter` checked that the related field is configured.\n const related = filterConfig.fields[config.related]!\n if (filterData[config.related] !== related.default) return true\n }\n const value = filterData[name]\n if (isArray(value)) return true\n return value !== config.default\n}\n\nconst clickClose = (name: string, optionValue: number | string) => {\n clearOneFilterSelected(name, optionValue, filterData, filterConfig, filterSelected)\n filterConfig.touched = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-body-small\">{{ item.title }}:</div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n v-if=\"canClear(item.name)\"\n closable\n close-label=\"common.button.remove\"\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n <VChip\n v-else\n size=\"small\"\n class=\"a-selected-filters__chip\"\n >\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n\n// Values above are hardcoded light, which renders white-on-white in dark theme.\n.v-theme--dark .a-selected-filters {\n background: rgb(var(--v-theme-on-surface), 0.08);\n\n .a-selected-filters__chip {\n background: rgb(var(--v-theme-on-surface), 0.16);\n color: rgb(var(--v-theme-on-surface));\n }\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"FiltersSelected.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_createBlock","_component_VChip","_withModifiers","_withCtx","_createVNode","_component_VIcon","_createTextVNode","_hoisted_1","FiltersSelected_vue_vue_type_script_setup_true_lang_default","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","filterSelected","FilterSelectedKey","isUndefined","useI18n","getTitleFromConfig","titleT","name","t","selectedArray","computed","fieldOrder","key","valueArray","a","b","useFilterClearHelpers","canClear","isClearable","config","related","value","isArray","clickClose","clearOneFilterSelected","optionValue","openBlock","createElementBlock","Fragment","renderList","item","createElementVNode","toDisplayString","option","createBlock","VChip","withModifiers","withCtx","createVNode","VIcon","createTextVNode"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing means \"back to the default\", so on a field already holding its default there is\n * nothing to clear and the close button would do nothing at all - it would drop the chip, write\n * the same value back, and the chip would come straight back. Only fields with a non-null default\n * can reach that state; an array is different, because closing one chip removes one option.\n */\nconst canClear = (name: string) => {\n if (!isClearable(name, filterConfig)) return false\n // `isClearable` has just read this same config, so it is there.\n const config = filterConfig.fields[name]!\n // A time interval is a pair sharing one chip, and clearing writes the default into both. Only\n // `until` may differ - the custom dialog opens prefilled, so shortening just the upper bound\n // leaves `from` at its default - and the button still has work to do then.\n if (config.type === 'timeInterval' && config.related) {\n // `createFilter` checked that the related field is configured.\n const related = filterConfig.fields[config.related]!\n if (filterData[config.related] !== related.default) return true\n }\n const value = filterData[name]\n if (isArray(value)) return true\n return value !== config.default\n}\n\nconst clickClose = (name: string, optionValue: number | string) => {\n clearOneFilterSelected(name, optionValue, filterData, filterConfig, filterSelected)\n filterConfig.touched = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-body-small\">{{ item.title }}:</div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n v-if=\"canClear(item.name)\"\n closable\n close-label=\"common.button.remove\"\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n <VChip\n v-else\n size=\"small\"\n class=\"a-selected-filters__chip\"\n >\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n\n// Values above are hardcoded light, which renders white-on-white in dark theme.\n.v-theme--dark .a-selected-filters {\n background: rgb(var(--v-theme-on-surface), 0.08);\n\n .a-selected-filters__chip {\n background: rgb(var(--v-theme-on-surface), 0.16);\n color: rgb(var(--v-theme-on-surface));\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;EAOA,IAAMe,IAAeC,EAAOC,CAAe,GACrCC,IAAaF,EAAOG,CAAa,GACjCC,IAAiBJ,EAAOK,CAAiB;EAE/C,IAAIC,EAAYP,CAAY,KAAKO,EAAYJ,CAAU,KAAKI,EAAYF,CAAc,GACpF,MAAU,MAAM,kCAAkC;EAGpD,IAAM,EAAE,SAAMG,EAAQ,GAEhBC,KAAsB,MAAiB;GAC3C,IAAMC,IAASV,EAAa,SAASW,EAAK,EAAE;GAE5C,OADID,IAAeE,EAAEF,CAAM,IACpBC;EACT,GAEME,IAAgBC,QAAe;GACnC,IAAMC,IAAa,OAAO,KAAKf,EAAa,MAAM;GAClD,OAAO,MAAM,KAAKK,EAAe,KAAK,CAAA,CACnC,QAAQ,CAACW,OAAShB,EAAa,SAASgB,EAAI,EAAE,QAAQ,aAAa,EAAK,CAAA,CACxE,KAAK,CAACA,GAAKC,QAAiB;IAC3B,MAAMD;IACN,OAAOP,EAAmBO,CAAG;IAC7B,SAASC;GACX,EAAE,CAAA,CACD,MAAM,GAAG,MAAMF,EAAW,QAAQG,EAAE,IAAI,IAAIH,EAAW,QAAQI,EAAE,IAAI,CAAC;EAC3E,CAAC,GAEK,EAAE,2BAAwB,mBAAgBC,EAAsB,GAQhEC,KAAY,MAAiB;GACjC,IAAI,CAACC,EAAYX,GAAMX,CAAY,GAAG,OAAO;GAE7C,IAAMuB,IAASvB,EAAa,OAAOW;GAInC,IAAIY,EAAO,SAAS,kBAAkBA,EAAO,SAAS;IAEpD,IAAMC,IAAUxB,EAAa,OAAOuB,EAAO;IAC3C,IAAIpB,EAAWoB,EAAO,aAAaC,EAAQ,SAAS,OAAO;GAC7D;GACA,IAAMC,IAAQtB,EAAWQ;GAEzB,OADIe,EAAQD,CAAK,IAAU,KACpBA,MAAUF,EAAO;EAC1B,GAEMI,KAAc,GAAc,MAAiC;GAEjE,AADAC,EAAuBjB,GAAMkB,GAAa1B,GAAYH,GAAcK,CAAc,GAClF,EAAa,UAAU;EACzB;E,kBAIEpB,EAAA,EAAA,GAAAC,EAmCMC,GAAA,MAAAC,EAlCWyB,EAAA,QAAR,OADT5B,EAAA,GAAAC,EAmCM,OAAA;GAjCH,KAAKgD,EAAK;GACX,OAAM;E,IAEN7C,EAA8E,OAA9ES,GAA8ER,EAApB4C,EAAK,KAAK,IAAG,KAAC,CAAA,IACxEjD,EAAA,EAAA,GAAAC,EA4BMC,GAAA,MAAAC,EA3Ba8C,EAAK,UAAf,OADTjD,EAAA,GAAAC,EA4BM,OAAA;GA1BH,KAAKmD,EAAO;GACb,OAAM;E,IAGEhB,EAASa,EAAK,IAAI,KAD1BjD,EAAA,GAAAM,EAeQC,GAAA;;GAbN,UAAA;GACA,eAAY;GACZ,MAAK;GACL,OAAM;GACL,iBAAWC,GAAA,MAAOkC,EAAWO,EAAK,MAAMG,EAAO,KAAK,GAAA,CAAA,MAAA,CAAA;;GAE1C,OAAK3C,QAIZ,CAHFC,EAGEC,GAAA;IAFA,MAAK;IACL,MAAK;;GAEE,SAAAF,QACX,CADWG,EAAA,MACXP,EAAG+C,EAAO,KAAK,GAAA,CAAA,C;;E,gCAEjBpD,EAAA,GAAAM,EAMQC,GAAA;;GAJN,MAAK;GACL,OAAM;;GAEN,SAAAE,QAAkB,CAAfG,EAAAP,EAAA+C,EAAO,KAAK,GAAA,CAAA,C"}
1
+ {"version":3,"file":"FiltersSelected.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_createBlock","_component_VChip","_withModifiers","_withCtx","_createVNode","_component_VIcon","_createTextVNode","_hoisted_1","FiltersSelected_vue_vue_type_script_setup_true_lang_default","filterConfig","inject","FilterConfigKey","filterData","FilterDataKey","filterSelected","FilterSelectedKey","isUndefined","useI18n","getTitleFromConfig","titleT","name","t","selectedArray","computed","fieldOrder","key","valueArray","a","b","useFilterClearHelpers","canClear","isClearable","config","related","value","isArray","clickClose","clearOneFilterSelected","optionValue","openBlock","createElementBlock","Fragment","renderList","item","createElementVNode","toDisplayString","option","createBlock","VChip","withModifiers","withCtx","createVNode","VIcon","createTextVNode"],"sources":["../../../../src/domains/filters/components/FiltersSelected.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey, FilterDataKey, FilterSelectedKey } from '@/domains/filters/utils/filterInjectionKeys'\nimport { isArray, isUndefined } from '@/shared/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/domains/filters/composables/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .filter(([key]) => filterConfig.fields?.[key]?.render?.selected !== false)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst { clearOneFilterSelected, isClearable } = useFilterClearHelpers()\n\n/**\n * Clearing restores the default. On a field already at its non-null default, the close\n * button would drop the chip, write the same value, and the chip would come back.\n * Arrays differ: closing one chip removes one option.\n */\nconst canClear = (name: string) => {\n if (!isClearable(name, filterConfig)) return false\n // `isClearable` has just read this same config, so it is there.\n const config = filterConfig.fields[name]!\n // A time interval is a pair sharing one chip, and clearing writes the default into both.\n // Only `until` may differ, because the custom dialog opens prefilled. The button still has work then.\n if (config.type === 'timeInterval' && config.related) {\n // `createFilter` checked that the related field is configured.\n const related = filterConfig.fields[config.related]!\n if (filterData[config.related] !== related.default) return true\n }\n const value = filterData[name]\n if (isArray(value)) return true\n return value !== config.default\n}\n\nconst clickClose = (name: string, optionValue: number | string) => {\n clearOneFilterSelected(name, optionValue, filterData, filterConfig, filterSelected)\n filterConfig.touched = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-body-small\">{{ item.title }}:</div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n v-if=\"canClear(item.name)\"\n closable\n close-label=\"common.button.remove\"\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n <VChip\n v-else\n size=\"small\"\n class=\"a-selected-filters__chip\"\n >\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n\n// Values above are hardcoded light, which renders white-on-white in dark theme.\n.v-theme--dark .a-selected-filters {\n background: rgb(var(--v-theme-on-surface), 0.08);\n\n .a-selected-filters__chip {\n background: rgb(var(--v-theme-on-surface), 0.16);\n color: rgb(var(--v-theme-on-surface));\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;EAOA,IAAMe,IAAeC,EAAOC,CAAe,GACrCC,IAAaF,EAAOG,CAAa,GACjCC,IAAiBJ,EAAOK,CAAiB;EAE/C,IAAIC,EAAYP,CAAY,KAAKO,EAAYJ,CAAU,KAAKI,EAAYF,CAAc,GACpF,MAAU,MAAM,kCAAkC;EAGpD,IAAM,EAAE,SAAMG,EAAQ,GAEhBC,KAAsB,MAAiB;GAC3C,IAAMC,IAASV,EAAa,SAASW,EAAK,EAAE;GAE5C,OADID,IAAeE,EAAEF,CAAM,IACpBC;EACT,GAEME,IAAgBC,QAAe;GACnC,IAAMC,IAAa,OAAO,KAAKf,EAAa,MAAM;GAClD,OAAO,MAAM,KAAKK,EAAe,KAAK,CAAA,CACnC,QAAQ,CAACW,OAAShB,EAAa,SAASgB,EAAI,EAAE,QAAQ,aAAa,EAAK,CAAA,CACxE,KAAK,CAACA,GAAKC,QAAiB;IAC3B,MAAMD;IACN,OAAOP,EAAmBO,CAAG;IAC7B,SAASC;GACX,EAAE,CAAA,CACD,MAAM,GAAG,MAAMF,EAAW,QAAQG,EAAE,IAAI,IAAIH,EAAW,QAAQI,EAAE,IAAI,CAAC;EAC3E,CAAC,GAEK,EAAE,2BAAwB,mBAAgBC,EAAsB,GAOhEC,KAAY,MAAiB;GACjC,IAAI,CAACC,EAAYX,GAAMX,CAAY,GAAG,OAAO;GAE7C,IAAMuB,IAASvB,EAAa,OAAOW;GAGnC,IAAIY,EAAO,SAAS,kBAAkBA,EAAO,SAAS;IAEpD,IAAMC,IAAUxB,EAAa,OAAOuB,EAAO;IAC3C,IAAIpB,EAAWoB,EAAO,aAAaC,EAAQ,SAAS,OAAO;GAC7D;GACA,IAAMC,IAAQtB,EAAWQ;GAEzB,OADIe,EAAQD,CAAK,IAAU,KACpBA,MAAUF,EAAO;EAC1B,GAEMI,KAAc,GAAc,MAAiC;GAEjE,AADAC,EAAuBjB,GAAMkB,GAAa1B,GAAYH,GAAcK,CAAc,GAClF,EAAa,UAAU;EACzB;E,kBAIEpB,EAAA,EAAA,GAAAC,EAmCMC,GAAA,MAAAC,EAlCWyB,EAAA,QAAR,OADT5B,EAAA,GAAAC,EAmCM,OAAA;GAjCH,KAAKgD,EAAK;GACX,OAAM;E,IAEN7C,EAA8E,OAA9ES,GAA8ER,EAApB4C,EAAK,KAAK,IAAG,KAAC,CAAA,IACxEjD,EAAA,EAAA,GAAAC,EA4BMC,GAAA,MAAAC,EA3Ba8C,EAAK,UAAf,OADTjD,EAAA,GAAAC,EA4BM,OAAA;GA1BH,KAAKmD,EAAO;GACb,OAAM;E,IAGEhB,EAASa,EAAK,IAAI,KAD1BjD,EAAA,GAAAM,EAeQC,GAAA;;GAbN,UAAA;GACA,eAAY;GACZ,MAAK;GACL,OAAM;GACL,iBAAWC,GAAA,MAAOkC,EAAWO,EAAK,MAAMG,EAAO,KAAK,GAAA,CAAA,MAAA,CAAA;;GAE1C,OAAK3C,QAIZ,CAHFC,EAGEC,GAAA;IAFA,MAAK;IACL,MAAK;;GAEE,SAAAF,QACX,CADWG,EAAA,MACXP,EAAG+C,EAAO,KAAK,GAAA,CAAA,C;;E,gCAEjBpD,EAAA,GAAAM,EAMQC,GAAA;;GAJN,MAAK;GACL,OAAM;;GAEN,SAAAE,QAAkB,CAAfG,EAAAP,EAAA+C,EAAO,KAAK,GAAA,CAAA,C"}
@@ -8,13 +8,10 @@ export type FilterStoreIdentifier = {
8
8
  subject: string;
9
9
  };
10
10
  /**
11
- * Hash for a filter link, with values equal to their default left out.
12
- *
13
- * Pair it with `router.push({ name, hash })`, which needs the leading `#` — without it vue-router
14
- * glues the value onto the path instead. A hash still containing `%` (diacritics, `&`, `=`) does
15
- * not survive that trip; check with `isRouterSafeHash` and fall back to assigning
16
- * `window.location.hash` after navigating. Returns an empty string when nothing differs from
17
- * the defaults.
11
+ * Hash for a filter link, leaving out values equal to their default. Returns an empty string when nothing differs.
12
+ * Use with `router.push({ name, hash })`. The hash needs the leading `#`, or vue-router appends it to the path.
13
+ * A hash containing `%` (diacritics, `&`, `=`) does not survive the push. Check
14
+ * `isRouterSafeHash` and fall back to setting `window.location.hash` after navigating.
18
15
  */
19
16
  export declare function buildFilterHash<F extends readonly MakeFilterOption<string>[]>(filterConfig: FilterConfig<F>, filters: Partial<Record<keyof FilterData<F> & string, AllowedFilterValues>>, sortBy?: DatatableSortBy): string;
20
17
  /** Whether `router.push({ hash })` would leave the hash intact — see `buildFilterHash`. */
@@ -34,6 +31,7 @@ export declare function useFilterClearHelpers<F extends readonly MakeFilterOptio
34
31
  export interface FilterHelpersMoreOptions {
35
32
  storeFiltersLocalStorage: string | boolean;
36
33
  populateUrlParams: boolean;
34
+ pageStoreKey?: string;
37
35
  }
38
36
  export declare function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(filterData: FilterData<F>, filterConfig: FilterConfig<F>, moreOptions?: Partial<FilterHelpersMoreOptions>): {
39
37
  loadStoredFilters: (pagination: Ref<Pagination>, callback?: AnyFn) => boolean;
@@ -46,28 +44,20 @@ export declare function useFilterHelpers<F extends readonly MakeFilterOption<str
46
44
  } | null;
47
45
  };
48
46
  /**
49
- * Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`) to the filter
50
- * bar and `ADatatablePagination` below this component, and wires the list to them: `getList` is
51
- * `fetchList(pagination, filterData, filterConfig)` debounced and resolves once that has (a refresh button can wait for
52
- * it; a call that a newer one replaces within the debounce resolves at once, without a load of its own), submit, reset
53
- * and sort go through `useFilterHelpers` (with `filterHelpersOptions`), and on mount the stored filter and the
54
- * remembered page are restored before the first load.
55
- *
56
- * Only for a datatable that is the parent of its filter bar and does exactly this. Write the wiring out when the first
57
- * load skips the stored filter, `getList` checks or adds anything, the sort is handled by hand, `fetchList` takes more
58
- * than the list's three arguments, or a parent renders the filter bar (the parent provides then).
59
- *
60
- * ```ts
47
+ * Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`)
48
+ * to the filter bar and `ADatatablePagination` below, and wires the list to them.
49
+ * `getList` is a debounced `fetchList(pagination, filterData, filterConfig)` that resolves when
50
+ * the load finishes. A call superseded within the debounce resolves at once without loading.
51
+ * Submit, reset and sort go through `useFilterHelpers` (with `filterHelpersOptions`).
52
+ * On mount the stored filter and remembered page are restored before the first load.
53
+ * Use only for a datatable that is the parent of its filter bar. Wire it by hand when the first load skips the stored
54
+ * filter, `getList` adds logic, sort is custom, `fetchList` takes other arguments, or a parent renders the filter bar.
55
+ * @example
61
56
  * const { filterData, filterConfig } = useFaqListFilter()
62
57
  * const { fetchList, listItems } = useFaqListActions()
63
58
  * const { pagination } = usePagination(SORT_BY_ID)
64
- * const { getList, sortByChange, submitFilterAction, resetFilterAction } = useDatatableList(
65
- * filterData,
66
- * filterConfig,
67
- * pagination,
68
- * fetchList
69
- * )
70
- * ```
59
+ * const { getList, sortByChange, submitFilterAction, resetFilterAction
60
+ * } = useDatatableList(filterData, filterConfig, pagination, fetchList)
71
61
  */
72
62
  export declare function useDatatableList<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[], R = unknown>(filterData: FilterData<F>, filterConfig: FilterConfig<F>, pagination: Ref<Pagination>, fetchList: (pagination: Ref<Pagination>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => R, filterHelpersOptions?: Partial<FilterHelpersMoreOptions>): {
73
63
  getList: import('@vueuse/shared').UseDebounceFnReturn<() => R>;
@@ -140,16 +140,21 @@ function z(e, t, o = {}) {
140
140
  ...o
141
141
  }, g;
142
142
  c(h.storeFiltersLocalStorage) ? g = h.storeFiltersLocalStorage : n(h.storeFiltersLocalStorage) && !0 === h.storeFiltersLocalStorage && c(t.general.system) && c(t.general.subject) && (g = "tableFilter_" + t.general.system + "_" + t.general.subject);
143
- let _ = c(h.storeFiltersLocalStorage) ? h.storeFiltersLocalStorage : f(t.general.system, t.general.subject);
143
+ let _ = h.pageStoreKey ?? (c(h.storeFiltersLocalStorage) ? h.storeFiltersLocalStorage : f(t.general.system, t.general.subject));
144
144
  y() && x(m, _);
145
- let { clearAll: b } = L(), S = () => {
145
+ let { consumeStoredPage: b, getStoredRowsPerPage: S, getStoredView: C, setStoredPage: w } = p(), D = (e) => A(F(), e), O = (e) => w(_, e.value.page, e.value.rowsPerPage, D(e.value.sortBy)), j = h.populateUrlParams || !l(g), M = (e) => {
146
+ let t = b(_);
147
+ if (t === null || j) return t;
148
+ let n = C(_);
149
+ return n === null || n === D(e) ? t : null;
150
+ }, N = (e, t) => t === null ? e.value.rowsPerPage : S(_) ?? e.value.rowsPerPage, { clearAll: P } = L(), F = () => {
146
151
  let n = {};
147
152
  for (let i in e) try {
148
153
  let o = i, s = e[o];
149
154
  l(s) || a(s) || r(s) || k(s, t.fields[o].default) || (n[i] = s);
150
155
  } catch {}
151
156
  return n;
152
- }, C = (e, t, n) => A(e, n ? t.value.sortBy : void 0), w = (e) => {
157
+ }, I = (e, t, n) => A(e, n ? t.value.sortBy : void 0), z = (e) => {
153
158
  if (!e) return null;
154
159
  e.startsWith("#") && (e = e.substring(1));
155
160
  let n = e.indexOf(E);
@@ -175,37 +180,38 @@ function z(e, t, o = {}) {
175
180
  filters: o,
176
181
  sortBy: s
177
182
  };
178
- }, D = (e) => {
183
+ }, B = (e) => {
179
184
  let t = window.location.pathname + window.location.search + e, n = window.history.state, r = s(n) && c(n.current) ? {
180
185
  ...n,
181
186
  current: (n.current.split("#")[0] ?? "") + e
182
187
  } : n;
183
188
  window.history.replaceState(r, "", t);
184
- }, O = (e) => {
185
- h.populateUrlParams !== !1 && D("#" + e);
186
- }, j = () => {
187
- h.populateUrlParams !== !1 && D("");
188
- }, M = () => h.populateUrlParams === !1 ? null : w(window.location.hash), N = (e) => {
189
+ }, V = (e) => {
190
+ h.populateUrlParams !== !1 && B("#" + e);
191
+ }, H = () => {
192
+ h.populateUrlParams !== !1 && B("");
193
+ }, U = () => h.populateUrlParams === !1 ? null : z(window.location.hash), W = (e) => {
189
194
  g && localStorage && localStorage.setItem(g, e);
190
- }, P = () => {
195
+ }, G = () => {
191
196
  if (!g || !localStorage) return null;
192
197
  let e = localStorage.getItem(g);
193
- return !e || !c(e) ? null : w(e);
198
+ return !e || !c(e) ? null : z(e);
194
199
  };
195
200
  return {
196
201
  loadStoredFilters: (n, r) => {
197
- let { consumeStoredPage: o } = p(), s = "hash", f = M();
198
- if (a(f) && (s = "localStorage", f = P()), a(f) || i(f.filters) && a(f.sortBy)) {
199
- let e = o(_);
202
+ let o = "hash", s = U();
203
+ if (a(s) && (o = "localStorage", s = G()), a(s) || i(s.filters) && a(s.sortBy)) {
204
+ let e = M(n.value.sortBy);
200
205
  return e !== null && (n.value = {
201
206
  ...n.value,
202
- page: e
203
- }), r && r(), !1;
207
+ page: e,
208
+ rowsPerPage: N(n, e)
209
+ }), O(n), r && r(), !1;
204
210
  }
205
- let m = s === "hash" && !i(f.filters);
206
- m && b(e, t);
211
+ let f = o === "hash" && !i(s.filters);
212
+ f && P(e, t);
207
213
  for (let t in e) {
208
- let n = t, r = f.filters[n];
214
+ let n = t, r = s.filters[n];
209
215
  if (!l(r)) {
210
216
  if (c(r)) {
211
217
  let e = d(r);
@@ -218,32 +224,33 @@ function z(e, t, o = {}) {
218
224
  e[n] = r;
219
225
  }
220
226
  }
221
- if (s === "localStorage" && g && localStorage) {
227
+ if (o === "localStorage" && g && localStorage) {
222
228
  let e = localStorage.getItem(g);
223
- e && O(e);
229
+ e && V(e);
224
230
  }
225
- let h = o(_);
231
+ let p = s.sortBy ?? n.value.sortBy, m = M(p);
226
232
  return n.value = {
227
233
  ...n.value,
228
- sortBy: f.sortBy ?? n.value.sortBy,
229
- page: h ?? (s === "hash" ? 1 : n.value.page)
230
- }, m && N(C(S(), n, !0)), r && r(), !0;
234
+ sortBy: p,
235
+ page: m ?? (o === "hash" ? 1 : n.value.page),
236
+ rowsPerPage: N(n, m)
237
+ }, O(n), f && W(I(F(), n, !0)), r && r(), !0;
231
238
  },
232
239
  resetFilter: (e, n) => {
233
240
  e.value = {
234
241
  ...e.value,
235
242
  page: 1
236
- }, g && localStorage && localStorage.removeItem(g), j(), t.touched = !1, n && n();
243
+ }, O(e), g && localStorage && localStorage.removeItem(g), H(), t.touched = !1, n && n();
237
244
  },
238
245
  submitFilter: (e, n) => {
239
- let r = S(), i = C(r, e, !0);
240
- O(i), N(i), e.value = {
246
+ let r = F(), i = I(r, e, !0);
247
+ V(i), W(i), e.value = {
241
248
  ...e.value,
242
249
  page: 1
243
- }, t.touched = !1, n && n();
250
+ }, O(e), t.touched = !1, n && n();
244
251
  },
245
- serializeFilters: C,
246
- deserializeFilters: w
252
+ serializeFilters: I,
253
+ deserializeFilters: z
247
254
  };
248
255
  }
249
256
  function B(e, t, n, r, i = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"filterFactory.js","names":["SORT_URL_PARAM","END_FILTER_MARKER","RELAXED_IN_HASH","relaxHashEncoding","value","match","isSameFilterValue","isArray","a","b","item","index","encodeFilterHash","params","key","data","isUndefined","isNull","isEmptyArray","isObject","isEmptyObject","isString","sortBy","buildFilterHash","filters","field","filterConfig","hash","isRouterSafeHash","defaultRenderOptions","createFilterStore","reactive","filterFields","acc","cloneDeep","createFilter","config","filter","defaultValue","resolveValue","options","defaultGlobalOptions","store","fallback","useFilterClearHelpers","clearOne","name","clearAll","filterName","filterData","clearOneFilterSelected","isClearable","selectedFound","filterSelected","foundIndex","optionValue","newArray","toRaw","isNumber","isBoolean","clearAllFilterSelected","FilterHelpersMoreOptionsDefault","useFilterHelpers","moreOptions","storeKey","pageStoreKey","datatablePageKey","getCurrentInstance","provide","DatatablePageStoreKey","getFilterDataForStoring","serializeFilters","includeSort","pagination","deserializeFilters","markerIndex","result","sortParam","order","SortOrder","fieldConfig","items","replaceHash","url","state","patched","updateLocationHash","serialized","resetLocationHash","parseLocationHash","storeFilterLocalStorage","loadFilterLocalStorage","stored","useDatatablePageStore","source","storedFromHash","restoredPage","consumeStoredPage","callback","hashDescribesThisView","tryConvertNumber","stringToNumber","tryConvertBoolean","stringToBooleanExact","useDatatableList","FilterConfigKey","FilterDataKey","DatatablePaginationKey","filterHelpersOptions","getList","useDebounceFn","fetchList","submitFilterAction","submitFilter","onMounted","loadStoredFilters","resetFilter"],"sources":["../../../../src/domains/filters/composables/filterFactory.ts"],"sourcesContent":["import { getCurrentInstance, onMounted, provide, reactive, type Ref, toRaw } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n FilterDataKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport {\n cloneDeep,\n isArray,\n isBoolean,\n isEmptyArray,\n isEmptyObject,\n isNull,\n isNumber,\n isObject,\n isString,\n isUndefined,\n} from '@/shared/utils/common'\nimport type { AnyFn } from '@vueuse/core'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { type DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { stringToBooleanExact, stringToNumber } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\n\nexport type FilterStoreIdentifier = { system: string; subject: string }\n\nconst SORT_URL_PARAM = '_sort'\nconst END_FILTER_MARKER = '~'\n\n// `URLSearchParams` percent-encodes characters a URL fragment accepts verbatim, and vue-router\n// then runs `encodeURI` over the hash, which escapes the `%` a second time — `_sort=id%2Cdesc`\n// arrives as `id%252Cdesc` and the sort is silently lost. Handing these back keeps a built hash\n// stable through `router.push({ hash })`. `~` stays encoded because the end marker relies on it\n// never occurring inside a value; `&`, `=` carry the structure, `+` reads back as a space.\nconst RELAXED_IN_HASH: Record<string, string> = {\n '%2C': ',',\n '%3A': ':',\n '%2F': '/',\n '%40': '@',\n '%24': '$',\n '%21': '!',\n '%27': \"'\",\n '%28': '(',\n '%29': ')',\n '%3B': ';',\n '%3F': '?',\n}\nconst relaxHashEncoding = (value: string) =>\n value.replace(/%(2C|3A|2F|40|24|21|27|28|29|3B|3F)/g, (match) => RELAXED_IN_HASH[match]!)\n\n// `structuredClone` gives every array default a fresh identity, so `!==` is always true for them\n// and an array default would be written into the url on every submit.\nconst isSameFilterValue = (a: AllowedFilterValues, b: AllowedFilterValues): boolean => {\n if (isArray(a) && isArray(b)) {\n return a.length === b.length && a.every((item, index) => item === b[index])\n }\n return a === b\n}\n\nconst encodeFilterHash = (data: Record<string, AllowedFilterValues>, sortBy?: DatatableSortBy): string => {\n const params = new URLSearchParams()\n for (const key in data) {\n const value = data[key]\n if (isUndefined(value) || isNull(value)) continue\n if (isArray(value) && isEmptyArray(value)) continue\n if (isObject(value) && isEmptyObject(value)) continue\n if (isString(value) && value.length === 0) continue\n params.set(key, isArray(value) ? value.join(',') : String(value))\n }\n if (sortBy) {\n params.set(SORT_URL_PARAM, `${sortBy.key},${sortBy.order}`)\n }\n if (params.size === 0) return ''\n return relaxHashEncoding(params.toString()) + END_FILTER_MARKER\n}\n\n/**\n * Hash for a filter link, with values equal to their default left out.\n *\n * Pair it with `router.push({ name, hash })`, which needs the leading `#` — without it vue-router\n * glues the value onto the path instead. A hash still containing `%` (diacritics, `&`, `=`) does\n * not survive that trip; check with `isRouterSafeHash` and fall back to assigning\n * `window.location.hash` after navigating. Returns an empty string when nothing differs from\n * the defaults.\n */\nexport function buildFilterHash<F extends readonly MakeFilterOption<string>[]>(\n filterConfig: FilterConfig<F>,\n filters: Partial<Record<keyof FilterData<F> & string, AllowedFilterValues>>,\n sortBy?: DatatableSortBy\n): string {\n const data: Record<string, AllowedFilterValues> = {}\n for (const [key, value] of Object.entries(filters) as [string, AllowedFilterValues][]) {\n const field = filterConfig.fields[key as keyof FilterConfig<F>['fields']]\n if (isUndefined(field) || isSameFilterValue(value, field.default)) continue\n data[key] = value\n }\n const hash = encodeFilterHash(data, sortBy)\n return hash.length === 0 ? hash : '#' + hash\n}\n\n/** Whether `router.push({ hash })` would leave the hash intact — see `buildFilterHash`. */\nexport const isRouterSafeHash = (hash: string): boolean => !hash.includes('%')\n\nconst defaultRenderOptions: FilerRenderOptions = {\n skip: false,\n selected: true,\n xs: undefined,\n sm: undefined,\n md: undefined,\n lg: undefined,\n xl: undefined,\n}\n\nexport function createFilterStore<F extends readonly MakeFilterOption<string>[]>(filterFields: F): FilterData<F> {\n return reactive(\n filterFields.reduce((acc, field) => {\n return {\n ...acc,\n [field.name]: cloneDeep(field.default),\n }\n }, {} as FilterData<F>)\n ) as FilterData<F>\n}\n\nexport function createFilter<F extends readonly MakeFilterOption<string>[]>(\n filterFields: F,\n store: FilterData<F>,\n options?: Partial<GeneralFilterOptions>\n): {\n filterConfig: FilterConfig<F>\n filterData: FilterData<F>\n} {\n const config = filterFields.reduce(\n (acc, filter) => {\n const key = filter.name as keyof FilterData<F>\n const defaultValue = cloneDeep(filter.default)\n\n return {\n ...acc,\n [key]: {\n name: key as string,\n variant: resolveValue(filter.variant, 'eq'),\n type: resolveValue(filter.type, 'custom'),\n titleT:\n filter.titleT ??\n (options?.system && options?.subject && filter.name\n ? `${options.system}.${options.subject}.filter.${filter.name}`\n : undefined),\n apiName: resolveValue(filter.apiName, filter.name),\n clearable: resolveValue(filter.clearable, true),\n mandatory: resolveValue(filter.mandatory, false),\n multiple: isArray(defaultValue),\n advanced: resolveValue(filter.advanced, false),\n related: resolveValue(filter.related, undefined),\n exclude: resolveValue(filter.exclude, false),\n default: defaultValue,\n render: { ...defaultRenderOptions, ...resolveValue(filter.render, {}) },\n },\n }\n },\n {} as FilterConfig<F>['fields']\n )\n\n // A time interval names the field that holds its upper bound. The query builder and the selected chips\n // read that field's config without a check, so a name that is not configured fails here, by name,\n // instead of as a TypeError on the first query.\n for (const field of Object.values(config) as FilterField[]) {\n if (field.related && !(field.related in config)) {\n throw new Error(`createFilter: \"${field.name}\" names related field \"${field.related}\", which is not configured`)\n }\n }\n\n const defaultGlobalOptions: GeneralFilterOptions = {\n elastic: false,\n system: undefined,\n subject: undefined,\n simpleFilters: false,\n ...options,\n }\n\n if (defaultGlobalOptions.elastic) {\n defaultGlobalOptions.simpleFilters = true\n }\n\n const filterConfig = reactive({\n general: defaultGlobalOptions,\n touched: false,\n fields: config,\n }) as FilterConfig<F>\n\n return {\n filterConfig,\n filterData: store as FilterData<F>,\n }\n}\n\nfunction resolveValue<T>(value: T | undefined, fallback: T): T {\n return isUndefined(value) ? fallback : value\n}\n\nexport function useFilterClearHelpers<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n>() {\n const clearOne = (name: keyof FilterData<F>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n if (!filterConfig.fields[name]?.clearable) return\n filterData[name] = cloneDeep(filterConfig.fields[name].default)\n }\n\n const clearAll = (filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n for (const filterName in filterConfig.fields) {\n clearOne(filterName as keyof FilterData<F>, filterData, filterConfig)\n }\n }\n const clearOneFilterSelected = (\n name: string,\n optionValue: number | string,\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n if (!isClearable(name, filterConfig)) return\n // update selected\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n const selectedFound = filterSelected.value.get(name)\n if (selectedFound && selectedFound.length === 1) {\n filterSelected.value.delete(name)\n } else if (selectedFound) {\n const foundIndex = selectedFound.findIndex((item) => item.value === optionValue)\n if (foundIndex !== -1) selectedFound.splice(foundIndex, 1)\n }\n // update data\n if (config.type === 'timeInterval' && config.related) {\n filterData[name as keyof FilterData<F>] = config.default\n filterData[config.related as keyof FilterData<F>] =\n filterConfig.fields[config.related as keyof FilterConfig<F>['fields']].default\n } else if (\n isArray(filterData[name as keyof FilterData<F>]) &&\n (filterData[name as keyof FilterData<F>] as any[]).length > 0\n ) {\n const foundIndex = (filterData[name as keyof FilterData<F>] as any[]).findIndex(\n (item) => String(item) === String(optionValue)\n )\n if (foundIndex !== -1) {\n const newArray = [...toRaw(filterData[name as keyof FilterData<F>] as any[])]\n newArray.splice(foundIndex, 1)\n filterData[name as keyof FilterData<F>] = newArray as AllowedFilterValues\n }\n } else if (isString(filterData[name as keyof FilterData<F>]) || isNumber(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n } else if (isBoolean(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n }\n }\n\n const clearAllFilterSelected = (\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n for (const key of filterSelected.value.keys()) {\n if (isClearable(key, filterConfig)) {\n filterSelected.value.delete(key)\n }\n }\n }\n\n const isClearable = (name: string, filterConfig: FilterConfig<F>) => {\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n return !(config.mandatory || !config.clearable)\n }\n\n return {\n clearOne,\n clearAll,\n clearOneFilterSelected,\n clearAllFilterSelected,\n isClearable,\n }\n}\n\nexport interface FilterHelpersMoreOptions {\n storeFiltersLocalStorage: string | boolean // false to disable, string to override store key\n populateUrlParams: boolean\n}\n\nconst FilterHelpersMoreOptionsDefault = {\n storeFiltersLocalStorage: true,\n populateUrlParams: true,\n}\n\nexport function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n moreOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n const options = { ...FilterHelpersMoreOptionsDefault, ...moreOptions }\n\n let storeKey: undefined | string = undefined\n if (isString(options.storeFiltersLocalStorage)) {\n storeKey = options.storeFiltersLocalStorage\n } else if (\n isBoolean(options.storeFiltersLocalStorage) &&\n true === options.storeFiltersLocalStorage &&\n isString(filterConfig.general.system) &&\n isString(filterConfig.general.subject)\n ) {\n storeKey = 'tableFilter_' + filterConfig.general.system + '_' + filterConfig.general.subject\n }\n\n // Independent of `storeFiltersLocalStorage` being on: the remembered page is keyed even when\n // filters are not persisted. A string override is what distinguishes tables sharing a subject.\n const pageStoreKey = isString(options.storeFiltersLocalStorage)\n ? options.storeFiltersLocalStorage\n : datatablePageKey(filterConfig.general.system, filterConfig.general.subject)\n // Called from a datatable's setup, so `ADatatablePagination` picks it up. Guarded because a\n // composable may legitimately be called outside setup, and Vue would warn.\n if (getCurrentInstance()) {\n provide(DatatablePageStoreKey, pageStoreKey)\n }\n\n const { clearAll } = useFilterClearHelpers<F>()\n\n const getFilterDataForStoring = (): Record<string, AllowedFilterValues> => {\n const data: Record<string, AllowedFilterValues> = {}\n for (const filterName in filterData) {\n try {\n const key = filterName as keyof FilterData<F>\n const value = filterData[key]\n if (\n !isUndefined(value) &&\n !isNull(value) &&\n !isEmptyArray(value) &&\n !isSameFilterValue(value, filterConfig.fields[key].default)\n ) {\n data[filterName] = value\n }\n } catch (e) {\n // Ignore errors\n }\n }\n return data\n }\n\n const serializeFilters = (\n data: Record<string, AllowedFilterValues>,\n pagination: Ref<Pagination>,\n includeSort: boolean\n ): string => {\n return encodeFilterHash(data, includeSort ? pagination.value.sortBy : undefined)\n }\n\n const deserializeFilters = (\n hash: string\n ): { filters: Record<string, AllowedFilterValues>; sortBy: DatatableSortBy } | null => {\n if (!hash) return null\n if (hash.startsWith('#')) hash = hash.substring(1)\n\n // URLSearchParams percent-encodes `~` in values, so the marker cannot occur inside our own\n // data — a hash without it is foreign or truncated, and null lets localStorage take over.\n const markerIndex = hash.indexOf(END_FILTER_MARKER)\n if (markerIndex === -1) return null\n hash = hash.slice(0, markerIndex)\n\n const params = new URLSearchParams(hash)\n const result: Record<string, AllowedFilterValues> = {}\n let sortBy: DatatableSortBy = null\n\n const sortParam = params.get(SORT_URL_PARAM)\n if (sortParam) {\n const [key, order] = sortParam.split(',')\n if (key && (order === SortOrder.Asc || order === SortOrder.Desc)) {\n sortBy = { key, order }\n }\n params.delete(SORT_URL_PARAM)\n }\n\n for (const [key, value] of params.entries()) {\n const fieldConfig = filterConfig.fields[key as keyof typeof filterConfig.fields]\n if (isUndefined(fieldConfig)) {\n console.error(`Filter config not found for ${key}`)\n continue\n }\n const isMultiple = fieldConfig.multiple ?? false\n\n if (isMultiple) {\n const items = value.split(',')\n\n const allNumeric = items.every((item) => item !== '' && String(Number(item)) === item)\n\n result[key] = allNumeric ? items.map(Number) : items\n } else {\n result[key] = value\n }\n }\n\n // An empty result would still count as \"found\", shadowing localStorage.\n if (isEmptyObject(result) && isNull(sortBy)) return null\n\n return { filters: result, sortBy }\n }\n\n // A submit is not a place to step back to, so it replaces the entry. `replaceState` fires no\n // popstate, so vue-router does not run a navigation (and its guards) per submit; its `current` is\n // patched so the router's next push, which rewrites this entry from it, keeps the hash.\n const replaceHash = (hash: string) => {\n const url = window.location.pathname + window.location.search + hash\n const state = window.history.state\n const patched =\n isObject(state) && isString((state as { current?: unknown }).current)\n ? { ...state, current: ((state as { current: string }).current.split('#')[0] ?? '') + hash }\n : state\n window.history.replaceState(patched, '', url)\n }\n\n const updateLocationHash = (serialized: string) => {\n if (options.populateUrlParams === false) return\n replaceHash('#' + serialized)\n }\n\n const resetLocationHash = () => {\n if (options.populateUrlParams === false) return\n replaceHash('')\n }\n\n const parseLocationHash = () => {\n if (options.populateUrlParams === false) return null\n return deserializeFilters(window.location.hash)\n }\n\n const storeFilterLocalStorage = (serialized: string) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, serialized)\n }\n\n const loadFilterLocalStorage = () => {\n if (!storeKey || !localStorage) return null\n const stored = localStorage.getItem(storeKey)\n if (!stored || !isString(stored)) return null\n return deserializeFilters(stored)\n }\n\n const resetFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n pagination.value = { ...pagination.value, page: 1 }\n if (storeKey && localStorage) {\n localStorage.removeItem(storeKey)\n }\n resetLocationHash()\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const submitFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const data = getFilterDataForStoring()\n const serialized = serializeFilters(data, pagination, true)\n updateLocationHash(serialized)\n storeFilterLocalStorage(serialized)\n pagination.value = { ...pagination.value, page: 1 }\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const loadStoredFilters = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const { consumeStoredPage } = useDatatablePageStore()\n let source: 'hash' | 'localStorage' = 'hash'\n let storedFromHash = parseLocationHash()\n if (isNull(storedFromHash)) {\n source = 'localStorage'\n storedFromHash = loadFilterLocalStorage()\n }\n if (isNull(storedFromHash) || (isEmptyObject(storedFromHash.filters) && isNull(storedFromHash.sortBy))) {\n const restoredPage = consumeStoredPage(pageStoreKey)\n if (restoredPage !== null) {\n pagination.value = { ...pagination.value, page: restoredPage }\n }\n if (callback) callback()\n return false\n }\n\n // A hash naming at least one field is authoritative: it arrives from a link, or from stepping\n // back to an older address, and in both cases it describes the whole view. Without this reset\n // the fields it does not mention keep whatever the module-level filter store still holds from\n // an earlier visit, so the same link lands differently depending on how the user got to it.\n // On a fresh page load the store is already at its defaults and this is a no-op. Local storage\n // keeps merging, because there the absent fields were left out as equal to their default.\n //\n // A hash carrying only `_sort` is excluded on purpose. Unknown keys are dropped before this\n // point, so such a hash also results from a link meant for a different table sharing the page\n // - it must not wipe this one's filter. Only `clearable` fields are reset, as everywhere else.\n const hashDescribesThisView = source === 'hash' && !isEmptyObject(storedFromHash.filters)\n if (hashDescribesThisView) {\n clearAll(filterData, filterConfig)\n }\n\n for (const filterName in filterData) {\n const key = filterName as keyof FilterData<F>\n let value = storedFromHash.filters[key]\n if (isUndefined(value)) continue\n if (isString(value)) {\n const tryConvertNumber = stringToNumber(value)\n if (!isNull(tryConvertNumber) && String(tryConvertNumber) === value) {\n value = tryConvertNumber\n } else {\n const tryConvertBoolean = stringToBooleanExact(value)\n if (!isNull(tryConvertBoolean)) {\n value = tryConvertBoolean\n }\n }\n }\n filterData[key] = value\n }\n if (source === 'localStorage' && storeKey && localStorage) {\n const stored = localStorage.getItem(storeKey)\n if (stored) {\n updateLocationHash(stored)\n }\n }\n // Drained either way: the flag means \"the next list I land on should restore its page\", so\n // leaving it set would hand the remembered page to whichever table comes after this one.\n const restoredPage = consumeStoredPage(pageStoreKey)\n pagination.value = {\n ...pagination.value,\n // A link need not carry the sort. Taking `null` from it would drop `order[...]` from the\n // query, and paging without ORDER BY can repeat or skip rows.\n sortBy: storedFromHash.sortBy ?? pagination.value.sortBy,\n // A hash replaces the view, so a link starts at the first page. A restored page still wins:\n // the flag behind it is only ever set by the close button, which means \"I am coming back to\n // this list\", and that address carries the list's own hash along with it.\n page: restoredPage ?? (source === 'hash' ? 1 : pagination.value.page),\n }\n if (hashDescribesThisView) {\n // Local storage mirrors the last applied state, so a link becomes the view the user returns\n // to. Re-serialized rather than stored verbatim, to drop values equal to their default.\n // A sort-only hash is not a link to this view, so it does not overwrite what is remembered.\n storeFilterLocalStorage(serializeFilters(getFilterDataForStoring(), pagination, true))\n }\n if (callback) callback()\n return true\n }\n\n return {\n loadStoredFilters,\n resetFilter,\n submitFilter,\n serializeFilters,\n deserializeFilters,\n }\n}\n\n/**\n * Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`) to the filter\n * bar and `ADatatablePagination` below this component, and wires the list to them: `getList` is\n * `fetchList(pagination, filterData, filterConfig)` debounced and resolves once that has (a refresh button can wait for\n * it; a call that a newer one replaces within the debounce resolves at once, without a load of its own), submit, reset\n * and sort go through `useFilterHelpers` (with `filterHelpersOptions`), and on mount the stored filter and the\n * remembered page are restored before the first load.\n *\n * Only for a datatable that is the parent of its filter bar and does exactly this. Write the wiring out when the first\n * load skips the stored filter, `getList` checks or adds anything, the sort is handled by hand, `fetchList` takes more\n * than the list's three arguments, or a parent renders the filter bar (the parent provides then).\n *\n * ```ts\n * const { filterData, filterConfig } = useFaqListFilter()\n * const { fetchList, listItems } = useFaqListActions()\n * const { pagination } = usePagination(SORT_BY_ID)\n * const { getList, sortByChange, submitFilterAction, resetFilterAction } = useDatatableList(\n * filterData,\n * filterConfig,\n * pagination,\n * fetchList\n * )\n * ```\n */\nexport function useDatatableList<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n R = unknown,\n>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n pagination: Ref<Pagination>,\n fetchList: (pagination: Ref<Pagination>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => R,\n filterHelpersOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n provide(FilterConfigKey, filterConfig as FilterConfig)\n provide(FilterDataKey, filterData as FilterData)\n provide(DatatablePaginationKey, pagination)\n const { resetFilter, submitFilter, loadStoredFilters } = useFilterHelpers(\n filterData,\n filterConfig,\n filterHelpersOptions\n )\n const getList = useDebounceFn(() => fetchList(pagination, filterData, filterConfig))\n const submitFilterAction = () => submitFilter(pagination, getList)\n const resetFilterAction = () => resetFilter(pagination, getList)\n onMounted(() => loadStoredFilters(pagination, getList))\n return { getList, sortByChange: submitFilterAction, submitFilterAction, resetFilterAction }\n}\n\nexport type AllowedFilterValues = number | number[] | string | string[] | null | undefined | boolean\n\nexport interface GeneralFilterOptions {\n system?: string\n subject?: string\n elastic?: boolean\n simpleFilters?: boolean\n}\n\nexport interface FilerRenderOptions {\n skip: boolean\n // Whether the field is shown as a selected-filter chip (FiltersSelected). Default true.\n // Optional for backward compatibility (other admins may construct FilerRenderOptions).\n selected?: boolean\n xs: number | undefined\n sm: number | undefined\n md: number | undefined\n lg: number | undefined\n xl: number | undefined\n}\n\nexport type FilterVariant =\n | 'search'\n | 'lt'\n | 'in'\n | 'notIn'\n | 'endsWith'\n | 'startsWith'\n | 'memberOf'\n | 'neq'\n | 'gte'\n | 'gt'\n | 'eq'\n | 'lte'\n | 'custom'\n\nexport type FilterType = 'boolean' | 'datetime' | 'integer' | 'string' | 'custom' | 'timeInterval'\n\nexport interface MakeFilterOption<TName extends string = string> {\n name: TName\n default: AllowedFilterValues\n type?: FilterType\n variant?: FilterVariant\n titleT?: string\n apiName?: string\n clearable?: boolean\n mandatory?: boolean\n advanced?: boolean\n exclude?: boolean\n related?: string | undefined\n render?: Partial<FilerRenderOptions>\n}\n\nexport interface FilterField {\n name: string\n type: FilterType\n variant: FilterVariant\n titleT?: string\n default: AllowedFilterValues\n apiName: string\n clearable: boolean\n mandatory: boolean\n multiple: boolean\n advanced: boolean\n exclude: boolean\n related: string | undefined\n render: FilerRenderOptions\n}\n\nexport type FilterConfig<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n general: GeneralFilterOptions\n touched: boolean\n fields: {\n [P in F[number]['name']]: FilterField\n }\n}\n\nexport type FilterData<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n [P in F[number]['name']]: AllowedFilterValues\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filterFactory.js","names":["SORT_URL_PARAM","END_FILTER_MARKER","RELAXED_IN_HASH","relaxHashEncoding","value","match","isSameFilterValue","isArray","a","b","item","index","encodeFilterHash","params","key","data","isUndefined","isNull","isEmptyArray","isObject","isEmptyObject","isString","sortBy","buildFilterHash","filters","field","filterConfig","hash","isRouterSafeHash","defaultRenderOptions","createFilterStore","reactive","filterFields","acc","cloneDeep","createFilter","config","filter","defaultValue","resolveValue","options","defaultGlobalOptions","store","fallback","useFilterClearHelpers","clearOne","name","clearAll","filterName","filterData","clearOneFilterSelected","isClearable","selectedFound","filterSelected","foundIndex","optionValue","newArray","toRaw","isNumber","isBoolean","clearAllFilterSelected","FilterHelpersMoreOptionsDefault","useFilterHelpers","moreOptions","storeKey","pageStoreKey","datatablePageKey","getCurrentInstance","provide","DatatablePageStoreKey","useDatatablePageStore","viewOf","getFilterDataForStoring","rememberShownPage","setStoredPage","pagination","keepsItsView","consumeRestoredPage","page","consumeStoredPage","view","getStoredView","rowsPerPageFor","restoredPage","getStoredRowsPerPage","serializeFilters","includeSort","deserializeFilters","markerIndex","result","sortParam","order","SortOrder","fieldConfig","items","replaceHash","url","state","patched","updateLocationHash","serialized","resetLocationHash","parseLocationHash","storeFilterLocalStorage","loadFilterLocalStorage","stored","source","storedFromHash","callback","hashDescribesThisView","tryConvertNumber","stringToNumber","tryConvertBoolean","stringToBooleanExact","useDatatableList","FilterConfigKey","FilterDataKey","DatatablePaginationKey","filterHelpersOptions","getList","useDebounceFn","fetchList","submitFilterAction","submitFilter","onMounted","loadStoredFilters","resetFilter"],"sources":["../../../../src/domains/filters/composables/filterFactory.ts"],"sourcesContent":["import { getCurrentInstance, onMounted, provide, reactive, type Ref, toRaw } from 'vue'\nimport { useDebounceFn } from '@vueuse/core'\nimport { datatablePageKey, useDatatablePageStore } from '@/domains/system/store/datatablePageStore'\nimport {\n DatatablePageStoreKey,\n DatatablePaginationKey,\n FilterConfigKey,\n FilterDataKey,\n} from '@/domains/filters/utils/filterInjectionKeys'\nimport {\n cloneDeep,\n isArray,\n isBoolean,\n isEmptyArray,\n isEmptyObject,\n isNull,\n isNumber,\n isObject,\n isString,\n isUndefined,\n} from '@/shared/utils/common'\nimport type { AnyFn } from '@vueuse/core'\nimport type { Pagination } from '@/domains/api/composables/pagination'\nimport { type DatatableSortBy } from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { stringToBooleanExact, stringToNumber } from '@/shared/utils/string'\nimport type { ValueObjectOption } from '@/shared/types/ValueObject'\n\nexport type FilterStoreIdentifier = { system: string; subject: string }\n\nconst SORT_URL_PARAM = '_sort'\nconst END_FILTER_MARKER = '~'\n\n// `URLSearchParams` percent-encodes characters a fragment accepts verbatim,\n// and vue-router runs `encodeURI` over the hash, double-escaping `%`.\n// So `_sort=id%2Cdesc` arrives as `id%252Cdesc` and the sort is lost.\n// Decoding these keeps the hash stable through `router.push({ hash })`.\n// `~` stays encoded because the end marker must never occur in a\n// value. `&` and `=` carry the structure. `+` reads back as a space.\nconst RELAXED_IN_HASH: Record<string, string> = {\n '%2C': ',',\n '%3A': ':',\n '%2F': '/',\n '%40': '@',\n '%24': '$',\n '%21': '!',\n '%27': \"'\",\n '%28': '(',\n '%29': ')',\n '%3B': ';',\n '%3F': '?',\n}\nconst relaxHashEncoding = (value: string) =>\n value.replace(/%(2C|3A|2F|40|24|21|27|28|29|3B|3F)/g, (match) => RELAXED_IN_HASH[match]!)\n\n// `structuredClone` gives each array default a new identity, so `!==` is always true.\n// Without a deep compare, an array default would be written into the URL on every submit.\nconst isSameFilterValue = (a: AllowedFilterValues, b: AllowedFilterValues): boolean => {\n if (isArray(a) && isArray(b)) {\n return a.length === b.length && a.every((item, index) => item === b[index])\n }\n return a === b\n}\n\nconst encodeFilterHash = (data: Record<string, AllowedFilterValues>, sortBy?: DatatableSortBy): string => {\n const params = new URLSearchParams()\n for (const key in data) {\n const value = data[key]\n if (isUndefined(value) || isNull(value)) continue\n if (isArray(value) && isEmptyArray(value)) continue\n if (isObject(value) && isEmptyObject(value)) continue\n if (isString(value) && value.length === 0) continue\n params.set(key, isArray(value) ? value.join(',') : String(value))\n }\n if (sortBy) {\n params.set(SORT_URL_PARAM, `${sortBy.key},${sortBy.order}`)\n }\n if (params.size === 0) return ''\n return relaxHashEncoding(params.toString()) + END_FILTER_MARKER\n}\n\n/**\n * Hash for a filter link, leaving out values equal to their default. Returns an empty string when nothing differs.\n * Use with `router.push({ name, hash })`. The hash needs the leading `#`, or vue-router appends it to the path.\n * A hash containing `%` (diacritics, `&`, `=`) does not survive the push. Check\n * `isRouterSafeHash` and fall back to setting `window.location.hash` after navigating.\n */\nexport function buildFilterHash<F extends readonly MakeFilterOption<string>[]>(\n filterConfig: FilterConfig<F>,\n filters: Partial<Record<keyof FilterData<F> & string, AllowedFilterValues>>,\n sortBy?: DatatableSortBy\n): string {\n const data: Record<string, AllowedFilterValues> = {}\n for (const [key, value] of Object.entries(filters) as [string, AllowedFilterValues][]) {\n const field = filterConfig.fields[key as keyof FilterConfig<F>['fields']]\n if (isUndefined(field) || isSameFilterValue(value, field.default)) continue\n data[key] = value\n }\n const hash = encodeFilterHash(data, sortBy)\n return hash.length === 0 ? hash : '#' + hash\n}\n\n/** Whether `router.push({ hash })` would leave the hash intact — see `buildFilterHash`. */\nexport const isRouterSafeHash = (hash: string): boolean => !hash.includes('%')\n\nconst defaultRenderOptions: FilerRenderOptions = {\n skip: false,\n selected: true,\n xs: undefined,\n sm: undefined,\n md: undefined,\n lg: undefined,\n xl: undefined,\n}\n\nexport function createFilterStore<F extends readonly MakeFilterOption<string>[]>(filterFields: F): FilterData<F> {\n return reactive(\n filterFields.reduce((acc, field) => {\n return {\n ...acc,\n [field.name]: cloneDeep(field.default),\n }\n }, {} as FilterData<F>)\n ) as FilterData<F>\n}\n\nexport function createFilter<F extends readonly MakeFilterOption<string>[]>(\n filterFields: F,\n store: FilterData<F>,\n options?: Partial<GeneralFilterOptions>\n): {\n filterConfig: FilterConfig<F>\n filterData: FilterData<F>\n} {\n const config = filterFields.reduce(\n (acc, filter) => {\n const key = filter.name as keyof FilterData<F>\n const defaultValue = cloneDeep(filter.default)\n\n return {\n ...acc,\n [key]: {\n name: key as string,\n variant: resolveValue(filter.variant, 'eq'),\n type: resolveValue(filter.type, 'custom'),\n titleT:\n filter.titleT ??\n (options?.system && options?.subject && filter.name\n ? `${options.system}.${options.subject}.filter.${filter.name}`\n : undefined),\n apiName: resolveValue(filter.apiName, filter.name),\n clearable: resolveValue(filter.clearable, true),\n mandatory: resolveValue(filter.mandatory, false),\n multiple: isArray(defaultValue),\n advanced: resolveValue(filter.advanced, false),\n related: resolveValue(filter.related, undefined),\n exclude: resolveValue(filter.exclude, false),\n default: defaultValue,\n render: { ...defaultRenderOptions, ...resolveValue(filter.render, {}) },\n },\n }\n },\n {} as FilterConfig<F>['fields']\n )\n\n // A time interval names the field holding its upper bound.\n // The query builder and the chips read that config unchecked.\n // Fail here by name rather than with a TypeError on the first query.\n for (const field of Object.values(config) as FilterField[]) {\n if (field.related && !(field.related in config)) {\n throw new Error(`createFilter: \"${field.name}\" names related field \"${field.related}\", which is not configured`)\n }\n }\n\n const defaultGlobalOptions: GeneralFilterOptions = {\n elastic: false,\n system: undefined,\n subject: undefined,\n simpleFilters: false,\n ...options,\n }\n\n if (defaultGlobalOptions.elastic) {\n defaultGlobalOptions.simpleFilters = true\n }\n\n const filterConfig = reactive({\n general: defaultGlobalOptions,\n touched: false,\n fields: config,\n }) as FilterConfig<F>\n\n return {\n filterConfig,\n filterData: store as FilterData<F>,\n }\n}\n\nfunction resolveValue<T>(value: T | undefined, fallback: T): T {\n return isUndefined(value) ? fallback : value\n}\n\nexport function useFilterClearHelpers<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n>() {\n const clearOne = (name: keyof FilterData<F>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n if (!filterConfig.fields[name]?.clearable) return\n filterData[name] = cloneDeep(filterConfig.fields[name].default)\n }\n\n const clearAll = (filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n for (const filterName in filterConfig.fields) {\n clearOne(filterName as keyof FilterData<F>, filterData, filterConfig)\n }\n }\n const clearOneFilterSelected = (\n name: string,\n optionValue: number | string,\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n if (!isClearable(name, filterConfig)) return\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n const selectedFound = filterSelected.value.get(name)\n if (selectedFound && selectedFound.length === 1) {\n filterSelected.value.delete(name)\n } else if (selectedFound) {\n const foundIndex = selectedFound.findIndex((item) => item.value === optionValue)\n if (foundIndex !== -1) selectedFound.splice(foundIndex, 1)\n }\n if (config.type === 'timeInterval' && config.related) {\n filterData[name as keyof FilterData<F>] = config.default\n filterData[config.related as keyof FilterData<F>] =\n filterConfig.fields[config.related as keyof FilterConfig<F>['fields']].default\n } else if (\n isArray(filterData[name as keyof FilterData<F>]) &&\n (filterData[name as keyof FilterData<F>] as any[]).length > 0\n ) {\n const foundIndex = (filterData[name as keyof FilterData<F>] as any[]).findIndex(\n (item) => String(item) === String(optionValue)\n )\n if (foundIndex !== -1) {\n const newArray = [...toRaw(filterData[name as keyof FilterData<F>] as any[])]\n newArray.splice(foundIndex, 1)\n filterData[name as keyof FilterData<F>] = newArray as AllowedFilterValues\n }\n } else if (isString(filterData[name as keyof FilterData<F>]) || isNumber(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n } else if (isBoolean(filterData[name as keyof FilterData<F>])) {\n filterData[name as keyof FilterData<F>] = config.default\n }\n }\n\n const clearAllFilterSelected = (\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n filterSelected: Ref<Map<string, ValueObjectOption<string | number>[]>>\n ) => {\n for (const key of filterSelected.value.keys()) {\n if (isClearable(key, filterConfig)) {\n filterSelected.value.delete(key)\n }\n }\n }\n\n const isClearable = (name: string, filterConfig: FilterConfig<F>) => {\n const config = filterConfig.fields[name as keyof FilterConfig<F>['fields']]\n return !(config.mandatory || !config.clearable)\n }\n\n return {\n clearOne,\n clearAll,\n clearOneFilterSelected,\n clearAllFilterSelected,\n isClearable,\n }\n}\n\nexport interface FilterHelpersMoreOptions {\n storeFiltersLocalStorage: string | boolean // false to disable, string to override store key\n populateUrlParams: boolean\n // Keys the remembered page without turning on local storage. A select dialog sharing its subject with a list\n // sets its own, so searching or paging in it does not change the page Close returns that list to.\n pageStoreKey?: string\n}\n\nconst FilterHelpersMoreOptionsDefault = {\n storeFiltersLocalStorage: true,\n populateUrlParams: true,\n}\n\nexport function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n moreOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n const options = { ...FilterHelpersMoreOptionsDefault, ...moreOptions }\n\n let storeKey: undefined | string = undefined\n if (isString(options.storeFiltersLocalStorage)) {\n storeKey = options.storeFiltersLocalStorage\n } else if (\n isBoolean(options.storeFiltersLocalStorage) &&\n true === options.storeFiltersLocalStorage &&\n isString(filterConfig.general.system) &&\n isString(filterConfig.general.subject)\n ) {\n storeKey = 'tableFilter_' + filterConfig.general.system + '_' + filterConfig.general.subject\n }\n\n // The page key exists even when filters are not persisted.\n // A string override distinguishes tables sharing a subject.\n const pageStoreKey =\n options.pageStoreKey ??\n (isString(options.storeFiltersLocalStorage)\n ? options.storeFiltersLocalStorage\n : datatablePageKey(filterConfig.general.system, filterConfig.general.subject))\n // Provided so `ADatatablePagination` picks it up. Guarded because\n // the composable may run outside setup, where Vue would warn.\n if (getCurrentInstance()) {\n provide(DatatablePageStoreKey, pageStoreKey)\n }\n const { consumeStoredPage, getStoredRowsPerPage, getStoredView, setStoredPage } = useDatatablePageStore()\n // The filter and sort a page is shown in. Stored on load, submit and reset, which every change of them goes through.\n const viewOf = (sortBy: DatatableSortBy) => encodeFilterHash(getFilterDataForStoring(), sortBy)\n // `ADatatablePagination` stores the page only when its watcher sees a change. A list that opens on page 1,\n // or returns to it within the tick that restored another page, would keep the older page for the next Close.\n const rememberShownPage = (pagination: Ref<Pagination>) =>\n setStoredPage(pageStoreKey, pagination.value.page, pagination.value.rowsPerPage, viewOf(pagination.value.sortBy))\n // The page Close kept. A list that keeps neither filter nor sort (no hash, no local storage) comes back with\n // both reset, and its page 3 would show other rows, so its page comes back only into the view it was shown in.\n // Not checked for other lists: they restore their view themselves, and many adjust the sort or a filter\n // in `getList` after a submit or reset stored the view, which would turn a correct restore into page 1.\n const keepsItsView = options.populateUrlParams || !isUndefined(storeKey)\n const consumeRestoredPage = (sortBy: DatatableSortBy) => {\n const page = consumeStoredPage(pageStoreKey)\n if (page === null || keepsItsView) return page\n const view = getStoredView(pageStoreKey)\n return view === null || view === viewOf(sortBy) ? page : null\n }\n // A restored page comes back at the page size it was shown at. At another size it would show other rows.\n const rowsPerPageFor = (pagination: Ref<Pagination>, restoredPage: number | null) =>\n restoredPage === null\n ? pagination.value.rowsPerPage\n : (getStoredRowsPerPage(pageStoreKey) ?? pagination.value.rowsPerPage)\n\n const { clearAll } = useFilterClearHelpers<F>()\n\n const getFilterDataForStoring = (): Record<string, AllowedFilterValues> => {\n const data: Record<string, AllowedFilterValues> = {}\n for (const filterName in filterData) {\n try {\n const key = filterName as keyof FilterData<F>\n const value = filterData[key]\n if (\n !isUndefined(value) &&\n !isNull(value) &&\n !isEmptyArray(value) &&\n !isSameFilterValue(value, filterConfig.fields[key].default)\n ) {\n data[filterName] = value\n }\n } catch (e) {\n // Ignore errors\n }\n }\n return data\n }\n\n const serializeFilters = (\n data: Record<string, AllowedFilterValues>,\n pagination: Ref<Pagination>,\n includeSort: boolean\n ): string => {\n return encodeFilterHash(data, includeSort ? pagination.value.sortBy : undefined)\n }\n\n const deserializeFilters = (\n hash: string\n ): { filters: Record<string, AllowedFilterValues>; sortBy: DatatableSortBy } | null => {\n if (!hash) return null\n if (hash.startsWith('#')) hash = hash.substring(1)\n\n // `URLSearchParams` encodes `~` in values, so the marker never occurs in our data.\n // A hash without it is foreign or truncated. `null` lets localStorage take over.\n const markerIndex = hash.indexOf(END_FILTER_MARKER)\n if (markerIndex === -1) return null\n hash = hash.slice(0, markerIndex)\n\n const params = new URLSearchParams(hash)\n const result: Record<string, AllowedFilterValues> = {}\n let sortBy: DatatableSortBy = null\n\n const sortParam = params.get(SORT_URL_PARAM)\n if (sortParam) {\n const [key, order] = sortParam.split(',')\n if (key && (order === SortOrder.Asc || order === SortOrder.Desc)) {\n sortBy = { key, order }\n }\n params.delete(SORT_URL_PARAM)\n }\n\n for (const [key, value] of params.entries()) {\n const fieldConfig = filterConfig.fields[key as keyof typeof filterConfig.fields]\n if (isUndefined(fieldConfig)) {\n console.error(`Filter config not found for ${key}`)\n continue\n }\n const isMultiple = fieldConfig.multiple ?? false\n\n if (isMultiple) {\n const items = value.split(',')\n\n const allNumeric = items.every((item) => item !== '' && String(Number(item)) === item)\n\n result[key] = allNumeric ? items.map(Number) : items\n } else {\n result[key] = value\n }\n }\n\n // An empty result would still count as \"found\", shadowing localStorage.\n if (isEmptyObject(result) && isNull(sortBy)) return null\n\n return { filters: result, sortBy }\n }\n\n // A submit replaces the history entry instead of adding one.\n // `replaceState` fires no popstate, so vue-router runs no navigation or guards per submit.\n // Its `current` is patched so the router's next push, which rewrites this entry, keeps the hash.\n const replaceHash = (hash: string) => {\n const url = window.location.pathname + window.location.search + hash\n const state = window.history.state\n const patched =\n isObject(state) && isString((state as { current?: unknown }).current)\n ? { ...state, current: ((state as { current: string }).current.split('#')[0] ?? '') + hash }\n : state\n window.history.replaceState(patched, '', url)\n }\n\n const updateLocationHash = (serialized: string) => {\n if (options.populateUrlParams === false) return\n replaceHash('#' + serialized)\n }\n\n const resetLocationHash = () => {\n if (options.populateUrlParams === false) return\n replaceHash('')\n }\n\n const parseLocationHash = () => {\n if (options.populateUrlParams === false) return null\n return deserializeFilters(window.location.hash)\n }\n\n const storeFilterLocalStorage = (serialized: string) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, serialized)\n }\n\n const loadFilterLocalStorage = () => {\n if (!storeKey || !localStorage) return null\n const stored = localStorage.getItem(storeKey)\n if (!stored || !isString(stored)) return null\n return deserializeFilters(stored)\n }\n\n const resetFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n pagination.value = { ...pagination.value, page: 1 }\n rememberShownPage(pagination)\n if (storeKey && localStorage) {\n localStorage.removeItem(storeKey)\n }\n resetLocationHash()\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const submitFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const data = getFilterDataForStoring()\n const serialized = serializeFilters(data, pagination, true)\n updateLocationHash(serialized)\n storeFilterLocalStorage(serialized)\n pagination.value = { ...pagination.value, page: 1 }\n rememberShownPage(pagination)\n filterConfig.touched = false\n if (callback) callback()\n }\n\n const loadStoredFilters = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n let source: 'hash' | 'localStorage' = 'hash'\n let storedFromHash = parseLocationHash()\n if (isNull(storedFromHash)) {\n source = 'localStorage'\n storedFromHash = loadFilterLocalStorage()\n }\n if (isNull(storedFromHash) || (isEmptyObject(storedFromHash.filters) && isNull(storedFromHash.sortBy))) {\n const restoredPage = consumeRestoredPage(pagination.value.sortBy)\n if (restoredPage !== null) {\n pagination.value = {\n ...pagination.value,\n page: restoredPage,\n rowsPerPage: rowsPerPageFor(pagination, restoredPage),\n }\n }\n rememberShownPage(pagination)\n if (callback) callback()\n return false\n }\n\n // A hash naming at least one field describes the whole view, whether\n // from a link or from going back. Reset the fields it omits.\n // Otherwise they keep values from the module-level store, and the same link lands\n // differently. Local storage still merges, since it omits fields equal to their default.\n // A `_sort`-only hash is excluded. It can come from a link for\n // another table on the same page and must not wipe this filter.\n // Only `clearable` fields are reset.\n const hashDescribesThisView = source === 'hash' && !isEmptyObject(storedFromHash.filters)\n if (hashDescribesThisView) {\n clearAll(filterData, filterConfig)\n }\n\n for (const filterName in filterData) {\n const key = filterName as keyof FilterData<F>\n let value = storedFromHash.filters[key]\n if (isUndefined(value)) continue\n if (isString(value)) {\n const tryConvertNumber = stringToNumber(value)\n if (!isNull(tryConvertNumber) && String(tryConvertNumber) === value) {\n value = tryConvertNumber\n } else {\n const tryConvertBoolean = stringToBooleanExact(value)\n if (!isNull(tryConvertBoolean)) {\n value = tryConvertBoolean\n }\n }\n }\n filterData[key] = value\n }\n if (source === 'localStorage' && storeKey && localStorage) {\n const stored = localStorage.getItem(storeKey)\n if (stored) {\n updateLocationHash(stored)\n }\n }\n // A link may omit the sort. Taking `null` would drop `order[...]` from\n // the query, and paging without ORDER BY can repeat or skip rows.\n const sortBy = storedFromHash.sortBy ?? pagination.value.sortBy\n // Always consumed. The flag means \"the next list should restore\n // its page\". Leaving it set would pass the page to the next table.\n const restoredPage = consumeRestoredPage(sortBy)\n pagination.value = {\n ...pagination.value,\n sortBy,\n // A link starts at the first page. A restored page still wins.\n // Only the close button sets that flag, meaning the user returns\n // to this list, and that address carries the list's own hash.\n page: restoredPage ?? (source === 'hash' ? 1 : pagination.value.page),\n rowsPerPage: rowsPerPageFor(pagination, restoredPage),\n }\n rememberShownPage(pagination)\n if (hashDescribesThisView) {\n // Local storage mirrors the last applied state, so a link becomes the view the user returns to.\n // Re-serialized to drop values equal to their default. A sort-only hash does not overwrite it.\n storeFilterLocalStorage(serializeFilters(getFilterDataForStoring(), pagination, true))\n }\n if (callback) callback()\n return true\n }\n\n return {\n loadStoredFilters,\n resetFilter,\n submitFilter,\n serializeFilters,\n deserializeFilters,\n }\n}\n\n/**\n * Provides the filter (`FilterConfigKey`, `FilterDataKey`) and `pagination` (`DatatablePaginationKey`)\n * to the filter bar and `ADatatablePagination` below, and wires the list to them.\n * `getList` is a debounced `fetchList(pagination, filterData, filterConfig)` that resolves when\n * the load finishes. A call superseded within the debounce resolves at once without loading.\n * Submit, reset and sort go through `useFilterHelpers` (with `filterHelpersOptions`).\n * On mount the stored filter and remembered page are restored before the first load.\n * Use only for a datatable that is the parent of its filter bar. Wire it by hand when the first load skips the stored\n * filter, `getList` adds logic, sort is custom, `fetchList` takes other arguments, or a parent renders the filter bar.\n * @example\n * const { filterData, filterConfig } = useFaqListFilter()\n * const { fetchList, listItems } = useFaqListActions()\n * const { pagination } = usePagination(SORT_BY_ID)\n * const { getList, sortByChange, submitFilterAction, resetFilterAction\n * } = useDatatableList(filterData, filterConfig, pagination, fetchList)\n */\nexport function useDatatableList<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n R = unknown,\n>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n pagination: Ref<Pagination>,\n fetchList: (pagination: Ref<Pagination>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => R,\n filterHelpersOptions: Partial<FilterHelpersMoreOptions> = {}\n) {\n provide(FilterConfigKey, filterConfig as FilterConfig)\n provide(FilterDataKey, filterData as FilterData)\n provide(DatatablePaginationKey, pagination)\n const { resetFilter, submitFilter, loadStoredFilters } = useFilterHelpers(\n filterData,\n filterConfig,\n filterHelpersOptions\n )\n const getList = useDebounceFn(() => fetchList(pagination, filterData, filterConfig))\n const submitFilterAction = () => submitFilter(pagination, getList)\n const resetFilterAction = () => resetFilter(pagination, getList)\n onMounted(() => loadStoredFilters(pagination, getList))\n return { getList, sortByChange: submitFilterAction, submitFilterAction, resetFilterAction }\n}\n\nexport type AllowedFilterValues = number | number[] | string | string[] | null | undefined | boolean\n\nexport interface GeneralFilterOptions {\n system?: string\n subject?: string\n elastic?: boolean\n simpleFilters?: boolean\n}\n\nexport interface FilerRenderOptions {\n skip: boolean\n // Whether the field shows as a chip in `FiltersSelected`. Default true.\n // Optional because other admins may construct `FilerRenderOptions`.\n selected?: boolean\n xs: number | undefined\n sm: number | undefined\n md: number | undefined\n lg: number | undefined\n xl: number | undefined\n}\n\nexport type FilterVariant =\n | 'search'\n | 'lt'\n | 'in'\n | 'notIn'\n | 'endsWith'\n | 'startsWith'\n | 'memberOf'\n | 'neq'\n | 'gte'\n | 'gt'\n | 'eq'\n | 'lte'\n | 'custom'\n\nexport type FilterType = 'boolean' | 'datetime' | 'integer' | 'string' | 'custom' | 'timeInterval'\n\nexport interface MakeFilterOption<TName extends string = string> {\n name: TName\n default: AllowedFilterValues\n type?: FilterType\n variant?: FilterVariant\n titleT?: string\n apiName?: string\n clearable?: boolean\n mandatory?: boolean\n advanced?: boolean\n exclude?: boolean\n related?: string | undefined\n render?: Partial<FilerRenderOptions>\n}\n\nexport interface FilterField {\n name: string\n type: FilterType\n variant: FilterVariant\n titleT?: string\n default: AllowedFilterValues\n apiName: string\n clearable: boolean\n mandatory: boolean\n multiple: boolean\n advanced: boolean\n exclude: boolean\n related: string | undefined\n render: FilerRenderOptions\n}\n\nexport type FilterConfig<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n general: GeneralFilterOptions\n touched: boolean\n fields: {\n [P in F[number]['name']]: FilterField\n }\n}\n\nexport type FilterData<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n [P in F[number]['name']]: AllowedFilterValues\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ADatatableOrdering.js","names":["_sfc_main","ADatatableOrdering_vue_vue_type_script_setup_true_lang_default","ADatatableOrdering_default"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatableOrdering.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n} from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nimport type { Pagination } from '@/domains/api/composables/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'id' | 'createdAt' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?: ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void) | undefined\n }>(),\n {\n variant: 'id',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItemsCreatedAt: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'id', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'id', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItemsCreatedAt\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = {\n ...pagination.value,\n sortBy: null,\n }\n emit('sortByChange', found)\n return\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(modelValue, (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n})\n\n// A getter, not the ref: the admins also set `pagination.value.sortBy` in place, which a shallow\n// watch of the ref never sees.\nwatch(\n () => ({ key: pagination.value.sortBy?.key, order: pagination.value.sortBy?.order }),\n (newValue, oldValue) => {\n if (newValue.key === oldValue?.key && newValue.order === oldValue?.order) {\n return\n }\n const found = options.value.find((option) => {\n return newValue.key === option.sortBy?.key && newValue.order === option.sortBy?.order\n })\n if (isUndefined(found)) {\n return\n }\n modelValue.value = found.id\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-body-small mr-1\">{{ t('common.system.datatable.ordering.title') }}:</div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n class=\"text-medium-emphasis\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === modelValue }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ADatatableOrdering.js","names":["_sfc_main","ADatatableOrdering_vue_vue_type_script_setup_true_lang_default","ADatatableOrdering_default"],"sources":["../../../../../src/domains/filters/datatable/components/ADatatableOrdering.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n} from '@/domains/filters/datatable/utils/datatableColumns'\nimport { SortOrder } from '@/domains/api/types/SortOrder'\nimport { isUndefined } from '@/shared/utils/common'\nimport { DatatablePaginationKey } from '@/domains/filters/utils/filterInjectionKeys'\n\nimport type { Pagination } from '@/domains/api/composables/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'id' | 'createdAt' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?: ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void) | undefined\n }>(),\n {\n variant: 'id',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItemsCreatedAt: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'id', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'id', order: SortOrder.Asc },\n },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n {\n id: 1,\n titleT: 'common.system.datatable.ordering.mostRecent',\n sortBy: { key: 'createdAt', order: SortOrder.Desc },\n },\n {\n id: 2,\n titleT: 'common.system.datatable.ordering.oldest',\n sortBy: { key: 'createdAt', order: SortOrder.Asc },\n },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItemsCreatedAt\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = {\n ...pagination.value,\n sortBy: null,\n }\n emit('sortByChange', found)\n return\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(modelValue, (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n // Already the pagination's sort: the ordering only follows it (a loaded hash, `setSortBy`, an admin setting\n // the v-model with it). Applying it again made the list submit, which put a restored page back to 1.\n const current = pagination.value.sortBy\n if (current?.key === found.sortBy?.key && current?.order === found.sortBy?.order) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n})\n\n// A getter, not the ref. Admins set `pagination.value.sortBy` in place, which a shallow watch of the ref misses.\nwatch(\n () => ({ key: pagination.value.sortBy?.key, order: pagination.value.sortBy?.order }),\n (newValue, oldValue) => {\n if (newValue.key === oldValue?.key && newValue.order === oldValue?.order) {\n return\n }\n const found = options.value.find((option) => {\n return newValue.key === option.sortBy?.key && newValue.order === option.sortBy?.order\n })\n if (isUndefined(found)) {\n return\n }\n modelValue.value = found.id\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-body-small mr-1\">{{ t('common.system.datatable.ordering.title') }}:</div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n class=\"text-medium-emphasis\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === modelValue }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n"],"mappings":""}
@@ -95,7 +95,9 @@ var O = { class: "d-flex align-center justify-center" }, k = { class: "text-body
95
95
  return b(M, (t, n) => {
96
96
  if (t === n) return;
97
97
  let r = z.value.find((e) => e.id === t);
98
- e(r) || (e(A.paginationUpdateCustomCb) ? V(r) : A.paginationUpdateCustomCb(r, N));
98
+ if (e(r)) return;
99
+ let i = N.value.sortBy;
100
+ (i?.key !== r.sortBy?.key || i?.order !== r.sortBy?.order) && (e(A.paginationUpdateCustomCb) ? V(r) : A.paginationUpdateCustomCb(r, N));
99
101
  }), b(() => ({
100
102
  key: N.value.sortBy?.key,
101
103
  order: N.value.sortBy?.order