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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
  2. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  3. package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
  4. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
  6. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
  8. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
  9. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
  11. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
  13. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
  15. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
  17. package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
  18. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
  20. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
  22. package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
  23. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
  25. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
  27. package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
  28. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/domains/auth/components/Acl.js.map +1 -1
  30. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  31. package/dist/domains/cached/components/ACachedChip.js.map +1 -1
  32. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
  34. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/domains/collab/components/ACollabCountdown.js.map +1 -1
  36. package/dist/domains/collab/components/ACollabCountdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
  38. package/dist/domains/collab/components/ACollabManagement.js.map +1 -1
  39. package/dist/domains/collab/components/ACollabManagement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
  41. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
  43. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
  45. package/dist/domains/dam/assetDetail/components/AColorBox.js.map +1 -1
  46. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
  47. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
  49. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
  51. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/domains/dam/assetDetail/components/AssetDetailDialogLoader.js.map +1 -1
  53. package/dist/domains/dam/assetDetail/components/AssetDetailDialogSidebar.js.map +1 -1
  54. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsTeleportTarget.js.map +1 -1
  55. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.js.map +1 -1
  56. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
  58. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
  60. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
  62. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.js.map +1 -1
  64. package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  65. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
  66. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/domains/dam/assetDetail/components/AssetFileRotate.js.map +1 -1
  68. package/dist/domains/dam/assetDetail/components/AssetFileRotate.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
  70. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
  72. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
  74. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
  76. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.js.map +1 -1
  78. package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.vue_vue_type_script_setup_true_lang.js.map +1 -1
  79. package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
  80. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  81. package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
  82. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  83. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
  84. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
  86. package/dist/domains/dam/assetSelect/components/AssetImagePreview.js.map +1 -1
  87. package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/domains/dam/assetSelect/components/AssetSelectFilter.js.map +1 -1
  89. package/dist/domains/dam/assetSelect/components/AssetSelectFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.js.map +1 -1
  91. package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  92. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
  93. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  94. package/dist/domains/dam/assetSelect/components/AssetSelectListTable.js.map +1 -1
  95. package/dist/domains/dam/assetSelect/components/AssetSelectListTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  96. package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.js.map +1 -1
  97. package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
  99. package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.js.map +1 -1
  100. package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/domains/dam/assetSelect/components/FilterPodcastRemoteAutocomplete.js.map +1 -1
  102. package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
  103. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  104. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
  105. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
  107. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  108. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
  109. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
  111. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  112. package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
  113. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  114. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
  116. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  117. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.js.map +1 -1
  118. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
  120. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
  122. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  123. package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
  124. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  125. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
  126. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/domains/dam/imageWidget/components/AImageWidgetMultipleSimple.js.map +1 -1
  128. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.js.map +1 -1
  129. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.js.map +1 -1
  131. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
  133. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  134. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
  135. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
  137. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
  139. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
  141. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  142. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
  143. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  144. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
  145. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.js.map +1 -1
  147. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  148. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
  149. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
  150. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  151. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
  152. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
  154. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  155. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
  156. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  157. package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.js.map +1 -1
  158. package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
  160. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
  162. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  163. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
  164. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
  165. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
  167. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
  169. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
  171. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  172. package/dist/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.js.map +1 -1
  173. package/dist/domains/dam/user/components/DamAssetLicenceGroupRemoteAutocomplete.js.map +1 -1
  174. package/dist/domains/dam/user/components/DamAssetLicenceRemoteAutocomplete.js.map +1 -1
  175. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
  176. package/dist/domains/dam/user/components/DamExtSystemRemoteAutocomplete.js.map +1 -1
  177. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
  178. package/dist/domains/dam/user/components/DamUserFilterRemoteAutocomplete.js.map +1 -1
  179. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
  180. package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.js.map +1 -1
  181. package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  182. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
  183. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  184. package/dist/domains/filters/bookmarks/components/FilterBookmarks.js.map +1 -1
  185. package/dist/domains/filters/bookmarks/components/FilterBookmarks.vue_vue_type_script_setup_true_lang.js.map +1 -1
  186. package/dist/domains/filters/components/AFilterAdvancedButton.js.map +1 -1
  187. package/dist/domains/filters/components/AFilterBooleanSelect.js.map +1 -1
  188. package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
  189. package/dist/domains/filters/components/AFilterEmpty.js.map +1 -1
  190. package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
  191. package/dist/domains/filters/components/AFilterResetButton.js.map +1 -1
  192. package/dist/domains/filters/components/AFilterString.js.map +1 -1
  193. package/dist/domains/filters/components/AFilterString.vue.d.ts +3 -0
  194. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js +8 -2
  195. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
  196. package/dist/domains/filters/components/AFilterSubmitButton.js.map +1 -1
  197. package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
  198. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
  199. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
  200. package/dist/domains/filters/components/AFilterWrapper.js.map +1 -1
  201. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  202. package/dist/domains/filters/components/AFilterWrapperSidebar.js.map +1 -1
  203. package/dist/domains/filters/components/FilterDetailItem.js.map +1 -1
  204. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  205. package/dist/domains/filters/datatable/components/ADatatableConfigButton.js.map +1 -1
  206. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  207. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  208. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  209. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  210. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  211. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  212. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  213. package/dist/domains/form/components/AFormRemoteCheckbox.js.map +1 -1
  214. package/dist/domains/form/components/AFormRemoteCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/domains/form/components/AFormRemoteSwitch.js.map +1 -1
  216. package/dist/domains/form/components/AFormRemoteSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/domains/form/components/AFormSwitch.js.map +1 -1
  218. package/dist/domains/form/components/AFormSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  220. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  221. package/dist/domains/form/components/AFormTextarea.js.map +1 -1
  222. package/dist/domains/form/components/AFormTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/domains/form/components/AFormValueObjectOptionsSelect.js.map +1 -1
  224. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  225. package/dist/domains/form/components/ASystemEntityScope.js.map +1 -1
  226. package/dist/domains/job/components/AJobBaseCreateForm.js.map +1 -1
  227. package/dist/domains/job/components/AJobBaseCreateForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/domains/job/components/AJobDetailCommon.js.map +1 -1
  229. package/dist/domains/job/components/AJobPriorityChip.js.map +1 -1
  230. package/dist/domains/job/components/AJobStatusChip.js.map +1 -1
  231. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  232. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  233. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  234. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  235. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  236. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  237. package/dist/domains/listEditor/components/internal/LeChangeParentDialog.js.map +1 -1
  238. package/dist/domains/listEditor/components/internal/LeChangeParentDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  239. package/dist/domains/listEditor/components/internal/LeDeleteDialog.js.map +1 -1
  240. package/dist/domains/listEditor/components/internal/LeDeleteDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/domains/listEditor/components/internal/LeDragHandle.js.map +1 -1
  242. package/dist/domains/listEditor/components/internal/LeEmptyState.js.map +1 -1
  243. package/dist/domains/listEditor/components/internal/LeEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.js.map +1 -1
  245. package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  246. package/dist/domains/listEditor/components/internal/LeNestedRow.js.map +1 -1
  247. package/dist/domains/listEditor/components/internal/LeNestedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/domains/listEditor/components/internal/LeStatus.js.map +1 -1
  249. package/dist/domains/listEditor/components/internal/LeStatus.vue_vue_type_script_setup_true_lang.js.map +1 -1
  250. package/dist/domains/listEditor/components/internal/LeUnsavedLabel.js.map +1 -1
  251. package/dist/domains/listEditor/components/internal/LeUnsavedLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  253. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  254. package/dist/domains/log/components/ALogDetail.js.map +1 -1
  255. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  256. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  257. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  258. package/dist/domains/log/components/ALogLevelChip.js.map +1 -1
  259. package/dist/domains/log/components/ALogLevelChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  260. package/dist/domains/log/components/ALogListView.js.map +1 -1
  261. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  262. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  263. package/dist/domains/permission/components/APermissionGrantEditor.js.map +1 -1
  264. package/dist/domains/permission/components/APermissionValueChip.js.map +1 -1
  265. package/dist/domains/permission/components/APermissionValueChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  266. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  267. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  269. package/dist/domains/permission/group/components/APermissionGroupFilter.js.map +1 -1
  270. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  271. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/domains/permission/group/components/APermissionGroupRemoteAutocomplete.js.map +1 -1
  273. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  274. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  276. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  277. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  278. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.js.map +1 -1
  279. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  280. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.js.map +1 -1
  281. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  283. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/domains/system/appShell/components/AActionbar.js.map +1 -1
  285. package/dist/domains/system/appShell/components/AActionbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  286. package/dist/domains/system/appShell/components/AActionbarTarget.js.map +1 -1
  287. package/dist/domains/system/appShell/components/ALayoutLoader.js.map +1 -1
  288. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  289. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  290. package/dist/domains/system/components/AAdminSwitcher.js.map +1 -1
  291. package/dist/domains/system/components/AAdminSwitcher.vue_vue_type_script_setup_true_lang.js.map +1 -1
  292. package/dist/domains/system/components/AAlerts.js.map +1 -1
  293. package/dist/domains/system/components/ALanguageSelect.js.map +1 -1
  294. package/dist/domains/system/components/AThemeSelect.js.map +1 -1
  295. package/dist/domains/system/components/AThemeSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  296. package/dist/domains/system/flags/components/FlagCountry.js.map +1 -1
  297. package/dist/domains/system/flags/components/FlagEn.js.map +1 -1
  298. package/dist/domains/system/flags/components/FlagSk.js.map +1 -1
  299. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  300. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  301. package/dist/domains/system/systemBar/components/ASystemBarNewVersion.js.map +1 -1
  302. package/dist/domains/system/systemBar/components/ASystemBarNewVersion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  303. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  304. package/dist/domains/ui/buttons/action/components/AActionCreateButton.js.map +1 -1
  305. package/dist/domains/ui/buttons/action/components/AActionCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  306. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  307. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  308. package/dist/domains/ui/buttons/action/components/AActionEditButton.js.map +1 -1
  309. package/dist/domains/ui/buttons/action/components/AActionEditButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  310. package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.js.map +1 -1
  311. package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  312. package/dist/domains/ui/buttons/action/components/AActionSaveButton.js.map +1 -1
  313. package/dist/domains/ui/buttons/action/components/AActionSaveButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  314. package/dist/domains/ui/buttons/components/ABtnSplit.js.map +1 -1
  315. package/dist/domains/ui/buttons/components/ABtnSplit.vue_vue_type_script_setup_true_lang.js.map +1 -1
  316. package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.js.map +1 -1
  317. package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  318. package/dist/domains/ui/buttons/table/components/ATableDetailButton.js.map +1 -1
  319. package/dist/domains/ui/buttons/table/components/ATableDetailButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  320. package/dist/domains/ui/buttons/table/components/ATableEditButton.js.map +1 -1
  321. package/dist/domains/ui/buttons/table/components/ATableEditButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  322. package/dist/domains/ui/components/AAnzuUserAvatar.js.map +1 -1
  323. package/dist/domains/ui/components/AAnzuUserAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  324. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  325. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  326. package/dist/domains/ui/components/ABooleanSelect.js.map +1 -1
  327. package/dist/domains/ui/components/ABooleanValue.js.map +1 -1
  328. package/dist/domains/ui/components/ACard.js.map +1 -1
  329. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  330. package/dist/domains/ui/components/AChipNoLink.js.map +1 -1
  331. package/dist/domains/ui/components/ACopyText.js.map +1 -1
  332. package/dist/domains/ui/components/ACopyText.vue_vue_type_script_setup_true_lang.js.map +1 -1
  333. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  334. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  335. package/dist/domains/ui/components/ACurrentUserDropdown.js.map +1 -1
  336. package/dist/domains/ui/components/ACurrentUserDropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  337. package/dist/domains/ui/components/ADialogToolbar.js.map +1 -1
  338. package/dist/domains/ui/components/AIconGroup.js.map +1 -1
  339. package/dist/domains/ui/components/AProgress.js.map +1 -1
  340. package/dist/domains/ui/components/ARow.js.map +1 -1
  341. package/dist/domains/ui/components/ARow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  342. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  343. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  344. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  345. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  346. package/dist/domains/ui/datetime/components/ADatetime.js.map +1 -1
  347. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  348. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  349. package/dist/domains/ui/datetime/components/TimePicker.js.map +1 -1
  350. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  351. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  352. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  353. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  354. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  355. package/dist/domains/ui/view/components/AGenericView.js.map +1 -1
  356. package/dist/domains/ui/view/components/AGenericView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  357. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  358. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  359. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  360. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  361. package/dist/domains/ui/view/components/AUnauthorizedView.js.map +1 -1
  362. package/dist/domains/ui/view/components/AUnauthorizedView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  363. package/dist/domains/unsavedGuard/components/AUnsavedConfirmDialog.js.map +1 -1
  364. package/dist/locales/cs/common/alert.js.map +1 -1
  365. package/dist/locales/cs/common/anzuUser.js.map +1 -1
  366. package/dist/locales/cs/common/assetSelect.js.map +1 -1
  367. package/dist/locales/cs/common/button.js.map +1 -1
  368. package/dist/locales/cs/common/collab.js.map +1 -1
  369. package/dist/locales/cs/common/confirmDialog.js.map +1 -1
  370. package/dist/locales/cs/common/customForm.js.map +1 -1
  371. package/dist/locales/cs/common/customFormElement.js.map +1 -1
  372. package/dist/locales/cs/common/damImage.js.map +1 -1
  373. package/dist/locales/cs/common/dayOfWeek.js.map +1 -1
  374. package/dist/locales/cs/common/filter.js.map +1 -1
  375. package/dist/locales/cs/common/job.js.map +1 -1
  376. package/dist/locales/cs/common/linkDto.js.map +1 -1
  377. package/dist/locales/cs/common/listItemDto.js.map +1 -1
  378. package/dist/locales/cs/common/log.js.map +1 -1
  379. package/dist/locales/cs/common/model.js.map +1 -1
  380. package/dist/locales/cs/common/permission.js.map +1 -1
  381. package/dist/locales/cs/common/permissionEditor.js.map +1 -1
  382. package/dist/locales/cs/common/permissionGroup.js.map +1 -1
  383. package/dist/locales/cs/common/routeSettings.js.map +1 -1
  384. package/dist/locales/cs/common/sortable.js.map +1 -1
  385. package/dist/locales/cs/common/subjectSelect.js.map +1 -1
  386. package/dist/locales/cs/common/system.js.map +1 -1
  387. package/dist/locales/cs/common/time.js.map +1 -1
  388. package/dist/locales/cs/common/userSystem.js.map +1 -1
  389. package/dist/locales/cs/error/apiDependencyExists.js.map +1 -1
  390. package/dist/locales/cs/error/apiForbiddenOperation.js.map +1 -1
  391. package/dist/locales/cs/error/apiTimedOut.js.map +1 -1
  392. package/dist/locales/cs/error/apiValidation.js.map +1 -1
  393. package/dist/locales/cs/error/jsValidation.js.map +1 -1
  394. package/dist/locales/cs/vuetify.js.map +1 -1
  395. package/dist/locales/en/common/alert.js.map +1 -1
  396. package/dist/locales/en/common/anzuUser.js.map +1 -1
  397. package/dist/locales/en/common/assetSelect.js.map +1 -1
  398. package/dist/locales/en/common/button.js.map +1 -1
  399. package/dist/locales/en/common/collab.js.map +1 -1
  400. package/dist/locales/en/common/confirmDialog.js.map +1 -1
  401. package/dist/locales/en/common/customForm.js.map +1 -1
  402. package/dist/locales/en/common/customFormElement.js.map +1 -1
  403. package/dist/locales/en/common/damImage.js.map +1 -1
  404. package/dist/locales/en/common/dayOfWeek.js.map +1 -1
  405. package/dist/locales/en/common/filter.js.map +1 -1
  406. package/dist/locales/en/common/job.js.map +1 -1
  407. package/dist/locales/en/common/linkDto.js.map +1 -1
  408. package/dist/locales/en/common/listItemDto.js.map +1 -1
  409. package/dist/locales/en/common/log.js.map +1 -1
  410. package/dist/locales/en/common/model.js.map +1 -1
  411. package/dist/locales/en/common/permission.js.map +1 -1
  412. package/dist/locales/en/common/permissionEditor.js.map +1 -1
  413. package/dist/locales/en/common/permissionGroup.js.map +1 -1
  414. package/dist/locales/en/common/routeSettings.js.map +1 -1
  415. package/dist/locales/en/common/sortable.js.map +1 -1
  416. package/dist/locales/en/common/subjectSelect.js.map +1 -1
  417. package/dist/locales/en/common/system.js.map +1 -1
  418. package/dist/locales/en/common/time.js.map +1 -1
  419. package/dist/locales/en/common/userSystem.js.map +1 -1
  420. package/dist/locales/en/error/apiDependencyExists.js.map +1 -1
  421. package/dist/locales/en/error/apiForbiddenOperation.js.map +1 -1
  422. package/dist/locales/en/error/apiTimedOut.js.map +1 -1
  423. package/dist/locales/en/error/apiValidation.js.map +1 -1
  424. package/dist/locales/en/error/jsValidation.js.map +1 -1
  425. package/dist/locales/en/vuetify.js.map +1 -1
  426. package/dist/locales/sk/common/alert.js.map +1 -1
  427. package/dist/locales/sk/common/anzuUser.js.map +1 -1
  428. package/dist/locales/sk/common/assetSelect.js.map +1 -1
  429. package/dist/locales/sk/common/button.js.map +1 -1
  430. package/dist/locales/sk/common/collab.js.map +1 -1
  431. package/dist/locales/sk/common/confirmDialog.js.map +1 -1
  432. package/dist/locales/sk/common/customForm.js.map +1 -1
  433. package/dist/locales/sk/common/customFormElement.js.map +1 -1
  434. package/dist/locales/sk/common/damImage.js.map +1 -1
  435. package/dist/locales/sk/common/dayOfWeek.js.map +1 -1
  436. package/dist/locales/sk/common/filter.js.map +1 -1
  437. package/dist/locales/sk/common/job.js.map +1 -1
  438. package/dist/locales/sk/common/linkDto.js.map +1 -1
  439. package/dist/locales/sk/common/listItemDto.js.map +1 -1
  440. package/dist/locales/sk/common/log.js.map +1 -1
  441. package/dist/locales/sk/common/model.js.map +1 -1
  442. package/dist/locales/sk/common/permission.js.map +1 -1
  443. package/dist/locales/sk/common/permissionEditor.js.map +1 -1
  444. package/dist/locales/sk/common/permissionGroup.js.map +1 -1
  445. package/dist/locales/sk/common/routeSettings.js.map +1 -1
  446. package/dist/locales/sk/common/sortable.js.map +1 -1
  447. package/dist/locales/sk/common/subjectSelect.js.map +1 -1
  448. package/dist/locales/sk/common/system.js.map +1 -1
  449. package/dist/locales/sk/common/time.js.map +1 -1
  450. package/dist/locales/sk/common/userSystem.js.map +1 -1
  451. package/dist/locales/sk/error/apiDependencyExists.js.map +1 -1
  452. package/dist/locales/sk/error/apiForbiddenOperation.js.map +1 -1
  453. package/dist/locales/sk/error/apiTimedOut.js.map +1 -1
  454. package/dist/locales/sk/error/apiValidation.js.map +1 -1
  455. package/dist/locales/sk/error/jsValidation.js.map +1 -1
  456. package/dist/locales/sk/vuetify.js.map +1 -1
  457. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"AFormValueObjectOptionsSelect.js","names":["_sfc_main","AFormValueObjectOptionsSelect_vue_vue_type_script_setup_true_lang_default","AFormValueObjectOptionsSelect_default"],"sources":["../../../../src/domains/form/components/AFormValueObjectOptionsSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, ref, watch, unref } from 'vue'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { cloneDeep, isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { useI18n } from 'vue-i18n'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n items: any[]\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n hideLabel?: boolean\n multiple?: boolean\n hideDetails?: boolean\n clearable?: boolean\n dataCy?: string\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n help?: string | undefined\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n hideLabel: false,\n multiple: false,\n hideDetails: false,\n clearable: false,\n dataCy: '',\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n help: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'blur', data: any): void\n (e: 'focus', data: any): void\n}>()\n\nconst hasNullOption = computed(() => (props.items ?? []).some((item) => isNull(item) || isNull(item?.value)))\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue) {\n // VAutocomplete drops the selection when its search text is emptied, emitting null even when\n // not clearable. A tri-state select lists null as a real option, so there null must pass through.\n if (!props.clearable && !props.multiple && !hasNullOption.value && isNull(newValue) && !isNull(props.modelValue))\n return\n emit('update:modelValue', cloneDeep<any>(newValue))\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst { t } = useI18n()\n\nconst isFocused = ref(false)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', props.modelValue)\n props.v?.$touch()\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if ((props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.multiple === false) return false\n return true as unknown as undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n :items=\"items\"\n item-title=\"title\"\n item-value=\"value\"\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :clearable=\"clearable\"\n :hide-details=\"hideDetails\"\n :error-messages=\"errorMessageComputed\"\n :data-cy=\"dataCy\"\n autocomplete=\"off\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n >\n <template #label>\n <span v-if=\"!hideLabel\"\n >{{ labelComputed\n }}<span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n /></span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"help\"\n #append\n >\n <VIcon\n v-tooltip=\"help\"\n icon=\"mdi-help-circle-outline\"\n />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AFormValueObjectOptionsSelect.js","names":["AFormValueObjectOptionsSelect_vue_vue_type_script_setup_true_lang_default","AFormValueObjectOptionsSelect_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AFormValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_createSlots","_withCtx","_createElementBlock","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","ACollabLockedByUser","_withDirectives","_createVNode","_component_VIcon","_directive_tooltip","ACollabLockedByUser_default","_hoisted_1","_hoisted_2","AFormValueObjectOptionsSelect_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","hasNullOption","computed","isNull","item","modelValue","newValue","cloneDeep","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","system","inject","SystemScopeKey","subject","SubjectScopeKey","useI18n","isFocused","onBlur","onFocus","errorMessageComputed","unref","labelComputed","isUndefined","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","multipleComputedVuetifyTypeFix","oldValue","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","createCommentVNode","createElementBlock","createTextVNode","toDisplayString","renderSlot","_ctx","withDirectives","createVNode","VIcon","Tooltip"],"sources":["../../../../src/domains/form/components/AFormValueObjectOptionsSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, ref, watch, unref } from 'vue'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { cloneDeep, isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { useI18n } from 'vue-i18n'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n items: any[]\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n hideLabel?: boolean\n multiple?: boolean\n hideDetails?: boolean\n clearable?: boolean\n dataCy?: string\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n help?: string | undefined\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n hideLabel: false,\n multiple: false,\n hideDetails: false,\n clearable: false,\n dataCy: '',\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n help: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'blur', data: any): void\n (e: 'focus', data: any): void\n}>()\n\nconst hasNullOption = computed(() => (props.items ?? []).some((item) => isNull(item) || isNull(item?.value)))\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue) {\n // VAutocomplete drops the selection when its search text is emptied, emitting null even when\n // not clearable. A tri-state select lists null as a real option, so there null must pass through.\n if (!props.clearable && !props.multiple && !hasNullOption.value && isNull(newValue) && !isNull(props.modelValue))\n return\n emit('update:modelValue', cloneDeep<any>(newValue))\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst { t } = useI18n()\n\nconst isFocused = ref(false)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', props.modelValue)\n props.v?.$touch()\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if ((props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.multiple === false) return false\n return true as unknown as undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n :items=\"items\"\n item-title=\"title\"\n item-value=\"value\"\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :clearable=\"clearable\"\n :hide-details=\"hideDetails\"\n :error-messages=\"errorMessageComputed\"\n :data-cy=\"dataCy\"\n autocomplete=\"off\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n >\n <template #label>\n <span v-if=\"!hideLabel\"\n >{{ labelComputed\n }}<span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n /></span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"help\"\n #append\n >\n <VIcon\n v-tooltip=\"help\"\n icon=\"mdi-help-circle-outline\"\n />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"AFormValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_component_VAutocomplete","_withCtx","_createElementBlock","_createTextVNode","_toDisplayString","_renderSlot","ACollabLockedByUser","_withDirectives","_createVNode","_component_VIcon","_directive_tooltip","ACollabLockedByUser_default","_hoisted_1","_hoisted_2","AFormValueObjectOptionsSelect_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","hasNullOption","computed","isNull","item","modelValue","newValue","cloneDeep","useCommonAdminCollabOptions","releaseFieldLock","ref","changeFieldData","acquireFieldLock","lockedByUserLocal","collabOptions","isDefined","useCollabField","releaseCollabFieldLock","changeCollabFieldData","acquireCollabFieldLock","watch","lockedByUser","system","inject","SystemScopeKey","subject","SubjectScopeKey","useI18n","isFocused","onBlur","onFocus","errorMessageComputed","unref","labelComputed","isUndefined","path","stringSplitOnFirstOccurrence","t","requiredComputed","disabledComputed","multipleComputedVuetifyTypeFix","oldValue","openBlock","createBlock","VAutocomplete","_cache","$event","createSlots","withCtx","createCommentVNode","createElementBlock","createTextVNode","toDisplayString","renderSlot","_ctx","withDirectives","createVNode","VIcon","Tooltip"],"sources":["../../../../src/domains/form/components/AFormValueObjectOptionsSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AFormFieldValidation } from '@/shared/types/Validation'\nimport { computed, inject, ref, watch, unref } from 'vue'\nimport { stringSplitOnFirstOccurrence } from '@/shared/utils/string'\nimport { cloneDeep, isDefined, isNull, isUndefined } from '@/shared/utils/common'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\nimport { useI18n } from 'vue-i18n'\nimport ACollabLockedByUser from '@/domains/collab/components/ACollabLockedByUser.vue'\nimport { useCollabField } from '@/domains/collab/composables/collabField'\nimport type { CollabComponentConfig, CollabFieldData } from '@/domains/collab/types/Collab'\nimport type { IntegerIdNullable } from '@/shared/types/common'\nimport { useCommonAdminCollabOptions } from '@/domains/collab/composables/commonAdminCollabOptions'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: any\n items: any[]\n label?: string\n errorMessage?: string\n required?: boolean\n v?: AFormFieldValidation | null\n hideLabel?: boolean\n multiple?: boolean\n hideDetails?: boolean\n clearable?: boolean\n dataCy?: string\n collab?: CollabComponentConfig\n disabled?: boolean\n readonly?: boolean\n help?: string | undefined\n }>(),\n {\n label: undefined,\n errorMessage: undefined,\n required: undefined,\n v: null,\n hideLabel: false,\n multiple: false,\n hideDetails: false,\n clearable: false,\n dataCy: '',\n collab: undefined,\n disabled: undefined,\n readonly: undefined,\n help: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'update:modelValue', data: any): void\n (e: 'blur', data: any): void\n (e: 'focus', data: any): void\n}>()\n\nconst hasNullOption = computed(() => (props.items ?? []).some((item) => isNull(item) || isNull(item?.value)))\n\nconst modelValue = computed({\n get() {\n return props.modelValue\n },\n set(newValue) {\n // VAutocomplete drops the selection when its search text is emptied, emitting null even when\n // not clearable. A tri-state select lists null as a real option, so there null must pass through.\n if (!props.clearable && !props.multiple && !hasNullOption.value && isNull(newValue) && !isNull(props.modelValue))\n return\n emit('update:modelValue', cloneDeep<any>(newValue))\n },\n})\n\n// Collaboration\nconst { collabOptions } = useCommonAdminCollabOptions()\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst releaseFieldLock = ref((data: CollabFieldData) => {})\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst changeFieldData = ref((data: CollabFieldData) => {})\nconst acquireFieldLock = ref(() => {})\nconst lockedByUserLocal = ref<IntegerIdNullable>(null)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nif (collabOptions.value.enabled && isDefined(props.collab)) {\n const { releaseCollabFieldLock, changeCollabFieldData, acquireCollabFieldLock, lockedByUser } = useCollabField(\n props.collab.room,\n props.collab.field,\n false,\n true\n )\n releaseFieldLock.value = releaseCollabFieldLock\n changeFieldData.value = changeCollabFieldData\n acquireFieldLock.value = acquireCollabFieldLock\n watch(\n lockedByUser,\n (newValue) => {\n lockedByUserLocal.value = newValue\n },\n { immediate: true }\n )\n}\n\nconst system = inject<string | undefined>(SystemScopeKey, undefined)\nconst subject = inject<string | undefined>(SubjectScopeKey, undefined)\n\nconst { t } = useI18n()\n\nconst isFocused = ref(false)\n\nconst onBlur = () => {\n isFocused.value = false\n emit('blur', props.modelValue)\n props.v?.$touch()\n releaseFieldLock.value(props.modelValue)\n}\n\nconst onFocus = () => {\n isFocused.value = true\n emit('focus', props.modelValue)\n acquireFieldLock.value()\n}\n\nconst errorMessageComputed = computed(() => {\n if (isDefined(props.errorMessage)) return [props.errorMessage]\n if (props.v?.$errors?.length) return props.v.$errors.map((item) => unref(item.$message))\n return []\n})\n\nconst labelComputed = computed(() => {\n if (isDefined(props.label)) return props.label\n if (isUndefined(system) || isUndefined(subject) || isUndefined(props.v?.$path)) return ''\n const { end: path } = stringSplitOnFirstOccurrence(props.v?.$path, '.')\n return t(system + '.' + subject + '.model.' + path)\n})\n\nconst requiredComputed = computed(() => {\n if (isDefined(props.required)) return props.required\n if ((props.v?.required as { $params?: { type?: string } } | undefined)?.$params?.type === 'required') return true\n return false\n})\n\nconst disabledComputed = computed(() => {\n if (isDefined(props.disabled)) return props.disabled\n return !!lockedByUserLocal.value\n})\n\nconst multipleComputedVuetifyTypeFix = computed(() => {\n if (props.multiple === false) return false\n return true as unknown as undefined\n})\n\nwatch(\n modelValue,\n async (newValue, oldValue) => {\n if (newValue === oldValue) return\n if (collabOptions.value.enabled && isFocused.value) {\n changeFieldData.value(newValue)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n :items=\"items\"\n item-title=\"title\"\n item-value=\"value\"\n :multiple=\"multipleComputedVuetifyTypeFix\"\n :disabled=\"disabledComputed\"\n :readonly=\"readonly\"\n :clearable=\"clearable\"\n :hide-details=\"hideDetails\"\n :error-messages=\"errorMessageComputed\"\n :data-cy=\"dataCy\"\n autocomplete=\"off\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n >\n <template #label>\n <span v-if=\"!hideLabel\"\n >{{ labelComputed\n }}<span\n v-if=\"requiredComputed\"\n class=\"a-required-mark\"\n /></span>\n </template>\n <template\n v-if=\"lockedByUserLocal\"\n #append-inner\n >\n <slot\n name=\"locked\"\n :user-id=\"lockedByUserLocal\"\n >\n <ACollabLockedByUser\n v-if=\"collab\"\n :id=\"lockedByUserLocal\"\n :users=\"collab.cachedUsers\"\n />\n </slot>\n </template>\n <template\n v-if=\"help\"\n #append\n >\n <VIcon\n v-tooltip=\"help\"\n icon=\"mdi-help-circle-outline\"\n />\n </template>\n </VAutocomplete>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ASystemEntityScope.js","names":["_sfc_main","ASystemEntityScope_vue_vue_type_script_setup_true_lang_default","ASystemEntityScope_default"],"sources":["../../../../src/domains/form/components/ASystemEntityScope.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { provide } from 'vue'\nimport { SubjectScopeKey, SystemScopeKey } from '@/shared/injectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n system: string\n subject: string\n }>(),\n {}\n)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nprovide<string>(SystemScopeKey, props.system)\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nprovide<string>(SubjectScopeKey, props.subject)\n</script>\n\n<template>\n <slot />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ASystemEntityScope.js","names":["ASystemEntityScope_vue_vue_type_script_setup_true_lang_default","ASystemEntityScope_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AJobBaseCreateForm.js","names":["_sfc_main","AJobBaseCreateForm_vue_vue_type_script_setup_true_lang_default","AJobBaseCreateForm_default"],"sources":["../../../../src/domains/job/components/AJobBaseCreateForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { JobBase } from '@/domains/job/types/Job'\nimport { useJobPriority } from '@/domains/job/composables/jobPriority'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormDatetimePicker from '@/domains/form/components/AFormDatetimePicker.vue'\nimport { useI18n } from 'vue-i18n'\n\nconst modelValue = defineModel<JobBase>({ required: true })\nconst { priorityLabels, getPriorityColor } = useJobPriority()\nconst sliderColor = computed(() => {\n return getPriorityColor(modelValue.value.priority)\n})\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow>\n <AFormDatetimePicker\n v-model=\"modelValue.scheduledAt\"\n :label=\"t('common.job.model.scheduledAt')\"\n />\n </ARow>\n <ARow>\n <VSlider\n v-model=\"modelValue.priority\"\n :ticks=\"priorityLabels\"\n :max=\"2\"\n step=\"1\"\n show-ticks=\"always\"\n tick-size=\"3\"\n :color=\"sliderColor\"\n />\n </ARow>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AJobBaseCreateForm.js","names":["AJobBaseCreateForm_vue_vue_type_script_setup_true_lang_default","AJobBaseCreateForm_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AJobBaseCreateForm.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_Fragment","_createVNode","ARow","_withCtx","AFormDatetimePicker","_unref","_component_VSlider","ARow_default","AFormDatetimePicker_default","AJobBaseCreateForm_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","modelValue","useModel","__props","useJobPriority","sliderColor","computed","getPriorityColor","useI18n","openBlock","createElementBlock","Fragment","createVNode","withCtx","_cache","$event","unref","t","VSlider","priorityLabels"],"sources":["../../../../src/domains/job/components/AJobBaseCreateForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { JobBase } from '@/domains/job/types/Job'\nimport { useJobPriority } from '@/domains/job/composables/jobPriority'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormDatetimePicker from '@/domains/form/components/AFormDatetimePicker.vue'\nimport { useI18n } from 'vue-i18n'\n\nconst modelValue = defineModel<JobBase>({ required: true })\nconst { priorityLabels, getPriorityColor } = useJobPriority()\nconst sliderColor = computed(() => {\n return getPriorityColor(modelValue.value.priority)\n})\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow>\n <AFormDatetimePicker\n v-model=\"modelValue.scheduledAt\"\n :label=\"t('common.job.model.scheduledAt')\"\n />\n </ARow>\n <ARow>\n <VSlider\n v-model=\"modelValue.priority\"\n :ticks=\"priorityLabels\"\n :max=\"2\"\n step=\"1\"\n show-ticks=\"always\"\n tick-size=\"3\"\n :color=\"sliderColor\"\n />\n </ARow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAQA,IAAMe,IAAaf,EAAoBiB,GAAA,YAAmB,GACpD,EAAE,mBAAgB,wBAAqBC,EAAe,GACtDC,IAAcC,QACXC,EAAiBN,EAAW,MAAM,QAAQ,CAClD,GACK,EAAE,SAAMO,EAAQ;E,mCAIpBlB,EAKOC,GAAA,MAAA;GAJL,SAAAC,QAGE,CAHFF,EAGEG,GAAA;IAFS,YAAAQ,EAAA,MAAW;IAAX,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAA,MAAW,cAAWC;IAC9B,OAAOrB,EAAAuB,CAAA,CAAC,CAAA,8BAAA;;;E,IAGb3B,EAUOC,GAAA,MAAA;GATL,SAAAC,QAQE,CARFF,EAQEK,GAAA;IAPS,YAAAM,EAAA,MAAW;IAAX,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAA,MAAW,WAAQC;IAC3B,OAAOrB,EAAAyB,CAAA;IACP,KAAK;IACN,MAAK;IACL,cAAW;IACX,aAAU;IACT,OAAOd,EAAA"}
1
+ {"version":3,"file":"AJobBaseCreateForm.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_createVNode","ARow","_withCtx","AFormDatetimePicker","_unref","_component_VSlider","ARow_default","AFormDatetimePicker_default","AJobBaseCreateForm_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","modelValue","useModel","__props","useJobPriority","sliderColor","computed","getPriorityColor","useI18n","openBlock","createElementBlock","Fragment","createVNode","withCtx","_cache","$event","unref","t","VSlider","priorityLabels"],"sources":["../../../../src/domains/job/components/AJobBaseCreateForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { JobBase } from '@/domains/job/types/Job'\nimport { useJobPriority } from '@/domains/job/composables/jobPriority'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AFormDatetimePicker from '@/domains/form/components/AFormDatetimePicker.vue'\nimport { useI18n } from 'vue-i18n'\n\nconst modelValue = defineModel<JobBase>({ required: true })\nconst { priorityLabels, getPriorityColor } = useJobPriority()\nconst sliderColor = computed(() => {\n return getPriorityColor(modelValue.value.priority)\n})\nconst { t } = useI18n()\n</script>\n\n<template>\n <ARow>\n <AFormDatetimePicker\n v-model=\"modelValue.scheduledAt\"\n :label=\"t('common.job.model.scheduledAt')\"\n />\n </ARow>\n <ARow>\n <VSlider\n v-model=\"modelValue.priority\"\n :ticks=\"priorityLabels\"\n :max=\"2\"\n step=\"1\"\n show-ticks=\"always\"\n tick-size=\"3\"\n :color=\"sliderColor\"\n />\n </ARow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAQA,IAAMY,IAAaZ,EAAoBc,GAAA,YAAmB,GACpD,EAAE,mBAAgB,wBAAqBC,EAAe,GACtDC,IAAcC,QACXC,EAAiBN,EAAW,MAAM,QAAQ,CAClD,GACK,EAAE,SAAMO,EAAQ;E,mCAIpBlB,EAKOC,GAAA,MAAA;GAJL,SAAAC,QAGE,CAHFF,EAGEG,GAAA;IAFS,YAAAQ,EAAA,MAAW;IAAX,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAA,MAAW,cAAWC;IAC9B,OAAOrB,EAAAuB,CAAA,CAAC,CAAA,8BAAA;;;E,IAGb3B,EAUOC,GAAA,MAAA;GATL,SAAAC,QAQE,CARFF,EAQEK,GAAA;IAPS,YAAAM,EAAA,MAAW;IAAX,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAA,MAAW,WAAQC;IAC3B,OAAOrB,EAAAyB,CAAA;IACP,KAAK;IACN,MAAK;IACL,cAAW;IACX,aAAU;IACT,OAAOd,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"AJobDetailCommon.js","names":["_sfc_main","AJobDetailCommon_vue_vue_type_script_setup_true_lang_default","AJobDetailCommon_default"],"sources":["../../../../src/domains/job/components/AJobDetailCommon.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { JobBase } from '@/domains/job/types/Job'\nimport { useI18n } from 'vue-i18n'\nimport ARow from '@/domains/ui/components/ARow.vue'\nimport AJobStatusChip from '@/domains/job/components/AJobStatusChip.vue'\nimport AJobPriorityChip from '@/domains/job/components/AJobPriorityChip.vue'\nimport ADatetime from '@/domains/ui/datetime/components/ADatetime.vue'\n\nwithDefaults(\n defineProps<{\n job: JobBase\n loading?: boolean\n }>(),\n {\n loading: false,\n }\n)\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <div>\n <ARow\n :title=\"t('common.job.model.id')\"\n :value=\"job.id\"\n />\n <ARow :title=\"t('common.job.model._resourceName')\">\n <slot name=\"resource-name\">\n {{ job._resourceName }}\n </slot>\n </ARow>\n <ARow :title=\"t('common.job.model.status')\">\n <AJobStatusChip :value=\"job.status\" />\n </ARow>\n <ARow :title=\"t('common.job.model.priority')\">\n <AJobPriorityChip :priority=\"job.priority\" />\n </ARow>\n <ARow :title=\"t('common.job.model.scheduledAt')\">\n <ADatetime :date-time=\"job.scheduledAt\" />\n </ARow>\n <ARow :title=\"t('common.job.model.startedAt')\">\n <ADatetime :date-time=\"job.startedAt\" />\n </ARow>\n <ARow :title=\"t('common.job.model.finishedAt')\">\n <ADatetime :date-time=\"job.finishedAt\" />\n </ARow>\n <ARow\n :title=\"t('common.job.model.result')\"\n :value=\"job.result\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AJobDetailCommon.js","names":["AJobDetailCommon_vue_vue_type_script_setup_true_lang_default","AJobDetailCommon_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AJobPriorityChip.js","names":["_sfc_main","AJobPriorityChip_vue_vue_type_script_setup_true_lang_default","AJobPriorityChip_default"],"sources":["../../../../src/domains/job/components/AJobPriorityChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useJobPriority } from '@/domains/job/composables/jobPriority'\nimport AChipNoLink from '@/domains/ui/components/AChipNoLink.vue'\n\nconst props = defineProps<{\n priority: number\n}>()\nconst { getPriorityLabel, getPriorityColor } = useJobPriority()\nconst priorityColor = computed(() => {\n return getPriorityColor(props.priority)\n})\nconst priorityLabel = computed(() => {\n return getPriorityLabel(props.priority)\n})\n</script>\n\n<template>\n <AChipNoLink :color=\"priorityColor\">\n {{ priorityLabel }}\n </AChipNoLink>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AJobPriorityChip.js","names":["AJobPriorityChip_vue_vue_type_script_setup_true_lang_default","AJobPriorityChip_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AJobStatusChip.js","names":["_sfc_main","AJobStatusChip_vue_vue_type_script_setup_true_lang_default","AJobStatusChip_default"],"sources":["../../../../src/domains/job/components/AJobStatusChip.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { type JobStatusType, useJobStatus } from '@/domains/job/valueObject/JobStatus'\n\nconst props = defineProps<{\n value: JobStatusType\n}>()\n\nconst { getJobStatusOption } = useJobStatus()\nconst option = computed(() => getJobStatusOption(props.value))\n</script>\n\n<template>\n <VChip\n :color=\"option?.color\"\n close-label=\"common.button.remove\"\n label\n size=\"small\"\n >\n {{ option?.title }}\n </VChip>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AJobStatusChip.js","names":["AJobStatusChip_vue_vue_type_script_setup_true_lang_default","AJobStatusChip_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AListEditor.js","names":["_sfc_main","AListEditor_vue_vue_type_script_setup_true_lang_default","AListEditor_default"],"sources":["../../../../src/domains/listEditor/components/AListEditor.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, ref, useSlots, useTemplateRef, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport { useKeyboardNav } from '@/domains/listEditor/composables/useKeyboardNav'\nimport {\n useListEditorController,\n type GetKey,\n type ListEditorHandle,\n type ListEditorValidationResult,\n type PositionAction,\n type PositionOption,\n type PositionStrategy,\n} from '@/domains/listEditor/composables/useListEditorController'\nimport {\n provideListEditorStateScope,\n useListEditorStateEntry,\n type ListEditorStateBindings,\n} from '@/domains/listEditor/composables/useListEditorStateScope'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/domains/listEditor/utils/resolveCompactText'\nimport { useUnsavedSection } from '@/domains/unsavedGuard/composables/useUnsavedSection'\nimport { useDeleteDialog } from '@/domains/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/domains/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/domains/listEditor/utils/revealInvalidRows'\nimport { useListEditorScopeValidity } from '@/domains/listEditor/composables/useListEditorScopeValidity'\nimport LeDeleteDialog from '@/domains/listEditor/components/internal/LeDeleteDialog.vue'\nimport LeEmptyState from '@/domains/listEditor/components/internal/LeEmptyState.vue'\nimport LeUnsavedLabel from '@/domains/listEditor/components/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationScope,\n ListEditorValidationState,\n ListViewItem,\n} from '@/domains/listEditor/types/listEditorTypes'\n\nexport interface DecoratedViewItem<T> extends ListViewItem<T> {\n editing: boolean\n expanded: boolean\n loading: boolean\n dirty: boolean\n unsaved: boolean\n validationState: ListEditorValidationState\n}\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedViewItem<TItem>\n raw: TItem\n index: number\n key: ListEditorKey\n readonly: boolean\n disabled: boolean\n expanded: boolean\n editing: boolean\n dirty: boolean\n /** Aliases `dirty` here (no reorder mode → no `moved` to OR). Same field name as on sortable/nested variants. */\n unsaved: boolean\n touch: boolean\n /**\n * Row-scoped `state-key` prefix. Thread it down to any list editor rendered in this slot and set\n * its `:state-key=\"`${stateKeyPrefix}:someList`\"` — that editor's controller then lives in THIS\n * editor's scope and survives the row collapsing (which unmounts the whole slot subtree). Entries\n * under this prefix are disposed when the row is removed.\n */\n stateKeyPrefix: string\n actions: RowActions<TItem>\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\nexport interface HeaderSlotProps {\n title: string | null\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n /**\n * New-row factory. Add / \"add after\" insert `factory()` through the controller\n * (positions renumbered) — no consumer `@add` push handler is needed.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`; never the position field. Typed `string`\n * not `keyof TItem` because the latter compiles to a Boolean-only runtime prop\n * type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. `string` must be\n * listed before `false` (and not be `keyof TItem`): otherwise Vue's runtime\n * type goes Boolean-first and coerces `position=\"position\"` to `true`.\n */\n position?:\n | string\n | false\n | {\n field: string\n multiplier?: number\n strategy?: PositionStrategy\n strategyOverrides?: Partial<Record<PositionAction, PositionStrategy>>\n }\n /**\n * Extra fields to drop from the dirty content-hash (position is always dropped).\n * Use when a SEPARATE nested editor already tracks a child collection, so editing\n * a child doesn't flip the parent row amber. Still saved; only the diff ignores it.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Vuelidate `$scope` (the same one the consumer's row forms / save-gate collector use). When set,\n * the editor registers its aggregate validity under it, so a plain `v$.$invalid` save gate blocks\n * AND reveals a collapsed invalid row — no `validateAll()` call needed in the save flow. Omit to\n * keep legacy behavior (gate the save on the exposed `validateAll()` yourself); `false` opts out.\n */\n validationScope?: ListEditorValidationScope | false\n /**\n * Opt-in lifted controller from `useListEditorController()` — pass it so editor\n * state survives this component's unmount/remount. Omitted: the editor owns one\n * internally. Either way the `ListEditorHandle` is reachable via `useTemplateRef`.\n */\n editor?: ListEditorHandle<TItem>\n /**\n * Persist this editor's controller in the nearest ANCESTOR editor's row-state scope under this\n * key, instead of owning it. Use it for an editor rendered in another editor's `#item` slot: that\n * slot is behind a `v-if`, so collapsing the row unmounts this editor and a component-owned\n * controller would re-baseline the already-edited data on re-expand (losing amber, tombstones and\n * the red rail). Derive the key from the row slot's `stateKeyPrefix`, e.g.\n * `:state-key=\"`${stateKeyPrefix}:adverts`\"`. Options stay declared here, on this tag: the\n * controller is built from THIS editor's `factory`/`get-key`/`position`/`dirty-exclude`/`validate`\n * and rebound to each new instance's model on remount. Ignored when `:editor` is passed, and a\n * no-op without an ancestor scope.\n */\n stateKey?: string\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n /** Heading above the list. A ready translated string, like every text prop here. */\n title?: string | null\n\n /**\n * Field shown in a collapsed row when no `#item-compact` slot is given. A dotted path reads\n * through nested objects (`texts.title`); a path that runs into nothing renders empty.\n */\n compactField?: string | null\n statusField?: string | null\n twoRows?: 'never' | 'mobile' | 'always'\n chips?: boolean\n\n showAddButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n\n /** Label of the add button. A ready translated string; omit it for the library's own wording. */\n addLabel?: string | null\n /** Heading of the empty state. A ready translated string. */\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /** Disable unsaved-state tracking — no dirty markers, never reads as unsaved. */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n /**\n * How a row delete persists. `deferred` (default): the row disappears but the deletion counts as an\n * unconfirmed change (`unsavedCount`) until save, and is revertible until then. `immediate`: the\n * consumer deletes on the backend (`:on-delete`) — the dialog states it is irreversible and the\n * delete does NOT read as unsaved.\n */\n deleteMode?: 'immediate' | 'deferred'\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n /**\n * Render every `#item` slot expanded — no edit pencil, inline footer, or row-click\n * toggle. Use when all forms should be visible at once (e.g. ThirdPartyTracker).\n */\n defaultExpanded?: boolean\n\n loadingKeys?: Set<ListEditorKey> | null\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n\n /**\n * Registers this editor as a named unsaved-changes section under this (already\n * translated) label — replaces a per-consumer `useUnsavedSection` call.\n */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n factory: undefined,\n getKey: undefined,\n position: undefined,\n dirtyExclude: undefined,\n validate: undefined,\n validationScope: undefined,\n editor: undefined,\n stateKey: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n twoRows: 'never',\n chips: false,\n showAddButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n deleteMode: 'deferred',\n closeVariant: 'auto',\n defaultExpanded: false,\n loadingKeys: null,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n unsavedSectionLabel: undefined,\n})\n\nconst emit = defineEmits<{\n edit: [item: ListViewItem<TItem>]\n deleted: [item: ListViewItem<TItem>]\n close: [item: ListViewItem<TItem>]\n 'item-saved': [item: ListViewItem<TItem>]\n 'item-expand': [item: ListViewItem<TItem>, expanded: boolean]\n}>()\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst modelValue = defineModel<TItem[]>({ required: true })\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst display = useDisplay()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\n\nconst isTouch = computed<boolean>(() => display.platform.value.touch)\n\n// State controller (v2). `factory`/`getKey`/`position`/`validate` are construction-time options read\n// once to seed it (undefined → controller defaults 'id'/'position'/always-valid), not reactive props\n// — so the reactivity-loss rule is intentionally suppressed here.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst controllerOptions: ListEditorStateBindings<TItem> = {\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n}\n// Precedence: an explicitly lifted `:editor` wins; then a `state-key`'d entry persisted in the\n// nearest ancestor editor's row-state scope (built from the options above, rebound to this instance\n// on every remount); else this component owns the controller — today's behaviour, unchanged.\nconst stateEntry = props.editor ? null : useListEditorStateEntry<TItem>(props.stateKey, controllerOptions)\nconst controller = props.editor ?? stateEntry?.handle ?? useListEditorController<TItem>(controllerOptions)\n\n// Mirror the controller's key resolution so rendered rows key the way it tracks them.\nconst getKeyOpt = props.getKey ?? 'id'\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\n// Row-state scope for THIS editor's `#item` slot subtree: a nested editor with a `state-key` builds\n// its controller in here, so it outlives the row collapsing (which unmounts the slot). When this\n// editor is itself persisted, the scope comes from its own entry — so the chain holds at any depth.\nconst rowStateScope = provideListEditorStateScope(stateEntry?.childScope ?? null)\nconst keyOf = (item: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function' ? getKeyOpt(item) : (item[getKeyOpt as keyof TItem] as ListEditorKey)\n\nconst keyFieldName = computed<string>(() => (typeof getKeyOpt === 'function' ? '(fn)' : (getKeyOpt as string)))\n\n// Managed position field name, mirroring the controller's resolution.\nconst positionFieldName = computed<string>(() => {\n const p = props.position\n if (p === undefined) return 'position'\n if (p === false) return 'position'\n if (typeof p === 'object') return p.field as string\n return p as string\n})\n\n// Render projection only — the controller owns the data (key + index + raw + position).\nconst viewItems = computed<ListViewItem<TItem>[]>(() =>\n modelValue.value.map((raw, index) => ({\n key: keyOf(raw),\n index,\n raw,\n position: raw[positionFieldName.value] as number | undefined,\n }))\n)\n\n// Surfaces row-key wiring bugs loudly: undefined or duplicate keys silently break\n// dirty tracking, validity rails and reorder targeting and are hard to trace from\n// symptoms. Deduped per signature so a stable bad state warns once, a new one again.\nconst warnedKeySignatures = new Set<string>()\nconst warnOnBadKeys = (items: ListViewItem<TItem>[]): void => {\n const seen = new Set<ListEditorKey>()\n const duplicates = new Set<string>()\n let missing = 0\n for (const vi of items) {\n if (vi.key === undefined || vi.key === null) {\n missing++\n continue\n }\n if (seen.has(vi.key)) duplicates.add(String(vi.key))\n seen.add(vi.key)\n }\n if (missing === 0 && duplicates.size === 0) return\n const signature = `${missing}|${[...duplicates].sort().join(',')}`\n if (warnedKeySignatures.has(signature)) return\n warnedKeySignatures.add(signature)\n if (missing > 0) {\n console.warn(\n `[list-editor] ${missing} row(s) resolve to an undefined key (key-field \"${keyFieldName.value}\"). ` +\n 'Point get-key at a field every item has, or give new items unique temp ids ' +\n '(see nextListEditorTempId).'\n )\n }\n if (duplicates.size > 0) {\n console.warn(\n `[list-editor] duplicate row keys (key-field \"${keyFieldName.value}\"): ${[...duplicates].join(', ')}. ` +\n 'Row keys must be unique — dirty tracking and validation rails target rows by key.'\n )\n }\n}\nwatch(viewItems, (items) => warnOnBadKeys(items), { immediate: true })\n\n// Drop the persisted controllers of rows that no longer exist. `post` so the removed row's subtree\n// has already unmounted (its editors released their entries) before we stop their effect scopes.\nwatch(\n () => viewItems.value.map((vi) => String(vi.key)).join('|'),\n () => rowStateScope.retainOwners(viewItems.value.map((vi) => vi.key)),\n { flush: 'post' }\n)\n\nconst expandedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst isInlineEdit = computed(() => !props.chips && !!slots.item)\nconst hasReadonlyDetail = computed(() => !props.chips && !!slots['item-readonly'])\n\nconst { editingKeys, editingSnapshots, beginEdit, cancelEdit, commitEdit, closeEdit, requestAutoOpen } =\n useInlineEditing<TItem, ListViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row',\n isInlineEdit,\n restoreSnapshot: (key, data) => controller.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => keyOf(it)),\n findEntry: (key) => {\n const hit = modelValue.value.find((it) => keyOf(it) === key)\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n })\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(() => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'))\nconst deleteConfirmTextResolved = computed(\n () =>\n props.deleteConfirmText ??\n (props.deleteMode === 'immediate'\n ? t('common.sortable.deleteConfirmText')\n : t('common.sortable.deleteConfirmTextDeferred'))\n)\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canAdd = computed(() => canInteract.value && props.showAddButton)\n\n// Total unconfirmed-change count (added/edited/moved rows + deferred deletions). A delete lights this\n// up even though its row is gone. Shown as a header badge + exposed on the handle.\nconst unsavedCount = controller.unsavedCount\nconst unsavedCountVisible = computed(() => !props.readonly && !props.disableUnsaved && unsavedCount.value > 0)\nconst headerVisible = computed(() => !!(props.title || slots.header) || unsavedCountVisible.value)\n\n// Per-row Save/Cancel footer only makes sense with a per-item persist callback;\n// without one the parent form's global save flushes everything, so hide it.\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\n// Per-key decorator cache: reuse the cached object when base item AND every flag\n// match, giving slot consumers a stable reference for unchanged rows. `disableUnsaved`\n// suppresses only the amber marker — the validation rail still shows, since hiding\n// dirty-state shouldn't hide a real error.\nconst decoratorCache = new Map<ListEditorKey, DecoratedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedViewItem<TItem>[]>(() => {\n const next: DecoratedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of viewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = expandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n // Readonly can't have user-unsaved changes; never paint amber there (also avoids\n // a mount-before-load baseline marking every loaded row added). (QA 85050 sweep)\n const unsaved = props.disableUnsaved || props.readonly ? false : controller.isUnsaved(vi.key)\n const dirty = unsaved\n // `editing` → the controller reads amber (not red) while the row is being filled in. (QA 85050 b7)\n const validationState = controller.rowState(vi.raw, vi.key, editing)\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.unsaved === unsaved &&\n cached.validationState === validationState\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n loading,\n dirty,\n unsaved,\n validationState,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => viewItemsDecorated.value.length === 0)\n\nconst findVi = (key: ListEditorKey): DecoratedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() => viewItemsDecorated.value.map((vi) => ({ key: vi.key }))),\n variant: 'flat',\n isReorderMode: ref(false),\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n})\n\nconst resolveCompactText = (raw: TItem): string => resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Managed add: the controller inserts `factory()` and renumbers; the inline-editing\n// watch picks up the new key off the model change and auto-opens it.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n controller.addItem(undefined, undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n controller.addItem(undefined, { afterId: vi.key })\n}\n\nconst onEditClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n // Toggle: edit while already editing closes the form, matching row-header click.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n expandedKeys.value.delete(vi.key)\n }\n emit('edit', vi)\n}\n\nconst onExpandClick = (vi: ListViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currentlyExpanded = expandedKeys.value.has(key)\n if (currentlyExpanded) {\n expandedKeys.value.delete(key)\n } else {\n for (const k of expandedKeys.value) expandedKeys.value.delete(k)\n expandedKeys.value.add(key)\n }\n emit('item-expand', vi, !currentlyExpanded)\n}\n\nconst isRowClickable = (vi: DecoratedViewItem<TItem>): boolean => {\n if (props.chips) return false\n if (props.disableRowClick) return false\n if (props.defaultExpanded) return false\n if (props.disabled || props.loading) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) {\n onExpandClick(vi)\n } else {\n onEditClick(vi)\n }\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, ListViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(vi.key)\n // Controller owns removal: a temp row vanishes; a saved row is recorded in `getChanges().deleted`\n // and counts as an unconfirmed change (deferred) — unless immediate mode (already deleted on the\n // backend), which skips the tombstone.\n controller.deleteItem(vi.key, { trackDeleted: props.deleteMode === 'deferred' })\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm || props.chips,\n})\n\nconst onDeleteClick = async (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\n// Blocks a second click while the consumer's save is pending, so no duplicate is sent.\n// A rejected save keeps the row open and still reaches the app's error handler.\nconst savingKeys = ref<Set<ListEditorKey>>(new Set())\nconst onSaveClick = async (vi: ListViewItem<TItem>) => {\n if (savingKeys.value.has(vi.key)) return\n savingKeys.value.add(vi.key)\n try {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n } finally {\n savingKeys.value.delete(vi.key)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: ListViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: ListViewItem<TItem>) => {\n closeEdit(vi)\n expandedKeys.value.delete(vi.key)\n emit('close', vi)\n}\n\n// Per-key actions cache: each row's `actions` bundle is allocated once so slot\n// consumers get a stable identity (no prop-ref churn → no spurious re-renders).\n// Closures capture the stable key and look up the live decorator via `findVi(key)`.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n return vi ? onSaveClick(vi) : undefined\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onExpandClick(vi)\n },\n update: (next) => controller.updateItem(key, next),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\n// Garbage-collect cache entries for keys that have left the model.\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n }\n)\n\nconst buildSlotProps = (vi: DecoratedViewItem<TItem>) => ({\n item: vi,\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n editing: vi.editing || props.defaultExpanded,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n touch: isTouch.value,\n stateKeyPrefix: rowStateScope.prefixFor(vi.key),\n actions: getActions(vi.key),\n})\n\n// Named unsaved-changes section, registered only when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel && !props.disableUnsaved\n ? { label: props.unsavedSectionLabel, dirty: controller.hasUnsaved.value }\n : []\n)\n\n// Opens invalid rows so a blocked save surfaces WHICH rows are wrong instead of a collapsed red\n// rail. The body is gated on `editing` not `expanded`, so drive `beginEdit` not `expandedKeys`\n// (QA 85050 B4-17). Shared by the exposed `validateAll` and the scope-collector reveal-on-touch.\nconst runValidateAndReveal = (): boolean =>\n validateAllAndReveal(controller, (key) => {\n const vi = viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n })\n\n// Auto-bridge the editor's aggregate validity into the consumer's `validation-scope` collector so a\n// plain `$invalid` save gate blocks (and reveals) a collapsed invalid row. No-op without the prop.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss -- construction-time opt-in, read once\nuseListEditorScopeValidity({\n hasErrors: controller.hasErrors,\n validationScope: props.validationScope,\n validateProvided: props.validate !== undefined,\n reveal: runValidateAndReveal,\n})\n\n// Expose the controller handle via `useTemplateRef<ListEditorHandle<TItem>>`.\ndefineExpose<ListEditorHandle<TItem>>({\n ...controller,\n validateAll: runValidateAndReveal,\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-list-editor\"\n :class=\"[\n `a-list-editor--two-rows-${twoRows}`,\n {\n 'a-list-editor--readonly': readonly,\n 'a-list-editor--disabled': disabled,\n 'a-list-editor--touch': isTouch,\n 'a-list-editor--chips': chips,\n },\n ]\"\n >\n <div\n ref=\"rowsContainer\"\n class=\"a-le-card\"\n >\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n </slot>\n <span\n v-if=\"unsavedCountVisible\"\n class=\"a-le-unsaved-count\"\n :data-unsaved-count=\"unsavedCount\"\n >\n {{ t('common.sortable.pendingChanges', { count: unsavedCount }) }}\n </span>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <template v-else>\n <div\n v-for=\"vi in viewItemsDecorated\"\n :key=\"String(vi.key)\"\n class=\"a-le-row-wrapper\"\n >\n <!-- Interstitial slots render as SIBLINGS of `.a-le-row` (inside this\n wrapper), so consumer content placed between rows never inherits the\n row's unsaved/editing/validation tint. (QA 85050 BUG-04/05) -->\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n\n <div\n :data-id=\"String(vi.key)\"\n role=\"listitem\"\n :tabindex=\"keyboardNav.rowTabindex(vi.key)\"\n class=\"a-le-row\"\n :class=\"{\n 'a-le-row--two-rows': twoRows === 'always',\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.unsaved,\n 'a-le-row--clickable': isRowClickable(vi),\n [`a-le-row--validation-${vi.validationState}`]: vi.validationState !== null,\n }\"\n @keydown=\"keyboardNav.handleKeydown(vi.key, $event)\"\n >\n <div\n class=\"a-le-row-header\"\n @click=\"onRowClick(vi)\"\n >\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span class=\"a-le-title\">\n {{ resolveCompactText(vi.raw) }}\n </span>\n </slot>\n <LeUnsavedLabel\n v-if=\"vi.unsaved\"\n :dot-only=\"chips\"\n />\n </div>\n\n <div\n v-if=\"!chips\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span\n v-if=\"statusField && vi.raw[statusField] != null && vi.raw[statusField] !== ''\"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <VBtn\n v-if=\"chips && showDeleteButton && canInteract\"\n icon\n size=\"x-small\"\n variant=\"text\"\n density=\"compact\"\n :active=\"false\"\n class=\"a-le-action a-le-action--chip-close\"\n :aria-label=\"t('common.sortable.delete')\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-close\"\n size=\"14\"\n />\n </VBtn>\n <template v-else>\n <VBtn\n v-if=\"showEditButton && canInteract && !defaultExpanded\"\n :aria-label=\"t('common.sortable.edit')\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton && canInteract\"\n :aria-label=\"t('common.sortable.delete')\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showAddAfterAction && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n :aria-label=\"t('common.sortable.more')\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem @click=\"onRowAddAfterClick(vi)\">\n <template #prepend>\n <VIcon icon=\"mdi-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <template v-if=\"(vi.editing || defaultExpanded) && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <div\n v-if=\"showInlineSaveFooter && !defaultExpanded\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"$slots['item-readonly'] && (readonly || vi.expanded)\"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </template>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../styles/tokens';\n@use '../styles/shared';\n\n// Variant-specific rules, scoped under the AListEditor root.\n.a-list-editor {\n // Chips: 12px left padding (flat) vs 8px in sortable, which reserves drag-handle room.\n &--chips .a-le-row-header {\n padding: 2px 4px 2px 12px;\n gap: 4px;\n min-height: 28px;\n }\n}\n\n// Narrow/mobile layout: taller rows, always-visible actions, status badge dropped for room.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-list-editor {\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"AListEditor.js","names":["AListEditor_vue_vue_type_script_setup_true_lang_default","AListEditor_default"],"sources":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AListEditor.vue_vue_type_script_setup_true_lang.js","names":["$slots","_useModel","resolveCompactText","resolveCompactTextUtil","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_toDisplayString","_createCommentVNode","_unref","_createVNode","_component_VProgressCircular","_component_VAlert","_withCtx","_createTextVNode","LeEmptyState","_Fragment","_renderList","_mergeProps","_createBlock","LeUnsavedLabel","_component_VBtn","_withModifiers","_component_VIcon","_component_VTooltip","_component_VMenu","_component_VList","_component_VListItem","_component_VListItemTitle","LeDeleteDialog","_isRef","LeDeleteDialog_default","LeEmptyState_default","LeUnsavedLabel_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","AListEditor_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","__expose","__emit","props","__props","emit","modelValue","useModel","useI18n","slots","useSlots","display","useDisplay","rootEl","useTemplateRef","isTouch","computed","controllerOptions","v","stateEntry","useListEditorStateEntry","controller","useListEditorController","getKeyOpt","rowStateScope","provideListEditorStateScope","keyOf","item","keyFieldName","positionFieldName","p","viewItems","raw","warnedKeySignatures","warnOnBadKeys","seen","duplicates","missing","vi","items","signature","watch","expandedKeys","ref","rowsContainer","isInlineEdit","hasReadonlyDetail","useInlineEditing","key","data","it","hit","addLabelResolved","t","emptyTitleResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","canInteract","canAdd","unsavedCount","unsavedCountVisible","headerVisible","showInlineSaveFooter","decoratorCache","viewItemsDecorated","next","liveKeys","editing","editingKeys","expanded","loading","unsaved","dirty","validationState","cached","decorated","isEmpty","findVi","keyboardNav","useKeyboardNav","onEditClick","onCloseClick","resolveCompactText$1","resolveCompactText","onAddClick","requestAutoOpen","onRowAddAfterClick","beginEdit","onExpandClick","currentlyExpanded","k","isRowClickable","onRowClick","triggerDeleteClick","useDeleteDialog","editingSnapshots","onDeleteClick","savingKeys","onSaveClick","commitEdit","onCancelClick","closeEdit","actionsCache","getActions","actions","now","buildSlotProps","runValidateAndReveal","validateAllAndReveal","useListEditorScopeValidity","openBlock","createElementBlock","normalizeClass","createElementVNode","renderSlot","_ctx","toDisplayString","createCommentVNode","unref","createVNode","VProgressCircular","VAlert","withCtx","createTextVNode","Fragment","renderList","mergeProps","$event","createBlock","VBtn","withModifiers","VIcon","VTooltip","VMenu","VList","VListItem","VListItemTitle","_cache","deleteDialog","isRef","deleteError","deleteInFlight","onDeleteDialogConfirm","onDeleteDialogCancel"],"sources":["../../../../src/domains/listEditor/components/AListEditor.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, ref, useSlots, useTemplateRef, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport { useKeyboardNav } from '@/domains/listEditor/composables/useKeyboardNav'\nimport {\n useListEditorController,\n type GetKey,\n type ListEditorHandle,\n type ListEditorValidationResult,\n type PositionAction,\n type PositionOption,\n type PositionStrategy,\n} from '@/domains/listEditor/composables/useListEditorController'\nimport {\n provideListEditorStateScope,\n useListEditorStateEntry,\n type ListEditorStateBindings,\n} from '@/domains/listEditor/composables/useListEditorStateScope'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/domains/listEditor/utils/resolveCompactText'\nimport { useUnsavedSection } from '@/domains/unsavedGuard/composables/useUnsavedSection'\nimport { useDeleteDialog } from '@/domains/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/domains/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/domains/listEditor/utils/revealInvalidRows'\nimport { useListEditorScopeValidity } from '@/domains/listEditor/composables/useListEditorScopeValidity'\nimport LeDeleteDialog from '@/domains/listEditor/components/internal/LeDeleteDialog.vue'\nimport LeEmptyState from '@/domains/listEditor/components/internal/LeEmptyState.vue'\nimport LeUnsavedLabel from '@/domains/listEditor/components/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationScope,\n ListEditorValidationState,\n ListViewItem,\n} from '@/domains/listEditor/types/listEditorTypes'\n\nexport interface DecoratedViewItem<T> extends ListViewItem<T> {\n editing: boolean\n expanded: boolean\n loading: boolean\n dirty: boolean\n unsaved: boolean\n validationState: ListEditorValidationState\n}\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedViewItem<TItem>\n raw: TItem\n index: number\n key: ListEditorKey\n readonly: boolean\n disabled: boolean\n expanded: boolean\n editing: boolean\n dirty: boolean\n /** Aliases `dirty` here (no reorder mode → no `moved` to OR). Same field name as on sortable/nested variants. */\n unsaved: boolean\n touch: boolean\n /**\n * Row-scoped `state-key` prefix. Thread it down to any list editor rendered in this slot and set\n * its `:state-key=\"`${stateKeyPrefix}:someList`\"` — that editor's controller then lives in THIS\n * editor's scope and survives the row collapsing (which unmounts the whole slot subtree). Entries\n * under this prefix are disposed when the row is removed.\n */\n stateKeyPrefix: string\n actions: RowActions<TItem>\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\nexport interface HeaderSlotProps {\n title: string | null\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n /**\n * New-row factory. Add / \"add after\" insert `factory()` through the controller\n * (positions renumbered) — no consumer `@add` push handler is needed.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`; never the position field. Typed `string`\n * not `keyof TItem` because the latter compiles to a Boolean-only runtime prop\n * type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. `string` must be\n * listed before `false` (and not be `keyof TItem`): otherwise Vue's runtime\n * type goes Boolean-first and coerces `position=\"position\"` to `true`.\n */\n position?:\n | string\n | false\n | {\n field: string\n multiplier?: number\n strategy?: PositionStrategy\n strategyOverrides?: Partial<Record<PositionAction, PositionStrategy>>\n }\n /**\n * Extra fields to drop from the dirty content-hash (position is always dropped).\n * Use when a SEPARATE nested editor already tracks a child collection, so editing\n * a child doesn't flip the parent row amber. Still saved; only the diff ignores it.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Vuelidate `$scope` (the same one the consumer's row forms / save-gate collector use). When set,\n * the editor registers its aggregate validity under it, so a plain `v$.$invalid` save gate blocks\n * AND reveals a collapsed invalid row — no `validateAll()` call needed in the save flow. Omit to\n * keep legacy behavior (gate the save on the exposed `validateAll()` yourself); `false` opts out.\n */\n validationScope?: ListEditorValidationScope | false\n /**\n * Opt-in lifted controller from `useListEditorController()` — pass it so editor\n * state survives this component's unmount/remount. Omitted: the editor owns one\n * internally. Either way the `ListEditorHandle` is reachable via `useTemplateRef`.\n */\n editor?: ListEditorHandle<TItem>\n /**\n * Persist this editor's controller in the nearest ANCESTOR editor's row-state scope under this\n * key, instead of owning it. Use it for an editor rendered in another editor's `#item` slot: that\n * slot is behind a `v-if`, so collapsing the row unmounts this editor and a component-owned\n * controller would re-baseline the already-edited data on re-expand (losing amber, tombstones and\n * the red rail). Derive the key from the row slot's `stateKeyPrefix`, e.g.\n * `:state-key=\"`${stateKeyPrefix}:adverts`\"`. Options stay declared here, on this tag: the\n * controller is built from THIS editor's `factory`/`get-key`/`position`/`dirty-exclude`/`validate`\n * and rebound to each new instance's model on remount. Ignored when `:editor` is passed, and a\n * no-op without an ancestor scope.\n */\n stateKey?: string\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n /** Heading above the list. A ready translated string, like every text prop here. */\n title?: string | null\n\n /**\n * Field shown in a collapsed row when no `#item-compact` slot is given. A dotted path reads\n * through nested objects (`texts.title`); a path that runs into nothing renders empty.\n */\n compactField?: string | null\n statusField?: string | null\n twoRows?: 'never' | 'mobile' | 'always'\n chips?: boolean\n\n showAddButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n\n /** Label of the add button. A ready translated string; omit it for the library's own wording. */\n addLabel?: string | null\n /** Heading of the empty state. A ready translated string. */\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /** Disable unsaved-state tracking — no dirty markers, never reads as unsaved. */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n /**\n * How a row delete persists. `deferred` (default): the row disappears but the deletion counts as an\n * unconfirmed change (`unsavedCount`) until save, and is revertible until then. `immediate`: the\n * consumer deletes on the backend (`:on-delete`) — the dialog states it is irreversible and the\n * delete does NOT read as unsaved.\n */\n deleteMode?: 'immediate' | 'deferred'\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n /**\n * Render every `#item` slot expanded — no edit pencil, inline footer, or row-click\n * toggle. Use when all forms should be visible at once (e.g. ThirdPartyTracker).\n */\n defaultExpanded?: boolean\n\n loadingKeys?: Set<ListEditorKey> | null\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n\n /**\n * Registers this editor as a named unsaved-changes section under this (already\n * translated) label — replaces a per-consumer `useUnsavedSection` call.\n */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n factory: undefined,\n getKey: undefined,\n position: undefined,\n dirtyExclude: undefined,\n validate: undefined,\n validationScope: undefined,\n editor: undefined,\n stateKey: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n twoRows: 'never',\n chips: false,\n showAddButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n deleteMode: 'deferred',\n closeVariant: 'auto',\n defaultExpanded: false,\n loadingKeys: null,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n unsavedSectionLabel: undefined,\n})\n\nconst emit = defineEmits<{\n edit: [item: ListViewItem<TItem>]\n deleted: [item: ListViewItem<TItem>]\n close: [item: ListViewItem<TItem>]\n 'item-saved': [item: ListViewItem<TItem>]\n 'item-expand': [item: ListViewItem<TItem>, expanded: boolean]\n}>()\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst modelValue = defineModel<TItem[]>({ required: true })\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst display = useDisplay()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\n\nconst isTouch = computed<boolean>(() => display.platform.value.touch)\n\n// State controller (v2). `factory`/`getKey`/`position`/`validate` are construction-time options read\n// once to seed it (undefined → controller defaults 'id'/'position'/always-valid), not reactive props\n// — so the reactivity-loss rule is intentionally suppressed here.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst controllerOptions: ListEditorStateBindings<TItem> = {\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n}\n// Precedence: an explicitly lifted `:editor` wins; then a `state-key`'d entry persisted in the\n// nearest ancestor editor's row-state scope (built from the options above, rebound to this instance\n// on every remount); else this component owns the controller — today's behaviour, unchanged.\nconst stateEntry = props.editor ? null : useListEditorStateEntry<TItem>(props.stateKey, controllerOptions)\nconst controller = props.editor ?? stateEntry?.handle ?? useListEditorController<TItem>(controllerOptions)\n\n// Mirror the controller's key resolution so rendered rows key the way it tracks them.\nconst getKeyOpt = props.getKey ?? 'id'\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\n// Row-state scope for THIS editor's `#item` slot subtree: a nested editor with a `state-key` builds\n// its controller in here, so it outlives the row collapsing (which unmounts the slot). When this\n// editor is itself persisted, the scope comes from its own entry — so the chain holds at any depth.\nconst rowStateScope = provideListEditorStateScope(stateEntry?.childScope ?? null)\nconst keyOf = (item: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function' ? getKeyOpt(item) : (item[getKeyOpt as keyof TItem] as ListEditorKey)\n\nconst keyFieldName = computed<string>(() => (typeof getKeyOpt === 'function' ? '(fn)' : (getKeyOpt as string)))\n\n// Managed position field name, mirroring the controller's resolution.\nconst positionFieldName = computed<string>(() => {\n const p = props.position\n if (p === undefined) return 'position'\n if (p === false) return 'position'\n if (typeof p === 'object') return p.field as string\n return p as string\n})\n\n// Render projection only — the controller owns the data (key + index + raw + position).\nconst viewItems = computed<ListViewItem<TItem>[]>(() =>\n modelValue.value.map((raw, index) => ({\n key: keyOf(raw),\n index,\n raw,\n position: raw[positionFieldName.value] as number | undefined,\n }))\n)\n\n// Surfaces row-key wiring bugs loudly: undefined or duplicate keys silently break\n// dirty tracking, validity rails and reorder targeting and are hard to trace from\n// symptoms. Deduped per signature so a stable bad state warns once, a new one again.\nconst warnedKeySignatures = new Set<string>()\nconst warnOnBadKeys = (items: ListViewItem<TItem>[]): void => {\n const seen = new Set<ListEditorKey>()\n const duplicates = new Set<string>()\n let missing = 0\n for (const vi of items) {\n if (vi.key === undefined || vi.key === null) {\n missing++\n continue\n }\n if (seen.has(vi.key)) duplicates.add(String(vi.key))\n seen.add(vi.key)\n }\n if (missing === 0 && duplicates.size === 0) return\n const signature = `${missing}|${[...duplicates].sort().join(',')}`\n if (warnedKeySignatures.has(signature)) return\n warnedKeySignatures.add(signature)\n if (missing > 0) {\n console.warn(\n `[list-editor] ${missing} row(s) resolve to an undefined key (key-field \"${keyFieldName.value}\"). ` +\n 'Point get-key at a field every item has, or give new items unique temp ids ' +\n '(see nextListEditorTempId).'\n )\n }\n if (duplicates.size > 0) {\n console.warn(\n `[list-editor] duplicate row keys (key-field \"${keyFieldName.value}\"): ${[...duplicates].join(', ')}. ` +\n 'Row keys must be unique — dirty tracking and validation rails target rows by key.'\n )\n }\n}\nwatch(viewItems, (items) => warnOnBadKeys(items), { immediate: true })\n\n// Drop the persisted controllers of rows that no longer exist. `post` so the removed row's subtree\n// has already unmounted (its editors released their entries) before we stop their effect scopes.\nwatch(\n () => viewItems.value.map((vi) => String(vi.key)).join('|'),\n () => rowStateScope.retainOwners(viewItems.value.map((vi) => vi.key)),\n { flush: 'post' }\n)\n\nconst expandedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst isInlineEdit = computed(() => !props.chips && !!slots.item)\nconst hasReadonlyDetail = computed(() => !props.chips && !!slots['item-readonly'])\n\nconst { editingKeys, editingSnapshots, beginEdit, cancelEdit, commitEdit, closeEdit, requestAutoOpen } =\n useInlineEditing<TItem, ListViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row',\n isInlineEdit,\n restoreSnapshot: (key, data) => controller.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => keyOf(it)),\n findEntry: (key) => {\n const hit = modelValue.value.find((it) => keyOf(it) === key)\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n })\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(() => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'))\nconst deleteConfirmTextResolved = computed(\n () =>\n props.deleteConfirmText ??\n (props.deleteMode === 'immediate'\n ? t('common.sortable.deleteConfirmText')\n : t('common.sortable.deleteConfirmTextDeferred'))\n)\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canAdd = computed(() => canInteract.value && props.showAddButton)\n\n// Total unconfirmed-change count (added/edited/moved rows + deferred deletions). A delete lights this\n// up even though its row is gone. Shown as a header badge + exposed on the handle.\nconst unsavedCount = controller.unsavedCount\nconst unsavedCountVisible = computed(() => !props.readonly && !props.disableUnsaved && unsavedCount.value > 0)\nconst headerVisible = computed(() => !!(props.title || slots.header) || unsavedCountVisible.value)\n\n// Per-row Save/Cancel footer only makes sense with a per-item persist callback;\n// without one the parent form's global save flushes everything, so hide it.\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\n// Per-key decorator cache: reuse the cached object when base item AND every flag\n// match, giving slot consumers a stable reference for unchanged rows. `disableUnsaved`\n// suppresses only the amber marker — the validation rail still shows, since hiding\n// dirty-state shouldn't hide a real error.\nconst decoratorCache = new Map<ListEditorKey, DecoratedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedViewItem<TItem>[]>(() => {\n const next: DecoratedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of viewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = expandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n // Readonly can't have user-unsaved changes; never paint amber there (also avoids\n // a mount-before-load baseline marking every loaded row added). (QA 85050 sweep)\n const unsaved = props.disableUnsaved || props.readonly ? false : controller.isUnsaved(vi.key)\n const dirty = unsaved\n // `editing` → the controller reads amber (not red) while the row is being filled in. (QA 85050 b7)\n const validationState = controller.rowState(vi.raw, vi.key, editing)\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.unsaved === unsaved &&\n cached.validationState === validationState\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n loading,\n dirty,\n unsaved,\n validationState,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => viewItemsDecorated.value.length === 0)\n\nconst findVi = (key: ListEditorKey): DecoratedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() => viewItemsDecorated.value.map((vi) => ({ key: vi.key }))),\n variant: 'flat',\n isReorderMode: ref(false),\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n})\n\nconst resolveCompactText = (raw: TItem): string => resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Managed add: the controller inserts `factory()` and renumbers; the inline-editing\n// watch picks up the new key off the model change and auto-opens it.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n controller.addItem(undefined, undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n controller.addItem(undefined, { afterId: vi.key })\n}\n\nconst onEditClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n // Toggle: edit while already editing closes the form, matching row-header click.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n expandedKeys.value.delete(vi.key)\n }\n emit('edit', vi)\n}\n\nconst onExpandClick = (vi: ListViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currentlyExpanded = expandedKeys.value.has(key)\n if (currentlyExpanded) {\n expandedKeys.value.delete(key)\n } else {\n for (const k of expandedKeys.value) expandedKeys.value.delete(k)\n expandedKeys.value.add(key)\n }\n emit('item-expand', vi, !currentlyExpanded)\n}\n\nconst isRowClickable = (vi: DecoratedViewItem<TItem>): boolean => {\n if (props.chips) return false\n if (props.disableRowClick) return false\n if (props.defaultExpanded) return false\n if (props.disabled || props.loading) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) {\n onExpandClick(vi)\n } else {\n onEditClick(vi)\n }\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, ListViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(vi.key)\n // Controller owns removal: a temp row vanishes; a saved row is recorded in `getChanges().deleted`\n // and counts as an unconfirmed change (deferred) — unless immediate mode (already deleted on the\n // backend), which skips the tombstone.\n controller.deleteItem(vi.key, { trackDeleted: props.deleteMode === 'deferred' })\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm || props.chips,\n})\n\nconst onDeleteClick = async (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\n// Blocks a second click while the consumer's save is pending, so no duplicate is sent.\n// A rejected save keeps the row open and still reaches the app's error handler.\nconst savingKeys = ref<Set<ListEditorKey>>(new Set())\nconst onSaveClick = async (vi: ListViewItem<TItem>) => {\n if (savingKeys.value.has(vi.key)) return\n savingKeys.value.add(vi.key)\n try {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n } finally {\n savingKeys.value.delete(vi.key)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: ListViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: ListViewItem<TItem>) => {\n closeEdit(vi)\n expandedKeys.value.delete(vi.key)\n emit('close', vi)\n}\n\n// Per-key actions cache: each row's `actions` bundle is allocated once so slot\n// consumers get a stable identity (no prop-ref churn → no spurious re-renders).\n// Closures capture the stable key and look up the live decorator via `findVi(key)`.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n return vi ? onSaveClick(vi) : undefined\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onExpandClick(vi)\n },\n update: (next) => controller.updateItem(key, next),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\n// Garbage-collect cache entries for keys that have left the model.\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n }\n)\n\nconst buildSlotProps = (vi: DecoratedViewItem<TItem>) => ({\n item: vi,\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n editing: vi.editing || props.defaultExpanded,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n touch: isTouch.value,\n stateKeyPrefix: rowStateScope.prefixFor(vi.key),\n actions: getActions(vi.key),\n})\n\n// Named unsaved-changes section, registered only when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel && !props.disableUnsaved\n ? { label: props.unsavedSectionLabel, dirty: controller.hasUnsaved.value }\n : []\n)\n\n// Opens invalid rows so a blocked save surfaces WHICH rows are wrong instead of a collapsed red\n// rail. The body is gated on `editing` not `expanded`, so drive `beginEdit` not `expandedKeys`\n// (QA 85050 B4-17). Shared by the exposed `validateAll` and the scope-collector reveal-on-touch.\nconst runValidateAndReveal = (): boolean =>\n validateAllAndReveal(controller, (key) => {\n const vi = viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n })\n\n// Auto-bridge the editor's aggregate validity into the consumer's `validation-scope` collector so a\n// plain `$invalid` save gate blocks (and reveals) a collapsed invalid row. No-op without the prop.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss -- construction-time opt-in, read once\nuseListEditorScopeValidity({\n hasErrors: controller.hasErrors,\n validationScope: props.validationScope,\n validateProvided: props.validate !== undefined,\n reveal: runValidateAndReveal,\n})\n\n// Expose the controller handle via `useTemplateRef<ListEditorHandle<TItem>>`.\ndefineExpose<ListEditorHandle<TItem>>({\n ...controller,\n validateAll: runValidateAndReveal,\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-list-editor\"\n :class=\"[\n `a-list-editor--two-rows-${twoRows}`,\n {\n 'a-list-editor--readonly': readonly,\n 'a-list-editor--disabled': disabled,\n 'a-list-editor--touch': isTouch,\n 'a-list-editor--chips': chips,\n },\n ]\"\n >\n <div\n ref=\"rowsContainer\"\n class=\"a-le-card\"\n >\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n </slot>\n <span\n v-if=\"unsavedCountVisible\"\n class=\"a-le-unsaved-count\"\n :data-unsaved-count=\"unsavedCount\"\n >\n {{ t('common.sortable.pendingChanges', { count: unsavedCount }) }}\n </span>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <template v-else>\n <div\n v-for=\"vi in viewItemsDecorated\"\n :key=\"String(vi.key)\"\n class=\"a-le-row-wrapper\"\n >\n <!-- Interstitial slots render as SIBLINGS of `.a-le-row` (inside this\n wrapper), so consumer content placed between rows never inherits the\n row's unsaved/editing/validation tint. (QA 85050 BUG-04/05) -->\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n\n <div\n :data-id=\"String(vi.key)\"\n role=\"listitem\"\n :tabindex=\"keyboardNav.rowTabindex(vi.key)\"\n class=\"a-le-row\"\n :class=\"{\n 'a-le-row--two-rows': twoRows === 'always',\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.unsaved,\n 'a-le-row--clickable': isRowClickable(vi),\n [`a-le-row--validation-${vi.validationState}`]: vi.validationState !== null,\n }\"\n @keydown=\"keyboardNav.handleKeydown(vi.key, $event)\"\n >\n <div\n class=\"a-le-row-header\"\n @click=\"onRowClick(vi)\"\n >\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span class=\"a-le-title\">\n {{ resolveCompactText(vi.raw) }}\n </span>\n </slot>\n <LeUnsavedLabel\n v-if=\"vi.unsaved\"\n :dot-only=\"chips\"\n />\n </div>\n\n <div\n v-if=\"!chips\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span\n v-if=\"statusField && vi.raw[statusField] != null && vi.raw[statusField] !== ''\"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <VBtn\n v-if=\"chips && showDeleteButton && canInteract\"\n icon\n size=\"x-small\"\n variant=\"text\"\n density=\"compact\"\n :active=\"false\"\n class=\"a-le-action a-le-action--chip-close\"\n :aria-label=\"t('common.sortable.delete')\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-close\"\n size=\"14\"\n />\n </VBtn>\n <template v-else>\n <VBtn\n v-if=\"showEditButton && canInteract && !defaultExpanded\"\n :aria-label=\"t('common.sortable.edit')\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton && canInteract\"\n :aria-label=\"t('common.sortable.delete')\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showAddAfterAction && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n :aria-label=\"t('common.sortable.more')\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem @click=\"onRowAddAfterClick(vi)\">\n <template #prepend>\n <VIcon icon=\"mdi-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <template v-if=\"(vi.editing || defaultExpanded) && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <div\n v-if=\"showInlineSaveFooter && !defaultExpanded\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"$slots['item-readonly'] && (readonly || vi.expanded)\"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </template>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../styles/tokens';\n@use '../styles/shared';\n\n// Variant-specific rules, scoped under the AListEditor root.\n.a-list-editor {\n // Chips: 12px left padding (flat) vs 8px in sortable, which reserves drag-handle room.\n &--chips .a-le-row-header {\n padding: 2px 4px 2px 12px;\n gap: 4px;\n min-height: 28px;\n }\n}\n\n// Narrow/mobile layout: taller rows, always-visible actions, status badge dropped for room.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-list-editor {\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsNA,IAAM4D,IAAQC,GAuCRC,IAAOH,IAsBPI,IAAa9D,GAAoB4D,GAAA,YAAmB,GAEpD,EAAE,SAAMI,GAAQ,GAChBC,IAAQC,GAAS,GACjBC,KAAUC,GAAW,GAErBC,KAASC,GAA4B,QAAQ,GAE7CC,KAAUC,QAAwBL,GAAQ,SAAS,MAAM,KAAK,GAM9DM,KAAoD;GACxD,WAAWX,EAAW;GACtB,MAAM,MAAO,EAAW,QAAQY;GAChC,SAASf,EAAM;GACf,QAAQA,EAAM;GACd,UAAUA,EAAM;GAChB,oBAAoBA,EAAM,gBAAgB,CAAC;GAC3C,UAAUA,EAAM;EAClB,GAIMgB,KAAahB,EAAM,SAAS,OAAOiB,EAA+BjB,EAAM,UAAUc,EAAiB,GACnGI,IAAalB,EAAM,UAAUgB,IAAY,UAAUG,EAA+BL,EAAiB,GAGnGM,IAAYpB,EAAM,UAAU,MAM5BqB,KAAgBC,EAA4BN,IAAY,cAAc,IAAI,GAC1EO,KAAS,MACb,OAAOH,KAAc,aAAaA,EAAUI,CAAI,IAAKA,EAAKJ,IAEtDK,KAAeZ,QAAwB,OAAOO,KAAc,aAAa,SAAUA,CAAqB,GAGxGM,KAAoBb,QAAuB;GAC/C,IAAMc,IAAI3B,EAAM;GAIhB,OAHI2B,MAAM,KAAA,KACNA,MAAM,KAAc,aACpB,OAAOA,KAAM,WAAiBA,EAAE,QAC7BA;EACT,CAAC,GAGKC,IAAYf,QAChBV,EAAW,MAAM,KAAK,GAAK,OAAW;GACpC,KAAKoB,EAAMM,CAAG;GACd;GACA;GACA,UAAUA,EAAIH,GAAkB;EAClC,EAAE,CACJ,GAKMI,qBAAsB,IAAI,IAAY,GACtCC,MAAiB,MAAuC;GAC5D,IAAMC,oBAAO,IAAI,IAAmB,GAC9BC,oBAAa,IAAI,IAAY,GAC/BC,IAAU;GACd,KAAK,IAAMC,KAAMC,GACf,AAAID,EAAG,QAAQ,KAAA,KAAaA,EAAG,QAAQ,OACrC,OAGEH,EAAK,IAAIG,EAAG,GAAG,KAAGF,EAAW,IAAI,OAAOE,EAAG,GAAG,CAAC,GACnDH,EAAK,IAAIG,EAAG,GAAG;GAEjB,IAAID,MAAY,KAAKD,EAAW,SAAS,GAAG;GAC5C,IAAMI,IAAY,GAAGH,EAAQ,GAAG,CAAC,GAAGD,CAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG;GAC/D,AAAIH,GAAoB,IAAIO,CAAS,MACrCP,GAAoB,IAAIO,CAAS,GAC7BH,IAAU,KACZ,QAAQ,KACN,iBAAiBA,EAAQ,kDAAkDT,GAAa,MAAM,2GAGhG,GAEEQ,EAAW,OAAO,KACpB,QAAQ,KACN,gDAAgDR,GAAa,MAAM,MAAM,CAAC,GAAGQ,CAAU,CAAC,CAAC,KAAK,IAAI,EAAE,oFAEtG;EAEJ;EAKA,AAJAK,GAAMV,IAAY,MAAUG,GAAcK,CAAK,GAAG,EAAE,WAAW,GAAK,CAAC,GAIrEE,SACQV,EAAU,MAAM,KAAK,MAAO,OAAOO,EAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,SACpDd,GAAc,aAAaO,EAAU,MAAM,KAAK,MAAOO,EAAG,GAAG,CAAC,GACpE,EAAE,OAAO,OAAO,CAClB;EAEA,IAAMI,IAAeC,kBAAwB,IAAI,IAAI,CAAC,GAEhDC,KAAgB9B,GAA4B,eAAe,GAE3D+B,KAAe7B,QAAe,CAACb,EAAM,SAAS,CAAC,CAACM,EAAM,IAAI,GAC1DqC,KAAoB9B,QAAe,CAACb,EAAM,SAAS,CAAC,CAACM,EAAM,gBAAgB,GAE3E,EAAE,gBAAa,sBAAkB,eAAW,gBAAY,gBAAY,eAAW,wBACnFsC,EAA6C;GAC3C;GACA,aAAa;GACb;GACA,kBAAkB,GAAK,MAAS1B,EAAW,WAAW2B,GAAKC,CAAI;GAC/D,iBAAiB3C,EAAW,MAAM,KAAK,MAAOoB,EAAMwB,CAAE,CAAC;GACvD,YAAY,MAAQ;IAClB,IAAMC,IAAM7C,EAAW,MAAM,MAAM,MAAOoB,EAAMwB,CAAE,MAAMF,CAAG;IAC3D,OAAOG,IAAM,EAAE,MAAMA,EAAI,IAAI;GAC/B;GACA,gBAAgB,MAAQ;IACtB,EAAa,MAAM,OAAOH,CAAG;GAC/B;EACF,CAAC,GAEGI,KAAmBpC,QAAeb,EAAM,YAAYkD,EAAE,qBAAqB,CAAC,GAC5EC,KAAqBtC,QAAeb,EAAM,cAAckD,EAAE,4BAA4B,CAAC,GACvFE,KAA6BvC,QAAeb,EAAM,sBAAsBkD,EAAE,oCAAoC,CAAC,GAC/GG,KAA4BxC,QAE9Bb,EAAM,sBACLA,EAAM,eAAe,cAClBkD,EAAE,mCAAmC,IACrCA,EAAE,2CAA2C,EACrD,GAEMI,IAAczC,QAAe,CAACb,EAAM,YAAY,CAACA,EAAM,YAAY,CAACA,EAAM,OAAO,GACjFuD,IAAS1C,QAAeyC,EAAY,SAAStD,EAAM,aAAa,GAIhEwD,IAAetC,EAAW,cAC1BuC,KAAsB5C,QAAe,CAACb,EAAM,YAAY,CAACA,EAAM,kBAAkBwD,EAAa,QAAQ,CAAC,GACvGE,KAAgB7C,QAAe,CAAC,EAAEb,EAAM,SAASM,EAAM,WAAWmD,GAAoB,KAAK,GAI3FE,KAAuB9C,QAAe,CAAC,CAACb,EAAM,UAAU,GAMxD4D,oBAAiB,IAAI,IAA6C,GAClEC,IAAqBhD,QAA2C;GACpE,IAAMiD,IAAmC,CAAC,GACpCC,oBAAW,IAAI,IAAmB;GACxC,KAAK,IAAM5B,KAAMP,EAAU,OAAO;IAChC,EAAS,IAAIO,EAAG,GAAG;IACnB,IAAM6B,IAAUC,EAAY,MAAM,IAAI9B,EAAG,GAAG,GACtC+B,IAAW3B,EAAa,MAAM,IAAIJ,EAAG,GAAG,GACxCgC,KAAUnE,EAAM,aAAa,IAAImC,EAAG,GAAG,KAAK,IAG5CiC,IAAUpE,EAAM,kBAAkBA,EAAM,WAAW,KAAQkB,EAAW,UAAUiB,EAAG,GAAG,GACtFkC,IAAQD,GAERE,IAAkBpD,EAAW,SAASiB,EAAG,KAAKA,EAAG,KAAK6B,CAAO,GAC7DO,IAASX,EAAe,IAAIzB,EAAG,GAAG;IACxC,IACEoC,KACAA,EAAO,QAAQpC,EAAG,OAClBoC,EAAO,UAAUpC,EAAG,SACpBoC,EAAO,aAAapC,EAAG,YACvBoC,EAAO,YAAYP,KACnBO,EAAO,aAAaL,KACpBK,EAAO,YAAYJ,MACnBI,EAAO,UAAUF,KACjBE,EAAO,YAAYH,KACnBG,EAAO,oBAAoBD,GAC3B;KACA,EAAK,KAAKC,CAAM;KAChB;IACF;IACA,IAAMC,IAAsC;KAC1C,GAAGrC;KACH;KACA;KACA;KACA;KACA;KACA;IACF;IAEA,AADAyB,EAAe,IAAIzB,EAAG,KAAKqC,CAAS,GACpCV,EAAK,KAAKU,CAAS;GACrB;GACA,KAAK,IAAM3B,KAAOe,EAAe,KAAK,GACpC,AAAKG,EAAS,IAAIlB,CAAG,KAAGe,EAAe,OAAOf,CAAG;GAEnD,OAAOiB;EACT,CAAC,GAEKW,KAAU5D,QAAegD,EAAmB,MAAM,WAAW,CAAC,GAE9Da,KAAU,MACdb,EAAmB,MAAM,MAAM,MAAM9C,EAAE,QAAQ8B,CAAG,GAE9C8B,IAAcC,EAAe;GACjC,WAAW/D,QAAegD,EAAmB,MAAM,KAAK,OAAQ,EAAE,KAAK1B,EAAG,IAAI,EAAE,CAAC;GACjF,SAAS;GACT,eAAeK,EAAI,EAAK;GACxB,UAAU3B,QAAe,CAACyC,EAAY,KAAK;GAC3C,YAAY,MAAQW,EAAY,MAAM,IAAIpB,CAAG;GAC7C,eAAe,MAAQ;IACrB,IAAMV,IAAKuC,EAAO7B,CAAG;IACrB,AAAIV,KAAI0C,EAAY1C,CAAE;GACxB;GACA,eAAe,MAAQ;IACrB,IAAMA,IAAKuC,EAAO7B,CAAG;IACrB,AAAIV,KAAI2C,EAAa3C,CAAE;GACzB;EACF,CAAC,GAEK7F,MAAsB,MAAuBC,EAAuBsF,GAAK,EAAE,cAAc7B,EAAM,aAAa,CAAC,GAI7GiF,UAAmB;GACvB,AAAK1B,EAAO,UACZ2B,GAAgB,GAChBhE,EAAW,QAAQ,KAAA,GAAW,KAAA,CAAS;EACzC,GAEMiE,MAAsB,MAA4B;GACtD,AAAK7B,EAAY,UACjB4B,GAAgB,GAChBhE,EAAW,QAAQ,KAAA,GAAW,EAAE,SAASiB,EAAG,IAAI,CAAC;EACnD,GAEM0C,KAAe,MAA4B;GAC/C,AAAKvB,EAAY,UAEbW,EAAY,MAAM,IAAI9B,EAAG,GAAG,IAC9B2C,EAAa3C,CAAE,KAGbO,GAAa,UACf0C,GAAUjD,CAAE,GACZI,EAAa,MAAM,OAAOJ,EAAG,GAAG,IAElCjC,EAAK,QAAQiC,CAAE;EACjB,GAEMkD,MAAiB,MAA4B;GACjD,IAAIrF,EAAM,YAAYA,EAAM,SAAS;GACrC,IAAM6C,IAAMV,EAAG,KACTmD,IAAoB/C,EAAa,MAAM,IAAIM,CAAG;GACpD,IAAIyC,GACF,EAAa,MAAM,OAAOzC,CAAG;QACxB;IACL,KAAK,IAAM0C,KAAKhD,EAAa,OAAO,EAAa,MAAM,OAAOgD,CAAC;IAC/D,EAAa,MAAM,IAAI1C,CAAG;GAC5B;GACA,EAAK,eAAeV,GAAI,CAACmD,CAAiB;EAC5C,GAEME,MAAkB,MAClBxF,EAAM,SACNA,EAAM,mBACNA,EAAM,mBACNA,EAAM,YAAYA,EAAM,UAAgB,KAE5C,GADImC,EAAG,WAAWA,EAAG,YACjB,CAACnC,EAAM,YAAYA,EAAM,iBAIzByF,MAAc,MAAiC;GACnD,AAAKD,GAAerD,CAAE,MAClBA,EAAG,WAAWA,EAAG,WACnB2C,EAAa3C,CAAE,IAGbnC,EAAM,YAAY2C,GAAkB,QACtC0C,GAAclD,CAAE,IAEhB0C,EAAY1C,CAAE;EAElB,GAEM,EACJ,kBACA,oBACA,iBACA,eAAeuD,IACf,2BACA,6BACEC,EAA4C;GAC9C,kBAAkB,MAAS,GAAM,mBAAkB3F,EAAM,gBAAgB6B,CAAG;GAC5E,WAAW,MAAQ7B,EAAM,WAAW6B,CAAG;GACvC,YAAY,MAAO;IAQjB,AAPAoC,EAAY,MAAM,OAAO9B,EAAG,GAAG,GAC/ByD,GAAiB,MAAM,OAAOzD,EAAG,GAAG,GACpCI,EAAa,MAAM,OAAOJ,EAAG,GAAG,GAIhCjB,EAAW,WAAWiB,EAAG,KAAK,EAAE,cAAcnC,EAAM,eAAe,WAAW,CAAC,GAC/EE,EAAK,WAAWiC,CAAE;GACpB;GACA,4BAA4BnC,EAAM,wBAAwBA,EAAM;EAClE,CAAC,GAEK6F,KAAgB,OAAO,MAA4B;GACvD,AAAKvC,EAAY,SACjB,MAAMoC,GAAmBvD,CAAE;EAC7B,GAIM2D,KAAatD,kBAAwB,IAAI,IAAI,CAAC,GAC9CuD,KAAc,OAAO,MAA4B;GACrD,IAAI,IAAW,MAAM,IAAI5D,EAAG,GAAG,GAC/B;OAAW,MAAM,IAAIA,EAAG,GAAG;IAC3B,IAAI;KACF,AAAInC,EAAM,cAAY,MAAMA,EAAM,WAAWmC,EAAG,GAAG;IACrD,UAAU;KACR,GAAW,MAAM,OAAOA,EAAG,GAAG;IAChC;IAEA,AADA6D,GAAW7D,CAAE,GACbjC,EAAK,cAAciC,CAAE;GAPM;EAQ7B,GAEM8D,MAAiB,MAA4B;GACjD,GAAW9D,CAAE;EACf,GAEM2C,KAAgB,MAA4B;GAGhD,AAFAoB,GAAU/D,CAAE,GACZI,EAAa,MAAM,OAAOJ,EAAG,GAAG,GAChCjC,EAAK,SAASiC,CAAE;EAClB,GAeMgE,oBAAe,IAAI,IAAkC,GACrDC,MAAc,MAAsC;GACxD,IAAIC,IAAUF,EAAa,IAAItD,CAAG;GAmClC,OAlCKwD,MACH,IAAU;IACR,YAAY;KACV,IAAMlE,IAAKuC,EAAO7B,CAAG;KACrB,AAAIV,KAAI0C,EAAY1C,CAAE;IACxB;IACA,YAAY;KACV,IAAMA,IAAKuC,EAAO7B,CAAG;KACrB,OAAOV,IAAK4D,GAAY5D,CAAE,IAAI,KAAA;IAChC;IACA,cAAc;KACZ,IAAMA,IAAKuC,EAAO7B,CAAG;KACrB,AAAIV,KAAI8D,GAAc9D,CAAE;IAC1B;IACA,aAAa;KACX,IAAMA,IAAKuC,EAAO7B,CAAG;KACrB,AAAIV,KAAI2C,EAAa3C,CAAE;IACzB;IACA,QAAQ,YAAY;KAClB,IAAMA,IAAKuC,EAAO7B,CAAG;KACrB,AAAIV,KAAI,MAAM0D,GAAc1D,CAAE;IAChC;IACA,gBAAgB;KACd,IAAMA,IAAKuC,EAAO7B,CAAG;KACrB,AAAIV,KAAIgD,GAAmBhD,CAAE;IAC/B;IACA,oBAAoB;KAClB,IAAMA,IAAKuC,EAAO7B,CAAG;KACrB,AAAIV,KAAIkD,GAAclD,CAAE;IAC1B;IACA,SAAS,MAASjB,EAAW,WAAW2B,GAAKiB,CAAI;GACnD,GACAqC,EAAa,IAAItD,GAAKwD,CAAO,IAExBA;EACT;EAEA,SACQxC,EAAmB,QACxB,MAAQ;GACP,IAAIsC,EAAa,SAAS,GAAG;GAC7B,IAAMpC,IAAW,IAAI,IAAIuC,EAAI,KAAK,MAAMvF,EAAE,GAAG,CAAC;GAC9C,KAAK,IAAM8B,KAAOsD,EAAa,KAAK,GAClC,AAAKpC,EAAS,IAAIlB,CAAG,KAAGsD,EAAa,OAAOtD,CAAG;EAEnD,CACF;EAEA,IAAM0D,KAAkB,OAAkC;GACxD,MAAMpE;GACN,KAAKA,EAAG;GACR,OAAOA,EAAG;GACV,KAAKA,EAAG;GACR,UAAUnC,EAAM;GAChB,UAAUA,EAAM;GAChB,UAAUmC,EAAG;GACb,SAASA,EAAG,WAAWnC,EAAM;GAC7B,OAAOmC,EAAG;GACV,SAASA,EAAG;GACZ,OAAOvB,GAAQ;GACf,gBAAgBS,GAAc,UAAUc,EAAG,GAAG;GAC9C,SAASiE,GAAWjE,EAAG,GAAG;EAC5B;EAGA,SACEnC,EAAM,uBAAuB,CAACA,EAAM,iBAChC;GAAE,OAAOA,EAAM;GAAqB,OAAOkB,EAAW,WAAW;EAAM,IACvE,CAAC,CACP;EAKA,IAAMsF,WACJC,EAAqBvF,IAAa,MAAQ;GACxC,IAAMiB,IAAKP,EAAU,MAAM,MAAM,MAAMb,EAAE,QAAQ8B,CAAG;GACpD,AAAIV,KAAIiD,GAAUjD,CAAE;EACtB,CAAC;E,OAKHuE,EAA2B;GACzB,WAAWxF,EAAW;GACtB,iBAAiBlB,EAAM;GACvB,kBAAkBA,EAAM,aAAa,KAAA;GACrC,QAAQwG;EACV,CAAC,GAGD1G,EAAsC;GACpC,GAAGoB;GACH,aAAasF;EACf,CAAC,I,UAIChK,EAAA,GAAAC,EAoWM,OAAA;GAnWA,SAAA;GAAJ,KAAIiE;GACJ,OAAKhE,GAAA,CAAC,iBAAe,CACsB,2BAAAuD,EAAA,W;IAAsD,2BAAAA,EAAA;IAA6C,2BAAAA,EAAA;IAA0C,wBAAAW,GAAA;IAAyC,wBAAAX,EAAA;;;GAUjOtD,EA2TM,OAAA;IA1TA,SAAA;IAAJ,KAAI8F;IACJ,OAAM;;IAGEiB,GAAA,SADRlH,EAAA,GAAAC,EAsBM,OAtBN+B,IAsBM,CAlBJ5B,EAUOoK,EAAA,QAAA,UAAA,EARJ,OAAO/G,EAAA,MAAK,SAQR,CALGA,EAAA,SADRzD,EAAA,GAAAC,EAKK,MALLgC,IAKK5B,EADAoD,EAAA,KAAK,GAAA,CAAA,K,aAIJwD,GAAA,SADRjH,EAAA,GAAAC,EAMO,QAAA;;KAJL,OAAM;KACL,sBAAoBM,EAAAyG,CAAA;IAElB,GAAA3G,EAAAE,EAAAmG,CAAA,CAAC,CAAA,kCAAA,EAAA,OAA4CnG,EAAAyG,CAAA,EAAY,CAAA,CAAA,GAAA,GAAA9E,EAAA,K;IAKxDuB,EAAA,WADRzD,EAAA,GAAAC,EASM,OATNkC,IASM,CALJ3B,EAIEC,IAAA;KAHA,eAAA;KACA,OAAM;KACN,MAAK;I,QAKIgD,EAAA,SADbzD,EAAA,GAAAC,EAYM,OAZNmC,IAYM,CARJ5B,EAOSE,IAAA;KANP,MAAK;KACL,SAAQ;KACR,SAAQ;KACR,QAAO;;KAEP,SAAAC,QAAW,CAARC,EAAAP,EAAAoD,EAAA,KAAK,GAAA,CAAA,C;;I,QAKCwE,GAAA,SADbjI,EAAA,GAAAC,EAiBM,OAjBNoC,IAiBM,CAbJjC,EAYOoK,EAAA,QAAA,SAAA;KAVJ,UAAU/G,EAAA;KACV,UAAUA,EAAA;KACV,SAAO,EAAA,KAASgF,EAAU;IAJ7B,SAYO,CANLjI,EAKEK,IAAA;KAJC,OAAO8F,GAAA;KACP,aAAWF,GAAA;KACX,WAASM,EAAA;KACT,OAAK0B;;;;;I,WAMVzI,EAAA,EAAA,GAAAC,EA2NMa,GAAA,EAAA,KAAA,EAAA,GAAAC,GA1NSsG,EAAA,QAAN,OADTrH,EAAA,GAAAC,EA2NM,OAAA;KAzNH,KAAK,OAAO0F,EAAG,GAAG;KACnB,OAAM;;KAKNvF,EAGEoK,EAAA,QAAA,eAHFxJ,EAGE,EAAA,SAAA,GAAA,GADQ+I,EAAepE,CAAE,CAAA,CAAA;KAG3BxF,EAwMM,OAAA;MAvMH,WAAS,OAAOwF,EAAG,GAAG;MACvB,MAAK;MACJ,UAAUpF,EAAA4H,CAAA,CAAW,CAAC,YAAYxC,EAAG,GAAG;MACzC,OAAKzF,GAAA,CAAC,YAAU;OAC8B,sBAAAuD,EAAA,YAAO;OAAkD,qBAAAkC,EAAG;OAA6C,sBAAAA,EAAG;OAA6C,qBAAAA,EAAG;OAA8C,uBAAAqD,GAAerD,CAAE;QAA0C,wBAAAA,EAAG,oBAAoBA,EAAG,oBAAe;;MAQ3V,YAAO,MAAEpF,EAAA4H,CAAA,CAAW,CAAC,cAAcxC,EAAG,KAAKyF,CAAM;K,IAElDjL,EAsIM,OAAA;MArIJ,OAAM;MACL,UAAK,MAAE8I,GAAWtD,CAAE;;MAErBxF,EAaM,OAbNqC,IAaM,CAZJpC,EAOOoK,EAAA,QAAA,gBAPPxJ,EAOO,EAAA,SAAA,GAAA,GALG+I,EAAepE,CAAE,CAAA,SAKpB,CAHLxF,EAEO,QAFPsC,IAEOpC,EADFP,GAAmB6F,EAAG,GAAG,CAAA,GAAA,CAAA,C,IAIxBA,EAAG,WADX3F,EAAA,GAAAiB,EAGEC,IAAA;;OADC,YAAUuC,EAAA;;MAKNA,EAAA,Q,aADTzD,EAAA,GAAAC,EAeM,OAfNyC,IAeM,CAXJtC,EAUOoK,EAAA,QAAA,eAVPxJ,EAUO,EAAA,SAAA,GAAA,GARG+I,EAAepE,CAAE,CAAA,SAQpB,CALGlC,EAAA,eAAekC,EAAG,IAAIlC,EAAA,gBAAW,QAAakC,EAAG,IAAIlC,EAAA,iBAAW,MADxEzD,EAAA,GAAAC,EAKO,QALP0C,IAKOtC,EADFsF,EAAG,IAAIlC,EAAA,YAAW,GAAA,CAAA,K;MAK3BtD,EAiGM,OAjGNyC,IAiGM,CAhGJxC,EA+FOoK,EAAA,QAAA,gBA/FPxJ,EA+FO,EAAA,SAAA,GAAA,GA7FG+I,EAAepE,CAAE,CAAA,SA6FpB,CA1FGlC,EAAA,SAASA,EAAA,oBAAoBqD,EAAA,SADrC9G,EAAA,GAAAiB,EAeOE,GAAA;;OAbL,MAAA;OACA,MAAK;OACL,SAAQ;OACR,SAAQ;OACP,QAAQ;OACT,OAAM;OACL,cAAYZ,EAAAmG,CAAA,CAAC,CAAA,wBAAA;OACb,SAAKtF,GAAA,MAAOiI,GAAc1D,CAAE,GAAA,CAAA,MAAA,CAAA;;OAE7B,SAAAhF,QAGE,CAHFH,EAGEa,GAAA;QAFA,MAAK;QACL,MAAK;;;M,qCAGTrB,EAAA,GAAAC,EA0EWa,GAAA,EAAA,KAAA,EAAA,GAAA;OAxED2C,EAAA,kBAAkBqD,EAAA,SAAW,CAAKrD,EAAA,mBAD1CzD,EAAA,GAAAiB,EAoBOE,GAAA;;QAlBJ,cAAYZ,EAAAmG,CAAA,CAAC,CAAA,sBAAA;QACd,MAAA;QACA,MAAK;QACL,SAAQ;QACR,OAAM;QACN,SAAQ;QACR,OAAM;QACL,SAAKtF,GAAA,MAAOiH,EAAY1C,CAAE,GAAA,CAAA,MAAA,CAAA;;QAE3B,SAAAhF,QAGE,CAHFH,EAGEa,GAAA;SAFA,MAAK;SACL,MAAK;Q,IAEPb,EAIEc,GAAA;SAHA,WAAU;SACV,UAAS;SACR,MAAMf,EAAAmG,CAAA,CAAC,CAAA,sBAAA;;;;OAIJjD,EAAA,oBAAoBqD,EAAA,SAD5B9G,EAAA,GAAAiB,EAmBOE,GAAA;;QAjBJ,cAAYZ,EAAAmG,CAAA,CAAC,CAAA,wBAAA;QACd,MAAA;QACA,MAAK;QACL,SAAQ;QACR,SAAQ;QACR,OAAM;QACL,SAAKtF,GAAA,MAAOiI,GAAc1D,CAAE,GAAA,CAAA,MAAA,CAAA;;QAE7B,SAAAhF,QAGE,CAHFH,EAGEa,GAAA;SAFA,MAAK;SACL,MAAK;Q,IAEPb,EAIEc,GAAA;SAHA,WAAU;SACV,UAAS;SACR,MAAMf,EAAAmG,CAAA,CAAC,CAAA,wBAAA;;;;OAIJjD,EAAA,sBAAsBqD,EAAA,SAD9B9G,EAAA,GAAAiB,EA+BOE,GAAA;;QA7BL,MAAA;QACA,MAAK;QACL,SAAQ;QACR,SAAQ;QACP,QAAQ;QACT,OAAM;QACL,cAAYZ,EAAAmG,CAAA,CAAC,CAAA,sBAAA;;QAEd,SAAA/F,QAGE;SAHFH,EAGEa,GAAA;UAFA,MAAK;UACL,MAAK;;SAEPb,EAIEc,GAAA;UAHA,WAAU;UACV,UAAS;UACR,MAAMf,EAAAmG,CAAA,CAAC,CAAA,sBAAA;;SAEVlG,EAWQe,IAAA,EAXD,WAAU,SAAQ,GAAA;UACvB,SAAAZ,QASQ,CATRH,EASQgB,IAAA,EATD,SAAQ,UAAS,GAAA;WACtB,SAAAb,QAOY,CAPZH,EAOYiB,IAAA,EAPA,UAAK,MAAEkH,GAAmBhD,CAAE,E;YAC3B,SAAOhF,QACS,CAAzBH,EAAyBa,GAAA,EAAlB,MAAK,WAAU,CAAA,C;YAExB,SAAAV,QAEiB,CAFjBH,EAEiBkB,IAAA,MAAA;aADf,SAAAf,QAAmC,CAAhCC,EAAAP,EAAAE,EAAAmG,CAAA,CAAC,CAAA,0BAAA,CAAA,GAAA,CAAA,C;;;;;;;;;;;;;K,YAWLf,EAAG,WAAWlC,EAAA,oBAAoB7D,EAAAA,OAAO,QAA1DI,EAAA,GAAAC,EAoCWa,GAAA,EAAA,KAAA,EAAA,GAAA,CAnCTX,EAOM,OAPN0C,IAOM,CANJ1C,EAKM,OALN2C,IAKM,CAJJ1C,EAGEoK,EAAA,QAAA,QAHFxJ,EAGE,EAAA,SAAA,GAAA,GADQ+I,EAAepE,CAAE,CAAA,CAAA,C,MAI/BvF,EA0BOoK,EAAA,QAAA,eA1BPxJ,EA0BO,EAAA,SAAA,GAAA,GAxBG+I,EAAepE,CAAE,CAAA,SAwBpB,CArBGwB,GAAA,SAAoB,CAAK1D,EAAA,mBADjCzD,EAAA,GAAAC,EAqBM,OArBN8C,IAqBM;MAjBJ,AAAA+I,EAAA,OAAA3L,EAAsC,OAAA,EAAjC,OAAM,yBAAwB,GAAA,MAAA,EAAA;MACnCK,EAMOW,GAAA;OALL,SAAQ;OACP,UAAUwE,EAAG;OACb,SAAKvE,GAAA,MAAOqI,GAAc9D,CAAE,GAAA,CAAA,MAAA,CAAA;;OAE7B,SAAAhF,QAA+B,CAA5BC,EAAAP,EAAAE,EAAAmG,CAAA,CAAC,CAAA,sBAAA,CAAA,GAAA,CAAA,C;;;MAENlG,EAQOW,GAAA;OAPL,OAAM;OACN,SAAQ;OACR,gBAAa;OACZ,UAAUwE,EAAG;OACb,SAAKvE,GAAA,MAAOmI,GAAY5D,CAAE,GAAA,CAAA,MAAA,CAAA;;OAE3B,SAAAhF,QAA6B,CAA1BC,EAAAP,EAAAE,EAAAmG,CAAA,CAAC,CAAA,oBAAA,CAAA,GAAA,CAAA,C;;;K,2BAOC9G,EAAAA,OAAM,qBAAsB6D,EAAA,YAAYkC,EAAG,aADxD3F,EAAA,GAAAC,EAUM,OAVN+C,IAUM,CANJ7C,EAKM,OALN8C,IAKM,CAJJ7C,EAGEoK,EAAA,QAAA,iBAHFxJ,EAGE,EAAA,SAAA,GAAA,GADQ+I,EAAepE,CAAE,CAAA,CAAA,C;KAMjCvF,EAGEoK,EAAA,QAAA,cAHFxJ,EAGE,EAAA,SAAA,GAAA,GADQ+I,EAAepE,CAAE,CAAA,CAAA;;IAMvBoB,EAAA,SAAM,CAAKtD,EAAA,WAAO,CAAKA,EAAA,SAAK,CAAKwE,GAAA,QADzC7H,EAmBOoK,EAAA,QAAA,cAAA;KAhBJ,UAAU/G,EAAA;KACV,UAAUA,EAAA;KACV,OAAK,EAAA,SAAagF,EAAU;KAC5B,SAAO,EAAA,KAASA,EAAU;IAN7B,SAmBO,CAXLtI,EAUS,UAAA;KATP,MAAK;KACL,OAAM;KACL,SAAOsI;I,IAERjI,EAGEa,GAAA;KAFA,MAAK;KACL,MAAK;I,IAEPlB,EAAmC,QAAA,MAAAE,EAA1BoG,GAAA,KAAgB,GAAA,CAAA,C;;GAK/BjG,EAUEmB,GAAA;IATS,YAAApB,EAAAwL,EAAA;IAAA,uBAAA,AAAAD,EAAA,QAAA,MAAAlK,GAAAmK,EAAA,IAAA,GAAY,QAAAX,IAAA;IACpB,OAAOxE,GAAA;IACP,MAAMC,GAAA;IACN,iBAAetG,EAAAmG,CAAA,CAAC,CAAA,wBAAA;IAChB,gBAAcnG,EAAAmG,CAAA,CAAC,CAAA,sBAAA;IACf,OAAOnG,EAAA0L,EAAA;IACP,aAAW1L,EAAA2L,EAAA;IACX,WAAS3L,EAAA4L,EAAA;IACT,UAAQ5L,EAAA6L,EAAA;;;;;;;;;;;;GAGXjM,EAaM,OAbN+C,IAaM7C,EAPFE,EAAA4H,CAAA,CAAW,CAAC,WAAW,UAAK,O,KAAsB5H,EAAAmG,CAAA,CAAC,CAAA,uCAAA;IAA2D,GAAAnG,EAAA4H,CAAA,CAAW,CAAC,aAAa,QAAK;IAA2B,OAAA5H,EAAA4H,CAAA,CAAW,CAAC,WAAW"}
1
+ {"version":3,"file":"AListEditor.vue_vue_type_script_setup_true_lang.js","names":["$slots","_useModel","resolveCompactText","resolveCompactTextUtil","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_toDisplayString","_unref","_createVNode","_component_VProgressCircular","_component_VAlert","_withCtx","_createTextVNode","LeEmptyState","_Fragment","_renderList","_mergeProps","_createBlock","LeUnsavedLabel","_component_VBtn","_withModifiers","_component_VIcon","_component_VTooltip","_component_VMenu","_component_VList","_component_VListItem","_component_VListItemTitle","LeDeleteDialog","_isRef","LeDeleteDialog_default","LeEmptyState_default","LeUnsavedLabel_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","AListEditor_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","__expose","__emit","props","__props","emit","modelValue","useModel","useI18n","slots","useSlots","display","useDisplay","rootEl","useTemplateRef","isTouch","computed","controllerOptions","v","stateEntry","useListEditorStateEntry","controller","useListEditorController","getKeyOpt","rowStateScope","provideListEditorStateScope","keyOf","item","keyFieldName","positionFieldName","p","viewItems","raw","warnedKeySignatures","warnOnBadKeys","seen","duplicates","missing","vi","items","signature","watch","expandedKeys","ref","rowsContainer","isInlineEdit","hasReadonlyDetail","useInlineEditing","key","data","it","hit","addLabelResolved","t","emptyTitleResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","canInteract","canAdd","unsavedCount","unsavedCountVisible","headerVisible","showInlineSaveFooter","decoratorCache","viewItemsDecorated","next","liveKeys","editing","editingKeys","expanded","loading","unsaved","dirty","validationState","cached","decorated","isEmpty","findVi","keyboardNav","useKeyboardNav","onEditClick","onCloseClick","resolveCompactText$1","resolveCompactText","onAddClick","requestAutoOpen","onRowAddAfterClick","beginEdit","onExpandClick","currentlyExpanded","k","isRowClickable","onRowClick","triggerDeleteClick","useDeleteDialog","editingSnapshots","onDeleteClick","savingKeys","onSaveClick","commitEdit","onCancelClick","closeEdit","actionsCache","getActions","actions","now","buildSlotProps","runValidateAndReveal","validateAllAndReveal","useListEditorScopeValidity","openBlock","createElementBlock","normalizeClass","createElementVNode","renderSlot","_ctx","toDisplayString","createCommentVNode","unref","createVNode","VProgressCircular","VAlert","withCtx","createTextVNode","Fragment","renderList","mergeProps","$event","createBlock","VBtn","withModifiers","VIcon","VTooltip","VMenu","VList","VListItem","VListItemTitle","_cache","deleteDialog","isRef","deleteError","deleteInFlight","onDeleteDialogConfirm","onDeleteDialogCancel"],"sources":["../../../../src/domains/listEditor/components/AListEditor.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport { computed, ref, useSlots, useTemplateRef, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useDisplay } from 'vuetify'\nimport { useKeyboardNav } from '@/domains/listEditor/composables/useKeyboardNav'\nimport {\n useListEditorController,\n type GetKey,\n type ListEditorHandle,\n type ListEditorValidationResult,\n type PositionAction,\n type PositionOption,\n type PositionStrategy,\n} from '@/domains/listEditor/composables/useListEditorController'\nimport {\n provideListEditorStateScope,\n useListEditorStateEntry,\n type ListEditorStateBindings,\n} from '@/domains/listEditor/composables/useListEditorStateScope'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/domains/listEditor/utils/resolveCompactText'\nimport { useUnsavedSection } from '@/domains/unsavedGuard/composables/useUnsavedSection'\nimport { useDeleteDialog } from '@/domains/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/domains/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/domains/listEditor/utils/revealInvalidRows'\nimport { useListEditorScopeValidity } from '@/domains/listEditor/composables/useListEditorScopeValidity'\nimport LeDeleteDialog from '@/domains/listEditor/components/internal/LeDeleteDialog.vue'\nimport LeEmptyState from '@/domains/listEditor/components/internal/LeEmptyState.vue'\nimport LeUnsavedLabel from '@/domains/listEditor/components/internal/LeUnsavedLabel.vue'\nimport type {\n ListEditorKey,\n ListEditorValidationScope,\n ListEditorValidationState,\n ListViewItem,\n} from '@/domains/listEditor/types/listEditorTypes'\n\nexport interface DecoratedViewItem<T> extends ListViewItem<T> {\n editing: boolean\n expanded: boolean\n loading: boolean\n dirty: boolean\n unsaved: boolean\n validationState: ListEditorValidationState\n}\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedViewItem<TItem>\n raw: TItem\n index: number\n key: ListEditorKey\n readonly: boolean\n disabled: boolean\n expanded: boolean\n editing: boolean\n dirty: boolean\n /** Aliases `dirty` here (no reorder mode → no `moved` to OR). Same field name as on sortable/nested variants. */\n unsaved: boolean\n touch: boolean\n /**\n * Row-scoped `state-key` prefix. Thread it down to any list editor rendered in this slot and set\n * its `:state-key=\"`${stateKeyPrefix}:someList`\"` — that editor's controller then lives in THIS\n * editor's scope and survives the row collapsing (which unmounts the whole slot subtree). Entries\n * under this prefix are disposed when the row is removed.\n */\n stateKeyPrefix: string\n actions: RowActions<TItem>\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\nexport interface HeaderSlotProps {\n title: string | null\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n /**\n * New-row factory. Add / \"add after\" insert `factory()` through the controller\n * (positions renumbered) — no consumer `@add` push handler is needed.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`; never the position field. Typed `string`\n * not `keyof TItem` because the latter compiles to a Boolean-only runtime prop\n * type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. `string` must be\n * listed before `false` (and not be `keyof TItem`): otherwise Vue's runtime\n * type goes Boolean-first and coerces `position=\"position\"` to `true`.\n */\n position?:\n | string\n | false\n | {\n field: string\n multiplier?: number\n strategy?: PositionStrategy\n strategyOverrides?: Partial<Record<PositionAction, PositionStrategy>>\n }\n /**\n * Extra fields to drop from the dirty content-hash (position is always dropped).\n * Use when a SEPARATE nested editor already tracks a child collection, so editing\n * a child doesn't flip the parent row amber. Still saved; only the diff ignores it.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Vuelidate `$scope` (the same one the consumer's row forms / save-gate collector use). When set,\n * the editor registers its aggregate validity under it, so a plain `v$.$invalid` save gate blocks\n * AND reveals a collapsed invalid row — no `validateAll()` call needed in the save flow. Omit to\n * keep legacy behavior (gate the save on the exposed `validateAll()` yourself); `false` opts out.\n */\n validationScope?: ListEditorValidationScope | false\n /**\n * Opt-in lifted controller from `useListEditorController()` — pass it so editor\n * state survives this component's unmount/remount. Omitted: the editor owns one\n * internally. Either way the `ListEditorHandle` is reachable via `useTemplateRef`.\n */\n editor?: ListEditorHandle<TItem>\n /**\n * Persist this editor's controller in the nearest ANCESTOR editor's row-state scope under this\n * key, instead of owning it. Use it for an editor rendered in another editor's `#item` slot: that\n * slot is behind a `v-if`, so collapsing the row unmounts this editor and a component-owned\n * controller would re-baseline the already-edited data on re-expand (losing amber, tombstones and\n * the red rail). Derive the key from the row slot's `stateKeyPrefix`, e.g.\n * `:state-key=\"`${stateKeyPrefix}:adverts`\"`. Options stay declared here, on this tag: the\n * controller is built from THIS editor's `factory`/`get-key`/`position`/`dirty-exclude`/`validate`\n * and rebound to each new instance's model on remount. Ignored when `:editor` is passed, and a\n * no-op without an ancestor scope.\n */\n stateKey?: string\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n /** Heading above the list. A ready translated string, like every text prop here. */\n title?: string | null\n\n /**\n * Field shown in a collapsed row when no `#item-compact` slot is given. A dotted path reads\n * through nested objects (`texts.title`); a path that runs into nothing renders empty.\n */\n compactField?: string | null\n statusField?: string | null\n twoRows?: 'never' | 'mobile' | 'always'\n chips?: boolean\n\n showAddButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n\n /** Label of the add button. A ready translated string; omit it for the library's own wording. */\n addLabel?: string | null\n /** Heading of the empty state. A ready translated string. */\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /** Disable unsaved-state tracking — no dirty markers, never reads as unsaved. */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n /**\n * How a row delete persists. `deferred` (default): the row disappears but the deletion counts as an\n * unconfirmed change (`unsavedCount`) until save, and is revertible until then. `immediate`: the\n * consumer deletes on the backend (`:on-delete`) — the dialog states it is irreversible and the\n * delete does NOT read as unsaved.\n */\n deleteMode?: 'immediate' | 'deferred'\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n /**\n * Render every `#item` slot expanded — no edit pencil, inline footer, or row-click\n * toggle. Use when all forms should be visible at once (e.g. ThirdPartyTracker).\n */\n defaultExpanded?: boolean\n\n loadingKeys?: Set<ListEditorKey> | null\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n\n /**\n * Registers this editor as a named unsaved-changes section under this (already\n * translated) label — replaces a per-consumer `useUnsavedSection` call.\n */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n factory: undefined,\n getKey: undefined,\n position: undefined,\n dirtyExclude: undefined,\n validate: undefined,\n validationScope: undefined,\n editor: undefined,\n stateKey: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n twoRows: 'never',\n chips: false,\n showAddButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n deleteMode: 'deferred',\n closeVariant: 'auto',\n defaultExpanded: false,\n loadingKeys: null,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n unsavedSectionLabel: undefined,\n})\n\nconst emit = defineEmits<{\n edit: [item: ListViewItem<TItem>]\n deleted: [item: ListViewItem<TItem>]\n close: [item: ListViewItem<TItem>]\n 'item-saved': [item: ListViewItem<TItem>]\n 'item-expand': [item: ListViewItem<TItem>, expanded: boolean]\n}>()\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst modelValue = defineModel<TItem[]>({ required: true })\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst display = useDisplay()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\n\nconst isTouch = computed<boolean>(() => display.platform.value.touch)\n\n// State controller (v2). `factory`/`getKey`/`position`/`validate` are construction-time options read\n// once to seed it (undefined → controller defaults 'id'/'position'/always-valid), not reactive props\n// — so the reactivity-loss rule is intentionally suppressed here.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst controllerOptions: ListEditorStateBindings<TItem> = {\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n}\n// Precedence: an explicitly lifted `:editor` wins; then a `state-key`'d entry persisted in the\n// nearest ancestor editor's row-state scope (built from the options above, rebound to this instance\n// on every remount); else this component owns the controller — today's behaviour, unchanged.\nconst stateEntry = props.editor ? null : useListEditorStateEntry<TItem>(props.stateKey, controllerOptions)\nconst controller = props.editor ?? stateEntry?.handle ?? useListEditorController<TItem>(controllerOptions)\n\n// Mirror the controller's key resolution so rendered rows key the way it tracks them.\nconst getKeyOpt = props.getKey ?? 'id'\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\n// Row-state scope for THIS editor's `#item` slot subtree: a nested editor with a `state-key` builds\n// its controller in here, so it outlives the row collapsing (which unmounts the slot). When this\n// editor is itself persisted, the scope comes from its own entry — so the chain holds at any depth.\nconst rowStateScope = provideListEditorStateScope(stateEntry?.childScope ?? null)\nconst keyOf = (item: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function' ? getKeyOpt(item) : (item[getKeyOpt as keyof TItem] as ListEditorKey)\n\nconst keyFieldName = computed<string>(() => (typeof getKeyOpt === 'function' ? '(fn)' : (getKeyOpt as string)))\n\n// Managed position field name, mirroring the controller's resolution.\nconst positionFieldName = computed<string>(() => {\n const p = props.position\n if (p === undefined) return 'position'\n if (p === false) return 'position'\n if (typeof p === 'object') return p.field as string\n return p as string\n})\n\n// Render projection only — the controller owns the data (key + index + raw + position).\nconst viewItems = computed<ListViewItem<TItem>[]>(() =>\n modelValue.value.map((raw, index) => ({\n key: keyOf(raw),\n index,\n raw,\n position: raw[positionFieldName.value] as number | undefined,\n }))\n)\n\n// Surfaces row-key wiring bugs loudly: undefined or duplicate keys silently break\n// dirty tracking, validity rails and reorder targeting and are hard to trace from\n// symptoms. Deduped per signature so a stable bad state warns once, a new one again.\nconst warnedKeySignatures = new Set<string>()\nconst warnOnBadKeys = (items: ListViewItem<TItem>[]): void => {\n const seen = new Set<ListEditorKey>()\n const duplicates = new Set<string>()\n let missing = 0\n for (const vi of items) {\n if (vi.key === undefined || vi.key === null) {\n missing++\n continue\n }\n if (seen.has(vi.key)) duplicates.add(String(vi.key))\n seen.add(vi.key)\n }\n if (missing === 0 && duplicates.size === 0) return\n const signature = `${missing}|${[...duplicates].sort().join(',')}`\n if (warnedKeySignatures.has(signature)) return\n warnedKeySignatures.add(signature)\n if (missing > 0) {\n console.warn(\n `[list-editor] ${missing} row(s) resolve to an undefined key (key-field \"${keyFieldName.value}\"). ` +\n 'Point get-key at a field every item has, or give new items unique temp ids ' +\n '(see nextListEditorTempId).'\n )\n }\n if (duplicates.size > 0) {\n console.warn(\n `[list-editor] duplicate row keys (key-field \"${keyFieldName.value}\"): ${[...duplicates].join(', ')}. ` +\n 'Row keys must be unique — dirty tracking and validation rails target rows by key.'\n )\n }\n}\nwatch(viewItems, (items) => warnOnBadKeys(items), { immediate: true })\n\n// Drop the persisted controllers of rows that no longer exist. `post` so the removed row's subtree\n// has already unmounted (its editors released their entries) before we stop their effect scopes.\nwatch(\n () => viewItems.value.map((vi) => String(vi.key)).join('|'),\n () => rowStateScope.retainOwners(viewItems.value.map((vi) => vi.key)),\n { flush: 'post' }\n)\n\nconst expandedKeys = ref<Set<ListEditorKey>>(new Set())\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst isInlineEdit = computed(() => !props.chips && !!slots.item)\nconst hasReadonlyDetail = computed(() => !props.chips && !!slots['item-readonly'])\n\nconst { editingKeys, editingSnapshots, beginEdit, cancelEdit, commitEdit, closeEdit, requestAutoOpen } =\n useInlineEditing<TItem, ListViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row',\n isInlineEdit,\n restoreSnapshot: (key, data) => controller.updateItem(key, data),\n watchKeys: () => modelValue.value.map((it) => keyOf(it)),\n findEntry: (key) => {\n const hit = modelValue.value.find((it) => keyOf(it) === key)\n return hit ? { data: hit } : null\n },\n afterAutoOpen: (key) => {\n expandedKeys.value.delete(key)\n },\n })\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(() => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'))\nconst deleteConfirmTextResolved = computed(\n () =>\n props.deleteConfirmText ??\n (props.deleteMode === 'immediate'\n ? t('common.sortable.deleteConfirmText')\n : t('common.sortable.deleteConfirmTextDeferred'))\n)\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canAdd = computed(() => canInteract.value && props.showAddButton)\n\n// Total unconfirmed-change count (added/edited/moved rows + deferred deletions). A delete lights this\n// up even though its row is gone. Shown as a header badge + exposed on the handle.\nconst unsavedCount = controller.unsavedCount\nconst unsavedCountVisible = computed(() => !props.readonly && !props.disableUnsaved && unsavedCount.value > 0)\nconst headerVisible = computed(() => !!(props.title || slots.header) || unsavedCountVisible.value)\n\n// Per-row Save/Cancel footer only makes sense with a per-item persist callback;\n// without one the parent form's global save flushes everything, so hide it.\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\n// Per-key decorator cache: reuse the cached object when base item AND every flag\n// match, giving slot consumers a stable reference for unchanged rows. `disableUnsaved`\n// suppresses only the amber marker — the validation rail still shows, since hiding\n// dirty-state shouldn't hide a real error.\nconst decoratorCache = new Map<ListEditorKey, DecoratedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedViewItem<TItem>[]>(() => {\n const next: DecoratedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of viewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = expandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n // Readonly can't have user-unsaved changes; never paint amber there (also avoids\n // a mount-before-load baseline marking every loaded row added). (QA 85050 sweep)\n const unsaved = props.disableUnsaved || props.readonly ? false : controller.isUnsaved(vi.key)\n const dirty = unsaved\n // `editing` → the controller reads amber (not red) while the row is being filled in. (QA 85050 b7)\n const validationState = controller.rowState(vi.raw, vi.key, editing)\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.unsaved === unsaved &&\n cached.validationState === validationState\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n loading,\n dirty,\n unsaved,\n validationState,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => viewItemsDecorated.value.length === 0)\n\nconst findVi = (key: ListEditorKey): DecoratedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() => viewItemsDecorated.value.map((vi) => ({ key: vi.key }))),\n variant: 'flat',\n isReorderMode: ref(false),\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n})\n\nconst resolveCompactText = (raw: TItem): string => resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Managed add: the controller inserts `factory()` and renumbers; the inline-editing\n// watch picks up the new key off the model change and auto-opens it.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n controller.addItem(undefined, undefined)\n}\n\nconst onRowAddAfterClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n controller.addItem(undefined, { afterId: vi.key })\n}\n\nconst onEditClick = (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n // Toggle: edit while already editing closes the form, matching row-header click.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n expandedKeys.value.delete(vi.key)\n }\n emit('edit', vi)\n}\n\nconst onExpandClick = (vi: ListViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currentlyExpanded = expandedKeys.value.has(key)\n if (currentlyExpanded) {\n expandedKeys.value.delete(key)\n } else {\n for (const k of expandedKeys.value) expandedKeys.value.delete(k)\n expandedKeys.value.add(key)\n }\n emit('item-expand', vi, !currentlyExpanded)\n}\n\nconst isRowClickable = (vi: DecoratedViewItem<TItem>): boolean => {\n if (props.chips) return false\n if (props.disableRowClick) return false\n if (props.defaultExpanded) return false\n if (props.disabled || props.loading) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) {\n onExpandClick(vi)\n } else {\n onEditClick(vi)\n }\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, ListViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n expandedKeys.value.delete(vi.key)\n // Controller owns removal: a temp row vanishes; a saved row is recorded in `getChanges().deleted`\n // and counts as an unconfirmed change (deferred) — unless immediate mode (already deleted on the\n // backend), which skips the tombstone.\n controller.deleteItem(vi.key, { trackDeleted: props.deleteMode === 'deferred' })\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm || props.chips,\n})\n\nconst onDeleteClick = async (vi: ListViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\n// Blocks a second click while the consumer's save is pending, so no duplicate is sent.\n// A rejected save keeps the row open and still reaches the app's error handler.\nconst savingKeys = ref<Set<ListEditorKey>>(new Set())\nconst onSaveClick = async (vi: ListViewItem<TItem>) => {\n if (savingKeys.value.has(vi.key)) return\n savingKeys.value.add(vi.key)\n try {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n } finally {\n savingKeys.value.delete(vi.key)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: ListViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: ListViewItem<TItem>) => {\n closeEdit(vi)\n expandedKeys.value.delete(vi.key)\n emit('close', vi)\n}\n\n// Per-key actions cache: each row's `actions` bundle is allocated once so slot\n// consumers get a stable identity (no prop-ref churn → no spurious re-renders).\n// Closures capture the stable key and look up the live decorator via `findVi(key)`.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n toggleExpand: () => void\n update: (next: TItem | Partial<TItem> | ((current: TItem) => TItem)) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n return vi ? onSaveClick(vi) : undefined\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onExpandClick(vi)\n },\n update: (next) => controller.updateItem(key, next),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\n// Garbage-collect cache entries for keys that have left the model.\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n }\n)\n\nconst buildSlotProps = (vi: DecoratedViewItem<TItem>) => ({\n item: vi,\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n editing: vi.editing || props.defaultExpanded,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n touch: isTouch.value,\n stateKeyPrefix: rowStateScope.prefixFor(vi.key),\n actions: getActions(vi.key),\n})\n\n// Named unsaved-changes section, registered only when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel && !props.disableUnsaved\n ? { label: props.unsavedSectionLabel, dirty: controller.hasUnsaved.value }\n : []\n)\n\n// Opens invalid rows so a blocked save surfaces WHICH rows are wrong instead of a collapsed red\n// rail. The body is gated on `editing` not `expanded`, so drive `beginEdit` not `expandedKeys`\n// (QA 85050 B4-17). Shared by the exposed `validateAll` and the scope-collector reveal-on-touch.\nconst runValidateAndReveal = (): boolean =>\n validateAllAndReveal(controller, (key) => {\n const vi = viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n })\n\n// Auto-bridge the editor's aggregate validity into the consumer's `validation-scope` collector so a\n// plain `$invalid` save gate blocks (and reveals) a collapsed invalid row. No-op without the prop.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss -- construction-time opt-in, read once\nuseListEditorScopeValidity({\n hasErrors: controller.hasErrors,\n validationScope: props.validationScope,\n validateProvided: props.validate !== undefined,\n reveal: runValidateAndReveal,\n})\n\n// Expose the controller handle via `useTemplateRef<ListEditorHandle<TItem>>`.\ndefineExpose<ListEditorHandle<TItem>>({\n ...controller,\n validateAll: runValidateAndReveal,\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-list-editor\"\n :class=\"[\n `a-list-editor--two-rows-${twoRows}`,\n {\n 'a-list-editor--readonly': readonly,\n 'a-list-editor--disabled': disabled,\n 'a-list-editor--touch': isTouch,\n 'a-list-editor--chips': chips,\n },\n ]\"\n >\n <div\n ref=\"rowsContainer\"\n class=\"a-le-card\"\n >\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n </slot>\n <span\n v-if=\"unsavedCountVisible\"\n class=\"a-le-unsaved-count\"\n :data-unsaved-count=\"unsavedCount\"\n >\n {{ t('common.sortable.pendingChanges', { count: unsavedCount }) }}\n </span>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <template v-else>\n <div\n v-for=\"vi in viewItemsDecorated\"\n :key=\"String(vi.key)\"\n class=\"a-le-row-wrapper\"\n >\n <!-- Interstitial slots render as SIBLINGS of `.a-le-row` (inside this\n wrapper), so consumer content placed between rows never inherits the\n row's unsaved/editing/validation tint. (QA 85050 BUG-04/05) -->\n <slot\n name=\"before-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n\n <div\n :data-id=\"String(vi.key)\"\n role=\"listitem\"\n :tabindex=\"keyboardNav.rowTabindex(vi.key)\"\n class=\"a-le-row\"\n :class=\"{\n 'a-le-row--two-rows': twoRows === 'always',\n 'a-le-row--editing': vi.editing,\n 'a-le-row--expanded': vi.expanded,\n 'a-le-row--unsaved': vi.unsaved,\n 'a-le-row--clickable': isRowClickable(vi),\n [`a-le-row--validation-${vi.validationState}`]: vi.validationState !== null,\n }\"\n @keydown=\"keyboardNav.handleKeydown(vi.key, $event)\"\n >\n <div\n class=\"a-le-row-header\"\n @click=\"onRowClick(vi)\"\n >\n <div class=\"a-le-row-main\">\n <slot\n name=\"item-compact\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span class=\"a-le-title\">\n {{ resolveCompactText(vi.raw) }}\n </span>\n </slot>\n <LeUnsavedLabel\n v-if=\"vi.unsaved\"\n :dot-only=\"chips\"\n />\n </div>\n\n <div\n v-if=\"!chips\"\n class=\"a-le-status\"\n >\n <slot\n name=\"item-status\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <span\n v-if=\"statusField && vi.raw[statusField] != null && vi.raw[statusField] !== ''\"\n class=\"a-le-status-badge\"\n >\n {{ vi.raw[statusField] }}\n </span>\n </slot>\n </div>\n\n <div class=\"a-le-actions\">\n <slot\n name=\"item-actions\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <VBtn\n v-if=\"chips && showDeleteButton && canInteract\"\n icon\n size=\"x-small\"\n variant=\"text\"\n density=\"compact\"\n :active=\"false\"\n class=\"a-le-action a-le-action--chip-close\"\n :aria-label=\"t('common.sortable.delete')\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-close\"\n size=\"14\"\n />\n </VBtn>\n <template v-else>\n <VBtn\n v-if=\"showEditButton && canInteract && !defaultExpanded\"\n :aria-label=\"t('common.sortable.edit')\"\n icon\n size=\"small\"\n variant=\"tonal\"\n color=\"primary\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--edit\"\n @click.stop=\"onEditClick(vi)\"\n >\n <VIcon\n icon=\"mdi-pencil-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.edit')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showDeleteButton && canInteract\"\n :aria-label=\"t('common.sortable.delete')\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n class=\"mx-1 a-le-action a-le-action--delete\"\n @click.stop=\"onDeleteClick(vi)\"\n >\n <VIcon\n icon=\"mdi-trash-can-outline\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.delete')\"\n />\n </VBtn>\n <VBtn\n v-if=\"showAddAfterAction && canInteract\"\n icon\n size=\"small\"\n variant=\"text\"\n density=\"comfortable\"\n :active=\"false\"\n class=\"mx-1 a-le-action a-le-action--menu\"\n :aria-label=\"t('common.sortable.more')\"\n >\n <VIcon\n icon=\"mdi-dots-vertical\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.more')\"\n />\n <VMenu activator=\"parent\">\n <VList density=\"compact\">\n <VListItem @click=\"onRowAddAfterClick(vi)\">\n <template #prepend>\n <VIcon icon=\"mdi-plus\" />\n </template>\n <VListItemTitle>\n {{ t('common.sortable.addAfter') }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </template>\n </slot>\n </div>\n </div>\n\n <template v-if=\"(vi.editing || defaultExpanded) && $slots.item\">\n <div class=\"a-le-row-body\">\n <div class=\"a-le-form\">\n <slot\n name=\"item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n <slot\n name=\"item-footer\"\n v-bind=\"buildSlotProps(vi)\"\n >\n <div\n v-if=\"showInlineSaveFooter && !defaultExpanded\"\n class=\"a-le-row-footer\"\n >\n <div class=\"a-le-row-footer-spacer\" />\n <VBtn\n variant=\"text\"\n :disabled=\"vi.loading\"\n @click.stop=\"onCancelClick(vi)\"\n >\n {{ t('common.button.cancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n prepend-icon=\"mdi-check\"\n :disabled=\"vi.loading\"\n @click.stop=\"onSaveClick(vi)\"\n >\n {{ t('common.button.save') }}\n </VBtn>\n </div>\n </slot>\n </template>\n\n <div\n v-else-if=\"$slots['item-readonly'] && (readonly || vi.expanded)\"\n class=\"a-le-row-body\"\n >\n <div class=\"a-le-form\">\n <slot\n name=\"item-readonly\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </div>\n </div>\n\n <slot\n name=\"after-item\"\n v-bind=\"buildSlotProps(vi)\"\n />\n </div>\n </template>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../styles/tokens';\n@use '../styles/shared';\n\n// Variant-specific rules, scoped under the AListEditor root.\n.a-list-editor {\n // Chips: 12px left padding (flat) vs 8px in sortable, which reserves drag-handle room.\n &--chips .a-le-row-header {\n padding: 2px 4px 2px 12px;\n gap: 4px;\n min-height: 28px;\n }\n}\n\n// Narrow/mobile layout: taller rows, always-visible actions, status badge dropped for room.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-list-editor {\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n"],"mappings":"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"}