@vc-shell/framework 1.1.0 → 1.1.2

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 (210) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/assets/apl-NdZ6-T1z.js +142 -0
  3. package/dist/assets/asciiarmor-CmJEbAuq.js +56 -0
  4. package/dist/assets/asn1-Ctc8K72v.js +192 -0
  5. package/dist/assets/asterisk-D6r__RMF.js +187 -0
  6. package/dist/assets/brainfuck-COwWCBpq.js +70 -0
  7. package/dist/assets/clike-C-PtfL50.js +1019 -0
  8. package/dist/assets/clojure-C2XPrGCa.js +274 -0
  9. package/dist/assets/cmake-BGrEgXCL.js +81 -0
  10. package/dist/assets/cobol-DShPmpZe.js +234 -0
  11. package/dist/assets/coffeescript-BG8vTfSz.js +329 -0
  12. package/dist/assets/commonlisp-8oE2EpEe.js +108 -0
  13. package/dist/assets/core-api-BMLS9FrT.js +8288 -0
  14. package/dist/assets/core-composables-DYxpIWyY.js +1799 -0
  15. package/dist/assets/core-constants-DiKDBbnD.js +83 -0
  16. package/dist/assets/core-directives-QhJx9kWh.js +41 -0
  17. package/dist/assets/core-interceptors-CSjUvxQ0.js +78 -0
  18. package/dist/assets/core-plugins-wv2bDZ0l.js +4919 -0
  19. package/dist/assets/core-services-CAfJRsjs.js +4 -0
  20. package/dist/assets/core-utilities-BTktq_a-.js +33 -0
  21. package/dist/assets/crystal--rIRMl16.js +419 -0
  22. package/dist/assets/css/core-directives-FL4vIIkN.css +73 -0
  23. package/dist/assets/css/fonts-M1mtyV8L.css +305 -0
  24. package/dist/assets/css/icons-css-DbCVsovz.css +41 -0
  25. package/dist/assets/css/shared-components-bnLHdCtf.css +429 -0
  26. package/dist/assets/css/shared-modules-CNOICmYQ.css +45 -0
  27. package/dist/assets/css/styles-C62nDZwV.css +4096 -0
  28. package/dist/assets/css/ui-app-Bh9hmlIB.css +1287 -0
  29. package/dist/assets/css/ui-content-B29jsmK7.css +1187 -0
  30. package/dist/assets/css/ui-controls-CRtfFczw.css +387 -0
  31. package/dist/assets/css/ui-data-CYLxfdUa.css +1555 -0
  32. package/dist/assets/css/ui-form-C3WrWfVl.css +71 -0
  33. package/dist/assets/css/ui-form-fields-DOtHhDeM.css +1360 -0
  34. package/dist/assets/css/ui-helpers-bOoNv5dS.css +37 -0
  35. package/dist/assets/css/ui-indicators-CybQnCoU.css +628 -0
  36. package/dist/assets/css/ui-layout-DyGKgizy.css +251 -0
  37. package/dist/assets/css/ui-media-TWYep8js.css +298 -0
  38. package/dist/assets/css/ui-media-advanced-BGxy3VSB.css +183 -0
  39. package/dist/assets/css/ui-navigation-DcPRn8SB.css +1693 -0
  40. package/dist/assets/css-C_ZeEwz2.js +847 -0
  41. package/dist/assets/cypher-Bayei42D.js +122 -0
  42. package/dist/assets/d-B0hhz6be.js +205 -0
  43. package/dist/assets/diff-DQutOIXs.js +30 -0
  44. package/dist/assets/dockerfile-D0MivFIF.js +199 -0
  45. package/dist/assets/dtd-C1CeYVnM.js +121 -0
  46. package/dist/assets/dylan-Dm9-uD-A.js +337 -0
  47. package/dist/assets/ebnf-jWG_1Yly.js +151 -0
  48. package/dist/assets/ecl-CgJPA6z9.js +190 -0
  49. package/dist/assets/eiffel-lj7uLahq.js +146 -0
  50. package/dist/assets/elm-Cz7o1ijk.js +230 -0
  51. package/dist/assets/erlang-CyL5QOyR.js +581 -0
  52. package/dist/assets/factor-BVWHwYpu.js +65 -0
  53. package/dist/assets/fcl-DiozYjc8.js +154 -0
  54. package/dist/assets/forth-B7vn5ze0.js +164 -0
  55. package/dist/assets/fortran-D2XNEnBT.js +172 -0
  56. package/dist/assets/gas-B_Tj57Ve.js +343 -0
  57. package/dist/assets/gherkin-CJ6Qk4EZ.js +147 -0
  58. package/dist/assets/groovy-ioGz2WSV.js +228 -0
  59. package/dist/assets/haskell-BHnm1B83.js +239 -0
  60. package/dist/assets/haxe-Bn6Yo6N3.js +490 -0
  61. package/dist/assets/http-BOd5SYCT.js +89 -0
  62. package/dist/assets/idl-FSFk8_xX.js +274 -0
  63. package/dist/assets/index--5fKpGeN.js +792 -0
  64. package/dist/assets/index-0lME64YH.js +342 -0
  65. package/dist/assets/index-B1srGfDb.js +183 -0
  66. package/dist/assets/index-B6Ip0FgO.js +437 -0
  67. package/dist/assets/index-BKF-A58l.js +106 -0
  68. package/dist/assets/index-BT8o9-M5.js +418 -0
  69. package/dist/assets/index-BmV05E5M.js +479 -0
  70. package/dist/assets/index-Bv_z_qRq.js +137 -0
  71. package/dist/assets/index-C6MavZDA.js +131 -0
  72. package/dist/assets/index-C7zlEJy8.js +338 -0
  73. package/dist/assets/index-CeeaNa4F.js +187 -0
  74. package/dist/assets/index-CtmpJVwa.js +330 -0
  75. package/dist/assets/index-CwKpgcYl.js +85 -0
  76. package/dist/assets/index-DMTL7O1s.js +627 -0
  77. package/dist/assets/index-DRUmDL0J.js +59 -0
  78. package/dist/assets/index-DgFC-M9G.js +96 -0
  79. package/dist/assets/javascript-DGrAs70C.js +922 -0
  80. package/dist/assets/jinja2-D9k5QrXv.js +171 -0
  81. package/dist/assets/julia-DM42tOPB.js +369 -0
  82. package/dist/assets/livescript-Dci8HnOi.js +259 -0
  83. package/dist/assets/lua-CByQu4v6.js +137 -0
  84. package/dist/assets/lucide-icons-af0BY3bi.js +34555 -0
  85. package/dist/assets/mathematica-Dkv0uCYF.js +153 -0
  86. package/dist/assets/mbox-CYTvs5kC.js +114 -0
  87. package/dist/assets/mirc-DpgP3GCo.js +176 -0
  88. package/dist/assets/mllike-C6tNn2Yt.js +343 -0
  89. package/dist/assets/modelica-CR6hTSce.js +192 -0
  90. package/dist/assets/mscgen-D0GXtzMS.js +149 -0
  91. package/dist/assets/mumps-Bf1EyDa6.js +129 -0
  92. package/dist/assets/nginx-By9Phklj.js +163 -0
  93. package/dist/assets/nsis-B5ggMLQ9.js +80 -0
  94. package/dist/assets/ntriples-C7VJ7pnm.js +141 -0
  95. package/dist/assets/octave-6yR_ix15.js +112 -0
  96. package/dist/assets/oz-CEUnktiQ.js +235 -0
  97. package/dist/assets/pascal-Dksf1EyF.js +124 -0
  98. package/dist/assets/perl-B99DUQQt.js +819 -0
  99. package/dist/assets/pig-DFeDRta6.js +149 -0
  100. package/dist/assets/powershell-DhwsNWMx.js +381 -0
  101. package/dist/assets/properties-o21uErwC.js +62 -0
  102. package/dist/assets/protobuf-YxlANsmD.js +54 -0
  103. package/dist/assets/pug-bUgjeODZ.js +504 -0
  104. package/dist/assets/puppet-B8WICGYE.js +205 -0
  105. package/dist/assets/python-D3FFx1Id.js +389 -0
  106. package/dist/assets/q-D2Hjhl2C.js +123 -0
  107. package/dist/assets/r-D73k5lac.js +174 -0
  108. package/dist/assets/rpm-Duv_WH0z.js +89 -0
  109. package/dist/assets/ruby-DGCVqZDt.js +287 -0
  110. package/dist/assets/sas-XjPv1Vy5.js +268 -0
  111. package/dist/assets/scheme-DeaA28vt.js +263 -0
  112. package/dist/assets/shared-components-CfAt2hC6.js +1501 -0
  113. package/dist/assets/shared-composables-v9NkNuAe.js +35 -0
  114. package/dist/assets/shared-modules-CDP-H5ZB.js +3588 -0
  115. package/dist/assets/shared-pages-BGRRA5WB.js +20 -0
  116. package/dist/assets/shell-Bx6QZTgx.js +145 -0
  117. package/dist/assets/sieve-CWCD62sW.js +178 -0
  118. package/dist/assets/simple-mode-BAO9cD7H.js +136 -0
  119. package/dist/assets/smalltalk-DSQbF4MF.js +153 -0
  120. package/dist/assets/solr-v_XRf31C.js +80 -0
  121. package/dist/assets/sparql-BrfDqf0-.js +170 -0
  122. package/dist/assets/spreadsheet-Csn84Pef.js +98 -0
  123. package/dist/assets/sql-D4utlq1l.js +480 -0
  124. package/dist/assets/stex-DBkktma-.js +246 -0
  125. package/dist/assets/stylus-ByG-Fd6f.js +750 -0
  126. package/dist/assets/swift-CHbTprt3.js +202 -0
  127. package/dist/assets/tcl-BRlMUELr.js +125 -0
  128. package/dist/assets/textile-CqfTUjd4.js +441 -0
  129. package/dist/assets/tiddlywiki-BrsoM8KB.js +278 -0
  130. package/dist/assets/tiki-D-ivWPkc.js +289 -0
  131. package/dist/assets/toml-t_IhJu83.js +75 -0
  132. package/dist/assets/troff-DckGF2AE.js +64 -0
  133. package/dist/assets/ttcn-B8TAFbRR.js +253 -0
  134. package/dist/assets/ttcn-cfg-NHh25oCM.js +197 -0
  135. package/dist/assets/turtle-D9Js0BlL.js +141 -0
  136. package/dist/assets/ui-app-D31Pr1WY.js +1993 -0
  137. package/dist/assets/ui-content-B7SxH8y9.js +52887 -0
  138. package/dist/assets/ui-controls-nmDJYLmC.js +348 -0
  139. package/dist/assets/ui-data-Ci3b1ye0.js +22901 -0
  140. package/dist/assets/ui-form-Cs5ooOo7.js +159 -0
  141. package/dist/assets/ui-form-fields-DFQi31jT.js +40575 -0
  142. package/dist/assets/ui-helpers-CF-EUlOg.js +1736 -0
  143. package/dist/assets/ui-indicators-mIQeEqha.js +199 -0
  144. package/dist/assets/ui-layout-v2XBQky3.js +320 -0
  145. package/dist/assets/ui-media-WWYrwmZw.js +1259 -0
  146. package/dist/assets/ui-media-advanced-T8ibi153.js +492 -0
  147. package/dist/assets/ui-modals-BdZXzI85.js +2 -0
  148. package/dist/assets/ui-navigation-BtHa6ovW.js +24269 -0
  149. package/dist/assets/utils-DZK5fu48.js +17216 -0
  150. package/dist/assets/vb-CbIGLrpY.js +249 -0
  151. package/dist/assets/vbscript-8ANWle9n.js +320 -0
  152. package/dist/assets/velocity-D6hz3Hzw.js +186 -0
  153. package/dist/assets/verilog-DIV442at.js +565 -0
  154. package/dist/assets/vhdl-BlTiZo_v.js +174 -0
  155. package/dist/assets/vueuse-CTQm4Zh0.js +9308 -0
  156. package/dist/assets/webidl-Cp3tcqdk.js +179 -0
  157. package/dist/assets/xquery-Dd4TBzXv.js +411 -0
  158. package/dist/assets/yacas-DQ1WucF0.js +182 -0
  159. package/dist/assets/z80-P1j44jDI.js +102 -0
  160. package/dist/framework.js +29 -0
  161. package/dist/index.css +18 -0
  162. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts +4 -4
  163. package/dist/shared/components/notifications/components/notification-container/index.d.ts +6 -6
  164. package/dist/shared/components/notifications/components/notification-container/index.d.ts.map +1 -1
  165. package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +2 -2
  166. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +2 -2
  167. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -2
  168. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +1 -1
  169. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  170. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +1 -1
  171. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  172. package/dist/tsconfig.tsbuildinfo +1 -1
  173. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts +1 -1
  174. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  175. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts +2 -2
  176. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts +1 -1
  177. package/dist/ui/components/atoms/vc-icon/vc-material-icon.vue.d.ts.map +1 -1
  178. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts +1 -1
  179. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  180. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -2
  181. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts +2 -2
  182. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  183. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +4 -4
  184. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  185. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts +1 -1
  186. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  187. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +1 -1
  188. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
  189. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +3 -3
  190. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  191. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts +1 -1
  192. 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
  193. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-base-button.vue.d.ts +1 -1
  194. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-base-button.vue.d.ts.map +1 -1
  195. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts +1 -1
  196. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  197. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue.d.ts +1 -1
  198. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue.d.ts.map +1 -1
  199. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +1 -1
  200. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  201. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -2
  202. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts +1 -1
  203. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  204. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +3 -3
  205. package/dist/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
  206. package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts +1 -1
  207. package/dist/ui/components/organisms/vc-popup/vc-popup.vue.d.ts.map +1 -1
  208. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts +1 -1
  209. package/dist/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue.d.ts.map +1 -1
  210. package/package.json +6 -5
@@ -0,0 +1,1993 @@
1
+ import { ref, computed, provide, inject, getCurrentInstance, watchEffect, reactive, readonly, defineComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, renderSlot, withModifiers, createBlock, createCommentVNode, unref, toDisplayString, watch, withCtx, createVNode, h, Teleport, Fragment, resolveDynamicComponent, Transition, renderList, withDirectives, mergeProps, resolveComponent, onMounted, createSlots, createTextVNode, vShow, onUnmounted, normalizeStyle } from 'vue';
2
+ import './ui-indicators-mIQeEqha.js';
3
+ import { _ as _sfc_main$j, A as _sfc_main$k, j as _sfc_main$m, p as _sfc_main$n, f as _sfc_main$p, h as _sfc_main$q, e as _sfc_main$r, y as _sfc_main$s, o as _sfc_main$t, d as _sfc_main$u } from './ui-media-WWYrwmZw.js';
4
+ import { b as _sfc_main$o } from './ui-controls-nmDJYLmC.js';
5
+ import { a as VcContainer } from './ui-layout-v2XBQky3.js';
6
+ import './ui-helpers-CF-EUlOg.js';
7
+ import { i as i18n, c as usePermissions, n as notification, d as useBladeNavigation, b as usePopup, C as ChangePassword, e as useUser, f as useAppSwitcher, V as VcPopupContainer } from './ui-navigation-BtHa6ovW.js';
8
+ import { o as useAppBarWidget, f as useLanguages, u as useNotifications, p as provideAppBarWidget } from './core-composables-DYxpIWyY.js';
9
+ import 'vee-validate';
10
+ import { i as _sfc_main$l } from './ui-content-B7SxH8y9.js';
11
+ import './ui-form-Cs5ooOo7.js';
12
+ import { C as omit, D as snakeCase, j as isEqual, u as useI18n, E as capitalize, v as vOnClickOutside } from './ui-form-fields-DFQi31jT.js';
13
+ import { u as useMenuExpanded } from './shared-composables-v9NkNuAe.js';
14
+ import './core-plugins-wv2bDZ0l.js';
15
+ import { useRoute, useRouter } from 'vue-router';
16
+ import { N as NotificationDropdown, U as UserDropdownButton } from './shared-components-CfAt2hC6.js';
17
+ import './shared-modules-CDP-H5ZB.js';
18
+ import { M as MenuServiceKey, l as DashboardServiceKey, S as SettingsMenuServiceKey, u as useAppBarMobileButtons, D as DynamicModulesKey, p as provideAppBarMobileButtonsService, o as provideGlobalSearch } from './ui-data-Ci3b1ye0.js';
19
+ import './ui-media-advanced-T8ibi153.js';
20
+ import { x as useArrayFind, y as createUnrefFn, z as useColorMode, A as useCycleList, B as watchOnce } from './vueuse-CTQm4Zh0.js';
21
+
22
+ const preregisteredMenuItems = ref([]);
23
+ function addMenuItem(item) {
24
+ preregisteredMenuItems.value.push(item);
25
+ }
26
+ const DEFAULT_PRIORITY = Infinity;
27
+ const DEFAULT_GROUP_PRIORITY = Infinity;
28
+ const menuItems = ref([]);
29
+ const rawMenu = ref([]);
30
+ function createMenuService() {
31
+ const { t } = i18n.global;
32
+ function addMenuItem2(item) {
33
+ rawMenu.value.push(item);
34
+ constructMenu();
35
+ }
36
+ function removeMenuItem(item) {
37
+ const index = menuItems.value.indexOf(item);
38
+ if (index !== -1) {
39
+ menuItems.value.splice(index, 1);
40
+ }
41
+ }
42
+ const upsert = createUnrefFn(
43
+ (array, element) => {
44
+ const index = array.findIndex((_element) => isEqual(omit(_element, "title"), omit(element, "title")));
45
+ if (index > -1) {
46
+ array[index] = { ...element };
47
+ } else {
48
+ array.push({ ...element });
49
+ }
50
+ }
51
+ );
52
+ function sortByPriority(a, b) {
53
+ const getPriority = (item) => item.priority ?? DEFAULT_PRIORITY;
54
+ return getPriority(a) - getPriority(b);
55
+ }
56
+ function sortByGroupPriority(a, b) {
57
+ const getGroupPriority = (item) => item.inGroupPriority ?? item.priority ?? DEFAULT_GROUP_PRIORITY;
58
+ return getGroupPriority(a) - getGroupPriority(b);
59
+ }
60
+ function createItemId(title) {
61
+ const titleValue = typeof title === "string" ? t(title) : title.value;
62
+ return snakeCase(titleValue);
63
+ }
64
+ function createLocalizedTitle(title) {
65
+ return computed(() => t(title));
66
+ }
67
+ function processGroupItem(item, constructedMenu) {
68
+ if (!item.group && !item.groupConfig) return;
69
+ let groupId;
70
+ let groupTitle;
71
+ let groupIcon;
72
+ let groupPriority;
73
+ let groupPermissions;
74
+ if (item.groupConfig) {
75
+ groupId = item.groupConfig.id;
76
+ groupTitle = item.groupConfig.title || groupId;
77
+ groupIcon = item.groupConfig.icon;
78
+ groupPriority = item.groupConfig.priority;
79
+ groupPermissions = item.groupConfig.permissions;
80
+ } else {
81
+ groupId = "group_" + createItemId(item.group);
82
+ groupTitle = item.group;
83
+ groupIcon = item.groupIcon;
84
+ groupPriority = item.priority;
85
+ }
86
+ const existingGroup = useArrayFind(constructedMenu, (m) => m.groupId === groupId);
87
+ const groupItem = {
88
+ ...omit(item, ["group", "groupIcon", "groupPriority", "groupConfig"]),
89
+ title: createLocalizedTitle(item.title)
90
+ };
91
+ if (existingGroup.value && existingGroup.value.children) {
92
+ upsert(existingGroup.value.children, groupItem);
93
+ if (item.groupConfig) {
94
+ if (item.groupConfig.title) {
95
+ existingGroup.value.title = createLocalizedTitle(item.groupConfig.title);
96
+ }
97
+ if (item.groupConfig.icon !== void 0) {
98
+ existingGroup.value.groupIcon = item.groupConfig.icon;
99
+ }
100
+ if (item.groupConfig.priority !== void 0) {
101
+ existingGroup.value.priority = item.groupConfig.priority;
102
+ }
103
+ if (item.groupConfig.permissions !== void 0) {
104
+ existingGroup.value.permissions = item.groupConfig.permissions;
105
+ }
106
+ }
107
+ } else {
108
+ const group = {
109
+ groupId,
110
+ groupIcon: groupIcon ?? "",
111
+ title: createLocalizedTitle(groupTitle),
112
+ children: [groupItem],
113
+ priority: groupPriority ?? item.priority ?? DEFAULT_PRIORITY,
114
+ permissions: groupPermissions
115
+ };
116
+ upsert(constructedMenu.value, group);
117
+ }
118
+ }
119
+ function processStandaloneItem(item, constructedMenu) {
120
+ if (item.title) {
121
+ const standaloneItem = {
122
+ ...item,
123
+ title: createLocalizedTitle(item.title)
124
+ };
125
+ upsert(constructedMenu.value, standaloneItem);
126
+ }
127
+ }
128
+ function finalizeMenuItems(items) {
129
+ return items.map(
130
+ (item) => ({
131
+ ...item,
132
+ title: createLocalizedTitle(item.title),
133
+ id: item.id || createItemId(item.title),
134
+ children: item.children?.sort(sortByGroupPriority)
135
+ })
136
+ ).sort(sortByPriority);
137
+ }
138
+ function constructMenu() {
139
+ const constructedMenu = ref([]);
140
+ rawMenu.value.forEach((item) => {
141
+ if (item.group || item.groupConfig) {
142
+ processGroupItem(item, constructedMenu);
143
+ } else {
144
+ processStandaloneItem(item, constructedMenu);
145
+ }
146
+ });
147
+ menuItems.value = finalizeMenuItems(constructedMenu.value);
148
+ }
149
+ preregisteredMenuItems.value.forEach((item) => {
150
+ try {
151
+ addMenuItem2(item);
152
+ } catch (e) {
153
+ console.warn(`Failed to register preregistered menu item ${item.id || item.title}:`, e);
154
+ }
155
+ });
156
+ return {
157
+ addMenuItem: addMenuItem2,
158
+ menuItems,
159
+ removeMenuItem
160
+ };
161
+ }
162
+
163
+ function provideMenuService() {
164
+ const service = createMenuService();
165
+ provide(MenuServiceKey, service);
166
+ return service;
167
+ }
168
+ function useMenuService() {
169
+ const service = inject(MenuServiceKey);
170
+ if (!service) {
171
+ console.error("Menu service not found in current context. Injection chain:", getCurrentInstance());
172
+ throw new Error("MenuService not provided");
173
+ }
174
+ return service;
175
+ }
176
+
177
+ const registeredThemes = ref([
178
+ // "auto"
179
+ ]);
180
+ const useTheme = () => {
181
+ function register(customNames) {
182
+ (typeof customNames === "string" ? [customNames] : customNames).forEach((name) => {
183
+ if (!registeredThemes.value.includes(name)) {
184
+ registeredThemes.value.push(name);
185
+ }
186
+ });
187
+ }
188
+ function unregister(customNames) {
189
+ (typeof customNames === "string" ? [customNames] : customNames).forEach((name) => {
190
+ const index = registeredThemes.value.indexOf(name);
191
+ if (index >= 0) {
192
+ registeredThemes.value.splice(index, 1);
193
+ }
194
+ });
195
+ }
196
+ function setTheme(theme) {
197
+ state.value = theme;
198
+ }
199
+ const mode = useColorMode({
200
+ emitAuto: true,
201
+ initialValue: "light",
202
+ modes: {
203
+ ...registeredThemes.value.reduce(
204
+ (acc, name) => {
205
+ acc[name] = name;
206
+ return acc;
207
+ },
208
+ {}
209
+ )
210
+ }
211
+ });
212
+ const { state, next } = useCycleList(registeredThemes.value, { initialValue: mode });
213
+ watchEffect(() => mode.value = state.value);
214
+ return {
215
+ themes: computed(() => registeredThemes.value),
216
+ current: state,
217
+ next,
218
+ register,
219
+ unregister,
220
+ setTheme
221
+ };
222
+ };
223
+
224
+ const preregisteredWidgets = [];
225
+ function registerDashboardWidget(widget) {
226
+ const existingWidget = preregisteredWidgets.find((w) => w.id === widget.id);
227
+ if (!existingWidget) {
228
+ preregisteredWidgets.push(widget);
229
+ }
230
+ }
231
+ const createState = () => ({
232
+ widgets: reactive(/* @__PURE__ */ new Map()),
233
+ layout: reactive(/* @__PURE__ */ new Map())
234
+ });
235
+ function createDashboardService() {
236
+ const state = createState();
237
+ const { hasAccess } = usePermissions();
238
+ const registerWidget = (widget) => {
239
+ if (state.widgets.has(widget.id)) {
240
+ throw new Error(`Widget with id ${widget.id} already registered`);
241
+ }
242
+ state.widgets.set(widget.id, widget);
243
+ if (!widget.position) {
244
+ const lastWidget = Array.from(state.layout.values()).reduce((max, pos) => {
245
+ return pos.y > max ? pos.y : max;
246
+ }, 0);
247
+ state.layout.set(widget.id, {
248
+ x: 0,
249
+ y: lastWidget + 1
250
+ });
251
+ } else {
252
+ state.layout.set(widget.id, widget.position);
253
+ }
254
+ };
255
+ const getWidgets = () => {
256
+ return Array.from(state.widgets.values()).filter((widget) => {
257
+ if (!widget.permissions || widget.permissions.length === 0) {
258
+ return true;
259
+ }
260
+ return hasAccess(widget.permissions);
261
+ });
262
+ };
263
+ const updateWidgetPosition = (widgetId, position) => {
264
+ if (!state.widgets.has(widgetId)) {
265
+ throw new Error(`Widget with id ${widgetId} not found`);
266
+ }
267
+ state.layout.set(widgetId, position);
268
+ };
269
+ const getLayout = () => {
270
+ return state.layout;
271
+ };
272
+ preregisteredWidgets.forEach((widget) => {
273
+ try {
274
+ registerWidget(widget);
275
+ } catch (e) {
276
+ console.warn(`Failed to register preregistered widget ${widget.id}:`, e);
277
+ }
278
+ });
279
+ return {
280
+ registerWidget,
281
+ getWidgets,
282
+ updateWidgetPosition,
283
+ getLayout
284
+ };
285
+ }
286
+
287
+ function provideDashboardService() {
288
+ const service = createDashboardService();
289
+ provide(DashboardServiceKey, service);
290
+ return service;
291
+ }
292
+ function useDashboard() {
293
+ const service = inject(DashboardServiceKey);
294
+ if (!service) {
295
+ throw new Error("DashboardService not provided");
296
+ }
297
+ return service;
298
+ }
299
+
300
+ const preregisteredSettingsMenuItems = [];
301
+ const settingsMenuItems = ref(/* @__PURE__ */ new Map());
302
+ function addSettingsMenuItem(item) {
303
+ const id = item.id || crypto.randomUUID();
304
+ preregisteredSettingsMenuItems.push({
305
+ id,
306
+ order: item.order ?? preregisteredSettingsMenuItems.length,
307
+ component: item.component,
308
+ props: item.props
309
+ });
310
+ }
311
+ function createSettingsMenuService() {
312
+ const register = (options) => {
313
+ const id = options.id || crypto.randomUUID();
314
+ settingsMenuItems.value.set(id, {
315
+ id,
316
+ order: options.order ?? settingsMenuItems.value.size,
317
+ component: options.component,
318
+ props: options.props
319
+ });
320
+ return id;
321
+ };
322
+ const unregister = (id) => {
323
+ settingsMenuItems.value.delete(id);
324
+ };
325
+ const items = computed(() => {
326
+ return Array.from(settingsMenuItems.value.values()).sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
327
+ });
328
+ preregisteredSettingsMenuItems.forEach((item) => {
329
+ try {
330
+ register(item);
331
+ } catch (e) {
332
+ console.warn(`Failed to register pre-added settings menu item ${item.id}:`, e);
333
+ }
334
+ });
335
+ return {
336
+ register,
337
+ unregister,
338
+ items
339
+ };
340
+ }
341
+
342
+ function provideSettingsMenu() {
343
+ const settingsMenuService = createSettingsMenuService();
344
+ provide(SettingsMenuServiceKey, settingsMenuService);
345
+ return settingsMenuService;
346
+ }
347
+ function useSettingsMenu() {
348
+ const settingsMenuService = inject(SettingsMenuServiceKey);
349
+ if (!settingsMenuService) {
350
+ throw new Error("Settings menu service not found");
351
+ }
352
+ return settingsMenuService;
353
+ }
354
+
355
+ const AppMenuStateKey = Symbol("AppMenuState");
356
+ let _instance = null;
357
+ const useAppMenuState = () => {
358
+ if (_instance) {
359
+ return _instance;
360
+ }
361
+ const injected = inject(AppMenuStateKey, null);
362
+ if (injected) {
363
+ return injected;
364
+ }
365
+ const { isExpanded, toggleExpanded, isHoverExpanded, toggleHoverExpanded: toggleHoverExpandedFn } = useMenuExpanded();
366
+ const stateData = reactive({
367
+ isSidebarExpanded: isExpanded,
368
+ isMenuOpen: false,
369
+ activeButtonId: null
370
+ });
371
+ const state = computed(() => readonly(stateData));
372
+ const toggleSidebar = () => {
373
+ toggleExpanded();
374
+ stateData.isSidebarExpanded = isExpanded.value;
375
+ };
376
+ const toggleHoverExpanded = (shouldExpand) => {
377
+ toggleHoverExpandedFn(shouldExpand);
378
+ };
379
+ const toggleMenu = () => {
380
+ stateData.isMenuOpen = !stateData.isMenuOpen;
381
+ if (!stateData.isMenuOpen) {
382
+ stateData.activeButtonId = null;
383
+ }
384
+ };
385
+ const setActiveButton = (buttonId) => {
386
+ stateData.activeButtonId = buttonId;
387
+ };
388
+ const isButtonActive = computed(() => (buttonId) => stateData.activeButtonId === buttonId);
389
+ const closeAll = () => {
390
+ stateData.isMenuOpen = false;
391
+ stateData.activeButtonId = null;
392
+ };
393
+ const instance = {
394
+ state,
395
+ isButtonActive,
396
+ toggleSidebar,
397
+ toggleMenu,
398
+ setActiveButton,
399
+ toggleHoverExpanded,
400
+ isHoverExpanded,
401
+ closeAll
402
+ };
403
+ _instance = instance;
404
+ provide(AppMenuStateKey, instance);
405
+ return instance;
406
+ };
407
+
408
+ function useToggleableContent(itemsGetter, activeIdRef) {
409
+ const currentItem = computed(() => {
410
+ if (!activeIdRef.value || !Array.isArray(itemsGetter.value)) {
411
+ return null;
412
+ }
413
+ return itemsGetter.value.find((item) => item.id === activeIdRef.value) || null;
414
+ });
415
+ const isAnyItemVisible = computed(() => activeIdRef.value !== null);
416
+ const toggleItem = (id) => {
417
+ if (activeIdRef.value === id) {
418
+ activeIdRef.value = null;
419
+ } else {
420
+ activeIdRef.value = id;
421
+ }
422
+ };
423
+ const closeItem = () => {
424
+ activeIdRef.value = null;
425
+ };
426
+ const showItem = (id) => {
427
+ activeIdRef.value = id;
428
+ };
429
+ const hideAllItems = () => {
430
+ activeIdRef.value = null;
431
+ };
432
+ return {
433
+ showItem,
434
+ hideAllItems,
435
+ toggleItem,
436
+ currentItem,
437
+ isAnyItemVisible,
438
+ closeItem
439
+ };
440
+ }
441
+
442
+ const activeWidgetId = ref(null);
443
+ function useAppBarWidgets() {
444
+ const { items } = useAppBarWidget();
445
+ const {
446
+ showItem: showWidget,
447
+ hideAllItems: hideAllWidgets,
448
+ toggleItem: toggleWidget,
449
+ currentItem: currentWidget,
450
+ isAnyItemVisible: isAnyWidgetVisible
451
+ } = useToggleableContent(items, activeWidgetId);
452
+ return {
453
+ showWidget,
454
+ hideAllWidgets,
455
+ toggleWidget,
456
+ currentWidget,
457
+ isAnyWidgetVisible
458
+ };
459
+ }
460
+
461
+ const _hoisted_1$f = { class: "vc-menu-item__content" };
462
+ const _hoisted_2$a = { class: "vc-menu-item__title" };
463
+ const _sfc_main$i = /* @__PURE__ */ defineComponent({
464
+ __name: "settings-menu-item",
465
+ props: {
466
+ title: {},
467
+ icon: {},
468
+ image: {},
469
+ emptyIcon: {},
470
+ isActive: { type: Boolean },
471
+ disabled: { type: Boolean },
472
+ isVisible: { type: Boolean, default: true },
473
+ triggerAction: { default: "click" }
474
+ },
475
+ emits: ["trigger:click", "trigger:hover"],
476
+ setup(__props, { emit: __emit }) {
477
+ const props = __props;
478
+ const emit = __emit;
479
+ const handleTriggerClick = () => {
480
+ if (props.disabled || props.triggerAction === "none") return;
481
+ emit("trigger:click");
482
+ };
483
+ return (_ctx, _cache) => {
484
+ return openBlock(), createElementBlock("div", {
485
+ class: normalizeClass(["vc-menu-item", {
486
+ "vc-menu-item--active": _ctx.isActive,
487
+ "vc-menu-item--clickable": !_ctx.disabled,
488
+ "vc-menu-item--invisible": !_ctx.isVisible
489
+ }])
490
+ }, [
491
+ createElementVNode("div", {
492
+ class: "vc-menu-item__trigger",
493
+ onClick: withModifiers(handleTriggerClick, ["stop"])
494
+ }, [
495
+ renderSlot(_ctx.$slots, "trigger", {}, () => [
496
+ createElementVNode("div", _hoisted_1$f, [
497
+ renderSlot(_ctx.$slots, "icon", {}, () => [
498
+ _ctx.icon ? (openBlock(), createBlock(unref(_sfc_main$j), {
499
+ key: 0,
500
+ icon: _ctx.icon,
501
+ size: "l",
502
+ class: "vc-menu-item__icon"
503
+ }, null, 8, ["icon"])) : _ctx.image ? (openBlock(), createBlock(unref(_sfc_main$k), {
504
+ key: 1,
505
+ src: _ctx.image,
506
+ class: "vc-menu-item__image",
507
+ "empty-icon": _ctx.emptyIcon
508
+ }, null, 8, ["src", "empty-icon"])) : createCommentVNode("", true)
509
+ ]),
510
+ renderSlot(_ctx.$slots, "title", {}, () => [
511
+ createElementVNode("p", _hoisted_2$a, toDisplayString(_ctx.title), 1)
512
+ ]),
513
+ renderSlot(_ctx.$slots, "additional")
514
+ ])
515
+ ])
516
+ ]),
517
+ renderSlot(_ctx.$slots, "content")
518
+ ], 2);
519
+ };
520
+ }
521
+ });
522
+
523
+ const _hoisted_1$e = { class: "vc-language-selector__trigger" };
524
+ const _hoisted_2$9 = { class: "vc-language-selector__title" };
525
+ const _hoisted_3$6 = ["onClick"];
526
+ const _hoisted_4$6 = { class: "vc-language-selector__item-title" };
527
+ const _sfc_main$h = /* @__PURE__ */ defineComponent({
528
+ __name: "language-selector",
529
+ setup(__props) {
530
+ const { availableLocales, getLocaleMessage, locale } = useI18n({ useScope: "global" });
531
+ const { setLocale, getFlag } = useLanguages();
532
+ const opened = ref(false);
533
+ const currLocaleFlag = ref();
534
+ const languageItems = availableLocales.map((locale2) => ({
535
+ lang: locale2,
536
+ title: getLocaleMessage(locale2).language_name,
537
+ clickHandler(lang) {
538
+ setLocale(lang);
539
+ },
540
+ flag: ""
541
+ })).filter((item) => item.title);
542
+ const handleLanguageSelect = (lang) => {
543
+ if (Object.prototype.hasOwnProperty.call(lang, "clickHandler")) {
544
+ lang.clickHandler(lang.lang);
545
+ }
546
+ opened.value = false;
547
+ };
548
+ watch(
549
+ [() => languageItems, () => locale.value],
550
+ async ([newValLangItem]) => {
551
+ for (const lang of newValLangItem) {
552
+ lang.flag = await getFlag(lang.lang);
553
+ if (lang.lang === locale.value) {
554
+ currLocaleFlag.value = lang.flag;
555
+ }
556
+ }
557
+ },
558
+ { immediate: true }
559
+ );
560
+ return (_ctx, _cache) => {
561
+ return openBlock(), createBlock(unref(_sfc_main$i), {
562
+ "onTrigger:click": _cache[0] || (_cache[0] = ($event) => opened.value = !opened.value)
563
+ }, {
564
+ trigger: withCtx(() => [
565
+ createElementVNode("div", _hoisted_1$e, [
566
+ createVNode(unref(_sfc_main$k), {
567
+ src: currLocaleFlag.value,
568
+ "empty-icon": "material-language",
569
+ class: "vc-language-selector__flag"
570
+ }, null, 8, ["src"]),
571
+ createElementVNode("span", _hoisted_2$9, toDisplayString(_ctx.$t("COMPONENTS.LANGUAGE_SELECTOR.TITLE")), 1)
572
+ ])
573
+ ]),
574
+ content: withCtx(() => [
575
+ createVNode(unref(_sfc_main$l), {
576
+ opened: opened.value,
577
+ items: unref(languageItems),
578
+ "is-item-active": (lang) => lang.lang === _ctx.$i18n.locale,
579
+ onItemClick: handleLanguageSelect
580
+ }, {
581
+ item: withCtx(({ item: lang, click }) => [
582
+ createElementVNode("div", {
583
+ class: normalizeClass(["vc-language-selector__item", { "vc-language-selector__item--active": lang.lang === _ctx.$i18n.locale }]),
584
+ onClick: click
585
+ }, [
586
+ createVNode(unref(_sfc_main$k), {
587
+ src: lang.flag,
588
+ class: "vc-language-selector__flag"
589
+ }, null, 8, ["src"]),
590
+ createElementVNode("span", _hoisted_4$6, toDisplayString(lang.title), 1)
591
+ ], 10, _hoisted_3$6)
592
+ ]),
593
+ _: 1
594
+ }, 8, ["opened", "items", "is-item-active"])
595
+ ]),
596
+ _: 1
597
+ });
598
+ };
599
+ }
600
+ });
601
+
602
+ const LanguageSelector = _sfc_main$h;
603
+
604
+ const _hoisted_1$d = { class: "sidebar__content" };
605
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
606
+ ...{
607
+ inheritAttrs: false
608
+ },
609
+ __name: "sidebar",
610
+ props: {
611
+ position: { default: "right" },
612
+ render: { default: "always" },
613
+ isExpanded: { type: Boolean },
614
+ title: {},
615
+ closeCross: { type: Boolean, default: true }
616
+ },
617
+ emits: ["close"],
618
+ setup(__props, { emit: __emit }) {
619
+ const emit = __emit;
620
+ const props = __props;
621
+ const header = h("div", { class: "sidebar__header" }, [
622
+ props.title ? h("h3", { class: "sidebar__title" }, props.title) : null,
623
+ props.closeCross ? h(_sfc_main$j, { icon: _sfc_main$m, size: "xs", onClick: () => emit("close"), class: "sidebar__close-icon" }) : null
624
+ ]);
625
+ return (_ctx, _cache) => {
626
+ return openBlock(), createBlock(Teleport, {
627
+ to: "body",
628
+ disabled: _ctx.$isDesktop.value
629
+ }, [
630
+ _ctx.isExpanded ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
631
+ _ctx.isExpanded ? (openBlock(), createElementBlock("div", {
632
+ key: 0,
633
+ class: "sidebar__overlay",
634
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => _ctx.$emit("close"), ["stop"]))
635
+ })) : createCommentVNode("", true),
636
+ _ctx.isExpanded ? (openBlock(), createElementBlock("div", {
637
+ key: 1,
638
+ class: normalizeClass([
639
+ "sidebar__dropdown",
640
+ {
641
+ "sidebar__dropdown--mobile": _ctx.$isMobile.value && _ctx.render === "mobile",
642
+ "sidebar__dropdown--desktop": _ctx.$isDesktop.value && _ctx.render === "desktop",
643
+ "sidebar__dropdown--always": _ctx.render === "always",
644
+ "sidebar__dropdown--left": _ctx.position === "left",
645
+ "sidebar__dropdown--right": _ctx.position === "right",
646
+ "sidebar__dropdown--title": _ctx.title
647
+ }
648
+ ])
649
+ }, [
650
+ renderSlot(_ctx.$slots, "header", { header: unref(header) }, () => [
651
+ (openBlock(), createBlock(resolveDynamicComponent(unref(header))))
652
+ ]),
653
+ createElementVNode("div", _hoisted_1$d, [
654
+ renderSlot(_ctx.$slots, "content")
655
+ ])
656
+ ], 2)) : createCommentVNode("", true)
657
+ ], 64)) : renderSlot(_ctx.$slots, "content", { key: 1 })
658
+ ], 8, ["disabled"]);
659
+ };
660
+ }
661
+ });
662
+
663
+ const _hoisted_1$c = { class: "vc-theme-selector__trigger" };
664
+ const _hoisted_2$8 = { class: "vc-theme-selector__title" };
665
+ const _hoisted_3$5 = ["onClick"];
666
+ const _hoisted_4$5 = { class: "vc-theme-selector__item-title" };
667
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
668
+ __name: "theme-selector",
669
+ setup(__props) {
670
+ const { current, themes, setTheme } = useTheme();
671
+ const opened = ref(false);
672
+ const handleThemeSelect = (theme) => {
673
+ setTheme(theme);
674
+ opened.value = false;
675
+ };
676
+ watch(
677
+ () => current.value,
678
+ (newVal) => {
679
+ notification(capitalize(newVal));
680
+ },
681
+ { deep: true }
682
+ );
683
+ return (_ctx, _cache) => {
684
+ return openBlock(), createBlock(unref(_sfc_main$i), {
685
+ "onTrigger:click": _cache[0] || (_cache[0] = ($event) => opened.value = !opened.value)
686
+ }, {
687
+ trigger: withCtx(() => [
688
+ createElementVNode("div", _hoisted_1$c, [
689
+ createVNode(unref(_sfc_main$j), {
690
+ icon: "material-palette",
691
+ class: "vc-theme-selector__icon"
692
+ }),
693
+ createElementVNode("span", _hoisted_2$8, toDisplayString(_ctx.$t("COMPONENTS.THEME_SELECTOR.THEME_SELECTOR")), 1)
694
+ ])
695
+ ]),
696
+ content: withCtx(() => [
697
+ createVNode(unref(_sfc_main$l), {
698
+ opened: opened.value,
699
+ items: unref(themes),
700
+ "is-item-active": (theme) => theme === unref(current),
701
+ onItemClick: handleThemeSelect
702
+ }, {
703
+ item: withCtx(({ item: theme, click }) => [
704
+ createElementVNode("div", {
705
+ class: normalizeClass(["vc-theme-selector__item", { "vc-theme-selector__item--active": theme === unref(current) }]),
706
+ onClick: click
707
+ }, [
708
+ createElementVNode("span", _hoisted_4$5, toDisplayString(capitalize(theme)), 1)
709
+ ], 10, _hoisted_3$5)
710
+ ]),
711
+ _: 1
712
+ }, 8, ["opened", "items", "is-item-active"])
713
+ ]),
714
+ _: 1
715
+ });
716
+ };
717
+ }
718
+ });
719
+
720
+ const _hoisted_1$b = { class: "app-bar-header__logo-container" };
721
+ const _hoisted_2$7 = { class: "app-bar-header__logo" };
722
+ const _hoisted_3$4 = ["src"];
723
+ const _hoisted_4$4 = {
724
+ key: 0,
725
+ class: "app-bar-header__menu-button-accent"
726
+ };
727
+ const _hoisted_5$2 = {
728
+ key: 0,
729
+ class: "app-bar-header__blade-title"
730
+ };
731
+ const _hoisted_6$2 = {
732
+ key: 0,
733
+ class: "app-bar-header__actions"
734
+ };
735
+ const _hoisted_7$1 = { class: "app-bar-header__menu-button-wrap" };
736
+ const _hoisted_8 = {
737
+ key: 0,
738
+ class: "app-bar-header__menu-button-accent"
739
+ };
740
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
741
+ __name: "AppBarHeader",
742
+ props: {
743
+ logo: {},
744
+ expanded: {}
745
+ },
746
+ emits: ["logo:click", "toggle-menu"],
747
+ setup(__props) {
748
+ const { notifications } = useNotifications();
749
+ const { blades, currentBladeNavigationData } = useBladeNavigation();
750
+ const viewTitle = ref("");
751
+ const currentBladeId = ref(0);
752
+ watchEffect(
753
+ () => {
754
+ const currentTitle = currentBladeNavigationData.value?.instance?.title;
755
+ const lastBladeTitle = blades.value[blades.value.length - 1]?.props?.navigation?.instance?.title;
756
+ currentBladeId.value = blades.value[blades.value.length - 1]?.props?.navigation?.idx || 0;
757
+ viewTitle.value = currentTitle ?? lastBladeTitle ?? "";
758
+ },
759
+ { flush: "post" }
760
+ );
761
+ const hasUnread = computed(() => {
762
+ return notifications.value.some((item) => item.isNew);
763
+ });
764
+ return (_ctx, _cache) => {
765
+ return _ctx.$isMobile.value && unref(blades).length <= 1 || _ctx.$isDesktop.value ? (openBlock(), createElementBlock("div", {
766
+ key: 0,
767
+ class: normalizeClass(["app-bar-header", {
768
+ "app-bar-header--collapsed": !_ctx.expanded && !_ctx.$isMobile.value,
769
+ "app-bar-header--mobile": _ctx.$isMobile.value
770
+ }])
771
+ }, [
772
+ createElementVNode("div", _hoisted_1$b, [
773
+ createElementVNode("div", _hoisted_2$7, [
774
+ createElementVNode("img", {
775
+ class: normalizeClass(["app-bar-header__logo-image", { "app-bar-header__logo-image--mobile": _ctx.$isMobile.value }]),
776
+ alt: "logo",
777
+ src: _ctx.logo,
778
+ onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$isMobile.value ? _ctx.$emit("toggle-menu") : _ctx.$emit("logo:click"))
779
+ }, null, 10, _hoisted_3$4),
780
+ hasUnread.value && !_ctx.expanded ? (openBlock(), createElementBlock("div", _hoisted_4$4)) : createCommentVNode("", true)
781
+ ]),
782
+ _ctx.$isMobile.value && unref(blades).length === 1 ? (openBlock(), createElementBlock("p", _hoisted_5$2, toDisplayString(viewTitle.value), 1)) : createCommentVNode("", true)
783
+ ]),
784
+ _ctx.$isMobile.value ? (openBlock(), createElementBlock("div", _hoisted_6$2, [
785
+ _ctx.$isMobile.value ? renderSlot(_ctx.$slots, "actions", { key: 0 }) : createCommentVNode("", true)
786
+ ])) : createCommentVNode("", true),
787
+ createVNode(Transition, {
788
+ name: "burger-fade",
789
+ mode: "out-in"
790
+ }, {
791
+ default: withCtx(() => [
792
+ _ctx.expanded && _ctx.$isDesktop.value ? (openBlock(), createElementBlock("button", {
793
+ key: 0,
794
+ ref: "menuButtonRef",
795
+ class: "app-bar-header__menu-button",
796
+ onClick: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("toggle-menu"))
797
+ }, [
798
+ createElementVNode("div", _hoisted_7$1, [
799
+ createVNode(unref(_sfc_main$j), {
800
+ icon: unref(_sfc_main$n),
801
+ size: "xs"
802
+ }, null, 8, ["icon"]),
803
+ hasUnread.value ? (openBlock(), createElementBlock("div", _hoisted_8)) : createCommentVNode("", true)
804
+ ])
805
+ ], 512)) : createCommentVNode("", true)
806
+ ]),
807
+ _: 1
808
+ })
809
+ ], 2)) : createCommentVNode("", true);
810
+ };
811
+ }
812
+ });
813
+
814
+ const _hoisted_1$a = { class: "app-bar-overlay__content app-bar-overlay__dropdowns" };
815
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
816
+ __name: "AppBarOverlay",
817
+ props: {
818
+ isSidebarMode: { type: Boolean },
819
+ expanded: {}
820
+ },
821
+ emits: ["close"],
822
+ setup(__props) {
823
+ return (_ctx, _cache) => {
824
+ return openBlock(), createBlock(Teleport, { to: "body" }, [
825
+ createElementVNode("div", {
826
+ class: normalizeClass(["app-bar-overlay", {
827
+ "app-bar-overlay--mobile": _ctx.$isMobile.value,
828
+ "app-bar-overlay--desktop": _ctx.$isDesktop.value,
829
+ "app-bar-overlay--sidebar": _ctx.isSidebarMode,
830
+ "app-bar-overlay--standalone-mobile": _ctx.$isMobile.value && !_ctx.isSidebarMode,
831
+ "app-bar-overlay--collapsed": !_ctx.expanded && !_ctx.$isMobile.value
832
+ }])
833
+ }, [
834
+ createElementVNode("div", _hoisted_1$a, [
835
+ renderSlot(_ctx.$slots, "default")
836
+ ])
837
+ ], 2)
838
+ ]);
839
+ };
840
+ }
841
+ });
842
+
843
+ const activeActionId = ref(null);
844
+ function useAppBarMobileActions() {
845
+ const { getButtons } = useAppBarMobileButtons();
846
+ const {
847
+ showItem: showAction,
848
+ hideAllItems: hideAllActions,
849
+ toggleItem: toggleAction,
850
+ currentItem: currentAction,
851
+ isAnyItemVisible: isAnyActionVisible,
852
+ closeItem: closeAction
853
+ } = useToggleableContent(getButtons, activeActionId);
854
+ watch(
855
+ () => getButtons.value,
856
+ (newButtons) => {
857
+ if (activeActionId.value) {
858
+ const buttonStillExists = newButtons.some((button) => button.id === activeActionId.value);
859
+ if (!buttonStillExists) {
860
+ const activeButton = currentAction.value;
861
+ if (activeButton?.onClose) {
862
+ activeButton.onClose();
863
+ }
864
+ hideAllActions();
865
+ }
866
+ }
867
+ },
868
+ { deep: true }
869
+ );
870
+ return {
871
+ showAction,
872
+ hideAllActions,
873
+ toggleAction,
874
+ currentAction,
875
+ isAnyActionVisible,
876
+ closeAction
877
+ };
878
+ }
879
+
880
+ const _hoisted_1$9 = {
881
+ key: 0,
882
+ class: "app-bar-mobile-actions"
883
+ };
884
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
885
+ __name: "AppBarMobileActions",
886
+ props: {
887
+ isSidebarMode: { type: Boolean },
888
+ expanded: {}
889
+ },
890
+ setup(__props) {
891
+ const { getButtons } = useAppBarMobileButtons();
892
+ const { currentAction, toggleAction, hideAllActions, isAnyActionVisible } = useAppBarMobileActions();
893
+ const route = useRoute();
894
+ const handleButtonClick = (button) => {
895
+ if (currentAction.value?.id === button.id) {
896
+ button.onClose?.();
897
+ hideAllActions();
898
+ return;
899
+ }
900
+ if (currentAction.value) {
901
+ currentAction.value.onClose?.();
902
+ }
903
+ toggleAction(button.id);
904
+ if (!button.component && button.onClick) {
905
+ button.onClick();
906
+ }
907
+ };
908
+ const handleClose = (button) => {
909
+ button.onClose?.();
910
+ hideAllActions();
911
+ };
912
+ watch(route, () => {
913
+ hideAllActions();
914
+ });
915
+ return (_ctx, _cache) => {
916
+ return _ctx.$isMobile.value ? (openBlock(), createElementBlock("div", _hoisted_1$9, [
917
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(getButtons), (button) => {
918
+ return openBlock(), createElementBlock("div", {
919
+ key: button.id
920
+ }, [
921
+ (button.isVisible !== void 0 ? button.isVisible : true) ? (openBlock(), createBlock(unref(_sfc_main$o), {
922
+ key: 0,
923
+ text: "",
924
+ class: normalizeClass(["app-bar-mobile-actions__button", { "app-bar-mobile-actions__button--active": button.id === unref(currentAction)?.id }]),
925
+ icon: button.icon,
926
+ "icon-size": "l",
927
+ onClick: ($event) => handleButtonClick(button)
928
+ }, null, 8, ["class", "icon", "onClick"])) : createCommentVNode("", true)
929
+ ]);
930
+ }), 128)),
931
+ createVNode(Transition, { name: "overlay" }, {
932
+ default: withCtx(() => [
933
+ unref(isAnyActionVisible) && unref(currentAction)?.component ? (openBlock(), createBlock(_sfc_main$d, {
934
+ key: 0,
935
+ "is-sidebar-mode": _ctx.isSidebarMode,
936
+ expanded: _ctx.expanded
937
+ }, {
938
+ default: withCtx(() => [
939
+ withDirectives((openBlock(), createBlock(resolveDynamicComponent(unref(currentAction)?.component), mergeProps(unref(currentAction)?.props || {}, { onClose: handleClose }), null, 16)), [
940
+ [unref(vOnClickOutside), [handleClose, { ignore: [".app-bar-mobile-actions__button"] }]]
941
+ ])
942
+ ]),
943
+ _: 1
944
+ }, 8, ["is-sidebar-mode", "expanded"])) : createCommentVNode("", true)
945
+ ]),
946
+ _: 1
947
+ })
948
+ ])) : createCommentVNode("", true);
949
+ };
950
+ }
951
+ });
952
+
953
+ const _hoisted_1$8 = { class: "menu-sidebar__widgets" };
954
+ const _hoisted_2$6 = {
955
+ key: 0,
956
+ class: "menu-sidebar__close-button"
957
+ };
958
+ const _hoisted_3$3 = { class: "menu-sidebar__content" };
959
+ const _hoisted_4$3 = {
960
+ key: 0,
961
+ class: "menu-sidebar__content-main"
962
+ };
963
+ const _hoisted_5$1 = { class: "menu-sidebar__navmenu" };
964
+ const _hoisted_6$1 = { class: "menu-sidebar__user" };
965
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
966
+ __name: "MenuSidebar",
967
+ props: {
968
+ isOpened: { type: Boolean },
969
+ expanded: {}
970
+ },
971
+ emits: ["update:isOpened"],
972
+ setup(__props) {
973
+ return (_ctx, _cache) => {
974
+ const _component_VcButton = resolveComponent("VcButton");
975
+ return openBlock(), createBlock(unref(_sfc_main$g), {
976
+ "is-expanded": _ctx.$isMobile.value ? _ctx.isOpened : false,
977
+ position: "left",
978
+ render: "mobile",
979
+ onClose: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:isOpened", false))
980
+ }, {
981
+ header: withCtx(() => _cache[2] || (_cache[2] = [
982
+ createElementVNode("span", null, null, -1)
983
+ ])),
984
+ content: withCtx(() => [
985
+ createElementVNode("div", {
986
+ class: normalizeClass(["menu-sidebar__wrapper", {
987
+ "menu-sidebar__wrapper--expanded": _ctx.$isDesktop.value && _ctx.expanded,
988
+ "menu-sidebar__wrapper--collapsed": _ctx.$isDesktop.value && !_ctx.expanded
989
+ }])
990
+ }, [
991
+ createElementVNode("div", {
992
+ class: normalizeClass(["menu-sidebar__header", {
993
+ "menu-sidebar__header--mobile": _ctx.$isMobile.value
994
+ }])
995
+ }, [
996
+ createElementVNode("div", _hoisted_1$8, [
997
+ renderSlot(_ctx.$slots, "widgets")
998
+ ]),
999
+ _cache[3] || (_cache[3] = createElementVNode("div", { class: "menu-sidebar__spacer" }, null, -1)),
1000
+ _ctx.$isDesktop.value ? (openBlock(), createElementBlock("div", _hoisted_2$6, [
1001
+ createVNode(_component_VcButton, {
1002
+ "icon-class": "menu-sidebar__close-button-icon",
1003
+ icon: unref(_sfc_main$m),
1004
+ "icon-size": "xs",
1005
+ text: "",
1006
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => _ctx.$emit("update:isOpened", false), ["stop"]))
1007
+ }, null, 8, ["icon"])
1008
+ ])) : createCommentVNode("", true)
1009
+ ], 2),
1010
+ createElementVNode("div", _hoisted_3$3, [
1011
+ _ctx.$slots["widgets-active-content"] ? (openBlock(), createElementBlock("div", _hoisted_4$3, [
1012
+ renderSlot(_ctx.$slots, "widgets-active-content")
1013
+ ])) : createCommentVNode("", true),
1014
+ _ctx.$isMobile.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1015
+ createElementVNode("div", _hoisted_5$1, [
1016
+ renderSlot(_ctx.$slots, "navmenu")
1017
+ ]),
1018
+ createElementVNode("div", _hoisted_6$1, [
1019
+ renderSlot(_ctx.$slots, "user-dropdown")
1020
+ ])
1021
+ ], 64)) : renderSlot(_ctx.$slots, "app-switcher", { key: 2 })
1022
+ ])
1023
+ ], 2)
1024
+ ]),
1025
+ _: 3
1026
+ }, 8, ["is-expanded"]);
1027
+ };
1028
+ }
1029
+ });
1030
+
1031
+ const _hoisted_1$7 = { class: "app-bar-content__main" };
1032
+ const _hoisted_2$5 = { class: "app-bar-content__footer" };
1033
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
1034
+ __name: "AppBarContent",
1035
+ props: {
1036
+ expanded: {}
1037
+ },
1038
+ setup(__props) {
1039
+ return (_ctx, _cache) => {
1040
+ return openBlock(), createElementBlock("div", {
1041
+ class: normalizeClass(["app-bar-content", { "app-bar-content--collapsed": !_ctx.expanded }])
1042
+ }, [
1043
+ createElementVNode("div", _hoisted_1$7, [
1044
+ renderSlot(_ctx.$slots, "navmenu")
1045
+ ]),
1046
+ createElementVNode("div", _hoisted_2$5, [
1047
+ renderSlot(_ctx.$slots, "user-dropdown")
1048
+ ])
1049
+ ], 2);
1050
+ };
1051
+ }
1052
+ });
1053
+
1054
+ const _hoisted_1$6 = {
1055
+ class: /* @__PURE__ */ normalizeClass(["app-bar-button__button-container"])
1056
+ };
1057
+ const _hoisted_2$4 = { class: "app-bar-button__button-wrap" };
1058
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
1059
+ __name: "AppBarWidgetItem",
1060
+ props: {
1061
+ title: {},
1062
+ icon: {},
1063
+ beforeOpen: { type: Function },
1064
+ isOpened: { type: Boolean },
1065
+ widgetId: {}
1066
+ },
1067
+ emits: ["toggle"],
1068
+ setup(__props, { emit: __emit }) {
1069
+ const props = __props;
1070
+ const emit = __emit;
1071
+ const { toggleWidget, currentWidget } = useAppBarWidgets();
1072
+ const referenceButton = ref(null);
1073
+ const isActive = computed(() => props.widgetId ? currentWidget.value?.id === props.widgetId : false);
1074
+ function toggleContent() {
1075
+ if (props.beforeOpen && typeof props.beforeOpen === "function" && props.beforeOpen() === false) {
1076
+ return;
1077
+ }
1078
+ if (props.widgetId) {
1079
+ toggleWidget(props.widgetId);
1080
+ emit("toggle", isActive.value);
1081
+ }
1082
+ }
1083
+ onMounted(() => {
1084
+ if (props.isOpened && props.widgetId) {
1085
+ toggleWidget(props.widgetId);
1086
+ }
1087
+ });
1088
+ return (_ctx, _cache) => {
1089
+ const _component_VcIcon = resolveComponent("VcIcon");
1090
+ const _component_VcTooltip = resolveComponent("VcTooltip");
1091
+ return openBlock(), createElementBlock("div", {
1092
+ class: normalizeClass(["app-bar-button", { "app-bar-button--mobile": _ctx.$isMobile.value }])
1093
+ }, [
1094
+ createVNode(_component_VcTooltip, {
1095
+ placement: "bottom",
1096
+ offset: { crossAxis: 0, mainAxis: -10 },
1097
+ delay: 1e3,
1098
+ class: "tw-w-full"
1099
+ }, createSlots({
1100
+ default: withCtx(() => [
1101
+ createElementVNode("button", {
1102
+ ref_key: "referenceButton",
1103
+ ref: referenceButton,
1104
+ class: "app-bar-button__button",
1105
+ onClick: withModifiers(toggleContent, ["stop"])
1106
+ }, [
1107
+ createElementVNode("div", _hoisted_1$6, [
1108
+ renderSlot(_ctx.$slots, "trigger", {
1109
+ isActive: isActive.value,
1110
+ toggle: toggleContent
1111
+ }, () => [
1112
+ createElementVNode("div", _hoisted_2$4, [
1113
+ createVNode(_component_VcIcon, {
1114
+ icon: _ctx.icon,
1115
+ size: "xl",
1116
+ class: normalizeClass(["app-bar-button__icon", { "app-bar-button__icon--active": isActive.value }])
1117
+ }, null, 8, ["icon", "class"])
1118
+ ])
1119
+ ])
1120
+ ])
1121
+ ], 512)
1122
+ ]),
1123
+ _: 2
1124
+ }, [
1125
+ !isActive.value && !!_ctx.title ? {
1126
+ name: "tooltip",
1127
+ fn: withCtx(() => [
1128
+ createTextVNode(toDisplayString(_ctx.title), 1)
1129
+ ]),
1130
+ key: "0"
1131
+ } : void 0
1132
+ ]), 1024)
1133
+ ], 2);
1134
+ };
1135
+ }
1136
+ });
1137
+
1138
+ const _hoisted_1$5 = { class: "vc-app-toolbar-menu" };
1139
+ const _hoisted_2$3 = { class: "vc-app-toolbar-menu__button" };
1140
+ const _hoisted_3$2 = {
1141
+ key: 1,
1142
+ class: "vc-app-toolbar-menu__accent"
1143
+ };
1144
+ const _hoisted_4$2 = {
1145
+ key: 1,
1146
+ class: "vc-app-toolbar-menu__accent"
1147
+ };
1148
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
1149
+ __name: "AppBarWidgetsMenu",
1150
+ setup(__props) {
1151
+ const { items } = useAppBarWidget();
1152
+ function isBadgeActive(item) {
1153
+ if (item.badge === void 0) {
1154
+ return false;
1155
+ }
1156
+ if (typeof item.badge === "function") {
1157
+ return item.badge();
1158
+ }
1159
+ return !!item.badge;
1160
+ }
1161
+ return (_ctx, _cache) => {
1162
+ return openBlock(), createElementBlock("div", _hoisted_1$5, [
1163
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(items), (item) => {
1164
+ return openBlock(), createElementBlock("div", {
1165
+ key: item.id,
1166
+ class: "vc-app-toolbar-menu__item"
1167
+ }, [
1168
+ item.component ? (openBlock(), createBlock(_sfc_main$9, {
1169
+ key: 0,
1170
+ "is-opened": isBadgeActive(item),
1171
+ "widget-id": item.id,
1172
+ onToggle: ($event) => item.onClick && item.onClick()
1173
+ }, {
1174
+ trigger: withCtx(({ isActive }) => [
1175
+ createElementVNode("div", _hoisted_2$3, [
1176
+ createElementVNode("div", {
1177
+ class: normalizeClass(["vc-app-toolbar-menu__button-icon", {
1178
+ "vc-app-toolbar-menu__button-icon--active": isActive
1179
+ }])
1180
+ }, [
1181
+ item.icon ? (openBlock(), createBlock(unref(_sfc_main$j), {
1182
+ key: 0,
1183
+ icon: item.icon,
1184
+ size: "l"
1185
+ }, null, 8, ["icon"])) : createCommentVNode("", true),
1186
+ isBadgeActive(item) ? (openBlock(), createElementBlock("div", _hoisted_3$2)) : createCommentVNode("", true)
1187
+ ], 2)
1188
+ ])
1189
+ ]),
1190
+ _: 2
1191
+ }, 1032, ["is-opened", "widget-id", "onToggle"])) : item.onClick ? (openBlock(), createBlock(_sfc_main$9, {
1192
+ key: 1,
1193
+ onToggle: item.onClick
1194
+ }, {
1195
+ trigger: withCtx(({ isActive }) => [
1196
+ createElementVNode("div", {
1197
+ class: normalizeClass(["vc-app-toolbar-menu__button-icon", {
1198
+ "vc-app-toolbar-menu__button-icon--active": isActive
1199
+ }])
1200
+ }, [
1201
+ item.icon ? (openBlock(), createBlock(unref(_sfc_main$j), {
1202
+ key: 0,
1203
+ icon: item.icon,
1204
+ size: "l"
1205
+ }, null, 8, ["icon"])) : createCommentVNode("", true),
1206
+ isBadgeActive(item) ? (openBlock(), createElementBlock("div", _hoisted_4$2)) : createCommentVNode("", true)
1207
+ ], 2)
1208
+ ]),
1209
+ _: 2
1210
+ }, 1032, ["onToggle"])) : createCommentVNode("", true)
1211
+ ]);
1212
+ }), 128))
1213
+ ]);
1214
+ };
1215
+ }
1216
+ });
1217
+
1218
+ const _hoisted_1$4 = { class: "vc-app-bar__collapse-button-wrap" };
1219
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
1220
+ __name: "vc-app-bar",
1221
+ props: {
1222
+ logo: {},
1223
+ title: {},
1224
+ disableMenu: { type: Boolean }
1225
+ },
1226
+ emits: ["logo:click", "backlink:click"],
1227
+ setup(__props) {
1228
+ const {
1229
+ state,
1230
+ toggleSidebar,
1231
+ toggleMenu: toggleMenuState,
1232
+ closeAll,
1233
+ toggleHoverExpanded,
1234
+ isHoverExpanded
1235
+ } = useAppMenuState();
1236
+ const { currentWidget, hideAllWidgets, isAnyWidgetVisible } = useAppBarWidgets();
1237
+ const isMobile = inject("isMobile", ref(false));
1238
+ const isDesktop = inject("isDesktop", ref(true));
1239
+ const collapseButtonHover = ref(false);
1240
+ provide("appMenuState", { closeAll });
1241
+ const toggleMenu = () => {
1242
+ toggleMenuState();
1243
+ if (!state.value.isMenuOpen) {
1244
+ hideAllWidgets();
1245
+ }
1246
+ };
1247
+ const handleMenuClose = (value) => {
1248
+ if (!value) {
1249
+ closeAll();
1250
+ hideAllWidgets();
1251
+ }
1252
+ };
1253
+ const handleHoverExpand = (shouldExpand) => {
1254
+ toggleHoverExpanded(shouldExpand);
1255
+ };
1256
+ const appBarClasses = computed(() => {
1257
+ return {
1258
+ "vc-app-bar--mobile": isMobile.value,
1259
+ "vc-app-bar--desktop": isDesktop.value,
1260
+ "vc-app-bar--collapsed": !state.value.isSidebarExpanded && isDesktop.value,
1261
+ "vc-app-bar--hover-expanded": isDesktop.value && isHoverExpanded.value,
1262
+ "vc-app-bar--hover-collapsed": isDesktop.value && !state.value.isSidebarExpanded && !isHoverExpanded.value
1263
+ };
1264
+ });
1265
+ const wrapClasses = computed(() => {
1266
+ return {
1267
+ "vc-app-bar__wrap--mobile-expanded": isMobile.value && state.value.isSidebarExpanded,
1268
+ "vc-app-bar__wrap--desktop-collapsed": isDesktop.value && !state.value.isSidebarExpanded,
1269
+ "vc-app-bar__wrap--desktop-expanded": isDesktop.value && state.value.isSidebarExpanded,
1270
+ "vc-app-bar__wrap--hover-expanded": isDesktop.value && isHoverExpanded.value && !state.value.isSidebarExpanded,
1271
+ "vc-app-bar__wrap--hover-collapsed": isDesktop.value && !isHoverExpanded.value && !state.value.isSidebarExpanded
1272
+ };
1273
+ });
1274
+ return (_ctx, _cache) => {
1275
+ return openBlock(), createElementBlock(Fragment, null, [
1276
+ _ctx.$isDesktop.value ? (openBlock(), createElementBlock("div", {
1277
+ key: 0,
1278
+ class: normalizeClass(["vc-app-bar--padding", {
1279
+ "vc-app-bar--padding-expanded": unref(state).isSidebarExpanded
1280
+ }])
1281
+ }, null, 2)) : createCommentVNode("", true),
1282
+ createElementVNode("div", {
1283
+ class: normalizeClass(["vc-app-bar", appBarClasses.value]),
1284
+ onMouseenter: _cache[4] || (_cache[4] = ($event) => _ctx.$isDesktop.value && !unref(state).isSidebarExpanded && handleHoverExpand(true)),
1285
+ onMouseleave: _cache[5] || (_cache[5] = ($event) => _ctx.$isDesktop.value && !unref(state).isSidebarExpanded && handleHoverExpand(false))
1286
+ }, [
1287
+ createElementVNode("div", {
1288
+ class: normalizeClass(["vc-app-bar__wrap", wrapClasses.value])
1289
+ }, [
1290
+ !_ctx.$isMobile.value ? (openBlock(), createElementBlock("div", {
1291
+ key: 0,
1292
+ class: "vc-app-bar__collapse-button",
1293
+ onClick: _cache[0] || (_cache[0] = //@ts-ignore
1294
+ (...args) => unref(toggleSidebar) && unref(toggleSidebar)(...args))
1295
+ }, [
1296
+ createElementVNode("div", _hoisted_1$4, [
1297
+ createVNode(Transition, { name: "rotate" }, {
1298
+ default: withCtx(() => [
1299
+ withDirectives(createVNode(unref(_sfc_main$j), {
1300
+ class: normalizeClass(["vc-app-bar__collapse-button-icon", { "rotate-180": !unref(state).isSidebarExpanded }]),
1301
+ icon: unref(_sfc_main$p),
1302
+ size: "xs"
1303
+ }, null, 8, ["icon", "class"]), [
1304
+ [vShow, true]
1305
+ ])
1306
+ ]),
1307
+ _: 1
1308
+ })
1309
+ ])
1310
+ ])) : createCommentVNode("", true),
1311
+ createElementVNode("div", {
1312
+ class: normalizeClass(["vc-app-bar__wrapper", {
1313
+ "vc-app-bar__wrapper--mobile": _ctx.$isMobile.value,
1314
+ "vc-app-bar__wrapper--hover-collapsed": _ctx.$isDesktop.value && !unref(isHoverExpanded) && !unref(state).isSidebarExpanded
1315
+ }]),
1316
+ onMouseenter: _cache[2] || (_cache[2] = ($event) => collapseButtonHover.value = true),
1317
+ onMouseleave: _cache[3] || (_cache[3] = ($event) => collapseButtonHover.value = false)
1318
+ }, [
1319
+ createVNode(_sfc_main$e, {
1320
+ logo: _ctx.logo,
1321
+ expanded: unref(state).isSidebarExpanded || unref(isHoverExpanded),
1322
+ class: normalizeClass(["vc-app-bar__header", {
1323
+ "vc-app-bar__header--hover-expanded": _ctx.$isDesktop.value && unref(isHoverExpanded) && !unref(state).isSidebarExpanded,
1324
+ "vc-app-bar__header--collapsed": _ctx.$isDesktop.value && !unref(state).isSidebarExpanded && !unref(isHoverExpanded)
1325
+ }]),
1326
+ "onLogo:click": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("logo:click")),
1327
+ onToggleMenu: toggleMenu
1328
+ }, {
1329
+ actions: withCtx(() => [
1330
+ createVNode(_sfc_main$c, {
1331
+ "is-sidebar-mode": unref(state).isMenuOpen,
1332
+ expanded: unref(state).isSidebarExpanded
1333
+ }, null, 8, ["is-sidebar-mode", "expanded"])
1334
+ ]),
1335
+ _: 1
1336
+ }, 8, ["logo", "expanded", "class"]),
1337
+ unref(state).isMenuOpen ? (openBlock(), createBlock(_sfc_main$b, {
1338
+ key: 0,
1339
+ "is-opened": unref(state).isMenuOpen,
1340
+ expanded: unref(state).isSidebarExpanded,
1341
+ "onUpdate:isOpened": handleMenuClose
1342
+ }, {
1343
+ navmenu: withCtx(() => [
1344
+ renderSlot(_ctx.$slots, "navmenu")
1345
+ ]),
1346
+ "user-dropdown": withCtx(() => [
1347
+ renderSlot(_ctx.$slots, "user-dropdown")
1348
+ ]),
1349
+ "app-switcher": withCtx(() => [
1350
+ renderSlot(_ctx.$slots, "app-switcher")
1351
+ ]),
1352
+ widgets: withCtx(() => [
1353
+ createVNode(_sfc_main$8)
1354
+ ]),
1355
+ "widgets-active-content": withCtx(() => [
1356
+ unref(isAnyWidgetVisible) ? (openBlock(), createElementBlock("div", {
1357
+ key: 0,
1358
+ class: normalizeClass(["vc-app-bar__menu-dropdowns", { "vc-app-bar__menu-dropdowns--mobile": _ctx.$isMobile.value }])
1359
+ }, [
1360
+ (openBlock(), createBlock(resolveDynamicComponent(unref(currentWidget)?.component), mergeProps(unref(currentWidget)?.props || {}, { onClose: unref(hideAllWidgets) }), null, 16, ["onClose"]))
1361
+ ], 2)) : createCommentVNode("", true)
1362
+ ]),
1363
+ _: 3
1364
+ }, 8, ["is-opened", "expanded"])) : createCommentVNode("", true),
1365
+ _ctx.$isDesktop.value ? (openBlock(), createBlock(_sfc_main$a, {
1366
+ key: 1,
1367
+ expanded: unref(state).isSidebarExpanded
1368
+ }, {
1369
+ navmenu: withCtx(() => [
1370
+ renderSlot(_ctx.$slots, "navmenu")
1371
+ ]),
1372
+ "user-dropdown": withCtx(() => [
1373
+ renderSlot(_ctx.$slots, "user-dropdown")
1374
+ ]),
1375
+ _: 3
1376
+ }, 8, ["expanded"])) : createCommentVNode("", true)
1377
+ ], 34)
1378
+ ], 2)
1379
+ ], 34)
1380
+ ], 64);
1381
+ };
1382
+ }
1383
+ });
1384
+
1385
+ const _hoisted_1$3 = {
1386
+ key: 0,
1387
+ class: "vc-app-menu-link__icon"
1388
+ };
1389
+ const _hoisted_2$2 = {
1390
+ key: 1,
1391
+ class: "vc-app-menu-link__icon-letters"
1392
+ };
1393
+ const _hoisted_3$1 = { class: "vc-app-menu-link__title" };
1394
+ const _hoisted_4$1 = { class: "vc-app-menu-link__title-truncate" };
1395
+ const _hoisted_5 = {
1396
+ key: 0,
1397
+ class: "vc-app-menu-link__title-icon"
1398
+ };
1399
+ const _hoisted_6 = ["data-test-id", "onClick"];
1400
+ const _hoisted_7 = {
1401
+ key: 1,
1402
+ class: "vc-app-menu-link__icon-letters"
1403
+ };
1404
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
1405
+ __name: "vc-app-menu-link",
1406
+ props: {
1407
+ children: {},
1408
+ sticky: { type: Boolean, default: true },
1409
+ icon: {},
1410
+ title: {},
1411
+ url: {},
1412
+ expand: { type: Boolean },
1413
+ id: {}
1414
+ },
1415
+ emits: ["onClick"],
1416
+ setup(__props, { emit: __emit }) {
1417
+ const props = __props;
1418
+ const emit = __emit;
1419
+ const isOpened = ref(false);
1420
+ const route = useRoute();
1421
+ const params = Object.fromEntries(Object.entries(route.params).filter(([key]) => key !== "pathMatch"));
1422
+ const isMenuItemActive = computed(() => isActive(props.url ?? "") && !props.children?.length);
1423
+ watch(
1424
+ () => route.path,
1425
+ () => {
1426
+ if (props.children && props.children.length && props.children.find((x) => x?.url === route?.path)) {
1427
+ isOpened.value = true;
1428
+ }
1429
+ },
1430
+ { immediate: true }
1431
+ );
1432
+ function onMenuItemClick() {
1433
+ if (!props.children?.length) {
1434
+ emit("onClick");
1435
+ } else {
1436
+ isOpened.value = !isOpened.value;
1437
+ }
1438
+ }
1439
+ const isActive = (url) => {
1440
+ if (url) {
1441
+ let path = route.path;
1442
+ if (Object.values(params).length) {
1443
+ path = path.replace(Object.values(params)[0], "");
1444
+ }
1445
+ const active = path.endsWith(url);
1446
+ if (active && props.children?.length) {
1447
+ isOpened.value = true;
1448
+ }
1449
+ return active;
1450
+ } else {
1451
+ return false;
1452
+ }
1453
+ };
1454
+ const twoLettersTitle = (title) => {
1455
+ return unref(title)?.split(" ").slice(0, 2).map((word) => word[0]).join("");
1456
+ };
1457
+ onMounted(() => {
1458
+ const storedState = localStorage.getItem(`vc_menu_${props.id}_isOpened`);
1459
+ if (storedState) {
1460
+ isOpened.value = JSON.parse(storedState);
1461
+ }
1462
+ });
1463
+ watch(isOpened, (newValue) => {
1464
+ localStorage.setItem(`vc_menu_${props.id}_isOpened`, JSON.stringify(newValue));
1465
+ });
1466
+ return (_ctx, _cache) => {
1467
+ const _component_VcTooltip = resolveComponent("VcTooltip");
1468
+ const _component_router_link = resolveComponent("router-link");
1469
+ return openBlock(), createElementBlock(Fragment, null, [
1470
+ createElementVNode("div", {
1471
+ class: "vc-app-menu-link",
1472
+ onClick: onMenuItemClick
1473
+ }, [
1474
+ createVNode(_component_VcTooltip, null, createSlots({
1475
+ default: withCtx(() => [
1476
+ createElementVNode("div", {
1477
+ class: normalizeClass(["vc-app-menu-link__item", [
1478
+ {
1479
+ "vc-app-menu-link__item_active": isMenuItemActive.value,
1480
+ "vc-app-menu-link__item_no-hover": !_ctx.children?.length,
1481
+ "vc-app-menu-link__item_child-opened": _ctx.expand && isOpened.value,
1482
+ "vc-app-menu-link__item_collapsed": !_ctx.expand
1483
+ }
1484
+ ]])
1485
+ }, [
1486
+ _ctx.icon ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
1487
+ createVNode(unref(_sfc_main$j), {
1488
+ class: "vc-app-menu-link__icon-content",
1489
+ icon: _ctx.icon,
1490
+ size: "m"
1491
+ }, null, 8, ["icon"])
1492
+ ])) : createCommentVNode("", true),
1493
+ !_ctx.expand && !_ctx.icon ? (openBlock(), createElementBlock("div", _hoisted_2$2, toDisplayString(twoLettersTitle(_ctx.title)), 1)) : createCommentVNode("", true),
1494
+ createVNode(Transition, { name: "opacity" }, {
1495
+ default: withCtx(() => [
1496
+ withDirectives(createElementVNode("div", _hoisted_3$1, [
1497
+ createElementVNode("div", _hoisted_4$1, toDisplayString(_ctx.title), 1),
1498
+ !!_ctx.children?.length && _ctx.expand || false ? (openBlock(), createElementBlock("div", _hoisted_5, [
1499
+ createVNode(unref(_sfc_main$j), {
1500
+ class: "vc-app-menu-item__title-icon",
1501
+ icon: isOpened.value ? _sfc_main$q : _sfc_main$r,
1502
+ size: "m"
1503
+ }, null, 8, ["icon"])
1504
+ ])) : createCommentVNode("", true)
1505
+ ], 512), [
1506
+ [vShow, _ctx.expand]
1507
+ ])
1508
+ ]),
1509
+ _: 1
1510
+ })
1511
+ ], 2)
1512
+ ]),
1513
+ _: 2
1514
+ }, [
1515
+ !_ctx.expand ? {
1516
+ name: "tooltip",
1517
+ fn: withCtx(() => [
1518
+ createTextVNode(toDisplayString(_ctx.title), 1)
1519
+ ]),
1520
+ key: "0"
1521
+ } : void 0
1522
+ ]), 1024)
1523
+ ]),
1524
+ withDirectives(createElementVNode("div", {
1525
+ class: normalizeClass(["vc-app-menu-link__child", {
1526
+ "vc-app-menu-link__child-collapsed": !_ctx.expand
1527
+ }])
1528
+ }, [
1529
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.children, (nested, i) => {
1530
+ return openBlock(), createBlock(_component_VcTooltip, { key: i }, createSlots({
1531
+ default: withCtx(() => [
1532
+ _ctx.$hasAccess(nested.permissions) && nested.url ? (openBlock(), createBlock(_component_router_link, {
1533
+ key: 0,
1534
+ to: nested.url,
1535
+ custom: ""
1536
+ }, {
1537
+ default: withCtx(() => [
1538
+ createElementVNode("div", {
1539
+ class: "vc-app-menu-link__child-item-link",
1540
+ "data-test-id": nested.routeId,
1541
+ onClick: ($event) => _ctx.$emit("onClick", nested)
1542
+ }, [
1543
+ (openBlock(), createElementBlock("div", {
1544
+ key: i,
1545
+ class: normalizeClass([
1546
+ {
1547
+ "vc-app-menu-link__child-item_active": isActive(nested.url ?? ""),
1548
+ "vc-app-menu-link__child-item_collapsed": !_ctx.expand,
1549
+ "vc-app-menu-link__child-item_expanded": _ctx.expand
1550
+ },
1551
+ "vc-app-menu-link__child-item"
1552
+ ])
1553
+ }, [
1554
+ nested.icon ? (openBlock(), createElementBlock("div", {
1555
+ key: 0,
1556
+ class: normalizeClass(["vc-app-menu-link__icon vc-app-menu-link__icon--child", {
1557
+ "vc-app-menu-link__icon-collapsed": !_ctx.expand
1558
+ }])
1559
+ }, [
1560
+ createVNode(unref(_sfc_main$j), {
1561
+ class: "vc-app-menu-link__icon-content",
1562
+ icon: nested.icon,
1563
+ size: "m"
1564
+ }, null, 8, ["icon"])
1565
+ ], 2)) : createCommentVNode("", true),
1566
+ !_ctx.expand && !nested.icon ? (openBlock(), createElementBlock("div", _hoisted_7, toDisplayString(twoLettersTitle(nested.title)), 1)) : createCommentVNode("", true),
1567
+ createVNode(Transition, { name: "opacity" }, {
1568
+ default: withCtx(() => [
1569
+ withDirectives(createElementVNode("p", {
1570
+ class: normalizeClass(["vc-app-menu-link__child-item-title", {
1571
+ "vc-app-menu-link__child-item-title--no-icon": !nested.icon
1572
+ }])
1573
+ }, toDisplayString(nested.title), 3), [
1574
+ [vShow, _ctx.expand]
1575
+ ])
1576
+ ]),
1577
+ _: 2
1578
+ }, 1024)
1579
+ ], 2))
1580
+ ], 8, _hoisted_6)
1581
+ ]),
1582
+ _: 2
1583
+ }, 1032, ["to"])) : createCommentVNode("", true)
1584
+ ]),
1585
+ _: 2
1586
+ }, [
1587
+ !_ctx.expand ? {
1588
+ name: "tooltip",
1589
+ fn: withCtx(() => [
1590
+ createTextVNode(toDisplayString(nested.title), 1)
1591
+ ]),
1592
+ key: "0"
1593
+ } : void 0
1594
+ ]), 1024);
1595
+ }), 128))
1596
+ ], 2), [
1597
+ [vShow, isOpened.value]
1598
+ ])
1599
+ ], 64);
1600
+ };
1601
+ }
1602
+ });
1603
+
1604
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
1605
+ __name: "vc-app-menu-item",
1606
+ props: {
1607
+ sticky: { type: Boolean, default: true },
1608
+ isVisible: { type: Boolean },
1609
+ url: {},
1610
+ icon: {},
1611
+ title: {},
1612
+ children: { default: () => [] },
1613
+ expand: { type: Boolean },
1614
+ id: {}
1615
+ },
1616
+ emits: ["click"],
1617
+ setup(__props) {
1618
+ return (_ctx, _cache) => {
1619
+ const _component_router_link = resolveComponent("router-link");
1620
+ return openBlock(), createElementBlock("div", null, [
1621
+ _ctx.url ? (openBlock(), createBlock(_component_router_link, {
1622
+ key: 0,
1623
+ to: _ctx.url,
1624
+ custom: ""
1625
+ }, {
1626
+ default: withCtx(() => [
1627
+ _ctx.isVisible ? (openBlock(), createBlock(_sfc_main$6, {
1628
+ key: 0,
1629
+ id: _ctx.id,
1630
+ sticky: _ctx.sticky,
1631
+ icon: _ctx.icon ?? "",
1632
+ title: _ctx.title ?? "",
1633
+ url: _ctx.url,
1634
+ expand: _ctx.expand,
1635
+ onOnClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click"))
1636
+ }, null, 8, ["id", "sticky", "icon", "title", "url", "expand"])) : createCommentVNode("", true)
1637
+ ]),
1638
+ _: 1
1639
+ }, 8, ["to"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1640
+ _ctx.isVisible ? (openBlock(), createBlock(_sfc_main$6, {
1641
+ key: 0,
1642
+ id: _ctx.id,
1643
+ children: _ctx.children,
1644
+ sticky: _ctx.sticky,
1645
+ icon: _ctx.icon ?? "",
1646
+ title: _ctx.title ?? "",
1647
+ expand: _ctx.expand,
1648
+ onOnClick: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("click", $event))
1649
+ }, null, 8, ["id", "children", "sticky", "icon", "title", "expand"])) : createCommentVNode("", true)
1650
+ ], 64))
1651
+ ]);
1652
+ };
1653
+ }
1654
+ });
1655
+
1656
+ const _hoisted_1$2 = { class: "vc-app-menu__menu-items" };
1657
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
1658
+ __name: "vc-app-menu",
1659
+ props: {
1660
+ version: { default: "" }
1661
+ },
1662
+ emits: ["item:click", "version:click"],
1663
+ setup(__props, { emit: __emit }) {
1664
+ const emit = __emit;
1665
+ const isMobile = inject("isMobile");
1666
+ const { menuItems } = useMenuService();
1667
+ const { isExpanded, isHoverExpanded } = useMenuExpanded();
1668
+ const { closeAll } = useAppMenuState();
1669
+ const handleMenuItemClick = (item, nestedItem) => {
1670
+ if (isMobile.value) {
1671
+ closeAll();
1672
+ }
1673
+ emit("item:click", nestedItem ? nestedItem : item);
1674
+ };
1675
+ const isMenuVisible = computed(() => {
1676
+ return !!menuItems.value.length;
1677
+ });
1678
+ return (_ctx, _cache) => {
1679
+ return isMenuVisible.value ? (openBlock(), createElementBlock("div", {
1680
+ key: 0,
1681
+ class: normalizeClass(["vc-app-menu", {
1682
+ "vc-app-menu--mobile": _ctx.$isMobile.value,
1683
+ "vc-app-menu--collapsed": _ctx.$isDesktop.value && !unref(isExpanded),
1684
+ "vc-app-menu--hover-expanded": unref(isHoverExpanded)
1685
+ }])
1686
+ }, [
1687
+ createElementVNode("div", {
1688
+ class: normalizeClass(["vc-app-menu__inner", {
1689
+ "vc-app-menu__inner--desktop": _ctx.$isDesktop.value,
1690
+ "vc-app-menu__inner--collapsed": _ctx.$isDesktop.value && !unref(isExpanded),
1691
+ "vc-app-menu__inner--hover-expanded": unref(isHoverExpanded)
1692
+ }])
1693
+ }, [
1694
+ createVNode(unref(VcContainer), {
1695
+ "no-padding": true,
1696
+ class: "vc-app-menu__container"
1697
+ }, {
1698
+ default: withCtx(() => [
1699
+ createElementVNode("div", _hoisted_1$2, [
1700
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(menuItems), (item) => {
1701
+ return openBlock(), createBlock(_sfc_main$5, {
1702
+ id: item.id,
1703
+ key: item?.id,
1704
+ "data-test-id": item?.routeId,
1705
+ "is-visible": _ctx.$hasAccess(item.permissions) && (item.children?.some((child) => _ctx.$hasAccess(child.permissions)) ?? true),
1706
+ url: item.url,
1707
+ icon: item.groupIcon || item.icon,
1708
+ title: item.title,
1709
+ children: item.children,
1710
+ expand: _ctx.$isDesktop.value ? unref(isExpanded) || unref(isHoverExpanded) : true,
1711
+ onClick: ($event) => handleMenuItemClick(item, $event)
1712
+ }, null, 8, ["id", "data-test-id", "is-visible", "url", "icon", "title", "children", "expand", "onClick"]);
1713
+ }), 128))
1714
+ ])
1715
+ ]),
1716
+ _: 1
1717
+ })
1718
+ ], 2)
1719
+ ], 2)) : createCommentVNode("", true);
1720
+ };
1721
+ }
1722
+ });
1723
+
1724
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
1725
+ __name: "change-password-button",
1726
+ setup(__props) {
1727
+ const { open } = usePopup({ component: ChangePassword });
1728
+ const handleClick = () => {
1729
+ open();
1730
+ };
1731
+ return (_ctx, _cache) => {
1732
+ return openBlock(), createBlock(unref(_sfc_main$i), {
1733
+ icon: unref(_sfc_main$s),
1734
+ title: _ctx.$t("SHELL.ACCOUNT.CHANGE_PASSWORD"),
1735
+ "onTrigger:click": handleClick
1736
+ }, null, 8, ["icon", "title"]);
1737
+ };
1738
+ }
1739
+ });
1740
+
1741
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1742
+ __name: "logout-button",
1743
+ setup(__props) {
1744
+ const { signOut } = useUser();
1745
+ const router = useRouter();
1746
+ const { closeBlade } = useBladeNavigation();
1747
+ const handleLogout = async () => {
1748
+ const isPrevented = await closeBlade(0);
1749
+ if (!isPrevented) {
1750
+ await signOut();
1751
+ router.push({ name: "Login" });
1752
+ }
1753
+ };
1754
+ return (_ctx, _cache) => {
1755
+ return openBlock(), createBlock(unref(_sfc_main$i), {
1756
+ icon: unref(_sfc_main$t),
1757
+ title: _ctx.$t("SHELL.ACCOUNT.LOGOUT"),
1758
+ "onTrigger:click": handleLogout
1759
+ }, null, 8, ["icon", "title"]);
1760
+ };
1761
+ }
1762
+ });
1763
+
1764
+ const _hoisted_1$1 = { class: "vc-app__main-content" };
1765
+ const _hoisted_2$1 = {
1766
+ key: 0,
1767
+ class: "vc-app__workspace"
1768
+ };
1769
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1770
+ ...{
1771
+ inheritAttrs: false
1772
+ },
1773
+ __name: "vc-app",
1774
+ props: {
1775
+ isReady: { type: Boolean },
1776
+ logo: {},
1777
+ version: {},
1778
+ title: {},
1779
+ avatar: {},
1780
+ name: {},
1781
+ disableMenu: { type: Boolean },
1782
+ role: {}
1783
+ },
1784
+ emits: ["logo-click"],
1785
+ setup(__props, { emit: __emit }) {
1786
+ const props = __props;
1787
+ console.debug("vc-app: Init vc-app");
1788
+ const internalRoutes = inject("bladeRoutes");
1789
+ const dynamicModules = inject(DynamicModulesKey, void 0);
1790
+ const isAppReady = ref(props.isReady);
1791
+ const router = useRouter();
1792
+ const { openBlade, closeBlade, resolveBladeByName, blades, goToRoot } = useBladeNavigation();
1793
+ const { appsList, switchApp, getApps } = useAppSwitcher();
1794
+ const { loadFromHistory, notifications, markAllAsRead } = useNotifications();
1795
+ const route = useRoute();
1796
+ const { isAuthenticated } = useUser();
1797
+ const routes = router.getRoutes();
1798
+ const { register: registerMenuItem } = provideSettingsMenu();
1799
+ const { register: registerAppBarWidget } = provideAppBarWidget();
1800
+ const hasUnreadNotifications = computed(() => {
1801
+ return notifications.value.some((item) => item.isNew);
1802
+ });
1803
+ const { t } = useI18n({ useScope: "global" });
1804
+ const { register: registerMobileButton } = provideAppBarMobileButtonsService();
1805
+ registerMenuItem({
1806
+ id: "language-selector",
1807
+ component: LanguageSelector,
1808
+ order: 20
1809
+ });
1810
+ registerMenuItem({
1811
+ id: "theme-selector",
1812
+ component: _sfc_main$f,
1813
+ order: 10
1814
+ });
1815
+ registerMenuItem({
1816
+ id: "change-password",
1817
+ component: _sfc_main$3,
1818
+ order: 30
1819
+ });
1820
+ registerMenuItem({
1821
+ id: "logout",
1822
+ component: _sfc_main$2,
1823
+ order: 100
1824
+ });
1825
+ registerAppBarWidget({
1826
+ id: "notification-dropdown",
1827
+ component: NotificationDropdown,
1828
+ icon: _sfc_main$u,
1829
+ order: 10,
1830
+ badge: () => hasUnreadNotifications.value
1831
+ });
1832
+ registerMobileButton({
1833
+ id: "notification-dropdown",
1834
+ component: NotificationDropdown,
1835
+ icon: _sfc_main$u,
1836
+ order: 10
1837
+ });
1838
+ const onMenuItemClick = function(item) {
1839
+ console.debug(`vc-app#onMenuItemClick() called.`);
1840
+ if (item.routeId) {
1841
+ openBlade(
1842
+ {
1843
+ blade: resolveBladeByName(item.routeId)
1844
+ },
1845
+ true
1846
+ );
1847
+ } else if (!item.routeId && item.url) {
1848
+ const menuRoute = routes.find((r) => {
1849
+ return "/" + r.path.split("/").filter((part) => part !== "")[1] === item.url || r.path === item.url;
1850
+ });
1851
+ if (typeof menuRoute === "undefined") {
1852
+ openRoot();
1853
+ } else {
1854
+ router.push({ name: menuRoute?.name, params: route.params });
1855
+ }
1856
+ }
1857
+ };
1858
+ const openRoot = async () => {
1859
+ const isPrevented = await closeBlade(1);
1860
+ if (!isPrevented) {
1861
+ router.push(goToRoot());
1862
+ }
1863
+ };
1864
+ watchOnce(
1865
+ () => props.isReady,
1866
+ async (newVal) => {
1867
+ isAppReady.value = newVal;
1868
+ if (isAuthenticated.value && newVal) {
1869
+ await loadFromHistory();
1870
+ await getApps();
1871
+ }
1872
+ }
1873
+ );
1874
+ watch(isAuthenticated, (newVal) => {
1875
+ isAppReady.value = newVal;
1876
+ });
1877
+ provide("internalRoutes", internalRoutes);
1878
+ provide(DynamicModulesKey, dynamicModules);
1879
+ provideDashboardService();
1880
+ provideMenuService();
1881
+ provideGlobalSearch();
1882
+ onUnmounted(() => {
1883
+ isAppReady.value = false;
1884
+ });
1885
+ return (_ctx, _cache) => {
1886
+ const _component_VcLoading = resolveComponent("VcLoading");
1887
+ const _component_VcAppSwitcher = resolveComponent("VcAppSwitcher");
1888
+ const _component_VcBladeNavigation = resolveComponent("VcBladeNavigation");
1889
+ return !isAppReady.value ? (openBlock(), createBlock(_component_VcLoading, {
1890
+ key: 0,
1891
+ active: "",
1892
+ class: "vc-app__loader"
1893
+ })) : (openBlock(), createElementBlock("div", {
1894
+ key: 1,
1895
+ class: normalizeClass(["vc-app", {
1896
+ "vc-app_mobile": _ctx.$isMobile.value
1897
+ }])
1898
+ }, [
1899
+ createElementVNode("div", _hoisted_1$1, [
1900
+ createVNode(_sfc_main$7, {
1901
+ class: "vc-app__app-bar",
1902
+ logo: _ctx.logo,
1903
+ title: _ctx.title,
1904
+ "disable-menu": _ctx.disableMenu,
1905
+ "onBacklink:click": _cache[1] || (_cache[1] = ($event) => unref(closeBlade)(unref(blades).length - 1)),
1906
+ "onLogo:click": openRoot
1907
+ }, {
1908
+ "app-switcher": withCtx(() => [
1909
+ renderSlot(_ctx.$slots, "app-switcher", {}, () => [
1910
+ createVNode(_component_VcAppSwitcher, {
1911
+ "apps-list": unref(appsList),
1912
+ onOnClick: _cache[0] || (_cache[0] = ($event) => unref(switchApp)($event))
1913
+ }, null, 8, ["apps-list"])
1914
+ ])
1915
+ ]),
1916
+ navmenu: withCtx(() => [
1917
+ !_ctx.disableMenu ? (openBlock(), createBlock(_sfc_main$4, {
1918
+ key: 0,
1919
+ ref: "menu",
1920
+ class: "vc-app__app-menu",
1921
+ version: _ctx.version,
1922
+ "onItem:click": onMenuItemClick
1923
+ }, null, 8, ["version"])) : createCommentVNode("", true)
1924
+ ]),
1925
+ "user-dropdown": withCtx(() => [
1926
+ createVNode(unref(UserDropdownButton), {
1927
+ "avatar-url": _ctx.avatar,
1928
+ name: _ctx.name,
1929
+ role: _ctx.role
1930
+ }, null, 8, ["avatar-url", "name", "role"])
1931
+ ]),
1932
+ _: 3
1933
+ }, 8, ["logo", "title", "disable-menu"]),
1934
+ unref(isAuthenticated) ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
1935
+ createVNode(_component_VcBladeNavigation)
1936
+ ])) : createCommentVNode("", true),
1937
+ createVNode(unref(VcPopupContainer))
1938
+ ])
1939
+ ], 2));
1940
+ };
1941
+ }
1942
+ });
1943
+
1944
+ const _hoisted_1 = { class: "vc-login-form__box" };
1945
+ const _hoisted_2 = { class: "vc-login-form__header" };
1946
+ const _hoisted_3 = { class: "vc-login-form__content" };
1947
+ const _hoisted_4 = { class: "vc-login-form__version" };
1948
+ const _sfc_main = /* @__PURE__ */ defineComponent({
1949
+ __name: "vc-login-form",
1950
+ props: {
1951
+ logo: {},
1952
+ background: {},
1953
+ title: { default: "Login" }
1954
+ },
1955
+ setup(__props) {
1956
+ const props = __props;
1957
+ const router = useRouter();
1958
+ const backgroundImageHandler = computed(() => {
1959
+ if (props.background) {
1960
+ return `background: url(${CSS.escape(props.background)}) center / cover no-repeat`;
1961
+ }
1962
+ return void 0;
1963
+ });
1964
+ const logoImageHandler = computed(() => {
1965
+ if (props.logo) {
1966
+ return `background: url(${CSS.escape(props.logo)}) center / contain no-repeat`;
1967
+ }
1968
+ return void 0;
1969
+ });
1970
+ const version = router.currentRoute.value.meta?.appVersion;
1971
+ console.debug("Init vc-login-form");
1972
+ return (_ctx, _cache) => {
1973
+ return openBlock(), createElementBlock("div", {
1974
+ class: "vc-login-form__container",
1975
+ style: normalizeStyle(backgroundImageHandler.value)
1976
+ }, [
1977
+ createElementVNode("div", {
1978
+ class: "vc-login-form__logo",
1979
+ style: normalizeStyle(logoImageHandler.value)
1980
+ }, null, 4),
1981
+ createElementVNode("div", _hoisted_1, [
1982
+ createElementVNode("div", _hoisted_2, toDisplayString(_ctx.title), 1),
1983
+ createElementVNode("div", _hoisted_3, [
1984
+ renderSlot(_ctx.$slots, "default")
1985
+ ])
1986
+ ]),
1987
+ createElementVNode("div", _hoisted_4, toDisplayString(unref(version)), 1)
1988
+ ], 4);
1989
+ };
1990
+ }
1991
+ });
1992
+
1993
+ export { LanguageSelector as L, _sfc_main$1 as _, _sfc_main as a, _sfc_main$g as b, addMenuItem as c, _sfc_main$i as d, _sfc_main$f as e, createMenuService as f, createSettingsMenuService as g, useMenuService as h, provideDashboardService as i, useDashboard as j, provideSettingsMenu as k, useSettingsMenu as l, addSettingsMenuItem as m, provideMenuService as p, registerDashboardWidget as r, useTheme as u };