@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.
Files changed (181) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/core/plugins/moment/humanize.ts +6 -7
  3. package/core/types/index.ts +12 -1
  4. package/dist/core/plugins/moment/humanize.d.ts.map +1 -1
  5. package/dist/core/types/index.d.ts +1 -1
  6. package/dist/core/types/index.d.ts.map +1 -1
  7. package/dist/framework.js +30782 -20187
  8. package/dist/index.css +1 -1
  9. package/dist/shared/components/error-interceptor/interceptor.d.ts.map +1 -1
  10. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  11. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  12. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  13. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +4 -1
  14. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  15. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  17. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  19. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  20. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  21. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  22. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  23. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +417 -0
  24. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -0
  25. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts +357 -0
  26. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -0
  27. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts +398 -0
  28. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -0
  29. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts +392 -0
  30. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -0
  31. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +407 -0
  32. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -0
  33. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts +372 -0
  34. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts.map +1 -0
  35. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts +391 -0
  36. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts.map +1 -0
  37. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts +372 -0
  38. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts.map +1 -0
  39. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts +439 -0
  40. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts.map +1 -0
  41. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +460 -0
  42. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -0
  43. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts +459 -0
  44. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts.map +1 -0
  45. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts +359 -0
  46. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts.map +1 -0
  47. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts +507 -0
  48. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts.map +1 -0
  49. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts +392 -0
  50. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts.map +1 -0
  51. package/dist/shared/modules/dynamic/components/fields/storybook/SwitchField.stories.d.ts +14 -0
  52. package/dist/shared/modules/dynamic/components/fields/storybook/SwitchField.stories.d.ts.map +1 -0
  53. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +407 -0
  54. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -0
  55. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts +322 -0
  56. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts.map +1 -0
  57. package/dist/shared/modules/dynamic/components/fields/storybook/common/args.d.ts +113 -0
  58. package/dist/shared/modules/dynamic/components/fields/storybook/common/args.d.ts.map +1 -0
  59. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts +3 -0
  60. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts.map +1 -0
  61. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +235 -0
  62. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +1 -0
  63. package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceHighlighter.d.ts +4 -0
  64. package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceHighlighter.d.ts.map +1 -0
  65. package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceTransform.d.ts +3 -0
  66. package/dist/shared/modules/dynamic/components/fields/storybook/utils/sourceTransform.d.ts.map +1 -0
  67. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
  68. package/dist/shared/modules/dynamic/factories/types/index.d.ts +1 -0
  69. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  70. package/dist/shared/modules/dynamic/helpers/getters.d.ts.map +1 -1
  71. package/dist/shared/modules/dynamic/types/index.d.ts +88 -38
  72. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  73. package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +16 -16
  76. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
  77. package/dist/ui/components/atoms/vc-switch/index.d.ts +1 -39
  78. package/dist/ui/components/atoms/vc-switch/index.d.ts.map +1 -1
  79. package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts +30 -11
  80. package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts.map +1 -1
  81. package/dist/ui/components/atoms/vc-switch/vc-switch.vue.d.ts +22 -3
  82. package/dist/ui/components/atoms/vc-switch/vc-switch.vue.d.ts.map +1 -1
  83. package/dist/ui/components/atoms/vc-video/index.d.ts +1 -35
  84. package/dist/ui/components/atoms/vc-video/index.d.ts.map +1 -1
  85. package/dist/ui/components/atoms/vc-video/vc-video.stories.d.ts +5 -27
  86. package/dist/ui/components/atoms/vc-video/vc-video.stories.d.ts.map +1 -1
  87. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts +3 -18
  88. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  89. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts +16 -4
  90. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts.map +1 -1
  91. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -1
  92. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  93. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +30 -16
  94. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts.map +1 -1
  95. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +12 -12
  96. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
  97. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts +252 -42
  98. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts.map +1 -1
  99. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts +36 -6
  100. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts.map +1 -1
  101. package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts +96 -32
  102. package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts.map +1 -1
  103. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +3 -3
  104. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  105. package/dist/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +63 -63
  106. package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +6 -6
  107. package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
  108. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +1 -0
  109. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  110. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  111. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +8 -2
  112. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  113. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -1
  114. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  115. package/package.json +8 -4
  116. package/shared/components/error-interceptor/interceptor.ts +1 -1
  117. package/shared/modules/dynamic/components/fields/Button.ts +5 -2
  118. package/shared/modules/dynamic/components/fields/Card.ts +4 -4
  119. package/shared/modules/dynamic/components/fields/ContentField.ts +1 -0
  120. package/shared/modules/dynamic/components/fields/DynamicProperty.ts +5 -6
  121. package/shared/modules/dynamic/components/fields/EditorField.ts +5 -3
  122. package/shared/modules/dynamic/components/fields/Fieldset.ts +1 -1
  123. package/shared/modules/dynamic/components/fields/GalleryField.ts +6 -3
  124. package/shared/modules/dynamic/components/fields/ImageField.ts +0 -1
  125. package/shared/modules/dynamic/components/fields/InputCurrency.ts +1 -1
  126. package/shared/modules/dynamic/components/fields/InputField.ts +1 -0
  127. package/shared/modules/dynamic/components/fields/MultivalueField.ts +3 -2
  128. package/shared/modules/dynamic/components/fields/SelectField.ts +1 -0
  129. package/shared/modules/dynamic/components/fields/StatusField.ts +20 -10
  130. package/shared/modules/dynamic/components/fields/TextareaField.ts +1 -0
  131. package/shared/modules/dynamic/components/fields/VideoField.ts +0 -1
  132. package/shared/modules/dynamic/components/fields/storybook/Button.stories.ts +247 -0
  133. package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +166 -0
  134. package/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.ts +185 -0
  135. package/shared/modules/dynamic/components/fields/storybook/ContentField.stories.ts +245 -0
  136. package/shared/modules/dynamic/components/fields/storybook/EditorField.stories.ts +192 -0
  137. package/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.ts +409 -0
  138. package/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.ts +239 -0
  139. package/shared/modules/dynamic/components/fields/storybook/ImageField.stories.ts +186 -0
  140. package/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.ts +267 -0
  141. package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +298 -0
  142. package/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.ts +347 -0
  143. package/shared/modules/dynamic/components/fields/storybook/RatingField.stories.ts +131 -0
  144. package/shared/modules/dynamic/components/fields/storybook/SelectField.stories.ts +653 -0
  145. package/shared/modules/dynamic/components/fields/storybook/StatusField.stories.ts +202 -0
  146. package/shared/modules/dynamic/components/fields/storybook/SwitchField.stories.ts +178 -0
  147. package/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.ts +203 -0
  148. package/shared/modules/dynamic/components/fields/storybook/VideoField.stories.ts +92 -0
  149. package/shared/modules/dynamic/components/fields/storybook/common/args.ts +130 -0
  150. package/shared/modules/dynamic/components/fields/storybook/common/templates.ts +8 -0
  151. package/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.ts +54 -0
  152. package/shared/modules/dynamic/components/fields/storybook/utils/sourceHighlighter.ts +16 -0
  153. package/shared/modules/dynamic/components/fields/storybook/utils/sourceTransform.ts +41 -0
  154. package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +1 -0
  155. package/shared/modules/dynamic/factories/types/index.ts +2 -0
  156. package/shared/modules/dynamic/helpers/getters.ts +3 -0
  157. package/shared/modules/dynamic/helpers/nodeBuilder.ts +1 -1
  158. package/shared/modules/dynamic/helpers/setters.ts +1 -1
  159. package/shared/modules/dynamic/types/index.ts +93 -40
  160. package/shared/modules/dynamic/types/models.ts +8 -7
  161. package/shared/pages/LoginPage/components/login/Login.vue +1 -1
  162. package/ui/components/atoms/vc-card/vc-card.vue +12 -2
  163. package/ui/components/atoms/vc-switch/index.ts +1 -3
  164. package/ui/components/atoms/vc-switch/vc-switch.vue +10 -3
  165. package/ui/components/atoms/vc-video/index.ts +1 -3
  166. package/ui/components/atoms/vc-video/vc-video.stories.ts +1 -15
  167. package/ui/components/atoms/vc-video/vc-video.vue +4 -37
  168. package/ui/components/molecules/vc-editor/vc-editor.vue +47 -33
  169. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +2 -2
  170. package/ui/components/molecules/vc-input/vc-input.stories.ts +14 -0
  171. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +8 -0
  172. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +21 -9
  173. package/ui/components/molecules/vc-select/vc-select.stories.ts +74 -3
  174. package/ui/components/molecules/vc-select/vc-select.vue +35 -38
  175. package/ui/components/molecules/vc-textarea/vc-textarea.stories.ts +1 -1
  176. package/ui/components/molecules/vc-textarea/vc-textarea.vue +5 -15
  177. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +1 -1
  178. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +140 -108
  179. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +20 -6
  180. package/ui/components/organisms/vc-table/vc-table.stories.ts +6 -2
  181. 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(props.isCollapsed);
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">
@@ -1,3 +1 @@
1
- import _Switch from "./vc-switch.vue";
2
-
3
- export const VcSwitch = _Switch as typeof _Switch;
1
+ export { default as VcSwitch } from "./vc-switch.vue";
@@ -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,3 +1 @@
1
- import _Video from "./vc-video.vue";
2
-
3
- export const VcVideo = _Video as typeof _Video;
1
+ export { default as VcVideo } from "./vc-video.vue";
@@ -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: '<div style="width: 400px"><vc-video v-bind="args"></vc-video></div>',
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 :class="[`vc-video_auto`, 'tw-relative']">
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="300"
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
- withDefaults(defineProps<Props>(), {
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
- :key="`${disabled}`"
29
+ :id="id"
30
+ :key="`${id}-${disabled}`"
30
31
  ref="quillRef"
31
- v-model:content="content"
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
- @update:content="onInput"
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, Quill } from "@vueup/vue-quill";
56
+ import { QuillEditor } from "@vueup/vue-quill";
55
57
  import "@vueup/vue-quill/dist/vue-quill.snow.css";
56
- import { ref, unref, watch, onMounted, onUpdated, Ref } from "vue";
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 | number | Date;
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<Quill | null>(null);
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=/catalog/${props.assetsFolder}`, {
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
- watch(
135
- () => props.modelValue,
136
- (value) => {
137
- if (value === "") {
138
- quillRef.value?.setText(value);
139
- return;
140
- }
141
- content.value = unref(value);
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 && content.value) {
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 onInput() {
155
- if (isQuillEmpty(content.value)) {
156
- emit("update:modelValue", null);
157
- } else {
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
- function isQuillEmpty(value: string) {
163
- if (value.replace(/<(.|\n)*?>/g, "").trim().length === 0) {
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
- <span class="tw-truncate">{{
44
- type === "number"
45
- ? Number(item[props.optionLabel as keyof T]).toFixed(3)
46
- : item[props.optionLabel as keyof T]
47
- }}</span>
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="item"
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
- item: (args: { item: T }) => any;
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
- optionLabel: {
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
- optionValue: {
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({