@vc-shell/framework 1.0.57 → 1.0.60

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 (173) hide show
  1. package/core/composables/index.ts +0 -1
  2. package/core/composables/useNotifications/index.ts +2 -2
  3. package/core/composables/usePermissions/index.ts +1 -1
  4. package/core/composables/useSettings/index.ts +2 -2
  5. package/core/composables/useUser/index.ts +2 -2
  6. package/core/plugins/validation/rules.ts +67 -24
  7. package/core/types/index.ts +19 -2
  8. package/dist/framework.mjs +2816 -5023
  9. package/dist/index.css +1 -1
  10. package/dist/types/core/composables/index.d.ts +0 -1
  11. package/dist/types/core/composables/index.d.ts.map +1 -1
  12. package/dist/types/core/composables/useNotifications/index.d.ts +1 -1
  13. package/dist/types/core/composables/useNotifications/index.d.ts.map +1 -1
  14. package/dist/types/core/composables/useUser/index.d.ts +2 -2
  15. package/dist/types/core/composables/useUser/index.d.ts.map +1 -1
  16. package/dist/types/core/plugins/validation/rules.d.ts +8 -30
  17. package/dist/types/core/plugins/validation/rules.d.ts.map +1 -1
  18. package/dist/types/core/types/index.d.ts +17 -2
  19. package/dist/types/core/types/index.d.ts.map +1 -1
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/shared/components/app-switcher/components/index.d.ts.map +1 -0
  22. package/dist/types/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/index.d.ts +5 -5
  23. package/dist/types/shared/components/app-switcher/components/vc-app-switcher/index.d.ts.map +1 -0
  24. package/dist/types/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/vc-app-switcher.vue.d.ts +1 -1
  25. package/dist/types/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -0
  26. package/dist/types/shared/components/app-switcher/composables/index.d.ts.map +1 -0
  27. package/dist/types/shared/{app-switcher → components/app-switcher}/composables/useAppSwitcher/index.d.ts +1 -1
  28. package/dist/types/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -0
  29. package/dist/types/shared/components/app-switcher/index.d.ts.map +1 -0
  30. package/dist/types/shared/components/blade-navigation/components/index.d.ts.map +1 -0
  31. package/dist/types/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts.map +1 -0
  32. package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts +1 -1
  33. package/dist/types/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -0
  34. package/dist/types/shared/components/blade-navigation/composables/index.d.ts.map +1 -0
  35. package/dist/types/shared/{blade-navigation → components/blade-navigation}/composables/useBladeNavigation/index.d.ts +1 -1
  36. package/dist/types/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -0
  37. package/dist/types/shared/components/blade-navigation/index.d.ts.map +1 -0
  38. package/dist/types/shared/{blade-navigation → components/blade-navigation}/types/index.d.ts +1 -1
  39. package/dist/types/shared/components/blade-navigation/types/index.d.ts.map +1 -0
  40. package/dist/types/shared/index.d.ts +4 -3
  41. package/dist/types/shared/index.d.ts.map +1 -1
  42. package/dist/types/shared/{assets → modules/assets}/components/assets-details/assets-details.vue.d.ts +5 -13
  43. package/dist/types/shared/modules/assets/components/assets-details/assets-details.vue.d.ts.map +1 -0
  44. package/dist/types/shared/{assets → modules/assets}/components/assets-details/index.d.ts +8 -7
  45. package/dist/types/shared/modules/assets/components/assets-details/index.d.ts.map +1 -0
  46. package/dist/types/shared/modules/assets/components/index.d.ts.map +1 -0
  47. package/dist/types/shared/modules/assets/index.d.ts.map +1 -0
  48. package/dist/types/shared/modules/assets/locales/index.d.ts +3 -0
  49. package/dist/types/shared/modules/assets/locales/index.d.ts.map +1 -0
  50. package/dist/types/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +58 -0
  51. package/dist/types/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -0
  52. package/dist/types/shared/modules/assets-manager/components/assets-manager/index.d.ts +59 -0
  53. package/dist/types/shared/modules/assets-manager/components/assets-manager/index.d.ts.map +1 -0
  54. package/dist/types/shared/modules/assets-manager/components/index.d.ts +2 -0
  55. package/dist/types/shared/modules/assets-manager/components/index.d.ts.map +1 -0
  56. package/dist/types/shared/modules/assets-manager/index.d.ts +12 -0
  57. package/dist/types/shared/modules/assets-manager/index.d.ts.map +1 -0
  58. package/dist/types/shared/modules/assets-manager/locales/index.d.ts.map +1 -0
  59. package/dist/types/shared/utilities/assets.d.ts +5 -0
  60. package/dist/types/shared/utilities/assets.d.ts.map +1 -0
  61. package/dist/types/ui/components/atoms/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  62. package/dist/types/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  63. package/dist/types/ui/components/molecules/vc-file-upload/index.d.ts +12 -12
  64. package/dist/types/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  65. package/dist/types/ui/components/molecules/vc-input/index.d.ts +0 -4
  66. package/dist/types/ui/components/molecules/vc-input/index.d.ts.map +1 -1
  67. package/dist/types/ui/components/molecules/vc-input/vc-input.vue.d.ts +1 -1
  68. package/dist/types/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  69. package/dist/types/ui/components/molecules/vc-select/index.d.ts +24 -0
  70. package/dist/types/ui/components/molecules/vc-select/index.d.ts.map +1 -1
  71. package/dist/types/ui/components/molecules/vc-select/vc-select.vue.d.ts +20 -0
  72. package/dist/types/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  73. package/dist/types/ui/components/molecules/vc-textarea/index.d.ts +0 -4
  74. package/dist/types/ui/components/molecules/vc-textarea/index.d.ts.map +1 -1
  75. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +0 -4
  76. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts.map +1 -1
  77. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +1 -1
  78. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
  79. package/dist/types/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts.map +1 -1
  80. package/dist/types/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts +2 -19
  81. package/dist/types/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  82. package/dist/types/ui/components/organisms/vc-dynamic-property/index.d.ts +12 -0
  83. package/dist/types/ui/components/organisms/vc-dynamic-property/index.d.ts.map +1 -1
  84. package/dist/types/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts +7 -0
  85. package/dist/types/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  86. package/dist/types/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -20
  87. package/dist/types/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts.map +1 -1
  88. package/dist/types/ui/components/organisms/vc-gallery/index.d.ts +28 -31
  89. package/dist/types/ui/components/organisms/vc-gallery/index.d.ts.map +1 -1
  90. package/dist/types/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +2 -6
  91. package/dist/types/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
  92. package/dist/types/ui/components/organisms/vc-table/index.d.ts +49 -37
  93. package/dist/types/ui/components/organisms/vc-table/index.d.ts.map +1 -1
  94. package/dist/types/ui/components/organisms/vc-table/vc-table.stories.d.ts +49 -37
  95. package/dist/types/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  96. package/dist/types/ui/components/organisms/vc-table/vc-table.vue.d.ts +12 -7
  97. package/dist/types/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  98. package/package.json +5 -6
  99. package/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/vc-app-switcher.vue +1 -1
  100. package/shared/{app-switcher → components/app-switcher}/composables/useAppSwitcher/index.ts +2 -2
  101. package/shared/{app-switcher → components/app-switcher}/index.ts +1 -1
  102. package/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/vc-blade-navigation.vue +2 -2
  103. package/shared/{blade-navigation → components/blade-navigation}/composables/useBladeNavigation/index.ts +6 -5
  104. package/shared/{blade-navigation → components/blade-navigation}/index.ts +1 -1
  105. package/shared/{blade-navigation → components/blade-navigation}/types/index.ts +1 -1
  106. package/shared/index.ts +10 -7
  107. package/shared/modules/assets/components/assets-details/assets-details.vue +204 -0
  108. package/shared/{assets → modules/assets}/index.ts +1 -1
  109. package/shared/{assets → modules/assets}/locales/en.json +7 -5
  110. package/shared/modules/assets/locales/index.ts +2 -0
  111. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +389 -0
  112. package/shared/modules/assets-manager/components/assets-manager/index.ts +3 -0
  113. package/shared/modules/assets-manager/components/index.ts +1 -0
  114. package/shared/modules/assets-manager/index.ts +14 -0
  115. package/shared/modules/assets-manager/locales/en.json +28 -0
  116. package/shared/utilities/assets.ts +40 -0
  117. package/tailwind.config.js +0 -2
  118. package/ui/components/atoms/vc-button/vc-button.vue +0 -1
  119. package/ui/components/atoms/vc-checkbox/vc-checkbox.vue +1 -11
  120. package/ui/components/molecules/vc-editor/vc-editor.vue +21 -0
  121. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +1 -0
  122. package/ui/components/molecules/vc-input/vc-input.vue +1 -1
  123. package/ui/components/molecules/vc-select/vc-select.vue +40 -9
  124. package/ui/components/molecules/vc-textarea/vc-textarea.vue +1 -1
  125. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +3 -2
  126. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue +3 -6
  127. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +2 -6
  128. package/ui/components/organisms/vc-dynamic-property/index.ts +0 -1
  129. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +18 -1
  130. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +5 -11
  131. package/ui/components/organisms/vc-gallery/vc-gallery.vue +164 -49
  132. package/ui/components/organisms/vc-table/vc-table.vue +189 -144
  133. package/core/composables/useAutosave/index.ts +0 -55
  134. package/dist/types/core/composables/useAutosave/index.d.ts +0 -9
  135. package/dist/types/core/composables/useAutosave/index.d.ts.map +0 -1
  136. package/dist/types/shared/app-switcher/components/index.d.ts.map +0 -1
  137. package/dist/types/shared/app-switcher/components/vc-app-switcher/index.d.ts.map +0 -1
  138. package/dist/types/shared/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +0 -1
  139. package/dist/types/shared/app-switcher/composables/index.d.ts.map +0 -1
  140. package/dist/types/shared/app-switcher/composables/useAppSwitcher/index.d.ts.map +0 -1
  141. package/dist/types/shared/app-switcher/index.d.ts.map +0 -1
  142. package/dist/types/shared/assets/components/assets-details/assets-details.vue.d.ts.map +0 -1
  143. package/dist/types/shared/assets/components/assets-details/index.d.ts.map +0 -1
  144. package/dist/types/shared/assets/components/index.d.ts.map +0 -1
  145. package/dist/types/shared/assets/index.d.ts.map +0 -1
  146. package/dist/types/shared/assets/locales/index.d.ts.map +0 -1
  147. package/dist/types/shared/blade-navigation/components/index.d.ts.map +0 -1
  148. package/dist/types/shared/blade-navigation/components/vc-blade-navigation/index.d.ts.map +0 -1
  149. package/dist/types/shared/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +0 -1
  150. package/dist/types/shared/blade-navigation/composables/index.d.ts.map +0 -1
  151. package/dist/types/shared/blade-navigation/composables/useBladeNavigation/index.d.ts.map +0 -1
  152. package/dist/types/shared/blade-navigation/index.d.ts.map +0 -1
  153. package/dist/types/shared/blade-navigation/types/index.d.ts.map +0 -1
  154. package/shared/assets/components/assets-details/assets-details.vue +0 -116
  155. /package/dist/types/shared/{app-switcher → components/app-switcher}/components/index.d.ts +0 -0
  156. /package/dist/types/shared/{app-switcher → components/app-switcher}/composables/index.d.ts +0 -0
  157. /package/dist/types/shared/{app-switcher → components/app-switcher}/index.d.ts +0 -0
  158. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/index.d.ts +0 -0
  159. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/index.d.ts +0 -0
  160. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/composables/index.d.ts +0 -0
  161. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/index.d.ts +0 -0
  162. /package/dist/types/shared/{assets → modules/assets}/components/index.d.ts +0 -0
  163. /package/dist/types/shared/{assets → modules/assets}/index.d.ts +0 -0
  164. /package/dist/types/shared/{assets → modules/assets-manager}/locales/index.d.ts +0 -0
  165. /package/shared/{app-switcher → components/app-switcher}/components/index.ts +0 -0
  166. /package/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/index.ts +0 -0
  167. /package/shared/{app-switcher → components/app-switcher}/composables/index.ts +0 -0
  168. /package/shared/{blade-navigation → components/blade-navigation}/components/index.ts +0 -0
  169. /package/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/index.ts +0 -0
  170. /package/shared/{blade-navigation → components/blade-navigation}/composables/index.ts +0 -0
  171. /package/shared/{assets → modules/assets}/components/assets-details/index.ts +0 -0
  172. /package/shared/{assets → modules/assets}/components/index.ts +0 -0
  173. /package/shared/{assets → modules/assets-manager}/locales/index.ts +0 -0
@@ -60,7 +60,7 @@
60
60
  {{ prefix }}
61
61
  </div>
62
62
  <div
63
- class="tw-w-full tw-appearance-none tw-border-none tw-outline-none tw-min-h-[var(--select-height)] tw-flex tw-items-center tw-w-full tw-box-border tw-box-border tw-cursor-pointer invalid:tw-text-[color:var(--select-placeholder-color)] tw-truncate"
63
+ class="tw-appearance-none tw-border-none tw-outline-none tw-min-h-[var(--select-height)] tw-flex tw-items-center tw-w-full tw-box-border tw-cursor-pointer invalid:tw-text-[color:var(--select-placeholder-color)] tw-truncate"
64
64
  @click.stop="toggleDropdown"
65
65
  >
66
66
  <div
@@ -90,7 +90,7 @@
90
90
  <div
91
91
  class="tw-bg-[#fbfdfe] tw-border tw-border-solid tw-border-[color:#bdd1df] tw-rounded-[2px] tw-flex tw-items-center tw-h-[28px] tw-box-border tw-px-2"
92
92
  >
93
- <span>{{ getEmittingOptionValue(item.opt) }}</span>
93
+ <span>{{ getDisplayLabel(item.opt) }}</span>
94
94
  <VcIcon
95
95
  v-if="!disabled"
96
96
  class="tw-text-[#a9bfd2] tw-ml-2 tw-cursor-pointer hover:tw-text-[color:var(--select-clear-color-hover)]"
@@ -344,6 +344,26 @@ export interface Props {
344
344
  * @returns Label of the current option
345
345
  */
346
346
  optionLabel?: OptionProp;
347
+ /**
348
+ * @requires optionValue
349
+ * @description Similar to optionValue, but used only for displaying selection result in rare cases. **Can't be used without optionValue**
350
+ *
351
+ * Property of option which holds the 'value'
352
+ * Default value: id
353
+ * @param option The current option being processed
354
+ * @returns Value of the current option
355
+ */
356
+ displayValue?: OptionProp;
357
+ /**
358
+ * @requires optionLabel
359
+ * @description Similar to optionValue, but used only for displaying selection result in rare cases. **Can't be used without optionLabel**
360
+ *
361
+ * Property of option which holds the 'label'
362
+ * Default value: title
363
+ * @param option The current option being processed
364
+ * @returns Label of the current option
365
+ */
366
+ displayLabel?: OptionProp;
347
367
  /**
348
368
  * Update model with the value of the selected option instead of the whole option
349
369
  */
@@ -548,9 +568,13 @@ const hasNextPage = computed(() => {
548
568
  return optionsList.value.length < totalItems.value;
549
569
  });
550
570
 
551
- const getOptionValue = computed(() => getPropValueFn(props.optionValue, "value"));
571
+ const getOptionValue = computed(() => getPropValueFn(props.optionValue, "id"));
572
+
573
+ const getOptionLabel = computed(() => getPropValueFn(props.optionLabel, "title"));
574
+
575
+ const getDisplayValue = computed(() => getPropValueFn(props.displayValue, "id"));
552
576
 
553
- const getOptionLabel = computed(() => getPropValueFn(props.optionLabel, "label"));
577
+ const getDisplayLabel = computed(() => getPropValueFn(props.displayLabel, "title"));
554
578
 
555
579
  const innerValue = computed((): Record<string, unknown>[] | string[] => {
556
580
  const mapNull = props.mapOptions === true && props.multiple !== true;
@@ -593,7 +617,9 @@ const selectedScope = computed(() => {
593
617
 
594
618
  const hasValue = computed(() => fieldValueIsFilled(innerValue.value));
595
619
 
596
- const innerOptionsValue = computed(() => innerValue.value.map((opt) => getOptionValue.value(opt)));
620
+ const innerOptionsValue = computed(() =>
621
+ innerValue.value.map((opt) => getOptionValue.value(opt) || getDisplayValue.value(opt))
622
+ );
597
623
 
598
624
  const optionScope = computed(() => {
599
625
  return optionsTemp.value.map((opt, i) => {
@@ -601,7 +627,7 @@ const optionScope = computed(() => {
601
627
  index: i,
602
628
  opt,
603
629
  selected: isOptionSelected(opt) === true,
604
- label: getOptionLabel.value(opt),
630
+ label: getOptionLabel.value(opt) || getDisplayLabel.value(opt),
605
631
  toggleOption,
606
632
  };
607
633
  });
@@ -624,7 +650,7 @@ function getPropValueFn(propValue: OptionProp, defaultVal: OptionProp) {
624
650
  }
625
651
 
626
652
  function getOption(value: Record<string, unknown> | string, valueCache: Array<Record<string, unknown> | string>) {
627
- const fn = (opt) => isEqual(getOptionValue.value(opt), value);
653
+ const fn = (opt) => isEqual(getOptionValue.value(opt), value) || isEqual(getDisplayValue.value(opt), value);
628
654
  return defaultValue.value.find(fn) || optionsList.value.find(fn) || valueCache.find(fn) || value;
629
655
  }
630
656
 
@@ -649,7 +675,8 @@ function removeAtIndex(index: number) {
649
675
  }
650
676
 
651
677
  function isOptionSelected(opt: Record<string, unknown>) {
652
- const val = getOptionValue.value(opt);
678
+ const val = getOptionValue.value(opt) || getDisplayValue.value(opt);
679
+
653
680
  return innerOptionsValue.value.find((v) => isEqual(v, val)) !== void 0;
654
681
  }
655
682
 
@@ -722,7 +749,7 @@ function toggleOption(opt: { [x: string]: string }) {
722
749
  return;
723
750
  }
724
751
 
725
- const optValue = getOptionValue.value(opt);
752
+ const optValue = getOptionValue.value(opt) || getDisplayValue.value(opt);
726
753
 
727
754
  if (props.multiple !== true) {
728
755
  if (innerValue.value.length === 0 || isEqual(getOptionValue.value(innerValue.value[0]), optValue) !== true) {
@@ -796,6 +823,10 @@ function emitValue(val: string) {
796
823
  }
797
824
 
798
825
  function onReset() {
826
+ if (props.multiple) {
827
+ emit("update:modelValue", []);
828
+ return;
829
+ }
799
830
  emit("update:modelValue", null);
800
831
  }
801
832
  </script>
@@ -50,7 +50,7 @@ import { VcLabel } from "./../../../components";
50
50
 
51
51
  export interface Props {
52
52
  placeholder?: string;
53
- modelValue: string;
53
+ modelValue?: string;
54
54
  required?: boolean;
55
55
  disabled?: boolean;
56
56
  label?: string;
@@ -26,13 +26,14 @@
26
26
  <!-- Show blades name when at least one blade is opened -->
27
27
  <div
28
28
  v-if="blades.length === 1"
29
- class="tw-overflow-ellipsis tw-overflow-hidden tw-whitespace-nowrap tw-text-2xl tw-leading-header"
29
+ class="tw-overflow-ellipsis tw-overflow-hidden tw-whitespace-nowrap tw-text-2xl tw-leading-header tw-ml-2"
30
30
  >
31
31
  {{ blades[0].title }}
32
32
  </div>
33
33
 
34
34
  <!-- Show back link when more than one blade is opened -->
35
35
  <VcLink
36
+ class="tw-ml-3"
36
37
  v-else-if="blades.length > 1"
37
38
  @click="$emit('backlink:click')"
38
39
  >
@@ -45,7 +46,7 @@
45
46
  </template>
46
47
 
47
48
  <!-- Additional spacer -->
48
- <div class="tw-grow tw-basis-0 tw-basis-0"></div>
49
+ <div class="tw-grow tw-basis-0"></div>
49
50
 
50
51
  <!-- Toolbar container -->
51
52
  <div class="tw-flex tw-h-full tw-box-border">
@@ -4,10 +4,10 @@
4
4
  <router-link
5
5
  :to="component.url"
6
6
  custom
7
- v-slot="{ isActive, navigate }"
7
+ v-slot="{ isExactActive, navigate }"
8
8
  >
9
9
  <vc-app-menu-link
10
- :isActive="isActive"
10
+ :isActive="isExactActive"
11
11
  :children="children"
12
12
  :sticky="sticky"
13
13
  :icon="icon as string"
@@ -23,7 +23,6 @@
23
23
  :icon="icon as string"
24
24
  :title="title"
25
25
  @onClick="onMenuItemClick"
26
- :isActive="isHomePage"
27
26
  />
28
27
 
29
28
  <!-- Nested menu items -->
@@ -61,7 +60,7 @@
61
60
  </template>
62
61
 
63
62
  <script lang="ts" setup>
64
- import { onMounted, ref, computed } from "vue";
63
+ import { onMounted, ref } from "vue";
65
64
  import { IBladeToolbar, IMenuItems } from "./../../../../../../../../core/types";
66
65
  import VcAppMenuLink from "./_internal/vc-app-menu-link.vue";
67
66
  import { NavigationFailure, useRoute } from "vue-router";
@@ -109,8 +108,6 @@ const emit = defineEmits<Emits>();
109
108
 
110
109
  const isOpened = ref(false);
111
110
 
112
- const isHomePage = computed(() => route.path === "/");
113
-
114
111
  onMounted(() => {
115
112
  if (props.children && props.children.length && props.children.find((x) => x.component?.url === route?.path)) {
116
113
  isOpened.value = true;
@@ -50,7 +50,7 @@
50
50
  </div>
51
51
  <div
52
52
  v-else
53
- class="vc-blade-header__button"
53
+ class="tw-text-[color:var(--blade-header-button-color)] tw-ml-4 tw-cursor-pointer hover:tw-text-[color:var(--blade-header-button-color-hover)]"
54
54
  @click="onExpand"
55
55
  >
56
56
  <VcIcon
@@ -81,11 +81,7 @@ export interface Props {
81
81
  subtitle?: string | undefined;
82
82
  icon?: string | undefined;
83
83
  }
84
- const props = withDefaults(defineProps<Props>(), {
85
- expandable: false,
86
- expanded: false,
87
- closable: false,
88
- });
84
+ const props = defineProps<Props>();
89
85
 
90
86
  const emit = defineEmits(["close", "expand", "collapse"]);
91
87
 
@@ -1,4 +1,3 @@
1
- import { VNode } from "vue";
2
1
  import _DynamicProperty from "./vc-dynamic-property.vue";
3
2
 
4
3
  export const VcDynamicProperty = _DynamicProperty as typeof _DynamicProperty;
@@ -56,7 +56,12 @@
56
56
  :required="property.required || property.isRequired"
57
57
  placeholder="Add value"
58
58
  :disabled="disabled"
59
+ option-label="alias"
60
+ option-value="id"
61
+ :display-label="displayedValueLabel.label"
62
+ :display-value="displayedValueLabel.value"
59
63
  :multiple="true"
64
+ :emit-value="false"
60
65
  ></VcSelect>
61
66
  </Field>
62
67
 
@@ -88,9 +93,12 @@
88
93
  :options="items"
89
94
  option-label="alias"
90
95
  option-value="id"
96
+ :display-label="displayedValueLabel.label"
97
+ :display-value="displayedValueLabel.value"
91
98
  @search="onSearch"
92
99
  @close="onClose"
93
100
  :multiple="property.multivalue"
101
+ :emit-value="false"
94
102
  ></VcSelect>
95
103
  </Field>
96
104
 
@@ -148,6 +156,8 @@
148
156
  :options="items"
149
157
  option-value="id"
150
158
  :option-label="handleDisplayProperty"
159
+ :display-label="displayedValueLabel.label"
160
+ :display-value="displayedValueLabel.value"
151
161
  multiple
152
162
  ></VcSelect>
153
163
  </Field>
@@ -317,8 +327,8 @@
317
327
 
318
328
  <script lang="ts" setup>
319
329
  import { ref, onMounted, computed } from "vue";
320
- import { useI18n } from "./../../../../core/composables";
321
330
  import { Field } from "vee-validate";
331
+ import { useI18n } from "vue-i18n";
322
332
 
323
333
  export interface Props {
324
334
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -342,6 +352,13 @@ export interface Props {
342
352
  ) => void | undefined;
343
353
  culture?: string;
344
354
  disabled?: boolean;
355
+ /**
356
+ * @description Used only with multiple selection **only** in rare cases, where we need to display selection with other value-label pair
357
+ */
358
+ displayedValueLabel?: {
359
+ value: string;
360
+ label: string;
361
+ };
345
362
  }
346
363
 
347
364
  export interface PropertyItem {
@@ -10,7 +10,7 @@
10
10
  >
11
11
  <VcImage
12
12
  aspect="1x1"
13
- :src="image.url"
13
+ :src="image['url']"
14
14
  background="contain"
15
15
  ></VcImage>
16
16
  <div class="vc-gallery-item__overlay">
@@ -23,9 +23,9 @@
23
23
  ></VcIcon>
24
24
  <div
25
25
  class="tw-truncate"
26
- :title="image.name"
26
+ :title="image['name']"
27
27
  >
28
- {{ image.name }}
28
+ {{ image["name"] }}
29
29
  </div>
30
30
  </div>
31
31
  <div class="tw-flex tw-grow tw-basis-0 tw-items-center tw-justify-around">
@@ -73,7 +73,7 @@ import { clickOutside as vClickOutside } from "./../../../../../../core/directiv
73
73
  import { IImage } from "./../../../../../../core/types";
74
74
 
75
75
  export interface Props {
76
- image?: IImage | undefined;
76
+ image: IImage;
77
77
  readonly?: boolean | undefined;
78
78
  actions?:
79
79
  | {
@@ -87,12 +87,6 @@ export interface Props {
87
87
  }
88
88
 
89
89
  withDefaults(defineProps<Props>(), {
90
- image: () => ({
91
- sortOrder: undefined,
92
- title: undefined,
93
- name: undefined,
94
- url: undefined,
95
- }),
96
90
  readonly: false,
97
91
  actions: () => ({
98
92
  name: undefined,
@@ -126,7 +120,7 @@ function onClose() {
126
120
  }
127
121
 
128
122
  &__move {
129
- @apply tw-text-[#a1c0d4] tw-cursor-pointer tw-mr-2;
123
+ @apply tw-text-[#a1c0d4] tw-cursor-move tw-mr-2;
130
124
  }
131
125
 
132
126
  &__button {
@@ -9,44 +9,45 @@
9
9
  {{ label }}
10
10
  </VcLabel>
11
11
 
12
- <template v-if="(images && images.length) || !disabled">
13
- <div class="tw-flex tw-flex-wrap">
14
- <draggable
15
- :list="images"
12
+ <template v-if="(defaultImages && defaultImages.length) || !disabled">
13
+ <div class="tw-flex tw-flex-wrap tw-relative">
14
+ <div
16
15
  class="tw-flex tw-flex-wrap tw-w-full"
17
- tag="transition-group"
18
- v-bind="dragOptions"
19
- @change="updateOrder"
20
- :component-data="{
21
- tag: 'div',
22
- }"
16
+ ref="galleryRef"
23
17
  >
24
- <template #item="{ element, index }">
25
- <VcGalleryItem
26
- class="tw-m-2"
27
- :key="element.sortOrder"
28
- :image="element"
29
- :readonly="disabled"
30
- @preview="onPreviewClick(index)"
31
- @edit="$emit('item:edit', $event)"
32
- @remove="$emit('item:remove', $event)"
33
- :actions="itemActions"
34
- :disableDrag="disableDrag"
35
- ></VcGalleryItem>
36
- </template>
37
- <template #footer>
38
- <VcFileUpload
39
- v-if="!disabled && !hideAfterUpload"
40
- class="tw-m-2"
41
- :icon="uploadIcon"
42
- @upload="onUpload"
43
- :variant="variant"
44
- :multiple="multiple"
45
- :rules="rules"
46
- :name="name"
47
- ></VcFileUpload>
48
- </template>
49
- </draggable>
18
+ <VcGalleryItem
19
+ class="tw-m-2 vc-gallery__item"
20
+ v-for="(image, i) in defaultImages"
21
+ :key="`image_${i}`"
22
+ :image="image"
23
+ :readonly="disabled"
24
+ @preview="onPreviewClick(i)"
25
+ @edit="$emit('item:edit', $event)"
26
+ @remove="$emit('item:remove', $event)"
27
+ :actions="itemActions"
28
+ :disableDrag="disableDrag"
29
+ @mousedown="onItemMouseDown"
30
+ @dragstart="onItemDragStart($event, image)"
31
+ @dragover="onItemDragOver"
32
+ @dragleave="onItemDragLeave"
33
+ @drop="onItemDrop($event, image)"
34
+ @touchstart="onItemMouseDown"
35
+ ></VcGalleryItem>
36
+ <VcFileUpload
37
+ v-if="!disabled && !hideAfterUpload"
38
+ class="tw-m-2"
39
+ :icon="uploadIcon"
40
+ @upload="onUpload"
41
+ :variant="variant"
42
+ :multiple="multiple"
43
+ :rules="rules"
44
+ :name="name"
45
+ ></VcFileUpload>
46
+ </div>
47
+ <div
48
+ ref="reorderGalleryRef"
49
+ class="tw-w-0.5 tw-bg-[#41afe6] tw-h-full tw-absolute tw-top-0 tw-bottom-0 tw-z-[2] tw-hidden"
50
+ ></div>
50
51
  </div>
51
52
  </template>
52
53
  <div
@@ -66,7 +67,7 @@
66
67
  </template>
67
68
 
68
69
  <script lang="ts" setup>
69
- import { computed, ref } from "vue";
70
+ import { ref, watch } from "vue";
70
71
  import { IImage } from "../../../../core/types";
71
72
  import { VcLabel, VcFileUpload } from "./../../../components";
72
73
  import VcGalleryItem from "./_internal/vc-gallery-item/vc-gallery-item.vue";
@@ -99,7 +100,6 @@ export interface Emits {
99
100
  (event: "sort", sorted: IImage[]): void;
100
101
  (event: "item:edit", image: IImage): void;
101
102
  (event: "item:remove", image: IImage): void;
102
- (event: "item:move", image: IImage): void;
103
103
  }
104
104
 
105
105
  const props = withDefaults(defineProps<Props>(), {
@@ -118,15 +118,22 @@ const props = withDefaults(defineProps<Props>(), {
118
118
  const emit = defineEmits<Emits>();
119
119
 
120
120
  const preview = ref(false);
121
- const previewImageIndex = ref();
122
- const dragOptions = computed(() => {
123
- return {
124
- animation: 200,
125
- group: "description",
126
- disabled: props.disableDrag,
127
- ghostClass: "ghost",
128
- };
129
- });
121
+ const previewImageIndex = ref<number>();
122
+
123
+ const defaultImages = ref<IImage[]>([]);
124
+ const draggedItem = ref<IImage>();
125
+ const draggedElement = ref<HTMLElement>();
126
+ const galleryRef = ref<HTMLElement>();
127
+ const reorderGalleryRef = ref<HTMLElement>();
128
+ const dropPosition = ref<number>();
129
+
130
+ watch(
131
+ () => props.images,
132
+ (newVal) => {
133
+ defaultImages.value = newVal;
134
+ },
135
+ { deep: true, immediate: true }
136
+ );
130
137
 
131
138
  const onUpload = (files: FileList) => {
132
139
  if (files && files.length) {
@@ -140,11 +147,119 @@ const onPreviewClick = (index: number) => {
140
147
  };
141
148
 
142
149
  const updateOrder = () => {
143
- const images = props.images;
150
+ const images = defaultImages.value;
144
151
  const sortedImgs = images.map((item, index) => {
145
152
  item.sortOrder = index;
146
153
  return item;
147
154
  });
148
- emit("sort", ref(sortedImgs).value);
155
+
156
+ emit("sort", sortedImgs);
149
157
  };
158
+
159
+ function onItemMouseDown(event: MouseEvent & { currentTarget?: { draggable: boolean } }) {
160
+ if (!props.disableDrag) {
161
+ event.currentTarget.draggable = true;
162
+ return;
163
+ }
164
+ }
165
+
166
+ function onItemDragStart(event: DragEvent, item: IImage) {
167
+ draggedItem.value = item;
168
+ draggedElement.value = event.target as HTMLElement;
169
+ event.dataTransfer.setData("text", "gallery_reorder");
170
+ }
171
+
172
+ function onItemDragOver(event: DragEvent) {
173
+ let dropItem = findParentElement(event.target as HTMLElement);
174
+
175
+ if (!props.disableDrag && draggedItem.value && dropItem) {
176
+ event.preventDefault();
177
+
178
+ let containerOffset = galleryRef.value.getBoundingClientRect();
179
+ let dropItemOffset = dropItem.getBoundingClientRect();
180
+
181
+ if (draggedElement.value !== dropItem) {
182
+ let elementStyle = getComputedStyle(dropItem);
183
+ const dropItemOffsetWidth = dropItem.offsetWidth + parseFloat(elementStyle.marginLeft);
184
+ let targetLeft = dropItemOffset.left - containerOffset.left;
185
+ let columnCenter = dropItemOffset.left + dropItemOffsetWidth / 2;
186
+
187
+ reorderGalleryRef.value.style.top = dropItemOffset.top - containerOffset.top + "px";
188
+ reorderGalleryRef.value.style.height = dropItem.offsetHeight + "px";
189
+
190
+ if (event.pageX > columnCenter) {
191
+ reorderGalleryRef.value.style.left = targetLeft + dropItemOffsetWidth + "px";
192
+ dropPosition.value = 1;
193
+ } else {
194
+ reorderGalleryRef.value.style.left = targetLeft - parseFloat(elementStyle.marginLeft) + "px";
195
+ dropPosition.value = -1;
196
+ }
197
+
198
+ reorderGalleryRef.value.style.display = "block";
199
+ }
200
+ }
201
+ }
202
+
203
+ function onItemDragLeave(event: DragEvent) {
204
+ if (!props.disableDrag && draggedItem.value) {
205
+ event.preventDefault();
206
+
207
+ reorderGalleryRef.value.style.display = "none";
208
+ }
209
+ }
210
+
211
+ function onItemDrop(event: DragEvent, item: IImage) {
212
+ event.preventDefault();
213
+
214
+ if (draggedItem.value) {
215
+ let dragIndex = defaultImages.value.indexOf(draggedItem.value);
216
+ let dropIndex = defaultImages.value.indexOf(item);
217
+
218
+ let allowDrop = dragIndex !== dropIndex;
219
+
220
+ if (
221
+ allowDrop &&
222
+ ((dropIndex - dragIndex === 1 && dropPosition.value === -1) ||
223
+ (dropIndex - dragIndex === -1 && dropPosition.value === 1))
224
+ ) {
225
+ allowDrop = false;
226
+ }
227
+
228
+ if (allowDrop) {
229
+ reorderArray(defaultImages.value, dragIndex, dropIndex);
230
+
231
+ updateOrder();
232
+ }
233
+
234
+ reorderGalleryRef.value.style.display = "none";
235
+ draggedElement.value.draggable = false;
236
+ draggedItem.value = null;
237
+ dropPosition.value = null;
238
+ }
239
+ }
240
+
241
+ function reorderArray(value: unknown[], from: number, to: number) {
242
+ if (value && from !== to) {
243
+ if (to >= value.length) {
244
+ to %= value.length;
245
+ from %= value.length;
246
+ }
247
+
248
+ value.splice(to, 0, value.splice(from, 1)[0]);
249
+ }
250
+ }
251
+
252
+ function findParentElement(element: HTMLElement) {
253
+ if (element.classList.contains("vc-gallery__item")) {
254
+ return element;
255
+ } else {
256
+ let parent = element.parentElement;
257
+
258
+ while (!parent.classList.contains("vc-gallery__item")) {
259
+ parent = parent.parentElement;
260
+ if (!parent) break;
261
+ }
262
+ return parent;
263
+ }
264
+ }
150
265
  </script>