@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.
Files changed (68) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/core/types/index.ts +12 -1
  3. package/dist/core/types/index.d.ts +1 -1
  4. package/dist/core/types/index.d.ts.map +1 -1
  5. package/dist/framework.js +30669 -20092
  6. package/dist/index.css +1 -1
  7. package/dist/shared/components/error-interceptor/interceptor.d.ts.map +1 -1
  8. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  9. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  10. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  11. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  12. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -1
  13. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -1
  14. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +9 -0
  15. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +12 -0
  17. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +12 -0
  19. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -1
  20. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  21. package/dist/shared/modules/dynamic/factories/types/index.d.ts +1 -0
  22. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  23. package/dist/shared/modules/dynamic/types/index.d.ts +15 -0
  24. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +16 -16
  27. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts +16 -4
  28. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts.map +1 -1
  29. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +2 -1
  30. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  31. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +30 -16
  32. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts.map +1 -1
  33. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +12 -12
  34. package/dist/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +63 -63
  35. package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +6 -6
  36. package/dist/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
  37. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +1 -0
  38. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  39. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  40. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +8 -2
  41. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  42. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -1
  43. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  44. package/package.json +8 -4
  45. package/shared/components/error-interceptor/interceptor.ts +1 -1
  46. package/shared/modules/dynamic/components/fields/EditorField.ts +1 -0
  47. package/shared/modules/dynamic/components/fields/InputField.ts +1 -0
  48. package/shared/modules/dynamic/components/fields/TextareaField.ts +1 -0
  49. package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +1 -2
  50. package/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.ts +0 -1
  51. package/shared/modules/dynamic/components/fields/storybook/ContentField.stories.ts +1 -2
  52. package/shared/modules/dynamic/components/fields/storybook/EditorField.stories.ts +10 -3
  53. package/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.ts +3 -3
  54. package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +12 -0
  55. package/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.ts +12 -0
  56. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +6 -3
  57. package/shared/modules/dynamic/factories/types/index.ts +2 -0
  58. package/shared/modules/dynamic/types/index.ts +15 -0
  59. package/shared/pages/LoginPage/components/login/Login.vue +1 -1
  60. package/ui/components/molecules/vc-editor/vc-editor.vue +24 -29
  61. package/ui/components/molecules/vc-input/vc-input.stories.ts +14 -0
  62. package/ui/components/molecules/vc-textarea/vc-textarea.stories.ts +1 -1
  63. package/ui/components/molecules/vc-textarea/vc-textarea.vue +4 -6
  64. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +1 -1
  65. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +140 -108
  66. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +20 -6
  67. package/ui/components/organisms/vc-table/vc-table.stories.ts +6 -2
  68. package/ui/components/organisms/vc-table/vc-table.vue +176 -125
@@ -25,6 +25,7 @@ export default {
25
25
  type: props.element.variant,
26
26
  currentLanguage: props.currentLocale,
27
27
  clearable: props.element.clearable || false,
28
+ maxlength: props.element.maxlength,
28
29
  },
29
30
  unrefNested(props.baseProps),
30
31
  {
@@ -16,6 +16,7 @@ export default {
16
16
  {
17
17
  currentLanguage: props.currentLocale,
18
18
  clearable: props.element.clearable || false,
19
+ maxlength: props.element.maxlength,
19
20
  },
20
21
  unrefNested(props.baseProps),
21
22
  {
@@ -1,7 +1,6 @@
1
1
  import { template, templateWithVisibilityToggle } from "./common/templates";
2
2
  import { Meta, StoryFn } from "@storybook/vue3";
3
- import Card from "../Card";
4
- import { computed, reactive, ref } from "vue";
3
+ import { reactive, ref } from "vue";
5
4
  import page from "./pages/DynamicRender";
6
5
  import * as _ from "lodash-es";
7
6
  import { SchemaBaseArgTypes } from "./common/args";
@@ -1,5 +1,4 @@
1
1
  import { Meta, StoryFn } from "@storybook/vue3";
2
- import Checkbox from "../Checkbox";
3
2
  import { computed, reactive, ref } from "vue";
4
3
  import page from "./pages/DynamicRender";
5
4
  import { template, templateWithVisibilityToggle } from "./common/templates";
@@ -1,6 +1,5 @@
1
1
  import { Meta, StoryFn } from "@storybook/vue3";
2
- import ContentField from "../ContentField";
3
- import { computed, reactive, ref } from "vue";
2
+ import { reactive, ref } from "vue";
4
3
  import page from "./pages/DynamicRender";
5
4
  import { template, templateWithVisibilityToggle } from "./common/templates";
6
5
  import * as _ from "lodash-es";
@@ -1,9 +1,7 @@
1
1
  import { Meta, StoryFn } from "@storybook/vue3";
2
- import EditorField from "../EditorField";
3
2
  import { template, templateWithVisibilityToggle } from "./common/templates";
4
3
  import page from "./pages/DynamicRender";
5
- import { nextTick, reactive, ref } from "vue";
6
- import * as _ from "lodash-es";
4
+ import { reactive, ref } from "vue";
7
5
  import { SchemaBaseArgTypes } from "./common/args";
8
6
  import { EditorSchema } from "../../..";
9
7
 
@@ -44,6 +42,15 @@ export default {
44
42
  },
45
43
  },
46
44
  },
45
+ maxlength: {
46
+ description: "Maximum length of the editor content.",
47
+ control: "number",
48
+ table: {
49
+ type: {
50
+ summary: "number",
51
+ },
52
+ },
53
+ },
47
54
  },
48
55
  parameters: {
49
56
  docs: {
@@ -73,13 +73,13 @@ export default {
73
73
  description: `Array of numbers that define the aspect ratio of each column.
74
74
  Example - If you have two columns - set to [1, 1] to make all columns equal width.
75
75
  Uses CSS flex-grow property to set the width of each column.`,
76
- control: "text",
76
+ control: "object",
77
77
  table: {
78
78
  type: {
79
- summary: "string",
79
+ summary: "array",
80
80
  },
81
81
  defaultValue: {
82
- summary: "1:1",
82
+ summary: "[1, 1]",
83
83
  },
84
84
  },
85
85
  },
@@ -87,6 +87,18 @@ export default {
87
87
  },
88
88
  },
89
89
  },
90
+ maxlength: {
91
+ description: "Maximum number of characters that can be entered.",
92
+ control: "number",
93
+ table: {
94
+ type: {
95
+ summary: "number",
96
+ },
97
+ defaultValue: {
98
+ summary: 1024,
99
+ },
100
+ },
101
+ },
90
102
  },
91
103
  parameters: {
92
104
  docs: {
@@ -38,6 +38,18 @@ export default {
38
38
  },
39
39
  },
40
40
  },
41
+ maxlength: {
42
+ description: "Maximum number of characters that can be entered.",
43
+ control: "number",
44
+ table: {
45
+ type: {
46
+ summary: "number",
47
+ },
48
+ defaultValue: {
49
+ summary: "1024",
50
+ },
51
+ },
52
+ },
41
53
  },
42
54
  parameters: {
43
55
  docs: {
@@ -15,6 +15,7 @@ import {
15
15
  readonly,
16
16
  toValue,
17
17
  Ref,
18
+ watchPostEffect,
18
19
  } from "vue";
19
20
  import * as _ from "lodash-es";
20
21
  import { Checkbox, InputField } from "../../components/factories";
@@ -71,7 +72,9 @@ export default <Query>(args: {
71
72
  return filterKeys.length === 0 || filterKeys.every((key) => !filterObj[key]);
72
73
  });
73
74
 
74
- onMounted(() => createFilterControls());
75
+ watchPostEffect(() => {
76
+ createFilterControls();
77
+ });
75
78
 
76
79
  function isItemSelected(value: string, field: string) {
77
80
  const item = filter.value[field];
@@ -195,7 +198,7 @@ export default <Query>(args: {
195
198
  () => [
196
199
  h(VcRow, () =>
197
200
  Object.values(controls.value).map(({ title, fields }) =>
198
- h(VcCol, { class: "tw-p-2" }, () => [
201
+ h(VcCol, { class: "tw-p-2 !tw-flex-auto" }, () => [
199
202
  h(
200
203
  "div",
201
204
  { class: "tw-mb-4 tw-text-[#a1c0d4] tw-font-bold tw-text-[17px]" },
@@ -214,7 +217,7 @@ export default <Query>(args: {
214
217
  ),
215
218
  ),
216
219
  h(VcRow, () =>
217
- h(VcCol, { class: "tw-p-2" }, () =>
220
+ h(VcCol, { class: "tw-p-2 !tw-flex-auto" }, () =>
218
221
  h("div", { class: "tw-flex tw-justify-end" }, [
219
222
  h(
220
223
  VcButton,
@@ -80,6 +80,8 @@ export interface ListBaseBladeScope<Item = Record<string, any>, Query = Record<s
80
80
  breadcrumbs?: ComputedRef<Breadcrumbs[]>;
81
81
  }
82
82
 
83
+ export type TOpenBladeArgs = Omit<Parameters<ReturnType<typeof useBladeNavigation>["openBlade"]>["0"], "blade">;
84
+
83
85
  export interface DetailsBaseBladeScope extends BaseBladeScope {
84
86
  disabled?: ComputedRef<boolean | undefined>;
85
87
  multilanguage?: {
@@ -387,6 +387,11 @@ export interface TextareaSchema extends SchemaBase {
387
387
  * @type {boolean}
388
388
  */
389
389
  clearable?: boolean;
390
+ /**
391
+ * Maximum number of characters that can be entered.
392
+ * @type {number}
393
+ */
394
+ maxlength?: number;
390
395
  }
391
396
 
392
397
  /**
@@ -429,6 +434,11 @@ export interface InputSchema extends SchemaBase {
429
434
  * @type {ControlSchema}
430
435
  */
431
436
  prependInner?: ControlSchema;
437
+ /**
438
+ * Maximum number of characters that can be entered.
439
+ * @type {number}
440
+ */
441
+ maxlength?: number;
432
442
  }
433
443
 
434
444
  /**
@@ -628,6 +638,11 @@ export interface EditorSchema extends SchemaBase {
628
638
  * @type {string}
629
639
  */
630
640
  assetsFolder: string;
641
+ /**
642
+ * Maximum length of the editor content.
643
+ * @type {number}
644
+ */
645
+ maxlength?: number;
631
646
  }
632
647
 
633
648
  /**
@@ -197,7 +197,7 @@ const props = defineProps<Props>();
197
197
 
198
198
  const router = useRouter();
199
199
 
200
- const { setFieldError, resetForm, setErrors, validateField } = useForm({ validateOnMount: false });
200
+ const { validateField } = useForm({ validateOnMount: false });
201
201
  const { uiSettings, loading: customizationLoading } = useSettings();
202
202
  const { t } = useI18n({ useScope: "global" });
203
203
  let useLogin;
@@ -29,7 +29,7 @@
29
29
  :id="id"
30
30
  :key="`${id}-${disabled}`"
31
31
  ref="quillRef"
32
- :content="content"
32
+ :content="modelValue"
33
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]"
34
34
  :class="{ 'tw-bg-[#fafafa] tw-text-[#424242] tw-cursor-default': disabled }"
35
35
  theme="snow"
@@ -39,7 +39,7 @@
39
39
  :read-only="disabled"
40
40
  :placeholder="placeholder"
41
41
  :options="options"
42
- @update:content="onInput"
42
+ @ready="initializeQuill"
43
43
  />
44
44
  <slot
45
45
  v-if="errorMessage"
@@ -53,15 +53,15 @@
53
53
  </template>
54
54
  <!-- eslint-disable @typescript-eslint/no-explicit-any -->
55
55
  <script lang="ts" setup>
56
- import { QuillEditor, Quill } from "@vueup/vue-quill";
56
+ import { QuillEditor } from "@vueup/vue-quill";
57
57
  import "@vueup/vue-quill/dist/vue-quill.snow.css";
58
- import { ref, unref, watch, onMounted, onUpdated, getCurrentInstance } from "vue";
58
+ import { ref, unref, onMounted, onUpdated, getCurrentInstance, Ref } from "vue";
59
59
  import ImageUploader from "quill-image-uploader";
60
60
  import { VcLabel, VcHint } from "../..";
61
61
 
62
62
  export interface Props {
63
63
  placeholder?: string;
64
- modelValue?: string | number | Date;
64
+ modelValue?: string;
65
65
  required?: boolean;
66
66
  disabled?: boolean;
67
67
  label?: string;
@@ -70,6 +70,7 @@ export interface Props {
70
70
  assetsFolder: string;
71
71
  multilanguage?: boolean;
72
72
  currentLanguage?: string;
73
+ maxlength?: number;
73
74
  }
74
75
 
75
76
  export interface Emits {
@@ -86,8 +87,9 @@ defineSlots<{
86
87
  error?: (props: any) => any;
87
88
  }>();
88
89
 
89
- const content = ref();
90
- const quillRef = ref<Quill | null>(null);
90
+ // const content = ref();
91
+ const quillRef = ref(null) as Ref<typeof QuillEditor | null>;
92
+ const quill = ref();
91
93
 
92
94
  const toolbar = {
93
95
  container: [
@@ -139,39 +141,32 @@ onUpdated(() => {
139
141
  removeBlankClass();
140
142
  });
141
143
 
142
- watch(
143
- () => props.modelValue,
144
- (value) => {
145
- if (value === "") {
146
- quillRef.value?.setText(value);
147
- return;
148
- }
149
- content.value = unref(value);
150
- },
151
- { immediate: true },
152
- );
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
+ }
153
152
 
154
153
  function removeBlankClass() {
155
154
  // fixes quill editor placeholder visibility issue when content is not empty
156
155
  const editor = document.getElementById(id)?.querySelector(".ql-editor.ql-blank");
157
- if (editor && content.value) {
156
+ if (editor && props.modelValue) {
158
157
  editor.classList.remove("ql-blank");
159
158
  }
160
159
  }
161
160
 
162
- function onInput(value: string) {
163
- if (isQuillEmpty(value)) {
164
- emit("update:modelValue", null);
165
- } else {
166
- emit("update:modelValue", 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);
167
165
  }
168
- }
169
166
 
170
- function isQuillEmpty(value: string) {
171
- if (value.replace(/<(.|\n)*?>/g, "").trim().length === 0) {
172
- return true;
167
+ if (quill.value.getText().trim() !== props.modelValue?.trim()) {
168
+ emit("update:modelValue", quill.value.root.innerHTML);
173
169
  }
174
- return false;
175
170
  }
176
171
  </script>
177
172
 
@@ -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) => ({
@@ -48,6 +48,6 @@ Tooltip.args = {
48
48
  export const MaximumCharacters = Primary.bind({});
49
49
  MaximumCharacters.args = {
50
50
  label: "Textarea Label",
51
- maxchars: "10",
51
+ maxlength: "10",
52
52
  modelValue: "1234567890",
53
53
  };
@@ -30,7 +30,7 @@
30
30
  :placeholder="placeholder"
31
31
  :value="modelValue"
32
32
  :disabled="disabled"
33
- :maxlength="maxchars"
33
+ :maxlength="maxlength"
34
34
  @input="onInput"
35
35
  ></textarea>
36
36
  </div>
@@ -47,7 +47,6 @@
47
47
  </template>
48
48
 
49
49
  <script lang="ts" setup>
50
- import { watch } from "vue";
51
50
  import { VcHint, VcLabel } from "./../../";
52
51
 
53
52
  export interface Props {
@@ -58,7 +57,7 @@ export interface Props {
58
57
  label?: string;
59
58
  tooltip?: string;
60
59
  name?: string;
61
- maxchars?: string;
60
+ maxlength?: string;
62
61
  errorMessage?: string;
63
62
  multilanguage?: boolean;
64
63
  currentLanguage?: string;
@@ -69,13 +68,12 @@ export interface Emits {
69
68
  }
70
69
 
71
70
  defineSlots<{
72
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
- error: (props: any) => any;
71
+ error: void;
74
72
  }>();
75
73
 
76
74
  withDefaults(defineProps<Props>(), {
77
75
  name: "Field",
78
- maxchars: "1024",
76
+ maxlength: "1024",
79
77
  });
80
78
 
81
79
  const emit = defineEmits<Emits>();
@@ -14,7 +14,7 @@
14
14
 
15
15
  <div class="tw-overflow-hidden tw-grow tw-basis-0">
16
16
  <div
17
- class="tw-text-[color:var(--blade-header-title-color)] tw-text-lg tw-truncate"
17
+ class="tw-text-[color:var(--blade-header-title-color)] tw-text-lg/[23px] tw-truncate"
18
18
  :class="{
19
19
  '!tw-text-[length:var(--blade-header-title-font-size)] tw-font-medium': !subtitle,
20
20
  }"