@ozdao/martyrs 0.2.508 → 0.2.510

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 (317) hide show
  1. package/dist/{main-Dq-UfO4G.js → main-DrpgUZcn.js} +2808 -2615
  2. package/dist/main-XJQJFmgj.cjs +11 -0
  3. package/dist/martyrs/src/components/Button/{Button.vue.cjs → Button.vue2.cjs} +2 -2
  4. package/dist/martyrs/src/components/Button/Button.vue2.cjs.map +1 -0
  5. package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +2 -2
  6. package/dist/martyrs/src/components/Button/{Button.vue.cjs.map → Button.vue2.js.map} +1 -1
  7. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.cjs +1 -1
  8. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.cjs.map +1 -1
  9. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js +1 -1
  10. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js.map +1 -1
  11. package/dist/martyrs/src/components/Feed/Carousel.vue.cjs +4 -3
  12. package/dist/martyrs/src/components/Feed/Carousel.vue.cjs.map +1 -1
  13. package/dist/martyrs/src/components/Feed/Carousel.vue.js +5 -4
  14. package/dist/martyrs/src/components/Feed/Carousel.vue.js.map +1 -1
  15. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +1 -1
  16. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  17. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  18. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  19. package/dist/martyrs/src/components/Field/Field.vue.cjs +1 -1
  20. package/dist/martyrs/src/components/Field/Field.vue.cjs.map +1 -1
  21. package/dist/martyrs/src/components/Field/Field.vue.js +1 -1
  22. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
  23. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +3 -3
  24. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs.map +1 -1
  25. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +3 -3
  26. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
  27. package/dist/martyrs/src/components/Tab/{Tab.vue2.cjs → Tab.vue.cjs} +2 -2
  28. package/dist/martyrs/src/components/Tab/{Tab.vue2.js.map → Tab.vue.cjs.map} +1 -1
  29. package/dist/martyrs/src/components/Tab/{Tab.vue2.js → Tab.vue.js} +2 -2
  30. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +1 -0
  31. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +2 -2
  32. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +2 -2
  33. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +2 -2
  34. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +2 -2
  35. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +1 -1
  36. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
  37. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
  38. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
  39. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +17 -11
  40. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs.map +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +18 -12
  42. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js.map +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.cjs +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  47. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +2 -2
  49. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +2 -2
  50. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +2 -2
  51. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +2 -2
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +2 -2
  53. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  55. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +1 -1
  56. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
  57. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  59. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.cjs +1 -1
  60. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  61. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.cjs +1 -1
  62. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  63. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  65. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  66. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  67. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -0
  68. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
  69. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -0
  70. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
  71. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
  72. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
  73. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  74. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  75. package/dist/martyrs/src/modules/globals/globals.client.js +15 -15
  76. package/dist/martyrs/src/modules/globals/globals.client.js.map +1 -1
  77. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  79. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupAuth.vue.cjs +1 -1
  80. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupAuth.vue.js +1 -1
  81. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
  82. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
  83. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +8 -3
  84. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  85. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +8 -3
  86. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  87. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.cjs +121 -107
  88. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.cjs.map +1 -1
  89. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.js +131 -117
  90. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.js.map +1 -1
  91. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +2 -2
  92. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs.map +1 -1
  93. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +2 -2
  94. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js.map +1 -1
  95. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.cjs +1 -1
  96. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.js +1 -1
  97. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +112 -49
  98. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -1
  99. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +121 -58
  100. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js.map +1 -1
  101. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
  102. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
  103. package/dist/martyrs/src/modules/icons/logos/Logotype.vue.cjs +3 -3
  104. package/dist/martyrs/src/modules/icons/logos/Logotype.vue.js +3 -3
  105. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +136 -134
  106. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs.map +1 -1
  107. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js +136 -134
  108. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.js.map +1 -1
  109. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  110. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  111. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +1 -1
  116. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
  117. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +1 -1
  118. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
  119. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
  120. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  121. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  122. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  123. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +1 -1
  124. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
  125. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +1 -1
  126. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
  127. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +1 -1
  128. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +1 -1
  129. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +1 -1
  130. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
  131. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +1 -1
  132. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
  133. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +1 -1
  134. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
  135. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +1 -1
  136. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
  137. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +1 -1
  138. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
  139. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +1 -1
  140. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
  141. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs +1 -1
  142. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  143. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +1 -1
  144. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
  145. package/dist/martyrs/src/modules/music/router/music.cjs +2 -1
  146. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  147. package/dist/martyrs/src/modules/music/router/music.js +2 -1
  148. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  149. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.cjs +1 -1
  150. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
  151. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs +1 -1
  152. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
  153. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs +61 -9
  154. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs.map +1 -1
  155. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +61 -9
  156. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js.map +1 -1
  157. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs +1 -1
  158. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
  159. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
  160. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
  161. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +1 -1
  162. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  163. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +2 -2
  164. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
  165. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
  166. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  167. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.cjs +1 -1
  168. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
  169. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.cjs +1 -1
  170. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
  171. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +2 -1
  172. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs.map +1 -1
  173. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -1
  174. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
  175. package/dist/martyrs/src/modules/orders/orders.client.cjs +36 -44
  176. package/dist/martyrs/src/modules/orders/orders.client.cjs.map +1 -1
  177. package/dist/martyrs/src/modules/orders/orders.client.js +36 -44
  178. package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
  179. package/dist/martyrs/src/modules/orders/store/models/customer.cjs +7 -0
  180. package/dist/martyrs/src/modules/orders/store/models/customer.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/orders/store/models/customer.js +7 -0
  182. package/dist/martyrs/src/modules/orders/store/models/customer.js.map +1 -1
  183. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +1 -1
  184. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  185. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +2 -2
  186. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +2 -2
  187. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  188. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  189. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
  190. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  191. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
  192. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
  193. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  194. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  195. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  196. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  197. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +2 -2
  198. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  199. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs +17 -28
  200. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs.map +1 -1
  201. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js +17 -28
  202. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js.map +1 -1
  203. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  204. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  205. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  206. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  207. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.cjs +1 -1
  208. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
  209. package/dist/martyrs/src/modules/products/components/elements/QuantitySelector.vue.cjs +9 -1
  210. package/dist/martyrs/src/modules/products/components/elements/QuantitySelector.vue.cjs.map +1 -1
  211. package/dist/martyrs/src/modules/products/components/elements/QuantitySelector.vue.js +9 -1
  212. package/dist/martyrs/src/modules/products/components/elements/QuantitySelector.vue.js.map +1 -1
  213. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  214. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  215. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +3 -2
  216. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
  217. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -2
  218. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  219. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +3 -3
  220. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  221. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +3 -3
  222. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  223. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +2 -2
  224. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
  225. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +118 -135
  226. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
  227. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +123 -140
  228. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  229. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
  230. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  231. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
  232. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  233. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.cjs +3 -5
  234. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.cjs.map +1 -1
  235. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js +4 -6
  236. package/dist/martyrs/src/modules/products/components/sections/EditRecommended.vue.js.map +1 -1
  237. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  238. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  239. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.cjs +1 -1
  240. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
  241. package/dist/martyrs/src/modules/products/components/sections/ProductsPopular.vue.cjs +10 -5
  242. package/dist/martyrs/src/modules/products/components/sections/ProductsPopular.vue.cjs.map +1 -1
  243. package/dist/martyrs/src/modules/products/components/sections/ProductsPopular.vue.js +10 -5
  244. package/dist/martyrs/src/modules/products/components/sections/ProductsPopular.vue.js.map +1 -1
  245. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.cjs +6 -3
  246. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.cjs.map +1 -1
  247. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +6 -3
  248. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js.map +1 -1
  249. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +2 -2
  250. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +2 -2
  251. package/dist/martyrs/src/modules/products/store/products.cjs +5 -5
  252. package/dist/martyrs/src/modules/products/store/products.cjs.map +1 -1
  253. package/dist/martyrs/src/modules/products/store/products.js +5 -5
  254. package/dist/martyrs/src/modules/products/store/products.js.map +1 -1
  255. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -2
  256. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +2 -2
  257. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
  258. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  259. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
  260. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
  261. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.cjs +1 -1
  262. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  263. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +2 -2
  264. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +2 -2
  265. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
  266. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  267. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +1 -1
  268. package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +1 -1
  269. package/dist/martyrs.cjs.js +1 -1
  270. package/dist/martyrs.css +1 -1
  271. package/dist/martyrs.es.js +1 -1
  272. package/dist/orders.server.cjs +58 -0
  273. package/dist/orders.server.js +58 -0
  274. package/dist/products.server.cjs +79 -45
  275. package/dist/products.server.js +79 -45
  276. package/dist/style.css +44 -52
  277. package/dist/{web-BXajFCU2.js → web-C5cmb1FH.js} +1 -1
  278. package/dist/{web-DaBwwCQ5.cjs → web-d40xcY_Y.cjs} +1 -1
  279. package/package.json +1 -1
  280. package/src/components/Checkbox/Checkbox.vue +1 -1
  281. package/src/components/Feed/Carousel.vue +3 -1
  282. package/src/components/Feed/Feed.vue +1 -1
  283. package/src/components/Field/Field.vue +5 -0
  284. package/src/components/FieldBig/FieldBig.vue +2 -2
  285. package/src/modules/auth/views/components/pages/ProfileEdit.vue +17 -10
  286. package/src/modules/globals/views/components/layouts/Client.vue +12 -1
  287. package/src/modules/globals/views/components/partials/Footer.centered.vue +338 -0
  288. package/src/modules/globals/views/components/partials/Footer.vue +104 -99
  289. package/src/modules/globals/views/components/partials/Header.vue +1 -1
  290. package/src/modules/globals/views/components/sections/Filters.vue +73 -15
  291. package/src/modules/icons/logos/Logotype.vue +1 -1
  292. package/src/modules/inventory/components/pages/Inventory.vue +126 -119
  293. package/src/modules/orders/components/forms/FormCustomerDetails.vue +51 -0
  294. package/src/modules/orders/middlewares/customers.verifier.js +60 -0
  295. package/src/modules/orders/models/customer.model.js +18 -0
  296. package/src/modules/orders/orders.client.js +36 -44
  297. package/src/modules/orders/store/models/customer.js +7 -0
  298. package/src/modules/organizations/configs/navigation.organization.config.js +17 -26
  299. package/src/modules/products/TASKS.MD +1 -157
  300. package/src/modules/products/components/elements/QuantitySelector.vue +17 -9
  301. package/src/modules/products/components/pages/Product.vue +1 -1
  302. package/src/modules/products/components/pages/Products.vue +148 -175
  303. package/src/modules/products/components/sections/EditRecommended.vue +1 -3
  304. package/src/modules/products/components/sections/ProductsPopular.vue +9 -5
  305. package/src/modules/products/components/sections/ProductsRecommended.vue +4 -1
  306. package/src/modules/products/controllers/configs/products.lookup.config.js +31 -4
  307. package/src/modules/products/controllers/products.controller.js +14 -2
  308. package/src/modules/products/controllers/queries/products.queries.js +46 -43
  309. package/src/modules/products/models/product.model.js +4 -0
  310. package/src/modules/products/store/products.js +5 -5
  311. package/src/styles/base/all.scss +9 -4
  312. package/src/styles/config.scss +10 -0
  313. package/src/styles/responsive.scss +2 -1
  314. package/src/styles/typography.scss +0 -5
  315. package/dist/main-AWSb_d2P.cjs +0 -11
  316. package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
  317. package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +0 -1
@@ -4,7 +4,7 @@ const vue = require("vue");
4
4
  const Loader = require("../Loader/Loader.vue2.cjs");
5
5
  const IconCheckmark = require("../../modules/icons/navigation/IconCheckmark.vue.cjs");
6
6
  const IconCross = require("../../modules/icons/navigation/IconCross.vue.cjs");
7
- ;/* empty css */
7
+ ;/* empty css */
8
8
  const _hoisted_1 = ["disabled"];
9
9
  const _hoisted_2 = {
10
10
  key: 0,
@@ -155,4 +155,4 @@ const _sfc_main = {
155
155
  }
156
156
  };
157
157
  exports.default = _sfc_main;
158
- //# sourceMappingURL=Button.vue.cjs.map
158
+ //# sourceMappingURL=Button.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.vue2.cjs","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <Transition name=\"content\" mode=\"out-in\">\n <!-- Default slot content -->\n <span v-if=\"!loading && !error && !finished || !showLoader\" class=\"button-content\">\n <slot></slot>\n </span>\n <!-- Loading state -->\n <Loader v-else-if=\"loading && !error && showLoader\" class=\"button-content pos-relative pos-t-0 pos-l-0 loading\"/>\n <!-- Success state -->\n <span v-else-if=\"finished && showSucces\" class=\"button-content t-semi t-center w-100 loading t-black\">\n <template v-if=\"text.success\">\n {{ text.success }}\n </template>\n <IconCheckmark v-else class=\"icon\" />\n </span>\n <!-- Error state -->\n <span v-else-if=\"error\" class=\"button-content t-center w-100 error\">\n <template v-if=\"text.error\">\n {{ text.error }}\n </template>\n <IconCross v-else class=\"icon\" />\n </span>\n </Transition>\n \n <!-- Counter -->\n <div v-if=\"counter\" class=\"button-counter flex flex-center\">\n <span>{{ counter }}</span>\n </div>\n </button>\n</template>\n\n<style lang=\"scss\">\nbutton[disabled] {\n opacity: 0.75 !important;\n pointer-events: none !important;\n cursor: default !important;\n color: rgba(var(--dark), 0.33) !important;\n background: rgba(var(--light), 1) !important;\n}\n\na.button {\n text-box: trim-both cap alphabetic;\n}\n\n.button {\n display: flex;\n padding: 0.5rem;\n border-radius: 3rem;\n text-box: trim-both cap alphabetic;\n transform: scale(1);\n opacity: 1;\n align-items: center;\n justify-content: center;\n color: black;\n text-align: center;\n text-transform: uppercase;\n font-size: 1rem;\n letter-spacing: 5%;\n transition: all 0.33s ease;\n\n &:hover {\n cursor: pointer;\n opacity: 0.9;\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n &-small {\n padding: 0.75rem;\n border-radius: 0.5rem;\n height: fit-content;\n }\n\n .button-counter {\n position: absolute;\n right: -8px;\n bottom: -8px;\n background: yellow;\n height: 16px;\n border-radius: 16px;\n width: 16px;\n font-weight: 500;\n text-align: center;\n line-height: 16px;\n font-size: 10px;\n }\n}\n\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.icon {\n width: 1rem;\n height: 1rem;\n}\n\n/* Vue Transitions */\n.content-enter-active,\n.content-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-enter-from {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n}\n\n.content-leave-to {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n}\n\n.content-enter-to,\n.content-leave-from {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n</style>"],"names":["ref"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,UAAM,QAAQ;AAqCd,UAAM,QAAQ;AAEd,UAAM,SAASA,IAAAA,IAAI,IAAI;AACvB,UAAM,QAAQA,IAAAA,IAAI,IAAI;AACtB,UAAM,UAAUA,IAAAA,IAAI,KAAK;AACzB,UAAM,WAAWA,IAAAA,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEnB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACxB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAM;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AACrD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACpB,mBAAS,QAAQ;AACjB,qBAAW,MAAM;AACf,wBAAW;AACX,mBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,UACvD,GAAG,GAAG;AAAA,QACR,OAAO;AACL,sBAAW;AACX,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,QACvD;AAGA,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAQ,GAAI,MAAM,aAAa;AAAA,MAE5E,SAAS,KAAK;AACZ,cAAM,SAAS,GAAG;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,gBAAQ,QAAQ;AAChB,cAAM,QAAQ;AAGd,mBAAW,MAAM;AACf,sBAAW;AAEX,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC5D,GAAG,IAAI;AAAA,MACT;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,7 @@ import { ref, createElementBlock, openBlock, normalizeClass, withModifiers, crea
2
2
  import Loader from "../Loader/Loader.vue2.js";
3
3
  import _sfc_main$1 from "../../modules/icons/navigation/IconCheckmark.vue.js";
4
4
  import _sfc_main$2 from "../../modules/icons/navigation/IconCross.vue.js";
5
- /* empty css */
5
+ /* empty css */
6
6
  const _hoisted_1 = ["disabled"];
7
7
  const _hoisted_2 = {
8
8
  key: 0,
@@ -155,4 +155,4 @@ const _sfc_main = {
155
155
  export {
156
156
  _sfc_main as default
157
157
  };
158
- //# sourceMappingURL=Button.vue.js.map
158
+ //# sourceMappingURL=Button.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.vue.cjs","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <Transition name=\"content\" mode=\"out-in\">\n <!-- Default slot content -->\n <span v-if=\"!loading && !error && !finished || !showLoader\" class=\"button-content\">\n <slot></slot>\n </span>\n <!-- Loading state -->\n <Loader v-else-if=\"loading && !error && showLoader\" class=\"button-content pos-relative pos-t-0 pos-l-0 loading\"/>\n <!-- Success state -->\n <span v-else-if=\"finished && showSucces\" class=\"button-content t-semi t-center w-100 loading t-black\">\n <template v-if=\"text.success\">\n {{ text.success }}\n </template>\n <IconCheckmark v-else class=\"icon\" />\n </span>\n <!-- Error state -->\n <span v-else-if=\"error\" class=\"button-content t-center w-100 error\">\n <template v-if=\"text.error\">\n {{ text.error }}\n </template>\n <IconCross v-else class=\"icon\" />\n </span>\n </Transition>\n \n <!-- Counter -->\n <div v-if=\"counter\" class=\"button-counter flex flex-center\">\n <span>{{ counter }}</span>\n </div>\n </button>\n</template>\n\n<style lang=\"scss\">\nbutton[disabled] {\n opacity: 0.75 !important;\n pointer-events: none !important;\n cursor: default !important;\n color: rgba(var(--dark), 0.33) !important;\n background: rgba(var(--light), 1) !important;\n}\n\na.button {\n text-box: trim-both cap alphabetic;\n}\n\n.button {\n display: flex;\n padding: 0.5rem;\n border-radius: 3rem;\n text-box: trim-both cap alphabetic;\n transform: scale(1);\n opacity: 1;\n align-items: center;\n justify-content: center;\n color: black;\n text-align: center;\n text-transform: uppercase;\n font-size: 1rem;\n letter-spacing: 5%;\n transition: all 0.33s ease;\n\n &:hover {\n cursor: pointer;\n opacity: 0.9;\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n &-small {\n padding: 0.75rem;\n border-radius: 0.5rem;\n height: fit-content;\n }\n\n .button-counter {\n position: absolute;\n right: -8px;\n bottom: -8px;\n background: yellow;\n height: 16px;\n border-radius: 16px;\n width: 16px;\n font-weight: 500;\n text-align: center;\n line-height: 16px;\n font-size: 10px;\n }\n}\n\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.icon {\n width: 1rem;\n height: 1rem;\n}\n\n/* Vue Transitions */\n.content-enter-active,\n.content-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-enter-from {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n}\n\n.content-leave-to {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n}\n\n.content-enter-to,\n.content-leave-from {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n</style>"],"names":["ref"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,UAAM,QAAQ;AAqCd,UAAM,QAAQ;AAEd,UAAM,SAASA,IAAAA,IAAI,IAAI;AACvB,UAAM,QAAQA,IAAAA,IAAI,IAAI;AACtB,UAAM,UAAUA,IAAAA,IAAI,KAAK;AACzB,UAAM,WAAWA,IAAAA,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEnB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACxB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAM;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AACrD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACpB,mBAAS,QAAQ;AACjB,qBAAW,MAAM;AACf,wBAAW;AACX,mBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,UACvD,GAAG,GAAG;AAAA,QACR,OAAO;AACL,sBAAW;AACX,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,QACvD;AAGA,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAQ,GAAI,MAAM,aAAa;AAAA,MAE5E,SAAS,KAAK;AACZ,cAAM,SAAS,GAAG;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,gBAAQ,QAAQ;AAChB,cAAM,QAAQ;AAGd,mBAAW,MAAM;AACf,sBAAW;AAEX,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC5D,GAAG,IAAI;AAAA,MACT;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Button.vue2.js","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\nimport { ref } from 'vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n\nconst props = defineProps({\n submit: {\n type: Function,\n default: async () => { console.log('Button click.') }\n },\n text: {\n type: Object,\n default: () => ({\n success: null,\n error: null\n })\n },\n counter: {\n type: Object\n },\n callback: {\n type: Function,\n default: async () => { console.log('Button callback.') }\n },\n callbackDelay: {\n type: Number,\n default: 750\n },\n showSucces: {\n type: Boolean,\n default: true\n },\n showLoader: {\n type: Boolean,\n default: true\n },\n validation: {\n type: Boolean,\n default: false\n },\n})\n\nconst emits = defineEmits(['error'])\n\nconst button = ref(null)\nconst error = ref(null)\nconst loading = ref(false)\nconst finished = ref(false)\n\nasync function Submit() {\n console.log('click')\n \n button.value.style['pointer-events'] = 'none'\n error.value = null\n loading.value = true\n\n // Функция для сброса состояния кнопки\n const resetButton = () => {\n if (button.value) {\n button.value.style.pointerEvents = 'auto'\n loading.value = false\n finished.value = false\n error.value = null\n }\n }\n\n try {\n await props.submit()\n\n button.value.classList.replace('bg-main', 'bg-second')\n loading.value = false\n\n // Используем функцию сброса состояния кнопки здесь\n if (props.showSucces) { \n finished.value = true\n setTimeout(() => {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }, 500)\n } else {\n resetButton()\n button.value.classList.replace('bg-second', 'bg-main')\n }\n\n // Если есть callback, мы также установим таймер для его вызова\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay)\n\n } catch (err) {\n emits('error', err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке\n button.value.classList.replace('bg-main', 'bg-fourth-nano')\n loading.value = false\n error.value = true\n \n // После задержки снова сбрасываем состояние кнопки\n setTimeout(() => {\n resetButton()\n // Так как класс кнопки был изменен, вернем его в исходное состояние\n button.value.classList.replace('bg-fourth-nano', 'bg-main')\n }, 1330)\n }\n}\n</script>\n\n<template>\n <button \n @click.stop=\"Submit\"\n :disabled=\"validation\"\n ref=\"button\"\n\t\tclass=\"button\"\n :class=\"{ 'button--disabled': loading || validation }\"\n >\n <Transition name=\"content\" mode=\"out-in\">\n <!-- Default slot content -->\n <span v-if=\"!loading && !error && !finished || !showLoader\" class=\"button-content\">\n <slot></slot>\n </span>\n <!-- Loading state -->\n <Loader v-else-if=\"loading && !error && showLoader\" class=\"button-content pos-relative pos-t-0 pos-l-0 loading\"/>\n <!-- Success state -->\n <span v-else-if=\"finished && showSucces\" class=\"button-content t-semi t-center w-100 loading t-black\">\n <template v-if=\"text.success\">\n {{ text.success }}\n </template>\n <IconCheckmark v-else class=\"icon\" />\n </span>\n <!-- Error state -->\n <span v-else-if=\"error\" class=\"button-content t-center w-100 error\">\n <template v-if=\"text.error\">\n {{ text.error }}\n </template>\n <IconCross v-else class=\"icon\" />\n </span>\n </Transition>\n \n <!-- Counter -->\n <div v-if=\"counter\" class=\"button-counter flex flex-center\">\n <span>{{ counter }}</span>\n </div>\n </button>\n</template>\n\n<style lang=\"scss\">\nbutton[disabled] {\n opacity: 0.75 !important;\n pointer-events: none !important;\n cursor: default !important;\n color: rgba(var(--dark), 0.33) !important;\n background: rgba(var(--light), 1) !important;\n}\n\na.button {\n text-box: trim-both cap alphabetic;\n}\n\n.button {\n display: flex;\n padding: 0.5rem;\n border-radius: 3rem;\n text-box: trim-both cap alphabetic;\n transform: scale(1);\n opacity: 1;\n align-items: center;\n justify-content: center;\n color: black;\n text-align: center;\n text-transform: uppercase;\n font-size: 1rem;\n letter-spacing: 5%;\n transition: all 0.33s ease;\n\n &:hover {\n cursor: pointer;\n opacity: 0.9;\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n &-small {\n padding: 0.75rem;\n border-radius: 0.5rem;\n height: fit-content;\n }\n\n .button-counter {\n position: absolute;\n right: -8px;\n bottom: -8px;\n background: yellow;\n height: 16px;\n border-radius: 16px;\n width: 16px;\n font-weight: 500;\n text-align: center;\n line-height: 16px;\n font-size: 10px;\n }\n}\n\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.icon {\n width: 1rem;\n height: 1rem;\n}\n\n/* Vue Transitions */\n.content-enter-active,\n.content-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-enter-from {\n opacity: 0;\n transform: translateY(8px) scale(0.95);\n}\n\n.content-leave-to {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n}\n\n.content-enter-to,\n.content-leave-from {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,UAAM,QAAQ;AAqCd,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAI,IAAI;AACvB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,WAAW,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEnB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACxB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAM;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AACrD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACpB,mBAAS,QAAQ;AACjB,qBAAW,MAAM;AACf,wBAAW;AACX,mBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,UACvD,GAAG,GAAG;AAAA,QACR,OAAO;AACL,sBAAW;AACX,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AAAA,QACvD;AAGA,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAQ,GAAI,MAAM,aAAa;AAAA,MAE5E,SAAS,KAAK;AACZ,cAAM,SAAS,GAAG;AAElB,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,gBAAQ,QAAQ;AAChB,cAAM,QAAQ;AAGd,mBAAW,MAAM;AACf,sBAAW;AAEX,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC5D,GAAG,IAAI;AAAA,MACT;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -66,7 +66,7 @@ const _sfc_main = {
66
66
  checked: Array.isArray(__props.radio) ? __props.radio.includes(__props.value) : __props.radio
67
67
  }, null, 40, _hoisted_3),
68
68
  vue.createElementVNode("div", {
69
- class: vue.normalizeClass(["cursor-pointer mn-l-thin flex-center", {
69
+ class: vue.normalizeClass(["cursor-pointer mn-l-thin flex-center field-wrapper", {
70
70
  "transition-elastic pd-thin h-2r w-4r radius-extra": __props.mode === "switch",
71
71
  "w-2r h-2r radius-small": __props.mode === "checkbox",
72
72
  "bg-dark": !(Array.isArray(__props.radio) ? __props.radio.includes(__props.value) : __props.radio) && __props.theme === "dark" && __props.mode === "switch",
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.vue.cjs","sources":["../../../../../src/components/Checkbox/Checkbox.vue"],"sourcesContent":["<script setup>\n import { ref, watch, computed } from 'vue'\n\n import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n const props = defineProps({\n label: String,\n name: String,\n value: String,\n radio: {\n type: [Array, Boolean, Object],\n default: () => []\n },\n theme: {\n type: String,\n default: \"light\"\n },\n mode: {\n type: String,\n default: \"switch\",\n validator: (v) => [\"switch\", \"checkbox\"].includes(v)\n }\n })\n const emit = defineEmits(['update:radio'])\n const updateInputText = (event) => {\n if (Array.isArray(props.radio)) {\n let newRadio = [...props.radio]; // создаем копию массива для иммутабельности\n if (event.target.checked) {\n newRadio.push(props.value);\n } else {\n const index = newRadio.indexOf(props.value);\n if (index !== -1) {\n newRadio.splice(index, 1);\n }\n }\n emit('update:radio', newRadio);\n } else if (typeof props.radio === 'boolean') {\n emit('update:radio', event.target.checked);\n }\n }\n</script>\n<template>\n <label class=\"flex-v-center flex-nowrap flex\">\n <div v-if=\"label\" class=\"mn-r-auto t-transp mn-r-small\">\n <span>{{label}}</span>\n </div>\n <input \n @change=\"updateInputText\"\n class=\"round radiobutton\" \n type=\"checkbox\" \n :name=\"name\" \n :value=\"value\"\n :checked=\"Array.isArray(radio) ? radio.includes(value) : radio\"\n > \n <div \n class=\"cursor-pointer mn-l-thin flex-center\"\n :class=\"{\n 'transition-elastic pd-thin h-2r w-4r radius-extra': mode === 'switch',\n 'w-2r h-2r radius-small': mode === 'checkbox',\n 'bg-dark': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'dark' && mode === 'switch',\n 'br-dark': theme === 'dark' && mode === 'checkbox',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'switch',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'checkbox','bg-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'switch',\n 'bg-main br-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'checkbox',\n }\"\n >\n <!-- Switch toggle circle -->\n <div \n v-if=\"mode === 'switch'\"\n class=\"transition-linear w-1r h-1r radius-extra bg-white\"\n :class=\"{\n 'mn-r-auto': !(Array.isArray(radio) ? radio.includes(value) : radio),\n 'mn-l-auto': Array.isArray(radio) ? radio.includes(value) : radio,\n }\"\n />\n <!-- Checkbox checkmark -->\n <span \n v-else-if=\"mode === 'checkbox' && (Array.isArray(radio) ? radio.includes(value) : radio)\"\n class=\"t-white w-100 h-100 flex flex-center\"\n >\n <IconCheckmark class=\"i-medium\" fill=\"rgb(var(--white))\" />\n </span>\n </div>\n </label>\n</template>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKE,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,kBAAkB,CAAC,UAAU;AACjC,UAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,YAAI,WAAW,CAAC,GAAG,MAAM,KAAK;AAC9B,YAAI,MAAM,OAAO,SAAS;AACxB,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAC1C,cAAI,UAAU,IAAI;AAChB,qBAAS,OAAO,OAAO,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,WAAW,OAAO,MAAM,UAAU,WAAW;AAC3C,aAAK,gBAAgB,MAAM,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Checkbox.vue.cjs","sources":["../../../../../src/components/Checkbox/Checkbox.vue"],"sourcesContent":["<script setup>\n import { ref, watch, computed } from 'vue'\n\n import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n const props = defineProps({\n label: String,\n name: String,\n value: String,\n radio: {\n type: [Array, Boolean, Object],\n default: () => []\n },\n theme: {\n type: String,\n default: \"light\"\n },\n mode: {\n type: String,\n default: \"switch\",\n validator: (v) => [\"switch\", \"checkbox\"].includes(v)\n }\n })\n const emit = defineEmits(['update:radio'])\n const updateInputText = (event) => {\n if (Array.isArray(props.radio)) {\n let newRadio = [...props.radio]; // создаем копию массива для иммутабельности\n if (event.target.checked) {\n newRadio.push(props.value);\n } else {\n const index = newRadio.indexOf(props.value);\n if (index !== -1) {\n newRadio.splice(index, 1);\n }\n }\n emit('update:radio', newRadio);\n } else if (typeof props.radio === 'boolean') {\n emit('update:radio', event.target.checked);\n }\n }\n</script>\n<template>\n <label class=\"flex-v-center flex-nowrap flex\">\n <div v-if=\"label\" class=\"mn-r-auto t-transp mn-r-small\">\n <span>{{label}}</span>\n </div>\n <input \n @change=\"updateInputText\"\n class=\"round radiobutton\" \n type=\"checkbox\" \n :name=\"name\" \n :value=\"value\"\n :checked=\"Array.isArray(radio) ? radio.includes(value) : radio\"\n > \n <div \n class=\"cursor-pointer mn-l-thin flex-center field-wrapper\"\n :class=\"{\n 'transition-elastic pd-thin h-2r w-4r radius-extra': mode === 'switch',\n 'w-2r h-2r radius-small': mode === 'checkbox',\n 'bg-dark': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'dark' && mode === 'switch',\n 'br-dark': theme === 'dark' && mode === 'checkbox',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'switch',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'checkbox','bg-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'switch',\n 'bg-main br-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'checkbox',\n }\"\n >\n <!-- Switch toggle circle -->\n <div \n v-if=\"mode === 'switch'\"\n class=\"transition-linear w-1r h-1r radius-extra bg-white\"\n :class=\"{\n 'mn-r-auto': !(Array.isArray(radio) ? radio.includes(value) : radio),\n 'mn-l-auto': Array.isArray(radio) ? radio.includes(value) : radio,\n }\"\n />\n <!-- Checkbox checkmark -->\n <span \n v-else-if=\"mode === 'checkbox' && (Array.isArray(radio) ? radio.includes(value) : radio)\"\n class=\"t-white w-100 h-100 flex flex-center\"\n >\n <IconCheckmark class=\"i-medium\" fill=\"rgb(var(--white))\" />\n </span>\n </div>\n </label>\n</template>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKE,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,kBAAkB,CAAC,UAAU;AACjC,UAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,YAAI,WAAW,CAAC,GAAG,MAAM,KAAK;AAC9B,YAAI,MAAM,OAAO,SAAS;AACxB,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAC1C,cAAI,UAAU,IAAI;AAChB,qBAAS,OAAO,OAAO,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,WAAW,OAAO,MAAM,UAAU,WAAW;AAC3C,aAAK,gBAAgB,MAAM,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -64,7 +64,7 @@ const _sfc_main = {
64
64
  checked: Array.isArray(__props.radio) ? __props.radio.includes(__props.value) : __props.radio
65
65
  }, null, 40, _hoisted_3),
66
66
  createElementVNode("div", {
67
- class: normalizeClass(["cursor-pointer mn-l-thin flex-center", {
67
+ class: normalizeClass(["cursor-pointer mn-l-thin flex-center field-wrapper", {
68
68
  "transition-elastic pd-thin h-2r w-4r radius-extra": __props.mode === "switch",
69
69
  "w-2r h-2r radius-small": __props.mode === "checkbox",
70
70
  "bg-dark": !(Array.isArray(__props.radio) ? __props.radio.includes(__props.value) : __props.radio) && __props.theme === "dark" && __props.mode === "switch",
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.vue.js","sources":["../../../../../src/components/Checkbox/Checkbox.vue"],"sourcesContent":["<script setup>\n import { ref, watch, computed } from 'vue'\n\n import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n const props = defineProps({\n label: String,\n name: String,\n value: String,\n radio: {\n type: [Array, Boolean, Object],\n default: () => []\n },\n theme: {\n type: String,\n default: \"light\"\n },\n mode: {\n type: String,\n default: \"switch\",\n validator: (v) => [\"switch\", \"checkbox\"].includes(v)\n }\n })\n const emit = defineEmits(['update:radio'])\n const updateInputText = (event) => {\n if (Array.isArray(props.radio)) {\n let newRadio = [...props.radio]; // создаем копию массива для иммутабельности\n if (event.target.checked) {\n newRadio.push(props.value);\n } else {\n const index = newRadio.indexOf(props.value);\n if (index !== -1) {\n newRadio.splice(index, 1);\n }\n }\n emit('update:radio', newRadio);\n } else if (typeof props.radio === 'boolean') {\n emit('update:radio', event.target.checked);\n }\n }\n</script>\n<template>\n <label class=\"flex-v-center flex-nowrap flex\">\n <div v-if=\"label\" class=\"mn-r-auto t-transp mn-r-small\">\n <span>{{label}}</span>\n </div>\n <input \n @change=\"updateInputText\"\n class=\"round radiobutton\" \n type=\"checkbox\" \n :name=\"name\" \n :value=\"value\"\n :checked=\"Array.isArray(radio) ? radio.includes(value) : radio\"\n > \n <div \n class=\"cursor-pointer mn-l-thin flex-center\"\n :class=\"{\n 'transition-elastic pd-thin h-2r w-4r radius-extra': mode === 'switch',\n 'w-2r h-2r radius-small': mode === 'checkbox',\n 'bg-dark': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'dark' && mode === 'switch',\n 'br-dark': theme === 'dark' && mode === 'checkbox',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'switch',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'checkbox','bg-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'switch',\n 'bg-main br-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'checkbox',\n }\"\n >\n <!-- Switch toggle circle -->\n <div \n v-if=\"mode === 'switch'\"\n class=\"transition-linear w-1r h-1r radius-extra bg-white\"\n :class=\"{\n 'mn-r-auto': !(Array.isArray(radio) ? radio.includes(value) : radio),\n 'mn-l-auto': Array.isArray(radio) ? radio.includes(value) : radio,\n }\"\n />\n <!-- Checkbox checkmark -->\n <span \n v-else-if=\"mode === 'checkbox' && (Array.isArray(radio) ? radio.includes(value) : radio)\"\n class=\"t-white w-100 h-100 flex flex-center\"\n >\n <IconCheckmark class=\"i-medium\" fill=\"rgb(var(--white))\" />\n </span>\n </div>\n </label>\n</template>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKE,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,kBAAkB,CAAC,UAAU;AACjC,UAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,YAAI,WAAW,CAAC,GAAG,MAAM,KAAK;AAC9B,YAAI,MAAM,OAAO,SAAS;AACxB,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAC1C,cAAI,UAAU,IAAI;AAChB,qBAAS,OAAO,OAAO,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,WAAW,OAAO,MAAM,UAAU,WAAW;AAC3C,aAAK,gBAAgB,MAAM,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Checkbox.vue.js","sources":["../../../../../src/components/Checkbox/Checkbox.vue"],"sourcesContent":["<script setup>\n import { ref, watch, computed } from 'vue'\n\n import IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n const props = defineProps({\n label: String,\n name: String,\n value: String,\n radio: {\n type: [Array, Boolean, Object],\n default: () => []\n },\n theme: {\n type: String,\n default: \"light\"\n },\n mode: {\n type: String,\n default: \"switch\",\n validator: (v) => [\"switch\", \"checkbox\"].includes(v)\n }\n })\n const emit = defineEmits(['update:radio'])\n const updateInputText = (event) => {\n if (Array.isArray(props.radio)) {\n let newRadio = [...props.radio]; // создаем копию массива для иммутабельности\n if (event.target.checked) {\n newRadio.push(props.value);\n } else {\n const index = newRadio.indexOf(props.value);\n if (index !== -1) {\n newRadio.splice(index, 1);\n }\n }\n emit('update:radio', newRadio);\n } else if (typeof props.radio === 'boolean') {\n emit('update:radio', event.target.checked);\n }\n }\n</script>\n<template>\n <label class=\"flex-v-center flex-nowrap flex\">\n <div v-if=\"label\" class=\"mn-r-auto t-transp mn-r-small\">\n <span>{{label}}</span>\n </div>\n <input \n @change=\"updateInputText\"\n class=\"round radiobutton\" \n type=\"checkbox\" \n :name=\"name\" \n :value=\"value\"\n :checked=\"Array.isArray(radio) ? radio.includes(value) : radio\"\n > \n <div \n class=\"cursor-pointer mn-l-thin flex-center field-wrapper\"\n :class=\"{\n 'transition-elastic pd-thin h-2r w-4r radius-extra': mode === 'switch',\n 'w-2r h-2r radius-small': mode === 'checkbox',\n 'bg-dark': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'dark' && mode === 'switch',\n 'br-dark': theme === 'dark' && mode === 'checkbox',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'switch',\n 'bg-light': !(Array.isArray(radio) ? radio.includes(value) : radio) && theme === 'light' && mode === 'checkbox','bg-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'switch',\n 'bg-main br-main': (Array.isArray(radio) ? radio.includes(value) : radio) && mode === 'checkbox',\n }\"\n >\n <!-- Switch toggle circle -->\n <div \n v-if=\"mode === 'switch'\"\n class=\"transition-linear w-1r h-1r radius-extra bg-white\"\n :class=\"{\n 'mn-r-auto': !(Array.isArray(radio) ? radio.includes(value) : radio),\n 'mn-l-auto': Array.isArray(radio) ? radio.includes(value) : radio,\n }\"\n />\n <!-- Checkbox checkmark -->\n <span \n v-else-if=\"mode === 'checkbox' && (Array.isArray(radio) ? radio.includes(value) : radio)\"\n class=\"t-white w-100 h-100 flex flex-center\"\n >\n <IconCheckmark class=\"i-medium\" fill=\"rgb(var(--white))\" />\n </span>\n </div>\n </label>\n</template>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKE,UAAM,QAAQ;AAkBd,UAAM,OAAO;AACb,UAAM,kBAAkB,CAAC,UAAU;AACjC,UAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,YAAI,WAAW,CAAC,GAAG,MAAM,KAAK;AAC9B,YAAI,MAAM,OAAO,SAAS;AACxB,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,QAAQ,SAAS,QAAQ,MAAM,KAAK;AAC1C,cAAI,UAAU,IAAI;AAChB,qBAAS,OAAO,OAAO,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,WAAW,OAAO,MAAM,UAAU,WAAW;AAC3C,aAAK,gBAAgB,MAAM,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -40,9 +40,11 @@ const _sfc_main = {
40
40
  vue.onMounted(async () => {
41
41
  try {
42
42
  entities.value = await props.store.read(props.options);
43
+ isLoading.value = false;
43
44
  } catch (error) {
44
45
  console.error("Error loading entities:", error);
45
46
  entities.value = [];
47
+ isLoading.value = false;
46
48
  } finally {
47
49
  isLoading.value = false;
48
50
  }
@@ -51,8 +53,7 @@ const _sfc_main = {
51
53
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
52
54
  isLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
53
55
  vue.createVNode(Loader.default)
54
- ])) : vue.createCommentVNode("", true),
55
- !isLoading.value && !entities.value.length < 1 ? (vue.openBlock(), vue.createBlock(EmptyState.default, {
56
+ ])) : entities.value.length < 1 ? (vue.openBlock(), vue.createBlock(EmptyState.default, {
56
57
  key: 1,
57
58
  title: __props.states.empty.title,
58
59
  description: __props.states.empty.description,
@@ -91,6 +92,6 @@ const _sfc_main = {
91
92
  };
92
93
  }
93
94
  };
94
- const Carousel = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-fe817eef"]]);
95
+ const Carousel = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-c1b1de8c"]]);
95
96
  exports.default = Carousel;
96
97
  //# sourceMappingURL=Carousel.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.vue.cjs","sources":["../../../../../src/components/Feed/Carousel.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"h-20r radius-semi pos-relative w-100 bg-light\">\n <Loader />\n </div>\n <!-- Empty State -->\n <EmptyState\n v-if=\"!isLoading && !entities.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n <!-- Slider with loaded entities -->\n <Slider v-else :showDots=\"showDots\">\n <div \n v-for=\"(entity, key) in entities\" \n :key=\"key\"\n class=\"carousel__slide pd-nano\"\n >\n <transition name=\"fade\" mode=\"out-in\" appear>\n <slot\n :item=\"entity\"\n :user=\"user\"\n ></slot>\n </transition>\n </div>\n </Slider>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nconst props = defineProps({\n showDots: Boolean,\n store: Object,\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n options: Object,\n text: Object,\n user: Object\n})\n\nconst entities = ref([])\nconst isLoading = ref(true)\n\nconst { t } = useI18n({\n messages: props.text\n})\n\nonMounted(async() => {\n try {\n entities.value = await props.store.read(props.options)\n } catch (error) {\n console.error('Error loading entities:', error)\n entities.value = []\n } finally {\n isLoading.value = false\n }\n})\n</script>\n\n<style scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":["ref","useI18n","onMounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,UAAM,QAAQ;AAiBd,UAAM,WAAWA,IAAAA,IAAI,CAAA,CAAE;AACvB,UAAM,YAAYA,IAAAA,IAAI,IAAI;AAE1B,UAAM,EAAE,EAAC,IAAKC,gBAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,IAClB,CAAC;AAEDC,QAAAA,UAAU,YAAW;AACnB,UAAI;AACF,iBAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AAAA,MACvD,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAS,QAAQ,CAAA;AAAA,MACnB,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Carousel.vue.cjs","sources":["../../../../../src/components/Feed/Carousel.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"h-20r radius-semi pos-relative w-100 bg-light\">\n <Loader />\n </div>\n <!-- Empty State -->\n <EmptyState\n v-else-if=\"entities.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n <!-- Slider with loaded entities -->\n <Slider v-else :showDots=\"showDots\">\n <div \n v-for=\"(entity, key) in entities\" \n :key=\"key\"\n class=\"carousel__slide pd-nano\"\n >\n <transition name=\"fade\" mode=\"out-in\" appear>\n <slot\n :item=\"entity\"\n :user=\"user\"\n ></slot>\n </transition>\n </div>\n </Slider>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nconst props = defineProps({\n showDots: Boolean,\n store: Object,\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n options: Object,\n text: Object,\n user: Object\n})\n\nconst entities = ref([])\nconst isLoading = ref(true)\n\nconst { t } = useI18n({\n messages: props.text\n})\n\nonMounted(async() => {\n try {\n entities.value = await props.store.read(props.options)\n isLoading.value = false\n } catch (error) {\n console.error('Error loading entities:', error)\n entities.value = []\n isLoading.value = false\n } finally {\n isLoading.value = false\n }\n})\n</script>\n\n<style scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":["ref","useI18n","onMounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,UAAM,QAAQ;AAiBd,UAAM,WAAWA,IAAAA,IAAI,CAAA,CAAE;AACvB,UAAM,YAAYA,IAAAA,IAAI,IAAI;AAE1B,UAAM,EAAE,EAAC,IAAKC,gBAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,IAClB,CAAC;AAEDC,QAAAA,UAAU,YAAW;AACnB,UAAI;AACF,iBAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AACrD,kBAAU,QAAQ;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAS,QAAQ,CAAA;AACjB,kBAAU,QAAQ;AAAA,MACpB,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { ref, onMounted, createElementBlock, openBlock, createCommentVNode, createBlock, createVNode, normalizeClass, withCtx, Fragment, renderList, Transition, renderSlot } from "vue";
1
+ import { ref, onMounted, createElementBlock, openBlock, createBlock, createVNode, normalizeClass, withCtx, Fragment, renderList, Transition, renderSlot } from "vue";
2
2
  import { useI18n } from "vue-i18n";
3
3
  import Loader from "../Loader/Loader.vue2.js";
4
4
  import _sfc_main$2 from "../Slider/Slider.vue.js";
@@ -38,9 +38,11 @@ const _sfc_main = {
38
38
  onMounted(async () => {
39
39
  try {
40
40
  entities.value = await props.store.read(props.options);
41
+ isLoading.value = false;
41
42
  } catch (error) {
42
43
  console.error("Error loading entities:", error);
43
44
  entities.value = [];
45
+ isLoading.value = false;
44
46
  } finally {
45
47
  isLoading.value = false;
46
48
  }
@@ -49,8 +51,7 @@ const _sfc_main = {
49
51
  return openBlock(), createElementBlock("div", _hoisted_1, [
50
52
  isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
51
53
  createVNode(Loader)
52
- ])) : createCommentVNode("", true),
53
- !isLoading.value && !entities.value.length < 1 ? (openBlock(), createBlock(_sfc_main$1, {
54
+ ])) : entities.value.length < 1 ? (openBlock(), createBlock(_sfc_main$1, {
54
55
  key: 1,
55
56
  title: __props.states.empty.title,
56
57
  description: __props.states.empty.description,
@@ -89,7 +90,7 @@ const _sfc_main = {
89
90
  };
90
91
  }
91
92
  };
92
- const Carousel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-fe817eef"]]);
93
+ const Carousel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c1b1de8c"]]);
93
94
  export {
94
95
  Carousel as default
95
96
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.vue.js","sources":["../../../../../src/components/Feed/Carousel.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"h-20r radius-semi pos-relative w-100 bg-light\">\n <Loader />\n </div>\n <!-- Empty State -->\n <EmptyState\n v-if=\"!isLoading && !entities.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n <!-- Slider with loaded entities -->\n <Slider v-else :showDots=\"showDots\">\n <div \n v-for=\"(entity, key) in entities\" \n :key=\"key\"\n class=\"carousel__slide pd-nano\"\n >\n <transition name=\"fade\" mode=\"out-in\" appear>\n <slot\n :item=\"entity\"\n :user=\"user\"\n ></slot>\n </transition>\n </div>\n </Slider>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nconst props = defineProps({\n showDots: Boolean,\n store: Object,\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n options: Object,\n text: Object,\n user: Object\n})\n\nconst entities = ref([])\nconst isLoading = ref(true)\n\nconst { t } = useI18n({\n messages: props.text\n})\n\nonMounted(async() => {\n try {\n entities.value = await props.store.read(props.options)\n } catch (error) {\n console.error('Error loading entities:', error)\n entities.value = []\n } finally {\n isLoading.value = false\n }\n})\n</script>\n\n<style scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,UAAM,QAAQ;AAiBd,UAAM,WAAW,IAAI,CAAA,CAAE;AACvB,UAAM,YAAY,IAAI,IAAI;AAE1B,UAAM,EAAE,EAAC,IAAK,QAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,IAClB,CAAC;AAED,cAAU,YAAW;AACnB,UAAI;AACF,iBAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AAAA,MACvD,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAS,QAAQ,CAAA;AAAA,MACnB,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Carousel.vue.js","sources":["../../../../../src/components/Feed/Carousel.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"h-20r radius-semi pos-relative w-100 bg-light\">\n <Loader />\n </div>\n <!-- Empty State -->\n <EmptyState\n v-else-if=\"entities.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n <!-- Slider with loaded entities -->\n <Slider v-else :showDots=\"showDots\">\n <div \n v-for=\"(entity, key) in entities\" \n :key=\"key\"\n class=\"carousel__slide pd-nano\"\n >\n <transition name=\"fade\" mode=\"out-in\" appear>\n <slot\n :item=\"entity\"\n :user=\"user\"\n ></slot>\n </transition>\n </div>\n </Slider>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nconst props = defineProps({\n showDots: Boolean,\n store: Object,\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n options: Object,\n text: Object,\n user: Object\n})\n\nconst entities = ref([])\nconst isLoading = ref(true)\n\nconst { t } = useI18n({\n messages: props.text\n})\n\nonMounted(async() => {\n try {\n entities.value = await props.store.read(props.options)\n isLoading.value = false\n } catch (error) {\n console.error('Error loading entities:', error)\n entities.value = []\n isLoading.value = false\n } finally {\n isLoading.value = false\n }\n})\n</script>\n\n<style scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,UAAM,QAAQ;AAiBd,UAAM,WAAW,IAAI,CAAA,CAAE;AACvB,UAAM,YAAY,IAAI,IAAI;AAE1B,UAAM,EAAE,EAAC,IAAK,QAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,IAClB,CAAC;AAED,cAAU,YAAW;AACnB,UAAI;AACF,iBAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AACrD,kBAAU,QAAQ;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAS,QAAQ,CAAA;AACjB,kBAAU,QAAQ;AAAA,MACpB,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -16,7 +16,7 @@ const ButtonDate = require("../../modules/globals/views/components/elements/Butt
16
16
  const _hoisted_1 = {
17
17
  key: 0,
18
18
  style: { "transform": "scale(1)" },
19
- class: "mn-b-thin pos-relative flex-nowrap flex gap-thin"
19
+ class: "mn-b-thin pos-relative z-index-2 pos-relative flex-nowrap flex gap-thin"
20
20
  };
21
21
  const _hoisted_2 = {
22
22
  key: 4,
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.vue.cjs","sources":["../../../../../src/components/Feed/Feed.vue"],"sourcesContent":["<template>\n <div v-if=\"search || date || (sort && !sort.hideButton)\" style=\"transform: scale(1);\" class=\"mn-b-thin pos-relative flex-nowrap flex gap-thin\">\n\n <BlockSearch \n v-if=\"search\"\n :placeholder=\"search.placeholder || 'Search...'\"\n :class=\"search.class || 'bg-light'\"\n @search=\"updateSearch\"\n :autofocus=\"search.autofocus\"\n />\n\n <FiltersBar\n v-if=\"filter\"\n v-model=\"filter.selected\"\n :filters=\"filterConfig\"\n :class=\"filter.class || 'mobile-only'\"\n />\n\n <Dropdown \n v-if=\"date\"\n :label=\"{\n component: ButtonDate,\n props: { date: date }\n }\" \n :class=\"date.class || 'bg-light'\"\n class=\"flex-child flex-child-shrink-0 pd-r-small pd-l-small pd-thin bg-light radius-medium\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <Calendar\n v-model:date=\"date\"\n :locale=\"$i18n.locale\"\n :allowRange=\"true\"\n class=\"radius-medium w-100 o-hidden bg-light\"\n />\n </Dropdown> \n\n <!-- <template\n v-if=\"filter\"\n >\n <div \n :class=\"filter.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <IconFilter @click=\"() => filter.active = !filter.active\" class=\"w-1r h-auto\"/>\n </div>\n\n \n <BottomSheet\n :show=\"filter.active\"\n @toggle=\"() => filter.active = false\"\n class=\"z-index-10 pos-fixed pos-r-0\"\n :class=\"{\n 'pos-t-0': filter.active,\n 'pos-t-100': !filter.active\n }\"\n >\n <BlockFilter\n v-model:filter=\"filter\"\n :options=\"filter.options\"\n @click_filter=\"() => { filter.active = false } \"\n class=\"h-max w-100 pd-small pd-b-5r bg-light\"\n />\n </BottomSheet> \n </template> -->\n\n <Dropdown \n v-if=\"sort && !sort.hideButton\"\n :label=\"{\n component: ButtonSort,\n props: { order: sort.order },\n class: 'w-1r'\n }\" \n :class=\"sort.class || 'bg-light'\"\n class=\"radius-medium aspect-1x1 h-100\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <BlockSorting\n v-model:param=\"sort.param\"\n v-model:order=\"sort.order\"\n :options=\"sort.options\"\n class=\"h-100 pd-small radius-medium t-white bg-black\"\n />\n </Dropdown> \n\n <!-- Actions -->\n <template\n v-if=\"actions.length\"\n >\n <template v-for=\"action in actions\" :key=\"action.key\">\n <div \n :class=\"action.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <component\n :is=\"action.component\"\n @click=\"action.handler\"\n class=\"w-1r h-auto\"\n >\n </component>\n\n </div>\n </template>\n </template>\n </div>\n\n <TransitionGroup \n v-if=\"isLoading && !keepSlotVisible\"\n tag=\"ul\" \n name=\"scaleTransition\" \n class=\"pos-relative z-index-1\"\n :class=\"$attrs.class\"\n >\n <Skeleton\n v-if=\"isLoading && !skeleton?.hide\"\n v-for=\"i in currentLimit\" \n :structure=\"skeleton.structure\"\n :horizontal=\"skeleton.horizontal\"\n :loading=\"skeleton.apply_to_slot\"\n :key=\"'skeleton-' + i\"\n :class=\"replaceClasses('radius-medium bg-light pd-thin flex-child-default o-hidden d-block', skeleton.class)\"\n />\n <Loader v-if=\"isLoading && skeleton?.hide\"/>\n </TransitionGroup>\n\n <TransitionGroup \n tag=\"ul\" \n v-else-if=\"itemsList.length < 1\"\n name=\"feed\"\n >\n <EmptyState\n v-if=\"!isLoading && itemsList.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n </TransitionGroup>\n\n <TransitionGroup \n v-else-if=\"!keepSlotVisible || !isLoading\"\n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n\n <!-- Slot visible with overlay loader -->\n <div v-else class=\"pos-relative\">\n <TransitionGroup \n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n \n <!-- Overlay loader -->\n <div \n v-if=\"isLoading && keepSlotVisible\"\n class=\"pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center bg-white-transp-90 z-index-10\"\n >\n <Loader />\n </div>\n </div>\n\n <button\n v-if=\"showLoadMore && hasMoreItems && itemsList.length > 0 && !isLoadingExtra\"\n @click=\"loadMoreItems\"\n class=\"col-w-100 mn-t-thin w-100 t-black bg-main button\"\n >\n Load More\n </button>\n\n <div v-else key=\"sentinel\" ref=\"sentinel\" class=\"sentinel\"></div> \n\n <div\n v-if=\"isLoadingExtra\"\n class=\"col-w-100 w-100 pos-relative\"\n >\n <Loader/>\n </div>\n \n\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, onUnmounted, watch } from 'vue';\n\nimport SkeletonEvent from '@martyrs/src/modules/icons/skeletons/SkeletonEvent.vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Skeleton from '@martyrs/src/components/Skeleton/Skeleton.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport Dropdown from \"@martyrs/src/components/Dropdown/Dropdown.vue\";\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport BottomSheet from '@martyrs/src/components/BottomSheet/BottomSheet.vue';\n\nimport BlockSearch from '@martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue'\nimport BlockSorting from '@martyrs/src/modules/globals/views/components/blocks/BlockSorting.vue'\nimport BlockFilter from '@martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue'\n\nimport FiltersBar from '@martyrs/src/modules/globals/views/components/sections/Filters.vue'\n\nimport ButtonSort from '@martyrs/src/modules/globals/views/components/elements/ButtonSort.vue'\nimport ButtonDate from '@martyrs/src/modules/globals/views/components/elements/ButtonDate.vue'\n\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue'\n\nconst search = defineModel('search')\nconst sort = defineModel('sort')\nconst filter = defineModel('filter')\nconst date = defineModel('date')\nconst items = defineModel('items')\n\n// Внутреннее хранилище для случая, когда v-model:items не передан\nconst internalItems = ref([])\n\n// Элегантное решение через computed\nconst itemsList = computed({\n get: () => items.value ?? internalItems.value,\n set: (val) => {\n if (items.value !== undefined) {\n items.value = val\n } else {\n internalItems.value = val\n }\n }\n})\n\nconst filterConfig = computed(() => {\n if (!filter.value?.options) return []\n \n return filter.value.options.map(opt => ({\n key: opt.value,\n title: opt.title,\n type: 'options',\n options: opt.options || [],\n defaultValue: null\n }))\n})\n\n// Пропсы\nconst props = defineProps({\n showLoadMore: {\n type: Boolean,\n default: true\n },\n LoadMore: {\n type: Boolean,\n default: true\n },\n search: {\n type: [Boolean, Object],\n default: false\n },\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n actions: {\n type: Array,\n default: () => []\n },\n skeleton: {\n type: Object,\n default: () => ({\n hide: false,\n horizontal: false,\n structure: [\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'large' },\n { block: 'button', size: 'small' }\n ]\n }),\n \n },\n store: {\n type: Object,\n default: () => ({\n read: Function,\n state: Object,\n }),\n },\n external: {\n type: Boolean,\n default: false\n },\n options: {\n type: Object,\n default: () => ({\n category: null,\n limit: 10, \n skip: 0 ,\n owner: null,\n creator: null,\n customer: null,\n user: null,\n status: null,\n period: null,\n contain: null,\n }),\n },\n keepSlotVisible: {\n type: Boolean,\n default: false\n },\n});\n \nconst hasMoreItems = ref(false);\n\nlet isLoading = ref(true);\nlet isLoadingExtra = ref(false);\nlet sentinel = ref(null)\n\nlet currentSkip = ref(props.options.skip ? props.options.skip : 0);\nlet currentLimit = ref(props.options.limit ? props.options.limit : 10);\n\nlet currentSearch = ref('');\nlet isSearching = ref(false);\n\nlet requestId = 0;\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nconst debouncedSearch = debounce((value) => {\n isSearching.value = true;\n currentSearch.value = value;\n currentSkip.value = 0;\n currentLimit.value = 10;\n fetchItems();\n}, 500);\n\nfunction updateSearch(search) {\n debouncedSearch(search);\n}\n\nconst removeNullValues = (obj) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value != null)\n );\n};\n\nconst loadMoreItems = async () => {\n if (!hasMoreItems.value || isLoadingExtra.value) {\n return;\n }\n \n isLoadingExtra.value = true;\n \n const currentRequestId = ++requestId;\n\n currentSkip.value += currentLimit.value;\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = [...itemsList.value, ...data];\n \n } catch (error) {\n console.error('Load more error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoadingExtra.value = false;\n }\n }\n};\n\nconst fetchItems = async () => {\n isLoading.value = true;\n \n const currentRequestId = ++requestId;\n \n if (isSearching.value) {\n itemsList.value = [];\n isSearching.value = false;\n }\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = data;\n \n } catch (error) {\n console.error('Fetch error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n};\n\nwatch(\n [() => props.external, () => date.value, () => ({...sort.value}), () => ({...props.options})],\n ([newExternal, newDate, newSort, newOptions], [oldExternal, oldDate, oldSort, oldOptions]) => {\n if (\n newExternal !== oldExternal ||\n newDate !== oldDate ||\n newSort?.order !== oldSort?.order ||\n newSort?.param !== oldSort?.param ||\n JSON.stringify(newOptions) !== JSON.stringify(oldOptions)\n ) {\n currentSkip.value = 0;\n fetchItems();\n }\n },\n { deep: true }\n);\n\nlet observer = null\n\nonMounted(async () => {\n await fetchItems()\n\n if (typeof window !== 'undefined' && !props.showLoadMore && props.LoadMore) {\n observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMoreItems()\n }\n })\n\n if (sentinel.value) observer.observe(sentinel.value)\n }\n});\n\nonUnmounted(() => {\n if (observer) {\n observer.disconnect();\n }\n});\n</script>\n\n<style>\n.feed-move,\n.feed-enter-active,\n.feed-leave-active {\n transition: all 0.5s ease;\n}\n\n.feed-enter-from,\n.feed-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n\n.feed-leave-active {\n position: absolute;\n}\n</style>"],"names":["_useModel","ref","computed","search","watch","onMounted","onUnmounted"],"mappings":"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"}
1
+ {"version":3,"file":"Feed.vue.cjs","sources":["../../../../../src/components/Feed/Feed.vue"],"sourcesContent":["<template>\n <div v-if=\"search || date || (sort && !sort.hideButton)\" style=\"transform: scale(1);\" class=\"mn-b-thin pos-relative z-index-2 pos-relative flex-nowrap flex gap-thin\">\n\n <BlockSearch \n v-if=\"search\"\n :placeholder=\"search.placeholder || 'Search...'\"\n :class=\"search.class || 'bg-light'\"\n @search=\"updateSearch\"\n :autofocus=\"search.autofocus\"\n />\n\n <FiltersBar\n v-if=\"filter\"\n v-model=\"filter.selected\"\n :filters=\"filterConfig\"\n :class=\"filter.class || 'mobile-only'\"\n />\n\n <Dropdown \n v-if=\"date\"\n :label=\"{\n component: ButtonDate,\n props: { date: date }\n }\" \n :class=\"date.class || 'bg-light'\"\n class=\"flex-child flex-child-shrink-0 pd-r-small pd-l-small pd-thin bg-light radius-medium\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <Calendar\n v-model:date=\"date\"\n :locale=\"$i18n.locale\"\n :allowRange=\"true\"\n class=\"radius-medium w-100 o-hidden bg-light\"\n />\n </Dropdown> \n\n <!-- <template\n v-if=\"filter\"\n >\n <div \n :class=\"filter.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <IconFilter @click=\"() => filter.active = !filter.active\" class=\"w-1r h-auto\"/>\n </div>\n\n \n <BottomSheet\n :show=\"filter.active\"\n @toggle=\"() => filter.active = false\"\n class=\"z-index-10 pos-fixed pos-r-0\"\n :class=\"{\n 'pos-t-0': filter.active,\n 'pos-t-100': !filter.active\n }\"\n >\n <BlockFilter\n v-model:filter=\"filter\"\n :options=\"filter.options\"\n @click_filter=\"() => { filter.active = false } \"\n class=\"h-max w-100 pd-small pd-b-5r bg-light\"\n />\n </BottomSheet> \n </template> -->\n\n <Dropdown \n v-if=\"sort && !sort.hideButton\"\n :label=\"{\n component: ButtonSort,\n props: { order: sort.order },\n class: 'w-1r'\n }\" \n :class=\"sort.class || 'bg-light'\"\n class=\"radius-medium aspect-1x1 h-100\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <BlockSorting\n v-model:param=\"sort.param\"\n v-model:order=\"sort.order\"\n :options=\"sort.options\"\n class=\"h-100 pd-small radius-medium t-white bg-black\"\n />\n </Dropdown> \n\n <!-- Actions -->\n <template\n v-if=\"actions.length\"\n >\n <template v-for=\"action in actions\" :key=\"action.key\">\n <div \n :class=\"action.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <component\n :is=\"action.component\"\n @click=\"action.handler\"\n class=\"w-1r h-auto\"\n >\n </component>\n\n </div>\n </template>\n </template>\n </div>\n\n <TransitionGroup \n v-if=\"isLoading && !keepSlotVisible\"\n tag=\"ul\" \n name=\"scaleTransition\" \n class=\"pos-relative z-index-1\"\n :class=\"$attrs.class\"\n >\n <Skeleton\n v-if=\"isLoading && !skeleton?.hide\"\n v-for=\"i in currentLimit\" \n :structure=\"skeleton.structure\"\n :horizontal=\"skeleton.horizontal\"\n :loading=\"skeleton.apply_to_slot\"\n :key=\"'skeleton-' + i\"\n :class=\"replaceClasses('radius-medium bg-light pd-thin flex-child-default o-hidden d-block', skeleton.class)\"\n />\n <Loader v-if=\"isLoading && skeleton?.hide\"/>\n </TransitionGroup>\n\n <TransitionGroup \n tag=\"ul\" \n v-else-if=\"itemsList.length < 1\"\n name=\"feed\"\n >\n <EmptyState\n v-if=\"!isLoading && itemsList.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n </TransitionGroup>\n\n <TransitionGroup \n v-else-if=\"!keepSlotVisible || !isLoading\"\n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n\n <!-- Slot visible with overlay loader -->\n <div v-else class=\"pos-relative\">\n <TransitionGroup \n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n \n <!-- Overlay loader -->\n <div \n v-if=\"isLoading && keepSlotVisible\"\n class=\"pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center bg-white-transp-90 z-index-10\"\n >\n <Loader />\n </div>\n </div>\n\n <button\n v-if=\"showLoadMore && hasMoreItems && itemsList.length > 0 && !isLoadingExtra\"\n @click=\"loadMoreItems\"\n class=\"col-w-100 mn-t-thin w-100 t-black bg-main button\"\n >\n Load More\n </button>\n\n <div v-else key=\"sentinel\" ref=\"sentinel\" class=\"sentinel\"></div> \n\n <div\n v-if=\"isLoadingExtra\"\n class=\"col-w-100 w-100 pos-relative\"\n >\n <Loader/>\n </div>\n \n\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, onUnmounted, watch } from 'vue';\n\nimport SkeletonEvent from '@martyrs/src/modules/icons/skeletons/SkeletonEvent.vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Skeleton from '@martyrs/src/components/Skeleton/Skeleton.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport Dropdown from \"@martyrs/src/components/Dropdown/Dropdown.vue\";\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport BottomSheet from '@martyrs/src/components/BottomSheet/BottomSheet.vue';\n\nimport BlockSearch from '@martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue'\nimport BlockSorting from '@martyrs/src/modules/globals/views/components/blocks/BlockSorting.vue'\nimport BlockFilter from '@martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue'\n\nimport FiltersBar from '@martyrs/src/modules/globals/views/components/sections/Filters.vue'\n\nimport ButtonSort from '@martyrs/src/modules/globals/views/components/elements/ButtonSort.vue'\nimport ButtonDate from '@martyrs/src/modules/globals/views/components/elements/ButtonDate.vue'\n\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue'\n\nconst search = defineModel('search')\nconst sort = defineModel('sort')\nconst filter = defineModel('filter')\nconst date = defineModel('date')\nconst items = defineModel('items')\n\n// Внутреннее хранилище для случая, когда v-model:items не передан\nconst internalItems = ref([])\n\n// Элегантное решение через computed\nconst itemsList = computed({\n get: () => items.value ?? internalItems.value,\n set: (val) => {\n if (items.value !== undefined) {\n items.value = val\n } else {\n internalItems.value = val\n }\n }\n})\n\nconst filterConfig = computed(() => {\n if (!filter.value?.options) return []\n \n return filter.value.options.map(opt => ({\n key: opt.value,\n title: opt.title,\n type: 'options',\n options: opt.options || [],\n defaultValue: null\n }))\n})\n\n// Пропсы\nconst props = defineProps({\n showLoadMore: {\n type: Boolean,\n default: true\n },\n LoadMore: {\n type: Boolean,\n default: true\n },\n search: {\n type: [Boolean, Object],\n default: false\n },\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n actions: {\n type: Array,\n default: () => []\n },\n skeleton: {\n type: Object,\n default: () => ({\n hide: false,\n horizontal: false,\n structure: [\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'large' },\n { block: 'button', size: 'small' }\n ]\n }),\n \n },\n store: {\n type: Object,\n default: () => ({\n read: Function,\n state: Object,\n }),\n },\n external: {\n type: Boolean,\n default: false\n },\n options: {\n type: Object,\n default: () => ({\n category: null,\n limit: 10, \n skip: 0 ,\n owner: null,\n creator: null,\n customer: null,\n user: null,\n status: null,\n period: null,\n contain: null,\n }),\n },\n keepSlotVisible: {\n type: Boolean,\n default: false\n },\n});\n \nconst hasMoreItems = ref(false);\n\nlet isLoading = ref(true);\nlet isLoadingExtra = ref(false);\nlet sentinel = ref(null)\n\nlet currentSkip = ref(props.options.skip ? props.options.skip : 0);\nlet currentLimit = ref(props.options.limit ? props.options.limit : 10);\n\nlet currentSearch = ref('');\nlet isSearching = ref(false);\n\nlet requestId = 0;\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nconst debouncedSearch = debounce((value) => {\n isSearching.value = true;\n currentSearch.value = value;\n currentSkip.value = 0;\n currentLimit.value = 10;\n fetchItems();\n}, 500);\n\nfunction updateSearch(search) {\n debouncedSearch(search);\n}\n\nconst removeNullValues = (obj) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value != null)\n );\n};\n\nconst loadMoreItems = async () => {\n if (!hasMoreItems.value || isLoadingExtra.value) {\n return;\n }\n \n isLoadingExtra.value = true;\n \n const currentRequestId = ++requestId;\n\n currentSkip.value += currentLimit.value;\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = [...itemsList.value, ...data];\n \n } catch (error) {\n console.error('Load more error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoadingExtra.value = false;\n }\n }\n};\n\nconst fetchItems = async () => {\n isLoading.value = true;\n \n const currentRequestId = ++requestId;\n \n if (isSearching.value) {\n itemsList.value = [];\n isSearching.value = false;\n }\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = data;\n \n } catch (error) {\n console.error('Fetch error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n};\n\nwatch(\n [() => props.external, () => date.value, () => ({...sort.value}), () => ({...props.options})],\n ([newExternal, newDate, newSort, newOptions], [oldExternal, oldDate, oldSort, oldOptions]) => {\n if (\n newExternal !== oldExternal ||\n newDate !== oldDate ||\n newSort?.order !== oldSort?.order ||\n newSort?.param !== oldSort?.param ||\n JSON.stringify(newOptions) !== JSON.stringify(oldOptions)\n ) {\n currentSkip.value = 0;\n fetchItems();\n }\n },\n { deep: true }\n);\n\nlet observer = null\n\nonMounted(async () => {\n await fetchItems()\n\n if (typeof window !== 'undefined' && !props.showLoadMore && props.LoadMore) {\n observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMoreItems()\n }\n })\n\n if (sentinel.value) observer.observe(sentinel.value)\n }\n});\n\nonUnmounted(() => {\n if (observer) {\n observer.disconnect();\n }\n});\n</script>\n\n<style>\n.feed-move,\n.feed-enter-active,\n.feed-leave-active {\n transition: all 0.5s ease;\n}\n\n.feed-enter-from,\n.feed-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n\n.feed-leave-active {\n position: absolute;\n}\n</style>"],"names":["_useModel","ref","computed","search","watch","onMounted","onUnmounted"],"mappings":"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"}
@@ -14,7 +14,7 @@ import _sfc_main$3 from "../../modules/globals/views/components/elements/ButtonD
14
14
  const _hoisted_1 = {
15
15
  key: 0,
16
16
  style: { "transform": "scale(1)" },
17
- class: "mn-b-thin pos-relative flex-nowrap flex gap-thin"
17
+ class: "mn-b-thin pos-relative z-index-2 pos-relative flex-nowrap flex gap-thin"
18
18
  };
19
19
  const _hoisted_2 = {
20
20
  key: 4,
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.vue.js","sources":["../../../../../src/components/Feed/Feed.vue"],"sourcesContent":["<template>\n <div v-if=\"search || date || (sort && !sort.hideButton)\" style=\"transform: scale(1);\" class=\"mn-b-thin pos-relative flex-nowrap flex gap-thin\">\n\n <BlockSearch \n v-if=\"search\"\n :placeholder=\"search.placeholder || 'Search...'\"\n :class=\"search.class || 'bg-light'\"\n @search=\"updateSearch\"\n :autofocus=\"search.autofocus\"\n />\n\n <FiltersBar\n v-if=\"filter\"\n v-model=\"filter.selected\"\n :filters=\"filterConfig\"\n :class=\"filter.class || 'mobile-only'\"\n />\n\n <Dropdown \n v-if=\"date\"\n :label=\"{\n component: ButtonDate,\n props: { date: date }\n }\" \n :class=\"date.class || 'bg-light'\"\n class=\"flex-child flex-child-shrink-0 pd-r-small pd-l-small pd-thin bg-light radius-medium\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <Calendar\n v-model:date=\"date\"\n :locale=\"$i18n.locale\"\n :allowRange=\"true\"\n class=\"radius-medium w-100 o-hidden bg-light\"\n />\n </Dropdown> \n\n <!-- <template\n v-if=\"filter\"\n >\n <div \n :class=\"filter.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <IconFilter @click=\"() => filter.active = !filter.active\" class=\"w-1r h-auto\"/>\n </div>\n\n \n <BottomSheet\n :show=\"filter.active\"\n @toggle=\"() => filter.active = false\"\n class=\"z-index-10 pos-fixed pos-r-0\"\n :class=\"{\n 'pos-t-0': filter.active,\n 'pos-t-100': !filter.active\n }\"\n >\n <BlockFilter\n v-model:filter=\"filter\"\n :options=\"filter.options\"\n @click_filter=\"() => { filter.active = false } \"\n class=\"h-max w-100 pd-small pd-b-5r bg-light\"\n />\n </BottomSheet> \n </template> -->\n\n <Dropdown \n v-if=\"sort && !sort.hideButton\"\n :label=\"{\n component: ButtonSort,\n props: { order: sort.order },\n class: 'w-1r'\n }\" \n :class=\"sort.class || 'bg-light'\"\n class=\"radius-medium aspect-1x1 h-100\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <BlockSorting\n v-model:param=\"sort.param\"\n v-model:order=\"sort.order\"\n :options=\"sort.options\"\n class=\"h-100 pd-small radius-medium t-white bg-black\"\n />\n </Dropdown> \n\n <!-- Actions -->\n <template\n v-if=\"actions.length\"\n >\n <template v-for=\"action in actions\" :key=\"action.key\">\n <div \n :class=\"action.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <component\n :is=\"action.component\"\n @click=\"action.handler\"\n class=\"w-1r h-auto\"\n >\n </component>\n\n </div>\n </template>\n </template>\n </div>\n\n <TransitionGroup \n v-if=\"isLoading && !keepSlotVisible\"\n tag=\"ul\" \n name=\"scaleTransition\" \n class=\"pos-relative z-index-1\"\n :class=\"$attrs.class\"\n >\n <Skeleton\n v-if=\"isLoading && !skeleton?.hide\"\n v-for=\"i in currentLimit\" \n :structure=\"skeleton.structure\"\n :horizontal=\"skeleton.horizontal\"\n :loading=\"skeleton.apply_to_slot\"\n :key=\"'skeleton-' + i\"\n :class=\"replaceClasses('radius-medium bg-light pd-thin flex-child-default o-hidden d-block', skeleton.class)\"\n />\n <Loader v-if=\"isLoading && skeleton?.hide\"/>\n </TransitionGroup>\n\n <TransitionGroup \n tag=\"ul\" \n v-else-if=\"itemsList.length < 1\"\n name=\"feed\"\n >\n <EmptyState\n v-if=\"!isLoading && itemsList.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n </TransitionGroup>\n\n <TransitionGroup \n v-else-if=\"!keepSlotVisible || !isLoading\"\n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n\n <!-- Slot visible with overlay loader -->\n <div v-else class=\"pos-relative\">\n <TransitionGroup \n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n \n <!-- Overlay loader -->\n <div \n v-if=\"isLoading && keepSlotVisible\"\n class=\"pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center bg-white-transp-90 z-index-10\"\n >\n <Loader />\n </div>\n </div>\n\n <button\n v-if=\"showLoadMore && hasMoreItems && itemsList.length > 0 && !isLoadingExtra\"\n @click=\"loadMoreItems\"\n class=\"col-w-100 mn-t-thin w-100 t-black bg-main button\"\n >\n Load More\n </button>\n\n <div v-else key=\"sentinel\" ref=\"sentinel\" class=\"sentinel\"></div> \n\n <div\n v-if=\"isLoadingExtra\"\n class=\"col-w-100 w-100 pos-relative\"\n >\n <Loader/>\n </div>\n \n\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, onUnmounted, watch } from 'vue';\n\nimport SkeletonEvent from '@martyrs/src/modules/icons/skeletons/SkeletonEvent.vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Skeleton from '@martyrs/src/components/Skeleton/Skeleton.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport Dropdown from \"@martyrs/src/components/Dropdown/Dropdown.vue\";\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport BottomSheet from '@martyrs/src/components/BottomSheet/BottomSheet.vue';\n\nimport BlockSearch from '@martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue'\nimport BlockSorting from '@martyrs/src/modules/globals/views/components/blocks/BlockSorting.vue'\nimport BlockFilter from '@martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue'\n\nimport FiltersBar from '@martyrs/src/modules/globals/views/components/sections/Filters.vue'\n\nimport ButtonSort from '@martyrs/src/modules/globals/views/components/elements/ButtonSort.vue'\nimport ButtonDate from '@martyrs/src/modules/globals/views/components/elements/ButtonDate.vue'\n\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue'\n\nconst search = defineModel('search')\nconst sort = defineModel('sort')\nconst filter = defineModel('filter')\nconst date = defineModel('date')\nconst items = defineModel('items')\n\n// Внутреннее хранилище для случая, когда v-model:items не передан\nconst internalItems = ref([])\n\n// Элегантное решение через computed\nconst itemsList = computed({\n get: () => items.value ?? internalItems.value,\n set: (val) => {\n if (items.value !== undefined) {\n items.value = val\n } else {\n internalItems.value = val\n }\n }\n})\n\nconst filterConfig = computed(() => {\n if (!filter.value?.options) return []\n \n return filter.value.options.map(opt => ({\n key: opt.value,\n title: opt.title,\n type: 'options',\n options: opt.options || [],\n defaultValue: null\n }))\n})\n\n// Пропсы\nconst props = defineProps({\n showLoadMore: {\n type: Boolean,\n default: true\n },\n LoadMore: {\n type: Boolean,\n default: true\n },\n search: {\n type: [Boolean, Object],\n default: false\n },\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n actions: {\n type: Array,\n default: () => []\n },\n skeleton: {\n type: Object,\n default: () => ({\n hide: false,\n horizontal: false,\n structure: [\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'large' },\n { block: 'button', size: 'small' }\n ]\n }),\n \n },\n store: {\n type: Object,\n default: () => ({\n read: Function,\n state: Object,\n }),\n },\n external: {\n type: Boolean,\n default: false\n },\n options: {\n type: Object,\n default: () => ({\n category: null,\n limit: 10, \n skip: 0 ,\n owner: null,\n creator: null,\n customer: null,\n user: null,\n status: null,\n period: null,\n contain: null,\n }),\n },\n keepSlotVisible: {\n type: Boolean,\n default: false\n },\n});\n \nconst hasMoreItems = ref(false);\n\nlet isLoading = ref(true);\nlet isLoadingExtra = ref(false);\nlet sentinel = ref(null)\n\nlet currentSkip = ref(props.options.skip ? props.options.skip : 0);\nlet currentLimit = ref(props.options.limit ? props.options.limit : 10);\n\nlet currentSearch = ref('');\nlet isSearching = ref(false);\n\nlet requestId = 0;\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nconst debouncedSearch = debounce((value) => {\n isSearching.value = true;\n currentSearch.value = value;\n currentSkip.value = 0;\n currentLimit.value = 10;\n fetchItems();\n}, 500);\n\nfunction updateSearch(search) {\n debouncedSearch(search);\n}\n\nconst removeNullValues = (obj) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value != null)\n );\n};\n\nconst loadMoreItems = async () => {\n if (!hasMoreItems.value || isLoadingExtra.value) {\n return;\n }\n \n isLoadingExtra.value = true;\n \n const currentRequestId = ++requestId;\n\n currentSkip.value += currentLimit.value;\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = [...itemsList.value, ...data];\n \n } catch (error) {\n console.error('Load more error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoadingExtra.value = false;\n }\n }\n};\n\nconst fetchItems = async () => {\n isLoading.value = true;\n \n const currentRequestId = ++requestId;\n \n if (isSearching.value) {\n itemsList.value = [];\n isSearching.value = false;\n }\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = data;\n \n } catch (error) {\n console.error('Fetch error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n};\n\nwatch(\n [() => props.external, () => date.value, () => ({...sort.value}), () => ({...props.options})],\n ([newExternal, newDate, newSort, newOptions], [oldExternal, oldDate, oldSort, oldOptions]) => {\n if (\n newExternal !== oldExternal ||\n newDate !== oldDate ||\n newSort?.order !== oldSort?.order ||\n newSort?.param !== oldSort?.param ||\n JSON.stringify(newOptions) !== JSON.stringify(oldOptions)\n ) {\n currentSkip.value = 0;\n fetchItems();\n }\n },\n { deep: true }\n);\n\nlet observer = null\n\nonMounted(async () => {\n await fetchItems()\n\n if (typeof window !== 'undefined' && !props.showLoadMore && props.LoadMore) {\n observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMoreItems()\n }\n })\n\n if (sentinel.value) observer.observe(sentinel.value)\n }\n});\n\nonUnmounted(() => {\n if (observer) {\n observer.disconnect();\n }\n});\n</script>\n\n<style>\n.feed-move,\n.feed-enter-active,\n.feed-leave-active {\n transition: all 0.5s ease;\n}\n\n.feed-enter-from,\n.feed-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n\n.feed-leave-active {\n position: absolute;\n}\n</style>"],"names":["_useModel","search"],"mappings":"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"}
1
+ {"version":3,"file":"Feed.vue.js","sources":["../../../../../src/components/Feed/Feed.vue"],"sourcesContent":["<template>\n <div v-if=\"search || date || (sort && !sort.hideButton)\" style=\"transform: scale(1);\" class=\"mn-b-thin pos-relative z-index-2 pos-relative flex-nowrap flex gap-thin\">\n\n <BlockSearch \n v-if=\"search\"\n :placeholder=\"search.placeholder || 'Search...'\"\n :class=\"search.class || 'bg-light'\"\n @search=\"updateSearch\"\n :autofocus=\"search.autofocus\"\n />\n\n <FiltersBar\n v-if=\"filter\"\n v-model=\"filter.selected\"\n :filters=\"filterConfig\"\n :class=\"filter.class || 'mobile-only'\"\n />\n\n <Dropdown \n v-if=\"date\"\n :label=\"{\n component: ButtonDate,\n props: { date: date }\n }\" \n :class=\"date.class || 'bg-light'\"\n class=\"flex-child flex-child-shrink-0 pd-r-small pd-l-small pd-thin bg-light radius-medium\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <Calendar\n v-model:date=\"date\"\n :locale=\"$i18n.locale\"\n :allowRange=\"true\"\n class=\"radius-medium w-100 o-hidden bg-light\"\n />\n </Dropdown> \n\n <!-- <template\n v-if=\"filter\"\n >\n <div \n :class=\"filter.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <IconFilter @click=\"() => filter.active = !filter.active\" class=\"w-1r h-auto\"/>\n </div>\n\n \n <BottomSheet\n :show=\"filter.active\"\n @toggle=\"() => filter.active = false\"\n class=\"z-index-10 pos-fixed pos-r-0\"\n :class=\"{\n 'pos-t-0': filter.active,\n 'pos-t-100': !filter.active\n }\"\n >\n <BlockFilter\n v-model:filter=\"filter\"\n :options=\"filter.options\"\n @click_filter=\"() => { filter.active = false } \"\n class=\"h-max w-100 pd-small pd-b-5r bg-light\"\n />\n </BottomSheet> \n </template> -->\n\n <Dropdown \n v-if=\"sort && !sort.hideButton\"\n :label=\"{\n component: ButtonSort,\n props: { order: sort.order },\n class: 'w-1r'\n }\" \n :class=\"sort.class || 'bg-light'\"\n class=\"radius-medium aspect-1x1 h-100\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <BlockSorting\n v-model:param=\"sort.param\"\n v-model:order=\"sort.order\"\n :options=\"sort.options\"\n class=\"h-100 pd-small radius-medium t-white bg-black\"\n />\n </Dropdown> \n\n <!-- Actions -->\n <template\n v-if=\"actions.length\"\n >\n <template v-for=\"action in actions\" :key=\"action.key\">\n <div \n :class=\"action.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <component\n :is=\"action.component\"\n @click=\"action.handler\"\n class=\"w-1r h-auto\"\n >\n </component>\n\n </div>\n </template>\n </template>\n </div>\n\n <TransitionGroup \n v-if=\"isLoading && !keepSlotVisible\"\n tag=\"ul\" \n name=\"scaleTransition\" \n class=\"pos-relative z-index-1\"\n :class=\"$attrs.class\"\n >\n <Skeleton\n v-if=\"isLoading && !skeleton?.hide\"\n v-for=\"i in currentLimit\" \n :structure=\"skeleton.structure\"\n :horizontal=\"skeleton.horizontal\"\n :loading=\"skeleton.apply_to_slot\"\n :key=\"'skeleton-' + i\"\n :class=\"replaceClasses('radius-medium bg-light pd-thin flex-child-default o-hidden d-block', skeleton.class)\"\n />\n <Loader v-if=\"isLoading && skeleton?.hide\"/>\n </TransitionGroup>\n\n <TransitionGroup \n tag=\"ul\" \n v-else-if=\"itemsList.length < 1\"\n name=\"feed\"\n >\n <EmptyState\n v-if=\"!isLoading && itemsList.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n </TransitionGroup>\n\n <TransitionGroup \n v-else-if=\"!keepSlotVisible || !isLoading\"\n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n\n <!-- Slot visible with overlay loader -->\n <div v-else class=\"pos-relative\">\n <TransitionGroup \n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n \n <!-- Overlay loader -->\n <div \n v-if=\"isLoading && keepSlotVisible\"\n class=\"pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center bg-white-transp-90 z-index-10\"\n >\n <Loader />\n </div>\n </div>\n\n <button\n v-if=\"showLoadMore && hasMoreItems && itemsList.length > 0 && !isLoadingExtra\"\n @click=\"loadMoreItems\"\n class=\"col-w-100 mn-t-thin w-100 t-black bg-main button\"\n >\n Load More\n </button>\n\n <div v-else key=\"sentinel\" ref=\"sentinel\" class=\"sentinel\"></div> \n\n <div\n v-if=\"isLoadingExtra\"\n class=\"col-w-100 w-100 pos-relative\"\n >\n <Loader/>\n </div>\n \n\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, onUnmounted, watch } from 'vue';\n\nimport SkeletonEvent from '@martyrs/src/modules/icons/skeletons/SkeletonEvent.vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Skeleton from '@martyrs/src/components/Skeleton/Skeleton.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport Dropdown from \"@martyrs/src/components/Dropdown/Dropdown.vue\";\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport BottomSheet from '@martyrs/src/components/BottomSheet/BottomSheet.vue';\n\nimport BlockSearch from '@martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue'\nimport BlockSorting from '@martyrs/src/modules/globals/views/components/blocks/BlockSorting.vue'\nimport BlockFilter from '@martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue'\n\nimport FiltersBar from '@martyrs/src/modules/globals/views/components/sections/Filters.vue'\n\nimport ButtonSort from '@martyrs/src/modules/globals/views/components/elements/ButtonSort.vue'\nimport ButtonDate from '@martyrs/src/modules/globals/views/components/elements/ButtonDate.vue'\n\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue'\n\nconst search = defineModel('search')\nconst sort = defineModel('sort')\nconst filter = defineModel('filter')\nconst date = defineModel('date')\nconst items = defineModel('items')\n\n// Внутреннее хранилище для случая, когда v-model:items не передан\nconst internalItems = ref([])\n\n// Элегантное решение через computed\nconst itemsList = computed({\n get: () => items.value ?? internalItems.value,\n set: (val) => {\n if (items.value !== undefined) {\n items.value = val\n } else {\n internalItems.value = val\n }\n }\n})\n\nconst filterConfig = computed(() => {\n if (!filter.value?.options) return []\n \n return filter.value.options.map(opt => ({\n key: opt.value,\n title: opt.title,\n type: 'options',\n options: opt.options || [],\n defaultValue: null\n }))\n})\n\n// Пропсы\nconst props = defineProps({\n showLoadMore: {\n type: Boolean,\n default: true\n },\n LoadMore: {\n type: Boolean,\n default: true\n },\n search: {\n type: [Boolean, Object],\n default: false\n },\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n actions: {\n type: Array,\n default: () => []\n },\n skeleton: {\n type: Object,\n default: () => ({\n hide: false,\n horizontal: false,\n structure: [\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'large' },\n { block: 'button', size: 'small' }\n ]\n }),\n \n },\n store: {\n type: Object,\n default: () => ({\n read: Function,\n state: Object,\n }),\n },\n external: {\n type: Boolean,\n default: false\n },\n options: {\n type: Object,\n default: () => ({\n category: null,\n limit: 10, \n skip: 0 ,\n owner: null,\n creator: null,\n customer: null,\n user: null,\n status: null,\n period: null,\n contain: null,\n }),\n },\n keepSlotVisible: {\n type: Boolean,\n default: false\n },\n});\n \nconst hasMoreItems = ref(false);\n\nlet isLoading = ref(true);\nlet isLoadingExtra = ref(false);\nlet sentinel = ref(null)\n\nlet currentSkip = ref(props.options.skip ? props.options.skip : 0);\nlet currentLimit = ref(props.options.limit ? props.options.limit : 10);\n\nlet currentSearch = ref('');\nlet isSearching = ref(false);\n\nlet requestId = 0;\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nconst debouncedSearch = debounce((value) => {\n isSearching.value = true;\n currentSearch.value = value;\n currentSkip.value = 0;\n currentLimit.value = 10;\n fetchItems();\n}, 500);\n\nfunction updateSearch(search) {\n debouncedSearch(search);\n}\n\nconst removeNullValues = (obj) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value != null)\n );\n};\n\nconst loadMoreItems = async () => {\n if (!hasMoreItems.value || isLoadingExtra.value) {\n return;\n }\n \n isLoadingExtra.value = true;\n \n const currentRequestId = ++requestId;\n\n currentSkip.value += currentLimit.value;\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = [...itemsList.value, ...data];\n \n } catch (error) {\n console.error('Load more error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoadingExtra.value = false;\n }\n }\n};\n\nconst fetchItems = async () => {\n isLoading.value = true;\n \n const currentRequestId = ++requestId;\n \n if (isSearching.value) {\n itemsList.value = [];\n isSearching.value = false;\n }\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = data;\n \n } catch (error) {\n console.error('Fetch error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n};\n\nwatch(\n [() => props.external, () => date.value, () => ({...sort.value}), () => ({...props.options})],\n ([newExternal, newDate, newSort, newOptions], [oldExternal, oldDate, oldSort, oldOptions]) => {\n if (\n newExternal !== oldExternal ||\n newDate !== oldDate ||\n newSort?.order !== oldSort?.order ||\n newSort?.param !== oldSort?.param ||\n JSON.stringify(newOptions) !== JSON.stringify(oldOptions)\n ) {\n currentSkip.value = 0;\n fetchItems();\n }\n },\n { deep: true }\n);\n\nlet observer = null\n\nonMounted(async () => {\n await fetchItems()\n\n if (typeof window !== 'undefined' && !props.showLoadMore && props.LoadMore) {\n observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMoreItems()\n }\n })\n\n if (sentinel.value) observer.observe(sentinel.value)\n }\n});\n\nonUnmounted(() => {\n if (observer) {\n observer.disconnect();\n }\n});\n</script>\n\n<style>\n.feed-move,\n.feed-enter-active,\n.feed-leave-active {\n transition: all 0.5s ease;\n}\n\n.feed-enter-from,\n.feed-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n\n.feed-leave-active {\n position: absolute;\n}\n</style>"],"names":["_useModel","search"],"mappings":"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"}
@@ -156,6 +156,6 @@ const _sfc_main = {
156
156
  };
157
157
  }
158
158
  };
159
- const Field = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-985f0e53"]]);
159
+ const Field = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-36998019"]]);
160
160
  exports.default = Field;
161
161
  //# sourceMappingURL=Field.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.vue.cjs","sources":["../../../../../src/components/Field/Field.vue"],"sourcesContent":["<script setup>\nimport { ref, onMounted, nextTick, watch } from 'vue'\nimport IconShow from '@martyrs/src/modules/icons/actions/IconShow.vue';\nconst emit = defineEmits(['update:field', 'focus', 'blur']);\nconst props = defineProps({\n label: null,\n symbol: null,\n type: 'text',\n placeholder: 'Enter something here',\n field: null,\n value: null,\n validation: false,\n disabled: null,\n tabindex: -1,\n autofocus: false,\n icon: null, // Добавлен пропс для иконки\n name: null, // Имя поля для автозаполнения\n id: null // ID поля\n});\nif (props.value) {\n emit('update:field', props.value)\n}\nconst textarea = ref(null);\nconst input = ref(null);\nconst showPassword = ref(false);\n\nfunction resize() {\n if (!textarea.value) {\n return;\n }\n const el = textarea.value;\n el.style.height = '';\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > 33) {\n el.style.height = scrollHeight + 'px';\n } else {\n el.style.height = '';\n }\n}\nfunction focus() {\n if (props.autofocus) {\n if (props.type === 'textarea' && textarea.value) {\n textarea.value.focus();\n } else if (input.value) {\n input.value.focus();\n }\n }\n}\nwatch(() => props.field, () => {\n if (props.type === 'textarea') {\n nextTick(resize);\n }\n});\nwatch(() => props.autofocus, (newVal) => {\n if (newVal) {\n nextTick(focus);\n }\n});\nonMounted(() => {\n nextTick(focus);\n nextTick(resize);\n});\nconst text = ref(props.field);\n</script>\n<template>\n <div\n :class=\"[\n $attrs.class,\n { 'bg-fourth-nano': validation }\n ]\"\n class=\"field-wrapper flex-center flex-nowrap flex\"\n >\n <!-- Слот для иконки -->\n <slot name=\"icon\" v-if=\"$slots.icon\" />\n <!-- Или компонент иконки через пропс -->\n <component :is=\"icon\" v-else-if=\"icon\" class=\"i-medium t-transp mn-r-thin\" />\n \n <div\n v-if=\"label\"\n class=\"t-transp mn-r-small\"\n >\n <span class=\"t-nowrap\">\n {{label}}\n </span>\n </div>\n <div class=\"w-100 pos-relative\">\n <input\n v-if=\"type !== 'textarea'\"\n ref=\"input\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n :type=\"type === 'password' && !showPassword ? 'password' : type === 'password' ? 'text' : type\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :autofocus=\"autofocus\"\n :name=\"name\"\n :id=\"id\"\n />\n <textarea\n v-else\n ref=\"textarea\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :name=\"name\"\n :id=\"id\"\n />\n </div>\n <IconShow\n v-if=\"type === 'password'\"\n :show=\"!showPassword\"\n @click=\"showPassword = !showPassword\"\n class=\"i-medium cursor-pointer\"\n />\n <slot></slot>\n <div\n v-if=\"symbol\"\n class=\"t-transp mn-l-small\"\n >\n <span>\n {{symbol}}\n </span>\n </div>\n </div>\n <!-- Validation -->\n <transition name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin mn-b-thin mn-b-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<style scoped>\ninput,\ntextarea,\nspan {\n color: inherit;\n line-height: 1;\n}\ntextarea {\n resize: none;\n overflow: hidden; \n height: 1rem;\n}\ninput[type=\"date\"]::-webkit-calendar-picker-indicator,\ninput[type=\"time\"]::-webkit-calendar-picker-indicator {\n filter: invert(1);\n opacity: 1;\n color: inherit;\n}\n</style>"],"names":["ref","watch","nextTick","onMounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,UAAM,OAAO;AACb,UAAM,QAAQ;AAed,QAAI,MAAM,OAAO;AACf,WAAK,gBAAgB,MAAM,KAAK;AAAA,IAClC;AACA,UAAM,WAAWA,IAAAA,IAAI,IAAI;AACzB,UAAM,QAAQA,IAAAA,IAAI,IAAI;AACtB,UAAM,eAAeA,IAAAA,IAAI,KAAK;AAE9B,aAAS,SAAS;AAChB,UAAI,CAAC,SAAS,OAAO;AACnB;AAAA,MACF;AACA,YAAM,KAAK,SAAS;AACpB,SAAG,MAAM,SAAS;AAClB,YAAM,eAAe,GAAG;AACxB,UAAI,eAAe,IAAI;AACrB,WAAG,MAAM,SAAS,eAAe;AAAA,MACnC,OAAO;AACL,WAAG,MAAM,SAAS;AAAA,MACpB;AAAA,IACF;AACA,aAAS,QAAQ;AACf,UAAI,MAAM,WAAW;AACnB,YAAI,MAAM,SAAS,cAAc,SAAS,OAAO;AAC/C,mBAAS,MAAM,MAAK;AAAA,QACtB,WAAW,MAAM,OAAO;AACtB,gBAAM,MAAM,MAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACAC,QAAAA,MAAM,MAAM,MAAM,OAAO,MAAM;AAC7B,UAAI,MAAM,SAAS,YAAY;AAC7BC,YAAAA,SAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AACDD,QAAAA,MAAM,MAAM,MAAM,WAAW,CAAC,WAAW;AACvC,UAAI,QAAQ;AACVC,YAAAA,SAAS,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AACDC,QAAAA,UAAU,MAAM;AACdD,UAAAA,SAAS,KAAK;AACdA,UAAAA,SAAS,MAAM;AAAA,IACjB,CAAC;AACD,UAAM,OAAOF,IAAAA,IAAI,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Field.vue.cjs","sources":["../../../../../src/components/Field/Field.vue"],"sourcesContent":["<script setup>\nimport { ref, onMounted, nextTick, watch } from 'vue'\nimport IconShow from '@martyrs/src/modules/icons/actions/IconShow.vue';\nconst emit = defineEmits(['update:field', 'focus', 'blur']);\nconst props = defineProps({\n label: null,\n symbol: null,\n type: 'text',\n placeholder: 'Enter something here',\n field: null,\n value: null,\n validation: false,\n disabled: null,\n tabindex: -1,\n autofocus: false,\n icon: null, // Добавлен пропс для иконки\n name: null, // Имя поля для автозаполнения\n id: null // ID поля\n});\nif (props.value) {\n emit('update:field', props.value)\n}\nconst textarea = ref(null);\nconst input = ref(null);\nconst showPassword = ref(false);\n\nfunction resize() {\n if (!textarea.value) {\n return;\n }\n const el = textarea.value;\n el.style.height = '';\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > 33) {\n el.style.height = scrollHeight + 'px';\n } else {\n el.style.height = '';\n }\n}\nfunction focus() {\n if (props.autofocus) {\n if (props.type === 'textarea' && textarea.value) {\n textarea.value.focus();\n } else if (input.value) {\n input.value.focus();\n }\n }\n}\nwatch(() => props.field, () => {\n if (props.type === 'textarea') {\n nextTick(resize);\n }\n});\nwatch(() => props.autofocus, (newVal) => {\n if (newVal) {\n nextTick(focus);\n }\n});\nonMounted(() => {\n nextTick(focus);\n nextTick(resize);\n});\nconst text = ref(props.field);\n</script>\n<template>\n <div\n :class=\"[\n $attrs.class,\n { 'bg-fourth-nano': validation }\n ]\"\n class=\"field-wrapper flex-center flex-nowrap flex\"\n >\n <!-- Слот для иконки -->\n <slot name=\"icon\" v-if=\"$slots.icon\" />\n <!-- Или компонент иконки через пропс -->\n <component :is=\"icon\" v-else-if=\"icon\" class=\"i-medium t-transp mn-r-thin\" />\n \n <div\n v-if=\"label\"\n class=\"t-transp mn-r-small\"\n >\n <span class=\"t-nowrap\">\n {{label}}\n </span>\n </div>\n <div class=\"w-100 pos-relative\">\n <input\n v-if=\"type !== 'textarea'\"\n ref=\"input\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n :type=\"type === 'password' && !showPassword ? 'password' : type === 'password' ? 'text' : type\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :autofocus=\"autofocus\"\n :name=\"name\"\n :id=\"id\"\n />\n <textarea\n v-else\n ref=\"textarea\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :name=\"name\"\n :id=\"id\"\n />\n </div>\n <IconShow\n v-if=\"type === 'password'\"\n :show=\"!showPassword\"\n @click=\"showPassword = !showPassword\"\n class=\"i-medium cursor-pointer\"\n />\n <slot></slot>\n <div\n v-if=\"symbol\"\n class=\"t-transp mn-l-small\"\n >\n <span>\n {{symbol}}\n </span>\n </div>\n </div>\n <!-- Validation -->\n <transition name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin mn-b-thin mn-b-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<style scoped>\ninput,\ntextarea,\nspan {\n color: inherit;\n line-height: 1;\n}\ntextarea {\n resize: none;\n overflow: hidden; \n height: 1rem;\n}\n\ninput {\n height: 1rem;\n}\n\ninput[type=\"date\"]::-webkit-calendar-picker-indicator,\ninput[type=\"time\"]::-webkit-calendar-picker-indicator {\n filter: invert(1);\n opacity: 1;\n color: inherit;\n}\n</style>"],"names":["ref","watch","nextTick","onMounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,UAAM,OAAO;AACb,UAAM,QAAQ;AAed,QAAI,MAAM,OAAO;AACf,WAAK,gBAAgB,MAAM,KAAK;AAAA,IAClC;AACA,UAAM,WAAWA,IAAAA,IAAI,IAAI;AACzB,UAAM,QAAQA,IAAAA,IAAI,IAAI;AACtB,UAAM,eAAeA,IAAAA,IAAI,KAAK;AAE9B,aAAS,SAAS;AAChB,UAAI,CAAC,SAAS,OAAO;AACnB;AAAA,MACF;AACA,YAAM,KAAK,SAAS;AACpB,SAAG,MAAM,SAAS;AAClB,YAAM,eAAe,GAAG;AACxB,UAAI,eAAe,IAAI;AACrB,WAAG,MAAM,SAAS,eAAe;AAAA,MACnC,OAAO;AACL,WAAG,MAAM,SAAS;AAAA,MACpB;AAAA,IACF;AACA,aAAS,QAAQ;AACf,UAAI,MAAM,WAAW;AACnB,YAAI,MAAM,SAAS,cAAc,SAAS,OAAO;AAC/C,mBAAS,MAAM,MAAK;AAAA,QACtB,WAAW,MAAM,OAAO;AACtB,gBAAM,MAAM,MAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACAC,QAAAA,MAAM,MAAM,MAAM,OAAO,MAAM;AAC7B,UAAI,MAAM,SAAS,YAAY;AAC7BC,YAAAA,SAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AACDD,QAAAA,MAAM,MAAM,MAAM,WAAW,CAAC,WAAW;AACvC,UAAI,QAAQ;AACVC,YAAAA,SAAS,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AACDC,QAAAA,UAAU,MAAM;AACdD,UAAAA,SAAS,KAAK;AACdA,UAAAA,SAAS,MAAM;AAAA,IACjB,CAAC;AACD,UAAM,OAAOF,IAAAA,IAAI,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -154,7 +154,7 @@ const _sfc_main = {
154
154
  };
155
155
  }
156
156
  };
157
- const Field = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-985f0e53"]]);
157
+ const Field = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-36998019"]]);
158
158
  export {
159
159
  Field as default
160
160
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Field.vue.js","sources":["../../../../../src/components/Field/Field.vue"],"sourcesContent":["<script setup>\nimport { ref, onMounted, nextTick, watch } from 'vue'\nimport IconShow from '@martyrs/src/modules/icons/actions/IconShow.vue';\nconst emit = defineEmits(['update:field', 'focus', 'blur']);\nconst props = defineProps({\n label: null,\n symbol: null,\n type: 'text',\n placeholder: 'Enter something here',\n field: null,\n value: null,\n validation: false,\n disabled: null,\n tabindex: -1,\n autofocus: false,\n icon: null, // Добавлен пропс для иконки\n name: null, // Имя поля для автозаполнения\n id: null // ID поля\n});\nif (props.value) {\n emit('update:field', props.value)\n}\nconst textarea = ref(null);\nconst input = ref(null);\nconst showPassword = ref(false);\n\nfunction resize() {\n if (!textarea.value) {\n return;\n }\n const el = textarea.value;\n el.style.height = '';\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > 33) {\n el.style.height = scrollHeight + 'px';\n } else {\n el.style.height = '';\n }\n}\nfunction focus() {\n if (props.autofocus) {\n if (props.type === 'textarea' && textarea.value) {\n textarea.value.focus();\n } else if (input.value) {\n input.value.focus();\n }\n }\n}\nwatch(() => props.field, () => {\n if (props.type === 'textarea') {\n nextTick(resize);\n }\n});\nwatch(() => props.autofocus, (newVal) => {\n if (newVal) {\n nextTick(focus);\n }\n});\nonMounted(() => {\n nextTick(focus);\n nextTick(resize);\n});\nconst text = ref(props.field);\n</script>\n<template>\n <div\n :class=\"[\n $attrs.class,\n { 'bg-fourth-nano': validation }\n ]\"\n class=\"field-wrapper flex-center flex-nowrap flex\"\n >\n <!-- Слот для иконки -->\n <slot name=\"icon\" v-if=\"$slots.icon\" />\n <!-- Или компонент иконки через пропс -->\n <component :is=\"icon\" v-else-if=\"icon\" class=\"i-medium t-transp mn-r-thin\" />\n \n <div\n v-if=\"label\"\n class=\"t-transp mn-r-small\"\n >\n <span class=\"t-nowrap\">\n {{label}}\n </span>\n </div>\n <div class=\"w-100 pos-relative\">\n <input\n v-if=\"type !== 'textarea'\"\n ref=\"input\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n :type=\"type === 'password' && !showPassword ? 'password' : type === 'password' ? 'text' : type\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :autofocus=\"autofocus\"\n :name=\"name\"\n :id=\"id\"\n />\n <textarea\n v-else\n ref=\"textarea\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :name=\"name\"\n :id=\"id\"\n />\n </div>\n <IconShow\n v-if=\"type === 'password'\"\n :show=\"!showPassword\"\n @click=\"showPassword = !showPassword\"\n class=\"i-medium cursor-pointer\"\n />\n <slot></slot>\n <div\n v-if=\"symbol\"\n class=\"t-transp mn-l-small\"\n >\n <span>\n {{symbol}}\n </span>\n </div>\n </div>\n <!-- Validation -->\n <transition name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin mn-b-thin mn-b-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<style scoped>\ninput,\ntextarea,\nspan {\n color: inherit;\n line-height: 1;\n}\ntextarea {\n resize: none;\n overflow: hidden; \n height: 1rem;\n}\ninput[type=\"date\"]::-webkit-calendar-picker-indicator,\ninput[type=\"time\"]::-webkit-calendar-picker-indicator {\n filter: invert(1);\n opacity: 1;\n color: inherit;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,UAAM,OAAO;AACb,UAAM,QAAQ;AAed,QAAI,MAAM,OAAO;AACf,WAAK,gBAAgB,MAAM,KAAK;AAAA,IAClC;AACA,UAAM,WAAW,IAAI,IAAI;AACzB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,eAAe,IAAI,KAAK;AAE9B,aAAS,SAAS;AAChB,UAAI,CAAC,SAAS,OAAO;AACnB;AAAA,MACF;AACA,YAAM,KAAK,SAAS;AACpB,SAAG,MAAM,SAAS;AAClB,YAAM,eAAe,GAAG;AACxB,UAAI,eAAe,IAAI;AACrB,WAAG,MAAM,SAAS,eAAe;AAAA,MACnC,OAAO;AACL,WAAG,MAAM,SAAS;AAAA,MACpB;AAAA,IACF;AACA,aAAS,QAAQ;AACf,UAAI,MAAM,WAAW;AACnB,YAAI,MAAM,SAAS,cAAc,SAAS,OAAO;AAC/C,mBAAS,MAAM,MAAK;AAAA,QACtB,WAAW,MAAM,OAAO;AACtB,gBAAM,MAAM,MAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAM,MAAM,OAAO,MAAM;AAC7B,UAAI,MAAM,SAAS,YAAY;AAC7B,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AACD,UAAM,MAAM,MAAM,WAAW,CAAC,WAAW;AACvC,UAAI,QAAQ;AACV,iBAAS,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AACD,cAAU,MAAM;AACd,eAAS,KAAK;AACd,eAAS,MAAM;AAAA,IACjB,CAAC;AACD,UAAM,OAAO,IAAI,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Field.vue.js","sources":["../../../../../src/components/Field/Field.vue"],"sourcesContent":["<script setup>\nimport { ref, onMounted, nextTick, watch } from 'vue'\nimport IconShow from '@martyrs/src/modules/icons/actions/IconShow.vue';\nconst emit = defineEmits(['update:field', 'focus', 'blur']);\nconst props = defineProps({\n label: null,\n symbol: null,\n type: 'text',\n placeholder: 'Enter something here',\n field: null,\n value: null,\n validation: false,\n disabled: null,\n tabindex: -1,\n autofocus: false,\n icon: null, // Добавлен пропс для иконки\n name: null, // Имя поля для автозаполнения\n id: null // ID поля\n});\nif (props.value) {\n emit('update:field', props.value)\n}\nconst textarea = ref(null);\nconst input = ref(null);\nconst showPassword = ref(false);\n\nfunction resize() {\n if (!textarea.value) {\n return;\n }\n const el = textarea.value;\n el.style.height = '';\n const scrollHeight = el.scrollHeight;\n if (scrollHeight > 33) {\n el.style.height = scrollHeight + 'px';\n } else {\n el.style.height = '';\n }\n}\nfunction focus() {\n if (props.autofocus) {\n if (props.type === 'textarea' && textarea.value) {\n textarea.value.focus();\n } else if (input.value) {\n input.value.focus();\n }\n }\n}\nwatch(() => props.field, () => {\n if (props.type === 'textarea') {\n nextTick(resize);\n }\n});\nwatch(() => props.autofocus, (newVal) => {\n if (newVal) {\n nextTick(focus);\n }\n});\nonMounted(() => {\n nextTick(focus);\n nextTick(resize);\n});\nconst text = ref(props.field);\n</script>\n<template>\n <div\n :class=\"[\n $attrs.class,\n { 'bg-fourth-nano': validation }\n ]\"\n class=\"field-wrapper flex-center flex-nowrap flex\"\n >\n <!-- Слот для иконки -->\n <slot name=\"icon\" v-if=\"$slots.icon\" />\n <!-- Или компонент иконки через пропс -->\n <component :is=\"icon\" v-else-if=\"icon\" class=\"i-medium t-transp mn-r-thin\" />\n \n <div\n v-if=\"label\"\n class=\"t-transp mn-r-small\"\n >\n <span class=\"t-nowrap\">\n {{label}}\n </span>\n </div>\n <div class=\"w-100 pos-relative\">\n <input\n v-if=\"type !== 'textarea'\"\n ref=\"input\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n :type=\"type === 'password' && !showPassword ? 'password' : type === 'password' ? 'text' : type\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :autofocus=\"autofocus\"\n :name=\"name\"\n :id=\"id\"\n />\n <textarea\n v-else\n ref=\"textarea\"\n @input=\"event => text = emit('update:field', event.target.value)\"\n @focus=\"event => emit('focus', event)\"\n @blur=\"event => emit('blur', event)\"\n class=\"w-100\"\n :value=\"field\"\n :placeholder=\"placeholder\"\n :tabindex=\"tabindex\"\n :disabled=\"disabled\"\n :name=\"name\"\n :id=\"id\"\n />\n </div>\n <IconShow\n v-if=\"type === 'password'\"\n :show=\"!showPassword\"\n @click=\"showPassword = !showPassword\"\n class=\"i-medium cursor-pointer\"\n />\n <slot></slot>\n <div\n v-if=\"symbol\"\n class=\"t-transp mn-l-small\"\n >\n <span>\n {{symbol}}\n </span>\n </div>\n </div>\n <!-- Validation -->\n <transition name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin mn-b-thin mn-b-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<style scoped>\ninput,\ntextarea,\nspan {\n color: inherit;\n line-height: 1;\n}\ntextarea {\n resize: none;\n overflow: hidden; \n height: 1rem;\n}\n\ninput {\n height: 1rem;\n}\n\ninput[type=\"date\"]::-webkit-calendar-picker-indicator,\ninput[type=\"time\"]::-webkit-calendar-picker-indicator {\n filter: invert(1);\n opacity: 1;\n color: inherit;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,UAAM,OAAO;AACb,UAAM,QAAQ;AAed,QAAI,MAAM,OAAO;AACf,WAAK,gBAAgB,MAAM,KAAK;AAAA,IAClC;AACA,UAAM,WAAW,IAAI,IAAI;AACzB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,eAAe,IAAI,KAAK;AAE9B,aAAS,SAAS;AAChB,UAAI,CAAC,SAAS,OAAO;AACnB;AAAA,MACF;AACA,YAAM,KAAK,SAAS;AACpB,SAAG,MAAM,SAAS;AAClB,YAAM,eAAe,GAAG;AACxB,UAAI,eAAe,IAAI;AACrB,WAAG,MAAM,SAAS,eAAe;AAAA,MACnC,OAAO;AACL,WAAG,MAAM,SAAS;AAAA,MACpB;AAAA,IACF;AACA,aAAS,QAAQ;AACf,UAAI,MAAM,WAAW;AACnB,YAAI,MAAM,SAAS,cAAc,SAAS,OAAO;AAC/C,mBAAS,MAAM,MAAK;AAAA,QACtB,WAAW,MAAM,OAAO;AACtB,gBAAM,MAAM,MAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAM,MAAM,OAAO,MAAM;AAC7B,UAAI,MAAM,SAAS,YAAY;AAC7B,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AACD,UAAM,MAAM,MAAM,WAAW,CAAC,WAAW;AACvC,UAAI,QAAQ;AACV,iBAAS,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AACD,cAAU,MAAM;AACd,eAAS,KAAK;AACd,eAAS,MAAM;AAAA,IACjB,CAAC;AACD,UAAM,OAAO,IAAI,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
4
  const Field = require("../Field/Field.vue.cjs");
5
- const Button = require("../Button/Button.vue.cjs");
5
+ const Button = require("../Button/Button.vue2.cjs");
6
6
  const IconArrow = require("../../modules/icons/navigation/IconArrow.vue.cjs");
7
7
  const vueI18n = require("vue-i18n");
8
8
  const _hoisted_1 = {
@@ -174,7 +174,7 @@ const _sfc_main = {
174
174
  name: vue.unref(fieldName),
175
175
  id: vue.unref(fieldId),
176
176
  validation: __props.validation,
177
- class: "pd-l-medium radius-extra flex-nowrap flex w-100 p-medium t-regular uppercase pd-thin"
177
+ class: "radius-medium flex-nowrap flex w-100 p-medium t-regular uppercase pd-thin"
178
178
  }, {
179
179
  default: vue.withCtx(() => [
180
180
  vue.renderSlot(_ctx.$slots, "default"),
@@ -184,7 +184,7 @@ const _sfc_main = {
184
184
  showLoader: __props.showLoader,
185
185
  callback: __props.callback,
186
186
  callbackDelay: __props.callbackDelay,
187
- class: "t-nowrap t-medium radius-big uppercase cursor-pointer flex flex-v-center pd-thin w-max hover-bg-fifth t-semi transition-linear transition-timing-1 t-black bg-main"
187
+ class: "t-nowrap t-medium radius-small uppercase cursor-pointer flex flex-v-center pd-thin w-max hover-bg-fifth t-semi transition-linear transition-timing-1 t-black bg-main"
188
188
  }, {
189
189
  default: vue.withCtx(() => [
190
190
  __props.action ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_1, vue.toDisplayString(__props.action), 1)) : vue.createCommentVNode("", true),