@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
@@ -1,124 +1,150 @@
1
1
  <template>
2
- <!-- Money cell -->
3
- <template v-if="cell.type === 'money'">
4
- <div
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="cell.format"
6
+ v-if="typeof Number(value) === 'number' && Number(value) > 0"
46
7
  class="tw-truncate"
8
+ :class="cell.class"
47
9
  >
48
- {{ moment(value).locale(locale).format(cell.format) }}
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
- {{ value instanceof Date && value.toLocaleDateString(locale) }}
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.type === 'time'"
54
+ v-if="cell.format"
59
55
  class="tw-truncate"
60
56
  >
61
- {{ value instanceof Date && value.toLocaleTimeString(locale) }}
57
+ {{ moment(value).locale(locale).format(cell.format) }}
62
58
  </div>
63
- <p
64
- v-if="cell.type === 'date-time'"
65
- class="tw-truncate"
66
- >
67
- {{ value instanceof Date && value.toLocaleString(locale) }}
68
- </p>
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-truncate"
106
+ v-else-if="cell.type === 'status-icon'"
107
+ class="tw-flex tw-justify-center"
108
+ :class="cell.class"
74
109
  >
75
- N/A
110
+ <VcStatusIcon :status="value as boolean"></VcStatusIcon>
76
111
  </div>
77
- </div>
78
112
 
79
- <!-- Image cell -->
80
- <template v-else-if="cell.type === 'image'">
81
- <VcImage
82
- :bordered="true"
83
- size="s"
84
- aspect="1x1"
85
- :src="value as string"
86
- background="contain"
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
- <!-- Number cell -->
104
- <div
105
- v-else-if="cell.type === 'number'"
106
- class="tw-text-right tw-truncate"
107
- >
108
- {{ Number(value).toFixed(0) }}
109
- </div>
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
- <!-- Link cell -->
112
- <template v-else-if="cell.type === 'link'">
113
- <VcLink class="tw-truncate">{{ value }}</VcLink>
114
- </template>
115
-
116
- <!-- Default cell -->
117
- <div
118
- v-else
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((): unknown => {
140
- return (props.cell.field || props.cell.id).split(".").reduce((p: { [x: string]: unknown }, c: string) => {
141
- if (p && Array.isArray(p) && p.length) {
142
- const val = p && p[0][c];
143
- return val !== undefined ? val : null;
144
- }
145
- const val = p && p[c];
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="items && items.length"
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 items"
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
- {{ item.title }}
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: 60,
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: 100,
32
+ width: "100px",
33
+ },
34
+ {
35
+ id: "id",
36
+ title: "ID",
33
37
  },
34
38
  ],
35
39