@ozdao/martyrs 0.2.601 → 0.2.603

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 (717) hide show
  1. package/dist/{abac-BPl9Bmf9.js → abac-Blt8bUTL.js} +3 -3
  2. package/dist/{addUserStatusFields-Cc-JpmPo.js → addUserStatusFields-CjV_sbh7.js} +2 -2
  3. package/dist/auth.server.js +57 -2
  4. package/dist/builder.js +148 -85
  5. package/dist/community.server.js +11 -11
  6. package/dist/core.server.js +2 -2
  7. package/dist/{core.verifier-gPPX_jhf.js → core.verifier-DVB2a21y.js} +6 -3
  8. package/dist/{crud-DpOXTZep.js → crud-BT5FIvQC.js} +2 -3
  9. package/dist/engagement.schema-B-Cc_NsG.js +6 -0
  10. package/dist/events.server.js +3 -3
  11. package/dist/gallery.server.js +1 -1
  12. package/dist/governance.server.js +1632 -0
  13. package/dist/icons.server.js +267 -0
  14. package/dist/inventory.server.js +6 -6
  15. package/dist/martyrs/dist/martyrs.es3.js +116 -0
  16. package/dist/martyrs/dist/martyrs.es3.js.map +1 -0
  17. package/dist/martyrs/dist/martyrs.es39.js +124 -0
  18. package/dist/martyrs/dist/martyrs.es39.js.map +1 -0
  19. package/dist/martyrs/dist/martyrs.es43.js +30 -0
  20. package/dist/martyrs/dist/martyrs.es43.js.map +1 -0
  21. package/dist/martyrs/dist/martyrs.es44.js +28 -0
  22. package/dist/martyrs/dist/martyrs.es44.js.map +1 -0
  23. package/dist/martyrs/dist/martyrs.es46.js +10 -0
  24. package/dist/martyrs/dist/martyrs.es46.js.map +1 -0
  25. package/dist/martyrs/src/components/Address/{Address.vue.js → Address.vue2.js} +2 -2
  26. package/dist/martyrs/src/components/Address/Address.vue2.js.map +1 -0
  27. package/dist/martyrs/src/components/Block/Block.vue.js +1 -1
  28. package/dist/martyrs/src/components/Block/Block.vue.js.map +1 -1
  29. package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +8 -5
  30. package/dist/martyrs/src/components/Button/Button.vue2.js.map +1 -0
  31. package/dist/martyrs/src/components/EditImages/{EditImages.vue2.js → EditImages.vue.js} +2 -2
  32. package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -0
  33. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  34. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +4 -4
  35. package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue.js → LocationMarker.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
  38. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
  39. package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
  40. package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
  41. package/dist/martyrs/src/components/Tab/{Tab.vue2.js → Tab.vue.js} +2 -2
  42. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +1 -0
  43. package/dist/martyrs/src/components/Table/StatusBadge.vue.js +19 -10
  44. package/dist/martyrs/src/components/Table/StatusBadge.vue.js.map +1 -1
  45. package/dist/martyrs/src/components/Text/Text.vue.js +1 -1
  46. package/dist/martyrs/src/components/Text/Text.vue.js.map +1 -1
  47. package/dist/martyrs/src/modules/auth/views/components/blocks/OtpDialog.vue.js +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/blocks/PopupAuth.vue.js +3 -3
  49. package/dist/martyrs/src/modules/auth/views/components/blocks/PopupAuth.vue.js.map +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +3 -3
  51. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  52. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +17 -21
  53. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js.map +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +13 -13
  55. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +2 -2
  56. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +3 -3
  57. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +42 -4
  58. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
  59. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +3 -3
  60. package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js +34 -66
  61. package/dist/martyrs/src/modules/auth/views/components/pages/UserDashboard.vue.js.map +1 -1
  62. package/dist/martyrs/src/modules/auth/views/router/users.router.js +0 -53
  63. package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -1
  64. package/dist/martyrs/src/modules/backoffice/components/pages/Dashboard.vue.js +515 -103
  65. package/dist/martyrs/src/modules/backoffice/components/pages/Dashboard.vue.js.map +1 -1
  66. package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js +1 -3
  67. package/dist/martyrs/src/modules/backoffice/configs/navigation.backoffice.config.js.map +1 -1
  68. package/dist/martyrs/src/modules/backoffice/router/backoffice.router.js +1 -32
  69. package/dist/martyrs/src/modules/backoffice/router/backoffice.router.js.map +1 -1
  70. package/dist/martyrs/src/modules/community/community.client.js +49 -8
  71. package/dist/martyrs/src/modules/community/community.client.js.map +1 -1
  72. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +10 -4
  73. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js.map +1 -1
  74. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +4 -4
  75. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
  76. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +2 -2
  77. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js.map +1 -1
  78. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +28 -17
  79. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +36 -28
  81. package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js.map +1 -1
  82. package/dist/martyrs/src/modules/community/components/sections/Comment.vue.js +2 -2
  83. package/dist/martyrs/src/modules/community/components/sections/Comment.vue.js.map +1 -1
  84. package/dist/martyrs/src/modules/community/router/community.backoffice.router.js +21 -0
  85. package/dist/martyrs/src/modules/community/router/community.backoffice.router.js.map +1 -0
  86. package/dist/martyrs/src/modules/community/router/community.organization.router.js +70 -0
  87. package/dist/martyrs/src/modules/community/router/community.organization.router.js.map +1 -0
  88. package/dist/martyrs/src/modules/community/router/community.router.js +73 -0
  89. package/dist/martyrs/src/modules/community/router/community.router.js.map +1 -0
  90. package/dist/martyrs/src/modules/community/router/community.user.router.js +20 -0
  91. package/dist/martyrs/src/modules/community/router/community.user.router.js.map +1 -0
  92. package/dist/martyrs/src/modules/constructor/components/elements/Textarea.vue2.js +1 -1
  93. package/dist/martyrs/src/modules/constructor/components/elements/Textarea.vue2.js.map +1 -1
  94. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js.map +1 -1
  95. package/dist/martyrs/src/modules/core/views/classes/core.app.js +5 -3
  96. package/dist/martyrs/src/modules/core/views/classes/core.app.js.map +1 -1
  97. package/dist/martyrs/src/modules/core/views/classes/i18n.manager.js +7 -2
  98. package/dist/martyrs/src/modules/core/views/classes/i18n.manager.js.map +1 -1
  99. package/dist/martyrs/src/modules/core/views/classes/ws.manager.js +11 -5
  100. package/dist/martyrs/src/modules/core/views/classes/ws.manager.js.map +1 -1
  101. package/dist/martyrs/src/modules/core/views/components/blocks/Card.vue.js +53 -18
  102. package/dist/martyrs/src/modules/core/views/components/blocks/Card.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +1 -1
  104. package/dist/martyrs/src/modules/core/views/components/blocks/CardStat.vue.js +44 -0
  105. package/dist/martyrs/src/modules/core/views/components/blocks/CardStat.vue.js.map +1 -0
  106. package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +5 -5
  107. package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js +1 -1
  108. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +9 -6
  109. package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
  110. package/dist/martyrs/src/modules/core/views/components/partials/BottomNavigationBar.vue.js +5 -5
  111. package/dist/martyrs/src/modules/core/views/components/partials/BottomNavigationBar.vue.js.map +1 -1
  112. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +15 -15
  113. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js.map +1 -1
  114. package/dist/martyrs/src/modules/core/views/components/partials/LocationSelection.vue.js +2 -2
  115. package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +27 -28
  116. package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js.map +1 -1
  117. package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +6 -6
  118. package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js +5 -7
  119. package/dist/martyrs/src/modules/core/views/components/partials/Sidebar.vue.js.map +1 -1
  120. package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js} +2 -2
  121. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -0
  122. package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +28 -18
  123. package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js.map +1 -1
  124. package/dist/martyrs/src/modules/core/views/mixins/mixins.js +3 -3
  125. package/dist/martyrs/src/modules/core/views/mixins/mixins.js.map +1 -1
  126. package/dist/martyrs/src/modules/core/views/router/addRoutes.js +2 -3
  127. package/dist/martyrs/src/modules/core/views/router/addRoutes.js.map +1 -1
  128. package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +10 -0
  129. package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
  130. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +4 -4
  131. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +2 -2
  132. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +3 -3
  133. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +9 -9
  134. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  136. package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -0
  137. package/dist/martyrs/src/modules/events/components/pages/Events.vue.js.map +1 -1
  138. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +23 -33
  139. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js.map +1 -1
  140. package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +13 -13
  141. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +2 -2
  142. package/dist/martyrs/src/modules/events/components/sections/List.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/events/events.client.js +37 -15
  144. package/dist/martyrs/src/modules/events/events.client.js.map +1 -1
  145. package/dist/martyrs/src/modules/events/router/events.backoffice.router.js +95 -0
  146. package/dist/martyrs/src/modules/events/router/events.backoffice.router.js.map +1 -0
  147. package/dist/martyrs/src/modules/events/router/events.organization.router.js +95 -0
  148. package/dist/martyrs/src/modules/events/router/events.organization.router.js.map +1 -0
  149. package/dist/martyrs/src/modules/events/router/events.router.js +73 -364
  150. package/dist/martyrs/src/modules/events/router/events.router.js.map +1 -1
  151. package/dist/martyrs/src/modules/events/router/events.user.router.js +65 -0
  152. package/dist/martyrs/src/modules/events/router/events.user.router.js.map +1 -0
  153. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +5 -5
  154. package/dist/martyrs/src/modules/governance/configs/navigation.initiative.config.js +33 -0
  155. package/dist/martyrs/src/modules/governance/configs/navigation.initiative.config.js.map +1 -0
  156. package/dist/martyrs/src/modules/governance/governance.client.js +31 -0
  157. package/dist/martyrs/src/modules/governance/governance.client.js.map +1 -0
  158. package/dist/martyrs/src/modules/governance/views/components/blocks/CardInitiativeItem.vue.js +110 -0
  159. package/dist/martyrs/src/modules/governance/views/components/blocks/CardInitiativeItem.vue.js.map +1 -0
  160. package/dist/martyrs/src/modules/governance/views/components/blocks/CardSprintItem.vue.js +105 -0
  161. package/dist/martyrs/src/modules/governance/views/components/blocks/CardSprintItem.vue.js.map +1 -0
  162. package/dist/martyrs/src/modules/governance/views/components/blocks/CardTaskItem.vue.js +110 -0
  163. package/dist/martyrs/src/modules/governance/views/components/blocks/CardTaskItem.vue.js.map +1 -0
  164. package/dist/martyrs/src/modules/governance/views/components/blocks/CardVotingItem.vue.js +106 -0
  165. package/dist/martyrs/src/modules/governance/views/components/blocks/CardVotingItem.vue.js.map +1 -0
  166. package/dist/martyrs/src/modules/governance/views/components/pages/Governance.vue.js +52 -0
  167. package/dist/martyrs/src/modules/governance/views/components/pages/Governance.vue.js.map +1 -0
  168. package/dist/martyrs/src/modules/governance/views/components/pages/Initiative.vue.js +684 -0
  169. package/dist/martyrs/src/modules/governance/views/components/pages/Initiative.vue.js.map +1 -0
  170. package/dist/martyrs/src/modules/governance/views/components/pages/InitiativeCreate.vue.js +78 -0
  171. package/dist/martyrs/src/modules/governance/views/components/pages/InitiativeCreate.vue.js.map +1 -0
  172. package/dist/martyrs/src/modules/governance/views/components/pages/InitiativeSprints.vue.js +328 -0
  173. package/dist/martyrs/src/modules/governance/views/components/pages/InitiativeSprints.vue.js.map +1 -0
  174. package/dist/martyrs/src/modules/governance/views/components/pages/Initiatives.vue.js +145 -0
  175. package/dist/martyrs/src/modules/governance/views/components/pages/Initiatives.vue.js.map +1 -0
  176. package/dist/martyrs/src/modules/governance/views/components/pages/Sprint.vue.js +258 -0
  177. package/dist/martyrs/src/modules/governance/views/components/pages/Sprint.vue.js.map +1 -0
  178. package/dist/martyrs/src/modules/governance/views/components/pages/SprintCreate.vue.js +72 -0
  179. package/dist/martyrs/src/modules/governance/views/components/pages/SprintCreate.vue.js.map +1 -0
  180. package/dist/martyrs/src/modules/governance/views/components/pages/Task.vue.js +769 -0
  181. package/dist/martyrs/src/modules/governance/views/components/pages/Task.vue.js.map +1 -0
  182. package/dist/martyrs/src/modules/governance/views/components/pages/TaskCreate.vue.js +88 -0
  183. package/dist/martyrs/src/modules/governance/views/components/pages/TaskCreate.vue.js.map +1 -0
  184. package/dist/martyrs/src/modules/governance/views/components/pages/Tasks.vue.js +291 -0
  185. package/dist/martyrs/src/modules/governance/views/components/pages/Tasks.vue.js.map +1 -0
  186. package/dist/martyrs/src/modules/governance/views/components/pages/Voting.vue.js +267 -0
  187. package/dist/martyrs/src/modules/governance/views/components/pages/Voting.vue.js.map +1 -0
  188. package/dist/martyrs/src/modules/governance/views/components/pages/VotingCreate.vue.js +90 -0
  189. package/dist/martyrs/src/modules/governance/views/components/pages/VotingCreate.vue.js.map +1 -0
  190. package/dist/martyrs/src/modules/governance/views/components/pages/Votings.vue.js +68 -0
  191. package/dist/martyrs/src/modules/governance/views/components/pages/Votings.vue.js.map +1 -0
  192. package/dist/martyrs/src/modules/governance/views/components/partials/EmptyState.vue.js +47 -0
  193. package/dist/martyrs/src/modules/governance/views/components/partials/EmptyState.vue.js.map +1 -0
  194. package/dist/martyrs/src/modules/governance/views/components/partials/LinkedEntityCard.vue.js +164 -0
  195. package/dist/martyrs/src/modules/governance/views/components/partials/LinkedEntityCard.vue.js.map +1 -0
  196. package/dist/martyrs/src/modules/governance/views/components/partials/TaskStatusBadge.vue.js +39 -0
  197. package/dist/martyrs/src/modules/governance/views/components/partials/TaskStatusBadge.vue.js.map +1 -0
  198. package/dist/martyrs/src/modules/governance/views/components/partials/VoteForm.vue.js +112 -0
  199. package/dist/martyrs/src/modules/governance/views/components/partials/VoteForm.vue.js.map +1 -0
  200. package/dist/martyrs/src/modules/governance/views/components/partials/VotingResults.vue.js +187 -0
  201. package/dist/martyrs/src/modules/governance/views/components/partials/VotingResults.vue.js.map +1 -0
  202. package/dist/martyrs/src/modules/governance/views/components/sections/FormInitiativeDetails.vue.js +555 -0
  203. package/dist/martyrs/src/modules/governance/views/components/sections/FormInitiativeDetails.vue.js.map +1 -0
  204. package/dist/martyrs/src/modules/governance/views/components/sections/FormSprintDetails.vue.js +187 -0
  205. package/dist/martyrs/src/modules/governance/views/components/sections/FormSprintDetails.vue.js.map +1 -0
  206. package/dist/martyrs/src/modules/governance/views/components/sections/FormTaskDetails.vue.js +171 -0
  207. package/dist/martyrs/src/modules/governance/views/components/sections/FormTaskDetails.vue.js.map +1 -0
  208. package/dist/martyrs/src/modules/governance/views/components/sections/FormVotingDetails.vue.js +179 -0
  209. package/dist/martyrs/src/modules/governance/views/components/sections/FormVotingDetails.vue.js.map +1 -0
  210. package/dist/martyrs/src/modules/governance/views/router/governance.router.js +502 -0
  211. package/dist/martyrs/src/modules/governance/views/router/governance.router.js.map +1 -0
  212. package/dist/martyrs/src/modules/governance/views/store/initiatives.js +119 -0
  213. package/dist/martyrs/src/modules/governance/views/store/initiatives.js.map +1 -0
  214. package/dist/martyrs/src/modules/governance/views/store/sprints.js +99 -0
  215. package/dist/martyrs/src/modules/governance/views/store/sprints.js.map +1 -0
  216. package/dist/martyrs/src/modules/governance/views/store/tasks.js +115 -0
  217. package/dist/martyrs/src/modules/governance/views/store/tasks.js.map +1 -0
  218. package/dist/martyrs/src/modules/governance/views/store/votings.js +155 -0
  219. package/dist/martyrs/src/modules/governance/views/store/votings.js.map +1 -0
  220. package/dist/martyrs/src/modules/icons/entities/IconCash.vue.js +70 -0
  221. package/dist/martyrs/src/modules/icons/entities/IconCash.vue.js.map +1 -0
  222. package/dist/martyrs/src/modules/icons/icons.client.js +1 -1
  223. package/dist/martyrs/src/modules/icons/icons.client.js.map +1 -1
  224. package/dist/martyrs/src/modules/icons/{icons.router.js → router/icons.router.js} +1 -1
  225. package/dist/martyrs/src/modules/icons/router/icons.router.js.map +1 -0
  226. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +4 -4
  227. package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +3 -3
  228. package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +2 -2
  229. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +4 -4
  230. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +6 -6
  231. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js.map +1 -1
  232. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
  233. package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +9 -9
  234. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +4 -4
  235. package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +2 -2
  236. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +4 -4
  237. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +7 -7
  238. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +4 -4
  239. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +4 -4
  240. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +3 -3
  241. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +4 -4
  242. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +4 -4
  243. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
  244. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +9 -9
  245. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +13 -13
  246. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +9 -9
  247. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +9 -9
  248. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +16 -16
  249. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  250. package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +2 -2
  251. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +4 -4
  252. package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +10 -10
  253. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +6 -6
  254. package/dist/martyrs/src/modules/music/components/sections/PopularTracks.vue.js +63 -0
  255. package/dist/martyrs/src/modules/music/components/sections/PopularTracks.vue.js.map +1 -0
  256. package/dist/martyrs/src/modules/music/music.client.js +29 -25
  257. package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
  258. package/dist/martyrs/src/modules/music/{music.router.js → router/music.router.js} +16 -16
  259. package/dist/martyrs/src/modules/music/router/music.router.js.map +1 -0
  260. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +26 -27
  261. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
  262. package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +118 -59
  263. package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js.map +1 -1
  264. package/dist/martyrs/src/modules/notifications/notifications.client.js +74 -54
  265. package/dist/martyrs/src/modules/notifications/notifications.client.js.map +1 -1
  266. package/dist/martyrs/src/modules/notifications/{notifications.router.js → router/notifications.router.js} +3 -3
  267. package/dist/martyrs/src/modules/notifications/router/notifications.router.js.map +1 -0
  268. package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.js +34 -44
  269. package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.js.map +1 -1
  270. package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.js +47 -57
  271. package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.js.map +1 -1
  272. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js +2 -2
  273. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js.map +1 -1
  274. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +2 -2
  275. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js.map +1 -1
  276. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +4 -4
  277. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +6 -6
  278. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js.map +1 -1
  279. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +7 -7
  280. package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.js +61 -54
  281. package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.js.map +1 -1
  282. package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.js +43 -31
  283. package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.js.map +1 -1
  284. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +14 -14
  285. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +3 -3
  286. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
  287. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +19 -19
  288. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  289. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +7 -10
  290. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js.map +1 -1
  291. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +7 -10
  292. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js.map +1 -1
  293. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +3 -3
  294. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
  295. package/dist/martyrs/src/modules/orders/orders.client.js +16 -16
  296. package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
  297. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +11 -4
  298. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js.map +1 -1
  299. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +2 -2
  300. package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +2 -2
  301. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +22 -15
  302. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js.map +1 -1
  303. package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +2 -2
  304. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +63 -1
  305. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
  306. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +9 -3
  307. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
  308. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +14 -8
  309. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
  310. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +24 -30
  311. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js.map +1 -1
  312. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
  313. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +3 -3
  314. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  315. package/dist/martyrs/src/modules/organizations/organizations.client.js +42 -6
  316. package/dist/martyrs/src/modules/organizations/organizations.client.js.map +1 -1
  317. package/dist/martyrs/src/modules/organizations/router/organizations.backoffice.router.js +20 -0
  318. package/dist/martyrs/src/modules/organizations/router/organizations.backoffice.router.js.map +1 -0
  319. package/dist/martyrs/src/modules/organizations/router/organizations.router.js +102 -0
  320. package/dist/martyrs/src/modules/organizations/router/organizations.router.js.map +1 -0
  321. package/dist/martyrs/src/modules/organizations/router/organizations.user.router.js +20 -0
  322. package/dist/martyrs/src/modules/organizations/router/organizations.user.router.js.map +1 -0
  323. package/dist/martyrs/src/modules/pages/pages.client.js +1 -1
  324. package/dist/martyrs/src/modules/pages/pages.client.js.map +1 -1
  325. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  326. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +3 -3
  327. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
  328. package/dist/martyrs/src/modules/pages/{pages.router.js → views/router/pages.router.js} +8 -8
  329. package/dist/martyrs/src/modules/pages/views/router/pages.router.js.map +1 -0
  330. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js +1 -1
  331. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js.map +1 -1
  332. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  333. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +7 -7
  334. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
  335. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +22 -22
  336. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +5 -5
  337. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  338. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +3 -3
  339. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +4 -4
  340. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +21 -21
  341. package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +4 -4
  342. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +4 -4
  343. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +4 -4
  344. package/dist/martyrs/src/modules/rents/rents.client.js +1 -1
  345. package/dist/martyrs/src/modules/rents/rents.client.js.map +1 -1
  346. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +7 -7
  347. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  348. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +4 -4
  349. package/dist/martyrs/src/modules/rents/{rents.router.js → views/router/rents.router.js} +4 -4
  350. package/dist/martyrs/src/modules/rents/views/router/rents.router.js.map +1 -0
  351. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +3 -3
  352. package/dist/martyrs/src/modules/reports/reports.client.js +1 -1
  353. package/dist/martyrs/src/modules/reports/reports.client.js.map +1 -1
  354. package/dist/martyrs/src/modules/reports/{reports.router.js → router/reports.router.js} +1 -1
  355. package/dist/martyrs/src/modules/reports/router/reports.router.js.map +1 -0
  356. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  357. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +2 -2
  358. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +13 -13
  359. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +22 -22
  360. package/dist/martyrs/src/modules/wallet/views/components/pages/Payments.vue.js +68 -0
  361. package/dist/martyrs/src/modules/wallet/views/components/pages/Payments.vue.js.map +1 -0
  362. package/dist/martyrs/src/modules/wallet/views/router/wallet.router.js +48 -0
  363. package/dist/martyrs/src/modules/wallet/views/router/wallet.router.js.map +1 -0
  364. package/dist/martyrs/src/modules/wallet/views/store/payments.store.js +59 -0
  365. package/dist/martyrs/src/modules/wallet/views/store/payments.store.js.map +1 -0
  366. package/dist/martyrs/src/modules/wallet/wallet.client.js +20 -0
  367. package/dist/martyrs/src/modules/wallet/wallet.client.js.map +1 -0
  368. package/dist/martyrs.es.js +84 -41
  369. package/dist/martyrs.es10.js +126 -0
  370. package/dist/martyrs.es100.js +33 -0
  371. package/dist/martyrs.es102.js +39 -0
  372. package/dist/martyrs.es103.js +31 -0
  373. package/dist/martyrs.es105.js +27 -0
  374. package/dist/martyrs.es106.js +8 -0
  375. package/dist/martyrs.es107.js +9 -0
  376. package/dist/martyrs.es108.js +79 -0
  377. package/dist/martyrs.es109.js +7 -0
  378. package/dist/martyrs.es11.js +49 -0
  379. package/dist/{web-n_ivHO3v.js → martyrs.es110.js} +1 -1
  380. package/dist/martyrs.es111.js +327 -0
  381. package/dist/martyrs.es112.js +121 -0
  382. package/dist/martyrs.es115.js +4 -0
  383. package/dist/martyrs.es116.js +25 -0
  384. package/dist/martyrs.es117.js +7 -0
  385. package/dist/martyrs.es118.js +10 -0
  386. package/dist/martyrs.es119.js +169 -0
  387. package/dist/martyrs.es12.js +94 -0
  388. package/dist/martyrs.es120.js +460 -0
  389. package/dist/martyrs.es121.js +42 -0
  390. package/dist/martyrs.es122.js +12 -0
  391. package/dist/martyrs.es123.js +52 -0
  392. package/dist/martyrs.es124.js +14 -0
  393. package/dist/martyrs.es125.js +47 -0
  394. package/dist/martyrs.es126.js +7 -0
  395. package/dist/martyrs.es127.js +131 -0
  396. package/dist/martyrs.es128.js +103 -0
  397. package/dist/martyrs.es129.js +89 -0
  398. package/dist/martyrs.es13.js +48 -0
  399. package/dist/martyrs.es130.js +40 -0
  400. package/dist/martyrs.es131.js +14 -0
  401. package/dist/martyrs.es132.js +42 -0
  402. package/dist/martyrs.es133.js +11 -0
  403. package/dist/martyrs.es134.js +6 -0
  404. package/dist/martyrs.es135.js +119 -0
  405. package/dist/martyrs.es136.js +20 -0
  406. package/dist/martyrs.es137.js +18 -0
  407. package/dist/martyrs.es138.js +35 -0
  408. package/dist/martyrs.es139.js +12 -0
  409. package/dist/martyrs.es14.js +101 -0
  410. package/dist/martyrs.es140.js +23 -0
  411. package/dist/martyrs.es141.js +12 -0
  412. package/dist/martyrs.es142.js +11 -0
  413. package/dist/martyrs.es143.js +47 -0
  414. package/dist/martyrs.es144.js +483 -0
  415. package/dist/martyrs.es145.js +8 -0
  416. package/dist/martyrs.es146.js +4 -0
  417. package/dist/martyrs.es147.js +14 -0
  418. package/dist/martyrs.es148.js +33 -0
  419. package/dist/martyrs.es149.js +19 -0
  420. package/dist/martyrs.es15.js +408 -0
  421. package/dist/martyrs.es150.js +22 -0
  422. package/dist/martyrs.es151.js +31 -0
  423. package/dist/martyrs.es152.js +23 -0
  424. package/dist/martyrs.es16.js +58 -0
  425. package/dist/martyrs.es17.js +44 -0
  426. package/dist/martyrs.es18.js +42 -0
  427. package/dist/martyrs.es19.js +27 -0
  428. package/dist/martyrs.es2.js +88 -0
  429. package/dist/martyrs.es20.js +13 -0
  430. package/dist/martyrs.es21.js +57 -0
  431. package/dist/martyrs.es22.js +104 -0
  432. package/dist/martyrs.es23.js +178 -0
  433. package/dist/martyrs.es24.js +123 -0
  434. package/dist/martyrs.es25.js +139 -0
  435. package/dist/martyrs.es26.js +21 -0
  436. package/dist/martyrs.es27.js +60 -0
  437. package/dist/martyrs.es28.js +75 -0
  438. package/dist/martyrs.es29.js +36 -0
  439. package/dist/martyrs.es3.js +116 -0
  440. package/dist/martyrs.es30.js +348 -0
  441. package/dist/martyrs.es31.js +83 -0
  442. package/dist/martyrs.es32.js +148 -0
  443. package/dist/martyrs.es33.js +175 -0
  444. package/dist/martyrs.es34.js +66 -0
  445. package/dist/martyrs.es35.js +57 -0
  446. package/dist/martyrs.es36.js +76 -0
  447. package/dist/martyrs.es37.js +101 -0
  448. package/dist/martyrs.es38.js +39 -0
  449. package/dist/martyrs.es39.js +124 -0
  450. package/dist/martyrs.es4.js +85 -0
  451. package/dist/martyrs.es40.js +120 -0
  452. package/dist/martyrs.es41.js +229 -0
  453. package/dist/martyrs.es43.js +29 -0
  454. package/dist/martyrs.es44.js +27 -0
  455. package/dist/martyrs.es46.js +9 -0
  456. package/dist/martyrs.es48.js +18 -0
  457. package/dist/martyrs.es5.js +395 -0
  458. package/dist/martyrs.es50.js +42 -0
  459. package/dist/martyrs.es52.js +255 -0
  460. package/dist/martyrs.es54.js +8 -0
  461. package/dist/martyrs.es6.js +70 -0
  462. package/dist/martyrs.es61.js +139 -0
  463. package/dist/martyrs.es65.js +28 -0
  464. package/dist/martyrs.es68.js +33 -0
  465. package/dist/martyrs.es69.js +37 -0
  466. package/dist/martyrs.es7.js +17 -0
  467. package/dist/martyrs.es71.js +114 -0
  468. package/dist/martyrs.es73.js +83 -0
  469. package/dist/martyrs.es74.js +52 -0
  470. package/dist/martyrs.es75.js +75 -0
  471. package/dist/martyrs.es76.js +176 -0
  472. package/dist/martyrs.es77.js +31 -0
  473. package/dist/martyrs.es78.js +38 -0
  474. package/dist/martyrs.es8.js +127 -0
  475. package/dist/martyrs.es81.js +32 -0
  476. package/dist/martyrs.es86.js +37 -0
  477. package/dist/martyrs.es89.js +37 -0
  478. package/dist/martyrs.es9.js +396 -0
  479. package/dist/martyrs.es91.js +63 -0
  480. package/dist/martyrs.es92.js +7 -0
  481. package/dist/martyrs.es93.js +35 -0
  482. package/dist/martyrs.es95.js +41 -0
  483. package/dist/martyrs.es96.js +59 -0
  484. package/dist/martyrs.es97.js +123 -0
  485. package/dist/martyrs.es98.js +43 -0
  486. package/dist/martyrs.es99.js +86 -0
  487. package/dist/music.server.js +11 -11
  488. package/dist/notifications.server.js +16 -6
  489. package/dist/orders.server.js +264 -145
  490. package/dist/organizations.server.js +22 -6
  491. package/dist/products.server.js +7 -7
  492. package/dist/rents.server.js +4 -3
  493. package/dist/style.css +970 -986
  494. package/package.json +13 -6
  495. package/src/builder/modes/ssr.rspack.dev.js +32 -20
  496. package/src/builder/rspack/rspack.config.api.js +3 -0
  497. package/src/builder/rspack/rspack.config.base.js +9 -1
  498. package/src/builder/rspack/rspack.config.ssr.client.js +27 -10
  499. package/src/components/Block/Block.vue +1 -1
  500. package/src/components/Button/Button.vue +4 -4
  501. package/src/components/Table/StatusBadge.vue +24 -18
  502. package/src/components/Text/Text.vue +1 -1
  503. package/src/jit/core.js +72 -35
  504. package/src/jit/plugin.js +4 -3
  505. package/src/jit/rules.js +15 -15
  506. package/src/modules/TASKS.MD +30 -0
  507. package/src/modules/TASK_ACTIVITY.md +60 -0
  508. package/src/modules/TASK_MODULE_ARCH.md +391 -0
  509. package/src/modules/auth/controllers/routes/users.routes.js +8 -0
  510. package/src/modules/auth/controllers/services/users.service.js +51 -1
  511. package/src/modules/auth/views/components/blocks/PopupAuth.vue +1 -1
  512. package/src/modules/auth/views/components/pages/ProfileBlogposts.vue +25 -24
  513. package/src/modules/auth/views/components/pages/SignIn.vue +10 -1
  514. package/src/modules/auth/views/components/pages/UserDashboard.vue +35 -62
  515. package/src/modules/auth/views/router/users.router.js +0 -44
  516. package/src/modules/backoffice/components/pages/Dashboard.vue +423 -120
  517. package/src/modules/backoffice/configs/navigation.backoffice.config.js +0 -2
  518. package/src/modules/backoffice/router/backoffice.router.js +0 -25
  519. package/src/modules/community/community.client.js +54 -9
  520. package/src/modules/community/components/blocks/CardBlogpost.vue +10 -3
  521. package/src/modules/community/components/layouts/Community.vue +3 -3
  522. package/src/modules/community/components/pages/BlogPost.vue +1 -1
  523. package/src/modules/community/components/pages/CreateBlogPost.vue +19 -20
  524. package/src/modules/community/components/pages/Posts.vue +43 -28
  525. package/src/modules/community/components/sections/Comment.vue +1 -1
  526. package/src/modules/community/controllers/blog.controller.js +4 -5
  527. package/src/modules/community/models/reaction.model.js +1 -0
  528. package/src/modules/community/router/community.backoffice.router.js +16 -0
  529. package/src/modules/community/router/community.organization.router.js +56 -0
  530. package/src/modules/community/router/community.router.js +58 -106
  531. package/src/modules/community/router/community.user.router.js +15 -0
  532. package/src/modules/constructor/components/elements/Textarea.vue +1 -1
  533. package/src/modules/constructor/components/sections/Constructor.vue +1 -1
  534. package/src/modules/core/controllers/classes/core.validator.js +7 -1
  535. package/src/modules/core/controllers/classes/core.verifier.js +0 -2
  536. package/src/modules/core/controllers/classes/crud/crud.controller.js +0 -4
  537. package/src/modules/core/controllers/classes/crud/crud.service.js +1 -0
  538. package/src/modules/core/models/schemas/engagement.schema.js +19 -22
  539. package/src/modules/core/views/classes/core.app.js +6 -4
  540. package/src/modules/core/views/classes/i18n.manager.js +9 -2
  541. package/src/modules/core/views/classes/ws.manager.js +17 -7
  542. package/src/modules/core/views/components/blocks/Card.vue +47 -24
  543. package/src/modules/core/views/components/blocks/CardStat.vue +27 -0
  544. package/src/modules/core/views/components/blocks/PopupAuth.vue +1 -1
  545. package/src/modules/core/views/components/layouts/Client.vue +5 -4
  546. package/src/modules/core/views/components/partials/BottomNavigationBar.vue +5 -5
  547. package/src/modules/core/views/components/partials/Header.vue +2 -2
  548. package/src/modules/core/views/components/partials/Navigation.vue +13 -14
  549. package/src/modules/core/views/components/partials/Sidebar.vue +4 -6
  550. package/src/modules/core/views/components/sections/SectionPageTitle.vue +23 -15
  551. package/src/modules/core/views/mixins/mixins.js +4 -3
  552. package/src/modules/core/views/router/addRoutes.js +1 -2
  553. package/src/modules/core/views/utils/vue-app-renderer.js +12 -0
  554. package/src/modules/events/components/pages/EditEventTickets.vue +1 -1
  555. package/src/modules/events/components/pages/Events.vue +1 -0
  556. package/src/modules/events/components/pages/EventsBackoffice.vue +23 -48
  557. package/src/modules/events/components/sections/List.vue +2 -2
  558. package/src/modules/events/events.client.js +44 -17
  559. package/src/modules/events/router/events.backoffice.router.js +80 -0
  560. package/src/modules/events/router/events.organization.router.js +80 -0
  561. package/src/modules/events/router/events.router.js +55 -325
  562. package/src/modules/events/router/events.user.router.js +49 -0
  563. package/src/modules/governance/TASK-TRACKER.MD +534 -39
  564. package/src/modules/governance/configs/navigation.initiative.config.js +30 -0
  565. package/src/modules/governance/controllers/routes/initiatives.routes.js +55 -8
  566. package/src/modules/governance/controllers/routes/{milestones.routes.js → sprints.routes.js} +22 -22
  567. package/src/modules/governance/controllers/routes/tasks.routes.js +2 -2
  568. package/src/modules/governance/governance.client.js +1 -4
  569. package/src/modules/governance/governance.server.js +6 -6
  570. package/src/modules/governance/middlewares/initiatives.verifier.js +60 -0
  571. package/src/modules/governance/middlewares/{milestones.verifier.js → sprints.verifier.js} +10 -10
  572. package/src/modules/governance/middlewares/tasks.verifier.js +4 -4
  573. package/src/modules/governance/middlewares/votings.verifier.js +25 -7
  574. package/src/modules/governance/models/{milestone.model.js → sprint.model.js} +11 -11
  575. package/src/modules/governance/models/task.model.js +4 -4
  576. package/src/modules/governance/models/voting.model.js +10 -5
  577. package/src/modules/governance/views/components/blocks/CardInitiativeItem.vue +8 -13
  578. package/src/modules/governance/views/components/blocks/{CardMilestoneItem.vue → CardSprintItem.vue} +16 -17
  579. package/src/modules/governance/views/components/blocks/CardTaskItem.vue +7 -9
  580. package/src/modules/governance/views/components/blocks/CardVotingItem.vue +7 -9
  581. package/src/modules/governance/views/components/pages/Governance.vue +13 -34
  582. package/src/modules/governance/views/components/pages/Initiative.vue +73 -154
  583. package/src/modules/governance/views/components/pages/InitiativeCreate.vue +44 -7
  584. package/src/modules/governance/views/components/pages/{Roadmap.vue → InitiativeSprints.vue} +70 -69
  585. package/src/modules/governance/views/components/pages/Initiatives.vue +23 -108
  586. package/src/modules/governance/views/components/pages/{Milestone.vue → Sprint.vue} +43 -41
  587. package/src/modules/governance/views/components/pages/SprintCreate.vue +55 -0
  588. package/src/modules/governance/views/components/pages/Task.vue +95 -88
  589. package/src/modules/governance/views/components/pages/TaskCreate.vue +47 -9
  590. package/src/modules/governance/views/components/pages/Tasks.vue +25 -21
  591. package/src/modules/governance/views/components/pages/Voting.vue +84 -68
  592. package/src/modules/governance/views/components/pages/VotingCreate.vue +48 -8
  593. package/src/modules/governance/views/components/pages/Votings.vue +12 -57
  594. package/src/modules/governance/views/components/partials/EmptyState.vue +1 -1
  595. package/src/modules/governance/views/components/partials/LinkedEntityCard.vue +23 -11
  596. package/src/modules/governance/views/components/partials/TaskStatusBadge.vue +1 -1
  597. package/src/modules/governance/views/components/partials/VoteForm.vue +3 -3
  598. package/src/modules/governance/views/components/partials/VotingResults.vue +13 -19
  599. package/src/modules/governance/views/components/sections/FormInitiativeDetails.vue +413 -15
  600. package/src/modules/governance/views/components/sections/FormSprintDetails.vue +156 -0
  601. package/src/modules/governance/views/components/sections/FormTaskDetails.vue +125 -21
  602. package/src/modules/governance/views/components/sections/FormVotingDetails.vue +136 -17
  603. package/src/modules/governance/views/components/sections/VoteForm.vue +2 -2
  604. package/src/modules/governance/views/router/governance.router.js +255 -151
  605. package/src/modules/governance/views/store/initiatives.js +23 -2
  606. package/src/modules/governance/views/store/sprints.js +102 -0
  607. package/src/modules/governance/views/store/tasks.js +25 -9
  608. package/src/modules/governance/views/store/votings.js +106 -27
  609. package/src/modules/icons/icons.client.js +1 -1
  610. package/src/modules/inventory/components/pages/InventoryEdit.vue +1 -1
  611. package/src/modules/music/components/sections/PopularTracks.vue +52 -0
  612. package/src/modules/music/music.client.js +8 -1
  613. package/src/modules/music/router/music.router.js +13 -1
  614. package/src/modules/notifications/components/elements/NotificationBadge.vue +8 -33
  615. package/src/modules/notifications/components/sections/NotificationPreferences.vue +110 -48
  616. package/src/modules/notifications/notifications.client.js +78 -57
  617. package/src/modules/notifications/router/notifications.router.js +32 -15
  618. package/src/modules/notifications/services/notification.service.js +15 -6
  619. package/src/modules/notifications/services/web-push.service.js +2 -0
  620. package/src/modules/orders/components/blocks/CardApplication.vue +20 -40
  621. package/src/modules/orders/components/blocks/CardCustomer.vue +35 -55
  622. package/src/modules/orders/components/blocks/CardOrderItem.vue +2 -2
  623. package/src/modules/orders/components/blocks/CardOrderUser.vue +2 -2
  624. package/src/modules/orders/components/forms/FormCustomerDetails.vue +2 -2
  625. package/src/modules/orders/components/pages/Applications.vue +59 -57
  626. package/src/modules/orders/components/pages/Customers.vue +40 -27
  627. package/src/modules/orders/components/pages/OrderCreate.vue +1 -1
  628. package/src/modules/orders/components/sections/ApplicationDetails.vue +1 -4
  629. package/src/modules/orders/components/sections/CustomerDetails.vue +1 -4
  630. package/src/modules/orders/controllers/orders.controller.js +113 -0
  631. package/src/modules/orders/middlewares/applications.verifier.js +13 -37
  632. package/src/modules/orders/middlewares/customers.verifier.js +44 -121
  633. package/src/modules/orders/models/customer.model.js +0 -1
  634. package/src/modules/orders/routes/applications.routes.js +108 -50
  635. package/src/modules/orders/routes/orders.routes.js +9 -1
  636. package/src/modules/organizations/components/blocks/CardOrganization.vue +12 -4
  637. package/src/modules/organizations/components/forms/DepartmentForm.vue +9 -4
  638. package/src/modules/organizations/components/pages/Members.vue +62 -1
  639. package/src/modules/organizations/components/pages/Organization.new.vue +17 -17
  640. package/src/modules/organizations/components/pages/Organization.vue +8 -1
  641. package/src/modules/organizations/components/pages/OrganizationBackoffice.vue +1 -1
  642. package/src/modules/organizations/components/pages/OrganizationEdit.vue +11 -4
  643. package/src/modules/organizations/components/pages/Organizations.vue +33 -46
  644. package/src/modules/organizations/controllers/invites.controller.js +19 -0
  645. package/src/modules/organizations/controllers/memberships.controller.js +1 -0
  646. package/src/modules/organizations/organizations.client.js +48 -7
  647. package/src/modules/organizations/router/organizations.backoffice.router.js +15 -0
  648. package/src/modules/organizations/router/organizations.router.js +72 -112
  649. package/src/modules/organizations/router/organizations.user.router.js +15 -0
  650. package/src/modules/pages/pages.client.js +1 -1
  651. package/src/modules/pages/views/router/pages.router.js +95 -15
  652. package/src/modules/products/components/blocks/CardPosition.vue +1 -1
  653. package/src/modules/products/components/pages/Products.vue +3 -3
  654. package/src/modules/rents/controllers/services/rents.services.js +1 -0
  655. package/src/modules/rents/rents.client.js +1 -1
  656. package/src/modules/rents/views/router/rents.router.js +93 -33
  657. package/src/modules/reports/reports.client.js +1 -1
  658. package/src/modules/wallet/wallet.client.js +1 -1
  659. package/src/styles/theme.scss +5 -3
  660. package/dist/engagement.schema-fh6W1fb_.js +0 -24
  661. package/dist/main-DQm5pwFO.js +0 -8213
  662. package/dist/martyrs/dist/main-DQm5pwFO.js +0 -1080
  663. package/dist/martyrs/dist/main-DQm5pwFO.js.map +0 -1
  664. package/dist/martyrs/dist/web-n_ivHO3v.js +0 -55
  665. package/dist/martyrs/dist/web-n_ivHO3v.js.map +0 -1
  666. package/dist/martyrs/src/components/Address/Address.vue.js.map +0 -1
  667. package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
  668. package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +0 -1
  669. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js.map +0 -1
  670. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
  671. package/dist/martyrs/src/components/Select/Select.vue2.js.map +0 -1
  672. package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +0 -1
  673. package/dist/martyrs/src/modules/community/community.router.js +0 -124
  674. package/dist/martyrs/src/modules/community/community.router.js.map +0 -1
  675. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +0 -1
  676. package/dist/martyrs/src/modules/icons/icons.router.js.map +0 -1
  677. package/dist/martyrs/src/modules/music/music.router.js.map +0 -1
  678. package/dist/martyrs/src/modules/notifications/notifications.router.js.map +0 -1
  679. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +0 -200
  680. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js.map +0 -1
  681. package/dist/martyrs/src/modules/organizations/organizations.router.js +0 -145
  682. package/dist/martyrs/src/modules/organizations/organizations.router.js.map +0 -1
  683. package/dist/martyrs/src/modules/pages/pages.router.js.map +0 -1
  684. package/dist/martyrs/src/modules/rents/rents.router.js.map +0 -1
  685. package/dist/martyrs/src/modules/reports/reports.router.js.map +0 -1
  686. package/dist/martyrs.css +0 -1
  687. package/dist/node_modules/.pnpm/@capacitor_device@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/device/dist/esm/index.js +0 -8
  688. package/dist/node_modules/.pnpm/@capacitor_device@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/device/dist/esm/index.js.map +0 -1
  689. package/dist/node_modules/.pnpm/@capacitor_device@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/device/dist/esm/web.js +0 -146
  690. package/dist/node_modules/.pnpm/@capacitor_device@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/device/dist/esm/web.js.map +0 -1
  691. package/dist/node_modules/.pnpm/@capacitor_keyboard@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/keyboard/dist/esm/definitions.js +0 -18
  692. package/dist/node_modules/.pnpm/@capacitor_keyboard@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/keyboard/dist/esm/definitions.js.map +0 -1
  693. package/dist/node_modules/.pnpm/@capacitor_keyboard@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/keyboard/dist/esm/index.js +0 -9
  694. package/dist/node_modules/.pnpm/@capacitor_keyboard@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/keyboard/dist/esm/index.js.map +0 -1
  695. package/dist/node_modules/.pnpm/@capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4/node_modules/@capacitor/push-notifications/dist/esm/index.js +0 -6
  696. package/dist/node_modules/.pnpm/@capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4/node_modules/@capacitor/push-notifications/dist/esm/index.js.map +0 -1
  697. package/src/jit/.claude/settings.local.json +0 -10
  698. package/src/modules/community/community.router.js +0 -107
  699. package/src/modules/governance/governance.router.js +0 -350
  700. package/src/modules/governance/seed-governance.js +0 -348
  701. package/src/modules/governance/views/components/pages/InitiativeMilestones.vue +0 -159
  702. package/src/modules/governance/views/router/goverance.router.js +0 -290
  703. package/src/modules/governance/views/store/votes.js +0 -113
  704. package/src/modules/icons/icons.router.js +0 -29
  705. package/src/modules/marketplace/marketplace.router.js +0 -66
  706. package/src/modules/music/.claude/settings.local.json +0 -8
  707. package/src/modules/music/music.router.js +0 -188
  708. package/src/modules/notifications/notifications.router.js +0 -47
  709. package/src/modules/orders/orders.router.js +0 -255
  710. package/src/modules/organizations/organizations.router.js +0 -123
  711. package/src/modules/organizations/router/backoffice.router.js +0 -27
  712. package/src/modules/organizations/router/departments.router.js +0 -15
  713. package/src/modules/organizations/router/members.router.js +0 -20
  714. package/src/modules/pages/pages.router.js +0 -107
  715. package/src/modules/rents/rents.router.js +0 -115
  716. package/src/modules/reports/reports.router.js +0 -33
  717. package/src/modules/wallet/wallet.router.js +0 -45
@@ -0,0 +1,20 @@
1
+ const communityUserRoutes = [
2
+ {
3
+ path: "",
4
+ name: "Posts",
5
+ meta: {
6
+ title: {
7
+ en: "Posts",
8
+ ru: "Посты"
9
+ }
10
+ },
11
+ component: () => import(
12
+ /* webpackChunkName: "profile-blogposts" */
13
+ "../../auth/views/components/pages/ProfileBlogposts.vue.js"
14
+ )
15
+ }
16
+ ];
17
+ export {
18
+ communityUserRoutes as default
19
+ };
20
+ //# sourceMappingURL=community.user.router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.user.router.js","sources":["../../../../../../src/modules/community/router/community.user.router.js"],"sourcesContent":["const communityUserRoutes = [\n {\n path: '',\n name: 'Posts',\n meta: {\n title: {\n en: 'Posts',\n ru: 'Посты',\n },\n },\n component: () => import(/* webpackChunkName: \"profile-blogposts\" */ '@martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue'),\n },\n];\n\nexport default communityUserRoutes;\n"],"names":[],"mappings":"AAAK,MAAC,sBAAsB;AAAA,EAC1B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,MACZ;AAAA,IACA;AAAA,IACI,WAAW,MAAM;AAAA;AAAA,MAAmD;AAAA,IAAuE;AAAA,EAC/I;AACA;"}
@@ -139,7 +139,7 @@ const _sfc_main = {
139
139
  const sanitizedContent = sanitizeHTML(editableDiv.value.innerHTML);
140
140
  currentContent.value = sanitizedContent;
141
141
  emit("update:modelValue", sanitizedContent);
142
- emit("addBlock", "Textarea", newBlockContent, props.index + 1);
142
+ emit("addBlock", "Textarea", newBlockContent, props.index);
143
143
  } else if (event.key === "Backspace" && editableDiv.value.innerHTML.trim() === "") {
144
144
  event.preventDefault();
145
145
  emit("deleteBlock", props.prop, { setCaretToEnd: true });
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.vue2.js","sources":["../../../../../../../src/modules/constructor/components/elements/Textarea.vue"],"sourcesContent":["<template>\n <div>\n <div \n ref=\"editableDiv\"\n :contenteditable=\"true\"\n @input=\"handleInput\"\n @paste=\"handlePaste\"\n @keydown=\"handleKeyDown\"\n tabindex=\"0\"\n class=\"editable-div mn-b-thin\"\n :class=\"{\n 't-main fw-semi': prop.type === 'Link',\n 'h3': prop.type === 'H2'\n }\"\n />\n <div v-if=\"isTextSelected\" class=\"formatting-bar\">\n <button @click=\"applyFormat('bold')\" title=\"Bold\"><b>B</b></button>\n <button @click=\"applyFormat('italic')\" title=\"Italic\"><i>I</i></button>\n <button @click=\"applyFormat('underline')\" title=\"Underline\"><u>U</u></button>\n <button @click=\"applyFormat('strikeThrough')\" title=\"Strikethrough\"><s>S</s></button>\n <button @click=\"createLink\" title=\"Insert Link\">🔗</button>\n <button @click=\"applyFormat('unlink')\" title=\"Remove Link\">⛓️‍💥</button>\n <button @click=\"applyFormat('justifyLeft')\" title=\"Align Left\">↲</button>\n <button @click=\"applyFormat('justifyCenter')\" title=\"Align Center\">↔</button>\n <button @click=\"applyFormat('justifyRight')\" title=\"Align Right\">↳</button>\n <button @click=\"applyFormat('insertUnorderedList')\" title=\"Bulleted List\">•</button>\n <button @click=\"applyFormat('insertOrderedList')\" title=\"Numbered List\">1.</button>\n <button @click=\"clearFormatting\" title=\"Clear Formatting\">🧹</button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, nextTick, onUpdated, onUnmounted, watch } from 'vue'\nimport DOMPurify from 'isomorphic-dompurify'\n\nconst sanitizeConfig = {\n ALLOWED_TAGS: ['b', 'i', 'u', 's', 'a', 'ul', 'ol', 'li', 'img', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'table', 'thead','tr','th'],\n ALLOWED_ATTR: ['href', 'target', 'src', 'alt'],\n ALLOWED_STYLES: ['text-align']\n}\n\nconst props = defineProps({\n modelValue: {\n type: String,\n default: ''\n },\n prop: {\n type: Object,\n required: true\n },\n component: Object,\n placeholder: String,\n index: Number,\n setFocus: Boolean\n})\n\nconst emit = defineEmits([\n 'update:modelValue', \n 'deleteBlock', \n 'updateBlock', \n 'addBlock'\n])\n\nconst editableDiv = ref(null)\nconst isTextSelected = ref(false)\nconst currentContent = ref('')\n\n// Обновляем содержимое при монтировании\nonMounted(() => {\n if (editableDiv.value) {\n if (props.modelValue) {\n editableDiv.value.innerHTML = props.modelValue\n currentContent.value = props.modelValue\n }\n }\n\n document.addEventListener('selectionchange', handleSelectionChange)\n \n if (props.setFocus) {\n nextTick(() => focus())\n }\n})\n\n// // Отслеживаем изменения в modelValue и обновляем DOM, если они есть\n// watch(() => props.modelValue, (newValue) => {\n// if (editableDiv.value && newValue !== currentContent.value) {\n// editableDiv.value.innerHTML = newValue || ''\n// currentContent.value = newValue\n// }\n// }, { immediate: true })\n\nconst handleInput = (event) => {\n const sanitizedContent = sanitizeHTML(event.target.innerHTML)\n currentContent.value = sanitizedContent\n emit('update:modelValue', sanitizedContent)\n}\n// Улучшенная функция для извлечения нужных элементов из DOM-структуры\nconst extractUsefulContent = (node) => {\n const result = [];\n \n // Функция для определения, содержит ли узел только один из нужных нам тегов\n const containsOnlySingleImportantTag = (node) => {\n const importantElements = node.querySelectorAll('p, h1, h2, h3, h4, h5, h6, img');\n \n // Если найден только один важный элемент и нет текста непосредственно в узле\n if (importantElements.length === 1 && !Array.from(node.childNodes).some(child => \n child.nodeType === Node.TEXT_NODE && child.textContent.trim()\n )) {\n // Убедимся, что этот элемент не содержит других важных элементов\n return !importantElements[0].querySelector('p, h1, h2, h3, h4, h5, h6, img');\n }\n \n return false;\n };\n \n // Рекурсивно просматривает дерево и извлекает только нужные элементы\n const processNode = (node) => {\n // Если это текстовый узел с непустым содержимым\n if (node.nodeType === Node.TEXT_NODE) {\n if (node.textContent.trim()) {\n // Создаем p-элемент для текста без родителя\n const p = document.createElement('p');\n p.textContent = node.textContent;\n result.push(p);\n }\n return;\n }\n \n // Если это не элемент, пропускаем\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n \n // Проверяем, что это один из нужных тегов\n const tagName = node.nodeName.toLowerCase();\n \n if (['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img'].includes(tagName)) {\n // Если это нужный тег - добавляем в результат\n result.push(node.cloneNode(true));\n } else if (containsOnlySingleImportantTag(node)) {\n // Если div содержит только один важный элемент, добавляем этот элемент\n const importantElement = node.querySelector('p, h1, h2, h3, h4, h5, h6, img');\n result.push(importantElement.cloneNode(true));\n } else {\n // Если это div или другой контейнер - проходим по его дочерним узлам\n Array.from(node.childNodes).forEach(child => {\n processNode(child);\n });\n }\n };\n \n processNode(node);\n return result;\n};\n\nconst handlePaste = (event) => {\n event.preventDefault();\n const clipboardData = event.clipboardData || window.clipboardData;\n let pastedData = clipboardData.getData('text/html') || clipboardData.getData('text/plain');\n \n console.log('Raw pasted data:', pastedData);\n \n // Предварительная очистка через функцию sanitizeHTML\n const sanitizedContent = sanitizeHTML(pastedData);\n \n console.log('Sanitized content:', sanitizedContent);\n \n // Парсим очищенный HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(sanitizedContent, 'text/html');\n \n // Извлекаем полезное содержимое\n const extractedElements = extractUsefulContent(doc.body);\n \n console.log('Extracted elements:', extractedElements.map(el => el.outerHTML));\n \n if (extractedElements.length > 0) {\n // Вставляем каждый элемент как отдельный блок\n extractedElements.forEach((element, idx) => {\n const tagName = element.nodeName.toLowerCase();\n \n // Определяем тип блока в зависимости от тега\n let blockType = 'Textarea';\n let blockContent = '';\n \n if (tagName === 'img') {\n blockType = 'ImageUpload';\n // Для изображений сохраняем только src атрибут\n blockContent = element.getAttribute('src');\n } else if (tagName.match(/h[1-6]/)) {\n blockType = 'H2'; // Используем H2 для всех заголовков, или можно настроить по-разному\n blockContent = element.innerHTML;\n } else {\n // Для p и других текстовых элементов\n blockContent = element.innerHTML;\n }\n \n if (idx === 0) {\n // Первый блок обновляем текущий\n document.execCommand('insertHTML', false, element.innerHTML);\n handleInput({ target: editableDiv.value });\n } else {\n // Остальные добавляем как новые блоки\n emit('addBlock', blockType, blockContent, props.index + idx);\n }\n });\n } else {\n // Если после очистки ничего не осталось, вставляем как обычный текст\n const plainText = clipboardData.getData('text/plain');\n if (plainText.trim()) {\n // document.execCommand('insertText', false, plainText);\n handleInput({ target: editableDiv.value });\n }\n }\n};\n\n\n// Обновленная функция для обработки вставки и создания блоков\nconst handleBlockCreation = (element, index) => {\n const tagName = element.nodeName.toLowerCase();\n \n let blockType = 'Textarea';\n let blockContent = '';\n \n if (tagName === 'img') {\n blockType = 'ImageUpload';\n blockContent = element.getAttribute('src');\n } else if (tagName.match(/h[1-6]/)) {\n blockType = tagName.toUpperCase(); // H2, H3, etc.\n blockContent = element.innerHTML;\n } else {\n blockContent = element.innerHTML;\n }\n \n if (index === 0) {\n // Первый блок обновляем текущий\n document.execCommand('insertHTML', false, element.outerHTML);\n handleInput({ target: editableDiv.value });\n } else {\n // Остальные добавляем как новые блоки\n emit('addBlock', blockType, blockContent, props.index + index);\n }\n};\n\nconst handleKeyDown = (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n const selection = window.getSelection()\n const range = selection.getRangeAt(0)\n const newBlockContent = extractContentAfterCursor(range)\n \n const sanitizedContent = sanitizeHTML(editableDiv.value.innerHTML)\n currentContent.value = sanitizedContent\n \n emit('update:modelValue', sanitizedContent)\n emit('addBlock', 'Textarea', newBlockContent, props.index + 1)\n } else if (event.key === 'Backspace' && editableDiv.value.innerHTML.trim() === \"\") {\n event.preventDefault()\n emit('deleteBlock', props.prop, { setCaretToEnd: true })\n }\n}\n\nconst extractContentAfterCursor = (range) => {\n const container = range.startContainer\n const cursorOffset = range.startOffset\n\n if (container.nodeType === Node.TEXT_NODE) {\n const textAfterCursor = container.textContent.slice(cursorOffset)\n container.textContent = container.textContent.slice(0, cursorOffset)\n return textAfterCursor\n } else if (container.nodeType === Node.ELEMENT_NODE) {\n const tempDiv = document.createElement('div')\n const childNodes = Array.from(container.childNodes)\n let foundCursor = false\n \n childNodes.forEach((node, index) => {\n if (index === cursorOffset) foundCursor = true\n if (foundCursor) tempDiv.appendChild(node.cloneNode(true))\n })\n \n while (container.childNodes[cursorOffset]) {\n container.removeChild(container.childNodes[cursorOffset])\n }\n \n return tempDiv.innerHTML\n }\n return ''\n}\n\nconst handleSelectionChange = () => {\n if (document.activeElement === editableDiv.value) {\n const selection = window.getSelection()\n isTextSelected.value = selection.rangeCount > 0 && selection.toString().length > 0\n } else {\n isTextSelected.value = false\n }\n}\n\nconst focus = (options = {}) => {\n nextTick(() => {\n editableDiv.value.focus()\n \n const shouldSetCaretToEnd = options.setCaretToEnd || (props.prop && props.prop.setCaretToEnd)\n if (props.setFocus === true && !shouldSetCaretToEnd) {\n const range = document.createRange()\n range.setStart(editableDiv.value, 0)\n range.collapse(true)\n const selection = window.getSelection()\n selection.removeAllRanges()\n selection.addRange(range)\n } else {\n setCaretToEnd(editableDiv.value)\n }\n \n emit('updateBlock', props.prop, { setFocus: false, setCaretToEnd: false })\n })\n}\n\nconst sanitizeHTML = (html) => {\n return DOMPurify.sanitize(html, sanitizeConfig)\n}\n\nconst setCaretToEnd = (element) => {\n const range = document.createRange()\n const selection = window.getSelection()\n range.selectNodeContents(element)\n range.collapse(false)\n selection.removeAllRanges()\n selection.addRange(range)\n}\n\nconst applyFormat = (format) => {\n document.execCommand(format, false, null)\n handleInput({ target: editableDiv.value })\n}\n\nconst createLink = () => {\n const url = prompt('Enter the URL:')\n if (url) {\n document.execCommand('createLink', false, url)\n handleInput({ target: editableDiv.value })\n }\n}\n\nconst clearFormatting = () => {\n const selection = window.getSelection()\n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0)\n const selectedContent = range.cloneContents()\n const div = document.createElement('div')\n div.appendChild(selectedContent)\n const plainText = div.innerText\n document.execCommand('insertText', false, plainText)\n handleInput({ target: editableDiv.value })\n }\n}\n\nonUpdated(() => {\n if (props.setFocus) {\n nextTick(() => focus())\n }\n})\n\nonUnmounted(() => {\n document.removeEventListener('selectionchange', handleSelectionChange)\n})\n</script>\n\n<style lang=\"scss\">\n.editable-div {\n width: 100%;\n min-height: 1rem;\n background-color: transparent;\n outline: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n \n &:empty::before {\n content: attr(placeholder);\n color: #999;\n }\n \n &:focus {\n border: 0;\n }\n}\n\n.formatting-bar {\n display: flex;\n gap: 5px;\n margin-top: 5px;\n padding: 5px;\n background-color: #f5f5f5;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n \n button {\n padding: 4px 8px;\n background-color: white;\n border: 1px solid #ddd;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n min-width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: #e0e0e0;\n }\n \n &:active {\n background-color: #d0d0d0;\n }\n }\n}\n</style>"],"names":["node"],"mappings":"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"}
1
+ {"version":3,"file":"Textarea.vue2.js","sources":["../../../../../../../src/modules/constructor/components/elements/Textarea.vue"],"sourcesContent":["<template>\n <div>\n <div \n ref=\"editableDiv\"\n :contenteditable=\"true\"\n @input=\"handleInput\"\n @paste=\"handlePaste\"\n @keydown=\"handleKeyDown\"\n tabindex=\"0\"\n class=\"editable-div mn-b-thin\"\n :class=\"{\n 't-main fw-semi': prop.type === 'Link',\n 'h3': prop.type === 'H2'\n }\"\n />\n <div v-if=\"isTextSelected\" class=\"formatting-bar\">\n <button @click=\"applyFormat('bold')\" title=\"Bold\"><b>B</b></button>\n <button @click=\"applyFormat('italic')\" title=\"Italic\"><i>I</i></button>\n <button @click=\"applyFormat('underline')\" title=\"Underline\"><u>U</u></button>\n <button @click=\"applyFormat('strikeThrough')\" title=\"Strikethrough\"><s>S</s></button>\n <button @click=\"createLink\" title=\"Insert Link\">🔗</button>\n <button @click=\"applyFormat('unlink')\" title=\"Remove Link\">⛓️‍💥</button>\n <button @click=\"applyFormat('justifyLeft')\" title=\"Align Left\">↲</button>\n <button @click=\"applyFormat('justifyCenter')\" title=\"Align Center\">↔</button>\n <button @click=\"applyFormat('justifyRight')\" title=\"Align Right\">↳</button>\n <button @click=\"applyFormat('insertUnorderedList')\" title=\"Bulleted List\">•</button>\n <button @click=\"applyFormat('insertOrderedList')\" title=\"Numbered List\">1.</button>\n <button @click=\"clearFormatting\" title=\"Clear Formatting\">🧹</button>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, nextTick, onUpdated, onUnmounted, watch } from 'vue'\nimport DOMPurify from 'isomorphic-dompurify'\n\nconst sanitizeConfig = {\n ALLOWED_TAGS: ['b', 'i', 'u', 's', 'a', 'ul', 'ol', 'li', 'img', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'table', 'thead','tr','th'],\n ALLOWED_ATTR: ['href', 'target', 'src', 'alt'],\n ALLOWED_STYLES: ['text-align']\n}\n\nconst props = defineProps({\n modelValue: {\n type: String,\n default: ''\n },\n prop: {\n type: Object,\n required: true\n },\n component: Object,\n placeholder: String,\n index: Number,\n setFocus: Boolean\n})\n\nconst emit = defineEmits([\n 'update:modelValue', \n 'deleteBlock', \n 'updateBlock', \n 'addBlock'\n])\n\nconst editableDiv = ref(null)\nconst isTextSelected = ref(false)\nconst currentContent = ref('')\n\n// Обновляем содержимое при монтировании\nonMounted(() => {\n if (editableDiv.value) {\n if (props.modelValue) {\n editableDiv.value.innerHTML = props.modelValue\n currentContent.value = props.modelValue\n }\n }\n\n document.addEventListener('selectionchange', handleSelectionChange)\n \n if (props.setFocus) {\n nextTick(() => focus())\n }\n})\n\n// // Отслеживаем изменения в modelValue и обновляем DOM, если они есть\n// watch(() => props.modelValue, (newValue) => {\n// if (editableDiv.value && newValue !== currentContent.value) {\n// editableDiv.value.innerHTML = newValue || ''\n// currentContent.value = newValue\n// }\n// }, { immediate: true })\n\nconst handleInput = (event) => {\n const sanitizedContent = sanitizeHTML(event.target.innerHTML)\n currentContent.value = sanitizedContent\n emit('update:modelValue', sanitizedContent)\n}\n// Улучшенная функция для извлечения нужных элементов из DOM-структуры\nconst extractUsefulContent = (node) => {\n const result = [];\n \n // Функция для определения, содержит ли узел только один из нужных нам тегов\n const containsOnlySingleImportantTag = (node) => {\n const importantElements = node.querySelectorAll('p, h1, h2, h3, h4, h5, h6, img');\n \n // Если найден только один важный элемент и нет текста непосредственно в узле\n if (importantElements.length === 1 && !Array.from(node.childNodes).some(child => \n child.nodeType === Node.TEXT_NODE && child.textContent.trim()\n )) {\n // Убедимся, что этот элемент не содержит других важных элементов\n return !importantElements[0].querySelector('p, h1, h2, h3, h4, h5, h6, img');\n }\n \n return false;\n };\n \n // Рекурсивно просматривает дерево и извлекает только нужные элементы\n const processNode = (node) => {\n // Если это текстовый узел с непустым содержимым\n if (node.nodeType === Node.TEXT_NODE) {\n if (node.textContent.trim()) {\n // Создаем p-элемент для текста без родителя\n const p = document.createElement('p');\n p.textContent = node.textContent;\n result.push(p);\n }\n return;\n }\n \n // Если это не элемент, пропускаем\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n \n // Проверяем, что это один из нужных тегов\n const tagName = node.nodeName.toLowerCase();\n \n if (['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img'].includes(tagName)) {\n // Если это нужный тег - добавляем в результат\n result.push(node.cloneNode(true));\n } else if (containsOnlySingleImportantTag(node)) {\n // Если div содержит только один важный элемент, добавляем этот элемент\n const importantElement = node.querySelector('p, h1, h2, h3, h4, h5, h6, img');\n result.push(importantElement.cloneNode(true));\n } else {\n // Если это div или другой контейнер - проходим по его дочерним узлам\n Array.from(node.childNodes).forEach(child => {\n processNode(child);\n });\n }\n };\n \n processNode(node);\n return result;\n};\n\nconst handlePaste = (event) => {\n event.preventDefault();\n const clipboardData = event.clipboardData || window.clipboardData;\n let pastedData = clipboardData.getData('text/html') || clipboardData.getData('text/plain');\n \n console.log('Raw pasted data:', pastedData);\n \n // Предварительная очистка через функцию sanitizeHTML\n const sanitizedContent = sanitizeHTML(pastedData);\n \n console.log('Sanitized content:', sanitizedContent);\n \n // Парсим очищенный HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(sanitizedContent, 'text/html');\n \n // Извлекаем полезное содержимое\n const extractedElements = extractUsefulContent(doc.body);\n \n console.log('Extracted elements:', extractedElements.map(el => el.outerHTML));\n \n if (extractedElements.length > 0) {\n // Вставляем каждый элемент как отдельный блок\n extractedElements.forEach((element, idx) => {\n const tagName = element.nodeName.toLowerCase();\n \n // Определяем тип блока в зависимости от тега\n let blockType = 'Textarea';\n let blockContent = '';\n \n if (tagName === 'img') {\n blockType = 'ImageUpload';\n // Для изображений сохраняем только src атрибут\n blockContent = element.getAttribute('src');\n } else if (tagName.match(/h[1-6]/)) {\n blockType = 'H2'; // Используем H2 для всех заголовков, или можно настроить по-разному\n blockContent = element.innerHTML;\n } else {\n // Для p и других текстовых элементов\n blockContent = element.innerHTML;\n }\n \n if (idx === 0) {\n // Первый блок обновляем текущий\n document.execCommand('insertHTML', false, element.innerHTML);\n handleInput({ target: editableDiv.value });\n } else {\n // Остальные добавляем как новые блоки\n emit('addBlock', blockType, blockContent, props.index + idx);\n }\n });\n } else {\n // Если после очистки ничего не осталось, вставляем как обычный текст\n const plainText = clipboardData.getData('text/plain');\n if (plainText.trim()) {\n // document.execCommand('insertText', false, plainText);\n handleInput({ target: editableDiv.value });\n }\n }\n};\n\n\n// Обновленная функция для обработки вставки и создания блоков\nconst handleBlockCreation = (element, index) => {\n const tagName = element.nodeName.toLowerCase();\n \n let blockType = 'Textarea';\n let blockContent = '';\n \n if (tagName === 'img') {\n blockType = 'ImageUpload';\n blockContent = element.getAttribute('src');\n } else if (tagName.match(/h[1-6]/)) {\n blockType = tagName.toUpperCase(); // H2, H3, etc.\n blockContent = element.innerHTML;\n } else {\n blockContent = element.innerHTML;\n }\n \n if (index === 0) {\n // Первый блок обновляем текущий\n document.execCommand('insertHTML', false, element.outerHTML);\n handleInput({ target: editableDiv.value });\n } else {\n // Остальные добавляем как новые блоки\n emit('addBlock', blockType, blockContent, props.index + index);\n }\n};\n\nconst handleKeyDown = (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n const selection = window.getSelection()\n const range = selection.getRangeAt(0)\n const newBlockContent = extractContentAfterCursor(range)\n \n const sanitizedContent = sanitizeHTML(editableDiv.value.innerHTML)\n currentContent.value = sanitizedContent\n \n emit('update:modelValue', sanitizedContent)\n emit('addBlock', 'Textarea', newBlockContent, props.index)\n } else if (event.key === 'Backspace' && editableDiv.value.innerHTML.trim() === \"\") {\n event.preventDefault()\n emit('deleteBlock', props.prop, { setCaretToEnd: true })\n }\n}\n\nconst extractContentAfterCursor = (range) => {\n const container = range.startContainer\n const cursorOffset = range.startOffset\n\n if (container.nodeType === Node.TEXT_NODE) {\n const textAfterCursor = container.textContent.slice(cursorOffset)\n container.textContent = container.textContent.slice(0, cursorOffset)\n return textAfterCursor\n } else if (container.nodeType === Node.ELEMENT_NODE) {\n const tempDiv = document.createElement('div')\n const childNodes = Array.from(container.childNodes)\n let foundCursor = false\n \n childNodes.forEach((node, index) => {\n if (index === cursorOffset) foundCursor = true\n if (foundCursor) tempDiv.appendChild(node.cloneNode(true))\n })\n \n while (container.childNodes[cursorOffset]) {\n container.removeChild(container.childNodes[cursorOffset])\n }\n \n return tempDiv.innerHTML\n }\n return ''\n}\n\nconst handleSelectionChange = () => {\n if (document.activeElement === editableDiv.value) {\n const selection = window.getSelection()\n isTextSelected.value = selection.rangeCount > 0 && selection.toString().length > 0\n } else {\n isTextSelected.value = false\n }\n}\n\nconst focus = (options = {}) => {\n nextTick(() => {\n editableDiv.value.focus()\n \n const shouldSetCaretToEnd = options.setCaretToEnd || (props.prop && props.prop.setCaretToEnd)\n if (props.setFocus === true && !shouldSetCaretToEnd) {\n const range = document.createRange()\n range.setStart(editableDiv.value, 0)\n range.collapse(true)\n const selection = window.getSelection()\n selection.removeAllRanges()\n selection.addRange(range)\n } else {\n setCaretToEnd(editableDiv.value)\n }\n \n emit('updateBlock', props.prop, { setFocus: false, setCaretToEnd: false })\n })\n}\n\nconst sanitizeHTML = (html) => {\n return DOMPurify.sanitize(html, sanitizeConfig)\n}\n\nconst setCaretToEnd = (element) => {\n const range = document.createRange()\n const selection = window.getSelection()\n range.selectNodeContents(element)\n range.collapse(false)\n selection.removeAllRanges()\n selection.addRange(range)\n}\n\nconst applyFormat = (format) => {\n document.execCommand(format, false, null)\n handleInput({ target: editableDiv.value })\n}\n\nconst createLink = () => {\n const url = prompt('Enter the URL:')\n if (url) {\n document.execCommand('createLink', false, url)\n handleInput({ target: editableDiv.value })\n }\n}\n\nconst clearFormatting = () => {\n const selection = window.getSelection()\n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0)\n const selectedContent = range.cloneContents()\n const div = document.createElement('div')\n div.appendChild(selectedContent)\n const plainText = div.innerText\n document.execCommand('insertText', false, plainText)\n handleInput({ target: editableDiv.value })\n }\n}\n\nonUpdated(() => {\n if (props.setFocus) {\n nextTick(() => focus())\n }\n})\n\nonUnmounted(() => {\n document.removeEventListener('selectionchange', handleSelectionChange)\n})\n</script>\n\n<style lang=\"scss\">\n.editable-div {\n width: 100%;\n min-height: 1rem;\n background-color: transparent;\n outline: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n \n &:empty::before {\n content: attr(placeholder);\n color: #999;\n }\n \n &:focus {\n border: 0;\n }\n}\n\n.formatting-bar {\n display: flex;\n gap: 5px;\n margin-top: 5px;\n padding: 5px;\n background-color: #f5f5f5;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n \n button {\n padding: 4px 8px;\n background-color: white;\n border: 1px solid #ddd;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n min-width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &:hover {\n background-color: #e0e0e0;\n }\n \n &:active {\n background-color: #d0d0d0;\n }\n }\n}\n</style>"],"names":["node"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,UAAM,iBAAiB;AAAA,MACrB,cAAc,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS,SAAQ,MAAK,IAAI;AAAA,MACpI,cAAc,CAAC,QAAQ,UAAU,OAAO,KAAK;AAAA,MAC7C,gBAAgB,CAAC,YAAY;AAAA,IAC/B;AAEA,UAAM,QAAQ;AAed,UAAM,OAAO;AAOb,UAAM,cAAc,IAAI,IAAI;AAC5B,UAAM,iBAAiB,IAAI,KAAK;AAChC,UAAM,iBAAiB,IAAI,EAAE;AAG7B,cAAU,MAAM;AACd,UAAI,YAAY,OAAO;AACrB,YAAI,MAAM,YAAY;AACpB,sBAAY,MAAM,YAAY,MAAM;AACpC,yBAAe,QAAQ,MAAM;AAAA,QAC/B;AAAA,MACF;AAEA,eAAS,iBAAiB,mBAAmB,qBAAqB;AAElE,UAAI,MAAM,UAAU;AAClB,iBAAS,MAAM,MAAK,CAAE;AAAA,MACxB;AAAA,IACF,CAAC;AAUD,UAAM,cAAc,CAAC,UAAU;AAC7B,YAAM,mBAAmB,aAAa,MAAM,OAAO,SAAS;AAC5D,qBAAe,QAAQ;AACvB,WAAK,qBAAqB,gBAAgB;AAAA,IAC5C;AAEA,UAAM,uBAAuB,CAAC,SAAS;AACrC,YAAM,SAAS,CAAA;AAGf,YAAM,iCAAiC,CAACA,UAAS;AAC/C,cAAM,oBAAoBA,MAAK,iBAAiB,gCAAgC;AAGhF,YAAI,kBAAkB,WAAW,KAAK,CAAC,MAAM,KAAKA,MAAK,UAAU,EAAE;AAAA,UAAK,WACtE,MAAM,aAAa,KAAK,aAAa,MAAM,YAAY,KAAI;AAAA,QACjE,GAAO;AAED,iBAAO,CAAC,kBAAkB,CAAC,EAAE,cAAc,gCAAgC;AAAA,QAC7E;AAEA,eAAO;AAAA,MACT;AAGA,YAAM,cAAc,CAACA,UAAS;AAE5B,YAAIA,MAAK,aAAa,KAAK,WAAW;AACpC,cAAIA,MAAK,YAAY,QAAQ;AAE3B,kBAAM,IAAI,SAAS,cAAc,GAAG;AACpC,cAAE,cAAcA,MAAK;AACrB,mBAAO,KAAK,CAAC;AAAA,UACf;AACA;AAAA,QACF;AAGA,YAAIA,MAAK,aAAa,KAAK,aAAc;AAGzC,cAAM,UAAUA,MAAK,SAAS,YAAW;AAEzC,YAAI,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,OAAO,GAAG;AAEtE,iBAAO,KAAKA,MAAK,UAAU,IAAI,CAAC;AAAA,QAClC,WAAW,+BAA+BA,KAAI,GAAG;AAE/C,gBAAM,mBAAmBA,MAAK,cAAc,gCAAgC;AAC5E,iBAAO,KAAK,iBAAiB,UAAU,IAAI,CAAC;AAAA,QAC9C,OAAO;AAEL,gBAAM,KAAKA,MAAK,UAAU,EAAE,QAAQ,WAAS;AAC3C,wBAAY,KAAK;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,kBAAY,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAC,UAAU;AAC7B,YAAM,eAAc;AACpB,YAAM,gBAAgB,MAAM,iBAAiB,OAAO;AACpD,UAAI,aAAa,cAAc,QAAQ,WAAW,KAAK,cAAc,QAAQ,YAAY;AAEzF,cAAQ,IAAI,oBAAoB,UAAU;AAG1C,YAAM,mBAAmB,aAAa,UAAU;AAEhD,cAAQ,IAAI,sBAAsB,gBAAgB;AAGlD,YAAM,SAAS,IAAI,UAAS;AAC5B,YAAM,MAAM,OAAO,gBAAgB,kBAAkB,WAAW;AAGhE,YAAM,oBAAoB,qBAAqB,IAAI,IAAI;AAEvD,cAAQ,IAAI,uBAAuB,kBAAkB,IAAI,QAAM,GAAG,SAAS,CAAC;AAE5E,UAAI,kBAAkB,SAAS,GAAG;AAEhC,0BAAkB,QAAQ,CAAC,SAAS,QAAQ;AAC1C,gBAAM,UAAU,QAAQ,SAAS,YAAW;AAG5C,cAAI,YAAY;AAChB,cAAI,eAAe;AAEnB,cAAI,YAAY,OAAO;AACrB,wBAAY;AAEZ,2BAAe,QAAQ,aAAa,KAAK;AAAA,UAC3C,WAAW,QAAQ,MAAM,QAAQ,GAAG;AAClC,wBAAY;AACZ,2BAAe,QAAQ;AAAA,UACzB,OAAO;AAEL,2BAAe,QAAQ;AAAA,UACzB;AAEA,cAAI,QAAQ,GAAG;AAEb,qBAAS,YAAY,cAAc,OAAO,QAAQ,SAAS;AAC3D,wBAAY,EAAE,QAAQ,YAAY,MAAK,CAAE;AAAA,UAC3C,OAAO;AAEL,iBAAK,YAAY,WAAW,cAAc,MAAM,QAAQ,GAAG;AAAA,UAC7D;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,cAAM,YAAY,cAAc,QAAQ,YAAY;AACpD,YAAI,UAAU,QAAQ;AAEpB,sBAAY,EAAE,QAAQ,YAAY,MAAK,CAAE;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AA8BA,UAAM,gBAAgB,CAAC,UAAU;AAC/B,UAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,UAAU;AAC5C,cAAM,eAAc;AACpB,cAAM,YAAY,OAAO,aAAY;AACrC,cAAM,QAAQ,UAAU,WAAW,CAAC;AACpC,cAAM,kBAAkB,0BAA0B,KAAK;AAEvD,cAAM,mBAAmB,aAAa,YAAY,MAAM,SAAS;AACjE,uBAAe,QAAQ;AAEvB,aAAK,qBAAqB,gBAAgB;AAC1C,aAAK,YAAY,YAAY,iBAAiB,MAAM,KAAK;AAAA,MAC3D,WAAW,MAAM,QAAQ,eAAe,YAAY,MAAM,UAAU,KAAI,MAAO,IAAI;AACjF,cAAM,eAAc;AACpB,aAAK,eAAe,MAAM,MAAM,EAAE,eAAe,KAAI,CAAE;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,4BAA4B,CAAC,UAAU;AAC3C,YAAM,YAAY,MAAM;AACxB,YAAM,eAAe,MAAM;AAE3B,UAAI,UAAU,aAAa,KAAK,WAAW;AACzC,cAAM,kBAAkB,UAAU,YAAY,MAAM,YAAY;AAChE,kBAAU,cAAc,UAAU,YAAY,MAAM,GAAG,YAAY;AACnE,eAAO;AAAA,MACT,WAAW,UAAU,aAAa,KAAK,cAAc;AACnD,cAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAM,aAAa,MAAM,KAAK,UAAU,UAAU;AAClD,YAAI,cAAc;AAElB,mBAAW,QAAQ,CAAC,MAAM,UAAU;AAClC,cAAI,UAAU,aAAc,eAAc;AAC1C,cAAI,YAAa,SAAQ,YAAY,KAAK,UAAU,IAAI,CAAC;AAAA,QAC3D,CAAC;AAED,eAAO,UAAU,WAAW,YAAY,GAAG;AACzC,oBAAU,YAAY,UAAU,WAAW,YAAY,CAAC;AAAA,QAC1D;AAEA,eAAO,QAAQ;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,wBAAwB,MAAM;AAClC,UAAI,SAAS,kBAAkB,YAAY,OAAO;AAChD,cAAM,YAAY,OAAO,aAAY;AACrC,uBAAe,QAAQ,UAAU,aAAa,KAAK,UAAU,SAAQ,EAAG,SAAS;AAAA,MACnF,OAAO;AACL,uBAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,UAAU,OAAO;AAC9B,eAAS,MAAM;AACb,oBAAY,MAAM,MAAK;AAEvB,cAAM,sBAAsB,QAAQ,iBAAkB,MAAM,QAAQ,MAAM,KAAK;AAC/E,YAAI,MAAM,aAAa,QAAQ,CAAC,qBAAqB;AACnD,gBAAM,QAAQ,SAAS,YAAW;AAClC,gBAAM,SAAS,YAAY,OAAO,CAAC;AACnC,gBAAM,SAAS,IAAI;AACnB,gBAAM,YAAY,OAAO,aAAY;AACrC,oBAAU,gBAAe;AACzB,oBAAU,SAAS,KAAK;AAAA,QAC1B,OAAO;AACL,wBAAc,YAAY,KAAK;AAAA,QACjC;AAEA,aAAK,eAAe,MAAM,MAAM,EAAE,UAAU,OAAO,eAAe,MAAK,CAAE;AAAA,MAC3E,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,CAAC,SAAS;AAC7B,aAAO,UAAU,SAAS,MAAM,cAAc;AAAA,IAChD;AAEA,UAAM,gBAAgB,CAAC,YAAY;AACjC,YAAM,QAAQ,SAAS,YAAW;AAClC,YAAM,YAAY,OAAO,aAAY;AACrC,YAAM,mBAAmB,OAAO;AAChC,YAAM,SAAS,KAAK;AACpB,gBAAU,gBAAe;AACzB,gBAAU,SAAS,KAAK;AAAA,IAC1B;AAEA,UAAM,cAAc,CAAC,WAAW;AAC9B,eAAS,YAAY,QAAQ,OAAO,IAAI;AACxC,kBAAY,EAAE,QAAQ,YAAY,MAAK,CAAE;AAAA,IAC3C;AAEA,UAAM,aAAa,MAAM;AACvB,YAAM,MAAM,OAAO,gBAAgB;AACnC,UAAI,KAAK;AACP,iBAAS,YAAY,cAAc,OAAO,GAAG;AAC7C,oBAAY,EAAE,QAAQ,YAAY,MAAK,CAAE;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,YAAM,YAAY,OAAO,aAAY;AACrC,UAAI,UAAU,aAAa,GAAG;AAC5B,cAAM,QAAQ,UAAU,WAAW,CAAC;AACpC,cAAM,kBAAkB,MAAM,cAAa;AAC3C,cAAM,MAAM,SAAS,cAAc,KAAK;AACxC,YAAI,YAAY,eAAe;AAC/B,cAAM,YAAY,IAAI;AACtB,iBAAS,YAAY,cAAc,OAAO,SAAS;AACnD,oBAAY,EAAE,QAAQ,YAAY,MAAK,CAAE;AAAA,MAC3C;AAAA,IACF;AAEA,cAAU,MAAM;AACd,UAAI,MAAM,UAAU;AAClB,iBAAS,MAAM,MAAK,CAAE;AAAA,MACxB;AAAA,IACF,CAAC;AAED,gBAAY,MAAM;AAChB,eAAS,oBAAoB,mBAAmB,qBAAqB;AAAA,IACvE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Constructor.vue.js","sources":["../../../../../../../src/modules/constructor/components/sections/Constructor.vue"],"sourcesContent":["<template>\n <!-- Content -->\n <section>\n <Draggable \n :list=\"post.content\" \n @update:list=\"updateContent\" \n @start=\"handleDragStart\" \n @end=\"handleDragEnd\" \n disabledClass=\"no-drag\"\n >\n <div\n v-for=\"(block, index) in post.content\"\n :key=\"block.id\" \n :data-index=\"index\"\n draggable=\"true\"\n class=\"draggable-item pos-relative\"\n >\n <div \n @mouseover=\"showControls = index, showMenu = false\"\n class=\"pos-relative w-full h-full\"\n >\n <component\n v-model=\"block.content\"\n :is=\"ComponentMap[block.type]\"\n :index=\"index\"\n :component=\"block\"\n :prop=\"block\"\n :placeholder=\"block.placeholder\"\n :class=\"block.class\"\n :setFocus=\"block.setFocus\"\n @deleteBlock=\"handleDeleteBlock\"\n @addBlock=\"handleAddBlock\"\n @updateBlock=\"handleUpdateBlock\"\n />\n </div>\n\n <transition name=\"fade\">\n <div \n v-if=\"showControls === index\" \n class=\"pos-absolute z-index-4 i-medium\" \n style=\"right: calc(100% + 0.5rem); top: calc(50% - 1.125rem);\"\n >\n <button \n @click=\"showMenu = !showMenu\" \n class=\"mn-b-small cursor-pointer w-100 i-medium bg-white radius-thin\"\n >\n {{ block.content ? '⋯' : '+' }}\n </button>\n \n <div \n v-if=\"showMenu\" \n class=\"z-index-5 radius-thin pd-thin bg-white w-max mn-b-small flex-nowrap flex-column flex\"\n >\n <span \n v-if=\"index !== 0\"\n @click=\"handleDeleteBlock(block)\" \n class=\"mn-b-thin w-max t-red bg-white button-small button\"\n >\n Remove\n </span>\n <span \n @click=\"handleAddBlock('ImageUpload', '', index)\" \n class=\"mn-b-thin w-max t-black bg-white button-small button\"\n >\n Add Image\n </span>\n <span \n @click=\"handleAddBlock('H2', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Title\n </span>\n <span \n @click=\"handleAddBlock('Card', { photo: '', title: '', subtitle: '', }, index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Card\n </span>\n <span \n @click=\"handleAddBlock('Embed', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Embed\n </span>\n <span \n @click=\"handleAddBlock('Audio', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Audio\n </span>\n <span \n @click=\"handleAddBlock('Video', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Video\n </span>\n </div>\n </div>\n </transition>\n </div>\n </Draggable>\n </section>\n</template>\n\n\n<script setup>\nimport Textarea from '../elements/Textarea.vue';\nimport ImageUpload from '../elements/ImageUpload.vue';\nimport Embed from '../elements/Embed.vue';\nimport Card from '../elements/Card.vue';\nimport Audio from '../elements/Audio.vue';\nimport Video from '../elements/Video.vue';\n\nimport Draggable from '@martyrs/src/components/Draggable/Draggable.vue';\n\nimport { ref, onMounted, watchEffect, computed } from 'vue';\nimport { v4 as uuidv4 } from 'uuid'\n\nconst props = defineProps({\n content: {\n type: Array\n },\n notitle: {\n type: Boolean\n },\n autoFocus: {\n type: Boolean,\n default: true\n }\n});\n\nconst emits = defineEmits(['update'])\n\nlet publics = ref(null);\nlet post = ref(null); \n\nconst showControls = ref(null)\nconst showMenu = ref(false)\n\nconst ComponentMap = {\n 'Textarea': Textarea,\n 'H2': Textarea,\n 'Card': Card,\n 'ImageUpload': ImageUpload,\n 'Embed': Embed,\n 'Audio': Audio,\n 'Video': Video,\n};\n\npost.value = { content: props.content }; \n\nonMounted(() => {\n if (post.value && post.value.content.length === 0) {\n handleAddBlock('Textarea', '', 0, null, 'h2', 'Enter title', uuidv4(), props.autoFocus);\n }\n})\n\nconst updateContent = (newContent) => {\n post.value.content = newContent;\n};\n\nconst handleDragStart = (startIndex) => {\n console.log('Drag started from index:', startIndex);\n};\n\nconst handleDragEnd = (startIndex, endIndex) => {\n console.log('Drag ended. Start index:', startIndex, 'End index:', endIndex);\n};\n\nfunction handleAddBlock(type = 'Textarea', content = '', index, data, classBlock = '', placeholder = '', id = uuidv4(), setFocus = true) {\n let blockNew = {\n id: id,\n type: type,\n style: '',\n class: classBlock,\n placeholder: placeholder,\n content: content,\n blocks: [],\n setFocus: setFocus,\n };\n\n if (index !== undefined) {\n post.value.content.splice(index + 1, 0, blockNew);\n } else {\n post.value.content.push(blockNew);\n }\n\n showControls.value = null\n emits('update', post.value.content);\n}\n\nfunction handleUpdateBlock(block, update) {\n const index = post.value.content.findIndex(item => item === block);\n\n if (index !== -1) {\n post.value.content[index] = { ...post.value.content[index], ...update };\n }\n emits('update', post.value.content);\n}\n\nfunction handleDeleteBlock(blockToDelete, options = {}) {\n const index = post.value.content.findIndex(block => block.id === blockToDelete.id)\n\n if (index !== -1 && index !== 0) {\n post.value.content.splice(index, 1)\n \n if (index > 0) {\n const previousBlock = post.value.content[index - 1]\n previousBlock.setFocus = true\n previousBlock.setCaretToEnd = true\n }\n }\n \n emits('update', post.value.content)\n}\n</script>\n\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["Textarea","Card","ImageUpload","Embed","Audio","Video","uuidv4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsHA,UAAM,QAAQ;AAad,UAAM,QAAQ;AAEA,QAAI,IAAI;AACtB,QAAI,OAAO,IAAI,IAAI;AAEnB,UAAM,eAAe,IAAI,IAAI;AAC7B,UAAM,WAAW,IAAI,KAAK;AAE1B,UAAM,eAAe;AAAA,MACnB,YAAYA;AAAAA,MACZ,MAAMA;AAAAA,MACN,QAAQC;AAAAA,MACR,eAAeC;AAAAA,MACf,SAASC;AAAAA,MACT,SAASC;AAAAA,MACT,SAASC;AAAAA,IACX;AAEA,SAAK,QAAQ,EAAE,SAAS,MAAM,QAAO;AAErC,cAAU,MAAM;AACd,UAAI,KAAK,SAAS,KAAK,MAAM,QAAQ,WAAW,GAAG;AACjD,uBAAe,YAAY,IAAI,GAAG,MAAM,MAAM,eAAeC,GAAM,GAAI,MAAM,SAAS;AAAA,MACxF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,CAAC,eAAe;AACpC,WAAK,MAAM,UAAU;AAAA,IACvB;AAEA,UAAM,kBAAkB,CAAC,eAAe;AACtC,cAAQ,IAAI,4BAA4B,UAAU;AAAA,IACpD;AAEA,UAAM,gBAAgB,CAAC,YAAY,aAAa;AAC9C,cAAQ,IAAI,4BAA4B,YAAY,cAAc,QAAQ;AAAA,IAC5E;AAEA,aAAS,eAAe,OAAO,YAAY,UAAU,IAAI,OAAO,MAAM,aAAa,IAAI,cAAc,IAAI,KAAKA,GAAM,GAAI,WAAW,MAAM;AACvI,UAAI,WAAW;AAAA,QACb;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ,CAAA;AAAA,QACR;AAAA,MACJ;AAEE,UAAI,UAAU,QAAW;AACvB,aAAK,MAAM,QAAQ,OAAO,QAAQ,GAAG,GAAG,QAAQ;AAAA,MAClD,OAAO;AACL,aAAK,MAAM,QAAQ,KAAK,QAAQ;AAAA,MAClC;AAEA,mBAAa,QAAQ;AACrB,YAAM,UAAU,KAAK,MAAM,OAAO;AAAA,IACpC;AAEA,aAAS,kBAAkB,OAAO,QAAQ;AACxC,YAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU,UAAQ,SAAS,KAAK;AAEjE,UAAI,UAAU,IAAI;AAChB,aAAK,MAAM,QAAQ,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG,GAAG,OAAM;AAAA,MACvE;AACA,YAAM,UAAU,KAAK,MAAM,OAAO;AAAA,IACpC;AAEA,aAAS,kBAAkB,eAAe,UAAU,IAAI;AACtD,YAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU,WAAS,MAAM,OAAO,cAAc,EAAE;AAEjF,UAAI,UAAU,MAAM,UAAU,GAAG;AAC/B,aAAK,MAAM,QAAQ,OAAO,OAAO,CAAC;AAElC,YAAI,QAAQ,GAAG;AACb,gBAAM,gBAAgB,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAClD,wBAAc,WAAW;AACzB,wBAAc,gBAAgB;AAAA,QAChC;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,MAAM,OAAO;AAAA,IACpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Constructor.vue.js","sources":["../../../../../../../src/modules/constructor/components/sections/Constructor.vue"],"sourcesContent":["<template>\n <!-- Content -->\n <section>\n <Draggable \n :list=\"post.content\" \n @update:list=\"updateContent\" \n @start=\"handleDragStart\" \n @end=\"handleDragEnd\" \n disabledClass=\"no-drag\"\n >\n <div\n v-for=\"(block, index) in post.content\"\n :key=\"block.id\" \n :data-index=\"index\"\n draggable=\"true\"\n class=\"draggable-item pos-relative\"\n >\n <div \n @mouseover=\"showControls = index, showMenu = false\"\n class=\"pos-relative w-full h-full\"\n >\n <component\n v-model=\"block.content\"\n :is=\"ComponentMap[block.type]\"\n :index=\"index\"\n :component=\"block\"\n :prop=\"block\"\n :placeholder=\"block.placeholder\"\n :class=\"block.class\"\n :setFocus=\"block.setFocus\"\n @deleteBlock=\"handleDeleteBlock\"\n @addBlock=\"handleAddBlock\"\n @updateBlock=\"handleUpdateBlock\"\n />\n </div>\n\n <transition name=\"fade\">\n <div \n v-if=\"showControls === index\" \n class=\"pos-absolute z-index-4 i-medium\" \n style=\"right: calc(100% + 0.5rem); top: calc(50% - 1.125rem);\"\n >\n <button \n @click=\"showMenu = !showMenu\" \n class=\"mn-b-small cursor-pointer w-100 i-medium bg-white radius-thin\"\n >\n {{ block.content ? '⋯' : '+' }}\n </button>\n \n <div \n v-if=\"showMenu\" \n class=\"z-index-5 radius-thin pd-thin bg-white w-max mn-b-small flex-nowrap flex-column flex\"\n >\n <span \n v-if=\"index !== 0\"\n @click=\"handleDeleteBlock(block)\" \n class=\"mn-b-thin w-max t-red bg-white button-small button\"\n >\n Remove\n </span>\n <span \n @click=\"handleAddBlock('ImageUpload', '', index)\"\n class=\"mn-b-thin w-max t-black bg-white button-small button\"\n >\n Add Image\n </span>\n <span \n @click=\"handleAddBlock('H2', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Title\n </span>\n <span \n @click=\"handleAddBlock('Card', { photo: '', title: '', subtitle: '', }, index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Card\n </span>\n <span \n @click=\"handleAddBlock('Embed', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Embed\n </span>\n <span \n @click=\"handleAddBlock('Audio', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Audio\n </span>\n <span \n @click=\"handleAddBlock('Video', '', index)\"\n class=\"w-max button-small t-black bg-white button\"\n >\n Add Video\n </span>\n </div>\n </div>\n </transition>\n </div>\n </Draggable>\n </section>\n</template>\n\n\n<script setup>\nimport Textarea from '../elements/Textarea.vue';\nimport ImageUpload from '../elements/ImageUpload.vue';\nimport Embed from '../elements/Embed.vue';\nimport Card from '../elements/Card.vue';\nimport Audio from '../elements/Audio.vue';\nimport Video from '../elements/Video.vue';\n\nimport Draggable from '@martyrs/src/components/Draggable/Draggable.vue';\n\nimport { ref, onMounted, watchEffect, computed } from 'vue';\nimport { v4 as uuidv4 } from 'uuid'\n\nconst props = defineProps({\n content: {\n type: Array\n },\n notitle: {\n type: Boolean\n },\n autoFocus: {\n type: Boolean,\n default: true\n }\n});\n\nconst emits = defineEmits(['update'])\n\nlet publics = ref(null);\nlet post = ref(null); \n\nconst showControls = ref(null)\nconst showMenu = ref(false)\n\nconst ComponentMap = {\n 'Textarea': Textarea,\n 'H2': Textarea,\n 'Card': Card,\n 'ImageUpload': ImageUpload,\n 'Embed': Embed,\n 'Audio': Audio,\n 'Video': Video,\n};\n\npost.value = { content: props.content }; \n\nonMounted(() => {\n if (post.value && post.value.content.length === 0) {\n handleAddBlock('Textarea', '', 0, null, 'h2', 'Enter title', uuidv4(), props.autoFocus);\n }\n})\n\nconst updateContent = (newContent) => {\n post.value.content = newContent;\n};\n\nconst handleDragStart = (startIndex) => {\n console.log('Drag started from index:', startIndex);\n};\n\nconst handleDragEnd = (startIndex, endIndex) => {\n console.log('Drag ended. Start index:', startIndex, 'End index:', endIndex);\n};\n\nfunction handleAddBlock(type = 'Textarea', content = '', index, data, classBlock = '', placeholder = '', id = uuidv4(), setFocus = true) {\n let blockNew = {\n id: id,\n type: type,\n style: '',\n class: classBlock,\n placeholder: placeholder,\n content: content,\n blocks: [],\n setFocus: setFocus,\n };\n\n if (index !== undefined) {\n post.value.content.splice(index + 1, 0, blockNew);\n } else {\n post.value.content.push(blockNew);\n }\n\n showControls.value = null\n emits('update', post.value.content);\n}\n\nfunction handleUpdateBlock(block, update) {\n const index = post.value.content.findIndex(item => item === block);\n\n if (index !== -1) {\n post.value.content[index] = { ...post.value.content[index], ...update };\n }\n emits('update', post.value.content);\n}\n\nfunction handleDeleteBlock(blockToDelete, options = {}) {\n const index = post.value.content.findIndex(block => block.id === blockToDelete.id)\n\n if (index !== -1 && index !== 0) {\n post.value.content.splice(index, 1)\n \n if (index > 0) {\n const previousBlock = post.value.content[index - 1]\n previousBlock.setFocus = true\n previousBlock.setCaretToEnd = true\n }\n }\n \n emits('update', post.value.content)\n}\n</script>\n\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["Textarea","Card","ImageUpload","Embed","Audio","Video","uuidv4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsHA,UAAM,QAAQ;AAad,UAAM,QAAQ;AAEA,QAAI,IAAI;AACtB,QAAI,OAAO,IAAI,IAAI;AAEnB,UAAM,eAAe,IAAI,IAAI;AAC7B,UAAM,WAAW,IAAI,KAAK;AAE1B,UAAM,eAAe;AAAA,MACnB,YAAYA;AAAAA,MACZ,MAAMA;AAAAA,MACN,QAAQC;AAAAA,MACR,eAAeC;AAAAA,MACf,SAASC;AAAAA,MACT,SAASC;AAAAA,MACT,SAASC;AAAAA,IACX;AAEA,SAAK,QAAQ,EAAE,SAAS,MAAM,QAAO;AAErC,cAAU,MAAM;AACd,UAAI,KAAK,SAAS,KAAK,MAAM,QAAQ,WAAW,GAAG;AACjD,uBAAe,YAAY,IAAI,GAAG,MAAM,MAAM,eAAeC,GAAM,GAAI,MAAM,SAAS;AAAA,MACxF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,CAAC,eAAe;AACpC,WAAK,MAAM,UAAU;AAAA,IACvB;AAEA,UAAM,kBAAkB,CAAC,eAAe;AACtC,cAAQ,IAAI,4BAA4B,UAAU;AAAA,IACpD;AAEA,UAAM,gBAAgB,CAAC,YAAY,aAAa;AAC9C,cAAQ,IAAI,4BAA4B,YAAY,cAAc,QAAQ;AAAA,IAC5E;AAEA,aAAS,eAAe,OAAO,YAAY,UAAU,IAAI,OAAO,MAAM,aAAa,IAAI,cAAc,IAAI,KAAKA,GAAM,GAAI,WAAW,MAAM;AACvI,UAAI,WAAW;AAAA,QACb;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ,CAAA;AAAA,QACR;AAAA,MACJ;AAEE,UAAI,UAAU,QAAW;AACvB,aAAK,MAAM,QAAQ,OAAO,QAAQ,GAAG,GAAG,QAAQ;AAAA,MAClD,OAAO;AACL,aAAK,MAAM,QAAQ,KAAK,QAAQ;AAAA,MAClC;AAEA,mBAAa,QAAQ;AACrB,YAAM,UAAU,KAAK,MAAM,OAAO;AAAA,IACpC;AAEA,aAAS,kBAAkB,OAAO,QAAQ;AACxC,YAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU,UAAQ,SAAS,KAAK;AAEjE,UAAI,UAAU,IAAI;AAChB,aAAK,MAAM,QAAQ,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG,GAAG,OAAM;AAAA,MACvE;AACA,YAAM,UAAU,KAAK,MAAM,OAAO;AAAA,IACpC;AAEA,aAAS,kBAAkB,eAAe,UAAU,IAAI;AACtD,YAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU,WAAS,MAAM,OAAO,cAAc,EAAE;AAEjF,UAAI,UAAU,MAAM,UAAU,GAAG;AAC/B,aAAK,MAAM,QAAQ,OAAO,OAAO,CAAC;AAElC,YAAI,QAAQ,GAAG;AACb,gBAAM,gBAAgB,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAClD,wBAAc,WAAW;AACzB,wBAAc,gBAAgB;AAAA,QAChC;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,MAAM,OAAO;AAAA,IACpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -104,7 +104,7 @@ function createUniversalApp({
104
104
  performance.measure("loading-18", "loading-18-start", "loading-18-end");
105
105
  const measure18 = performance.getEntriesByName("loading-18")[0];
106
106
  console.log(`[LOADING 18] Modules loaded for route in ${measure18?.duration?.toFixed(2)}ms`);
107
- return { path: target.fullPath, replace: true };
107
+ return { path: target.fullPath };
108
108
  }
109
109
  });
110
110
  }
@@ -132,7 +132,8 @@ function createUniversalApp({
132
132
  console.log(`[LOADING 17] Core module initialized in ${measure17?.duration?.toFixed(2)}ms`);
133
133
  const useWebsocket = config.globals?.websocket !== false;
134
134
  if (useWebsocket && typeof window !== "undefined") {
135
- requestIdleCallback(() => {
135
+ const _ric = typeof requestIdleCallback !== "undefined" ? requestIdleCallback : (cb) => setTimeout(cb, 1);
136
+ _ric(() => {
136
137
  wsManager.initialize({
137
138
  wsUrl: process.env.WSS_URL || void 0,
138
139
  maxReconnectAttempts: 5,
@@ -142,7 +143,8 @@ function createUniversalApp({
142
143
  });
143
144
  }
144
145
  if (typeof window !== "undefined") {
145
- requestIdleCallback(() => {
146
+ const _ric2 = typeof requestIdleCallback !== "undefined" ? requestIdleCallback : (cb) => setTimeout(cb, 1);
147
+ _ric2(() => {
146
148
  moduleManager.preloadModules(context);
147
149
  });
148
150
  }
@@ -1 +1 @@
1
- {"version":3,"file":"core.app.js","sources":["../../../../../../../src/modules/core/views/classes/core.app.js"],"sourcesContent":["// client-factory.js - фабрика для создания клиентского приложения\nimport { nextTick, createApp as createVueApp, createSSRApp as createVueSSRApp } from 'vue';\nimport { createHead } from '@unhead/vue';\n\nexport function createUniversalApp({\n getConfig,\n getRouter,\n getLocales,\n getStore,\n getHooks = {}\n}) {\n // Lazy imports to avoid circular dependencies\n const getLayoutApp = () => import('../components/layouts/App.vue').then(m => m.default);\n const getModuleRegistry = () => import('./module.manager.js').then(m => m.moduleManager);\n const getWebsockets = () => import('./ws.manager.js').then(m => m.default);\n const getAppRenderer = () => import('../utils/vue-app-renderer.js');\n \n // Асинхронная инициализация для избежания циклических зависимостей\n async function initializeApp() {\n // [LOADING 14] Starting initializeApp\n performance.mark('loading-14-start');\n console.log('[LOADING 14] Starting application initialization...');\n\n // Создаем конфигурацию\n const config = await getConfig();\n const hooks = getHooks;\n\n // [LOADING 15] Loading core dependencies\n performance.mark('loading-15-start');\n console.log('[LOADING 15] Loading core dependencies via Promise.all...');\n\n const [layoutApp, moduleManager, wsManager, appRenderer] = await Promise.all([\n getLayoutApp(),\n getModuleRegistry(),\n getWebsockets(),\n getAppRenderer()\n ]);\n\n performance.mark('loading-15-end');\n performance.measure('loading-15', 'loading-15-start', 'loading-15-end');\n const measure15 = performance.getEntriesByName('loading-15')[0];\n console.log(`[LOADING 15] Core dependencies loaded in ${measure15?.duration?.toFixed(2)}ms`);\n \n // Core module is always loaded - no need to register in moduleManager\n\n // [LOADING 16] Registering modules in registry\n performance.mark('loading-16-start');\n console.log('[LOADING 16] Registering modules in registry...');\n\n // Регистрация модулей из config\n Object.entries(config.modules).forEach(([name, module]) => {\n if (module.loader) {\n moduleManager.register(name, {\n loader: module.loader,\n routes: module.routes || [],\n priority: module.priority || 'normal',\n critical: module.critical || false,\n dependencies: module.dependencies || [],\n preload: module.preload || false\n });\n }\n });\n\n performance.mark('loading-16-end');\n performance.measure('loading-16', 'loading-16-start', 'loading-16-end');\n const measure16 = performance.getEntriesByName('loading-16')[0];\n console.log(`[LOADING 16] Modules registered in ${measure16?.duration?.toFixed(2)}ms`);\n \n // Основная функция создания приложения\n function createApp() {\n const store = getStore();\n const app = process.env.MOBILE_APP \n ? createVueApp(layoutApp, config) \n : createVueSSRApp(layoutApp, config);\n \n const meta = createHead();\n const i18n = getLocales();\n \n const context = {\n app,\n store,\n router: null,\n config,\n };\n \n // Создаем роутер с контекстом\n const router = getRouter(context);\n context.router = router;\n\n // Регистрируем заглушки для роутов, которые требуют другие модули\n // Когда Organizations/Backoffice/Auth загрузятся, они заменят эти заглушки\n const stubComponent = { template: '<router-view />' };\n\n router.addRoute('Home', {\n path: 'backoffice',\n name: 'Backoffice Root',\n children: [],\n component: stubComponent,\n meta: {\n sidebar_width_hidden: 'w-0',\n }\n });\n\n router.addRoute('Home', {\n path: 'organizations/:_id',\n name: 'OrganizationRoot',\n children: [],\n component: stubComponent\n });\n\n router.addRoute('Home', {\n path: 'users/:_id',\n name: 'User Profile Root',\n children: [],\n component: stubComponent\n });\n \n // No critical modules - everything loads on demand\n \n // Router guard для загрузки модулей ДО навигации (только на клиенте)\n if (typeof window !== 'undefined') {\n router.beforeEach(async (to, from) => {\n // Получаем оригинальный путь ДО fallback редиректа на 404\n // Это критически важно для SSR гидратации вложенных роутов!\n const target = to.redirectedFrom || to;\n \n // Используем оригинальный путь для определения нужных модулей\n const requiredModules = moduleManager.getModulesForRoute(target.path);\n \n // Проверяем, какие модули еще не загружены\n const modulesToLoad = requiredModules.filter(m => !moduleManager.initialized.has(m.name));\n \n if (modulesToLoad.length > 0) {\n // Логируем если это редирект с 404 (для отладки)\n if (to.redirectedFrom) {\n console.log('[Router] Loading modules for redirected path:', target.path, 'modules:', modulesToLoad.map(m => m.name));\n }\n\n // [LOADING 18] Loading modules for route\n performance.mark('loading-18-start');\n console.log(`[LOADING 18] Loading ${modulesToLoad.length} modules for route...`);\n\n // Загружаем и инициализируем модули\n for (const module of modulesToLoad) {\n try {\n await moduleManager.load(module.name, context);\n await moduleManager.initialize(module.name, context);\n } catch (error) {\n console.error(`Failed to load module ${module.name}:`, error);\n }\n }\n\n performance.mark('loading-18-end');\n performance.measure('loading-18', 'loading-18-start', 'loading-18-end');\n const measure18 = performance.getEntriesByName('loading-18')[0];\n console.log(`[LOADING 18] Modules loaded for route in ${measure18?.duration?.toFixed(2)}ms`);\n\n // После загрузки модулей и регистрации их роутов,\n // возвращаем объект с оригинальным путем и replace: true\n // Это заставит роутер заново резолвить маршрут с новыми роутами\n return { path: target.fullPath, replace: true };\n }\n });\n }\n\n router.beforeResolve(async (to, from) => {\n store.core.state.loading = false;\n })\n \n // Error handler для lazy loaded chunks\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (e) => {\n if (e.message && e.message.includes('Loading chunk')) {\n console.error('Chunk loading failed:', e);\n // Можно показать уведомление пользователю\n // или попытаться перезагрузить\n }\n });\n }\n \n // Инициализация в правильном порядке\n const initialize = async () => {\n // Хук ДО инициализации\n if (hooks.beforeInitialize) {\n await hooks.beforeInitialize(context);\n }\n // [LOADING 17] Initializing Core module\n performance.mark('loading-17-start');\n console.log('[LOADING 17] Initializing Core module...');\n\n // Core module must ALWAYS be initialized\n const ModuleCore = await import('../../core.client.js');\n await ModuleCore.default.initialize(app, store, router, config);\n\n performance.mark('loading-17-end');\n performance.measure('loading-17', 'loading-17-start', 'loading-17-end');\n const measure17 = performance.getEntriesByName('loading-17')[0];\n console.log(`[LOADING 17] Core module initialized in ${measure17?.duration?.toFixed(2)}ms`);\n\n // 2. WebSocket (отложим после гидратации, только если включен)\n const useWebsocket = config.globals?.websocket !== false; // по умолчанию false\n\n if (useWebsocket && typeof window !== 'undefined') {\n // Откладываем инициализацию WebSocket после гидратации\n requestIdleCallback(() => {\n wsManager.initialize({\n wsUrl: process.env.WSS_URL || undefined,\n maxReconnectAttempts: 5,\n reconnectDelay: 3000,\n pingInterval: 30000,\n });\n });\n }\n\n // 3. Предзагрузка важных модулей в фоне\n if (typeof window !== 'undefined') {\n requestIdleCallback(() => {\n moduleManager.preloadModules(context);\n });\n }\n \n // 5. Подключаем Vue плагины\n app.use(router).use(i18n).use(meta);\n \n // 6. Монтируем приложение\n if (process.env.MOBILE_APP) {\n app.mount('#app');\n }\n\n // Хук ПОСЛЕ инициализации\n if (hooks.afterInitialize) {\n await hooks.afterInitialize(context);\n }\n\n // [LOADING 19] Application initialization completed\n performance.mark('loading-19-end');\n performance.measure('loading-19', 'loading-14-start', 'loading-19-end');\n const measure19 = performance.getEntriesByName('loading-19')[0];\n console.log(`[LOADING 19] Application initialization completed in ${measure19?.duration?.toFixed(2)}ms`);\n\n return {\n app,\n router,\n store,\n i18n,\n meta,\n moduleManager,\n config,\n };\n };\n \n // Возвращаем промис для SSR\n if (!process.env.MOBILE_APP) {\n return initialize();\n }\n \n // Для SPA инициализируем сразу\n initialize();\n }\n \n // FOR SSR / SERVER ENTRY\n async function renderApp({ url, cookies, headers, languages, ssrContext }) {\n const { app, router, store, i18n, meta, moduleManager } = await createApp();\n\n // Set SSR store for useStore calls\n if (typeof window === 'undefined') {\n const { setSSRStore } = await import('../store/core.store.js');\n await setSSRStore(store);\n }\n\n\n const context = {\n app,\n store,\n router,\n config,\n ssr: true,\n };\n\n // [LOADING 20] SSR renderApp starting and loading modules\n performance.mark('loading-20-start');\n console.log('[SSR-404] renderApp starting, url:', url);\n\n // Для SSR загружаем модули для текущего маршрута\n const requiredModules = moduleManager.getModulesForRoute(url);\n console.log('[SSR-404] required modules:', requiredModules.map(m => m.name));\n\n // Собираем имена модулей которые нужны для текущего роута\n const currentRouteModules = [];\n\n // Загружаем необходимые модули для SSR\n for (const module of requiredModules) {\n await moduleManager.load(module.name, context);\n await moduleManager.initialize(module.name, context);\n currentRouteModules.push(module.name);\n }\n\n performance.mark('loading-20-end');\n performance.measure('loading-20', 'loading-20-start', 'loading-20-end');\n const measure20 = performance.getEntriesByName('loading-20')[0];\n console.log(`[LOADING 20] SSR modules loaded in ${measure20?.duration?.toFixed(2)}ms`);\n \n // После загрузки модулей и регистрации роутов, выполняем навигацию\n console.log('[SSR-404] modules loaded, pushing url:', url);\n console.log('[SSR-404] available routes:', router.getRoutes().map(r => r.path));\n await router.push(url);\n await router.isReady();\n console.log('[SSR-404] router ready, currentRoute:', router.currentRoute.value.name, router.currentRoute.value.path);\n \n const result = await appRenderer.render({\n url,\n cookies,\n headers,\n createApp: () => ({ app, router, store, i18n, meta }),\n ssrContext\n });\n \n if (ssrContext?.modules) {\n result.usedModules = Array.from(ssrContext.modules);\n }\n \n // Передаем только модули текущего роута (без критических)\n result.loadedModules = currentRouteModules;\n\n // [LOADING 21] SSR render completed\n performance.mark('loading-21-end');\n performance.measure('loading-21', 'loading-20-start', 'loading-21-end');\n const measure21 = performance.getEntriesByName('loading-21')[0];\n console.log(`[LOADING 21] SSR render completed in ${measure21?.duration?.toFixed(2)}ms`);\n\n // Clean up for next SSR request\n if (typeof window === 'undefined') {\n moduleManager.initialized.clear();\n moduleManager.modules.clear();\n moduleManager.loadingPromises.clear();\n\n const { clearSSRStore } = await import('../store/core.store.js');\n await clearSSRStore();\n }\n\n return result;\n }\n \n // FOR SPA\n if (typeof window !== 'undefined' && process.env.MOBILE_APP) {\n createApp();\n }\n \n // FOR SSR / CLIENT ENTRY\n if (typeof window !== 'undefined' && !process.env.MOBILE_APP) {\n // Используем renderAndMountApp для правильной гидратации со state\n appRenderer.renderAndMountApp({ createApp, hooks }).then(({ app, router, store, moduleManager }) => {\n // Хук ПОСЛЕ гидратации\n if (hooks.afterHydration) {\n hooks.afterHydration({ app, router, store, moduleManager });\n }\n \n // Модули уже загружены в renderAndMountApp, просто ставим маркер\n if (typeof window !== 'undefined') {\n window.performance.mark('client-ready');\n }\n }).catch(error => {\n console.error('Hydration failed:', error);\n });\n }\n \n return { createApp, renderApp };\n }\n \n // Возвращаем промис, который резолвится с функциями\n return initializeApp();\n}"],"names":["createApp","createVueApp","createVueSSRApp","moduleManager"],"mappings":"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"}
1
+ {"version":3,"file":"core.app.js","sources":["../../../../../../../src/modules/core/views/classes/core.app.js"],"sourcesContent":["// client-factory.js - фабрика для создания клиентского приложения\nimport { nextTick, createApp as createVueApp, createSSRApp as createVueSSRApp } from 'vue';\nimport { createHead } from '@unhead/vue';\n\nexport function createUniversalApp({\n getConfig,\n getRouter,\n getLocales,\n getStore,\n getHooks = {}\n}) {\n // Lazy imports to avoid circular dependencies\n const getLayoutApp = () => import('../components/layouts/App.vue').then(m => m.default);\n const getModuleRegistry = () => import('./module.manager.js').then(m => m.moduleManager);\n const getWebsockets = () => import('./ws.manager.js').then(m => m.default);\n const getAppRenderer = () => import('../utils/vue-app-renderer.js');\n \n // Асинхронная инициализация для избежания циклических зависимостей\n async function initializeApp() {\n // [LOADING 14] Starting initializeApp\n performance.mark('loading-14-start');\n console.log('[LOADING 14] Starting application initialization...');\n\n // Создаем конфигурацию\n const config = await getConfig();\n const hooks = getHooks;\n\n // [LOADING 15] Loading core dependencies\n performance.mark('loading-15-start');\n console.log('[LOADING 15] Loading core dependencies via Promise.all...');\n\n const [layoutApp, moduleManager, wsManager, appRenderer] = await Promise.all([\n getLayoutApp(),\n getModuleRegistry(),\n getWebsockets(),\n getAppRenderer()\n ]);\n\n performance.mark('loading-15-end');\n performance.measure('loading-15', 'loading-15-start', 'loading-15-end');\n const measure15 = performance.getEntriesByName('loading-15')[0];\n console.log(`[LOADING 15] Core dependencies loaded in ${measure15?.duration?.toFixed(2)}ms`);\n \n // Core module is always loaded - no need to register in moduleManager\n\n // [LOADING 16] Registering modules in registry\n performance.mark('loading-16-start');\n console.log('[LOADING 16] Registering modules in registry...');\n\n // Регистрация модулей из config\n Object.entries(config.modules).forEach(([name, module]) => {\n if (module.loader) {\n moduleManager.register(name, {\n loader: module.loader,\n routes: module.routes || [],\n priority: module.priority || 'normal',\n critical: module.critical || false,\n dependencies: module.dependencies || [],\n preload: module.preload || false\n });\n }\n });\n\n performance.mark('loading-16-end');\n performance.measure('loading-16', 'loading-16-start', 'loading-16-end');\n const measure16 = performance.getEntriesByName('loading-16')[0];\n console.log(`[LOADING 16] Modules registered in ${measure16?.duration?.toFixed(2)}ms`);\n \n // Основная функция создания приложения\n function createApp() {\n const store = getStore();\n const app = process.env.MOBILE_APP \n ? createVueApp(layoutApp, config) \n : createVueSSRApp(layoutApp, config);\n \n const meta = createHead();\n const i18n = getLocales();\n \n const context = {\n app,\n store,\n router: null,\n config,\n };\n \n // Создаем роутер с контекстом\n const router = getRouter(context);\n context.router = router;\n\n // Регистрируем заглушки для роутов, которые требуют другие модули\n // Когда Organizations/Backoffice/Auth загрузятся, они заменят эти заглушки\n const stubComponent = { template: '<router-view />' };\n\n router.addRoute('Home', {\n path: 'backoffice',\n name: 'Backoffice Root',\n children: [],\n component: stubComponent,\n meta: {\n sidebar_width_hidden: 'w-0',\n }\n });\n\n router.addRoute('Home', {\n path: 'organizations/:_id',\n name: 'OrganizationRoot',\n children: [],\n component: stubComponent\n });\n\n router.addRoute('Home', {\n path: 'users/:_id',\n name: 'User Profile Root',\n children: [],\n component: stubComponent\n });\n \n // No critical modules - everything loads on demand\n \n // Router guard для загрузки модулей ДО навигации (только на клиенте)\n if (typeof window !== 'undefined') {\n router.beforeEach(async (to, from) => {\n // Получаем оригинальный путь ДО fallback редиректа на 404\n // Это критически важно для SSR гидратации вложенных роутов!\n const target = to.redirectedFrom || to;\n \n // Используем оригинальный путь для определения нужных модулей\n const requiredModules = moduleManager.getModulesForRoute(target.path);\n \n // Проверяем, какие модули еще не загружены\n const modulesToLoad = requiredModules.filter(m => !moduleManager.initialized.has(m.name));\n \n if (modulesToLoad.length > 0) {\n // Логируем если это редирект с 404 (для отладки)\n if (to.redirectedFrom) {\n console.log('[Router] Loading modules for redirected path:', target.path, 'modules:', modulesToLoad.map(m => m.name));\n }\n\n // [LOADING 18] Loading modules for route\n performance.mark('loading-18-start');\n console.log(`[LOADING 18] Loading ${modulesToLoad.length} modules for route...`);\n\n // Загружаем и инициализируем модули\n for (const module of modulesToLoad) {\n try {\n await moduleManager.load(module.name, context);\n await moduleManager.initialize(module.name, context);\n } catch (error) {\n console.error(`Failed to load module ${module.name}:`, error);\n }\n }\n\n performance.mark('loading-18-end');\n performance.measure('loading-18', 'loading-18-start', 'loading-18-end');\n const measure18 = performance.getEntriesByName('loading-18')[0];\n console.log(`[LOADING 18] Modules loaded for route in ${measure18?.duration?.toFixed(2)}ms`);\n\n // После загрузки модулей и регистрации их роутов,\n // возвращаем объект с оригинальным путем\n // Это заставит роутер заново резолвить маршрут с новыми роутами\n return { path: target.fullPath };\n }\n });\n }\n\n router.beforeResolve(async (to, from) => {\n store.core.state.loading = false;\n })\n \n // Error handler для lazy loaded chunks\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (e) => {\n if (e.message && e.message.includes('Loading chunk')) {\n console.error('Chunk loading failed:', e);\n // Можно показать уведомление пользователю\n // или попытаться перезагрузить\n }\n });\n }\n \n // Инициализация в правильном порядке\n const initialize = async () => {\n // Хук ДО инициализации\n if (hooks.beforeInitialize) {\n await hooks.beforeInitialize(context);\n }\n // [LOADING 17] Initializing Core module\n performance.mark('loading-17-start');\n console.log('[LOADING 17] Initializing Core module...');\n\n // Core module must ALWAYS be initialized\n const ModuleCore = await import('../../core.client.js');\n await ModuleCore.default.initialize(app, store, router, config);\n\n performance.mark('loading-17-end');\n performance.measure('loading-17', 'loading-17-start', 'loading-17-end');\n const measure17 = performance.getEntriesByName('loading-17')[0];\n console.log(`[LOADING 17] Core module initialized in ${measure17?.duration?.toFixed(2)}ms`);\n\n // 2. WebSocket (отложим после гидратации, только если включен)\n const useWebsocket = config.globals?.websocket !== false; // по умолчанию false\n\n if (useWebsocket && typeof window !== 'undefined') {\n // Откладываем инициализацию WebSocket после гидратации\n const _ric = typeof requestIdleCallback !== 'undefined' ? requestIdleCallback : (cb) => setTimeout(cb, 1);\n _ric(() => {\n wsManager.initialize({\n wsUrl: process.env.WSS_URL || undefined,\n maxReconnectAttempts: 5,\n reconnectDelay: 3000,\n pingInterval: 30000,\n });\n });\n }\n\n // 3. Предзагрузка важных модулей в фоне\n if (typeof window !== 'undefined') {\n const _ric2 = typeof requestIdleCallback !== 'undefined' ? requestIdleCallback : (cb) => setTimeout(cb, 1);\n _ric2(() => {\n moduleManager.preloadModules(context);\n });\n }\n \n // 5. Подключаем Vue плагины\n app.use(router).use(i18n).use(meta);\n \n // 6. Монтируем приложение\n if (process.env.MOBILE_APP) {\n app.mount('#app');\n }\n\n // Хук ПОСЛЕ инициализации\n if (hooks.afterInitialize) {\n await hooks.afterInitialize(context);\n }\n\n // [LOADING 19] Application initialization completed\n performance.mark('loading-19-end');\n performance.measure('loading-19', 'loading-14-start', 'loading-19-end');\n const measure19 = performance.getEntriesByName('loading-19')[0];\n console.log(`[LOADING 19] Application initialization completed in ${measure19?.duration?.toFixed(2)}ms`);\n\n return {\n app,\n router,\n store,\n i18n,\n meta,\n moduleManager,\n config,\n };\n };\n \n // Возвращаем промис для SSR\n if (!process.env.MOBILE_APP) {\n return initialize();\n }\n \n // Для SPA инициализируем сразу\n initialize();\n }\n \n // FOR SSR / SERVER ENTRY\n async function renderApp({ url, cookies, headers, languages, ssrContext }) {\n const { app, router, store, i18n, meta, moduleManager } = await createApp();\n\n // Set SSR store for useStore calls\n if (typeof window === 'undefined') {\n const { setSSRStore } = await import('../store/core.store.js');\n await setSSRStore(store);\n }\n\n\n const context = {\n app,\n store,\n router,\n config,\n ssr: true,\n };\n\n // [LOADING 20] SSR renderApp starting and loading modules\n performance.mark('loading-20-start');\n console.log('[SSR-404] renderApp starting, url:', url);\n\n // Для SSR загружаем модули для текущего маршрута\n const requiredModules = moduleManager.getModulesForRoute(url);\n console.log('[SSR-404] required modules:', requiredModules.map(m => m.name));\n\n // Собираем имена модулей которые нужны для текущего роута\n const currentRouteModules = [];\n\n // Загружаем необходимые модули для SSR\n for (const module of requiredModules) {\n await moduleManager.load(module.name, context);\n await moduleManager.initialize(module.name, context);\n currentRouteModules.push(module.name);\n }\n\n performance.mark('loading-20-end');\n performance.measure('loading-20', 'loading-20-start', 'loading-20-end');\n const measure20 = performance.getEntriesByName('loading-20')[0];\n console.log(`[LOADING 20] SSR modules loaded in ${measure20?.duration?.toFixed(2)}ms`);\n \n // После загрузки модулей и регистрации роутов, выполняем навигацию\n console.log('[SSR-404] modules loaded, pushing url:', url);\n console.log('[SSR-404] available routes:', router.getRoutes().map(r => r.path));\n await router.push(url);\n await router.isReady();\n console.log('[SSR-404] router ready, currentRoute:', router.currentRoute.value.name, router.currentRoute.value.path);\n \n const result = await appRenderer.render({\n url,\n cookies,\n headers,\n createApp: () => ({ app, router, store, i18n, meta }),\n ssrContext\n });\n \n if (ssrContext?.modules) {\n result.usedModules = Array.from(ssrContext.modules);\n }\n \n // Передаем только модули текущего роута (без критических)\n result.loadedModules = currentRouteModules;\n\n // [LOADING 21] SSR render completed\n performance.mark('loading-21-end');\n performance.measure('loading-21', 'loading-20-start', 'loading-21-end');\n const measure21 = performance.getEntriesByName('loading-21')[0];\n console.log(`[LOADING 21] SSR render completed in ${measure21?.duration?.toFixed(2)}ms`);\n\n // Clean up for next SSR request\n if (typeof window === 'undefined') {\n moduleManager.initialized.clear();\n moduleManager.modules.clear();\n moduleManager.loadingPromises.clear();\n\n const { clearSSRStore } = await import('../store/core.store.js');\n await clearSSRStore();\n }\n\n return result;\n }\n \n // FOR SPA\n if (typeof window !== 'undefined' && process.env.MOBILE_APP) {\n createApp();\n }\n \n // FOR SSR / CLIENT ENTRY\n if (typeof window !== 'undefined' && !process.env.MOBILE_APP) {\n // Используем renderAndMountApp для правильной гидратации со state\n appRenderer.renderAndMountApp({ createApp, hooks }).then(({ app, router, store, moduleManager }) => {\n // Хук ПОСЛЕ гидратации\n if (hooks.afterHydration) {\n hooks.afterHydration({ app, router, store, moduleManager });\n }\n \n // Модули уже загружены в renderAndMountApp, просто ставим маркер\n if (typeof window !== 'undefined') {\n window.performance.mark('client-ready');\n }\n }).catch(error => {\n console.error('Hydration failed:', error);\n });\n }\n \n return { createApp, renderApp };\n }\n \n // Возвращаем промис, который резолвится с функциями\n return initializeApp();\n}"],"names":["createApp","createVueApp","createVueSSRApp","moduleManager"],"mappings":"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"}
@@ -20,8 +20,13 @@ class I18nManager {
20
20
  }
21
21
  this.moduleLocales.set(moduleName, locales);
22
22
  if (this.i18nInstance) {
23
- Object.entries(locales).forEach(([locale, messages]) => {
24
- this.i18nInstance.global.mergeLocaleMessage(locale, messages);
23
+ const localeKeys = Object.keys(locales);
24
+ const ext = this.extensions.get(moduleName);
25
+ const ovr = this.overrides.get(moduleName);
26
+ localeKeys.forEach((locale) => {
27
+ if (locales[locale]) this.i18nInstance.global.mergeLocaleMessage(locale, locales[locale]);
28
+ if (ext?.[locale]) this.i18nInstance.global.mergeLocaleMessage(locale, ext[locale]);
29
+ if (ovr?.[locale]) this.i18nInstance.global.mergeLocaleMessage(locale, ovr[locale]);
25
30
  });
26
31
  }
27
32
  return this;
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.manager.js","sources":["../../../../../../../src/modules/core/views/classes/i18n.manager.js"],"sourcesContent":["import merge from 'lodash.merge';\n\nclass I18nManager {\n constructor() {\n this.moduleLocales = new Map();\n this.overrides = new Map();\n this.extensions = new Map();\n this.i18nInstance = null;\n this.supportedLocales = null;\n }\n\n setSupportedLocales(locales) {\n this.supportedLocales = Array.isArray(locales) ? locales : Object.keys(locales);\n return this;\n }\n\n setI18nInstance(i18n) {\n this.i18nInstance = i18n;\n }\n\n register(moduleName, locales) {\n if (typeof moduleName !== 'string' || !this.isValidLocales(locales)) {\n throw new TypeError('Invalid arguments for register()');\n }\n this.moduleLocales.set(moduleName, locales);\n\n // Если i18n instance уже создан, добавляем переводы динамически\n if (this.i18nInstance) {\n Object.entries(locales).forEach(([locale, messages]) => {\n this.i18nInstance.global.mergeLocaleMessage(locale, messages);\n });\n }\n\n return this;\n }\n\n extend(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for extend()');\n const existing = this.extensions.get(moduleName) || {};\n merge(existing, locales);\n this.extensions.set(moduleName, existing);\n return this;\n }\n\n override(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for override()');\n const existing = this.overrides.get(moduleName) || {};\n merge(existing, locales);\n this.overrides.set(moduleName, existing);\n return this;\n }\n\n getMessages(locale) {\n const result = {};\n\n for (const [, moduleLocales] of this.moduleLocales) {\n if (moduleLocales[locale]) {\n merge(result, moduleLocales[locale]);\n }\n }\n\n for (const [, ext] of this.extensions) {\n if (ext[locale]) {\n merge(result, ext[locale]);\n }\n }\n\n for (const [, override] of this.overrides) {\n if (override[locale]) {\n merge(result, override[locale]);\n }\n }\n\n return result;\n }\n\n getAllMessages() {\n const allLocales = new Set();\n\n for (const moduleLocales of this.moduleLocales.values()) {\n Object.keys(moduleLocales).forEach(locale => allLocales.add(locale));\n }\n\n const messages = {};\n\n for (const locale of allLocales) {\n if (this.supportedLocales && !this.supportedLocales.includes(locale)) {\n continue;\n }\n messages[locale] = this.getMessages(locale);\n }\n\n return messages;\n }\n\n isValidLocales(obj) {\n return this.isObject(obj) && Object.values(obj).every(this.isObject);\n }\n\n isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n}\n\nexport const i18nManager = new I18nManager();\nexport default I18nManager;\n"],"names":[],"mappings":";AAEA,MAAM,YAAY;AAAA,EAChB,cAAc;AACZ,SAAK,gBAAgB,oBAAI,IAAG;AAC5B,SAAK,YAAY,oBAAI,IAAG;AACxB,SAAK,aAAa,oBAAI,IAAG;AACzB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,oBAAoB,SAAS;AAC3B,SAAK,mBAAmB,MAAM,QAAQ,OAAO,IAAI,UAAU,OAAO,KAAK,OAAO;AAC9E,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,MAAM;AACpB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,SAAS,YAAY,SAAS;AAC5B,QAAI,OAAO,eAAe,YAAY,CAAC,KAAK,eAAe,OAAO,GAAG;AACnE,YAAM,IAAI,UAAU,kCAAkC;AAAA,IACxD;AACA,SAAK,cAAc,IAAI,YAAY,OAAO;AAG1C,QAAI,KAAK,cAAc;AACrB,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,QAAQ,MAAM;AACtD,aAAK,aAAa,OAAO,mBAAmB,QAAQ,QAAQ;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAY,SAAS;AAC1B,QAAI,CAAC,KAAK,eAAe,OAAO,EAAG,OAAM,IAAI,UAAU,8BAA8B;AACrF,UAAM,WAAW,KAAK,WAAW,IAAI,UAAU,KAAK,CAAA;AACpD,UAAM,UAAU,OAAO;AACvB,SAAK,WAAW,IAAI,YAAY,QAAQ;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,YAAY,SAAS;AAC5B,QAAI,CAAC,KAAK,eAAe,OAAO,EAAG,OAAM,IAAI,UAAU,gCAAgC;AACvF,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU,KAAK,CAAA;AACnD,UAAM,UAAU,OAAO;AACvB,SAAK,UAAU,IAAI,YAAY,QAAQ;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAQ;AAClB,UAAM,SAAS,CAAA;AAEf,eAAW,CAAA,EAAG,aAAa,KAAK,KAAK,eAAe;AAClD,UAAI,cAAc,MAAM,GAAG;AACzB,cAAM,QAAQ,cAAc,MAAM,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,eAAW,CAAA,EAAG,GAAG,KAAK,KAAK,YAAY;AACrC,UAAI,IAAI,MAAM,GAAG;AACf,cAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,MAC3B;AAAA,IACF;AAEA,eAAW,CAAA,EAAG,QAAQ,KAAK,KAAK,WAAW;AACzC,UAAI,SAAS,MAAM,GAAG;AACpB,cAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AACf,UAAM,aAAa,oBAAI,IAAG;AAE1B,eAAW,iBAAiB,KAAK,cAAc,OAAM,GAAI;AACvD,aAAO,KAAK,aAAa,EAAE,QAAQ,YAAU,WAAW,IAAI,MAAM,CAAC;AAAA,IACrE;AAEA,UAAM,WAAW,CAAA;AAEjB,eAAW,UAAU,YAAY;AAC/B,UAAI,KAAK,oBAAoB,CAAC,KAAK,iBAAiB,SAAS,MAAM,GAAG;AACpE;AAAA,MACF;AACA,eAAS,MAAM,IAAI,KAAK,YAAY,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,KAAK;AAClB,WAAO,KAAK,SAAS,GAAG,KAAK,OAAO,OAAO,GAAG,EAAE,MAAM,KAAK,QAAQ;AAAA,EACrE;AAAA,EAEA,SAAS,MAAM;AACb,WAAO,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI;AAAA,EAChE;AACF;AAEY,MAAC,cAAc,IAAI,YAAW;"}
1
+ {"version":3,"file":"i18n.manager.js","sources":["../../../../../../../src/modules/core/views/classes/i18n.manager.js"],"sourcesContent":["import merge from 'lodash.merge';\n\nclass I18nManager {\n constructor() {\n this.moduleLocales = new Map();\n this.overrides = new Map();\n this.extensions = new Map();\n this.i18nInstance = null;\n this.supportedLocales = null;\n }\n\n setSupportedLocales(locales) {\n this.supportedLocales = Array.isArray(locales) ? locales : Object.keys(locales);\n return this;\n }\n\n setI18nInstance(i18n) {\n this.i18nInstance = i18n;\n }\n\n register(moduleName, locales) {\n if (typeof moduleName !== 'string' || !this.isValidLocales(locales)) {\n throw new TypeError('Invalid arguments for register()');\n }\n this.moduleLocales.set(moduleName, locales);\n\n // Если i18n instance уже создан, добавляем переводы динамически\n // и переприменяем extensions/overrides чтобы сохранить приоритет слоёв\n if (this.i18nInstance) {\n const localeKeys = Object.keys(locales);\n const ext = this.extensions.get(moduleName);\n const ovr = this.overrides.get(moduleName);\n\n localeKeys.forEach(locale => {\n if (locales[locale]) this.i18nInstance.global.mergeLocaleMessage(locale, locales[locale]);\n if (ext?.[locale]) this.i18nInstance.global.mergeLocaleMessage(locale, ext[locale]);\n if (ovr?.[locale]) this.i18nInstance.global.mergeLocaleMessage(locale, ovr[locale]);\n });\n }\n\n return this;\n }\n\n extend(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for extend()');\n const existing = this.extensions.get(moduleName) || {};\n merge(existing, locales);\n this.extensions.set(moduleName, existing);\n return this;\n }\n\n override(moduleName, locales) {\n if (!this.isValidLocales(locales)) throw new TypeError('Invalid locales for override()');\n const existing = this.overrides.get(moduleName) || {};\n merge(existing, locales);\n this.overrides.set(moduleName, existing);\n return this;\n }\n\n getMessages(locale) {\n const result = {};\n\n for (const [, moduleLocales] of this.moduleLocales) {\n if (moduleLocales[locale]) {\n merge(result, moduleLocales[locale]);\n }\n }\n\n for (const [, ext] of this.extensions) {\n if (ext[locale]) {\n merge(result, ext[locale]);\n }\n }\n\n for (const [, override] of this.overrides) {\n if (override[locale]) {\n merge(result, override[locale]);\n }\n }\n\n return result;\n }\n\n getAllMessages() {\n const allLocales = new Set();\n\n for (const moduleLocales of this.moduleLocales.values()) {\n Object.keys(moduleLocales).forEach(locale => allLocales.add(locale));\n }\n\n const messages = {};\n\n for (const locale of allLocales) {\n if (this.supportedLocales && !this.supportedLocales.includes(locale)) {\n continue;\n }\n messages[locale] = this.getMessages(locale);\n }\n\n return messages;\n }\n\n isValidLocales(obj) {\n return this.isObject(obj) && Object.values(obj).every(this.isObject);\n }\n\n isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n}\n\nexport const i18nManager = new I18nManager();\nexport default I18nManager;\n"],"names":[],"mappings":";AAEA,MAAM,YAAY;AAAA,EAChB,cAAc;AACZ,SAAK,gBAAgB,oBAAI,IAAG;AAC5B,SAAK,YAAY,oBAAI,IAAG;AACxB,SAAK,aAAa,oBAAI,IAAG;AACzB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,oBAAoB,SAAS;AAC3B,SAAK,mBAAmB,MAAM,QAAQ,OAAO,IAAI,UAAU,OAAO,KAAK,OAAO;AAC9E,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,MAAM;AACpB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,SAAS,YAAY,SAAS;AAC5B,QAAI,OAAO,eAAe,YAAY,CAAC,KAAK,eAAe,OAAO,GAAG;AACnE,YAAM,IAAI,UAAU,kCAAkC;AAAA,IACxD;AACA,SAAK,cAAc,IAAI,YAAY,OAAO;AAI1C,QAAI,KAAK,cAAc;AACrB,YAAM,aAAa,OAAO,KAAK,OAAO;AACtC,YAAM,MAAM,KAAK,WAAW,IAAI,UAAU;AAC1C,YAAM,MAAM,KAAK,UAAU,IAAI,UAAU;AAEzC,iBAAW,QAAQ,YAAU;AAC3B,YAAI,QAAQ,MAAM,EAAG,MAAK,aAAa,OAAO,mBAAmB,QAAQ,QAAQ,MAAM,CAAC;AACxF,YAAI,MAAM,MAAM,EAAG,MAAK,aAAa,OAAO,mBAAmB,QAAQ,IAAI,MAAM,CAAC;AAClF,YAAI,MAAM,MAAM,EAAG,MAAK,aAAa,OAAO,mBAAmB,QAAQ,IAAI,MAAM,CAAC;AAAA,MACpF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAY,SAAS;AAC1B,QAAI,CAAC,KAAK,eAAe,OAAO,EAAG,OAAM,IAAI,UAAU,8BAA8B;AACrF,UAAM,WAAW,KAAK,WAAW,IAAI,UAAU,KAAK,CAAA;AACpD,UAAM,UAAU,OAAO;AACvB,SAAK,WAAW,IAAI,YAAY,QAAQ;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,YAAY,SAAS;AAC5B,QAAI,CAAC,KAAK,eAAe,OAAO,EAAG,OAAM,IAAI,UAAU,gCAAgC;AACvF,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU,KAAK,CAAA;AACnD,UAAM,UAAU,OAAO;AACvB,SAAK,UAAU,IAAI,YAAY,QAAQ;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAQ;AAClB,UAAM,SAAS,CAAA;AAEf,eAAW,CAAA,EAAG,aAAa,KAAK,KAAK,eAAe;AAClD,UAAI,cAAc,MAAM,GAAG;AACzB,cAAM,QAAQ,cAAc,MAAM,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,eAAW,CAAA,EAAG,GAAG,KAAK,KAAK,YAAY;AACrC,UAAI,IAAI,MAAM,GAAG;AACf,cAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,MAC3B;AAAA,IACF;AAEA,eAAW,CAAA,EAAG,QAAQ,KAAK,KAAK,WAAW;AACzC,UAAI,SAAS,MAAM,GAAG;AACpB,cAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AACf,UAAM,aAAa,oBAAI,IAAG;AAE1B,eAAW,iBAAiB,KAAK,cAAc,OAAM,GAAI;AACvD,aAAO,KAAK,aAAa,EAAE,QAAQ,YAAU,WAAW,IAAI,MAAM,CAAC;AAAA,IACrE;AAEA,UAAM,WAAW,CAAA;AAEjB,eAAW,UAAU,YAAY;AAC/B,UAAI,KAAK,oBAAoB,CAAC,KAAK,iBAAiB,SAAS,MAAM,GAAG;AACpE;AAAA,MACF;AACA,eAAS,MAAM,IAAI,KAAK,YAAY,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,KAAK;AAClB,WAAO,KAAK,SAAS,GAAG,KAAK,OAAO,OAAO,GAAG,EAAE,MAAM,KAAK,QAAQ;AAAA,EACrE;AAAA,EAEA,SAAS,MAAM;AACb,WAAO,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI;AAAA,EAChE;AACF;AAEY,MAAC,cAAc,IAAI,YAAW;"}
@@ -48,20 +48,23 @@ class WebSocketManager {
48
48
  }
49
49
  connect(userId = null) {
50
50
  if (typeof window === "undefined") return Promise.resolve(false);
51
- this.userId = userId;
51
+ console.log("[WS DEBUG] connect() called, userId:", userId, "current this.userId:", this.userId, "isConnected:", this.isConnected, "baseUrl:", this.baseUrl, "hasConnectPromise:", !!this.connectPromise);
52
52
  if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {
53
53
  if (this.userId !== userId) {
54
54
  console.log("[WebSocket] UserId changed, reconnecting...");
55
55
  return this.reconnectWithAuth(userId);
56
56
  }
57
+ console.log("[WS DEBUG] Already connected, returning existing socket");
57
58
  return Promise.resolve(this.socket);
58
59
  }
60
+ this.userId = userId;
59
61
  if (this.connectPromise) {
62
+ console.log("[WS DEBUG] Returning existing connectPromise");
60
63
  return this.connectPromise;
61
64
  }
62
65
  this.connectPromise = new Promise((resolve, reject) => {
63
- this.disconnect();
64
- console.log("[WebSocket] Connecting to:", this.baseUrl, "userId:", userId);
66
+ this._cleanupSocket();
67
+ console.log("[WS DEBUG] Creating new WebSocket to:", this.baseUrl, "userId:", userId);
65
68
  this.socket = new WebSocket(this.baseUrl);
66
69
  this.socket.onopen = () => {
67
70
  this._handleOpen();
@@ -83,8 +86,7 @@ class WebSocketManager {
83
86
  });
84
87
  return this.connectPromise;
85
88
  }
86
- disconnect() {
87
- if (typeof window === "undefined") return;
89
+ _cleanupSocket() {
88
90
  if (this.socket) {
89
91
  this.socket.onopen = null;
90
92
  this.socket.onmessage = null;
@@ -104,6 +106,10 @@ class WebSocketManager {
104
106
  this.rpcCallbacks.delete(id);
105
107
  }
106
108
  this.isConnected = false;
109
+ }
110
+ disconnect() {
111
+ if (typeof window === "undefined") return;
112
+ this._cleanupSocket();
107
113
  this.userId = null;
108
114
  this.subscribedModules.clear();
109
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ws.manager.js","sources":["../../../../../../../src/modules/core/views/classes/ws.manager.js"],"sourcesContent":["import { reactive } from 'vue';\n\nclass WebSocketManager {\n constructor() {\n this.socket = null;\n this.reconnectAttempts = 0;\n this.maxReconnectAttempts = 5;\n this.reconnectDelay = 3000;\n this.baseUrl = null;\n this.pingInterval = null;\n this.pingIntervalTime = 30000;\n this.listeners = {};\n this.userId = null;\n this.connectPromise = null;\n this.subscribedModules = new Set();\n\n // RPC-специфичные свойства\n this.rpcCallbacks = new Map();\n this.rpcTimeout = 30000; // 30 секунд таймаут по умолчанию\n this.rpcIdCounter = 0;\n\n // Реактивное состояние\n this.state = reactive({\n isConnected: false,\n wasConnected: false, // был ли когда-либо подключен\n });\n }\n\n // Геттер для обратной совместимости\n get isConnected() {\n return this.state.isConnected;\n }\n\n set isConnected(value) {\n this.state.isConnected = value;\n if (value) {\n this.state.wasConnected = true;\n }\n }\n\n initialize(options = {}) {\n this.maxReconnectAttempts = options.maxReconnectAttempts || this.maxReconnectAttempts;\n this.reconnectDelay = options.reconnectDelay || this.reconnectDelay;\n this.baseUrl = options.wsUrl || this._getDefaultWsUrl();\n this.pingIntervalTime = options.pingInterval || this.pingIntervalTime;\n this.rpcTimeout = options.rpcTimeout || this.rpcTimeout;\n }\n\n _getDefaultWsUrl() {\n if (typeof window === 'undefined') return '/api/ws';\n \n const isSecure = window.location.protocol === 'https:';\n const protocol = isSecure ? 'wss:' : 'ws:';\n const host = window.location.hostname;\n const port = isSecure ? '' : ':8020';\n\n return `${protocol}//${host}${port}/api/ws`;\n }\n\n connect(userId = null) {\n if (typeof window === 'undefined') return Promise.resolve(false);\n this.userId = userId;\n\n // Проверяем существующее соединение\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n // If already connected but userId changed, need to reconnect\n if (this.userId !== userId) {\n console.log('[WebSocket] UserId changed, reconnecting...');\n return this.reconnectWithAuth(userId);\n }\n return Promise.resolve(this.socket);\n }\n\n // Предотвращаем создание множества промисов при параллельных вызовах\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = new Promise((resolve, reject) => {\n this.disconnect();\n\n // Используем baseUrl без параметров, так как аутентификация через cookie\n console.log('[WebSocket] Connecting to:', this.baseUrl, 'userId:', userId);\n this.socket = new WebSocket(this.baseUrl);\n\n this.socket.onopen = () => {\n this._handleOpen();\n resolve(this.socket);\n };\n\n this.socket.onmessage = this._handleMessage.bind(this);\n this.socket.onerror = err => {\n this._handleError(err);\n reject(err);\n };\n this.socket.onclose = this._handleClose.bind(this);\n\n setTimeout(() => {\n if (!this.isConnected) {\n reject(new Error('WebSocket connection timeout'));\n }\n }, 10000);\n }).finally(() => {\n this.connectPromise = null;\n });\n\n return this.connectPromise;\n }\n\n disconnect() {\n if (typeof window === 'undefined') return;\n\n if (this.socket) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close();\n }\n this.socket = null;\n }\n\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все ожидающие RPC вызовы\n for (const [id, { reject }] of this.rpcCallbacks.entries()) {\n reject(new Error('WebSocket disconnected'));\n this.rpcCallbacks.delete(id);\n }\n\n this.isConnected = false;\n this.userId = null;\n this.subscribedModules.clear(); // Очищаем подписки при отключении\n }\n\n async send(data) {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n console.error('Cannot send message: WebSocket is not connected');\n return false;\n }\n\n try {\n const msg = typeof data === 'string' ? data : JSON.stringify(data);\n this.socket.send(msg);\n return true;\n } catch (err) {\n console.error('Error sending message:', err);\n return false;\n }\n }\n\n /**\n * Выполняет RPC вызов на сервере\n * @param {string} module - Имя модуля\n * @param {string} method - Имя метода\n * @param {object} params - Параметры метода\n * @param {object} [options] - Опции вызова\n * @param {number} [options.timeout] - Таймаут в миллисекундах\n * @returns {Promise<any>} - Результат вызова\n */\n rpc(module, method, params = {}, options = {}) {\n if (!this.isConnected || this.socket?.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n\n if (!module || !method) {\n return Promise.reject(new Error('Module and method are required'));\n }\n\n // Генерируем уникальный ID для вызова\n const id = `${++this.rpcIdCounter}`;\n const timeout = options.timeout || this.rpcTimeout;\n\n return new Promise((resolve, reject) => {\n // Записываем информацию о вызове для последующей обработки ответа\n this.rpcCallbacks.set(id, {\n resolve,\n reject,\n timeoutId: setTimeout(() => {\n if (this.rpcCallbacks.has(id)) {\n this.rpcCallbacks.delete(id);\n reject(new Error(`RPC call to ${module}.${method} timed out after ${timeout}ms`));\n }\n }, timeout),\n });\n\n // Отправляем RPC запрос\n this.send({\n type: 'rpc',\n module,\n method,\n params,\n id,\n }).catch(err => {\n if (this.rpcCallbacks.has(id)) {\n clearTimeout(this.rpcCallbacks.get(id).timeoutId);\n this.rpcCallbacks.delete(id);\n reject(err);\n }\n });\n });\n }\n\n addEventListener(eventType, callback, options = {}) {\n const listenerId = `${options.module || 'global'}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n if (!this.listeners[eventType]) this.listeners[eventType] = {};\n this.listeners[eventType][listenerId] = callback;\n return listenerId;\n }\n\n removeEventListener(eventType, listenerId) {\n if (this.listeners[eventType]?.[listenerId]) {\n delete this.listeners[eventType][listenerId];\n }\n }\n\n removeModuleListeners(moduleName) {\n Object.keys(this.listeners).forEach(eventType => {\n Object.keys(this.listeners[eventType]).forEach(listenerId => {\n if (listenerId.startsWith(`${moduleName}_`)) {\n delete this.listeners[eventType][listenerId];\n }\n });\n });\n }\n\n async subscribeModule(moduleName) {\n if (!moduleName) return;\n \n if (this.subscribedModules.has(moduleName)) {\n console.log(`[WebSocket] Module ${moduleName} already subscribed`);\n return;\n }\n \n console.log(`[WebSocket] Subscribing to module: ${moduleName}`);\n const success = await this.send({ type: 'subscribe', module: moduleName });\n if (success) {\n this.subscribedModules.add(moduleName);\n console.log(`[WebSocket] Successfully subscribed to module: ${moduleName}`);\n } else {\n console.log(`[WebSocket] Failed to subscribe to module: ${moduleName}`);\n }\n }\n\n async unsubscribeModule(moduleName) {\n if (!moduleName || !this.subscribedModules.has(moduleName)) return;\n const success = await this.send({ type: 'unsubscribe', module: moduleName });\n if (success) {\n this.subscribedModules.delete(moduleName);\n }\n }\n\n _resubscribeAllModules() {\n for (const moduleName of this.subscribedModules) {\n this.send({ type: 'subscribe', module: moduleName });\n }\n }\n\n _handleOpen() {\n this.isConnected = true;\n this.reconnectAttempts = 0;\n\n this.pingInterval = setInterval(() => {\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ type: 'ping' }));\n }\n }, this.pingIntervalTime);\n\n this._resubscribeAllModules();\n this._notifyListeners('open', { isConnected: true });\n }\n\n _handleMessage(event) {\n // Проверка на типы сообщений - пропускаем бинарные сообщения\n if (typeof event.data !== 'string') {\n console.warn('Received binary message, but only JSON is supported');\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n\n // Обрабатываем ответы на RPC вызовы\n if (data.type === 'rpc_response' && data.id && this.rpcCallbacks.has(data.id)) {\n const { resolve, reject, timeoutId } = this.rpcCallbacks.get(data.id);\n clearTimeout(timeoutId);\n this.rpcCallbacks.delete(data.id);\n\n if (data.error) {\n reject(Object.assign(new Error(data.error.message), data.error));\n } else {\n resolve(data.result);\n }\n\n return;\n }\n\n // Обрабатываем обычные сообщения\n this._notifyListeners('message', data);\n if (data.type) {\n this._notifyListeners(data.type, data);\n }\n } catch (err) {\n console.error('WebSocket message error:', err);\n }\n }\n\n _handleError(error) {\n console.error('WebSocket error:', error);\n this._notifyListeners('error', { error });\n\n // Отменяем все RPC вызовы с ошибкой соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection error'));\n this.rpcCallbacks.delete(id);\n }\n }\n\n _handleClose(event) {\n this.isConnected = false;\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все RPC вызовы при закрытии соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection closed'));\n this.rpcCallbacks.delete(id);\n }\n\n this._notifyListeners('close', { code: event.code, reason: event.reason });\n\n // Reconnect for both authenticated and anonymous users (not just authenticated)\n if (event.code !== 1000 && this.reconnectAttempts < this.maxReconnectAttempts) {\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * this.reconnectAttempts;\n console.log(`[WebSocket] Reconnecting in ${delay}ms... (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n setTimeout(() => {\n this.connect(this.userId).catch(err => {\n console.error('Reconnection failed:', err);\n });\n }, delay);\n }\n }\n\n _notifyListeners(eventType, data) {\n Object.values(this.listeners[eventType] || {}).forEach(fn => {\n try {\n fn(data);\n } catch (err) {\n console.error(`Listener for ${eventType} failed:`, err);\n }\n });\n }\n\n isSocketConnected() {\n return this.isConnected && this.socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Reconnect WebSocket with new authentication\n * Useful when user logs in/out\n * @param {string} userId - New user ID (optional)\n * @returns {Promise<WebSocket|boolean>}\n */\n async reconnectWithAuth(userId) {\n console.log('[WebSocket] Reconnecting with auth, userId:', userId);\n \n // Disconnect existing connection\n this.disconnect();\n \n // Small delay to ensure clean disconnect\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Connect with new userId (or null for anonymous)\n return this.connect(userId);\n }\n}\n\nconst wsManager = new WebSocketManager();\nexport { wsManager };\nexport default wsManager;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws.manager.js","sources":["../../../../../../../src/modules/core/views/classes/ws.manager.js"],"sourcesContent":["import { reactive } from 'vue';\n\nclass WebSocketManager {\n constructor() {\n this.socket = null;\n this.reconnectAttempts = 0;\n this.maxReconnectAttempts = 5;\n this.reconnectDelay = 3000;\n this.baseUrl = null;\n this.pingInterval = null;\n this.pingIntervalTime = 30000;\n this.listeners = {};\n this.userId = null;\n this.connectPromise = null;\n this.subscribedModules = new Set();\n\n // RPC-специфичные свойства\n this.rpcCallbacks = new Map();\n this.rpcTimeout = 30000; // 30 секунд таймаут по умолчанию\n this.rpcIdCounter = 0;\n\n // Реактивное состояние\n this.state = reactive({\n isConnected: false,\n wasConnected: false, // был ли когда-либо подключен\n });\n }\n\n // Геттер для обратной совместимости\n get isConnected() {\n return this.state.isConnected;\n }\n\n set isConnected(value) {\n this.state.isConnected = value;\n if (value) {\n this.state.wasConnected = true;\n }\n }\n\n initialize(options = {}) {\n this.maxReconnectAttempts = options.maxReconnectAttempts || this.maxReconnectAttempts;\n this.reconnectDelay = options.reconnectDelay || this.reconnectDelay;\n this.baseUrl = options.wsUrl || this._getDefaultWsUrl();\n this.pingIntervalTime = options.pingInterval || this.pingIntervalTime;\n this.rpcTimeout = options.rpcTimeout || this.rpcTimeout;\n }\n\n _getDefaultWsUrl() {\n if (typeof window === 'undefined') return '/api/ws';\n \n const isSecure = window.location.protocol === 'https:';\n const protocol = isSecure ? 'wss:' : 'ws:';\n const host = window.location.hostname;\n const port = isSecure ? '' : ':8020';\n\n return `${protocol}//${host}${port}/api/ws`;\n }\n\n connect(userId = null) {\n if (typeof window === 'undefined') return Promise.resolve(false);\n\n console.log('[WS DEBUG] connect() called, userId:', userId, 'current this.userId:', this.userId, 'isConnected:', this.isConnected, 'baseUrl:', this.baseUrl, 'hasConnectPromise:', !!this.connectPromise);\n\n // Проверяем существующее соединение\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n // If already connected but userId changed, need to reconnect\n if (this.userId !== userId) {\n console.log('[WebSocket] UserId changed, reconnecting...');\n return this.reconnectWithAuth(userId);\n }\n console.log('[WS DEBUG] Already connected, returning existing socket');\n return Promise.resolve(this.socket);\n }\n\n this.userId = userId;\n\n // Предотвращаем создание множества промисов при параллельных вызовах\n if (this.connectPromise) {\n console.log('[WS DEBUG] Returning existing connectPromise');\n return this.connectPromise;\n }\n\n this.connectPromise = new Promise((resolve, reject) => {\n // Очищаем старый сокет без сброса userId и подписок\n this._cleanupSocket();\n\n // Используем baseUrl без параметров, так как аутентификация через cookie\n console.log('[WS DEBUG] Creating new WebSocket to:', this.baseUrl, 'userId:', userId);\n this.socket = new WebSocket(this.baseUrl);\n\n this.socket.onopen = () => {\n this._handleOpen();\n resolve(this.socket);\n };\n\n this.socket.onmessage = this._handleMessage.bind(this);\n this.socket.onerror = err => {\n this._handleError(err);\n reject(err);\n };\n this.socket.onclose = this._handleClose.bind(this);\n\n setTimeout(() => {\n if (!this.isConnected) {\n reject(new Error('WebSocket connection timeout'));\n }\n }, 10000);\n }).finally(() => {\n this.connectPromise = null;\n });\n\n return this.connectPromise;\n }\n\n _cleanupSocket() {\n if (this.socket) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close();\n }\n this.socket = null;\n }\n\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все ожидающие RPC вызовы\n for (const [id, { reject }] of this.rpcCallbacks.entries()) {\n reject(new Error('WebSocket disconnected'));\n this.rpcCallbacks.delete(id);\n }\n\n this.isConnected = false;\n }\n\n disconnect() {\n if (typeof window === 'undefined') return;\n\n this._cleanupSocket();\n this.userId = null;\n this.subscribedModules.clear(); // Очищаем подписки при полном отключении\n }\n\n async send(data) {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n console.error('Cannot send message: WebSocket is not connected');\n return false;\n }\n\n try {\n const msg = typeof data === 'string' ? data : JSON.stringify(data);\n this.socket.send(msg);\n return true;\n } catch (err) {\n console.error('Error sending message:', err);\n return false;\n }\n }\n\n /**\n * Выполняет RPC вызов на сервере\n * @param {string} module - Имя модуля\n * @param {string} method - Имя метода\n * @param {object} params - Параметры метода\n * @param {object} [options] - Опции вызова\n * @param {number} [options.timeout] - Таймаут в миллисекундах\n * @returns {Promise<any>} - Результат вызова\n */\n rpc(module, method, params = {}, options = {}) {\n if (!this.isConnected || this.socket?.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n\n if (!module || !method) {\n return Promise.reject(new Error('Module and method are required'));\n }\n\n // Генерируем уникальный ID для вызова\n const id = `${++this.rpcIdCounter}`;\n const timeout = options.timeout || this.rpcTimeout;\n\n return new Promise((resolve, reject) => {\n // Записываем информацию о вызове для последующей обработки ответа\n this.rpcCallbacks.set(id, {\n resolve,\n reject,\n timeoutId: setTimeout(() => {\n if (this.rpcCallbacks.has(id)) {\n this.rpcCallbacks.delete(id);\n reject(new Error(`RPC call to ${module}.${method} timed out after ${timeout}ms`));\n }\n }, timeout),\n });\n\n // Отправляем RPC запрос\n this.send({\n type: 'rpc',\n module,\n method,\n params,\n id,\n }).catch(err => {\n if (this.rpcCallbacks.has(id)) {\n clearTimeout(this.rpcCallbacks.get(id).timeoutId);\n this.rpcCallbacks.delete(id);\n reject(err);\n }\n });\n });\n }\n\n addEventListener(eventType, callback, options = {}) {\n const listenerId = `${options.module || 'global'}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n if (!this.listeners[eventType]) this.listeners[eventType] = {};\n this.listeners[eventType][listenerId] = callback;\n return listenerId;\n }\n\n removeEventListener(eventType, listenerId) {\n if (this.listeners[eventType]?.[listenerId]) {\n delete this.listeners[eventType][listenerId];\n }\n }\n\n removeModuleListeners(moduleName) {\n Object.keys(this.listeners).forEach(eventType => {\n Object.keys(this.listeners[eventType]).forEach(listenerId => {\n if (listenerId.startsWith(`${moduleName}_`)) {\n delete this.listeners[eventType][listenerId];\n }\n });\n });\n }\n\n async subscribeModule(moduleName) {\n if (!moduleName) return;\n \n if (this.subscribedModules.has(moduleName)) {\n console.log(`[WebSocket] Module ${moduleName} already subscribed`);\n return;\n }\n \n console.log(`[WebSocket] Subscribing to module: ${moduleName}`);\n const success = await this.send({ type: 'subscribe', module: moduleName });\n if (success) {\n this.subscribedModules.add(moduleName);\n console.log(`[WebSocket] Successfully subscribed to module: ${moduleName}`);\n } else {\n console.log(`[WebSocket] Failed to subscribe to module: ${moduleName}`);\n }\n }\n\n async unsubscribeModule(moduleName) {\n if (!moduleName || !this.subscribedModules.has(moduleName)) return;\n const success = await this.send({ type: 'unsubscribe', module: moduleName });\n if (success) {\n this.subscribedModules.delete(moduleName);\n }\n }\n\n _resubscribeAllModules() {\n for (const moduleName of this.subscribedModules) {\n this.send({ type: 'subscribe', module: moduleName });\n }\n }\n\n _handleOpen() {\n this.isConnected = true;\n this.reconnectAttempts = 0;\n\n this.pingInterval = setInterval(() => {\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ type: 'ping' }));\n }\n }, this.pingIntervalTime);\n\n this._resubscribeAllModules();\n this._notifyListeners('open', { isConnected: true });\n }\n\n _handleMessage(event) {\n // Проверка на типы сообщений - пропускаем бинарные сообщения\n if (typeof event.data !== 'string') {\n console.warn('Received binary message, but only JSON is supported');\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n\n // Обрабатываем ответы на RPC вызовы\n if (data.type === 'rpc_response' && data.id && this.rpcCallbacks.has(data.id)) {\n const { resolve, reject, timeoutId } = this.rpcCallbacks.get(data.id);\n clearTimeout(timeoutId);\n this.rpcCallbacks.delete(data.id);\n\n if (data.error) {\n reject(Object.assign(new Error(data.error.message), data.error));\n } else {\n resolve(data.result);\n }\n\n return;\n }\n\n // Обрабатываем обычные сообщения\n this._notifyListeners('message', data);\n if (data.type) {\n this._notifyListeners(data.type, data);\n }\n } catch (err) {\n console.error('WebSocket message error:', err);\n }\n }\n\n _handleError(error) {\n console.error('WebSocket error:', error);\n this._notifyListeners('error', { error });\n\n // Отменяем все RPC вызовы с ошибкой соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection error'));\n this.rpcCallbacks.delete(id);\n }\n }\n\n _handleClose(event) {\n this.isConnected = false;\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все RPC вызовы при закрытии соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection closed'));\n this.rpcCallbacks.delete(id);\n }\n\n this._notifyListeners('close', { code: event.code, reason: event.reason });\n\n // Reconnect for both authenticated and anonymous users (not just authenticated)\n if (event.code !== 1000 && this.reconnectAttempts < this.maxReconnectAttempts) {\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * this.reconnectAttempts;\n console.log(`[WebSocket] Reconnecting in ${delay}ms... (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n setTimeout(() => {\n this.connect(this.userId).catch(err => {\n console.error('Reconnection failed:', err);\n });\n }, delay);\n }\n }\n\n _notifyListeners(eventType, data) {\n Object.values(this.listeners[eventType] || {}).forEach(fn => {\n try {\n fn(data);\n } catch (err) {\n console.error(`Listener for ${eventType} failed:`, err);\n }\n });\n }\n\n isSocketConnected() {\n return this.isConnected && this.socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Reconnect WebSocket with new authentication\n * Useful when user logs in/out\n * @param {string} userId - New user ID (optional)\n * @returns {Promise<WebSocket|boolean>}\n */\n async reconnectWithAuth(userId) {\n console.log('[WebSocket] Reconnecting with auth, userId:', userId);\n \n // Disconnect existing connection\n this.disconnect();\n \n // Small delay to ensure clean disconnect\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Connect with new userId (or null for anonymous)\n return this.connect(userId);\n }\n}\n\nconst wsManager = new WebSocketManager();\nexport { wsManager };\nexport default wsManager;\n"],"names":[],"mappings":"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"}