@vc-shell/framework 1.0.128 → 1.0.130

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 (331) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/core/api/platform.ts +514 -92
  3. package/core/composables/index.ts +2 -1
  4. package/core/composables/useApiClient/index.ts +1 -7
  5. package/core/composables/useAssets/index.ts +0 -6
  6. package/core/composables/useBeforeUnload/index.ts +20 -0
  7. package/core/composables/useMenuService/index.ts +96 -0
  8. package/core/composables/useNotifications/index.ts +29 -40
  9. package/core/composables/useSettings/index.ts +23 -29
  10. package/core/composables/useUser/index.ts +61 -132
  11. package/core/directives/loading/styles.css +5 -5
  12. package/core/interceptors/index.ts +75 -0
  13. package/core/plugins/i18n/index.ts +1 -0
  14. package/core/plugins/modularity/index.ts +63 -20
  15. package/core/plugins/moment/moment.ts +2 -2
  16. package/core/plugins/signalR/index.ts +23 -3
  17. package/core/types/index.ts +18 -35
  18. package/core/utilities/kebabToCamel.ts +1 -1
  19. package/dist/core/api/platform.d.ts +125 -87
  20. package/dist/core/api/platform.d.ts.map +1 -1
  21. package/dist/core/composables/index.d.ts +2 -1
  22. package/dist/core/composables/index.d.ts.map +1 -1
  23. package/dist/core/composables/useApiClient/index.d.ts.map +1 -1
  24. package/dist/core/composables/useAssets/index.d.ts.map +1 -1
  25. package/dist/core/composables/useBeforeUnload/index.d.ts +5 -0
  26. package/dist/core/composables/useBeforeUnload/index.d.ts.map +1 -0
  27. package/dist/core/composables/useMenuService/index.d.ts +16 -0
  28. package/dist/core/composables/useMenuService/index.d.ts.map +1 -0
  29. package/dist/core/composables/useNotifications/index.d.ts.map +1 -1
  30. package/dist/core/composables/useSettings/index.d.ts +2 -2
  31. package/dist/core/composables/useSettings/index.d.ts.map +1 -1
  32. package/dist/core/composables/useUser/index.d.ts +8 -6
  33. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  34. package/dist/core/interceptors/index.d.ts +3 -0
  35. package/dist/core/interceptors/index.d.ts.map +1 -0
  36. package/dist/core/plugins/i18n/index.d.ts.map +1 -1
  37. package/dist/core/plugins/modularity/index.d.ts +1 -1
  38. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  39. package/dist/core/plugins/moment/moment.d.ts.map +1 -1
  40. package/dist/core/plugins/signalR/index.d.ts.map +1 -1
  41. package/dist/core/types/index.d.ts +16 -29
  42. package/dist/core/types/index.d.ts.map +1 -1
  43. package/dist/{framework.mjs → framework.js} +32147 -32235
  44. package/dist/index.css +1 -1
  45. package/dist/index.d.ts +5 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/shared/components/app-switcher/components/vc-app-switcher/index.d.ts +1 -19
  48. package/dist/shared/components/app-switcher/components/vc-app-switcher/index.d.ts.map +1 -1
  49. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts +3 -0
  50. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -1
  51. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts +1 -70
  52. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts.map +1 -1
  53. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts +1 -82
  54. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
  55. package/dist/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.d.ts +28 -0
  56. package/dist/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.d.ts.map +1 -0
  57. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts +11 -27
  58. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  59. package/dist/shared/components/blade-navigation/injectionKeys.d.ts +4 -0
  60. package/dist/shared/components/blade-navigation/injectionKeys.d.ts.map +1 -0
  61. package/dist/shared/components/blade-navigation/plugin.d.ts +4 -1
  62. package/dist/shared/components/blade-navigation/plugin.d.ts.map +1 -1
  63. package/dist/shared/components/blade-navigation/types/index.d.ts +48 -35
  64. package/dist/shared/components/blade-navigation/types/index.d.ts.map +1 -1
  65. package/dist/shared/components/error-interceptor/index.d.ts +33 -67
  66. package/dist/shared/components/error-interceptor/index.d.ts.map +1 -1
  67. package/dist/shared/components/index.d.ts +2 -0
  68. package/dist/shared/components/index.d.ts.map +1 -1
  69. package/dist/shared/components/language-selector/index.d.ts +1 -49
  70. package/dist/shared/components/language-selector/index.d.ts.map +1 -1
  71. package/dist/shared/components/language-selector/language-selector.vue.d.ts +1 -40
  72. package/dist/shared/components/language-selector/language-selector.vue.d.ts.map +1 -1
  73. package/dist/{ui/components/organisms/vc-notification-dropdown → shared/components/notification-dropdown}/_internal/notification/notification.vue.d.ts +2 -2
  74. package/dist/shared/components/notification-dropdown/_internal/notification/notification.vue.d.ts.map +1 -0
  75. package/dist/shared/components/notification-dropdown/index.d.ts +7 -0
  76. package/dist/shared/components/notification-dropdown/index.d.ts.map +1 -0
  77. package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts +3 -0
  78. package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts.map +1 -0
  79. package/dist/shared/components/notification-template/index.d.ts +91 -0
  80. package/dist/shared/components/notification-template/index.d.ts.map +1 -0
  81. package/dist/{ui/components/organisms/vc-notification-template/vc-notification-template.vue.d.ts → shared/components/notification-template/notification-template.vue.d.ts} +2 -2
  82. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -0
  83. package/dist/shared/components/notifications/components/notification-container/index.d.ts +1 -1
  84. package/dist/shared/components/notifications/components/notification-container/index.d.ts.map +1 -1
  85. package/dist/shared/components/popup-handler/composables/usePopup/index.d.ts.map +1 -1
  86. package/dist/shared/components/user-dropdown-button/index.d.ts +10 -16
  87. package/dist/shared/components/user-dropdown-button/index.d.ts.map +1 -1
  88. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts +7 -4
  89. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  90. package/dist/shared/index.d.ts +4 -1
  91. package/dist/shared/index.d.ts.map +1 -1
  92. package/dist/shared/modules/assets/components/assets-details/assets-details.vue.d.ts +3 -0
  93. package/dist/shared/modules/assets/components/assets-details/assets-details.vue.d.ts.map +1 -1
  94. package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +3 -0
  95. package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -1
  96. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  97. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  98. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
  99. package/dist/shared/modules/dynamic/factories/types/index.d.ts +3 -1
  100. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  101. package/dist/shared/modules/dynamic/index.d.ts +1 -3
  102. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  103. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +12 -10
  104. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  105. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +5 -2
  106. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  107. package/dist/shared/modules/dynamic/types/index.d.ts +16 -1
  108. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  109. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  110. package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  111. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  112. package/dist/shared/utilities/vueUtils.d.ts.map +1 -1
  113. package/dist/tailwind.config.d.ts +56 -0
  114. package/dist/tailwind.config.d.ts.map +1 -0
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/dist/ui/components/atoms/vc-badge/index.d.ts +32 -67
  117. package/dist/ui/components/atoms/vc-badge/index.d.ts.map +1 -1
  118. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  119. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +6 -1
  120. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
  121. package/dist/ui/components/atoms/vc-card/index.d.ts +66 -102
  122. package/dist/ui/components/atoms/vc-card/index.d.ts.map +1 -1
  123. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +7 -0
  124. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -0
  125. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts +7 -1
  126. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
  127. package/dist/ui/components/atoms/vc-checkbox/index.d.ts +91 -129
  128. package/dist/ui/components/atoms/vc-checkbox/index.d.ts.map +1 -1
  129. package/dist/ui/components/atoms/vc-checkbox/vc-checkbox.vue.d.ts +7 -1
  130. package/dist/ui/components/atoms/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  131. package/dist/ui/components/atoms/vc-col/vc-col.vue.d.ts +6 -1
  132. package/dist/ui/components/atoms/vc-col/vc-col.vue.d.ts.map +1 -1
  133. package/dist/ui/components/atoms/vc-container/index.d.ts +36 -71
  134. package/dist/ui/components/atoms/vc-container/index.d.ts.map +1 -1
  135. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
  136. package/dist/ui/components/atoms/vc-hint/index.d.ts +8 -38
  137. package/dist/ui/components/atoms/vc-hint/index.d.ts.map +1 -1
  138. package/dist/ui/components/atoms/vc-hint/vc-hint.vue.d.ts.map +1 -1
  139. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +3 -0
  140. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
  141. package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts +3 -0
  142. package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts.map +1 -1
  143. package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts +3 -0
  144. package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts.map +1 -1
  145. package/dist/ui/components/atoms/vc-label/index.d.ts +42 -74
  146. package/dist/ui/components/atoms/vc-label/index.d.ts.map +1 -1
  147. package/dist/ui/components/atoms/vc-label/vc-label.vue.d.ts +7 -1
  148. package/dist/ui/components/atoms/vc-label/vc-label.vue.d.ts.map +1 -1
  149. package/dist/ui/components/atoms/vc-link/index.d.ts +32 -66
  150. package/dist/ui/components/atoms/vc-link/index.d.ts.map +1 -1
  151. package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
  152. package/dist/ui/components/atoms/vc-loading/vc-loading.vue.d.ts.map +1 -1
  153. package/dist/ui/components/atoms/vc-progress/index.d.ts +30 -63
  154. package/dist/ui/components/atoms/vc-progress/index.d.ts.map +1 -1
  155. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts +3 -0
  156. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  157. package/dist/ui/components/atoms/vc-row/vc-row.vue.d.ts +3 -1
  158. package/dist/ui/components/atoms/vc-row/vc-row.vue.d.ts.map +1 -1
  159. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts +6 -1
  160. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  161. package/dist/ui/components/atoms/vc-status-icon/vc-status-icon.vue.d.ts.map +1 -1
  162. package/dist/ui/components/atoms/vc-switch/vc-switch.vue.d.ts.map +1 -1
  163. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts +3 -0
  164. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  165. package/dist/ui/components/atoms/vc-widget/vc-widget.vue.d.ts.map +1 -1
  166. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts +3 -0
  167. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  168. package/dist/ui/components/molecules/vc-code-editor/index.d.ts +59 -98
  169. package/dist/ui/components/molecules/vc-code-editor/index.d.ts.map +1 -1
  170. package/dist/ui/components/molecules/vc-code-editor/vc-code-editor.vue.d.ts +1 -0
  171. package/dist/ui/components/molecules/vc-code-editor/vc-code-editor.vue.d.ts.map +1 -1
  172. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +4 -1
  173. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  174. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
  175. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts +3 -0
  176. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
  177. package/dist/ui/components/molecules/vc-file-upload/index.d.ts +67 -105
  178. package/dist/ui/components/molecules/vc-file-upload/index.d.ts.map +1 -1
  179. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts +3 -0
  180. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  181. package/dist/ui/components/molecules/vc-form/index.d.ts +8 -38
  182. package/dist/ui/components/molecules/vc-form/index.d.ts.map +1 -1
  183. package/dist/ui/components/molecules/vc-form/vc-form.vue.d.ts.map +1 -1
  184. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +56 -1
  185. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  186. package/dist/ui/components/molecules/vc-input-currency/index.d.ts +159 -214
  187. package/dist/ui/components/molecules/vc-input-currency/index.d.ts.map +1 -1
  188. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts +3 -0
  189. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
  190. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts +27 -9
  191. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts.map +1 -1
  192. package/dist/ui/components/molecules/vc-notification/vc-notification.vue.d.ts.map +1 -1
  193. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts +3 -0
  194. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  195. package/dist/ui/components/molecules/vc-rating/index.d.ts +59 -96
  196. package/dist/ui/components/molecules/vc-rating/index.d.ts.map +1 -1
  197. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +3 -0
  198. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
  199. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +257 -8
  200. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  201. package/dist/ui/components/molecules/vc-slider/index.d.ts +55 -91
  202. package/dist/ui/components/molecules/vc-slider/index.d.ts.map +1 -1
  203. package/dist/ui/components/molecules/vc-slider/vc-slider.vue.d.ts +3 -0
  204. package/dist/ui/components/molecules/vc-slider/vc-slider.vue.d.ts.map +1 -1
  205. package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +6 -1
  206. package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
  207. package/dist/ui/components/organisms/index.d.ts +0 -2
  208. package/dist/ui/components/organisms/index.d.ts.map +1 -1
  209. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts +2 -4
  210. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  211. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue.d.ts +10 -7
  212. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue.d.ts.map +1 -1
  213. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts +10 -18
  214. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts.map +1 -1
  215. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts +16 -16
  216. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  217. package/dist/ui/components/organisms/vc-app/index.d.ts +1 -292
  218. package/dist/ui/components/organisms/vc-app/index.d.ts.map +1 -1
  219. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +17 -56
  220. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  221. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  222. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts +3 -0
  223. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  224. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts +3 -0
  225. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
  226. package/dist/ui/components/organisms/vc-blade/index.d.ts +89 -131
  227. package/dist/ui/components/organisms/vc-blade/index.d.ts.map +1 -1
  228. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +3 -0
  229. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  230. package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts +21 -18
  231. package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  232. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +4 -1
  233. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts.map +1 -1
  234. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts +4 -1
  235. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  236. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +3 -0
  237. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
  238. package/dist/ui/components/organisms/vc-login-form/index.d.ts +32 -66
  239. package/dist/ui/components/organisms/vc-login-form/index.d.ts.map +1 -1
  240. package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts +3 -0
  241. package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts.map +1 -1
  242. package/dist/ui/components/organisms/vc-popup/_internal/vc-popup-error/vc-popup-error.vue.d.ts.map +1 -1
  243. package/dist/ui/components/organisms/vc-popup/_internal/vc-popup-warning/vc-popup-warning.vue.d.ts.map +1 -1
  244. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  245. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts +3 -0
  246. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  247. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts +3 -0
  248. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts.map +1 -1
  249. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts +3 -0
  250. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  251. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +57 -6
  252. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  253. package/dist/ui/types/index.d.ts +5 -45
  254. package/dist/ui/types/index.d.ts.map +1 -1
  255. package/package.json +26 -30
  256. package/shared/components/app-switcher/components/vc-app-switcher/index.ts +1 -3
  257. package/shared/components/app-switcher/composables/useAppSwitcher/index.ts +2 -2
  258. package/shared/components/blade-navigation/components/vc-blade-navigation/index.ts +1 -3
  259. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +46 -157
  260. package/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.ts +81 -0
  261. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +323 -261
  262. package/shared/components/blade-navigation/injectionKeys.ts +4 -0
  263. package/shared/components/blade-navigation/plugin.ts +8 -10
  264. package/shared/components/blade-navigation/types/index.ts +53 -44
  265. package/shared/components/index.ts +2 -0
  266. package/shared/components/language-selector/language-selector.vue +12 -12
  267. package/{ui/components/organisms/vc-notification-dropdown → shared/components/notification-dropdown}/_internal/notification/notification.vue +6 -5
  268. package/shared/components/notification-dropdown/index.ts +10 -0
  269. package/{ui/components/organisms/vc-notification-dropdown/vc-notification-dropdown.vue → shared/components/notification-dropdown/notification-dropdown.vue} +21 -17
  270. package/shared/components/notification-template/index.ts +10 -0
  271. package/{ui/components/organisms/vc-notification-template/vc-notification-template.vue → shared/components/notification-template/notification-template.vue} +2 -2
  272. package/shared/components/popup-handler/composables/usePopup/index.ts +29 -9
  273. package/shared/components/user-dropdown-button/user-dropdown-button.vue +58 -17
  274. package/shared/index.ts +3 -2
  275. package/shared/locales/en.json +7 -0
  276. package/shared/modules/assets/components/assets-details/assets-details.vue +5 -0
  277. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +8 -5
  278. package/shared/modules/dynamic/components/fields/GalleryField.ts +7 -7
  279. package/shared/modules/dynamic/components/fields/InputCurrency.ts +2 -1
  280. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +42 -36
  281. package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +5 -3
  282. package/shared/modules/dynamic/factories/types/index.ts +6 -2
  283. package/shared/modules/dynamic/helpers/override.ts +38 -32
  284. package/shared/modules/dynamic/helpers/safeIn.ts +1 -1
  285. package/shared/modules/dynamic/index.ts +12 -12
  286. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +96 -57
  287. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +133 -118
  288. package/shared/modules/dynamic/types/index.ts +16 -1
  289. package/shared/pages/InvitePage/components/invite/Invite.vue +2 -2
  290. package/shared/pages/LoginPage/components/login/Login.vue +23 -16
  291. package/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue +3 -3
  292. package/shared/utilities/vueUtils.ts +7 -7
  293. package/tailwind.config.ts +50 -0
  294. package/ui/components/atoms/vc-button/vc-button.vue +1 -1
  295. package/ui/components/atoms/vc-card/vc-card.stories.ts +25 -0
  296. package/ui/components/atoms/vc-card/vc-card.vue +1 -1
  297. package/ui/components/atoms/vc-container/vc-container.vue +1 -1
  298. package/ui/components/atoms/vc-icon/vc-icon.vue +1 -1
  299. package/ui/components/molecules/vc-editor/vc-editor.vue +2 -7
  300. package/ui/components/molecules/vc-notification/vc-notification.vue +2 -2
  301. package/ui/components/molecules/vc-select/vc-select.vue +13 -13
  302. package/ui/components/organisms/index.ts +0 -2
  303. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +25 -42
  304. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +123 -25
  305. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue +11 -103
  306. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +34 -52
  307. package/ui/components/organisms/vc-app/index.ts +1 -12
  308. package/ui/components/organisms/vc-app/vc-app.stories.ts +36 -36
  309. package/ui/components/organisms/vc-app/vc-app.vue +122 -61
  310. package/ui/components/organisms/vc-blade/vc-blade.vue +5 -13
  311. package/ui/components/organisms/vc-table/vc-table.vue +9 -9
  312. package/ui/locales/en.json +2 -4
  313. package/ui/types/index.ts +7 -51
  314. package/core/composables/useMenuComposer/index.ts +0 -25
  315. package/dist/core/composables/useMenuComposer/index.d.ts +0 -12
  316. package/dist/core/composables/useMenuComposer/index.d.ts.map +0 -1
  317. package/dist/ui/components/organisms/vc-notification-dropdown/_internal/notification/notification.vue.d.ts.map +0 -1
  318. package/dist/ui/components/organisms/vc-notification-dropdown/index.d.ts +0 -38
  319. package/dist/ui/components/organisms/vc-notification-dropdown/index.d.ts.map +0 -1
  320. package/dist/ui/components/organisms/vc-notification-dropdown/vc-notification-dropdown.vue.d.ts +0 -21
  321. package/dist/ui/components/organisms/vc-notification-dropdown/vc-notification-dropdown.vue.d.ts.map +0 -1
  322. package/dist/ui/components/organisms/vc-notification-template/index.d.ts +0 -2
  323. package/dist/ui/components/organisms/vc-notification-template/index.d.ts.map +0 -1
  324. package/dist/ui/components/organisms/vc-notification-template/vc-notification-template.vue.d.ts.map +0 -1
  325. package/dist/utils/isInDemoMode.d.ts +0 -2
  326. package/dist/utils/isInDemoMode.d.ts.map +0 -1
  327. package/dist/vite.config.d.ts +0 -3
  328. package/dist/vite.config.d.ts.map +0 -1
  329. package/tailwind.config.js +0 -50
  330. package/ui/components/organisms/vc-notification-dropdown/index.ts +0 -3
  331. package/ui/components/organisms/vc-notification-template/index.ts +0 -1
@@ -1,356 +1,418 @@
1
+ import { reactiveComputed } from "@vueuse/core";
2
+ import { nextTick } from "vue";
1
3
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { computed, ref, unref, watch, Ref, getCurrentInstance, markRaw, inject, nextTick, warn, Component } from "vue";
4
+ import {
5
+ computed,
6
+ Ref,
7
+ getCurrentInstance,
8
+ inject,
9
+ warn,
10
+ Component,
11
+ watch,
12
+ isVNode,
13
+ h,
14
+ shallowRef,
15
+ ComputedRef,
16
+ } from "vue";
3
17
  import * as _ from "lodash-es";
4
- import { useRouter, RouteLocationNormalized } from "vue-router";
5
- import { usePermissions } from "../../../../../core/composables";
18
+ import { RouteLocationNormalized, useRoute, RouteRecordNormalized, NavigationFailure } from "vue-router";
19
+ import { bladeNavigationInstance } from "../../plugin";
6
20
  import {
7
- IBladeContainer,
8
- IBladeRef,
9
- IBladeEvent,
10
- IParentCallArgs,
11
21
  BladeComponentInternalInstance,
12
22
  BladeNavigationPlugin,
13
- notification,
23
+ BladeVNode,
24
+ IBladeEvent,
25
+ IParentCallArgs,
14
26
  BladeInstanceConstructor,
15
- } from "../../../..";
16
- import { bladeNavigationInstance } from "../../plugin";
17
- import pattern from "url-pattern";
18
- import { useLocalStorage } from "@vueuse/core";
27
+ BladeRouteRecordLocationNormalized,
28
+ } from "../../types";
29
+ import { navigationViewLocation } from "../../injectionKeys";
30
+ import { generateId } from "../../../../../core/utilities";
19
31
 
20
- interface BladeData {
21
- blade?: string;
22
- param?: string;
23
- options?: string;
24
- }
32
+ type TParsedRoute = {
33
+ blade: string;
34
+ param: string | null;
35
+ name: string;
36
+ };
25
37
 
26
38
  interface IUseBladeNavigation {
27
- readonly blades: Ref<IBladeContainer[]>;
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- readonly workspaceOptions: Ref<Record<string, any>> | Ref<undefined>;
30
- readonly workspaceParam: Ref<string> | Ref<undefined>;
31
- readonly lastBladeData: Ref<BladeData>;
32
- bladesRefs: Ref<IBladeRef[]>;
33
- activeBlade: Ref<IBladeContainer>;
39
+ readonly blades: ComputedRef<BladeRouteRecordLocationNormalized | undefined>;
40
+ readonly currentBladeNavigationData: ComputedRef<BladeVNode["props"]["navigation"]>;
34
41
  openBlade: <Blade extends Component>(
35
42
  { blade, param, options, onOpen, onClose }: IBladeEvent<Blade>,
36
- isWorkspace?: boolean
37
- ) => void;
38
- closeBlade: (index: number) => Promise<boolean | undefined>;
39
- onParentCall: (index: number, args: IParentCallArgs) => void;
40
- /**
41
- * Resolves blades from vue-router's navigation guard 'to' param. Used to display blades after page reload or accessing via direct link.
42
- * Returns a string containing the URL of the latest opened workspace.
43
- * @param to
44
- * @returns string
45
- */
46
- resolveBlades: (to: RouteLocationNormalized) => string | unknown;
47
- resolveLastBlade: (pages: BladeInstanceConstructor[]) => void;
48
- resolveUnknownRoutes: (to: RouteLocationNormalized) => string | unknown;
49
- resolveBladeByName: (name: string) => BladeInstanceConstructor<any>;
43
+ isWorkspace?: boolean,
44
+ ) => Promise<void | NavigationFailure>;
45
+ closeBlade: (index: number, changeLocation?: boolean) => Promise<false | void | NavigationFailure>;
46
+ onParentCall: (parentExposedMethods: Record<string, any>, args: IParentCallArgs) => void;
47
+ resolveBladeByName: (name: string) => BladeInstanceConstructor;
48
+ routeResolver: (to: RouteLocationNormalized) => Promise<void | NavigationFailure | undefined> | undefined;
49
+ getCurrentBlade: () => BladeVNode;
50
50
  }
51
51
 
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- const workspaceOptions: Ref<Record<string, any>> | Ref<undefined> = ref();
54
- const workspaceParam: Ref<string> | Ref<undefined> = ref();
55
- const activeBlade = ref();
56
- const lastBladeData = useLocalStorage<BladeData>("VC_BLADE_DATA", {});
52
+ const activeWorkspace = shallowRef<BladeVNode>();
57
53
 
58
54
  export function useBladeNavigation(): IUseBladeNavigation {
59
- const router = useRouter();
60
- const urlPattern = new pattern("(/:workspace(/:blade(/:param)))");
61
- const { hasAccess } = usePermissions();
62
- const isPrevented = ref(false);
63
- const routes = router.getRoutes();
55
+ const navigationView = inject(navigationViewLocation, undefined) as BladeVNode;
56
+
57
+ const route = useRoute();
64
58
 
65
59
  const instance: BladeComponentInternalInstance = getCurrentInstance() as BladeComponentInternalInstance;
66
60
  const navigationInstance =
67
- (instance && inject<BladeNavigationPlugin>("bladeNavigationPlugin")) || bladeNavigationInstance;
61
+ (instance !== null && inject<BladeNavigationPlugin>("bladeNavigationPlugin")) || bladeNavigationInstance;
62
+
63
+ const router = navigationInstance?.router;
64
+
65
+ const routes = router.getRoutes();
66
+
67
+ const mainRouteName = router.getRoutes().find((r) => r.meta?.root)?.name as string;
68
+
69
+ const blades = computed(() => {
70
+ return router.getRoutes().find((routeItem) => {
71
+ return route.name === routeItem.name;
72
+ });
73
+ }) as ComputedRef<BladeRouteRecordLocationNormalized>;
68
74
 
69
75
  watch(
70
- navigationInstance?.blades,
76
+ () => route.path,
71
77
  (newVal) => {
72
- if (newVal) {
73
- const workspace = navigationInstance.bladesRefs.value[0]?.blade;
74
- const lastBlade = newVal[newVal.length - 1];
75
-
76
- if (workspace && workspace.blade?.url) {
77
- let url: string;
78
- if (lastBlade && lastBlade.blade?.url) {
79
- url = urlPattern.stringify({
80
- workspace: workspace?.blade.url.substring(1),
81
- blade: lastBlade?.blade.url.substring(1),
82
- param: lastBlade?.param,
83
- });
84
- } else {
85
- url = workspace?.blade.url;
86
- }
78
+ const workspaceUrl = newVal.split("/").slice(0, 2).join("/");
87
79
 
88
- if (url) addEntryToLocation(url);
89
- }
80
+ const wsRouteComponent = routes.find((x) => x.path === workspaceUrl)?.components?.default as BladeVNode;
81
+
82
+ if (wsRouteComponent && wsRouteComponent.type?.isWorkspace) {
83
+ activeWorkspace.value = wsRouteComponent;
90
84
  }
91
85
  },
92
- { deep: true }
86
+ { immediate: true },
93
87
  );
94
88
 
95
89
  async function openWorkspace<Blade extends Component>({ blade, param, options }: IBladeEvent<Blade>) {
96
- await closeBlade(0);
97
-
98
- const bladeComponent = unref(blade);
99
-
100
- if (!isPrevented.value && bladeComponent?.url) {
101
- await router.replace(bladeComponent.url as string);
102
-
103
- await nextTick(() => {
104
- workspaceOptions.value = unref(options);
105
- workspaceParam.value = unref(param);
106
- });
107
- }
108
- }
90
+ const createdComponent = h(blade, { param, options }) as BladeVNode;
91
+
92
+ try {
93
+ if (createdComponent.type?.url) {
94
+ router.addRoute(mainRouteName, {
95
+ name: createdComponent.type?.name,
96
+ path: createdComponent.type?.url,
97
+ components: {
98
+ default: createdComponent,
99
+ },
100
+ });
109
101
 
110
- function isBladeComponent(
111
- component:
112
- | Omit<BladeComponentInternalInstance["vnode"]["type"], "__isFragment">
113
- | InstanceType<BladeInstanceConstructor>
114
- ) {
115
- if (!instance) {
116
- warn("isBladeComponent can only be used in setup().");
117
- return;
102
+ return await router.push({ path: createdComponent.type?.url as string });
103
+ }
104
+ } catch (e) {
105
+ console.log(e);
106
+ throw new Error(`Opening workspace '${blade.type.name}' is prevented`);
118
107
  }
119
- const foundComponent = _.find(instance.appContext.components, component);
120
-
121
- return foundComponent && "isBladeComponent" in foundComponent && !!foundComponent.isBladeComponent;
122
108
  }
123
109
 
124
110
  async function openBlade<Blade extends Component>(
125
111
  { blade, param, options, onOpen, onClose }: IBladeEvent<Blade>,
126
- isWorkspace = false
112
+ isWorkspace = false,
113
+ // update = true,
127
114
  ) {
128
115
  if (!blade) {
129
116
  throw new Error("You should pass blade component as openBlade argument");
130
117
  }
118
+
131
119
  if (isWorkspace) {
132
- openWorkspace({ blade, param, options });
133
- return;
120
+ return await openWorkspace({ blade, param, options });
134
121
  }
135
122
 
136
- await nextTick();
123
+ const allRoutes = router.getRoutes();
137
124
 
138
- clearParentData();
139
-
140
- if (instance) {
141
- // caller blade component
142
- const instanceComponent = isBladeComponent(instance.vnode.type)
143
- ? instance.vnode.type
144
- : navigationInstance.bladesRefs.value.find((item) => item.active)?.blade?.blade;
125
+ try {
126
+ const instanceComponent = navigationView || activeWorkspace.value;
145
127
 
146
128
  if (instanceComponent) {
147
- // Caller blade index in blades array
148
- const callerIndex = navigationInstance.bladesRefs.value.findIndex((item) => {
149
- return _.isEqual(item.blade.blade, instanceComponent);
129
+ const initialBlade = allRoutes.find(
130
+ (x) =>
131
+ x?.path ===
132
+ (instanceComponent.props?.navigation?.fullPath
133
+ ? instanceComponent.props?.navigation?.fullPath
134
+ : activeWorkspace.value?.type.url),
135
+ );
136
+
137
+ const url = initialBlade?.path + (blade.url ? blade.url + (param ? "/" + param : "") : "");
138
+
139
+ /**
140
+ * Removes routes without paths and default route from next route.
141
+ */
142
+ const alreadyAdded = _.omitBy(initialBlade?.components, (value: BladeVNode, key) =>
143
+ blade.url ? !value?.props?.navigation?.bladePath : false || key === "default",
144
+ );
145
+
146
+ const currentBladeIdx = instanceComponent.props?.navigation?.idx ? instanceComponent.props?.navigation?.idx : 0;
147
+
148
+ /**
149
+ * Closes all child blades in current route to prevent blades without url to preserve.
150
+ */
151
+ await closeBlade(currentBladeIdx + 1, false);
152
+
153
+ const isInitialBlade = activeWorkspace.value?.type.url === url;
154
+
155
+ const bladeNode = h(
156
+ blade,
157
+ Object.assign(
158
+ {},
159
+ reactiveComputed(() => ({ options, param })),
160
+ {
161
+ navigation: {
162
+ bladePath: blade.url ? blade.url + (param ? "/" + param : "") : undefined,
163
+ fullPath: url,
164
+ onClose,
165
+ onOpen,
166
+ idx: currentBladeIdx + 1,
167
+ uniqueRouteKey: generateId(),
168
+ },
169
+ },
170
+ ),
171
+ );
172
+
173
+ router.addRoute(mainRouteName, {
174
+ name: isInitialBlade ? activeWorkspace.value?.type.name : url,
175
+ path: url,
176
+ components: Object.assign(
177
+ {},
178
+ { default: activeWorkspace.value },
179
+ { ...alreadyAdded },
180
+ blade.url
181
+ ? {
182
+ [url]: bladeNode,
183
+ }
184
+ : {
185
+ [blade.name]: bladeNode,
186
+ },
187
+ ),
188
+ meta: {
189
+ permissions: activeWorkspace.value && mergePermissions(activeWorkspace.value, blade),
190
+ },
150
191
  });
151
192
 
152
- // Trying to determine if the calling blade already has a child in order to replace it
153
- const isBladeAlreadyExist =
154
- callerIndex >= 0 ? navigationInstance.bladesRefs.value[callerIndex + 1]?.blade.blade : undefined;
155
-
156
- // Blade we want to open
157
- const bladeComponent = unref(blade);
158
-
159
- // Check if caller blade has idx
160
- const index = instanceComponent?.idx ? instanceComponent.idx : 0;
161
-
162
- if (isBladeAlreadyExist === undefined) {
163
- bladeComponent.idx = index ? index + 1 : 1;
164
- } else if (isBladeAlreadyExist) {
165
- await closeBlade(
166
- navigationInstance.blades.value.findIndex((x: IBladeContainer) => x.idx === isBladeAlreadyExist.idx)
167
- );
168
- bladeComponent.idx = isBladeAlreadyExist.idx;
169
- }
170
- if (!isPrevented.value) {
171
- await addBlade(bladeComponent, param, options, onOpen, onClose, index);
172
- }
193
+ return await router.push({
194
+ path: url,
195
+ });
173
196
  }
197
+ } catch (e) {
198
+ console.error(e);
174
199
  }
175
200
  }
176
201
 
177
- async function closeBlade(index: number) {
178
- console.debug(`[@vc-shell/framework#useBladeNavigation] - closeBlade called.`);
179
- const refsIndex = index + 1;
180
-
181
- if (refsIndex < navigationInstance.bladesRefs.value.length) {
182
- const children = navigationInstance.bladesRefs.value.slice(refsIndex).reverse();
183
-
184
- isPrevented.value = false;
185
- for (let i = 0; i < children.length; i++) {
186
- if (children[i]?.exposed.onBeforeClose && typeof children[i].exposed.onBeforeClose === "function") {
187
- const result = await children[i].exposed.onBeforeClose?.();
188
- if (result === false) {
189
- isPrevented.value = true;
190
- console.debug(`[@vc-shell/framework#useBladeNavigation] - Navigation is prevented`);
191
- return isPrevented.value;
192
- }
193
- }
202
+ function mergePermissions(workspaceBlade: BladeVNode, childBlade: BladeVNode | BladeInstanceConstructor) {
203
+ const child = (isVNode(childBlade) ? childBlade : h(childBlade)) as BladeVNode;
204
+ if (child && child.type?.permissions) {
205
+ const childPermissionsArr =
206
+ typeof child.type.permissions === "string" ? [child.type.permissions] : child.type.permissions;
207
+ if (workspaceBlade.type.permissions) {
208
+ const workspacePermissionsArr =
209
+ typeof workspaceBlade.type.permissions === "string"
210
+ ? [workspaceBlade.type.permissions]
211
+ : workspaceBlade.type.permissions;
212
+ return workspacePermissionsArr.concat(childPermissionsArr);
213
+ } else {
214
+ return childPermissionsArr;
194
215
  }
195
- if (!isPrevented.value) {
196
- const blade = navigationInstance.blades.value[index];
197
- if (typeof blade?.onClose === "function") {
198
- blade?.onClose?.();
199
- }
216
+ } else return workspaceBlade.type.permissions;
217
+ }
200
218
 
201
- navigationInstance.blades.value.splice(index);
202
- }
203
- }
219
+ function removeSubstring(inputString: string, substringToRemove: string) {
220
+ const regex = new RegExp(`${substringToRemove}+$`);
221
+ return inputString.replace(regex, "");
204
222
  }
205
223
 
206
- async function addBlade(
207
- blade: BladeInstanceConstructor,
208
- param?: string,
209
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
210
- options?: Record<string, any>,
211
- onOpen?: () => void,
212
- onClose?: () => void,
213
- index?: number
214
- ) {
215
- if (index && navigationInstance.blades.value.length > index) {
216
- await closeBlade(index);
217
- }
224
+ async function closeBlade(index: number, changeLocation = true) {
225
+ console.debug(`[@vc-shell/framework#useBladeNavigation] - closeBlade called.`);
218
226
 
219
- if (hasAccess(blade.permissions)) {
220
- navigationInstance.blades.value.push({
221
- blade: markRaw(blade),
222
- options,
223
- param,
224
- onOpen,
225
- onClose,
226
- idx: blade.idx,
227
- });
227
+ const bladeByIndex = Object.values(blades.value?.components || {}).find(
228
+ (x) => "props" in x && x.props?.navigation?.idx === index,
229
+ ) as BladeVNode;
228
230
 
229
- if (onOpen && typeof onOpen === "function") {
230
- onOpen();
231
- }
232
- } else {
233
- notification.error("Access restricted", {
234
- timeout: 3000,
235
- });
231
+ if (bladeByIndex && bladeByIndex?.props?.navigation?.bladePath) {
232
+ const path = removeSubstring(bladeByIndex.props.navigation.fullPath, bladeByIndex.props.navigation?.bladePath);
233
+
234
+ return changeLocation && (await router.replace(path));
236
235
  }
237
- }
238
236
 
239
- async function onParentCall(index: number, args: IParentCallArgs) {
240
- console.debug(`vc-app#onParentCall(${index}, { method: ${args.method} }) called.`);
237
+ const routeWithNamedBlade = router.getRoutes().find((r) => r.path === bladeByIndex?.props?.navigation?.fullPath);
241
238
 
242
- if (index >= 0) {
243
- const currentParent = unref(navigationInstance.bladesRefs.value[index]);
239
+ if (routeWithNamedBlade) {
240
+ const isInitialBlade = activeWorkspace.value?.type.name === routeWithNamedBlade.name;
244
241
 
245
- if (currentParent) {
246
- if (args.method && typeof currentParent.exposed[args.method] === "function") {
247
- const method = currentParent.exposed[args.method] as (args: unknown) => Promise<unknown>;
248
- const result = await method(args.args);
249
- if (typeof args.callback === "function") {
250
- args.callback(result);
242
+ router.addRoute(mainRouteName, {
243
+ name: isInitialBlade ? routeWithNamedBlade?.name : routeWithNamedBlade?.path,
244
+ path: routeWithNamedBlade?.path,
245
+ components: _.omitBy(routeWithNamedBlade?.components, (value: BladeVNode) => {
246
+ if (value.props && value.props.navigation && bladeByIndex.props) {
247
+ return value.props.navigation.idx >= bladeByIndex.props.navigation.idx;
251
248
  }
252
- } else {
253
- console.error(`No such method: ${args.method}.`);
254
- }
255
- }
249
+ }) as Record<string, BladeVNode>,
250
+ });
251
+
252
+ return changeLocation && (await router.replace(routeWithNamedBlade?.path));
256
253
  }
257
254
  }
258
255
 
259
- function addEntryToLocation(params: string) {
260
- history.replaceState({}, "", "#" + params);
261
- }
256
+ async function onParentCall(parentExposedMethods: Record<string, any>, args: IParentCallArgs) {
257
+ console.debug(`vc-app#onParentCall({ method: ${args.method} }) called.`);
262
258
 
263
- async function clearParentData() {
264
- nextTick(() => {
265
- workspaceOptions.value = undefined;
266
- workspaceParam.value = undefined;
267
- });
259
+ if (args.method && typeof parentExposedMethods[args.method] === "function") {
260
+ const method = parentExposedMethods[args.method] as (args: unknown) => Promise<unknown>;
261
+ const result = await method(args.args);
262
+ if (typeof args.callback === "function") {
263
+ args.callback(result);
264
+ }
265
+ } else {
266
+ console.error(
267
+ `No such method: ${args.method}. Please, add method with name ${args.method} and use defineExpose to expose it in parent blade`,
268
+ );
269
+ }
268
270
  }
269
271
 
270
- function resolveBlades(to: RouteLocationNormalized) {
271
- const data = urlPattern.match(to.path);
272
+ function resolveBladeByName(name: string): BladeInstanceConstructor {
273
+ if (!instance) {
274
+ warn("resolveComponentByName can only be used in setup().");
272
275
 
273
- const resolvedRoute = (bladeUrl: string) => routes.find((r) => r.path === "/" + bladeUrl);
276
+ return null as any; // Return type inferred as any due to the early return
277
+ }
274
278
 
275
- if (resolvedRoute(data?.workspace) && to.path !== "/" + data.workspace) {
276
- if (resolvedRoute(data?.blade)) {
277
- lastBladeData.value = {
278
- blade: "/" + data?.blade,
279
- param: data?.param,
280
- };
281
- }
279
+ if (!name) {
280
+ throw new Error("Blade name is required.");
281
+ }
282
282
 
283
- return "/" + data.workspace;
283
+ const components = instance?.appContext.components;
284
+ if (components[name]) {
285
+ return components[name] as BladeInstanceConstructor;
286
+ } else {
287
+ throw new Error(`Blade '${name}' not found.`);
284
288
  }
285
289
  }
286
290
 
287
- function resolveUnknownRoutes(to: RouteLocationNormalized) {
288
- if (routes.find((r) => r.path !== to.path)) {
289
- closeBlade(0);
290
- return "/";
291
+ function routeResolver(to: RouteLocationNormalized) {
292
+ if (!hasNecessaryRoute(to)) {
293
+ return generateRoute(to, router.getRoutes());
291
294
  }
292
295
  }
293
296
 
294
- function clearSavedBladeData() {
295
- lastBladeData.value = {};
297
+ function hasNecessaryRoute(to: RouteLocationNormalized) {
298
+ return routes.find((route) => route.path === to.path);
296
299
  }
297
300
 
298
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
299
- async function setParentData({ param, options }: { param?: string; options?: Record<string, any> }) {
300
- workspaceOptions.value = options;
301
- workspaceParam.value = param;
302
- }
301
+ async function generateRoute(to: RouteLocationNormalized, routes: RouteRecordNormalized[]) {
302
+ const parsedRoutes: TParsedRoute[] = parseRoutes(to.path, routes);
303
+
304
+ const workspace = parsedRoutes[0];
305
+ const workspaceComponent = routes.find((route) => route.path === workspace.blade)?.components
306
+ ?.default as BladeVNode;
307
+
308
+ if (workspaceComponent) {
309
+ const children: Record<string, BladeVNode> = {};
310
+
311
+ parsedRoutes
312
+ .filter((r) => r !== workspace)
313
+ .forEach((parsedRoute, index) => {
314
+ const registeredRouteComponent = routes.find((route) => route.path === parsedRoute.blade)?.components
315
+ ?.default;
316
+
317
+ if (registeredRouteComponent && parsedRoute.name) {
318
+ children[parsedRoute.name] = _.merge(registeredRouteComponent, {
319
+ props: {
320
+ param: parsedRoute.param,
321
+ navigation: {
322
+ bladePath: parsedRoute.blade + (parsedRoute.param ? "/" + parsedRoute.param : ""),
323
+ fullPath: parsedRoute.name,
324
+ idx: index + 1,
325
+ uniqueRouteKey: generateId(),
326
+ },
327
+ },
328
+ }) as BladeVNode;
329
+
330
+ // Add routes one by one
331
+ router.addRoute(mainRouteName, {
332
+ name: parsedRoute.name,
333
+ path: parsedRoute.name,
334
+ components: {
335
+ default: workspaceComponent,
336
+ ...children,
337
+ },
338
+ meta: {
339
+ permissions: children[parsedRoute.name].type?.permissions,
340
+ },
341
+ });
342
+ }
343
+ });
303
344
 
304
- function resolveLastBlade(pages: BladeInstanceConstructor[]) {
305
- if (lastBladeData.value?.blade) {
306
- const blade = pages?.find((b) => b.url === lastBladeData.value?.blade);
307
- setParentData({ param: lastBladeData.value?.param });
345
+ const mergedPermissions = Object.values(children)
346
+ .filter((childComponent) => childComponent.type.permissions)
347
+ .flatMap((comp) => mergePermissions(workspaceComponent, comp));
348
+
349
+ // Add summary route
350
+ router.addRoute(mainRouteName, {
351
+ name: to.path,
352
+ path: to.path,
353
+ components: {
354
+ default: _.merge(workspaceComponent, { props: { param: Object.values(children)[0].props?.param } }),
355
+ ...children,
356
+ },
357
+ meta: {
358
+ permissions: mergedPermissions.length ? mergedPermissions : undefined,
359
+ },
360
+ });
308
361
 
309
- if (blade && !isBladeAlreadyOpened({ blade, param: lastBladeData.value?.param })) {
310
- openBlade({ blade, param: lastBladeData.value?.param });
311
- clearSavedBladeData();
312
- }
313
- }
362
+ return router.push(to.path);
363
+ } else return router.push({ name: mainRouteName });
314
364
  }
315
365
 
316
- function isBladeAlreadyOpened(args: { blade: BladeInstanceConstructor; param?: string }) {
317
- return navigationInstance?.blades.value.some((x) => {
318
- return x.blade === args.blade && x.param === args.param;
319
- });
320
- }
366
+ function parseRoutes(route: string, commonRoutes: RouteRecordNormalized[]) {
367
+ const parts: string[] = route.split("/").filter((part) => part !== "");
368
+ const result = [];
369
+ let currentBlade = "";
370
+ let currentName = "";
321
371
 
322
- function resolveBladeByName(name: string): BladeInstanceConstructor<any> {
323
- if (!instance) {
324
- warn("resolveComponentByName can only be used in setup().");
372
+ for (let i = 0; i < parts.length; i++) {
373
+ currentBlade = "/" + parts[i];
374
+ let currentParam = null;
325
375
 
326
- return null as any; // Return type inferred as any due to the early return
327
- }
376
+ if (i + 1 < parts.length) {
377
+ const nextPart = "/" + parts.slice(i + 1, i + 2).join("/");
378
+ currentName += currentBlade;
328
379
 
329
- if (!name) {
330
- throw new Error("blade name is required");
331
- }
380
+ if (!commonRoutes.some((route) => nextPart === route.path)) {
381
+ currentParam = parts[i + 1];
382
+ currentName += "/" + currentParam;
383
+ i++; // Skip the next part as it's a param
384
+ }
385
+ } else if (i < parts.length) {
386
+ const nextPart = "/" + parts.slice(i).join("/");
387
+ currentName += nextPart;
388
+ }
332
389
 
333
- const components = instance?.appContext.components;
334
- if (components[name]) {
335
- return components[name] as BladeInstanceConstructor<any>;
336
- } else {
337
- throw new Error("Blade not found");
390
+ result.push({
391
+ blade: currentBlade,
392
+ param: currentParam,
393
+ name: currentName,
394
+ });
338
395
  }
396
+
397
+ return result;
398
+ }
399
+
400
+ function getCurrentBlade(): BladeVNode {
401
+ return instance.vnode;
339
402
  }
340
403
 
404
+ const currentBladeNavigationData = computed(
405
+ () => (instance && (instance.vnode.props?.navigation as BladeVNode["props"]["navigation"])) ?? undefined,
406
+ );
407
+
341
408
  return {
342
- blades: computed(() => navigationInstance?.blades.value),
343
- workspaceOptions: computed(() => workspaceOptions.value),
344
- workspaceParam: computed(() => workspaceParam.value),
345
- lastBladeData: computed(() => lastBladeData.value),
346
- activeBlade,
347
- bladesRefs: navigationInstance?.bladesRefs,
409
+ blades,
348
410
  openBlade,
349
411
  closeBlade,
350
412
  onParentCall,
351
- resolveBlades,
352
- resolveUnknownRoutes,
353
- resolveLastBlade,
354
413
  resolveBladeByName,
414
+ routeResolver,
415
+ getCurrentBlade,
416
+ currentBladeNavigationData,
355
417
  };
356
418
  }