@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.
- package/core/composables/index.ts +0 -1
- package/core/composables/useNotifications/index.ts +2 -2
- package/core/composables/usePermissions/index.ts +1 -1
- package/core/composables/useSettings/index.ts +2 -2
- package/core/composables/useUser/index.ts +2 -2
- package/core/plugins/validation/rules.ts +67 -24
- package/core/types/index.ts +19 -2
- package/dist/framework.mjs +2816 -5023
- package/dist/index.css +1 -1
- package/dist/types/core/composables/index.d.ts +0 -1
- package/dist/types/core/composables/index.d.ts.map +1 -1
- package/dist/types/core/composables/useNotifications/index.d.ts +1 -1
- package/dist/types/core/composables/useNotifications/index.d.ts.map +1 -1
- package/dist/types/core/composables/useUser/index.d.ts +2 -2
- package/dist/types/core/composables/useUser/index.d.ts.map +1 -1
- package/dist/types/core/plugins/validation/rules.d.ts +8 -30
- package/dist/types/core/plugins/validation/rules.d.ts.map +1 -1
- package/dist/types/core/types/index.d.ts +17 -2
- package/dist/types/core/types/index.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/shared/components/app-switcher/components/index.d.ts.map +1 -0
- package/dist/types/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/index.d.ts +5 -5
- package/dist/types/shared/components/app-switcher/components/vc-app-switcher/index.d.ts.map +1 -0
- package/dist/types/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/vc-app-switcher.vue.d.ts +1 -1
- package/dist/types/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -0
- package/dist/types/shared/components/app-switcher/composables/index.d.ts.map +1 -0
- package/dist/types/shared/{app-switcher → components/app-switcher}/composables/useAppSwitcher/index.d.ts +1 -1
- package/dist/types/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -0
- package/dist/types/shared/components/app-switcher/index.d.ts.map +1 -0
- package/dist/types/shared/components/blade-navigation/components/index.d.ts.map +1 -0
- package/dist/types/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts.map +1 -0
- package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts +1 -1
- package/dist/types/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -0
- package/dist/types/shared/components/blade-navigation/composables/index.d.ts.map +1 -0
- package/dist/types/shared/{blade-navigation → components/blade-navigation}/composables/useBladeNavigation/index.d.ts +1 -1
- package/dist/types/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -0
- package/dist/types/shared/components/blade-navigation/index.d.ts.map +1 -0
- package/dist/types/shared/{blade-navigation → components/blade-navigation}/types/index.d.ts +1 -1
- package/dist/types/shared/components/blade-navigation/types/index.d.ts.map +1 -0
- package/dist/types/shared/index.d.ts +4 -3
- package/dist/types/shared/index.d.ts.map +1 -1
- package/dist/types/shared/{assets → modules/assets}/components/assets-details/assets-details.vue.d.ts +5 -13
- package/dist/types/shared/modules/assets/components/assets-details/assets-details.vue.d.ts.map +1 -0
- package/dist/types/shared/{assets → modules/assets}/components/assets-details/index.d.ts +8 -7
- package/dist/types/shared/modules/assets/components/assets-details/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets/components/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets/locales/index.d.ts +3 -0
- package/dist/types/shared/modules/assets/locales/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +58 -0
- package/dist/types/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -0
- package/dist/types/shared/modules/assets-manager/components/assets-manager/index.d.ts +59 -0
- package/dist/types/shared/modules/assets-manager/components/assets-manager/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets-manager/components/index.d.ts +2 -0
- package/dist/types/shared/modules/assets-manager/components/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets-manager/index.d.ts +12 -0
- package/dist/types/shared/modules/assets-manager/index.d.ts.map +1 -0
- package/dist/types/shared/modules/assets-manager/locales/index.d.ts.map +1 -0
- package/dist/types/shared/utilities/assets.d.ts +5 -0
- package/dist/types/shared/utilities/assets.d.ts.map +1 -0
- package/dist/types/ui/components/atoms/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-file-upload/index.d.ts +12 -12
- package/dist/types/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-input/index.d.ts +0 -4
- package/dist/types/ui/components/molecules/vc-input/index.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-input/vc-input.vue.d.ts +1 -1
- package/dist/types/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-select/index.d.ts +24 -0
- package/dist/types/ui/components/molecules/vc-select/index.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-select/vc-select.vue.d.ts +20 -0
- package/dist/types/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-textarea/index.d.ts +0 -4
- package/dist/types/ui/components/molecules/vc-textarea/index.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +0 -4
- package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts.map +1 -1
- package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +1 -1
- package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
- 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
- package/dist/types/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts +2 -19
- package/dist/types/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-dynamic-property/index.d.ts +12 -0
- package/dist/types/ui/components/organisms/vc-dynamic-property/index.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts +7 -0
- package/dist/types/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -20
- package/dist/types/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-gallery/index.d.ts +28 -31
- package/dist/types/ui/components/organisms/vc-gallery/index.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +2 -6
- package/dist/types/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-table/index.d.ts +49 -37
- package/dist/types/ui/components/organisms/vc-table/index.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-table/vc-table.stories.d.ts +49 -37
- package/dist/types/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
- package/dist/types/ui/components/organisms/vc-table/vc-table.vue.d.ts +12 -7
- package/dist/types/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
- package/package.json +5 -6
- package/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/vc-app-switcher.vue +1 -1
- package/shared/{app-switcher → components/app-switcher}/composables/useAppSwitcher/index.ts +2 -2
- package/shared/{app-switcher → components/app-switcher}/index.ts +1 -1
- package/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/vc-blade-navigation.vue +2 -2
- package/shared/{blade-navigation → components/blade-navigation}/composables/useBladeNavigation/index.ts +6 -5
- package/shared/{blade-navigation → components/blade-navigation}/index.ts +1 -1
- package/shared/{blade-navigation → components/blade-navigation}/types/index.ts +1 -1
- package/shared/index.ts +10 -7
- package/shared/modules/assets/components/assets-details/assets-details.vue +204 -0
- package/shared/{assets → modules/assets}/index.ts +1 -1
- package/shared/{assets → modules/assets}/locales/en.json +7 -5
- package/shared/modules/assets/locales/index.ts +2 -0
- package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +389 -0
- package/shared/modules/assets-manager/components/assets-manager/index.ts +3 -0
- package/shared/modules/assets-manager/components/index.ts +1 -0
- package/shared/modules/assets-manager/index.ts +14 -0
- package/shared/modules/assets-manager/locales/en.json +28 -0
- package/shared/utilities/assets.ts +40 -0
- package/tailwind.config.js +0 -2
- package/ui/components/atoms/vc-button/vc-button.vue +0 -1
- package/ui/components/atoms/vc-checkbox/vc-checkbox.vue +1 -11
- package/ui/components/molecules/vc-editor/vc-editor.vue +21 -0
- package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +1 -0
- package/ui/components/molecules/vc-input/vc-input.vue +1 -1
- package/ui/components/molecules/vc-select/vc-select.vue +40 -9
- package/ui/components/molecules/vc-textarea/vc-textarea.vue +1 -1
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +3 -2
- package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue +3 -6
- package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +2 -6
- package/ui/components/organisms/vc-dynamic-property/index.ts +0 -1
- package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +18 -1
- package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +5 -11
- package/ui/components/organisms/vc-gallery/vc-gallery.vue +164 -49
- package/ui/components/organisms/vc-table/vc-table.vue +189 -144
- package/core/composables/useAutosave/index.ts +0 -55
- package/dist/types/core/composables/useAutosave/index.d.ts +0 -9
- package/dist/types/core/composables/useAutosave/index.d.ts.map +0 -1
- package/dist/types/shared/app-switcher/components/index.d.ts.map +0 -1
- package/dist/types/shared/app-switcher/components/vc-app-switcher/index.d.ts.map +0 -1
- package/dist/types/shared/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +0 -1
- package/dist/types/shared/app-switcher/composables/index.d.ts.map +0 -1
- package/dist/types/shared/app-switcher/composables/useAppSwitcher/index.d.ts.map +0 -1
- package/dist/types/shared/app-switcher/index.d.ts.map +0 -1
- package/dist/types/shared/assets/components/assets-details/assets-details.vue.d.ts.map +0 -1
- package/dist/types/shared/assets/components/assets-details/index.d.ts.map +0 -1
- package/dist/types/shared/assets/components/index.d.ts.map +0 -1
- package/dist/types/shared/assets/index.d.ts.map +0 -1
- package/dist/types/shared/assets/locales/index.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/components/index.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/components/vc-blade-navigation/index.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/composables/index.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/composables/useBladeNavigation/index.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/index.d.ts.map +0 -1
- package/dist/types/shared/blade-navigation/types/index.d.ts.map +0 -1
- package/shared/assets/components/assets-details/assets-details.vue +0 -116
- /package/dist/types/shared/{app-switcher → components/app-switcher}/components/index.d.ts +0 -0
- /package/dist/types/shared/{app-switcher → components/app-switcher}/composables/index.d.ts +0 -0
- /package/dist/types/shared/{app-switcher → components/app-switcher}/index.d.ts +0 -0
- /package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/index.d.ts +0 -0
- /package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/index.d.ts +0 -0
- /package/dist/types/shared/{blade-navigation → components/blade-navigation}/composables/index.d.ts +0 -0
- /package/dist/types/shared/{blade-navigation → components/blade-navigation}/index.d.ts +0 -0
- /package/dist/types/shared/{assets → modules/assets}/components/index.d.ts +0 -0
- /package/dist/types/shared/{assets → modules/assets}/index.d.ts +0 -0
- /package/dist/types/shared/{assets → modules/assets-manager}/locales/index.d.ts +0 -0
- /package/shared/{app-switcher → components/app-switcher}/components/index.ts +0 -0
- /package/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/index.ts +0 -0
- /package/shared/{app-switcher → components/app-switcher}/composables/index.ts +0 -0
- /package/shared/{blade-navigation → components/blade-navigation}/components/index.ts +0 -0
- /package/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/index.ts +0 -0
- /package/shared/{blade-navigation → components/blade-navigation}/composables/index.ts +0 -0
- /package/shared/{assets → modules/assets}/components/assets-details/index.ts +0 -0
- /package/shared/{assets → modules/assets}/components/index.ts +0 -0
- /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-
|
|
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>{{
|
|
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, "
|
|
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
|
|
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(() =>
|
|
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>
|
|
@@ -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
|
|
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="{
|
|
7
|
+
v-slot="{ isExactActive, navigate }"
|
|
8
8
|
>
|
|
9
9
|
<vc-app-menu-link
|
|
10
|
-
: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
|
|
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="
|
|
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 =
|
|
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
|
|
|
@@ -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
|
|
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
|
|
26
|
+
:title="image['name']"
|
|
27
27
|
>
|
|
28
|
-
{{ image
|
|
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
|
|
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-
|
|
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="(
|
|
13
|
-
<div class="tw-flex tw-flex-wrap">
|
|
14
|
-
<
|
|
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
|
-
|
|
18
|
-
v-bind="dragOptions"
|
|
19
|
-
@change="updateOrder"
|
|
20
|
-
:component-data="{
|
|
21
|
-
tag: 'div',
|
|
22
|
-
}"
|
|
16
|
+
ref="galleryRef"
|
|
23
17
|
>
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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 {
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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 =
|
|
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
|
-
|
|
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>
|