@vc-shell/framework 1.0.188 → 1.0.190
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/CHANGELOG.md +26 -0
- package/core/plugins/moment/humanize.ts +6 -7
- package/core/types/index.ts +12 -1
- package/dist/core/plugins/moment/humanize.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/framework.js +30782 -20187
- package/dist/index.css +1 -1
- package/dist/shared/components/error-interceptor/interceptor.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +4 -1
- package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +417 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts +357 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts +398 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts +392 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +407 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts +372 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts +391 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts +372 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts +439 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +460 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts +459 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts +359 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts +507 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts +392 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/SwitchField.stories.d.ts +14 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/SwitchField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +407 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts +322 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/common/args.d.ts +113 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/common/args.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts +3 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +235 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceHighlighter.d.ts +4 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceHighlighter.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceTransform.d.ts +3 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceTransform.d.ts.map +1 -0
- package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/factories/types/index.d.ts +1 -0
- package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/helpers/getters.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/types/index.d.ts +88 -38
- package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +16 -16
- package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-switch/index.d.ts +1 -39
- package/dist/ui/components/atoms/vc-switch/index.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts +30 -11
- package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-switch/vc-switch.vue.d.ts +22 -3
- package/dist/ui/components/atoms/vc-switch/vc-switch.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-video/index.d.ts +1 -35
- package/dist/ui/components/atoms/vc-video/index.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-video/vc-video.stories.d.ts +5 -27
- package/dist/ui/components/atoms/vc-video/vc-video.stories.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts +3 -18
- package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts +16 -4
- package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -1
- package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +30 -16
- package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +12 -12
- package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts +252 -42
- package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts +36 -6
- package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts +96 -32
- package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +3 -3
- package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +63 -63
- package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +6 -6
- package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +1 -0
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +8 -2
- package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -1
- package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
- package/package.json +8 -4
- package/shared/components/error-interceptor/interceptor.ts +1 -1
- package/shared/modules/dynamic/components/fields/Button.ts +5 -2
- package/shared/modules/dynamic/components/fields/Card.ts +4 -4
- package/shared/modules/dynamic/components/fields/ContentField.ts +1 -0
- package/shared/modules/dynamic/components/fields/DynamicProperty.ts +5 -6
- package/shared/modules/dynamic/components/fields/EditorField.ts +5 -3
- package/shared/modules/dynamic/components/fields/Fieldset.ts +1 -1
- package/shared/modules/dynamic/components/fields/GalleryField.ts +6 -3
- package/shared/modules/dynamic/components/fields/ImageField.ts +0 -1
- package/shared/modules/dynamic/components/fields/InputCurrency.ts +1 -1
- package/shared/modules/dynamic/components/fields/InputField.ts +1 -0
- package/shared/modules/dynamic/components/fields/MultivalueField.ts +3 -2
- package/shared/modules/dynamic/components/fields/SelectField.ts +1 -0
- package/shared/modules/dynamic/components/fields/StatusField.ts +20 -10
- package/shared/modules/dynamic/components/fields/TextareaField.ts +1 -0
- package/shared/modules/dynamic/components/fields/VideoField.ts +0 -1
- package/shared/modules/dynamic/components/fields/storybook/Button.stories.ts +247 -0
- package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +166 -0
- package/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.ts +185 -0
- package/shared/modules/dynamic/components/fields/storybook/ContentField.stories.ts +245 -0
- package/shared/modules/dynamic/components/fields/storybook/EditorField.stories.ts +192 -0
- package/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.ts +409 -0
- package/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.ts +239 -0
- package/shared/modules/dynamic/components/fields/storybook/ImageField.stories.ts +186 -0
- package/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.ts +267 -0
- package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +298 -0
- package/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.ts +347 -0
- package/shared/modules/dynamic/components/fields/storybook/RatingField.stories.ts +131 -0
- package/shared/modules/dynamic/components/fields/storybook/SelectField.stories.ts +653 -0
- package/shared/modules/dynamic/components/fields/storybook/StatusField.stories.ts +202 -0
- package/shared/modules/dynamic/components/fields/storybook/SwitchField.stories.ts +178 -0
- package/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.ts +203 -0
- package/shared/modules/dynamic/components/fields/storybook/VideoField.stories.ts +92 -0
- package/shared/modules/dynamic/components/fields/storybook/common/args.ts +130 -0
- package/shared/modules/dynamic/components/fields/storybook/common/templates.ts +8 -0
- package/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.ts +54 -0
- package/shared/modules/dynamic/components/fields/storybook/utils/sourceHighlighter.ts +16 -0
- package/shared/modules/dynamic/components/fields/storybook/utils/sourceTransform.ts +41 -0
- package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +1 -0
- package/shared/modules/dynamic/factories/types/index.ts +2 -0
- package/shared/modules/dynamic/helpers/getters.ts +3 -0
- package/shared/modules/dynamic/helpers/nodeBuilder.ts +1 -1
- package/shared/modules/dynamic/helpers/setters.ts +1 -1
- package/shared/modules/dynamic/types/index.ts +93 -40
- package/shared/modules/dynamic/types/models.ts +8 -7
- package/shared/pages/LoginPage/components/login/Login.vue +1 -1
- package/ui/components/atoms/vc-card/vc-card.vue +12 -2
- package/ui/components/atoms/vc-switch/index.ts +1 -3
- package/ui/components/atoms/vc-switch/vc-switch.vue +10 -3
- package/ui/components/atoms/vc-video/index.ts +1 -3
- package/ui/components/atoms/vc-video/vc-video.stories.ts +1 -15
- package/ui/components/atoms/vc-video/vc-video.vue +4 -37
- package/ui/components/molecules/vc-editor/vc-editor.vue +47 -33
- package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +2 -2
- package/ui/components/molecules/vc-input/vc-input.stories.ts +14 -0
- package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +8 -0
- package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +21 -9
- package/ui/components/molecules/vc-select/vc-select.stories.ts +74 -3
- package/ui/components/molecules/vc-select/vc-select.vue +35 -38
- package/ui/components/molecules/vc-textarea/vc-textarea.stories.ts +1 -1
- package/ui/components/molecules/vc-textarea/vc-textarea.vue +5 -15
- package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +140 -108
- package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +20 -6
- package/ui/components/organisms/vc-table/vc-table.stories.ts +6 -2
- package/ui/components/organisms/vc-table/vc-table.vue +176 -124
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
<!-- eslint-disable @typescript-eslint/no-explicit-any -->
|
|
42
42
|
<script lang="ts" setup>
|
|
43
43
|
import { VcIcon } from "./../vc-icon";
|
|
44
|
-
import { ref } from "vue";
|
|
44
|
+
import { ref, watch } from "vue";
|
|
45
45
|
|
|
46
46
|
export interface Props {
|
|
47
47
|
header?: string;
|
|
@@ -71,7 +71,7 @@ defineSlots<{
|
|
|
71
71
|
actions: (props?: any) => any;
|
|
72
72
|
}>();
|
|
73
73
|
|
|
74
|
-
const isCollapsedInternal = ref(
|
|
74
|
+
const isCollapsedInternal = ref();
|
|
75
75
|
|
|
76
76
|
function onHeaderClick() {
|
|
77
77
|
if (props.isCollapsable) {
|
|
@@ -80,6 +80,16 @@ function onHeaderClick() {
|
|
|
80
80
|
}
|
|
81
81
|
emit("header:click");
|
|
82
82
|
}
|
|
83
|
+
|
|
84
|
+
watch(
|
|
85
|
+
() => props.isCollapsed,
|
|
86
|
+
(value) => {
|
|
87
|
+
isCollapsedInternal.value = value;
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
immediate: true,
|
|
91
|
+
},
|
|
92
|
+
);
|
|
83
93
|
</script>
|
|
84
94
|
|
|
85
95
|
<style lang="scss">
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<input
|
|
14
14
|
type="checkbox"
|
|
15
15
|
class="vc-switch__input"
|
|
16
|
-
:checked="modelValue"
|
|
16
|
+
:checked="invertValue(modelValue)"
|
|
17
17
|
:disabled="disabled"
|
|
18
18
|
@input="onInput"
|
|
19
19
|
/>
|
|
@@ -37,19 +37,26 @@ export interface Props {
|
|
|
37
37
|
tooltip?: string;
|
|
38
38
|
required?: boolean;
|
|
39
39
|
label?: string;
|
|
40
|
+
trueValue?: boolean;
|
|
41
|
+
falseValue?: boolean;
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
export interface Emits {
|
|
43
45
|
(event: "update:modelValue", value: boolean): void;
|
|
44
46
|
}
|
|
45
47
|
|
|
46
|
-
defineProps<Props>()
|
|
48
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
49
|
+
trueValue: true,
|
|
50
|
+
falseValue: false,
|
|
51
|
+
});
|
|
47
52
|
|
|
48
53
|
const emit = defineEmits<Emits>();
|
|
49
54
|
|
|
55
|
+
const invertValue = (value: boolean) => (props.trueValue ? value : !value);
|
|
56
|
+
|
|
50
57
|
function onInput(e: Event) {
|
|
51
58
|
const newValue = (e.target as HTMLInputElement).checked;
|
|
52
|
-
emit("update:modelValue", newValue);
|
|
59
|
+
emit("update:modelValue", invertValue(newValue));
|
|
53
60
|
}
|
|
54
61
|
</script>
|
|
55
62
|
|
|
@@ -1,27 +1,13 @@
|
|
|
1
1
|
import type { Meta, StoryFn } from "@storybook/vue3";
|
|
2
2
|
import { VcVideo } from "./";
|
|
3
3
|
|
|
4
|
-
const SIZE = ["auto", "xs", "s", "m", "l", "xl", "xxl"];
|
|
5
|
-
|
|
6
4
|
export default {
|
|
7
5
|
title: "atoms/VcVideo",
|
|
8
6
|
component: VcVideo,
|
|
9
7
|
args: {
|
|
10
8
|
source: "https://www.youtube.com/embed/PeXX-V-dwpA",
|
|
11
|
-
size: "auto",
|
|
12
9
|
label: "Video",
|
|
13
10
|
},
|
|
14
|
-
argTypes: {
|
|
15
|
-
size: {
|
|
16
|
-
options: SIZE,
|
|
17
|
-
control: "radio",
|
|
18
|
-
table: {
|
|
19
|
-
type: {
|
|
20
|
-
summary: SIZE.join(" | "),
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
11
|
} satisfies Meta<typeof VcVideo>;
|
|
26
12
|
|
|
27
13
|
export const Primary: StoryFn<typeof VcVideo> = (args) => ({
|
|
@@ -29,5 +15,5 @@ export const Primary: StoryFn<typeof VcVideo> = (args) => ({
|
|
|
29
15
|
setup() {
|
|
30
16
|
return { args };
|
|
31
17
|
},
|
|
32
|
-
template: '<
|
|
18
|
+
template: '<vc-video v-bind="args" />',
|
|
33
19
|
});
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
3
|
-
class="vc-video"
|
|
4
|
-
:class="[`vc-video_${size}`]"
|
|
5
|
-
>
|
|
2
|
+
<div class="tw-inline-block tw-relative">
|
|
6
3
|
<VcLabel
|
|
7
4
|
v-if="label"
|
|
8
5
|
class="tw-mb-2"
|
|
@@ -15,12 +12,12 @@
|
|
|
15
12
|
>
|
|
16
13
|
</VcLabel>
|
|
17
14
|
|
|
18
|
-
<div
|
|
15
|
+
<div class="tw-w-full tw-relative">
|
|
19
16
|
<div v-if="source">
|
|
20
17
|
<iframe
|
|
21
18
|
:src="`${source}`"
|
|
22
19
|
width="100%"
|
|
23
|
-
height="
|
|
20
|
+
height="300px"
|
|
24
21
|
frameborder="0"
|
|
25
22
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
26
23
|
allowfullscreen="false"
|
|
@@ -47,43 +44,13 @@ export interface Props {
|
|
|
47
44
|
label?: string;
|
|
48
45
|
tooltip?: string;
|
|
49
46
|
source?: string;
|
|
50
|
-
size?: "auto" | "xs" | "s" | "m" | "l" | "xl" | "xxl";
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
export interface Emits {
|
|
54
50
|
(event: "click"): void;
|
|
55
51
|
}
|
|
56
52
|
|
|
57
|
-
|
|
58
|
-
size: "auto",
|
|
59
|
-
});
|
|
53
|
+
defineProps<Props>();
|
|
60
54
|
|
|
61
55
|
defineEmits<Emits>();
|
|
62
56
|
</script>
|
|
63
|
-
|
|
64
|
-
<style lang="scss">
|
|
65
|
-
:root {
|
|
66
|
-
--image-size-xs: 32px;
|
|
67
|
-
--image-size-s: 48px;
|
|
68
|
-
--image-size-m: 64px;
|
|
69
|
-
--image-size-l: 96px;
|
|
70
|
-
--image-size-xl: 128px;
|
|
71
|
-
--image-size-xxl: 145px;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
$paddings: xs, s, m, l, xl, xxl;
|
|
75
|
-
|
|
76
|
-
.vc-video {
|
|
77
|
-
@apply tw-inline-block tw-relative;
|
|
78
|
-
|
|
79
|
-
@each $padding in $paddings {
|
|
80
|
-
&_#{$padding} {
|
|
81
|
-
@apply tw-w-[var(--image-size-#{$padding})];
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
&_auto {
|
|
86
|
-
@apply tw-w-full;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
</style>
|
|
@@ -26,9 +26,10 @@
|
|
|
26
26
|
|
|
27
27
|
<!-- Editor field -->
|
|
28
28
|
<QuillEditor
|
|
29
|
-
:
|
|
29
|
+
:id="id"
|
|
30
|
+
:key="`${id}-${disabled}`"
|
|
30
31
|
ref="quillRef"
|
|
31
|
-
|
|
32
|
+
:content="modelValue"
|
|
32
33
|
class="quill-editor tw-border tw-border-solid tw-border-[color:var(--editor-border-color)] tw-rounded-b-[var(--editor-border-radius)] tw-h-[200px]"
|
|
33
34
|
:class="{ 'tw-bg-[#fafafa] tw-text-[#424242] tw-cursor-default': disabled }"
|
|
34
35
|
theme="snow"
|
|
@@ -37,7 +38,8 @@
|
|
|
37
38
|
content-type="html"
|
|
38
39
|
:read-only="disabled"
|
|
39
40
|
:placeholder="placeholder"
|
|
40
|
-
|
|
41
|
+
:options="options"
|
|
42
|
+
@ready="initializeQuill"
|
|
41
43
|
/>
|
|
42
44
|
<slot
|
|
43
45
|
v-if="errorMessage"
|
|
@@ -51,15 +53,15 @@
|
|
|
51
53
|
</template>
|
|
52
54
|
<!-- eslint-disable @typescript-eslint/no-explicit-any -->
|
|
53
55
|
<script lang="ts" setup>
|
|
54
|
-
import { QuillEditor
|
|
56
|
+
import { QuillEditor } from "@vueup/vue-quill";
|
|
55
57
|
import "@vueup/vue-quill/dist/vue-quill.snow.css";
|
|
56
|
-
import { ref, unref,
|
|
58
|
+
import { ref, unref, onMounted, onUpdated, getCurrentInstance, Ref } from "vue";
|
|
57
59
|
import ImageUploader from "quill-image-uploader";
|
|
58
|
-
import { VcLabel, VcHint } from "
|
|
60
|
+
import { VcLabel, VcHint } from "../..";
|
|
59
61
|
|
|
60
62
|
export interface Props {
|
|
61
63
|
placeholder?: string;
|
|
62
|
-
modelValue?: string
|
|
64
|
+
modelValue?: string;
|
|
63
65
|
required?: boolean;
|
|
64
66
|
disabled?: boolean;
|
|
65
67
|
label?: string;
|
|
@@ -68,6 +70,7 @@ export interface Props {
|
|
|
68
70
|
assetsFolder: string;
|
|
69
71
|
multilanguage?: boolean;
|
|
70
72
|
currentLanguage?: string;
|
|
73
|
+
maxlength?: number;
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
export interface Emits {
|
|
@@ -77,13 +80,16 @@ export interface Emits {
|
|
|
77
80
|
const props = defineProps<Props>();
|
|
78
81
|
|
|
79
82
|
const emit = defineEmits<Emits>();
|
|
83
|
+
const uid = getCurrentInstance()?.uid;
|
|
84
|
+
const id = `editor-${uid}`;
|
|
80
85
|
|
|
81
86
|
defineSlots<{
|
|
82
87
|
error?: (props: any) => any;
|
|
83
88
|
}>();
|
|
84
89
|
|
|
85
|
-
const content = ref();
|
|
86
|
-
const quillRef = ref<
|
|
90
|
+
// const content = ref();
|
|
91
|
+
const quillRef = ref(null) as Ref<typeof QuillEditor | null>;
|
|
92
|
+
const quill = ref();
|
|
87
93
|
|
|
88
94
|
const toolbar = {
|
|
89
95
|
container: [
|
|
@@ -102,6 +108,10 @@ const toolbar = {
|
|
|
102
108
|
handlers: {},
|
|
103
109
|
};
|
|
104
110
|
|
|
111
|
+
const options = {
|
|
112
|
+
bounds: ".quill-editor",
|
|
113
|
+
};
|
|
114
|
+
|
|
105
115
|
const modules = {
|
|
106
116
|
name: "imageUploader",
|
|
107
117
|
module: ImageUploader,
|
|
@@ -110,7 +120,7 @@ const modules = {
|
|
|
110
120
|
const formData = new FormData();
|
|
111
121
|
formData.append("image", file);
|
|
112
122
|
|
|
113
|
-
const result = await fetch(`/api/assets?folderUrl
|
|
123
|
+
const result = await fetch(`/api/assets?folderUrl=/${props.assetsFolder}`, {
|
|
114
124
|
method: "POST",
|
|
115
125
|
body: formData,
|
|
116
126
|
});
|
|
@@ -131,39 +141,32 @@ onUpdated(() => {
|
|
|
131
141
|
removeBlankClass();
|
|
132
142
|
});
|
|
133
143
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
},
|
|
143
|
-
{ immediate: true },
|
|
144
|
-
);
|
|
144
|
+
function initializeQuill() {
|
|
145
|
+
quill.value = quillRef.value?.getQuill();
|
|
146
|
+
if (props.modelValue) {
|
|
147
|
+
quill.value.root.innerHTML = unref(props.modelValue);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
quill.value.on("text-change", onTextChange);
|
|
151
|
+
}
|
|
145
152
|
|
|
146
153
|
function removeBlankClass() {
|
|
147
154
|
// fixes quill editor placeholder visibility issue when content is not empty
|
|
148
|
-
const editor = document.querySelector(".ql-editor.ql-blank");
|
|
149
|
-
if (editor &&
|
|
155
|
+
const editor = document.getElementById(id)?.querySelector(".ql-editor.ql-blank");
|
|
156
|
+
if (editor && props.modelValue) {
|
|
150
157
|
editor.classList.remove("ql-blank");
|
|
151
158
|
}
|
|
152
159
|
}
|
|
153
160
|
|
|
154
|
-
function
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
emit("update:modelValue", content.value);
|
|
161
|
+
function onTextChange() {
|
|
162
|
+
const len = quill.value.getLength();
|
|
163
|
+
if (props.maxlength !== undefined && len > props.maxlength) {
|
|
164
|
+
quill.value.deleteText(props.maxlength, len);
|
|
159
165
|
}
|
|
160
|
-
}
|
|
161
166
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return true;
|
|
167
|
+
if (quill.value.getText().trim() !== props.modelValue?.trim()) {
|
|
168
|
+
emit("update:modelValue", quill.value.root.innerHTML);
|
|
165
169
|
}
|
|
166
|
-
return false;
|
|
167
170
|
}
|
|
168
171
|
</script>
|
|
169
172
|
|
|
@@ -209,6 +212,17 @@ function isQuillEmpty(value: string) {
|
|
|
209
212
|
right: 15px;
|
|
210
213
|
}
|
|
211
214
|
}
|
|
215
|
+
|
|
216
|
+
.quill-editor {
|
|
217
|
+
& .ql-tooltip {
|
|
218
|
+
display: flex;
|
|
219
|
+
flex-flow: wrap;
|
|
220
|
+
|
|
221
|
+
&.ql-hidden {
|
|
222
|
+
display: none !important;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
212
226
|
}
|
|
213
227
|
|
|
214
228
|
.ql-language.ql-picker .ql-picker-label:before {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<template v-if="type === 'date'">
|
|
13
13
|
<div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
|
|
14
14
|
<div class="tw-text-wrap">
|
|
15
|
-
<p>{{ value.toLocaleDateString() }}</p>
|
|
15
|
+
<p>{{ value instanceof Date ? value.toLocaleDateString() : value }}</p>
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
18
18
|
</template>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<template v-if="type === 'date-ago'">
|
|
22
22
|
<div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
|
|
23
23
|
<div class="tw-text-wrap">
|
|
24
|
-
<p>{{ moment(value).fromNow() ?? "N/A" }}</p>
|
|
24
|
+
<p>{{ value instanceof Date ? moment(value).fromNow() ?? "N/A" : value }}</p>
|
|
25
25
|
</div>
|
|
26
26
|
</div>
|
|
27
27
|
</template>
|
|
@@ -9,6 +9,20 @@ export default {
|
|
|
9
9
|
label: "This is an input",
|
|
10
10
|
placeholder: "Placeholder",
|
|
11
11
|
},
|
|
12
|
+
argTypes: {
|
|
13
|
+
maxlength: {
|
|
14
|
+
description: "Maximum number of characters that can be entered.",
|
|
15
|
+
control: "number",
|
|
16
|
+
table: {
|
|
17
|
+
type: {
|
|
18
|
+
summary: "number",
|
|
19
|
+
},
|
|
20
|
+
defaultValue: {
|
|
21
|
+
summary: 1024,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
12
26
|
} satisfies Meta<typeof VcInput>;
|
|
13
27
|
|
|
14
28
|
export const Template: StoryFn<typeof VcInput> = (args) => ({
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
:prefix="prefix"
|
|
21
21
|
:suffix="suffix"
|
|
22
22
|
:name="name"
|
|
23
|
+
:model-value="numberValue"
|
|
23
24
|
:loading="loading"
|
|
24
25
|
:disabled="disabled"
|
|
25
26
|
:autofocus="autofocus"
|
|
@@ -28,6 +29,7 @@
|
|
|
28
29
|
:maxlength="maxlength"
|
|
29
30
|
class="tw-w-full"
|
|
30
31
|
type="number"
|
|
32
|
+
@update:model-value="updateModel"
|
|
31
33
|
>
|
|
32
34
|
<template #append-inner>
|
|
33
35
|
<slot
|
|
@@ -210,4 +212,10 @@ watch(
|
|
|
210
212
|
watch(numberValue, (value) => {
|
|
211
213
|
emit("update:model-value", value);
|
|
212
214
|
});
|
|
215
|
+
|
|
216
|
+
function updateModel(value: string | number | Date | null | undefined) {
|
|
217
|
+
inputRef.value.value = value as string;
|
|
218
|
+
numberValue.value = value as number | null;
|
|
219
|
+
emit("update:model-value", value as number);
|
|
220
|
+
}
|
|
213
221
|
</script>
|
|
@@ -40,11 +40,22 @@
|
|
|
40
40
|
v-if="item"
|
|
41
41
|
class="vc-multivalue__field-value"
|
|
42
42
|
>
|
|
43
|
-
<
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
<slot
|
|
44
|
+
name="selected-item"
|
|
45
|
+
:value="
|
|
46
|
+
type === 'number'
|
|
47
|
+
? Number(item[props.optionLabel as keyof T]).toFixed(3)
|
|
48
|
+
: item[props.optionLabel as keyof T]
|
|
49
|
+
"
|
|
50
|
+
:item="item"
|
|
51
|
+
:remove="() => onDelete(i)"
|
|
52
|
+
>
|
|
53
|
+
<span class="tw-truncate">{{
|
|
54
|
+
type === "number"
|
|
55
|
+
? Number(item[props.optionLabel as keyof T]).toFixed(3)
|
|
56
|
+
: item[props.optionLabel as keyof T]
|
|
57
|
+
}}</span>
|
|
58
|
+
</slot>
|
|
48
59
|
<VcIcon
|
|
49
60
|
v-if="!disabled"
|
|
50
61
|
class="vc-multivalue__field-value-clear"
|
|
@@ -88,7 +99,7 @@
|
|
|
88
99
|
@click="onItemSelect(item)"
|
|
89
100
|
>
|
|
90
101
|
<slot
|
|
91
|
-
name="
|
|
102
|
+
name="option"
|
|
92
103
|
:item="item"
|
|
93
104
|
>{{ item[optionLabel as keyof T] }}</slot
|
|
94
105
|
>
|
|
@@ -192,7 +203,8 @@ const props = withDefaults(defineProps<Props<T>>(), {
|
|
|
192
203
|
|
|
193
204
|
const emit = defineEmits<Emits<T>>();
|
|
194
205
|
defineSlots<{
|
|
195
|
-
|
|
206
|
+
option: (args: { item: T }) => any;
|
|
207
|
+
"selected-item": (args: { value: string | T[keyof T]; item: T; remove: () => void }) => any;
|
|
196
208
|
hint: void;
|
|
197
209
|
error: void;
|
|
198
210
|
}>();
|
|
@@ -381,7 +393,7 @@ function onSearch(event: Event) {
|
|
|
381
393
|
}
|
|
382
394
|
|
|
383
395
|
&__field {
|
|
384
|
-
@apply tw-border-none tw-outline-none tw-h-[var(--multivalue-height)]
|
|
396
|
+
@apply tw-border-none tw-outline-none tw-min-h-[var(--multivalue-height)]
|
|
385
397
|
tw-min-w-[120px] tw-box-border placeholder:tw-text-[color:var(--multivalue-placeholder-color)];
|
|
386
398
|
|
|
387
399
|
&::-webkit-input-placeholder {
|
|
@@ -397,7 +409,7 @@ function onSearch(event: Event) {
|
|
|
397
409
|
}
|
|
398
410
|
|
|
399
411
|
&-value-wrapper {
|
|
400
|
-
@apply tw-h-[var(--multivalue-height)] tw-ml-2 tw-flex tw-items-center;
|
|
412
|
+
@apply tw-min-h-[var(--multivalue-height)] tw-ml-2 tw-flex tw-items-center;
|
|
401
413
|
}
|
|
402
414
|
|
|
403
415
|
&-value {
|
|
@@ -11,21 +11,92 @@ export default {
|
|
|
11
11
|
},
|
|
12
12
|
argTypes: {
|
|
13
13
|
options: {
|
|
14
|
+
description: `Method that is used to get select options.
|
|
15
|
+
Method should be defined in the blade \`scope\` and could be:
|
|
16
|
+
\n1) async method with the following arguments: (\`keyword: string\`, \`skip\`, \`ids?: string[]\`).
|
|
17
|
+
\n2) any array
|
|
18
|
+
\n3) composable returning array`,
|
|
14
19
|
table: {
|
|
15
20
|
type: {
|
|
16
21
|
summary: "((keyword?: string, skip?: number, ids?: string[]) => Promise<P>) | T[]",
|
|
17
22
|
},
|
|
18
23
|
},
|
|
19
24
|
},
|
|
20
|
-
|
|
25
|
+
optionValue: {
|
|
26
|
+
description: "Property which holds the `value`",
|
|
21
27
|
control: "text",
|
|
28
|
+
table: {
|
|
29
|
+
type: {
|
|
30
|
+
summary: "string",
|
|
31
|
+
},
|
|
32
|
+
defaultValue: {
|
|
33
|
+
summary: "id",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
22
36
|
},
|
|
23
|
-
|
|
37
|
+
optionLabel: {
|
|
38
|
+
description: "Property which holds the `label`",
|
|
24
39
|
control: "text",
|
|
40
|
+
table: {
|
|
41
|
+
type: {
|
|
42
|
+
summary: "string",
|
|
43
|
+
},
|
|
44
|
+
defaultValue: {
|
|
45
|
+
summary: "title",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
25
48
|
},
|
|
26
49
|
debounce: {
|
|
27
50
|
control: "number",
|
|
28
51
|
},
|
|
52
|
+
clearable: {
|
|
53
|
+
description: "Whether the select is clearable or not.",
|
|
54
|
+
control: "boolean",
|
|
55
|
+
table: {
|
|
56
|
+
type: {
|
|
57
|
+
summary: "boolean",
|
|
58
|
+
},
|
|
59
|
+
defaultValue: {
|
|
60
|
+
summary: false,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
emitValue: {
|
|
65
|
+
description: `Update model with the value of the selected option instead of the whole option.
|
|
66
|
+
\n Example:
|
|
67
|
+
\nIf emitValue is \`true\` and the selected option is { id: 1, title: "Option 1" }, the model will be updated with 1.
|
|
68
|
+
\nIf emitValue is \`false\`, the model will be updated with the whole option.`,
|
|
69
|
+
table: {
|
|
70
|
+
type: {
|
|
71
|
+
summary: "boolean",
|
|
72
|
+
},
|
|
73
|
+
defaultValue: {
|
|
74
|
+
summary: "true",
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
searchable: {
|
|
79
|
+
description: "Whether the select is searchable or not.",
|
|
80
|
+
table: {
|
|
81
|
+
type: {
|
|
82
|
+
summary: "boolean",
|
|
83
|
+
},
|
|
84
|
+
defaultValue: {
|
|
85
|
+
summary: false,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
multiple: {
|
|
90
|
+
description: "Select multiple values.",
|
|
91
|
+
table: {
|
|
92
|
+
type: {
|
|
93
|
+
summary: "boolean",
|
|
94
|
+
},
|
|
95
|
+
defaultValue: {
|
|
96
|
+
summary: false,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
29
100
|
},
|
|
30
101
|
} satisfies Meta<typeof VcSelect>;
|
|
31
102
|
|
|
@@ -61,7 +132,7 @@ export const AsyncOptions: StoryFn<typeof VcSelect> = (args) => ({
|
|
|
61
132
|
components: { VcSelect } as Record<keyof typeof VcSelect, unknown>,
|
|
62
133
|
setup() {
|
|
63
134
|
const val = ref();
|
|
64
|
-
const getItems = async () =>
|
|
135
|
+
const getItems = async (keyword?: string, skip = 0, ids?: string[]) =>
|
|
65
136
|
new Promise((resolve) => {
|
|
66
137
|
setTimeout(() => {
|
|
67
138
|
resolve({
|