@vc-shell/framework 1.0.189 → 1.0.191
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/types/index.ts +12 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/framework.js +30669 -20092
- 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/EditorField.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/TextareaField.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +9 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +12 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +12 -0
- package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.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/types/index.d.ts +15 -0
- package/dist/shared/modules/dynamic/types/index.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/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-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/EditorField.ts +1 -0
- package/shared/modules/dynamic/components/fields/InputField.ts +1 -0
- package/shared/modules/dynamic/components/fields/TextareaField.ts +1 -0
- package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +1 -2
- package/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.ts +0 -1
- package/shared/modules/dynamic/components/fields/storybook/ContentField.stories.ts +1 -2
- package/shared/modules/dynamic/components/fields/storybook/EditorField.stories.ts +10 -3
- package/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.ts +3 -3
- package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +12 -0
- package/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.ts +12 -0
- package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +6 -3
- package/shared/modules/dynamic/factories/types/index.ts +2 -0
- package/shared/modules/dynamic/types/index.ts +15 -0
- package/shared/pages/LoginPage/components/login/Login.vue +1 -1
- package/ui/components/molecules/vc-editor/vc-editor.vue +24 -29
- package/ui/components/molecules/vc-input/vc-input.stories.ts +14 -0
- package/ui/components/molecules/vc-textarea/vc-textarea.stories.ts +1 -1
- package/ui/components/molecules/vc-textarea/vc-textarea.vue +4 -6
- 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 -125
|
@@ -1,124 +1,150 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
<
|
|
5
|
-
v-if="typeof Number(value) === 'number' && Number(value) > 0"
|
|
6
|
-
class="tw-truncate"
|
|
7
|
-
>
|
|
8
|
-
<span class="tw-truncate">{{ Math.trunc(Number(value)) }}</span
|
|
9
|
-
><span class="tw-text-[#a5a5a5] tw-text-xs tw-truncate"
|
|
10
|
-
>.{{ `${(Number(value) * 100) % 100}`.padEnd(2, "0").slice(0, 2) }}</span
|
|
11
|
-
>
|
|
12
|
-
</div>
|
|
13
|
-
<template v-else>
|
|
14
|
-
<div class="tw-truncate">N/A</div>
|
|
15
|
-
</template>
|
|
16
|
-
</template>
|
|
17
|
-
|
|
18
|
-
<!-- Date ago cell -->
|
|
19
|
-
<span
|
|
20
|
-
v-else-if="cell.type === 'date-ago'"
|
|
21
|
-
class="tw-text-[#a5a5a5]"
|
|
22
|
-
:title="(value instanceof Date && value.toLocaleString(locale)) || ''"
|
|
23
|
-
>
|
|
24
|
-
<div
|
|
25
|
-
v-if="value"
|
|
26
|
-
class="tw-truncate"
|
|
27
|
-
>
|
|
28
|
-
{{ moment(value).fromNow() }}
|
|
29
|
-
</div>
|
|
30
|
-
<div
|
|
31
|
-
v-else
|
|
32
|
-
class="tw-truncate"
|
|
33
|
-
>
|
|
34
|
-
N/A
|
|
35
|
-
</div>
|
|
36
|
-
</span>
|
|
37
|
-
|
|
38
|
-
<!-- Date exact cell -->
|
|
39
|
-
<div
|
|
40
|
-
v-else-if="cell.type === 'date' || cell.type === 'time' || cell.type === 'date-time'"
|
|
41
|
-
class="tw-text-[#a5a5a5] tw-truncate"
|
|
42
|
-
>
|
|
43
|
-
<template v-if="value">
|
|
2
|
+
<div>
|
|
3
|
+
<!-- Money cell -->
|
|
4
|
+
<template v-if="cell.type === 'money'">
|
|
44
5
|
<div
|
|
45
|
-
v-if="
|
|
6
|
+
v-if="typeof Number(value) === 'number' && Number(value) > 0"
|
|
46
7
|
class="tw-truncate"
|
|
8
|
+
:class="cell.class"
|
|
47
9
|
>
|
|
48
|
-
{{
|
|
10
|
+
<span class="tw-truncate">{{ Math.trunc(Number(value)) }}</span
|
|
11
|
+
><span class="tw-text-[#a5a5a5] tw-text-xs tw-truncate"
|
|
12
|
+
>.{{ `${(Number(value) * 100) % 100}`.padEnd(2, "0").slice(0, 2) }}</span
|
|
13
|
+
>
|
|
49
14
|
</div>
|
|
50
15
|
<template v-else>
|
|
51
16
|
<div
|
|
52
|
-
v-if="cell.type === 'date'"
|
|
53
17
|
class="tw-truncate"
|
|
18
|
+
:class="cell.class"
|
|
54
19
|
>
|
|
55
|
-
|
|
20
|
+
N/A
|
|
56
21
|
</div>
|
|
22
|
+
</template>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<!-- Date ago cell -->
|
|
26
|
+
<span
|
|
27
|
+
v-else-if="cell.type === 'date-ago'"
|
|
28
|
+
class="tw-text-[#a5a5a5]"
|
|
29
|
+
:class="cell.class"
|
|
30
|
+
:title="(value instanceof Date && value.toLocaleString(locale)) || ''"
|
|
31
|
+
>
|
|
32
|
+
<div
|
|
33
|
+
v-if="value"
|
|
34
|
+
class="tw-truncate"
|
|
35
|
+
>
|
|
36
|
+
{{ moment(value).fromNow() }}
|
|
37
|
+
</div>
|
|
38
|
+
<div
|
|
39
|
+
v-else
|
|
40
|
+
class="tw-truncate"
|
|
41
|
+
>
|
|
42
|
+
N/A
|
|
43
|
+
</div>
|
|
44
|
+
</span>
|
|
45
|
+
|
|
46
|
+
<!-- Date exact cell -->
|
|
47
|
+
<div
|
|
48
|
+
v-else-if="cell.type === 'date' || cell.type === 'time' || cell.type === 'date-time'"
|
|
49
|
+
class="tw-text-[#a5a5a5] tw-truncate"
|
|
50
|
+
:class="cell.class"
|
|
51
|
+
>
|
|
52
|
+
<template v-if="value">
|
|
57
53
|
<div
|
|
58
|
-
v-if="cell.
|
|
54
|
+
v-if="cell.format"
|
|
59
55
|
class="tw-truncate"
|
|
60
56
|
>
|
|
61
|
-
{{ value
|
|
57
|
+
{{ moment(value).locale(locale).format(cell.format) }}
|
|
62
58
|
</div>
|
|
63
|
-
<
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
<template v-else>
|
|
60
|
+
<div
|
|
61
|
+
v-if="cell.type === 'date'"
|
|
62
|
+
class="tw-truncate"
|
|
63
|
+
>
|
|
64
|
+
{{ value instanceof Date && value.toLocaleDateString(locale) }}
|
|
65
|
+
</div>
|
|
66
|
+
<div
|
|
67
|
+
v-if="cell.type === 'time'"
|
|
68
|
+
class="tw-truncate"
|
|
69
|
+
>
|
|
70
|
+
{{ value instanceof Date && value.toLocaleTimeString(locale) }}
|
|
71
|
+
</div>
|
|
72
|
+
<p
|
|
73
|
+
v-if="cell.type === 'date-time'"
|
|
74
|
+
class="tw-truncate"
|
|
75
|
+
>
|
|
76
|
+
{{ value instanceof Date && value.toLocaleString(locale) }}
|
|
77
|
+
</p>
|
|
78
|
+
</template>
|
|
69
79
|
</template>
|
|
80
|
+
<div
|
|
81
|
+
v-else
|
|
82
|
+
class="tw-truncate"
|
|
83
|
+
>
|
|
84
|
+
N/A
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<!-- Image cell -->
|
|
89
|
+
<template v-else-if="cell.type === 'image'">
|
|
90
|
+
<VcImage
|
|
91
|
+
:bordered="true"
|
|
92
|
+
size="s"
|
|
93
|
+
aspect="1x1"
|
|
94
|
+
:src="value as string"
|
|
95
|
+
background="contain"
|
|
96
|
+
/>
|
|
97
|
+
</template>
|
|
98
|
+
|
|
99
|
+
<!-- Status cell -->
|
|
100
|
+
<template v-else-if="cell.type === 'status'">
|
|
101
|
+
<VcStatus>{{ value }}</VcStatus>
|
|
70
102
|
</template>
|
|
103
|
+
|
|
104
|
+
<!-- Status icon cell -->
|
|
71
105
|
<div
|
|
72
|
-
v-else
|
|
73
|
-
class="tw-
|
|
106
|
+
v-else-if="cell.type === 'status-icon'"
|
|
107
|
+
class="tw-flex tw-justify-center"
|
|
108
|
+
:class="cell.class"
|
|
74
109
|
>
|
|
75
|
-
|
|
110
|
+
<VcStatusIcon :status="value as boolean"></VcStatusIcon>
|
|
76
111
|
</div>
|
|
77
|
-
</div>
|
|
78
112
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
/>
|
|
88
|
-
</template>
|
|
89
|
-
|
|
90
|
-
<!-- Status cell -->
|
|
91
|
-
<template v-else-if="cell.type === 'status'">
|
|
92
|
-
<VcStatus>{{ value }}</VcStatus>
|
|
93
|
-
</template>
|
|
94
|
-
|
|
95
|
-
<!-- Status icon cell -->
|
|
96
|
-
<div
|
|
97
|
-
v-else-if="cell.type === 'status-icon'"
|
|
98
|
-
class="tw-flex tw-justify-center"
|
|
99
|
-
>
|
|
100
|
-
<VcStatusIcon :status="value as boolean"></VcStatusIcon>
|
|
101
|
-
</div>
|
|
113
|
+
<!-- Number cell -->
|
|
114
|
+
<div
|
|
115
|
+
v-else-if="cell.type === 'number'"
|
|
116
|
+
class="tw-text-right tw-truncate"
|
|
117
|
+
:class="cell.class"
|
|
118
|
+
>
|
|
119
|
+
{{ Number(value).toFixed(0) }}
|
|
120
|
+
</div>
|
|
102
121
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
122
|
+
<!-- Link cell -->
|
|
123
|
+
<template v-else-if="cell.type === 'link'">
|
|
124
|
+
<VcLink
|
|
125
|
+
class="tw-truncate"
|
|
126
|
+
:class="cell.class"
|
|
127
|
+
>{{ value }}</VcLink
|
|
128
|
+
>
|
|
129
|
+
</template>
|
|
130
|
+
|
|
131
|
+
<!-- HTML cell -->
|
|
132
|
+
<template v-else-if="cell.type === 'html'">
|
|
133
|
+
<div
|
|
134
|
+
class="tw-p-1"
|
|
135
|
+
:class="cell.class"
|
|
136
|
+
v-html="truncatedHtml"
|
|
137
|
+
/>
|
|
138
|
+
</template>
|
|
110
139
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
class="tw-truncate"
|
|
120
|
-
>
|
|
121
|
-
{{ value }}
|
|
140
|
+
<!-- Default cell -->
|
|
141
|
+
<div
|
|
142
|
+
v-else
|
|
143
|
+
class="tw-truncate"
|
|
144
|
+
:class="cell.class"
|
|
145
|
+
>
|
|
146
|
+
{{ value }}
|
|
147
|
+
</div>
|
|
122
148
|
</div>
|
|
123
149
|
</template>
|
|
124
150
|
|
|
@@ -126,24 +152,30 @@
|
|
|
126
152
|
import { computed } from "vue";
|
|
127
153
|
import moment from "moment";
|
|
128
154
|
import { ITableColumns } from "./../../../../../../core/types";
|
|
155
|
+
import * as _ from "lodash-es";
|
|
156
|
+
import htmlTruncate from "truncate-html";
|
|
157
|
+
import * as DOMPurify from "dompurify";
|
|
129
158
|
|
|
130
159
|
export interface Props {
|
|
131
160
|
cell: ITableColumns;
|
|
132
161
|
item: Record<string, unknown>;
|
|
162
|
+
width?: number;
|
|
133
163
|
}
|
|
134
164
|
|
|
135
165
|
const props = defineProps<Props>();
|
|
136
166
|
|
|
137
167
|
const locale = window.navigator.language;
|
|
138
168
|
|
|
139
|
-
const value = computed(()
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return val !== undefined ? val : null;
|
|
147
|
-
}, props.item);
|
|
169
|
+
const value = computed(() => _.get(props.item, props.cell.field || props.cell.id));
|
|
170
|
+
|
|
171
|
+
const sanitizedHtml = computed(() => {
|
|
172
|
+
if (props.cell.type === "html") {
|
|
173
|
+
return DOMPurify.default.sanitize(value.value as string, { USE_PROFILES: { html: true } });
|
|
174
|
+
}
|
|
175
|
+
return "";
|
|
148
176
|
});
|
|
177
|
+
|
|
178
|
+
const truncatedHtml = computed(() =>
|
|
179
|
+
htmlTruncate(sanitizedHtml.value, +(typeof props.width !== "undefined" ? Math.floor(props.width / 5) : 30)),
|
|
180
|
+
);
|
|
149
181
|
</script>
|
|
@@ -16,18 +16,22 @@
|
|
|
16
16
|
class="tw-flex tw-flex-col tw-box-border tw-max-h-[300px] tw-h-auto tw-z-10 tw-overflow-hidden tw-absolute tw-bg-white tw-border tw-border-solid tw-border-[#e5e7eb] tw-w-max tw-right-0"
|
|
17
17
|
>
|
|
18
18
|
<VcContainer
|
|
19
|
-
v-if="
|
|
19
|
+
v-if="internalItems && internalItems.length"
|
|
20
20
|
:no-padding="true"
|
|
21
21
|
>
|
|
22
22
|
<div class="tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col">
|
|
23
23
|
<div
|
|
24
|
-
v-for="item in
|
|
24
|
+
v-for="item in internalItems"
|
|
25
25
|
:key="item.id"
|
|
26
26
|
class="tw-flex tw-items-center tw-min-h-[30px] tw-box-border tw-rounded-[3px] tw-px-2 tw-cursor-pointer hover:tw-bg-[#eff7fc] tw-border-b"
|
|
27
|
-
:class="{ 'tw-bg-[#eff7fc]': item.visible }"
|
|
28
27
|
@click="selectItem(item)"
|
|
29
28
|
>
|
|
30
|
-
|
|
29
|
+
<VcIcon
|
|
30
|
+
:icon="item.visible ? 'fas fa-check' : ''"
|
|
31
|
+
size="s"
|
|
32
|
+
class="tw-w-4"
|
|
33
|
+
/>
|
|
34
|
+
<p class="tw-ml-2">{{ item.title }}</p>
|
|
31
35
|
</div>
|
|
32
36
|
</div>
|
|
33
37
|
</VcContainer>
|
|
@@ -37,7 +41,7 @@
|
|
|
37
41
|
</template>
|
|
38
42
|
|
|
39
43
|
<script lang="ts" setup>
|
|
40
|
-
import { ref, computed } from "vue";
|
|
44
|
+
import { ref, computed, toRefs, watch } from "vue";
|
|
41
45
|
import { ITableColumns } from "./../../../../../../core/types";
|
|
42
46
|
import { vOnClickOutside } from "@vueuse/components";
|
|
43
47
|
import { useFloating, flip, shift, autoUpdate } from "@floating-ui/vue";
|
|
@@ -50,12 +54,13 @@ export interface Emits {
|
|
|
50
54
|
(event: "change", value: ITableColumns): void;
|
|
51
55
|
}
|
|
52
56
|
|
|
53
|
-
withDefaults(defineProps<Props>(), {});
|
|
57
|
+
const props = withDefaults(defineProps<Props>(), {});
|
|
54
58
|
const emit = defineEmits<Emits>();
|
|
55
59
|
|
|
56
60
|
const isActive = ref(false);
|
|
57
61
|
const referenceButton = ref(null);
|
|
58
62
|
const floatingDrop = ref(null);
|
|
63
|
+
const internalItems = ref();
|
|
59
64
|
const floater = useFloating(referenceButton, floatingDrop, {
|
|
60
65
|
placement: "bottom-end",
|
|
61
66
|
whileElementsMounted: autoUpdate,
|
|
@@ -69,12 +74,21 @@ const floatingDropStyle = computed(() => {
|
|
|
69
74
|
};
|
|
70
75
|
});
|
|
71
76
|
|
|
77
|
+
watch(
|
|
78
|
+
() => props.items,
|
|
79
|
+
(newVal) => {
|
|
80
|
+
internalItems.value = newVal;
|
|
81
|
+
},
|
|
82
|
+
{ immediate: true, deep: true },
|
|
83
|
+
);
|
|
84
|
+
|
|
72
85
|
function selectItem(item: ITableColumns) {
|
|
73
86
|
emit("change", toggleVisibility(item));
|
|
74
87
|
}
|
|
75
88
|
|
|
76
89
|
function toggleVisibility(item: ITableColumns) {
|
|
77
90
|
item.visible = !item.visible;
|
|
91
|
+
|
|
78
92
|
return item;
|
|
79
93
|
}
|
|
80
94
|
|
|
@@ -17,7 +17,7 @@ export default {
|
|
|
17
17
|
{
|
|
18
18
|
id: "img",
|
|
19
19
|
title: "Pic",
|
|
20
|
-
width:
|
|
20
|
+
width: "60px",
|
|
21
21
|
type: "image",
|
|
22
22
|
},
|
|
23
23
|
{
|
|
@@ -29,7 +29,11 @@ export default {
|
|
|
29
29
|
id: "sku",
|
|
30
30
|
title: "SKU",
|
|
31
31
|
sortable: true,
|
|
32
|
-
width:
|
|
32
|
+
width: "100px",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "id",
|
|
36
|
+
title: "ID",
|
|
33
37
|
},
|
|
34
38
|
],
|
|
35
39
|
|