@vc-shell/framework 1.1.0-alpha.3 → 1.1.0-alpha.4

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 (156) hide show
  1. package/core/composables/index.ts +18 -17
  2. package/core/composables/useDashboard/index.ts +19 -0
  3. package/core/composables/{useGlobalSearch.ts → useGlobalSearch/index.ts} +3 -5
  4. package/core/composables/useWidgets/index.ts +19 -18
  5. package/core/plugins/modularity/loader.ts +2 -1
  6. package/core/services/dashboard-service.ts +121 -0
  7. package/core/services/widget-service.ts +1 -4
  8. package/dist/core/composables/index.d.ts +1 -0
  9. package/dist/core/composables/index.d.ts.map +1 -1
  10. package/dist/core/composables/useDashboard/index.d.ts +5 -0
  11. package/dist/core/composables/useDashboard/index.d.ts.map +1 -0
  12. package/dist/core/composables/{useGlobalSearch.d.ts → useGlobalSearch/index.d.ts} +1 -1
  13. package/dist/core/composables/useGlobalSearch/index.d.ts.map +1 -0
  14. package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
  15. package/dist/core/services/dashboard-service.d.ts +33 -0
  16. package/dist/core/services/dashboard-service.d.ts.map +1 -0
  17. package/dist/core/services/widget-service.d.ts.map +1 -1
  18. package/dist/framework.js +235 -225
  19. package/dist/{index-Bu12RZTu.js → index-8LELHzw9.js} +1 -1
  20. package/dist/{index-Bwl2ND2Q.js → index-9lJxZE5w.js} +1 -1
  21. package/dist/{index-CJi-BbTb.js → index-B1YR_MYV.js} +1 -1
  22. package/dist/{index-BhdwVgUw.js → index-BA98L1jI.js} +1 -1
  23. package/dist/{index-NdrUF1u3.js → index-BAeTsi-X.js} +1 -1
  24. package/dist/{index-CbRqPQTw.js → index-BBYyHeYA.js} +1 -1
  25. package/dist/{index-CsaYfhir.js → index-BrUitdDo.js} +1 -1
  26. package/dist/{index-CZ_pj3nW.js → index-BuO5ByG9.js} +1 -1
  27. package/dist/{index-DFPb-jDP.js → index-CJ5I7vTn.js} +1 -1
  28. package/dist/{index-BdoAu2fz.js → index-CWKrD2Cd.js} +1 -1
  29. package/dist/{index-DVaMW7gL.js → index-Cf9Tz1ql.js} +1 -1
  30. package/dist/{index-B89uIUkS.js → index-CrxFDC2b.js} +1 -1
  31. package/dist/{index-BcQiBkO6.js → index-D1JchciU.js} +1 -1
  32. package/dist/{index-CEvuTGIu.js → index-DLtsQ_PJ.js} +31254 -31134
  33. package/dist/{index-COjjAS6v.js → index-DVljTjbf.js} +1 -1
  34. package/dist/{index-DjQ6Ffv8.js → index-RwX3kiZh.js} +28 -28
  35. package/dist/{index-S9Ht7s3i.js → index-xLYzNPa7.js} +1 -1
  36. package/dist/index.css +1 -1
  37. package/dist/injection-keys.d.ts +28 -0
  38. package/dist/injection-keys.d.ts.map +1 -1
  39. package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts +25 -0
  40. package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts.map +1 -0
  41. package/dist/shared/components/dashboard-widget-card/index.d.ts +2 -0
  42. package/dist/shared/components/dashboard-widget-card/index.d.ts.map +1 -0
  43. package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts +6 -0
  44. package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts.map +1 -0
  45. package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts +20 -0
  46. package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts.map +1 -0
  47. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts +354 -0
  48. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -0
  49. package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts +12 -0
  50. package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts.map +1 -0
  51. package/dist/shared/components/draggable-dashboard/index.d.ts +2 -0
  52. package/dist/shared/components/draggable-dashboard/index.d.ts.map +1 -0
  53. package/dist/shared/components/draggable-dashboard/types.d.ts +80 -0
  54. package/dist/shared/components/draggable-dashboard/types.d.ts.map +1 -0
  55. package/dist/shared/components/index.d.ts +2 -0
  56. package/dist/shared/components/index.d.ts.map +1 -1
  57. package/dist/shared/components/user-dropdown-button/_internal/user-info.vue.d.ts.map +1 -1
  58. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  59. package/dist/shared/composables/useMenuExpanded.d.ts +2 -0
  60. package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
  61. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +0 -41
  62. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  63. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts +1 -1
  65. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -25
  67. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  68. package/dist/tailwind.config.d.ts +1 -81
  69. package/dist/tailwind.config.d.ts.map +1 -1
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts +169 -734
  72. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts.map +1 -1
  73. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +18 -2
  74. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
  75. package/dist/ui/components/atoms/vc-card/index.d.ts +2 -0
  76. package/dist/ui/components/atoms/vc-card/index.d.ts.map +1 -1
  77. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +12 -0
  78. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
  79. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts +2 -0
  80. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
  81. package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts +18 -0
  82. package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts.map +1 -0
  83. package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts +18 -0
  84. package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts.map +1 -0
  85. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts +2 -0
  86. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts.map +1 -1
  87. package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts +2 -0
  88. package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts.map +1 -1
  89. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts +0 -1
  90. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  91. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue.d.ts +2 -1
  92. 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
  93. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  94. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +13 -67
  95. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  96. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +5 -65
  97. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  98. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  99. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/{vc-table-header/vc-table-header.vue.d.ts → vc-table-columns-header/vc-table-columns-header.vue.d.ts} +1 -1
  100. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue.d.ts.map +1 -0
  101. package/dist/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue.d.ts.map +1 -1
  102. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts +33 -3
  103. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts.map +1 -1
  104. package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
  105. package/package.json +10 -5
  106. package/shared/components/dashboard-widget-card/dashboard-widget-card.vue +67 -0
  107. package/shared/components/dashboard-widget-card/index.ts +1 -0
  108. package/shared/components/draggable-dashboard/DraggableDashboard.vue +369 -0
  109. package/shared/components/draggable-dashboard/_internal/DashboardWidget.vue +133 -0
  110. package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +547 -0
  111. package/shared/components/draggable-dashboard/composables/useDashboardGrid.ts +250 -0
  112. package/shared/components/draggable-dashboard/index.ts +1 -0
  113. package/shared/components/draggable-dashboard/types.ts +91 -0
  114. package/shared/components/index.ts +2 -0
  115. package/shared/components/user-dropdown-button/_internal/user-info.vue +25 -12
  116. package/shared/components/user-dropdown-button/user-dropdown-button.vue +3 -3
  117. package/shared/composables/useMenuExpanded.ts +24 -0
  118. package/shared/modules/assets/components/assets-details/assets-details.vue +1 -1
  119. package/shared/modules/dynamic/components/fields/storybook/Button.stories.ts +186 -247
  120. package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +175 -176
  121. package/shared/modules/dynamic/components/fields/storybook/common/templates.ts +8 -8
  122. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +153 -187
  123. package/tailwind.config.ts +127 -126
  124. package/ui/components/atoms/vc-button/vc-button.stories.ts +1 -16
  125. package/ui/components/atoms/vc-button/vc-button.vue +74 -63
  126. package/ui/components/atoms/vc-card/vc-card.stories.ts +102 -102
  127. package/ui/components/atoms/vc-card/vc-card.vue +164 -159
  128. package/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue +22 -0
  129. package/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue +16 -0
  130. package/ui/components/atoms/vc-icon/icons/index.ts +2 -0
  131. package/ui/components/molecules/vc-field/vc-field.vue +1 -1
  132. package/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.ts +12 -1
  133. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarContent.vue +1 -2
  134. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +1 -1
  135. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue +0 -1
  136. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +274 -112
  137. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +81 -37
  138. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +7 -5
  139. package/ui/components/organisms/vc-app/vc-app.vue +26 -15
  140. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +5 -7
  141. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/{vc-table-header/vc-table-header.vue → vc-table-columns-header/vc-table-columns-header.vue} +23 -21
  142. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue +1 -0
  143. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue +1 -1
  144. package/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue +12 -1
  145. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue +45 -2
  146. package/ui/components/organisms/vc-table/composables/useTableColumnReorder.ts +5 -5
  147. package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +1 -1
  148. package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +1 -0
  149. package/core/services/toolbarbus-service.ts +0 -34
  150. package/dist/core/composables/useGlobalSearch.d.ts.map +0 -1
  151. package/dist/core/services/toolbarbus-service.d.ts +0 -10
  152. package/dist/core/services/toolbarbus-service.d.ts.map +0 -1
  153. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts +0 -5
  154. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts.map +0 -1
  155. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-header/vc-table-header.vue.d.ts.map +0 -1
  156. package/ui/components/organisms/vc-app/composables/useToolbarSlots.ts +0 -37
@@ -31,23 +31,32 @@
31
31
  />
32
32
  </div>
33
33
  <div
34
- v-if="expand"
35
- class="vc-app-menu-link__title"
34
+ v-if="!expand && !icon"
35
+ class="vc-app-menu-link__icon-letters"
36
36
  >
37
- <div class="vc-app-menu-link__title-truncate">
38
- {{ title }}
39
- </div>
37
+ {{ twoLettersTitle(title) }}
38
+ </div>
39
+
40
+ <Transition name="opacity">
40
41
  <div
41
- v-if="!!children?.length || false"
42
- class="vc-app-menu-link__title-icon"
42
+ v-show="expand"
43
+ class="vc-app-menu-link__title"
43
44
  >
44
- <VcIcon
45
- class="vc-app-menu-item__title-icon"
46
- :icon="isOpened ? ChevronUpIcon : ChevronDownIcon"
47
- size="m"
48
- ></VcIcon>
45
+ <div class="vc-app-menu-link__title-truncate">
46
+ {{ title }}
47
+ </div>
48
+ <div
49
+ v-if="(!!children?.length && expand) || false"
50
+ class="vc-app-menu-link__title-icon"
51
+ >
52
+ <VcIcon
53
+ class="vc-app-menu-item__title-icon"
54
+ :icon="isOpened ? ChevronUpIcon : ChevronDownIcon"
55
+ size="m"
56
+ ></VcIcon>
57
+ </div>
49
58
  </div>
50
- </div>
59
+ </Transition>
51
60
  </div>
52
61
  </VcTooltip>
53
62
  </div>
@@ -92,7 +101,7 @@
92
101
  >
93
102
  <div
94
103
  v-if="nested.icon"
95
- class="vc-app-menu-link__icon"
104
+ class="vc-app-menu-link__icon vc-app-menu-link__icon--child"
96
105
  :class="{
97
106
  'vc-app-menu-link__icon-collapsed': !expand,
98
107
  }"
@@ -103,12 +112,23 @@
103
112
  size="m"
104
113
  />
105
114
  </div>
106
- <p
107
- v-if="expand"
108
- class="vc-app-menu-link__child-item-title"
115
+ <div
116
+ v-if="!expand && !nested.icon"
117
+ class="vc-app-menu-link__icon-letters"
109
118
  >
110
- {{ nested.title }}
111
- </p>
119
+ {{ twoLettersTitle(nested.title) }}
120
+ </div>
121
+ <Transition name="opacity">
122
+ <p
123
+ v-show="expand"
124
+ class="vc-app-menu-link__child-item-title"
125
+ :class="{
126
+ 'vc-app-menu-link__child-item-title--no-icon': !nested.icon,
127
+ }"
128
+ >
129
+ {{ nested.title }}
130
+ </p>
131
+ </Transition>
112
132
  </div>
113
133
  </div>
114
134
  </router-link>
@@ -118,7 +138,7 @@
118
138
  </template>
119
139
 
120
140
  <script lang="ts" setup>
121
- import { ref, watch, computed, onMounted } from "vue";
141
+ import { ref, watch, computed, onMounted, Component, MaybeRef, unref } from "vue";
122
142
  import { MenuItem } from "./../../../../../../../../../core/types";
123
143
  import { VcIcon } from "./../../../../../../../";
124
144
  import { useRoute } from "vue-router";
@@ -128,7 +148,7 @@ import ChevronDownIcon from "./../../../../../../../atoms/vc-icon/icons/ChevronD
128
148
  export interface Props {
129
149
  children?: MenuItem[];
130
150
  sticky?: boolean;
131
- icon: string;
151
+ icon: string | Component;
132
152
  title?: string;
133
153
  url?: string;
134
154
  expand?: boolean;
@@ -188,6 +208,15 @@ const isActive = (url: string) => {
188
208
  }
189
209
  };
190
210
 
211
+ const twoLettersTitle = (title: MaybeRef<string> | undefined) => {
212
+ // get first letters in title words and combine them. Two letters maximum
213
+ return unref(title)
214
+ ?.split(" ")
215
+ .slice(0, 2)
216
+ .map((word) => word[0])
217
+ .join("");
218
+ };
219
+
191
220
  onMounted(() => {
192
221
  const storedState = localStorage.getItem(`vc_menu_${props.id}_isOpened`);
193
222
  if (storedState) {
@@ -204,6 +233,7 @@ watch(isOpened, (newValue) => {
204
233
  :root {
205
234
  --app-menu-item-height: 38px;
206
235
  --app-menu-item-icon-width: 16px;
236
+ --app-menu-item-icon-width-container: 23px;
207
237
  --app-menu-item-icon-color: var(--neutrals-600);
208
238
  --app-menu-item-icon-color-active: var(--primary-700);
209
239
  --app-menu-item-background-color-hover: var(--neutrals-100);
@@ -218,6 +248,7 @@ watch(isOpened, (newValue) => {
218
248
 
219
249
  .vc-app-menu-link {
220
250
  @apply tw-cursor-pointer tw-w-full;
251
+ @apply tw-transition-transform tw-duration-[0] tw-ease-in-out #{!important};
221
252
 
222
253
  &:hover .vc-app-menu-link__item:not(.vc-app-menu-link__item_active) {
223
254
  @apply tw-bg-[var(--app-menu-item-background-color-hover)] tw-bg-opacity-50 tw-rounded;
@@ -238,14 +269,9 @@ watch(isOpened, (newValue) => {
238
269
  &__item {
239
270
  @apply tw-flex tw-items-center tw-w-full tw-h-[var(--app-menu-item-height)]
240
271
  tw-border-none tw-flex-nowrap tw-box-border tw-cursor-pointer tw-relative
241
- tw-uppercase tw-select-none tw-px-2;
272
+ tw-uppercase tw-select-none tw-px-2 tw-gap-4;
242
273
 
243
274
  &_collapsed {
244
- @apply tw-justify-center;
245
-
246
- .vc-app-menu-link__title {
247
- @apply tw-hidden;
248
- }
249
275
  }
250
276
 
251
277
  &_active {
@@ -278,7 +304,15 @@ watch(isOpened, (newValue) => {
278
304
  &__icon {
279
305
  @apply tw-text-[color:var(--app-menu-item-icon-color)]
280
306
  tw-overflow-hidden tw-flex
281
- tw-justify-center tw-shrink-0 tw-transition-[color] tw-duration-200 tw-w-[var(--app-menu-item-icon-width)];
307
+ tw-justify-center tw-shrink-0 tw-transition-[color] tw-duration-200 tw-w-[var(--app-menu-item-icon-width-container)];
308
+
309
+ &--child {
310
+ // @apply tw-mr-5;
311
+ }
312
+ }
313
+
314
+ &__icon-letters {
315
+ @apply tw-shrink-0 tw-w-[24px] tw-h-[24px] tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-xxs tw-leading-[10px] tw-font-extrabold tw-text-[var(--neutrals-500)] tw-border-[2px] tw-border-[var(--neutrals-500)];
282
316
  }
283
317
 
284
318
  &__title {
@@ -287,7 +321,7 @@ watch(isOpened, (newValue) => {
287
321
  tw-font-normal
288
322
  tw-leading-normal
289
323
  tw-normal-case
290
- tw-pl-4
324
+
291
325
  [transition:color_0.2s_ease]
292
326
  tw-opacity-100 tw-w-full tw-flex tw-justify-between tw-items-center;
293
327
  }
@@ -301,11 +335,11 @@ watch(isOpened, (newValue) => {
301
335
  }
302
336
 
303
337
  &__title-icon {
304
- @apply tw-ml-3 tw-text-[color:var(--app-menu-item-icon-color)];
338
+ @apply tw-ml-3;
305
339
  }
306
340
 
307
341
  &__icon-content {
308
- @apply tw-text-center;
342
+ @apply tw-text-center tw-text-[length:var(--app-menu-item-icon-width)];
309
343
  }
310
344
 
311
345
  &__child {
@@ -314,17 +348,17 @@ watch(isOpened, (newValue) => {
314
348
 
315
349
  &__child-item {
316
350
  @apply tw-cursor-pointer tw-min-w-0 tw-flex tw-h-[var(--app-menu-item-height)]
317
- tw-items-center tw-transition-[padding] tw-duration-150 tw-w-fit tw-py-2 tw-px-3
351
+ tw-items-center tw-transition-[padding] tw-duration-150 tw-w-full tw-py-2 tw-px-3
318
352
  tw-text-[color:var(--app-menu-item-title-color)] tw-text-sm
319
353
  hover:tw-bg-[var(--app-menu-item-background-color-hover)]
320
- hover:tw-text-[color:var(--app-menu-item-title-color-active)];
354
+ hover:tw-text-[color:var(--app-menu-item-title-color-active)] tw-gap-5;
321
355
 
322
356
  &_expanded {
323
- @apply tw-pl-5 tw-w-full #{!important};
357
+ @apply tw-pl-7 tw-w-full #{!important};
324
358
  }
325
359
 
326
360
  &_collapsed {
327
- @apply tw-w-auto tw-justify-center;
361
+ @apply tw-pl-2;
328
362
  }
329
363
 
330
364
  &_active {
@@ -339,7 +373,7 @@ watch(isOpened, (newValue) => {
339
373
  }
340
374
 
341
375
  &__child-item-title {
342
- @apply tw-truncate tw-pl-5;
376
+ @apply tw-truncate;
343
377
  }
344
378
 
345
379
  &__child-item-link {
@@ -355,7 +389,17 @@ watch(isOpened, (newValue) => {
355
389
  }
356
390
 
357
391
  &__icon-collapsed {
358
- @apply tw-p-0;
392
+ @apply tw-p-0 tw-m-0;
359
393
  }
360
394
  }
395
+
396
+ .opacity-enter-active,
397
+ .opacity-leave-active {
398
+ transition: opacity 0.3s ease;
399
+ }
400
+
401
+ .opacity-enter-from,
402
+ .opacity-leave-to {
403
+ opacity: 0;
404
+ }
361
405
  </style>
@@ -5,6 +5,7 @@
5
5
  :class="{
6
6
  'vc-app-menu--mobile': $isMobile.value,
7
7
  'vc-app-menu--collapsed': $isDesktop.value && !isExpanded,
8
+ 'vc-app-menu--hover-expanded': isHoverExpanded,
8
9
  }"
9
10
  >
10
11
  <div
@@ -12,6 +13,7 @@
12
13
  :class="{
13
14
  'vc-app-menu__inner--desktop': $isDesktop.value,
14
15
  'vc-app-menu__inner--collapsed': $isDesktop.value && !isExpanded,
16
+ 'vc-app-menu__inner--hover-expanded': isHoverExpanded,
15
17
  }"
16
18
  >
17
19
  <!-- Show scrollable area with menu items -->
@@ -32,8 +34,8 @@
32
34
  :icon="item.groupIcon || item.icon"
33
35
  :title="item.title as string"
34
36
  :children="item.children"
35
- :expand="$isDesktop.value ? isExpanded : true"
36
- @click="handleMenuItemClick( item, $event)"
37
+ :expand="$isDesktop.value ? isExpanded || isHoverExpanded : true"
38
+ @click="handleMenuItemClick(item, $event)"
37
39
  />
38
40
  </div>
39
41
  </VcContainer>
@@ -77,7 +79,7 @@ const emit = defineEmits<Emits>();
77
79
 
78
80
  const isMobile = inject("isMobile") as Ref<boolean>;
79
81
  const { menuItems } = useMenuService();
80
- const { isExpanded } = useMenuExpanded();
82
+ const { isExpanded, isHoverExpanded } = useMenuExpanded();
81
83
  const { closeAll } = useAppMenuState();
82
84
 
83
85
  const handleMenuItemClick = (item: MenuItem, nestedItem?: MenuItem) => {
@@ -105,8 +107,8 @@ const isMenuVisible = computed(() => {
105
107
  --app-backdrop-overlay: rgb(from var(--app-backdrop-overlay-bg) r g b / 75%);
106
108
 
107
109
  --app-backdrop-shadow-color: var(--additional-950);
108
- --app-backdrop-shadow: 0 -6px 6px var(--additional-50),
109
- 1px 1px 22px rgb(from var(--notification-dropdown-shadow-color) r g b / 7%);
110
+ --app-backdrop-shadow:
111
+ 0 -6px 6px var(--additional-50), 1px 1px 22px rgb(from var(--notification-dropdown-shadow-color) r g b / 7%);
110
112
  }
111
113
 
112
114
  .vc-app-menu {
@@ -21,7 +21,7 @@
21
21
  :title="title"
22
22
  :disable-menu="disableMenu"
23
23
  @backlink:click="closeBlade(blades.length - 1)"
24
- @logo:click="openRoot"
24
+ @logo:click="operateLogoClick"
25
25
  >
26
26
  <template #app-switcher>
27
27
  <slot name="app-switcher">
@@ -32,12 +32,12 @@
32
32
  </slot>
33
33
  </template>
34
34
 
35
- <template
35
+ <!-- <template
36
36
  v-if="$slots['logo:append']"
37
37
  #logo:append
38
38
  >
39
39
  <slot name="logo:append"></slot>
40
- </template>
40
+ </template> -->
41
41
 
42
42
  <!-- Toolbar slot -->
43
43
  <template #toolbar>
@@ -83,7 +83,7 @@
83
83
  </template>
84
84
 
85
85
  <script lang="ts" setup>
86
- import { h, inject, provide, computed } from "vue";
86
+ import { h, inject, provide, computed, useAttrs } from "vue";
87
87
  import VcAppBar from "./_internal/vc-app-bar/vc-app-bar.vue";
88
88
  import VcAppMenu from "./_internal/vc-app-menu/vc-app-menu.vue";
89
89
  import {
@@ -96,9 +96,8 @@ import {
96
96
  } from "./../../../../shared/components";
97
97
  import { useNotifications, useUser } from "../../../../core/composables";
98
98
  import { useRoute, useRouter } from "vue-router";
99
- import { watchOnce, useLocalStorage } from "@vueuse/core";
99
+ import { watchOnce } from "@vueuse/core";
100
100
  import { MenuItem } from "../../../../core/types";
101
- import { useToolbarSlots } from "./composables/useToolbarSlots";
102
101
  import { useSettingsMenu, SettingsMenuKey } from "../../../../shared/composables/useSettingsMenu";
103
102
  import { LanguageSelector } from "../../../../shared/components/language-selector";
104
103
  import { ThemeSelector } from "../../../../shared/components/theme-selector";
@@ -106,6 +105,8 @@ import { ChangePasswordButton } from "../../../../shared/components/change-passw
106
105
  import { LogoutButton } from "../../../../shared/components/logout-button";
107
106
  import { useI18n } from "vue-i18n";
108
107
  import { createGlobalSearch } from "../../../../core/composables/useGlobalSearch";
108
+ import { provideDashboardService } from "../../../../core/composables/useDashboard";
109
+ import { DynamicModulesKey } from "../../../../injection-keys";
109
110
 
110
111
  export interface Props {
111
112
  isReady: boolean;
@@ -116,8 +117,13 @@ export interface Props {
116
117
  name?: string;
117
118
  disableMenu?: boolean;
118
119
  role?: string;
120
+ // кастомное поведение при клике на лого
119
121
  }
120
122
 
123
+ const emit = defineEmits<{
124
+ (e: "logo-click", goToRoot: () => void): void;
125
+ }>();
126
+
121
127
  defineOptions({
122
128
  inheritAttrs: false,
123
129
  });
@@ -125,20 +131,18 @@ defineOptions({
125
131
  defineSlots<{
126
132
  "app-switcher": void;
127
133
  toolbar: void;
128
- "toolbar:user-dropdown": (props: { userDropdown: typeof UserDropdownButton }) => void;
129
- "toolbar:language-selector": void;
130
- "toolbar:theme-selector": void;
131
- "logo:append": void;
134
+ // "logo:append": void;
132
135
  }>();
133
136
 
134
137
  const props = defineProps<Props>();
135
138
 
139
+ const attrs = useAttrs();
140
+
136
141
  console.debug("vc-app: Init vc-app");
137
142
 
138
143
  const internalRoutes = inject("bladeRoutes") as BladeRoutesRecord[];
139
- const dynamicModules = inject("$dynamicModules", undefined) as Record<string, unknown> | undefined;
144
+ const dynamicModules = inject(DynamicModulesKey, undefined);
140
145
  const router = useRouter();
141
- createGlobalSearch();
142
146
 
143
147
  const { openBlade, closeBlade, resolveBladeByName, blades, goToRoot } = useBladeNavigation();
144
148
  const { appsList, switchApp, getApps } = useAppSwitcher();
@@ -146,9 +150,10 @@ const { appsList, switchApp, getApps } = useAppSwitcher();
146
150
  const { loadFromHistory } = useNotifications();
147
151
  const route = useRoute();
148
152
  const { isAuthenticated } = useUser();
149
- const routes = router.getRoutes();
150
153
 
151
- const { getToolbarMenuItems } = useToolbarSlots();
154
+
155
+
156
+ const routes = router.getRoutes();
152
157
 
153
158
  const settingsMenu = useSettingsMenu();
154
159
  provide(SettingsMenuKey, settingsMenu);
@@ -203,6 +208,10 @@ const onMenuItemClick = function (item: MenuItem) {
203
208
  }
204
209
  };
205
210
 
211
+ const operateLogoClick = () => {
212
+ emit("logo-click", openRoot);
213
+ };
214
+
206
215
  const openRoot = async () => {
207
216
  const isPrevented = await closeBlade(1);
208
217
 
@@ -222,7 +231,9 @@ watchOnce(
222
231
  );
223
232
 
224
233
  provide("internalRoutes", internalRoutes);
225
- provide("$dynamicModules", dynamicModules);
234
+ provide(DynamicModulesKey, dynamicModules);
235
+ provideDashboardService();
236
+ createGlobalSearch();
226
237
  </script>
227
238
 
228
239
  <style lang="scss">
@@ -65,9 +65,6 @@
65
65
  <script lang="ts" setup>
66
66
  import VcTableFilter from "./../vc-table-filter/vc-table-filter.vue";
67
67
  import { VcInput } from "./../../../../molecules";
68
- import { inject, ref, watch, computed } from "vue";
69
- import { useGlobalSearch } from "../../../../../../core/composables/useGlobalSearch";
70
- import { useBladeNavigation } from "../../../../../../shared";
71
68
 
72
69
  export interface Props {
73
70
  searchValue?: string;
@@ -81,15 +78,16 @@ export interface Emits {
81
78
  (event: "search:change", value: string): void;
82
79
  }
83
80
 
84
- const props = defineProps<Props>();
85
- const emit = defineEmits<Emits>();
81
+ defineProps<Props>();
82
+ defineEmits<Emits>();
86
83
  </script>
87
84
 
88
85
  <style lang="scss">
89
86
  :root {
90
87
  --table-base-header-border-color: var(--base-border-color, var(--neutrals-200));
91
88
  --table-base-header-input-icon-color: var(--neutrals-300);
92
- --table-base-header-padding: 18px;
89
+ --table-base-header-padding-horizontal: 12px;
90
+ --table-base-header-padding-vertical: 9px;
93
91
  --table-base-header-mobile-padding: 30px;
94
92
  }
95
93
 
@@ -102,7 +100,7 @@ const emit = defineEmits<Emits>();
102
100
  }
103
101
 
104
102
  &--desktop {
105
- @apply tw-p-[var(--table-base-header-padding)];
103
+ @apply tw-px-[var(--table-base-header-padding-horizontal)] tw-py-[var(--table-base-header-padding-vertical)];
106
104
  }
107
105
 
108
106
  &__filter-mobile {
@@ -1,16 +1,16 @@
1
1
  <template>
2
2
  <div
3
3
  ref="headerRef"
4
- class="vc-table-header"
4
+ class="vc-table-columns-header"
5
5
  @mouseenter="$emit('headerMouseOver', true)"
6
6
  @mouseleave="$emit('headerMouseOver', false)"
7
7
  >
8
- <div class="vc-table-header__row">
8
+ <div class="vc-table-columns-header__row">
9
9
  <div
10
10
  v-if="multiselect && items && items.length"
11
- class="vc-table-header__checkbox"
11
+ class="vc-table-columns-header__checkbox"
12
12
  >
13
- <div class="vc-table-header__checkbox-content">
13
+ <div class="vc-table-columns-header__checkbox-content">
14
14
  <VcCheckbox
15
15
  :model-value="headerCheckbox"
16
16
  size="m"
@@ -18,17 +18,17 @@
18
18
  @click.stop
19
19
  />
20
20
  </div>
21
- <div class="vc-table-header__checkbox-resizer" />
21
+ <div class="vc-table-columns-header__checkbox-resizer" />
22
22
  </div>
23
23
  <div
24
24
  v-for="(item, index) in filteredCols"
25
25
  :id="item.id"
26
26
  :key="item.id"
27
- class="vc-table-header__cell"
27
+ class="vc-table-columns-header__cell"
28
28
  :class="[
29
29
  {
30
- 'vc-table-header__cell--sortable': item.sortable,
31
- 'vc-table-header__cell--last': index === filteredCols.length - 1,
30
+ 'vc-table-columns-header__cell--sortable': item.sortable,
31
+ 'vc-table-columns-header__cell--last': index === filteredCols.length - 1,
32
32
  },
33
33
  item.align ? tableAlignment[item.align] : '',
34
34
  ]"
@@ -40,18 +40,18 @@
40
40
  @drop="reorderableColumns && onColumnHeaderDrop($event, item)"
41
41
  @click="$emit('headerClick', item)"
42
42
  >
43
- <div class="vc-table-header__cell-content">
44
- <div class="vc-table-header__cell-title">
43
+ <div class="vc-table-columns-header__cell-content">
44
+ <div class="vc-table-columns-header__cell-title">
45
45
  <span
46
46
  v-if="editing && item.rules?.required"
47
- class="vc-table-header__cell-required"
47
+ class="vc-table-columns-header__cell-required"
48
48
  >*</span
49
49
  >
50
50
  <slot :name="`header_${item.id}`">{{ item.title }}</slot>
51
51
  </div>
52
52
  <div
53
53
  v-if="sortField === item.id"
54
- class="vc-table-header__cell-sort-icon"
54
+ class="vc-table-columns-header__cell-sort-icon"
55
55
  >
56
56
  <VcIcon
57
57
  size="xs"
@@ -60,7 +60,7 @@
60
60
  </div>
61
61
  <div
62
62
  v-else
63
- class="vc-table-header__cell-sort-icons"
63
+ class="vc-table-columns-header__cell-sort-icons"
64
64
  >
65
65
  <VcIcon
66
66
  size="xs"
@@ -73,9 +73,9 @@
73
73
  </div>
74
74
  </div>
75
75
  <div
76
- class="vc-table-header__cell-resizer"
76
+ class="vc-table-columns-header__cell-resizer"
77
77
  :class="{
78
- 'vc-table-header__cell-resizer--cursor': resizableColumns,
78
+ 'vc-table-columns-header__cell-resizer--cursor': resizableColumns,
79
79
  }"
80
80
  @mousedown.stop="resizableColumns && handleMouseDown($event, item)"
81
81
  />
@@ -83,7 +83,7 @@
83
83
 
84
84
  <div
85
85
  v-if="isHeaderHover && expanded"
86
- class="vc-table-header__column-switcher"
86
+ class="vc-table-columns-header__column-switcher"
87
87
  >
88
88
  <VcTableColumnSwitcher
89
89
  :items="internalColumnsSorted"
@@ -96,18 +96,18 @@
96
96
 
97
97
  <div
98
98
  ref="resizer"
99
- class="vc-table-header__resizer"
99
+ class="vc-table-columns-header__resizer"
100
100
  />
101
101
  <div
102
102
  ref="reorderRef"
103
- class="vc-table-header__reorder-ref"
103
+ class="vc-table-columns-header__reorder-ref"
104
104
  />
105
105
  </div>
106
106
  </template>
107
107
 
108
108
  <script lang="ts" setup generic="T extends TableItem | string">
109
109
  import { toRefs, ref } from "vue";
110
- import { VcCheckbox, VcIcon } from "../../../../../../";
110
+ import { VcCheckbox, VcIcon } from "../../../../../..";
111
111
  import VcTableColumnSwitcher from "../../../vc-table-column-switcher/vc-table-column-switcher.vue";
112
112
  import type { ITableColumns, TableItem, TableColPartial } from "../../../../types";
113
113
  import { useTableColumnReorder } from "../../../../composables/useTableColumnReorder";
@@ -168,9 +168,11 @@ const { resizer, handleMouseDown } = useTableColumnResize(internalColumns, () =>
168
168
  <style lang="scss">
169
169
  :root {
170
170
  --table-header-height: 60px;
171
+ --table-header-border-color: var(--base-border-color, var(--neutrals-200));
171
172
  }
172
173
 
173
- .vc-table-header {
174
+ .vc-table-columns-header {
175
+ @apply tw-border-y tw-border-[color:var(--table-header-border-color)] tw-border-solid;
174
176
  &__row {
175
177
  @apply tw-flex tw-flex-row [box-shadow:var(--table-header-border)] tw-bg-[--table-header-bg];
176
178
  }
@@ -194,7 +196,7 @@ const { resizer, handleMouseDown } = useTableColumnResize(internalColumns, () =>
194
196
  @apply tw-cursor-pointer;
195
197
 
196
198
  &:hover {
197
- .vc-table-header__cell-sort-icons {
199
+ .vc-table-columns-header__cell-sort-icons {
198
200
  @apply tw-visible;
199
201
  }
200
202
  }
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <div
3
3
  class="vc-table-row"
4
+ role="button"
4
5
  :class="{
5
6
  'vc-table-row--odd': index % 2 === 0,
6
7
  'vc-table-row--clickable': hasClickListener,
@@ -89,7 +89,7 @@
89
89
 
90
90
  <script lang="ts" setup generic="T extends TableItem | string">
91
91
  import { toRefs, MaybeRef, useSlots } from "vue";
92
- import VcTableHeader from "./_internal/vc-table-header/vc-table-header.vue";
92
+ import VcTableHeader from "./_internal/vc-table-columns-header/vc-table-columns-header.vue";
93
93
  import VcTableSelectAllHeader from "./_internal/vc-table-select-all-header/vc-table-select-all-header.vue";
94
94
  import VcTableBody from "./_internal/vc-table-body/vc-table-body.vue";
95
95
  import type { ITableColumns, TableItem, TableColPartial, StatusImage } from "../../types";
@@ -23,6 +23,7 @@ import { VNode, computed, inject, Ref, h, useSlots } from "vue";
23
23
  import { useGlobalSearch } from "../../../../../../core/composables/useGlobalSearch";
24
24
  import { BladeInstance } from "../../../../../../injection-keys";
25
25
  import VcTableBaseHeader from "../vc-table-base-header/vc-table-base-header.vue";
26
+ import { IBladeInstance } from "../../../../../../shared";
26
27
 
27
28
  const props = defineProps<{
28
29
  hasHeaderSlot: boolean;
@@ -44,7 +45,17 @@ defineSlots<{
44
45
  header: (props: { header: VNode }) => VNode;
45
46
  }>();
46
47
 
47
- const blade = inject(BladeInstance);
48
+ const blade = inject(
49
+ BladeInstance,
50
+ computed(
51
+ (): Partial<IBladeInstance> => ({
52
+ navigation: {
53
+ idx: 0,
54
+ instance: null,
55
+ },
56
+ }),
57
+ ),
58
+ );
48
59
  const globalSearch = useGlobalSearch();
49
60
  const isMobile = inject("isMobile") as Ref<boolean>;
50
61
  const slots = useSlots();