@ozdao/martyrs 0.2.492 → 0.2.494

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 (341) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +4 -4
  4. package/dist/_virtual/index2.js +4 -4
  5. package/dist/builder.cjs +53 -90
  6. package/dist/builder.js +54 -91
  7. package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
  8. package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
  9. package/dist/globals.server.cjs +322 -3
  10. package/dist/globals.server.js +303 -1
  11. package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
  12. package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
  13. package/dist/inventory.server.cjs +2 -2
  14. package/dist/inventory.server.js +2 -2
  15. package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
  16. package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
  17. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
  18. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
  20. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
  21. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
  22. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  23. package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
  24. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  25. package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
  26. package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
  27. package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
  28. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
  30. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  31. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  32. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  33. package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
  34. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
  35. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
  38. package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
  39. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  47. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  51. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  55. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  56. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
  59. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  60. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
  62. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  66. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  67. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  68. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  69. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  70. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  72. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  73. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  74. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
  77. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
  79. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
  81. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
  82. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
  83. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
  84. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
  85. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
  86. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
  87. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  88. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
  89. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  90. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
  91. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  92. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
  93. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
  96. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
  98. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
  102. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
  104. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
  106. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
  108. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
  110. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +385 -125
  116. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
  117. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
  118. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
  119. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
  120. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
  122. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
  124. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
  125. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
  126. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
  127. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
  128. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
  129. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
  130. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
  131. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
  132. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
  133. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
  134. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
  136. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
  137. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
  138. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
  139. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
  140. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
  141. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
  142. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
  144. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
  145. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
  146. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
  147. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
  148. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
  149. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
  150. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
  152. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
  153. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
  154. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
  155. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
  156. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
  157. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
  158. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  159. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
  160. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
  161. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
  162. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
  163. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
  164. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
  165. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
  166. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
  167. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
  168. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
  169. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
  170. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
  171. package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
  172. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
  173. package/dist/martyrs/src/modules/music/music.client.js +9 -12
  174. package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
  175. package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
  176. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  177. package/dist/martyrs/src/modules/music/router/music.js +27 -1
  178. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  179. package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
  180. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/music/store/artists.js +6 -4
  182. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
  183. package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
  184. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
  185. package/dist/martyrs/src/modules/music/store/player.js +5 -0
  186. package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
  187. package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
  188. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
  189. package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
  190. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
  191. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
  192. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  193. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  194. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  195. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  196. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  197. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
  198. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
  199. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
  200. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  201. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
  202. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  203. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  204. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  205. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  206. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  207. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  208. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  209. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  210. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  211. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  212. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  213. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  214. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  215. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  216. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  217. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  218. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  219. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  220. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  221. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  222. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  223. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  224. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  225. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  226. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  227. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  228. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
  229. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  230. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
  231. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  232. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  233. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  234. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
  235. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
  236. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
  237. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
  238. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
  239. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
  240. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
  241. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
  242. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
  243. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
  244. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
  245. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
  246. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
  247. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
  248. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
  249. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
  250. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  251. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  252. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
  253. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  254. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  255. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  256. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  257. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  258. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
  259. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  260. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
  261. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
  262. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
  263. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  264. package/dist/martyrs.cjs.js +1 -1
  265. package/dist/martyrs.css +1 -1
  266. package/dist/martyrs.es.js +1 -1
  267. package/dist/music.server.cjs +124 -31
  268. package/dist/music.server.js +124 -31
  269. package/dist/organizations.server.cjs +1 -1
  270. package/dist/organizations.server.js +1 -1
  271. package/dist/products.server.cjs +2 -2
  272. package/dist/products.server.js +2 -2
  273. package/dist/rents.server.cjs +3 -3
  274. package/dist/rents.server.js +3 -3
  275. package/dist/style.css +373 -80
  276. package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
  277. package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
  278. package/package.json +1 -1
  279. package/src/builder/modes/ssr.prod.js +21 -5
  280. package/src/builder/rspack/rspack.config.spa.client.js +0 -44
  281. package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
  282. package/src/components/Calendar/Calendar.vue +378 -377
  283. package/src/components/Feed/Feed.vue +28 -2
  284. package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
  285. package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
  286. package/src/modules/globals/views/components/layouts/Client.vue +7 -0
  287. package/src/modules/music/README.md +8 -0
  288. package/src/modules/music/components/SidebarMusic.vue +6 -9
  289. package/src/modules/music/components/cards/AlbumCard.vue +20 -14
  290. package/src/modules/music/components/cards/ArtistCard.vue +1 -1
  291. package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
  292. package/src/modules/music/components/cards/TrackListCard.vue +24 -13
  293. package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
  294. package/src/modules/music/components/forms/SearchForm.vue +31 -8
  295. package/src/modules/music/components/forms/TrackForm.vue +50 -32
  296. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
  297. package/src/modules/music/components/pages/Album.vue +373 -186
  298. package/src/modules/music/components/pages/Artist.vue +54 -94
  299. package/src/modules/music/components/pages/MusicHome.vue +59 -56
  300. package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
  301. package/src/modules/music/components/pages/Playlist.vue +495 -379
  302. package/src/modules/music/components/pages/SearchResults.vue +185 -313
  303. package/src/modules/music/components/pages/Track.vue +363 -69
  304. package/src/modules/music/components/player/MusicPlayer.vue +368 -97
  305. package/src/modules/music/components/player/TrackProgress.vue +76 -22
  306. package/src/modules/music/components/player/VolumeControl.vue +61 -28
  307. package/src/modules/music/controllers/search.controller.js +3 -0
  308. package/src/modules/music/controllers/stream.controller.js +11 -3
  309. package/src/modules/music/middlewares/playlists.verifier.js +1 -1
  310. package/src/modules/music/music.client.js +3 -6
  311. package/src/modules/music/music.server.js +8 -4
  312. package/src/modules/music/router/music.js +8 -1
  313. package/src/modules/music/routes/albums.routes.js +37 -5
  314. package/src/modules/music/routes/artists.routes.js +14 -4
  315. package/src/modules/music/routes/genres.routes.js +5 -1
  316. package/src/modules/music/routes/playlists.routes.js +42 -9
  317. package/src/modules/music/routes/tracks.routes.js +27 -2
  318. package/src/modules/music/store/artists.js +6 -2
  319. package/src/modules/music/store/player.js +6 -0
  320. package/src/modules/music/store/tracks.js +31 -0
  321. package/src/modules/music/websocket/streaming.handler.js +7 -1
  322. package/src/modules/rents/controllers/services/rents.services.js +2 -2
  323. package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
  324. package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
  325. package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
  326. package/src/modules/rents/views/components/pages/Rents.vue +60 -56
  327. package/dist/globals.websocket-DzvdIBf6.js +0 -306
  328. package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
  329. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
  330. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  331. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  332. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
  333. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
  334. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
  335. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
  336. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
  337. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
  338. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
  339. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
  340. package/src/modules/music/components/cards/TrackCard.vue +0 -86
  341. package/src/modules/music/components/layouts/MusicLayout.vue +0 -83
@@ -1 +1 @@
1
- {"version":3,"file":"GanttChart.vue.cjs","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttChart.vue"],"sourcesContent":["<template>\n <div class=\"w-100\" :style=\"{ '--cell-width': cellWidth + 'px' }\">\n <GanttToolbar\n :view=\"view\"\n :views=\"views\"\n :date=\"date\"\n @update:view=\"$emit('update:view', $event)\"\n @update:date=\"$emit('update:date', $event)\"\n @today=\"$emit('today')\"\n />\n \n <div \n class=\"gantt-container scroller o-scroll bg-white radius-small br-solid br-1px br-grey-transp\"\n ref=\"container\"\n @scroll=\"handleScroll\"\n >\n <div class=\"gantt-content\">\n <!-- Header -->\n <div class=\"gantt-header pos-sticky top-0 z-index-2 bg-white br-b br-solid br-grey-transp\">\n <div class=\"flex\">\n <div class=\"gantt-product-col pos-sticky left-0 z-index-3 bg-light pd-small br-r br-solid br-grey-transp\">\n Product\n </div>\n \n <div class=\"gantt-timeline flex\">\n <div\n v-for=\"(cell, i) in visibleCells\"\n :key=\"cell.key\"\n class=\"gantt-cell br-r br-solid br-grey-transp t-center pd-small\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n >\n <GanttHeaderCell :cell=\"cell\" :view=\"view\" :index=\"i\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"gantt-body\">\n <div \n v-for=\"(group, i) in groups\" \n :key=\"group.key\" \n class=\"gantt-row flex br-b br-solid br-grey-transp\"\n :class=\"i % 2 === 0 ? 'bg-light-transp' : ''\"\n :style=\"{ height: rowHeight + 'px' }\"\n >\n <div class=\"gantt-product-col pos-sticky left-0 z-index-1 bg-white pd-small br-r br-solid br-grey-transp\">\n <div class=\"t-medium mn-b-micro\">{{ group.title }}</div>\n <div class=\"t-micro\" :class=\"statusClass(group)\">{{ group.status }}</div>\n </div>\n \n <div class=\"gantt-timeline pos-relative\">\n <!-- Background cells -->\n <div class=\"gantt-cells flex pos-absolute h-100\">\n <div\n v-for=\"cell in visibleCells\"\n :key=\"cell.key + '-bg'\"\n class=\"gantt-cell h-100 br-r br-solid br-grey-transp\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n />\n </div>\n \n <!-- Bars -->\n <div class=\"gantt-bars pos-absolute h-100\">\n <GanttBar\n v-for=\"bar in getBars(group)\"\n :key=\"bar.key\"\n :bar=\"bar\"\n :view=\"view\"\n @click=\"$emit('item-click', bar.item)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onUnmounted, watch, nextTick, shallowRef, onMounted } from 'vue'\nimport dayjs from 'dayjs'\n// import utc from 'dayjs/plugin/utc'\n// import timezone from 'dayjs/plugin/timezone'\n\n// dayjs.extend(utc)\n// dayjs.extend(timezone)\n\nimport GanttToolbar from './GanttToolbar.vue'\nimport GanttHeaderCell from './GanttHeaderCell.vue'\nimport GanttBar from './GanttBar.vue'\n\nconst props = defineProps({\n items: { type: Array, required: true },\n view: { type: String, default: 'days' },\n date: { type: Date, required: true },\n dateRange: { type: Object, required: true },\n views: {\n type: Array,\n default: () => [\n { name: 'Hours', value: 'hours', width: 60 },\n { name: 'Days', value: 'days', width: 60 },\n { name: 'Weeks', value: 'weeks', width: 120 }\n ]\n },\n titleKey: { type: String, default: 'title' },\n startKey: { type: String, default: 'startDate' },\n endKey: { type: String, default: 'endDate' },\n statusKey: { type: String, default: 'status' },\n idKey: { type: String, default: 'id' },\n groupBy: { type: String, default: 'title' },\n loading: { type: Boolean, default: false },\n rowHeight: { type: Number, default: 60 }\n})\n\nconst emit = defineEmits([\n 'update:view',\n 'update:date', \n 'update:dateRange',\n 'load-more',\n 'item-click',\n 'today'\n])\n\n// State\nconst container = ref(null)\nconst scrollLeft = ref(0)\nconst loadPromise = ref(null)\n\n// Cell width\nconst cellWidth = computed(() => {\n const view = props.views.find(v => v.value === props.view)\n return view?.width || 60\n})\n\n// Visible cells\nconst visibleCells = computed(() => {\n if (!props.dateRange) return []\n \n const { start, end } = props.dateRange\n const cells = []\n \n switch (props.view) {\n case 'hours':\n // Start from beginning of the day (use only first day)\n const startDay = new Date(start)\n startDay.setHours(0, 0, 0, 0)\n \n // Generate hour cells for 24 hours (one day)\n for (let h = 0; h < 24; h++) {\n const cellDate = new Date(startDay)\n cellDate.setHours(h, 0, 0, 0)\n cells.push({\n type: 'hour',\n date: cellDate,\n hour: h,\n key: `${startDay.getTime()}-${h}`\n })\n }\n \n break\n \n case 'days':\n for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n cells.push({\n type: 'day',\n date: new Date(d),\n key: d.getTime()\n })\n }\n break\n \n case 'weeks':\n const weekStart = new Date(start)\n weekStart.setDate(start.getDate() - start.getDay())\n \n const currentWeek = new Date(weekStart)\n while (currentWeek <= end) {\n const weekEnd = new Date(currentWeek)\n weekEnd.setDate(currentWeek.getDate() + 6)\n \n cells.push({\n type: 'week',\n start: new Date(currentWeek),\n end: new Date(weekEnd),\n key: currentWeek.getTime()\n })\n \n currentWeek.setDate(currentWeek.getDate() + 7)\n }\n break\n }\n \n return cells\n})\n\n// Cache for bars calculation\nconst barsCache = new WeakMap()\n\n// Groups\nconst groups = computed(() => {\n const map = new Map()\n \n props.items.forEach(item => {\n const key = item[props.groupBy] || 'Ungrouped'\n \n if (!map.has(key)) {\n map.set(key, {\n key,\n title: key,\n items: [],\n status: item[props.statusKey]\n })\n }\n \n map.get(key).items.push(item)\n })\n \n return Array.from(map.values())\n})\n\n// Cell class\nconst getCellClass = (cell) => {\n const classes = []\n const now = dayjs()\n \n switch (cell.type) {\n case 'hour':\n if (dayjs(cell.date).isSame(now, 'day') && cell.hour === now.hour()) {\n classes.push('bg-blue-transp')\n } else if (dayjs(cell.date).isSame(now, 'day')) {\n classes.push('bg-light')\n }\n break\n \n case 'day':\n const day = dayjs(cell.date).day()\n if (day === 0 || day === 6) classes.push('bg-light')\n if (dayjs(cell.date).isSame(now, 'day')) classes.push('bg-blue-transp')\n break\n \n case 'week':\n if (now.isAfter(cell.start) && now.isBefore(cell.end)) {\n classes.push('bg-blue-transp')\n }\n break\n }\n \n return classes.join(' ')\n}\n\n// Status class\nconst statusClass = (group) => {\n const s = group.status || 'default'\n const map = {\n active: 't-green',\n completed: 't-blue',\n canceled: 't-red',\n default: 't-transp'\n }\n return map[s] || map.default\n}\n\n// Get bars\nconst getBars = (group) => {\n const result = []\n const rows = []\n \n group.items.forEach(item => {\n try {\n const start = item[props.startKey]\n const end = item[props.endKey]\n \n if (!start || !end) return\n \n const s = start instanceof Date ? new Date(start) : dayjs(start).toDate()\n const e = end instanceof Date ? new Date(end) : dayjs(end).toDate()\n \n if (isNaN(s.getTime()) || isNaN(e.getTime())) {\n console.warn(`Invalid dates for item ${item[props.idKey]}:`, { start, end })\n return\n }\n \n // Skip if completely outside visible range\n if (e < props.dateRange.start || s > props.dateRange.end) return\n \n // Calculate position\n let left = 0\n let width = 0\n \n // Minimum width for very short intervals\n const minWidth = cellWidth.value * 0.1\n \n switch (props.view) {\n case 'hours':\n if (!visibleCells.value.length) return\n \n // Get the first cell's time as base reference\n const firstCell = visibleCells.value[0]\n const baseTime = new Date(firstCell.date)\n baseTime.setHours(0, 0, 0, 0)\n \n // Calculate exact minute positions from base time\n const minuteMs = 60 * 1000\n const hourMs = 60 * 60 * 1000\n \n // For long bars (>1 day), limit to visible day range\n const dayStart = new Date(baseTime)\n dayStart.setHours(0, 0, 0, 0)\n const dayEnd = new Date(baseTime)\n dayEnd.setHours(23, 59, 59, 999)\n \n const visibleStart = s < dayStart ? dayStart : s\n const visibleEnd = e > dayEnd ? dayEnd : e\n \n // Calculate hour positions with minute precision\n const startHours = (visibleStart - baseTime) / hourMs\n const endHours = (visibleEnd - baseTime) / hourMs\n \n // Clip to visible range (0-24 hours)\n const clippedStart = Math.max(0, startHours)\n const clippedEnd = Math.min(24, endHours)\n \n // Skip if completely outside visible range\n if (clippedEnd <= clippedStart) {\n return\n }\n \n // Calculate pixel position\n left = clippedStart * cellWidth.value\n width = (clippedEnd - clippedStart) * cellWidth.value\n \n // Apply minimum width for very short intervals (3-7 minutes should be visible)\n width = Math.max(width, minWidth)\n \n break\n \n case 'days':\n const firstDay = visibleCells.value[0]?.date\n if (!firstDay) return\n \n const firstDayStart = new Date(firstDay)\n firstDayStart.setHours(0, 0, 0, 0)\n \n // Calculate exact positions with minute precision\n const dayMs = 24 * 60 * 60 * 1000\n const startDayFloat = (s - firstDayStart) / dayMs\n const endDayFloat = (e - firstDayStart) / dayMs\n \n // Clip to visible range\n const visibleDays = visibleCells.value.length\n const clippedStartDay = Math.max(0, startDayFloat)\n const clippedEndDay = Math.min(visibleDays, endDayFloat)\n \n // Skip if completely outside visible range\n if (clippedEndDay <= clippedStartDay) return\n \n left = clippedStartDay * cellWidth.value\n width = (clippedEndDay - clippedStartDay) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n \n case 'weeks':\n const firstWeek = visibleCells.value[0]?.start\n if (!firstWeek) return\n \n // Calculate exact positions with minute precision\n const weekMs = 7 * 24 * 60 * 60 * 1000\n const startWeekFloat = (s - firstWeek) / weekMs\n const endWeekFloat = (e - firstWeek) / weekMs\n \n // Clip to visible range\n const visibleWeeks = visibleCells.value.length\n const clippedStartWeek = Math.max(0, startWeekFloat)\n const clippedEndWeek = Math.min(visibleWeeks, endWeekFloat)\n \n // Skip if completely outside visible range\n if (clippedEndWeek <= clippedStartWeek) return\n \n left = clippedStartWeek * cellWidth.value\n width = (clippedEndWeek - clippedStartWeek) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n }\n \n // Find row\n let row = 0\n let placed = false\n \n while (!placed) {\n if (!rows[row]) rows[row] = []\n \n const overlap = rows[row].some(b => \n (s <= b.end && e >= b.start)\n )\n \n if (!overlap) {\n rows[row].push({ start: s, end: e })\n placed = true\n } else {\n row++\n }\n }\n \n result.push({\n key: `${item[props.idKey]}-${s.getTime()}`,\n item,\n left,\n width,\n row,\n status: item[props.statusKey] || 'default'\n })\n } catch (error) {\n console.error(`Error processing item ${item[props.idKey]}:`, error)\n }\n })\n \n return result\n}\n\n// Throttle\nconst throttle = (fn, delay) => {\n let lastCall = 0\n let timeout = null\n \n const throttled = (...args) => {\n const now = Date.now()\n const remaining = delay - (now - lastCall)\n \n if (remaining <= 0) {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n lastCall = now\n return fn(...args)\n }\n \n if (!timeout) {\n timeout = setTimeout(() => {\n lastCall = Date.now()\n timeout = null\n fn(...args)\n }, remaining)\n }\n }\n \n throttled.cancel = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n }\n \n return throttled\n}\n\n// Scroll handling\nconst handleScroll = throttle(async (event) => {\n if (!container.value) return\n \n const el = event.target\n scrollLeft.value = el.scrollLeft\n \n const scrollWidth = el.scrollWidth\n const clientWidth = el.clientWidth\n const currentScrollLeft = el.scrollLeft\n \n const threshold = 100\n \n if (currentScrollLeft < threshold && !props.loading && !loadPromise.value) {\n loadPromise.value = emit('load-more', 'backward')\n if (loadPromise.value?.then) {\n await loadPromise.value\n loadPromise.value = null\n }\n } else if (scrollWidth - (currentScrollLeft + clientWidth) < threshold && !props.loading && !loadPromise.value) {\n loadPromise.value = emit('load-more', 'forward')\n if (loadPromise.value?.then) {\n await loadPromise.value\n loadPromise.value = null\n }\n }\n}, 100)\n\n// Cleanup\nonUnmounted(() => {\n handleScroll.cancel()\n})\n\n// Center view on specific date\nconst centerOnDate = (targetDate) => {\n if (!container.value) return\n \n nextTick(() => {\n const cells = visibleCells.value\n if (!cells.length) return\n \n let cellIndex = -1\n \n switch (props.view) {\n case 'hours':\n cellIndex = cells.findIndex(c => \n c.type === 'hour' &&\n dayjs(c.date).isSame(targetDate, 'day') &&\n c.hour === targetDate.getHours()\n )\n break\n \n case 'days':\n cellIndex = cells.findIndex(c =>\n c.type === 'day' &&\n dayjs(c.date).isSame(targetDate, 'day')\n )\n break\n \n case 'weeks':\n cellIndex = cells.findIndex(c =>\n c.type === 'week' &&\n targetDate >= c.start &&\n targetDate <= c.end\n )\n break\n }\n \n if (cellIndex >= 0) {\n const scrollPos = cellIndex * cellWidth.value - container.value.clientWidth / 2\n container.value.scrollLeft = Math.max(0, scrollPos)\n }\n })\n}\n\n// Watch for view or date range changes\nwatch(() => props.view, () => {\n // Center on current date when view changes\n centerOnDate(props.date)\n})\n\nwatch(() => props.dateRange, () => {\n // Reset scroll position when date range changes significantly\n if (container.value) {\n container.value.scrollLeft = 0\n }\n}, { deep: true })\n</script>\n\n<style>\n.gantt-container {\n --cell-width: 60px;\n height: 500px;\n position: relative;\n}\n\n.gantt-content {\n width: fit-content;\n min-width: 100%;\n}\n\n.gantt-header {\n height: 60px;\n}\n\n.gantt-product-col {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n}\n\n.gantt-timeline {\n position: relative;\n min-width: fit-content;\n}\n\n.gantt-cell {\n min-width: var(--cell-width);\n flex-shrink: 0;\n}\n\n.gantt-row {\n position: relative;\n}\n\n.gantt-cells,\n.gantt-bars {\n width: fit-content;\n left: 0;\n}\n</style>"],"names":["ref","computed","dayjs","onUnmounted","nextTick","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+FA,UAAM,QAAQ;AAuBd,UAAM,OAAO;AAUb,UAAM,YAAYA,IAAAA,IAAI,IAAI;AAC1B,UAAM,aAAaA,IAAAA,IAAI,CAAC;AACxB,UAAM,cAAcA,IAAAA,IAAI,IAAI;AAG5B,UAAM,YAAYC,IAAAA,SAAS,MAAM;AAC/B,YAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,UAAU,MAAM,IAAI;AACzD,aAAO,MAAM,SAAS;AAAA,IACxB,CAAC;AAGD,UAAM,eAAeA,IAAAA,SAAS,MAAM;AAClC,UAAI,CAAC,MAAM,UAAW,QAAO,CAAA;AAE7B,YAAM,EAAE,OAAO,IAAG,IAAK,MAAM;AAC7B,YAAM,QAAQ,CAAA;AAEd,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AAEH,gBAAM,WAAW,IAAI,KAAK,KAAK;AAC/B,mBAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAG5B,mBAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,kBAAM,WAAW,IAAI,KAAK,QAAQ;AAClC,qBAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAC5B,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,cACN,KAAK,GAAG,SAAS,QAAO,CAAE,IAAI,CAAC;AAAA,YACzC,CAAS;AAAA,UACH;AAEA;AAAA,QAEF,KAAK;AACH,mBAAS,IAAI,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,EAAE,QAAQ,EAAE,QAAO,IAAK,CAAC,GAAG;AAClE,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,MAAM,IAAI,KAAK,CAAC;AAAA,cAChB,KAAK,EAAE,QAAO;AAAA,YACxB,CAAS;AAAA,UACH;AACA;AAAA,QAEF,KAAK;AACH,gBAAM,YAAY,IAAI,KAAK,KAAK;AAChC,oBAAU,QAAQ,MAAM,QAAO,IAAK,MAAM,OAAM,CAAE;AAElD,gBAAM,cAAc,IAAI,KAAK,SAAS;AACtC,iBAAO,eAAe,KAAK;AACzB,kBAAM,UAAU,IAAI,KAAK,WAAW;AACpC,oBAAQ,QAAQ,YAAY,QAAO,IAAK,CAAC;AAEzC,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,OAAO,IAAI,KAAK,WAAW;AAAA,cAC3B,KAAK,IAAI,KAAK,OAAO;AAAA,cACrB,KAAK,YAAY,QAAO;AAAA,YAClC,CAAS;AAED,wBAAY,QAAQ,YAAY,QAAO,IAAK,CAAC;AAAA,UAC/C;AACA;AAAA,MACN;AAEE,aAAO;AAAA,IACT,CAAC;AAMD,UAAM,SAASA,IAAAA,SAAS,MAAM;AAC5B,YAAM,MAAM,oBAAI,IAAG;AAEnB,YAAM,MAAM,QAAQ,UAAQ;AAC1B,cAAM,MAAM,KAAK,MAAM,OAAO,KAAK;AAEnC,YAAI,CAAC,IAAI,IAAI,GAAG,GAAG;AACjB,cAAI,IAAI,KAAK;AAAA,YACX;AAAA,YACA,OAAO;AAAA,YACP,OAAO,CAAA;AAAA,YACP,QAAQ,KAAK,MAAM,SAAS;AAAA,UACpC,CAAO;AAAA,QACH;AAEA,YAAI,IAAI,GAAG,EAAE,MAAM,KAAK,IAAI;AAAA,MAC9B,CAAC;AAED,aAAO,MAAM,KAAK,IAAI,OAAM,CAAE;AAAA,IAChC,CAAC;AAGD,UAAM,eAAe,CAAC,SAAS;AAC7B,YAAM,UAAU,CAAA;AAChB,YAAM,MAAMC,UAAAA,QAAK;AAEjB,cAAQ,KAAK,MAAI;AAAA,QACf,KAAK;AACH,cAAIA,kBAAM,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,KAAI,GAAI;AACnE,oBAAQ,KAAK,gBAAgB;AAAA,UAC/B,WAAWA,UAAAA,QAAM,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,GAAG;AAC9C,oBAAQ,KAAK,UAAU;AAAA,UACzB;AACA;AAAA,QAEF,KAAK;AACH,gBAAM,MAAMA,UAAAA,QAAM,KAAK,IAAI,EAAE,IAAG;AAChC,cAAI,QAAQ,KAAK,QAAQ,EAAG,SAAQ,KAAK,UAAU;AACnD,cAAIA,UAAAA,QAAM,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,EAAG,SAAQ,KAAK,gBAAgB;AACtE;AAAA,QAEF,KAAK;AACH,cAAI,IAAI,QAAQ,KAAK,KAAK,KAAK,IAAI,SAAS,KAAK,GAAG,GAAG;AACrD,oBAAQ,KAAK,gBAAgB;AAAA,UAC/B;AACA;AAAA,MACN;AAEE,aAAO,QAAQ,KAAK,GAAG;AAAA,IACzB;AAGA,UAAM,cAAc,CAAC,UAAU;AAC7B,YAAM,IAAI,MAAM,UAAU;AAC1B,YAAM,MAAM;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,MACb;AACE,aAAO,IAAI,CAAC,KAAK,IAAI;AAAA,IACvB;AAGA,UAAM,UAAU,CAAC,UAAU;AACzB,YAAM,SAAS,CAAA;AACf,YAAM,OAAO,CAAA;AAEb,YAAM,MAAM,QAAQ,UAAQ;AAC1B,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,gBAAM,MAAM,KAAK,MAAM,MAAM;AAE7B,cAAI,CAAC,SAAS,CAAC,IAAK;AAEpB,gBAAM,IAAI,iBAAiB,OAAO,IAAI,KAAK,KAAK,IAAIA,UAAAA,QAAM,KAAK,EAAE,OAAM;AACvE,gBAAM,IAAI,eAAe,OAAO,IAAI,KAAK,GAAG,IAAIA,UAAAA,QAAM,GAAG,EAAE,OAAM;AAEjE,cAAI,MAAM,EAAE,QAAO,CAAE,KAAK,MAAM,EAAE,QAAO,CAAE,GAAG;AAC5C,oBAAQ,KAAK,0BAA0B,KAAK,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,IAAG,CAAE;AAC3E;AAAA,UACF;AAGF,cAAI,IAAI,MAAM,UAAU,SAAS,IAAI,MAAM,UAAU,IAAK;AAG1D,cAAI,OAAO;AACX,cAAI,QAAQ;AAGZ,gBAAM,WAAW,UAAU,QAAQ;AAEnC,kBAAQ,MAAM,MAAI;AAAA,YAChB,KAAK;AACH,kBAAI,CAAC,aAAa,MAAM,OAAQ;AAGhC,oBAAM,YAAY,aAAa,MAAM,CAAC;AACtC,oBAAM,WAAW,IAAI,KAAK,UAAU,IAAI;AACxC,uBAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAG5B,oBAAM,WAAW,KAAK;AACtB,oBAAM,SAAS,KAAK,KAAK;AAGzB,oBAAM,WAAW,IAAI,KAAK,QAAQ;AAClC,uBAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAC5B,oBAAM,SAAS,IAAI,KAAK,QAAQ;AAChC,qBAAO,SAAS,IAAI,IAAI,IAAI,GAAG;AAE/B,oBAAM,eAAe,IAAI,WAAW,WAAW;AAC/C,oBAAM,aAAa,IAAI,SAAS,SAAS;AAGzC,oBAAM,cAAc,eAAe,YAAY;AAC/C,oBAAM,YAAY,aAAa,YAAY;AAG3C,oBAAM,eAAe,KAAK,IAAI,GAAG,UAAU;AAC3C,oBAAM,aAAa,KAAK,IAAI,IAAI,QAAQ;AAGxC,kBAAI,cAAc,cAAc;AAC9B;AAAA,cACF;AAGA,qBAAO,eAAe,UAAU;AAChC,uBAAS,aAAa,gBAAgB,UAAU;AAGhD,sBAAQ,KAAK,IAAI,OAAO,QAAQ;AAEhC;AAAA,YAEF,KAAK;AACH,oBAAM,WAAW,aAAa,MAAM,CAAC,GAAG;AACxC,kBAAI,CAAC,SAAU;AAEf,oBAAM,gBAAgB,IAAI,KAAK,QAAQ;AACvC,4BAAc,SAAS,GAAG,GAAG,GAAG,CAAC;AAGjC,oBAAM,QAAQ,KAAK,KAAK,KAAK;AAC7B,oBAAM,iBAAiB,IAAI,iBAAiB;AAC5C,oBAAM,eAAe,IAAI,iBAAiB;AAG1C,oBAAM,cAAc,aAAa,MAAM;AACvC,oBAAM,kBAAkB,KAAK,IAAI,GAAG,aAAa;AACjD,oBAAM,gBAAgB,KAAK,IAAI,aAAa,WAAW;AAGvD,kBAAI,iBAAiB,gBAAiB;AAEtC,qBAAO,kBAAkB,UAAU;AACnC,uBAAS,gBAAgB,mBAAmB,UAAU;AAGtD,sBAAQ,KAAK,IAAI,OAAO,QAAQ;AAChC;AAAA,YAEF,KAAK;AACH,oBAAM,YAAY,aAAa,MAAM,CAAC,GAAG;AACzC,kBAAI,CAAC,UAAW;AAGhB,oBAAM,SAAS,IAAI,KAAK,KAAK,KAAK;AAClC,oBAAM,kBAAkB,IAAI,aAAa;AACzC,oBAAM,gBAAgB,IAAI,aAAa;AAGvC,oBAAM,eAAe,aAAa,MAAM;AACxC,oBAAM,mBAAmB,KAAK,IAAI,GAAG,cAAc;AACnD,oBAAM,iBAAiB,KAAK,IAAI,cAAc,YAAY;AAG1D,kBAAI,kBAAkB,iBAAkB;AAExC,qBAAO,mBAAmB,UAAU;AACpC,uBAAS,iBAAiB,oBAAoB,UAAU;AAGxD,sBAAQ,KAAK,IAAI,OAAO,QAAQ;AAChC;AAAA,UACR;AAGI,cAAI,MAAM;AACV,cAAI,SAAS;AAEb,iBAAO,CAAC,QAAQ;AACd,gBAAI,CAAC,KAAK,GAAG,EAAG,MAAK,GAAG,IAAI,CAAA;AAE5B,kBAAM,UAAU,KAAK,GAAG,EAAE;AAAA,cAAK,OAC5B,KAAK,EAAE,OAAO,KAAK,EAAE;AAAA,YAC9B;AAEM,gBAAI,CAAC,SAAS;AACZ,mBAAK,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,EAAC,CAAE;AACnC,uBAAS;AAAA,YACX,OAAO;AACL;AAAA,YACF;AAAA,UACF;AAEE,iBAAO,KAAK;AAAA,YACV,KAAK,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI,EAAE,QAAO,CAAE;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,KAAK,MAAM,SAAS,KAAK;AAAA,UACzC,CAAO;AAAA,QACH,SAAS,OAAO;AACd,kBAAQ,MAAM,yBAAyB,KAAK,MAAM,KAAK,CAAC,KAAK,KAAK;AAAA,QACpE;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,CAAC,IAAI,UAAU;AAC9B,UAAI,WAAW;AACf,UAAI,UAAU;AAEd,YAAM,YAAY,IAAI,SAAS;AAC7B,cAAM,MAAM,KAAK,IAAG;AACpB,cAAM,YAAY,SAAS,MAAM;AAEjC,YAAI,aAAa,GAAG;AAClB,cAAI,SAAS;AACX,yBAAa,OAAO;AACpB,sBAAU;AAAA,UACZ;AACA,qBAAW;AACX,iBAAO,GAAG,GAAG,IAAI;AAAA,QACnB;AAEA,YAAI,CAAC,SAAS;AACZ,oBAAU,WAAW,MAAM;AACzB,uBAAW,KAAK,IAAG;AACnB,sBAAU;AACV,eAAG,GAAG,IAAI;AAAA,UACZ,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AAEA,gBAAU,SAAS,MAAM;AACvB,YAAI,SAAS;AACX,uBAAa,OAAO;AACpB,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,SAAS,OAAO,UAAU;AAC7C,UAAI,CAAC,UAAU,MAAO;AAEtB,YAAM,KAAK,MAAM;AACjB,iBAAW,QAAQ,GAAG;AAEtB,YAAM,cAAc,GAAG;AACvB,YAAM,cAAc,GAAG;AACvB,YAAM,oBAAoB,GAAG;AAE7B,YAAM,YAAY;AAElB,UAAI,oBAAoB,aAAa,CAAC,MAAM,WAAW,CAAC,YAAY,OAAO;AACzE,oBAAY,QAAQ,KAAK,aAAa,UAAU;AAChD,YAAI,YAAY,OAAO,MAAM;AAC3B,gBAAM,YAAY;AAClB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF,WAAW,eAAe,oBAAoB,eAAe,aAAa,CAAC,MAAM,WAAW,CAAC,YAAY,OAAO;AAC9G,oBAAY,QAAQ,KAAK,aAAa,SAAS;AAC/C,YAAI,YAAY,OAAO,MAAM;AAC3B,gBAAM,YAAY;AAClB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF,GAAG,GAAG;AAGNC,QAAAA,YAAY,MAAM;AAChB,mBAAa,OAAM;AAAA,IACrB,CAAC;AAGD,UAAM,eAAe,CAAC,eAAe;AACnC,UAAI,CAAC,UAAU,MAAO;AAEtBC,UAAAA,SAAS,MAAM;AACb,cAAM,QAAQ,aAAa;AAC3B,YAAI,CAAC,MAAM,OAAQ;AAEnB,YAAI,YAAY;AAEhB,gBAAQ,MAAM,MAAI;AAAA,UAChB,KAAK;AACH,wBAAY,MAAM;AAAA,cAAU,OAC1B,EAAE,SAAS,UACXF,UAAAA,QAAM,EAAE,IAAI,EAAE,OAAO,YAAY,KAAK,KACtC,EAAE,SAAS,WAAW,SAAQ;AAAA,YACxC;AACQ;AAAA,UAEF,KAAK;AACH,wBAAY,MAAM;AAAA,cAAU,OAC1B,EAAE,SAAS,SACXA,UAAAA,QAAM,EAAE,IAAI,EAAE,OAAO,YAAY,KAAK;AAAA,YAChD;AACQ;AAAA,UAEF,KAAK;AACH,wBAAY,MAAM;AAAA,cAAU,OAC1B,EAAE,SAAS,UACX,cAAc,EAAE,SAChB,cAAc,EAAE;AAAA,YAC1B;AACQ;AAAA,QACR;AAEI,YAAI,aAAa,GAAG;AAClB,gBAAM,YAAY,YAAY,UAAU,QAAQ,UAAU,MAAM,cAAc;AAC9E,oBAAU,MAAM,aAAa,KAAK,IAAI,GAAG,SAAS;AAAA,QACpD;AAAA,MACF,CAAC;AAAA,IACH;AAGAG,QAAAA,MAAM,MAAM,MAAM,MAAM,MAAM;AAE5B,mBAAa,MAAM,IAAI;AAAA,IACzB,CAAC;AAEDA,QAAAA,MAAM,MAAM,MAAM,WAAW,MAAM;AAEjC,UAAI,UAAU,OAAO;AACnB,kBAAU,MAAM,aAAa;AAAA,MAC/B;AAAA,IACF,GAAG,EAAE,MAAM,KAAI,CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"GanttChart.vue.cjs","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttChart.vue"],"sourcesContent":["<template>\n <div class=\"w-100\" :style=\"{ '--cell-width': cellWidth + 'px' }\">\n <GanttToolbar\n :view=\"view\"\n :views=\"views\"\n :date=\"date\"\n @update:view=\"$emit('update:view', $event)\"\n @update:date=\"$emit('update:date', $event)\"\n @today=\"$emit('today')\"\n @load-more=\"$emit('load-more', $event)\"\n />\n \n <div \n class=\"gantt-container scroller o-scroll bg-white radius-small br-solid br-1px br-black-transp-10\"\n ref=\"container\"\n @scroll=\"handleScroll\"\n >\n <div class=\"gantt-content\">\n <!-- Header -->\n <div class=\"gantt-header pos-sticky top-0 z-index-2 bg-white br-b br-solid br-black-transp-10\">\n <div class=\"flex\">\n <div class=\"gantt-product-col pos-sticky left-0 z-index-3 bg-light pd-small br-r br-solid br-black-transp-10\">\n Product\n </div>\n \n <div class=\"gantt-timeline flex\">\n <div\n v-for=\"(cell, i) in visibleCells\"\n :key=\"cell.key\"\n class=\"gantt-cell br-r br-solid br-black-transp-10 t-center pd-small\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n >\n <GanttHeaderCell :cell=\"cell\" :view=\"view\" :index=\"i\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"gantt-body\">\n <div \n v-for=\"(group, i) in groups\" \n :key=\"group.key\" \n class=\"gantt-row flex br-b br-solid br-black-transp-10\"\n :class=\"i % 2 === 0 ? 'bg-light-transp' : ''\"\n :style=\"{ height: rowHeight + 'px' }\"\n >\n <div class=\"gantt-product-col pos-sticky left-0 z-index-1 bg-white pd-small br-r br-solid br-black-transp-10\">\n <div class=\"t-medium mn-b-micro\">{{ group.title }}</div>\n <div class=\"t-micro\" :class=\"statusClass(group)\">{{ group.status }}</div>\n </div>\n \n <div class=\"gantt-timeline pos-relative\">\n <!-- Background cells -->\n <div class=\"gantt-cells flex pos-absolute h-100\">\n <div\n v-for=\"cell in visibleCells\"\n :key=\"cell.key + '-bg'\"\n class=\"gantt-cell h-100 br-r br-solid br-black-transp-10\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n />\n </div>\n \n <!-- Bars -->\n <div class=\"gantt-bars pos-absolute h-100\">\n <GanttBar\n v-for=\"bar in getBars(group)\"\n :key=\"bar.key\"\n :bar=\"bar\"\n :view=\"view\"\n @click=\"$emit('item-click', bar.item)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onUnmounted, watch, nextTick, shallowRef, onMounted } from 'vue'\nimport dayjs from 'dayjs'\n// import utc from 'dayjs/plugin/utc'\n// import timezone from 'dayjs/plugin/timezone'\n\n// dayjs.extend(utc)\n// dayjs.extend(timezone)\n\nimport GanttToolbar from './GanttToolbar.vue'\nimport GanttHeaderCell from './GanttHeaderCell.vue'\nimport GanttBar from './GanttBar.vue'\n\nconst props = defineProps({\n items: { type: Array, required: true },\n view: { type: String, default: 'days' },\n date: { type: Date, required: true },\n dateRange: { type: Object, required: true },\n views: {\n type: Array,\n default: () => [\n { name: 'Hours', value: 'hours', width: 60 },\n { name: 'Days', value: 'days', width: 60 },\n { name: 'Weeks', value: 'weeks', width: 120 }\n ]\n },\n titleKey: { type: String, default: 'title' },\n startKey: { type: String, default: 'startDate' },\n endKey: { type: String, default: 'endDate' },\n statusKey: { type: String, default: 'status' },\n idKey: { type: String, default: 'id' },\n groupBy: { type: String, default: 'title' },\n loading: { type: Boolean, default: false },\n rowHeight: { type: Number, default: 60 }\n})\n\nconst emit = defineEmits([\n 'update:view',\n 'update:date', \n 'update:dateRange',\n 'load-more',\n 'item-click',\n 'today'\n])\n\n// State\nconst container = ref(null)\nconst scrollLeft = ref(0)\n\n// Cell width\nconst cellWidth = computed(() => {\n const view = props.views.find(v => v.value === props.view)\n return view?.width || 60\n})\n\n// Visible cells\nconst visibleCells = computed(() => {\n if (!props.dateRange) return []\n \n const { start, end } = props.dateRange\n const cells = []\n \n switch (props.view) {\n case 'hours':\n // Start from beginning of the day (use only first day)\n const startDay = new Date(start)\n startDay.setHours(0, 0, 0, 0)\n \n // Generate hour cells for 24 hours (one day)\n for (let h = 0; h < 24; h++) {\n const cellDate = new Date(startDay)\n cellDate.setHours(h, 0, 0, 0)\n cells.push({\n type: 'hour',\n date: cellDate,\n hour: h,\n key: `${startDay.getTime()}-${h}`\n })\n }\n \n break\n \n case 'days':\n for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n cells.push({\n type: 'day',\n date: new Date(d),\n key: d.getTime()\n })\n }\n break\n \n case 'weeks':\n const weekStart = new Date(start)\n weekStart.setDate(start.getDate() - start.getDay())\n \n const currentWeek = new Date(weekStart)\n while (currentWeek <= end) {\n const weekEnd = new Date(currentWeek)\n weekEnd.setDate(currentWeek.getDate() + 6)\n \n cells.push({\n type: 'week',\n start: new Date(currentWeek),\n end: new Date(weekEnd),\n key: currentWeek.getTime()\n })\n \n currentWeek.setDate(currentWeek.getDate() + 7)\n }\n break\n }\n \n return cells\n})\n\n// Cache for bars calculation\nconst barsCache = new WeakMap()\n\n// Helper function to get nested property value\nconst getNestedValue = (obj, path) => {\n return path.split('.').reduce((current, key) => current?.[key], obj)\n}\n\n// Groups\nconst groups = computed(() => {\n const map = new Map()\n \n props.items.forEach(item => {\n const key = getNestedValue(item, props.groupBy) || 'Ungrouped'\n \n if (!map.has(key)) {\n map.set(key, {\n key,\n title: key,\n items: [],\n status: getNestedValue(item, props.statusKey)\n })\n }\n \n map.get(key).items.push(item)\n })\n \n return Array.from(map.values())\n})\n\n// Cell class\nconst getCellClass = (cell) => {\n const classes = []\n const now = dayjs()\n \n switch (cell.type) {\n case 'hour':\n if (dayjs(cell.date).isSame(now, 'day') && cell.hour === now.hour()) {\n classes.push('bg-blue-transp')\n } else if (dayjs(cell.date).isSame(now, 'day')) {\n classes.push('bg-light')\n }\n break\n \n case 'day':\n const day = dayjs(cell.date).day()\n if (day === 0 || day === 6) classes.push('bg-light')\n if (dayjs(cell.date).isSame(now, 'day')) classes.push('bg-blue-transp')\n break\n \n case 'week':\n if (now.isAfter(cell.start) && now.isBefore(cell.end)) {\n classes.push('bg-blue-transp')\n }\n break\n }\n \n return classes.join(' ')\n}\n\n// Status class\nconst statusClass = (group) => {\n const s = group.status || 'default'\n const map = {\n active: 't-green',\n completed: 't-blue',\n canceled: 't-red',\n default: 't-transp'\n }\n return map[s] || map.default\n}\n\n// Get bars\nconst getBars = (group) => {\n const result = []\n const rows = []\n \n group.items.forEach(item => {\n try {\n const start = getNestedValue(item, props.startKey)\n const end = getNestedValue(item, props.endKey)\n \n if (!start || !end) return\n \n const s = start instanceof Date ? new Date(start) : dayjs(start).toDate()\n const e = end instanceof Date ? new Date(end) : dayjs(end).toDate()\n \n if (isNaN(s.getTime()) || isNaN(e.getTime())) {\n console.warn(`Invalid dates for item ${getNestedValue(item, props.idKey)}:`, { start, end })\n return\n }\n \n console.log('Processing item:', {\n id: getNestedValue(item, props.idKey),\n start: s,\n end: e,\n dateRange: props.dateRange\n })\n \n // Skip if completely outside visible range\n if (e < props.dateRange.start || s > props.dateRange.end) {\n console.log('Item skipped - outside visible range')\n return\n }\n \n // Calculate position\n let left = 0\n let width = 0\n \n // Minimum width for very short intervals\n const minWidth = cellWidth.value * 0.1\n \n switch (props.view) {\n case 'hours':\n if (!visibleCells.value.length) return\n \n // Get the first cell's time as base reference\n const firstCell = visibleCells.value[0]\n const baseTime = new Date(firstCell.date)\n baseTime.setHours(0, 0, 0, 0)\n \n // Calculate exact minute positions from base time\n const minuteMs = 60 * 1000\n const hourMs = 60 * 60 * 1000\n \n // For long bars (>1 day), limit to visible day range\n const dayStart = new Date(baseTime)\n dayStart.setHours(0, 0, 0, 0)\n const dayEnd = new Date(baseTime)\n dayEnd.setHours(23, 59, 59, 999)\n \n const visibleStart = s < dayStart ? dayStart : s\n const visibleEnd = e > dayEnd ? dayEnd : e\n \n // Calculate hour positions with minute precision\n const startHours = (visibleStart - baseTime) / hourMs\n const endHours = (visibleEnd - baseTime) / hourMs\n \n // Clip to visible range (0-24 hours)\n const clippedStart = Math.max(0, startHours)\n const clippedEnd = Math.min(24, endHours)\n \n // Skip if completely outside visible range\n if (clippedEnd <= clippedStart) {\n return\n }\n \n // Calculate pixel position\n left = clippedStart * cellWidth.value\n width = (clippedEnd - clippedStart) * cellWidth.value\n \n // Apply minimum width for very short intervals (3-7 minutes should be visible)\n width = Math.max(width, minWidth)\n \n break\n \n case 'days':\n const firstDay = visibleCells.value[0]?.date\n if (!firstDay) return\n \n const firstDayStart = new Date(firstDay)\n firstDayStart.setHours(0, 0, 0, 0)\n \n // Calculate exact positions with minute precision\n const dayMs = 24 * 60 * 60 * 1000\n const startDayFloat = (s - firstDayStart) / dayMs\n const endDayFloat = (e - firstDayStart) / dayMs\n \n // Clip to visible range\n const visibleDays = visibleCells.value.length\n const clippedStartDay = Math.max(0, startDayFloat)\n const clippedEndDay = Math.min(visibleDays, endDayFloat)\n \n // Skip if completely outside visible range\n if (clippedEndDay <= clippedStartDay) return\n \n left = clippedStartDay * cellWidth.value\n width = (clippedEndDay - clippedStartDay) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n \n case 'weeks':\n const firstWeek = visibleCells.value[0]?.start\n if (!firstWeek) return\n \n // Calculate exact positions with minute precision\n const weekMs = 7 * 24 * 60 * 60 * 1000\n const startWeekFloat = (s - firstWeek) / weekMs\n const endWeekFloat = (e - firstWeek) / weekMs\n \n // Clip to visible range\n const visibleWeeks = visibleCells.value.length\n const clippedStartWeek = Math.max(0, startWeekFloat)\n const clippedEndWeek = Math.min(visibleWeeks, endWeekFloat)\n \n // Skip if completely outside visible range\n if (clippedEndWeek <= clippedStartWeek) return\n \n left = clippedStartWeek * cellWidth.value\n width = (clippedEndWeek - clippedStartWeek) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n }\n \n // Find row\n let row = 0\n let placed = false\n \n while (!placed) {\n if (!rows[row]) rows[row] = []\n \n const overlap = rows[row].some(b => \n (s <= b.end && e >= b.start)\n )\n \n if (!overlap) {\n rows[row].push({ start: s, end: e })\n placed = true\n } else {\n row++\n }\n }\n \n result.push({\n key: `${getNestedValue(item, props.idKey)}-${s.getTime()}`,\n item,\n left,\n width,\n row,\n status: getNestedValue(item, props.statusKey) || 'default'\n })\n } catch (error) {\n console.error(`Error processing item ${getNestedValue(item, props.idKey)}:`, error)\n }\n })\n \n console.log('Final bars result:', result)\n return result\n}\n\n// Throttle\nconst throttle = (fn, delay) => {\n let lastCall = 0\n let timeout = null\n \n const throttled = (...args) => {\n const now = Date.now()\n const remaining = delay - (now - lastCall)\n \n if (remaining <= 0) {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n lastCall = now\n return fn(...args)\n }\n \n if (!timeout) {\n timeout = setTimeout(() => {\n lastCall = Date.now()\n timeout = null\n fn(...args)\n }, remaining)\n }\n }\n \n throttled.cancel = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n }\n \n return throttled\n}\n\n// Scroll handling\nconst handleScroll = (event) => {\n if (!container.value) return\n \n const el = event.target\n scrollLeft.value = el.scrollLeft\n}\n\n// Cleanup\nonUnmounted(() => {\n // No cleanup needed\n})\n\n// Center view on specific date\nconst centerOnDate = (targetDate) => {\n if (!container.value) return\n \n nextTick(() => {\n const cells = visibleCells.value\n if (!cells.length) return\n \n let cellIndex = -1\n \n switch (props.view) {\n case 'hours':\n cellIndex = cells.findIndex(c => \n c.type === 'hour' &&\n dayjs(c.date).isSame(targetDate, 'day') &&\n c.hour === targetDate.getHours()\n )\n break\n \n case 'days':\n cellIndex = cells.findIndex(c =>\n c.type === 'day' &&\n dayjs(c.date).isSame(targetDate, 'day')\n )\n break\n \n case 'weeks':\n cellIndex = cells.findIndex(c =>\n c.type === 'week' &&\n targetDate >= c.start &&\n targetDate <= c.end\n )\n break\n }\n \n if (cellIndex >= 0) {\n const scrollPos = cellIndex * cellWidth.value - container.value.clientWidth / 2\n container.value.scrollLeft = Math.max(0, scrollPos)\n }\n })\n}\n\n// Watch for view or date range changes\nwatch(() => props.view, () => {\n // Center on current date when view changes\n centerOnDate(props.date)\n})\n\n// Watch for date changes (e.g., when Today button is clicked)\nwatch(() => props.date, (newDate) => {\n // Center on the new date, especially important for hours view\n centerOnDate(newDate)\n})\n\nwatch(() => props.dateRange, () => {\n // Reset scroll position when date range changes significantly\n if (container.value) {\n container.value.scrollLeft = 0\n }\n}, { deep: true })\n</script>\n\n<style>\n.gantt-container {\n --cell-width: 60px;\n height: 500px;\n position: relative;\n}\n\n.gantt-content {\n width: fit-content;\n min-width: 100%;\n}\n\n.gantt-header {\n height: 60px;\n}\n\n.gantt-product-col {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n}\n\n.gantt-timeline {\n position: relative;\n min-width: fit-content;\n}\n\n.gantt-cell {\n min-width: var(--cell-width);\n flex-shrink: 0;\n}\n\n.gantt-row {\n position: relative;\n}\n\n.gantt-cells,\n.gantt-bars {\n width: fit-content;\n left: 0;\n}\n</style>"],"names":["ref","computed","dayjs","onUnmounted","nextTick","watch"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
- import { ref, computed, onUnmounted, watch, createElementBlock, openBlock, normalizeStyle, createVNode, createElementVNode, unref, Fragment, renderList, normalizeClass, toDisplayString, createBlock, nextTick } from "vue";
1
+ import { ref, computed, onUnmounted, watch, createElementBlock, openBlock, normalizeStyle, createVNode, createElementVNode, Fragment, renderList, normalizeClass, toDisplayString, createBlock, nextTick } from "vue";
2
2
  import dayjs from "../../../../../../../../_virtual/dayjs.min.js";
3
3
  import _sfc_main$1 from "./GanttToolbar.vue.js";
4
4
  import _sfc_main$2 from "./GanttHeaderCell.vue.js";
5
5
  import _sfc_main$3 from "./GanttBar.vue.js";
6
6
  /* empty css */
7
7
  const _hoisted_1 = { class: "gantt-content" };
8
- const _hoisted_2 = { class: "gantt-header pos-sticky top-0 z-index-2 bg-white br-b br-solid br-grey-transp" };
8
+ const _hoisted_2 = { class: "gantt-header pos-sticky top-0 z-index-2 bg-white br-b br-solid br-black-transp-10" };
9
9
  const _hoisted_3 = { class: "flex" };
10
10
  const _hoisted_4 = { class: "gantt-timeline flex" };
11
11
  const _hoisted_5 = { class: "gantt-body" };
12
- const _hoisted_6 = { class: "gantt-product-col pos-sticky left-0 z-index-1 bg-white pd-small br-r br-solid br-grey-transp" };
12
+ const _hoisted_6 = { class: "gantt-product-col pos-sticky left-0 z-index-1 bg-white pd-small br-r br-solid br-black-transp-10" };
13
13
  const _hoisted_7 = { class: "t-medium mn-b-micro" };
14
14
  const _hoisted_8 = { class: "gantt-timeline pos-relative" };
15
15
  const _hoisted_9 = { class: "gantt-cells flex pos-absolute h-100" };
@@ -48,10 +48,8 @@ const _sfc_main = {
48
48
  ],
49
49
  setup(__props, { emit: __emit }) {
50
50
  const props = __props;
51
- const emit = __emit;
52
51
  const container = ref(null);
53
52
  const scrollLeft = ref(0);
54
- const loadPromise = ref(null);
55
53
  const cellWidth = computed(() => {
56
54
  const view = props.views.find((v) => v.value === props.view);
57
55
  return view?.width || 60;
@@ -103,16 +101,19 @@ const _sfc_main = {
103
101
  }
104
102
  return cells;
105
103
  });
104
+ const getNestedValue = (obj, path) => {
105
+ return path.split(".").reduce((current, key) => current?.[key], obj);
106
+ };
106
107
  const groups = computed(() => {
107
108
  const map = /* @__PURE__ */ new Map();
108
109
  props.items.forEach((item) => {
109
- const key = item[props.groupBy] || "Ungrouped";
110
+ const key = getNestedValue(item, props.groupBy) || "Ungrouped";
110
111
  if (!map.has(key)) {
111
112
  map.set(key, {
112
113
  key,
113
114
  title: key,
114
115
  items: [],
115
- status: item[props.statusKey]
116
+ status: getNestedValue(item, props.statusKey)
116
117
  });
117
118
  }
118
119
  map.get(key).items.push(item);
@@ -158,16 +159,25 @@ const _sfc_main = {
158
159
  const rows = [];
159
160
  group.items.forEach((item) => {
160
161
  try {
161
- const start = item[props.startKey];
162
- const end = item[props.endKey];
162
+ const start = getNestedValue(item, props.startKey);
163
+ const end = getNestedValue(item, props.endKey);
163
164
  if (!start || !end) return;
164
165
  const s = start instanceof Date ? new Date(start) : dayjs(start).toDate();
165
166
  const e = end instanceof Date ? new Date(end) : dayjs(end).toDate();
166
167
  if (isNaN(s.getTime()) || isNaN(e.getTime())) {
167
- console.warn(`Invalid dates for item ${item[props.idKey]}:`, { start, end });
168
+ console.warn(`Invalid dates for item ${getNestedValue(item, props.idKey)}:`, { start, end });
169
+ return;
170
+ }
171
+ console.log("Processing item:", {
172
+ id: getNestedValue(item, props.idKey),
173
+ start: s,
174
+ end: e,
175
+ dateRange: props.dateRange
176
+ });
177
+ if (e < props.dateRange.start || s > props.dateRange.end) {
178
+ console.log("Item skipped - outside visible range");
168
179
  return;
169
180
  }
170
- if (e < props.dateRange.start || s > props.dateRange.end) return;
171
181
  let left = 0;
172
182
  let width = 0;
173
183
  const minWidth = cellWidth.value * 0.1;
@@ -242,73 +252,26 @@ const _sfc_main = {
242
252
  }
243
253
  }
244
254
  result.push({
245
- key: `${item[props.idKey]}-${s.getTime()}`,
255
+ key: `${getNestedValue(item, props.idKey)}-${s.getTime()}`,
246
256
  item,
247
257
  left,
248
258
  width,
249
259
  row,
250
- status: item[props.statusKey] || "default"
260
+ status: getNestedValue(item, props.statusKey) || "default"
251
261
  });
252
262
  } catch (error) {
253
- console.error(`Error processing item ${item[props.idKey]}:`, error);
263
+ console.error(`Error processing item ${getNestedValue(item, props.idKey)}:`, error);
254
264
  }
255
265
  });
266
+ console.log("Final bars result:", result);
256
267
  return result;
257
268
  };
258
- const throttle = (fn, delay) => {
259
- let lastCall = 0;
260
- let timeout = null;
261
- const throttled = (...args) => {
262
- const now = Date.now();
263
- const remaining = delay - (now - lastCall);
264
- if (remaining <= 0) {
265
- if (timeout) {
266
- clearTimeout(timeout);
267
- timeout = null;
268
- }
269
- lastCall = now;
270
- return fn(...args);
271
- }
272
- if (!timeout) {
273
- timeout = setTimeout(() => {
274
- lastCall = Date.now();
275
- timeout = null;
276
- fn(...args);
277
- }, remaining);
278
- }
279
- };
280
- throttled.cancel = () => {
281
- if (timeout) {
282
- clearTimeout(timeout);
283
- timeout = null;
284
- }
285
- };
286
- return throttled;
287
- };
288
- const handleScroll = throttle(async (event) => {
269
+ const handleScroll = (event) => {
289
270
  if (!container.value) return;
290
271
  const el = event.target;
291
272
  scrollLeft.value = el.scrollLeft;
292
- const scrollWidth = el.scrollWidth;
293
- const clientWidth = el.clientWidth;
294
- const currentScrollLeft = el.scrollLeft;
295
- const threshold = 100;
296
- if (currentScrollLeft < threshold && !props.loading && !loadPromise.value) {
297
- loadPromise.value = emit("load-more", "backward");
298
- if (loadPromise.value?.then) {
299
- await loadPromise.value;
300
- loadPromise.value = null;
301
- }
302
- } else if (scrollWidth - (currentScrollLeft + clientWidth) < threshold && !props.loading && !loadPromise.value) {
303
- loadPromise.value = emit("load-more", "forward");
304
- if (loadPromise.value?.then) {
305
- await loadPromise.value;
306
- loadPromise.value = null;
307
- }
308
- }
309
- }, 100);
273
+ };
310
274
  onUnmounted(() => {
311
- handleScroll.cancel();
312
275
  });
313
276
  const centerOnDate = (targetDate) => {
314
277
  if (!container.value) return;
@@ -342,6 +305,9 @@ const _sfc_main = {
342
305
  watch(() => props.view, () => {
343
306
  centerOnDate(props.date);
344
307
  });
308
+ watch(() => props.date, (newDate) => {
309
+ centerOnDate(newDate);
310
+ });
345
311
  watch(() => props.dateRange, () => {
346
312
  if (container.value) {
347
313
  container.value.scrollLeft = 0;
@@ -358,23 +324,24 @@ const _sfc_main = {
358
324
  date: __props.date,
359
325
  "onUpdate:view": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:view", $event)),
360
326
  "onUpdate:date": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:date", $event)),
361
- onToday: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("today"))
327
+ onToday: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("today")),
328
+ onLoadMore: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("load-more", $event))
362
329
  }, null, 8, ["view", "views", "date"]),
363
330
  createElementVNode("div", {
364
- class: "gantt-container scroller o-scroll bg-white radius-small br-solid br-1px br-grey-transp",
331
+ class: "gantt-container scroller o-scroll bg-white radius-small br-solid br-1px br-black-transp-10",
365
332
  ref_key: "container",
366
333
  ref: container,
367
- onScroll: _cache[3] || (_cache[3] = (...args) => unref(handleScroll) && unref(handleScroll)(...args))
334
+ onScroll: handleScroll
368
335
  }, [
369
336
  createElementVNode("div", _hoisted_1, [
370
337
  createElementVNode("div", _hoisted_2, [
371
338
  createElementVNode("div", _hoisted_3, [
372
- _cache[4] || (_cache[4] = createElementVNode("div", { class: "gantt-product-col pos-sticky left-0 z-index-3 bg-light pd-small br-r br-solid br-grey-transp" }, " Product ", -1)),
339
+ _cache[4] || (_cache[4] = createElementVNode("div", { class: "gantt-product-col pos-sticky left-0 z-index-3 bg-light pd-small br-r br-solid br-black-transp-10" }, " Product ", -1)),
373
340
  createElementVNode("div", _hoisted_4, [
374
341
  (openBlock(true), createElementBlock(Fragment, null, renderList(visibleCells.value, (cell, i) => {
375
342
  return openBlock(), createElementBlock("div", {
376
343
  key: cell.key,
377
- class: normalizeClass(["gantt-cell br-r br-solid br-grey-transp t-center pd-small", getCellClass(cell)]),
344
+ class: normalizeClass(["gantt-cell br-r br-solid br-black-transp-10 t-center pd-small", getCellClass(cell)]),
378
345
  style: normalizeStyle({ width: cellWidth.value + "px" })
379
346
  }, [
380
347
  createVNode(_sfc_main$2, {
@@ -391,7 +358,7 @@ const _sfc_main = {
391
358
  (openBlock(true), createElementBlock(Fragment, null, renderList(groups.value, (group, i) => {
392
359
  return openBlock(), createElementBlock("div", {
393
360
  key: group.key,
394
- class: normalizeClass(["gantt-row flex br-b br-solid br-grey-transp", i % 2 === 0 ? "bg-light-transp" : ""]),
361
+ class: normalizeClass(["gantt-row flex br-b br-solid br-black-transp-10", i % 2 === 0 ? "bg-light-transp" : ""]),
395
362
  style: normalizeStyle({ height: __props.rowHeight + "px" })
396
363
  }, [
397
364
  createElementVNode("div", _hoisted_6, [
@@ -405,7 +372,7 @@ const _sfc_main = {
405
372
  (openBlock(true), createElementBlock(Fragment, null, renderList(visibleCells.value, (cell) => {
406
373
  return openBlock(), createElementBlock("div", {
407
374
  key: cell.key + "-bg",
408
- class: normalizeClass(["gantt-cell h-100 br-r br-solid br-grey-transp", getCellClass(cell)]),
375
+ class: normalizeClass(["gantt-cell h-100 br-r br-solid br-black-transp-10", getCellClass(cell)]),
409
376
  style: normalizeStyle({ width: cellWidth.value + "px" })
410
377
  }, null, 6);
411
378
  }), 128))
@@ -1 +1 @@
1
- {"version":3,"file":"GanttChart.vue.js","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttChart.vue"],"sourcesContent":["<template>\n <div class=\"w-100\" :style=\"{ '--cell-width': cellWidth + 'px' }\">\n <GanttToolbar\n :view=\"view\"\n :views=\"views\"\n :date=\"date\"\n @update:view=\"$emit('update:view', $event)\"\n @update:date=\"$emit('update:date', $event)\"\n @today=\"$emit('today')\"\n />\n \n <div \n class=\"gantt-container scroller o-scroll bg-white radius-small br-solid br-1px br-grey-transp\"\n ref=\"container\"\n @scroll=\"handleScroll\"\n >\n <div class=\"gantt-content\">\n <!-- Header -->\n <div class=\"gantt-header pos-sticky top-0 z-index-2 bg-white br-b br-solid br-grey-transp\">\n <div class=\"flex\">\n <div class=\"gantt-product-col pos-sticky left-0 z-index-3 bg-light pd-small br-r br-solid br-grey-transp\">\n Product\n </div>\n \n <div class=\"gantt-timeline flex\">\n <div\n v-for=\"(cell, i) in visibleCells\"\n :key=\"cell.key\"\n class=\"gantt-cell br-r br-solid br-grey-transp t-center pd-small\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n >\n <GanttHeaderCell :cell=\"cell\" :view=\"view\" :index=\"i\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"gantt-body\">\n <div \n v-for=\"(group, i) in groups\" \n :key=\"group.key\" \n class=\"gantt-row flex br-b br-solid br-grey-transp\"\n :class=\"i % 2 === 0 ? 'bg-light-transp' : ''\"\n :style=\"{ height: rowHeight + 'px' }\"\n >\n <div class=\"gantt-product-col pos-sticky left-0 z-index-1 bg-white pd-small br-r br-solid br-grey-transp\">\n <div class=\"t-medium mn-b-micro\">{{ group.title }}</div>\n <div class=\"t-micro\" :class=\"statusClass(group)\">{{ group.status }}</div>\n </div>\n \n <div class=\"gantt-timeline pos-relative\">\n <!-- Background cells -->\n <div class=\"gantt-cells flex pos-absolute h-100\">\n <div\n v-for=\"cell in visibleCells\"\n :key=\"cell.key + '-bg'\"\n class=\"gantt-cell h-100 br-r br-solid br-grey-transp\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n />\n </div>\n \n <!-- Bars -->\n <div class=\"gantt-bars pos-absolute h-100\">\n <GanttBar\n v-for=\"bar in getBars(group)\"\n :key=\"bar.key\"\n :bar=\"bar\"\n :view=\"view\"\n @click=\"$emit('item-click', bar.item)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onUnmounted, watch, nextTick, shallowRef, onMounted } from 'vue'\nimport dayjs from 'dayjs'\n// import utc from 'dayjs/plugin/utc'\n// import timezone from 'dayjs/plugin/timezone'\n\n// dayjs.extend(utc)\n// dayjs.extend(timezone)\n\nimport GanttToolbar from './GanttToolbar.vue'\nimport GanttHeaderCell from './GanttHeaderCell.vue'\nimport GanttBar from './GanttBar.vue'\n\nconst props = defineProps({\n items: { type: Array, required: true },\n view: { type: String, default: 'days' },\n date: { type: Date, required: true },\n dateRange: { type: Object, required: true },\n views: {\n type: Array,\n default: () => [\n { name: 'Hours', value: 'hours', width: 60 },\n { name: 'Days', value: 'days', width: 60 },\n { name: 'Weeks', value: 'weeks', width: 120 }\n ]\n },\n titleKey: { type: String, default: 'title' },\n startKey: { type: String, default: 'startDate' },\n endKey: { type: String, default: 'endDate' },\n statusKey: { type: String, default: 'status' },\n idKey: { type: String, default: 'id' },\n groupBy: { type: String, default: 'title' },\n loading: { type: Boolean, default: false },\n rowHeight: { type: Number, default: 60 }\n})\n\nconst emit = defineEmits([\n 'update:view',\n 'update:date', \n 'update:dateRange',\n 'load-more',\n 'item-click',\n 'today'\n])\n\n// State\nconst container = ref(null)\nconst scrollLeft = ref(0)\nconst loadPromise = ref(null)\n\n// Cell width\nconst cellWidth = computed(() => {\n const view = props.views.find(v => v.value === props.view)\n return view?.width || 60\n})\n\n// Visible cells\nconst visibleCells = computed(() => {\n if (!props.dateRange) return []\n \n const { start, end } = props.dateRange\n const cells = []\n \n switch (props.view) {\n case 'hours':\n // Start from beginning of the day (use only first day)\n const startDay = new Date(start)\n startDay.setHours(0, 0, 0, 0)\n \n // Generate hour cells for 24 hours (one day)\n for (let h = 0; h < 24; h++) {\n const cellDate = new Date(startDay)\n cellDate.setHours(h, 0, 0, 0)\n cells.push({\n type: 'hour',\n date: cellDate,\n hour: h,\n key: `${startDay.getTime()}-${h}`\n })\n }\n \n break\n \n case 'days':\n for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n cells.push({\n type: 'day',\n date: new Date(d),\n key: d.getTime()\n })\n }\n break\n \n case 'weeks':\n const weekStart = new Date(start)\n weekStart.setDate(start.getDate() - start.getDay())\n \n const currentWeek = new Date(weekStart)\n while (currentWeek <= end) {\n const weekEnd = new Date(currentWeek)\n weekEnd.setDate(currentWeek.getDate() + 6)\n \n cells.push({\n type: 'week',\n start: new Date(currentWeek),\n end: new Date(weekEnd),\n key: currentWeek.getTime()\n })\n \n currentWeek.setDate(currentWeek.getDate() + 7)\n }\n break\n }\n \n return cells\n})\n\n// Cache for bars calculation\nconst barsCache = new WeakMap()\n\n// Groups\nconst groups = computed(() => {\n const map = new Map()\n \n props.items.forEach(item => {\n const key = item[props.groupBy] || 'Ungrouped'\n \n if (!map.has(key)) {\n map.set(key, {\n key,\n title: key,\n items: [],\n status: item[props.statusKey]\n })\n }\n \n map.get(key).items.push(item)\n })\n \n return Array.from(map.values())\n})\n\n// Cell class\nconst getCellClass = (cell) => {\n const classes = []\n const now = dayjs()\n \n switch (cell.type) {\n case 'hour':\n if (dayjs(cell.date).isSame(now, 'day') && cell.hour === now.hour()) {\n classes.push('bg-blue-transp')\n } else if (dayjs(cell.date).isSame(now, 'day')) {\n classes.push('bg-light')\n }\n break\n \n case 'day':\n const day = dayjs(cell.date).day()\n if (day === 0 || day === 6) classes.push('bg-light')\n if (dayjs(cell.date).isSame(now, 'day')) classes.push('bg-blue-transp')\n break\n \n case 'week':\n if (now.isAfter(cell.start) && now.isBefore(cell.end)) {\n classes.push('bg-blue-transp')\n }\n break\n }\n \n return classes.join(' ')\n}\n\n// Status class\nconst statusClass = (group) => {\n const s = group.status || 'default'\n const map = {\n active: 't-green',\n completed: 't-blue',\n canceled: 't-red',\n default: 't-transp'\n }\n return map[s] || map.default\n}\n\n// Get bars\nconst getBars = (group) => {\n const result = []\n const rows = []\n \n group.items.forEach(item => {\n try {\n const start = item[props.startKey]\n const end = item[props.endKey]\n \n if (!start || !end) return\n \n const s = start instanceof Date ? new Date(start) : dayjs(start).toDate()\n const e = end instanceof Date ? new Date(end) : dayjs(end).toDate()\n \n if (isNaN(s.getTime()) || isNaN(e.getTime())) {\n console.warn(`Invalid dates for item ${item[props.idKey]}:`, { start, end })\n return\n }\n \n // Skip if completely outside visible range\n if (e < props.dateRange.start || s > props.dateRange.end) return\n \n // Calculate position\n let left = 0\n let width = 0\n \n // Minimum width for very short intervals\n const minWidth = cellWidth.value * 0.1\n \n switch (props.view) {\n case 'hours':\n if (!visibleCells.value.length) return\n \n // Get the first cell's time as base reference\n const firstCell = visibleCells.value[0]\n const baseTime = new Date(firstCell.date)\n baseTime.setHours(0, 0, 0, 0)\n \n // Calculate exact minute positions from base time\n const minuteMs = 60 * 1000\n const hourMs = 60 * 60 * 1000\n \n // For long bars (>1 day), limit to visible day range\n const dayStart = new Date(baseTime)\n dayStart.setHours(0, 0, 0, 0)\n const dayEnd = new Date(baseTime)\n dayEnd.setHours(23, 59, 59, 999)\n \n const visibleStart = s < dayStart ? dayStart : s\n const visibleEnd = e > dayEnd ? dayEnd : e\n \n // Calculate hour positions with minute precision\n const startHours = (visibleStart - baseTime) / hourMs\n const endHours = (visibleEnd - baseTime) / hourMs\n \n // Clip to visible range (0-24 hours)\n const clippedStart = Math.max(0, startHours)\n const clippedEnd = Math.min(24, endHours)\n \n // Skip if completely outside visible range\n if (clippedEnd <= clippedStart) {\n return\n }\n \n // Calculate pixel position\n left = clippedStart * cellWidth.value\n width = (clippedEnd - clippedStart) * cellWidth.value\n \n // Apply minimum width for very short intervals (3-7 minutes should be visible)\n width = Math.max(width, minWidth)\n \n break\n \n case 'days':\n const firstDay = visibleCells.value[0]?.date\n if (!firstDay) return\n \n const firstDayStart = new Date(firstDay)\n firstDayStart.setHours(0, 0, 0, 0)\n \n // Calculate exact positions with minute precision\n const dayMs = 24 * 60 * 60 * 1000\n const startDayFloat = (s - firstDayStart) / dayMs\n const endDayFloat = (e - firstDayStart) / dayMs\n \n // Clip to visible range\n const visibleDays = visibleCells.value.length\n const clippedStartDay = Math.max(0, startDayFloat)\n const clippedEndDay = Math.min(visibleDays, endDayFloat)\n \n // Skip if completely outside visible range\n if (clippedEndDay <= clippedStartDay) return\n \n left = clippedStartDay * cellWidth.value\n width = (clippedEndDay - clippedStartDay) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n \n case 'weeks':\n const firstWeek = visibleCells.value[0]?.start\n if (!firstWeek) return\n \n // Calculate exact positions with minute precision\n const weekMs = 7 * 24 * 60 * 60 * 1000\n const startWeekFloat = (s - firstWeek) / weekMs\n const endWeekFloat = (e - firstWeek) / weekMs\n \n // Clip to visible range\n const visibleWeeks = visibleCells.value.length\n const clippedStartWeek = Math.max(0, startWeekFloat)\n const clippedEndWeek = Math.min(visibleWeeks, endWeekFloat)\n \n // Skip if completely outside visible range\n if (clippedEndWeek <= clippedStartWeek) return\n \n left = clippedStartWeek * cellWidth.value\n width = (clippedEndWeek - clippedStartWeek) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n }\n \n // Find row\n let row = 0\n let placed = false\n \n while (!placed) {\n if (!rows[row]) rows[row] = []\n \n const overlap = rows[row].some(b => \n (s <= b.end && e >= b.start)\n )\n \n if (!overlap) {\n rows[row].push({ start: s, end: e })\n placed = true\n } else {\n row++\n }\n }\n \n result.push({\n key: `${item[props.idKey]}-${s.getTime()}`,\n item,\n left,\n width,\n row,\n status: item[props.statusKey] || 'default'\n })\n } catch (error) {\n console.error(`Error processing item ${item[props.idKey]}:`, error)\n }\n })\n \n return result\n}\n\n// Throttle\nconst throttle = (fn, delay) => {\n let lastCall = 0\n let timeout = null\n \n const throttled = (...args) => {\n const now = Date.now()\n const remaining = delay - (now - lastCall)\n \n if (remaining <= 0) {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n lastCall = now\n return fn(...args)\n }\n \n if (!timeout) {\n timeout = setTimeout(() => {\n lastCall = Date.now()\n timeout = null\n fn(...args)\n }, remaining)\n }\n }\n \n throttled.cancel = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n }\n \n return throttled\n}\n\n// Scroll handling\nconst handleScroll = throttle(async (event) => {\n if (!container.value) return\n \n const el = event.target\n scrollLeft.value = el.scrollLeft\n \n const scrollWidth = el.scrollWidth\n const clientWidth = el.clientWidth\n const currentScrollLeft = el.scrollLeft\n \n const threshold = 100\n \n if (currentScrollLeft < threshold && !props.loading && !loadPromise.value) {\n loadPromise.value = emit('load-more', 'backward')\n if (loadPromise.value?.then) {\n await loadPromise.value\n loadPromise.value = null\n }\n } else if (scrollWidth - (currentScrollLeft + clientWidth) < threshold && !props.loading && !loadPromise.value) {\n loadPromise.value = emit('load-more', 'forward')\n if (loadPromise.value?.then) {\n await loadPromise.value\n loadPromise.value = null\n }\n }\n}, 100)\n\n// Cleanup\nonUnmounted(() => {\n handleScroll.cancel()\n})\n\n// Center view on specific date\nconst centerOnDate = (targetDate) => {\n if (!container.value) return\n \n nextTick(() => {\n const cells = visibleCells.value\n if (!cells.length) return\n \n let cellIndex = -1\n \n switch (props.view) {\n case 'hours':\n cellIndex = cells.findIndex(c => \n c.type === 'hour' &&\n dayjs(c.date).isSame(targetDate, 'day') &&\n c.hour === targetDate.getHours()\n )\n break\n \n case 'days':\n cellIndex = cells.findIndex(c =>\n c.type === 'day' &&\n dayjs(c.date).isSame(targetDate, 'day')\n )\n break\n \n case 'weeks':\n cellIndex = cells.findIndex(c =>\n c.type === 'week' &&\n targetDate >= c.start &&\n targetDate <= c.end\n )\n break\n }\n \n if (cellIndex >= 0) {\n const scrollPos = cellIndex * cellWidth.value - container.value.clientWidth / 2\n container.value.scrollLeft = Math.max(0, scrollPos)\n }\n })\n}\n\n// Watch for view or date range changes\nwatch(() => props.view, () => {\n // Center on current date when view changes\n centerOnDate(props.date)\n})\n\nwatch(() => props.dateRange, () => {\n // Reset scroll position when date range changes significantly\n if (container.value) {\n container.value.scrollLeft = 0\n }\n}, { deep: true })\n</script>\n\n<style>\n.gantt-container {\n --cell-width: 60px;\n height: 500px;\n position: relative;\n}\n\n.gantt-content {\n width: fit-content;\n min-width: 100%;\n}\n\n.gantt-header {\n height: 60px;\n}\n\n.gantt-product-col {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n}\n\n.gantt-timeline {\n position: relative;\n min-width: fit-content;\n}\n\n.gantt-cell {\n min-width: var(--cell-width);\n flex-shrink: 0;\n}\n\n.gantt-row {\n position: relative;\n}\n\n.gantt-cells,\n.gantt-bars {\n width: fit-content;\n left: 0;\n}\n</style>"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GanttChart.vue.js","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttChart.vue"],"sourcesContent":["<template>\n <div class=\"w-100\" :style=\"{ '--cell-width': cellWidth + 'px' }\">\n <GanttToolbar\n :view=\"view\"\n :views=\"views\"\n :date=\"date\"\n @update:view=\"$emit('update:view', $event)\"\n @update:date=\"$emit('update:date', $event)\"\n @today=\"$emit('today')\"\n @load-more=\"$emit('load-more', $event)\"\n />\n \n <div \n class=\"gantt-container scroller o-scroll bg-white radius-small br-solid br-1px br-black-transp-10\"\n ref=\"container\"\n @scroll=\"handleScroll\"\n >\n <div class=\"gantt-content\">\n <!-- Header -->\n <div class=\"gantt-header pos-sticky top-0 z-index-2 bg-white br-b br-solid br-black-transp-10\">\n <div class=\"flex\">\n <div class=\"gantt-product-col pos-sticky left-0 z-index-3 bg-light pd-small br-r br-solid br-black-transp-10\">\n Product\n </div>\n \n <div class=\"gantt-timeline flex\">\n <div\n v-for=\"(cell, i) in visibleCells\"\n :key=\"cell.key\"\n class=\"gantt-cell br-r br-solid br-black-transp-10 t-center pd-small\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n >\n <GanttHeaderCell :cell=\"cell\" :view=\"view\" :index=\"i\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"gantt-body\">\n <div \n v-for=\"(group, i) in groups\" \n :key=\"group.key\" \n class=\"gantt-row flex br-b br-solid br-black-transp-10\"\n :class=\"i % 2 === 0 ? 'bg-light-transp' : ''\"\n :style=\"{ height: rowHeight + 'px' }\"\n >\n <div class=\"gantt-product-col pos-sticky left-0 z-index-1 bg-white pd-small br-r br-solid br-black-transp-10\">\n <div class=\"t-medium mn-b-micro\">{{ group.title }}</div>\n <div class=\"t-micro\" :class=\"statusClass(group)\">{{ group.status }}</div>\n </div>\n \n <div class=\"gantt-timeline pos-relative\">\n <!-- Background cells -->\n <div class=\"gantt-cells flex pos-absolute h-100\">\n <div\n v-for=\"cell in visibleCells\"\n :key=\"cell.key + '-bg'\"\n class=\"gantt-cell h-100 br-r br-solid br-black-transp-10\"\n :class=\"getCellClass(cell)\"\n :style=\"{ width: cellWidth + 'px' }\"\n />\n </div>\n \n <!-- Bars -->\n <div class=\"gantt-bars pos-absolute h-100\">\n <GanttBar\n v-for=\"bar in getBars(group)\"\n :key=\"bar.key\"\n :bar=\"bar\"\n :view=\"view\"\n @click=\"$emit('item-click', bar.item)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onUnmounted, watch, nextTick, shallowRef, onMounted } from 'vue'\nimport dayjs from 'dayjs'\n// import utc from 'dayjs/plugin/utc'\n// import timezone from 'dayjs/plugin/timezone'\n\n// dayjs.extend(utc)\n// dayjs.extend(timezone)\n\nimport GanttToolbar from './GanttToolbar.vue'\nimport GanttHeaderCell from './GanttHeaderCell.vue'\nimport GanttBar from './GanttBar.vue'\n\nconst props = defineProps({\n items: { type: Array, required: true },\n view: { type: String, default: 'days' },\n date: { type: Date, required: true },\n dateRange: { type: Object, required: true },\n views: {\n type: Array,\n default: () => [\n { name: 'Hours', value: 'hours', width: 60 },\n { name: 'Days', value: 'days', width: 60 },\n { name: 'Weeks', value: 'weeks', width: 120 }\n ]\n },\n titleKey: { type: String, default: 'title' },\n startKey: { type: String, default: 'startDate' },\n endKey: { type: String, default: 'endDate' },\n statusKey: { type: String, default: 'status' },\n idKey: { type: String, default: 'id' },\n groupBy: { type: String, default: 'title' },\n loading: { type: Boolean, default: false },\n rowHeight: { type: Number, default: 60 }\n})\n\nconst emit = defineEmits([\n 'update:view',\n 'update:date', \n 'update:dateRange',\n 'load-more',\n 'item-click',\n 'today'\n])\n\n// State\nconst container = ref(null)\nconst scrollLeft = ref(0)\n\n// Cell width\nconst cellWidth = computed(() => {\n const view = props.views.find(v => v.value === props.view)\n return view?.width || 60\n})\n\n// Visible cells\nconst visibleCells = computed(() => {\n if (!props.dateRange) return []\n \n const { start, end } = props.dateRange\n const cells = []\n \n switch (props.view) {\n case 'hours':\n // Start from beginning of the day (use only first day)\n const startDay = new Date(start)\n startDay.setHours(0, 0, 0, 0)\n \n // Generate hour cells for 24 hours (one day)\n for (let h = 0; h < 24; h++) {\n const cellDate = new Date(startDay)\n cellDate.setHours(h, 0, 0, 0)\n cells.push({\n type: 'hour',\n date: cellDate,\n hour: h,\n key: `${startDay.getTime()}-${h}`\n })\n }\n \n break\n \n case 'days':\n for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n cells.push({\n type: 'day',\n date: new Date(d),\n key: d.getTime()\n })\n }\n break\n \n case 'weeks':\n const weekStart = new Date(start)\n weekStart.setDate(start.getDate() - start.getDay())\n \n const currentWeek = new Date(weekStart)\n while (currentWeek <= end) {\n const weekEnd = new Date(currentWeek)\n weekEnd.setDate(currentWeek.getDate() + 6)\n \n cells.push({\n type: 'week',\n start: new Date(currentWeek),\n end: new Date(weekEnd),\n key: currentWeek.getTime()\n })\n \n currentWeek.setDate(currentWeek.getDate() + 7)\n }\n break\n }\n \n return cells\n})\n\n// Cache for bars calculation\nconst barsCache = new WeakMap()\n\n// Helper function to get nested property value\nconst getNestedValue = (obj, path) => {\n return path.split('.').reduce((current, key) => current?.[key], obj)\n}\n\n// Groups\nconst groups = computed(() => {\n const map = new Map()\n \n props.items.forEach(item => {\n const key = getNestedValue(item, props.groupBy) || 'Ungrouped'\n \n if (!map.has(key)) {\n map.set(key, {\n key,\n title: key,\n items: [],\n status: getNestedValue(item, props.statusKey)\n })\n }\n \n map.get(key).items.push(item)\n })\n \n return Array.from(map.values())\n})\n\n// Cell class\nconst getCellClass = (cell) => {\n const classes = []\n const now = dayjs()\n \n switch (cell.type) {\n case 'hour':\n if (dayjs(cell.date).isSame(now, 'day') && cell.hour === now.hour()) {\n classes.push('bg-blue-transp')\n } else if (dayjs(cell.date).isSame(now, 'day')) {\n classes.push('bg-light')\n }\n break\n \n case 'day':\n const day = dayjs(cell.date).day()\n if (day === 0 || day === 6) classes.push('bg-light')\n if (dayjs(cell.date).isSame(now, 'day')) classes.push('bg-blue-transp')\n break\n \n case 'week':\n if (now.isAfter(cell.start) && now.isBefore(cell.end)) {\n classes.push('bg-blue-transp')\n }\n break\n }\n \n return classes.join(' ')\n}\n\n// Status class\nconst statusClass = (group) => {\n const s = group.status || 'default'\n const map = {\n active: 't-green',\n completed: 't-blue',\n canceled: 't-red',\n default: 't-transp'\n }\n return map[s] || map.default\n}\n\n// Get bars\nconst getBars = (group) => {\n const result = []\n const rows = []\n \n group.items.forEach(item => {\n try {\n const start = getNestedValue(item, props.startKey)\n const end = getNestedValue(item, props.endKey)\n \n if (!start || !end) return\n \n const s = start instanceof Date ? new Date(start) : dayjs(start).toDate()\n const e = end instanceof Date ? new Date(end) : dayjs(end).toDate()\n \n if (isNaN(s.getTime()) || isNaN(e.getTime())) {\n console.warn(`Invalid dates for item ${getNestedValue(item, props.idKey)}:`, { start, end })\n return\n }\n \n console.log('Processing item:', {\n id: getNestedValue(item, props.idKey),\n start: s,\n end: e,\n dateRange: props.dateRange\n })\n \n // Skip if completely outside visible range\n if (e < props.dateRange.start || s > props.dateRange.end) {\n console.log('Item skipped - outside visible range')\n return\n }\n \n // Calculate position\n let left = 0\n let width = 0\n \n // Minimum width for very short intervals\n const minWidth = cellWidth.value * 0.1\n \n switch (props.view) {\n case 'hours':\n if (!visibleCells.value.length) return\n \n // Get the first cell's time as base reference\n const firstCell = visibleCells.value[0]\n const baseTime = new Date(firstCell.date)\n baseTime.setHours(0, 0, 0, 0)\n \n // Calculate exact minute positions from base time\n const minuteMs = 60 * 1000\n const hourMs = 60 * 60 * 1000\n \n // For long bars (>1 day), limit to visible day range\n const dayStart = new Date(baseTime)\n dayStart.setHours(0, 0, 0, 0)\n const dayEnd = new Date(baseTime)\n dayEnd.setHours(23, 59, 59, 999)\n \n const visibleStart = s < dayStart ? dayStart : s\n const visibleEnd = e > dayEnd ? dayEnd : e\n \n // Calculate hour positions with minute precision\n const startHours = (visibleStart - baseTime) / hourMs\n const endHours = (visibleEnd - baseTime) / hourMs\n \n // Clip to visible range (0-24 hours)\n const clippedStart = Math.max(0, startHours)\n const clippedEnd = Math.min(24, endHours)\n \n // Skip if completely outside visible range\n if (clippedEnd <= clippedStart) {\n return\n }\n \n // Calculate pixel position\n left = clippedStart * cellWidth.value\n width = (clippedEnd - clippedStart) * cellWidth.value\n \n // Apply minimum width for very short intervals (3-7 minutes should be visible)\n width = Math.max(width, minWidth)\n \n break\n \n case 'days':\n const firstDay = visibleCells.value[0]?.date\n if (!firstDay) return\n \n const firstDayStart = new Date(firstDay)\n firstDayStart.setHours(0, 0, 0, 0)\n \n // Calculate exact positions with minute precision\n const dayMs = 24 * 60 * 60 * 1000\n const startDayFloat = (s - firstDayStart) / dayMs\n const endDayFloat = (e - firstDayStart) / dayMs\n \n // Clip to visible range\n const visibleDays = visibleCells.value.length\n const clippedStartDay = Math.max(0, startDayFloat)\n const clippedEndDay = Math.min(visibleDays, endDayFloat)\n \n // Skip if completely outside visible range\n if (clippedEndDay <= clippedStartDay) return\n \n left = clippedStartDay * cellWidth.value\n width = (clippedEndDay - clippedStartDay) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n \n case 'weeks':\n const firstWeek = visibleCells.value[0]?.start\n if (!firstWeek) return\n \n // Calculate exact positions with minute precision\n const weekMs = 7 * 24 * 60 * 60 * 1000\n const startWeekFloat = (s - firstWeek) / weekMs\n const endWeekFloat = (e - firstWeek) / weekMs\n \n // Clip to visible range\n const visibleWeeks = visibleCells.value.length\n const clippedStartWeek = Math.max(0, startWeekFloat)\n const clippedEndWeek = Math.min(visibleWeeks, endWeekFloat)\n \n // Skip if completely outside visible range\n if (clippedEndWeek <= clippedStartWeek) return\n \n left = clippedStartWeek * cellWidth.value\n width = (clippedEndWeek - clippedStartWeek) * cellWidth.value\n \n // Apply minimum width for very short intervals\n width = Math.max(width, minWidth)\n break\n }\n \n // Find row\n let row = 0\n let placed = false\n \n while (!placed) {\n if (!rows[row]) rows[row] = []\n \n const overlap = rows[row].some(b => \n (s <= b.end && e >= b.start)\n )\n \n if (!overlap) {\n rows[row].push({ start: s, end: e })\n placed = true\n } else {\n row++\n }\n }\n \n result.push({\n key: `${getNestedValue(item, props.idKey)}-${s.getTime()}`,\n item,\n left,\n width,\n row,\n status: getNestedValue(item, props.statusKey) || 'default'\n })\n } catch (error) {\n console.error(`Error processing item ${getNestedValue(item, props.idKey)}:`, error)\n }\n })\n \n console.log('Final bars result:', result)\n return result\n}\n\n// Throttle\nconst throttle = (fn, delay) => {\n let lastCall = 0\n let timeout = null\n \n const throttled = (...args) => {\n const now = Date.now()\n const remaining = delay - (now - lastCall)\n \n if (remaining <= 0) {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n lastCall = now\n return fn(...args)\n }\n \n if (!timeout) {\n timeout = setTimeout(() => {\n lastCall = Date.now()\n timeout = null\n fn(...args)\n }, remaining)\n }\n }\n \n throttled.cancel = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n }\n \n return throttled\n}\n\n// Scroll handling\nconst handleScroll = (event) => {\n if (!container.value) return\n \n const el = event.target\n scrollLeft.value = el.scrollLeft\n}\n\n// Cleanup\nonUnmounted(() => {\n // No cleanup needed\n})\n\n// Center view on specific date\nconst centerOnDate = (targetDate) => {\n if (!container.value) return\n \n nextTick(() => {\n const cells = visibleCells.value\n if (!cells.length) return\n \n let cellIndex = -1\n \n switch (props.view) {\n case 'hours':\n cellIndex = cells.findIndex(c => \n c.type === 'hour' &&\n dayjs(c.date).isSame(targetDate, 'day') &&\n c.hour === targetDate.getHours()\n )\n break\n \n case 'days':\n cellIndex = cells.findIndex(c =>\n c.type === 'day' &&\n dayjs(c.date).isSame(targetDate, 'day')\n )\n break\n \n case 'weeks':\n cellIndex = cells.findIndex(c =>\n c.type === 'week' &&\n targetDate >= c.start &&\n targetDate <= c.end\n )\n break\n }\n \n if (cellIndex >= 0) {\n const scrollPos = cellIndex * cellWidth.value - container.value.clientWidth / 2\n container.value.scrollLeft = Math.max(0, scrollPos)\n }\n })\n}\n\n// Watch for view or date range changes\nwatch(() => props.view, () => {\n // Center on current date when view changes\n centerOnDate(props.date)\n})\n\n// Watch for date changes (e.g., when Today button is clicked)\nwatch(() => props.date, (newDate) => {\n // Center on the new date, especially important for hours view\n centerOnDate(newDate)\n})\n\nwatch(() => props.dateRange, () => {\n // Reset scroll position when date range changes significantly\n if (container.value) {\n container.value.scrollLeft = 0\n }\n}, { deep: true })\n</script>\n\n<style>\n.gantt-container {\n --cell-width: 60px;\n height: 500px;\n position: relative;\n}\n\n.gantt-content {\n width: fit-content;\n min-width: 100%;\n}\n\n.gantt-header {\n height: 60px;\n}\n\n.gantt-product-col {\n width: 200px;\n min-width: 200px;\n flex-shrink: 0;\n}\n\n.gantt-timeline {\n position: relative;\n min-width: fit-content;\n}\n\n.gantt-cell {\n min-width: var(--cell-width);\n flex-shrink: 0;\n}\n\n.gantt-row {\n position: relative;\n}\n\n.gantt-cells,\n.gantt-bars {\n width: fit-content;\n left: 0;\n}\n</style>"],"names":[],"mappings":"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"}
@@ -91,6 +91,7 @@ const _sfc_main = {
91
91
  if (newSelectedDate) {
92
92
  const newDate = new Date(newSelectedDate);
93
93
  emit("update:date", newDate);
94
+ emit("load-more", "refresh");
94
95
  }
95
96
  };
96
97
  vue.watch(() => props.date, (newDate) => {
@@ -120,7 +121,7 @@ const _sfc_main = {
120
121
  vue.createVNode(Dropdown.default, {
121
122
  label: dateLabel.value,
122
123
  align: "left",
123
- class: "pos-relative h-100 bg-white radius-small pd-thin"
124
+ class: "pos-relative z-index-3 h-100 bg-white radius-small pd-thin"
124
125
  }, {
125
126
  default: vue.withCtx(() => [
126
127
  vue.createVNode(Calendar.default, {
@@ -1 +1 @@
1
- {"version":3,"file":"GanttToolbar.vue.cjs","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttToolbar.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap w-100 flex bg-light pd-small radius-medium mn-b-small\">\n <div class=\"flex w-100 gap-micro flex-v-center flex-nowrap\">\n <Tab\n :selected=\"view\"\n :tabs=\"tabs\"\n @tab-click=\"$emit('update:view', $event.tab.value)\"\n class=\"mn-r-auto h-100 flex-child-default o-hidden pd-nano radius-small bg-white\"\n classTab=\"pd-thin radius-thin\"\n />\n\n <Button \n @click=\"navPrev\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Previous period\"\n >\n <IconChevronLeft class=\"i-small\"/>\n </Button>\n \n <div class=\"flex h-100 flex-v-center\">\n <Dropdown \n :label=\"dateLabel\"\n align=\"left\"\n class=\"pos-relative h-100 bg-white radius-small pd-thin\"\n >\n <Calendar \n v-model:date=\"selectedDate\"\n @update:date=\"updateDate\"\n class=\"bg-white radius-small pd-small\"\n />\n </Dropdown>\n </div>\n \n <Button \n @click=\"navNext\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Next period\"\n >\n <IconChevronRight class=\"i-small\"/>\n </Button>\n \n <Button \n @click=\"$emit('today')\" \n class=\"pd-r-small pd-l-small radius-small bg-second t-white mn-l-thin\"\n >\n Today\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue'\nimport dayjs from 'dayjs'\n\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport DateLabel from './DateLabel.vue'\n\nimport IconChevronRight from '@martyrs/src/modules/icons/navigation/IconChevronRight.vue'\nimport IconChevronLeft from '@martyrs/src/modules/icons/navigation/IconChevronLeft.vue'\n\nconst props = defineProps({\n view: { type: String, required: true },\n views: { type: Array, required: true },\n date: { type: Date, required: true }\n})\n\nconst emit = defineEmits(['update:view', 'update:date', 'today'])\n\n// View tabs\nconst tabs = computed(() => \n props.views.map(v => ({\n name: v.name,\n label: v.name,\n value: v.value\n }))\n)\n\n// Date label based on view\nconst dateLabel = computed(() => {\n const d = dayjs(props.date)\n \n let dateText\n switch (props.view) {\n case 'hours':\n dateText = d.format('DD/MM/YYYY')\n break\n case 'days':\n dateText = d.format('MMMM YYYY')\n break\n case 'weeks':\n dateText = d.format('MMMM YYYY')\n break\n default:\n dateText = d.format('MMMM YYYY')\n }\n \n return {\n component: DateLabel,\n props: {\n dateText\n },\n class: 'cursor-pointer'\n }\n})\n\n// Selected date for calendar\nconst selectedDate = ref(props.date)\n\n// Navigation\nconst navPrev = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.subtract(1, 'day').toDate()\n break\n case 'days':\n newDate = d.subtract(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.subtract(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst navNext = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.add(1, 'day').toDate()\n break\n case 'days':\n newDate = d.add(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.add(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst updateDate = (newSelectedDate) => {\n if (newSelectedDate) {\n const newDate = new Date(newSelectedDate)\n emit('update:date', newDate)\n }\n}\n\n// Watch for props.date changes to update selectedDate\nwatch(() => props.date, (newDate) => {\n selectedDate.value = newDate\n})\n</script>"],"names":["computed","dayjs","DateLabel","ref","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgEA,UAAM,QAAQ;AAMd,UAAM,OAAO;AAGb,UAAM,OAAOA,IAAAA;AAAAA,MAAS,MACpB,MAAM,MAAM,IAAI,QAAM;AAAA,QACpB,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,MACb,EAAI;AAAA,IACJ;AAGA,UAAM,YAAYA,IAAAA,SAAS,MAAM;AAC/B,YAAM,IAAIC,kBAAM,MAAM,IAAI;AAE1B,UAAI;AACJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,qBAAW,EAAE,OAAO,YAAY;AAChC;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF;AACE,qBAAW,EAAE,OAAO,WAAW;AAAA,MACrC;AAEE,aAAO;AAAA,QACL,WAAWC,UAAAA;AAAAA,QACX,OAAO;AAAA,UACL;AAAA,QACN;AAAA,QACI,OAAO;AAAA,MACX;AAAA,IACA,CAAC;AAGD,UAAM,eAAeC,IAAAA,IAAI,MAAM,IAAI;AAGnC,UAAM,UAAU,MAAM;AACpB,YAAM,IAAIF,kBAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,KAAK,EAAE,OAAM;AACrC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM;AACpB,YAAM,IAAIA,kBAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,KAAK,EAAE,OAAM;AAChC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,aAAa,CAAC,oBAAoB;AACtC,UAAI,iBAAiB;AACnB,cAAM,UAAU,IAAI,KAAK,eAAe;AACxC,aAAK,eAAe,OAAO;AAAA,MAC7B;AAAA,IACF;AAGAG,QAAAA,MAAM,MAAM,MAAM,MAAM,CAAC,YAAY;AACnC,mBAAa,QAAQ;AAAA,IACvB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"GanttToolbar.vue.cjs","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttToolbar.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap w-100 flex bg-light pd-small radius-medium mn-b-small\">\n <div class=\"flex w-100 gap-micro flex-v-center flex-nowrap\">\n <Tab\n :selected=\"view\"\n :tabs=\"tabs\"\n @tab-click=\"$emit('update:view', $event.tab.value)\"\n class=\"mn-r-auto h-100 flex-child-default o-hidden pd-nano radius-small bg-white\"\n classTab=\"pd-thin radius-thin\"\n />\n\n <Button \n @click=\"navPrev\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Previous period\"\n >\n <IconChevronLeft class=\"i-small\"/>\n </Button>\n \n <div class=\"flex h-100 flex-v-center\">\n <Dropdown \n :label=\"dateLabel\"\n align=\"left\"\n class=\"pos-relative z-index-3 h-100 bg-white radius-small pd-thin\"\n >\n <Calendar \n v-model:date=\"selectedDate\"\n @update:date=\"updateDate\"\n class=\"bg-white radius-small pd-small\"\n />\n </Dropdown>\n </div>\n \n <Button \n @click=\"navNext\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Next period\"\n >\n <IconChevronRight class=\"i-small\"/>\n </Button>\n \n <Button \n @click=\"$emit('today')\" \n class=\"pd-r-small pd-l-small radius-small bg-second t-white mn-l-thin\"\n >\n Today\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue'\nimport dayjs from 'dayjs'\n\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport DateLabel from './DateLabel.vue'\n\nimport IconChevronRight from '@martyrs/src/modules/icons/navigation/IconChevronRight.vue'\nimport IconChevronLeft from '@martyrs/src/modules/icons/navigation/IconChevronLeft.vue'\n\nconst props = defineProps({\n view: { type: String, required: true },\n views: { type: Array, required: true },\n date: { type: Date, required: true }\n})\n\nconst emit = defineEmits(['update:view', 'update:date', 'today'])\n\n// View tabs\nconst tabs = computed(() => \n props.views.map(v => ({\n name: v.name,\n label: v.name,\n value: v.value\n }))\n)\n\n// Date label based on view\nconst dateLabel = computed(() => {\n const d = dayjs(props.date)\n \n let dateText\n switch (props.view) {\n case 'hours':\n dateText = d.format('DD/MM/YYYY')\n break\n case 'days':\n dateText = d.format('MMMM YYYY')\n break\n case 'weeks':\n dateText = d.format('MMMM YYYY')\n break\n default:\n dateText = d.format('MMMM YYYY')\n }\n \n return {\n component: DateLabel,\n props: {\n dateText\n },\n class: 'cursor-pointer'\n }\n})\n\n// Selected date for calendar\nconst selectedDate = ref(props.date)\n\n// Navigation\nconst navPrev = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.subtract(1, 'day').toDate()\n break\n case 'days':\n newDate = d.subtract(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.subtract(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst navNext = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.add(1, 'day').toDate()\n break\n case 'days':\n newDate = d.add(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.add(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst updateDate = (newSelectedDate) => {\n if (newSelectedDate) {\n const newDate = new Date(newSelectedDate)\n emit('update:date', newDate)\n // Emit load-more event to trigger data loading for new date\n emit('load-more', 'refresh')\n }\n}\n\n// Watch for props.date changes to update selectedDate\nwatch(() => props.date, (newDate) => {\n selectedDate.value = newDate\n})\n</script>"],"names":["computed","dayjs","DateLabel","ref","watch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgEA,UAAM,QAAQ;AAMd,UAAM,OAAO;AAGb,UAAM,OAAOA,IAAAA;AAAAA,MAAS,MACpB,MAAM,MAAM,IAAI,QAAM;AAAA,QACpB,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,MACb,EAAI;AAAA,IACJ;AAGA,UAAM,YAAYA,IAAAA,SAAS,MAAM;AAC/B,YAAM,IAAIC,kBAAM,MAAM,IAAI;AAE1B,UAAI;AACJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,qBAAW,EAAE,OAAO,YAAY;AAChC;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF;AACE,qBAAW,EAAE,OAAO,WAAW;AAAA,MACrC;AAEE,aAAO;AAAA,QACL,WAAWC,UAAAA;AAAAA,QACX,OAAO;AAAA,UACL;AAAA,QACN;AAAA,QACI,OAAO;AAAA,MACX;AAAA,IACA,CAAC;AAGD,UAAM,eAAeC,IAAAA,IAAI,MAAM,IAAI;AAGnC,UAAM,UAAU,MAAM;AACpB,YAAM,IAAIF,kBAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,KAAK,EAAE,OAAM;AACrC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM;AACpB,YAAM,IAAIA,kBAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,KAAK,EAAE,OAAM;AAChC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,aAAa,CAAC,oBAAoB;AACtC,UAAI,iBAAiB;AACnB,cAAM,UAAU,IAAI,KAAK,eAAe;AACxC,aAAK,eAAe,OAAO;AAE3B,aAAK,aAAa,SAAS;AAAA,MAC7B;AAAA,IACF;AAGAG,QAAAA,MAAM,MAAM,MAAM,MAAM,CAAC,YAAY;AACnC,mBAAa,QAAQ;AAAA,IACvB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -5,8 +5,8 @@ import _sfc_main$3 from "../../../../../../components/Button/Button.vue.js";
5
5
  import _sfc_main$4 from "../../../../../../components/Dropdown/Dropdown.vue.js";
6
6
  import Calendar from "../../../../../../components/Calendar/Calendar.vue2.js";
7
7
  import _sfc_main$1 from "./DateLabel.vue.js";
8
- import IconChevronRight from "../../../../../icons/navigation/IconChevronRight.vue.js";
9
- import IconChevronLeft from "../../../../../icons/navigation/IconChevronLeft.vue.js";
8
+ import IconNext from "../../../../../icons/navigation/IconChevronRight.vue.js";
9
+ import IconPrevious from "../../../../../icons/navigation/IconChevronLeft.vue.js";
10
10
  const _hoisted_1 = { class: "flex-nowrap w-100 flex bg-light pd-small radius-medium mn-b-small" };
11
11
  const _hoisted_2 = { class: "flex w-100 gap-micro flex-v-center flex-nowrap" };
12
12
  const _hoisted_3 = { class: "flex h-100 flex-v-center" };
@@ -89,6 +89,7 @@ const _sfc_main = {
89
89
  if (newSelectedDate) {
90
90
  const newDate = new Date(newSelectedDate);
91
91
  emit("update:date", newDate);
92
+ emit("load-more", "refresh");
92
93
  }
93
94
  };
94
95
  watch(() => props.date, (newDate) => {
@@ -110,7 +111,7 @@ const _sfc_main = {
110
111
  "aria-label": "Previous period"
111
112
  }, {
112
113
  default: withCtx(() => [
113
- createVNode(IconChevronLeft, { class: "i-small" })
114
+ createVNode(IconPrevious, { class: "i-small" })
114
115
  ]),
115
116
  _: 1
116
117
  }),
@@ -118,7 +119,7 @@ const _sfc_main = {
118
119
  createVNode(_sfc_main$4, {
119
120
  label: dateLabel.value,
120
121
  align: "left",
121
- class: "pos-relative h-100 bg-white radius-small pd-thin"
122
+ class: "pos-relative z-index-3 h-100 bg-white radius-small pd-thin"
122
123
  }, {
123
124
  default: withCtx(() => [
124
125
  createVNode(Calendar, {
@@ -139,7 +140,7 @@ const _sfc_main = {
139
140
  "aria-label": "Next period"
140
141
  }, {
141
142
  default: withCtx(() => [
142
- createVNode(IconChevronRight, { class: "i-small" })
143
+ createVNode(IconNext, { class: "i-small" })
143
144
  ]),
144
145
  _: 1
145
146
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"GanttToolbar.vue.js","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttToolbar.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap w-100 flex bg-light pd-small radius-medium mn-b-small\">\n <div class=\"flex w-100 gap-micro flex-v-center flex-nowrap\">\n <Tab\n :selected=\"view\"\n :tabs=\"tabs\"\n @tab-click=\"$emit('update:view', $event.tab.value)\"\n class=\"mn-r-auto h-100 flex-child-default o-hidden pd-nano radius-small bg-white\"\n classTab=\"pd-thin radius-thin\"\n />\n\n <Button \n @click=\"navPrev\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Previous period\"\n >\n <IconChevronLeft class=\"i-small\"/>\n </Button>\n \n <div class=\"flex h-100 flex-v-center\">\n <Dropdown \n :label=\"dateLabel\"\n align=\"left\"\n class=\"pos-relative h-100 bg-white radius-small pd-thin\"\n >\n <Calendar \n v-model:date=\"selectedDate\"\n @update:date=\"updateDate\"\n class=\"bg-white radius-small pd-small\"\n />\n </Dropdown>\n </div>\n \n <Button \n @click=\"navNext\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Next period\"\n >\n <IconChevronRight class=\"i-small\"/>\n </Button>\n \n <Button \n @click=\"$emit('today')\" \n class=\"pd-r-small pd-l-small radius-small bg-second t-white mn-l-thin\"\n >\n Today\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue'\nimport dayjs from 'dayjs'\n\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport DateLabel from './DateLabel.vue'\n\nimport IconChevronRight from '@martyrs/src/modules/icons/navigation/IconChevronRight.vue'\nimport IconChevronLeft from '@martyrs/src/modules/icons/navigation/IconChevronLeft.vue'\n\nconst props = defineProps({\n view: { type: String, required: true },\n views: { type: Array, required: true },\n date: { type: Date, required: true }\n})\n\nconst emit = defineEmits(['update:view', 'update:date', 'today'])\n\n// View tabs\nconst tabs = computed(() => \n props.views.map(v => ({\n name: v.name,\n label: v.name,\n value: v.value\n }))\n)\n\n// Date label based on view\nconst dateLabel = computed(() => {\n const d = dayjs(props.date)\n \n let dateText\n switch (props.view) {\n case 'hours':\n dateText = d.format('DD/MM/YYYY')\n break\n case 'days':\n dateText = d.format('MMMM YYYY')\n break\n case 'weeks':\n dateText = d.format('MMMM YYYY')\n break\n default:\n dateText = d.format('MMMM YYYY')\n }\n \n return {\n component: DateLabel,\n props: {\n dateText\n },\n class: 'cursor-pointer'\n }\n})\n\n// Selected date for calendar\nconst selectedDate = ref(props.date)\n\n// Navigation\nconst navPrev = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.subtract(1, 'day').toDate()\n break\n case 'days':\n newDate = d.subtract(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.subtract(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst navNext = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.add(1, 'day').toDate()\n break\n case 'days':\n newDate = d.add(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.add(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst updateDate = (newSelectedDate) => {\n if (newSelectedDate) {\n const newDate = new Date(newSelectedDate)\n emit('update:date', newDate)\n }\n}\n\n// Watch for props.date changes to update selectedDate\nwatch(() => props.date, (newDate) => {\n selectedDate.value = newDate\n})\n</script>"],"names":["DateLabel"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgEA,UAAM,QAAQ;AAMd,UAAM,OAAO;AAGb,UAAM,OAAO;AAAA,MAAS,MACpB,MAAM,MAAM,IAAI,QAAM;AAAA,QACpB,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,MACb,EAAI;AAAA,IACJ;AAGA,UAAM,YAAY,SAAS,MAAM;AAC/B,YAAM,IAAI,MAAM,MAAM,IAAI;AAE1B,UAAI;AACJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,qBAAW,EAAE,OAAO,YAAY;AAChC;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF;AACE,qBAAW,EAAE,OAAO,WAAW;AAAA,MACrC;AAEE,aAAO;AAAA,QACL,WAAWA;AAAAA,QACX,OAAO;AAAA,UACL;AAAA,QACN;AAAA,QACI,OAAO;AAAA,MACX;AAAA,IACA,CAAC;AAGD,UAAM,eAAe,IAAI,MAAM,IAAI;AAGnC,UAAM,UAAU,MAAM;AACpB,YAAM,IAAI,MAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,KAAK,EAAE,OAAM;AACrC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM;AACpB,YAAM,IAAI,MAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,KAAK,EAAE,OAAM;AAChC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,aAAa,CAAC,oBAAoB;AACtC,UAAI,iBAAiB;AACnB,cAAM,UAAU,IAAI,KAAK,eAAe;AACxC,aAAK,eAAe,OAAO;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,MAAM,MAAM,MAAM,CAAC,YAAY;AACnC,mBAAa,QAAQ;AAAA,IACvB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"GanttToolbar.vue.js","sources":["../../../../../../../../../src/modules/rents/views/components/pages/Gant/GanttToolbar.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap w-100 flex bg-light pd-small radius-medium mn-b-small\">\n <div class=\"flex w-100 gap-micro flex-v-center flex-nowrap\">\n <Tab\n :selected=\"view\"\n :tabs=\"tabs\"\n @tab-click=\"$emit('update:view', $event.tab.value)\"\n class=\"mn-r-auto h-100 flex-child-default o-hidden pd-nano radius-small bg-white\"\n classTab=\"pd-thin radius-thin\"\n />\n\n <Button \n @click=\"navPrev\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Previous period\"\n >\n <IconChevronLeft class=\"i-small\"/>\n </Button>\n \n <div class=\"flex h-100 flex-v-center\">\n <Dropdown \n :label=\"dateLabel\"\n align=\"left\"\n class=\"pos-relative z-index-3 h-100 bg-white radius-small pd-thin\"\n >\n <Calendar \n v-model:date=\"selectedDate\"\n @update:date=\"updateDate\"\n class=\"bg-white radius-small pd-small\"\n />\n </Dropdown>\n </div>\n \n <Button \n @click=\"navNext\" \n class=\"bg-white aspect-1x1 pd-small radius-small\"\n aria-label=\"Next period\"\n >\n <IconChevronRight class=\"i-small\"/>\n </Button>\n \n <Button \n @click=\"$emit('today')\" \n class=\"pd-r-small pd-l-small radius-small bg-second t-white mn-l-thin\"\n >\n Today\n </Button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue'\nimport dayjs from 'dayjs'\n\nimport Tab from '@martyrs/src/components/Tab/Tab.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport DateLabel from './DateLabel.vue'\n\nimport IconChevronRight from '@martyrs/src/modules/icons/navigation/IconChevronRight.vue'\nimport IconChevronLeft from '@martyrs/src/modules/icons/navigation/IconChevronLeft.vue'\n\nconst props = defineProps({\n view: { type: String, required: true },\n views: { type: Array, required: true },\n date: { type: Date, required: true }\n})\n\nconst emit = defineEmits(['update:view', 'update:date', 'today'])\n\n// View tabs\nconst tabs = computed(() => \n props.views.map(v => ({\n name: v.name,\n label: v.name,\n value: v.value\n }))\n)\n\n// Date label based on view\nconst dateLabel = computed(() => {\n const d = dayjs(props.date)\n \n let dateText\n switch (props.view) {\n case 'hours':\n dateText = d.format('DD/MM/YYYY')\n break\n case 'days':\n dateText = d.format('MMMM YYYY')\n break\n case 'weeks':\n dateText = d.format('MMMM YYYY')\n break\n default:\n dateText = d.format('MMMM YYYY')\n }\n \n return {\n component: DateLabel,\n props: {\n dateText\n },\n class: 'cursor-pointer'\n }\n})\n\n// Selected date for calendar\nconst selectedDate = ref(props.date)\n\n// Navigation\nconst navPrev = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.subtract(1, 'day').toDate()\n break\n case 'days':\n newDate = d.subtract(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.subtract(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst navNext = () => {\n const d = dayjs(props.date)\n let newDate\n \n switch (props.view) {\n case 'hours':\n newDate = d.add(1, 'day').toDate()\n break\n case 'days':\n newDate = d.add(1, 'month').toDate()\n break\n case 'weeks':\n newDate = d.add(1, 'month').toDate()\n break\n }\n \n emit('update:date', newDate)\n}\n\nconst updateDate = (newSelectedDate) => {\n if (newSelectedDate) {\n const newDate = new Date(newSelectedDate)\n emit('update:date', newDate)\n // Emit load-more event to trigger data loading for new date\n emit('load-more', 'refresh')\n }\n}\n\n// Watch for props.date changes to update selectedDate\nwatch(() => props.date, (newDate) => {\n selectedDate.value = newDate\n})\n</script>"],"names":["DateLabel"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgEA,UAAM,QAAQ;AAMd,UAAM,OAAO;AAGb,UAAM,OAAO;AAAA,MAAS,MACpB,MAAM,MAAM,IAAI,QAAM;AAAA,QACpB,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,MACb,EAAI;AAAA,IACJ;AAGA,UAAM,YAAY,SAAS,MAAM;AAC/B,YAAM,IAAI,MAAM,MAAM,IAAI;AAE1B,UAAI;AACJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,qBAAW,EAAE,OAAO,YAAY;AAChC;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF,KAAK;AACH,qBAAW,EAAE,OAAO,WAAW;AAC/B;AAAA,QACF;AACE,qBAAW,EAAE,OAAO,WAAW;AAAA,MACrC;AAEE,aAAO;AAAA,QACL,WAAWA;AAAAA,QACX,OAAO;AAAA,UACL;AAAA,QACN;AAAA,QACI,OAAO;AAAA,MACX;AAAA,IACA,CAAC;AAGD,UAAM,eAAe,IAAI,MAAM,IAAI;AAGnC,UAAM,UAAU,MAAM;AACpB,YAAM,IAAI,MAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,KAAK,EAAE,OAAM;AACrC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,SAAS,GAAG,OAAO,EAAE,OAAM;AACvC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM;AACpB,YAAM,IAAI,MAAM,MAAM,IAAI;AAC1B,UAAI;AAEJ,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,KAAK,EAAE,OAAM;AAChC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,QACF,KAAK;AACH,oBAAU,EAAE,IAAI,GAAG,OAAO,EAAE,OAAM;AAClC;AAAA,MACN;AAEE,WAAK,eAAe,OAAO;AAAA,IAC7B;AAEA,UAAM,aAAa,CAAC,oBAAoB;AACtC,UAAI,iBAAiB;AACnB,cAAM,UAAU,IAAI,KAAK,eAAe;AACxC,aAAK,eAAe,OAAO;AAE3B,aAAK,aAAa,SAAS;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,MAAM,MAAM,MAAM,CAAC,YAAY;AACnC,mBAAa,QAAQ;AAAA,IACvB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}