@ramathibodi/nuxt-commons 0.1.74 → 0.1.75

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 (96) hide show
  1. package/README.md +115 -115
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/components/Alert.vue +58 -58
  4. package/dist/runtime/components/BarcodeReader.vue +130 -130
  5. package/dist/runtime/components/ExportCSV.vue +110 -110
  6. package/dist/runtime/components/FileBtn.vue +79 -79
  7. package/dist/runtime/components/ImportCSV.vue +151 -151
  8. package/dist/runtime/components/MrzReader.vue +168 -168
  9. package/dist/runtime/components/SplitterPanel.vue +67 -67
  10. package/dist/runtime/components/TabsGroup.vue +39 -39
  11. package/dist/runtime/components/TextBarcode.vue +66 -66
  12. package/dist/runtime/components/device/IdCardButton.vue +95 -95
  13. package/dist/runtime/components/device/IdCardWebSocket.vue +207 -207
  14. package/dist/runtime/components/device/Scanner.vue +350 -350
  15. package/dist/runtime/components/dialog/Confirm.vue +112 -112
  16. package/dist/runtime/components/dialog/Host.vue +88 -88
  17. package/dist/runtime/components/dialog/Index.vue +84 -84
  18. package/dist/runtime/components/dialog/Loading.vue +51 -51
  19. package/dist/runtime/components/dialog/default/Confirm.vue +112 -112
  20. package/dist/runtime/components/dialog/default/Loading.vue +60 -60
  21. package/dist/runtime/components/dialog/default/Notify.vue +82 -82
  22. package/dist/runtime/components/dialog/default/Printing.vue +46 -46
  23. package/dist/runtime/components/dialog/default/VerifyUser.vue +144 -144
  24. package/dist/runtime/components/document/Form.vue +50 -50
  25. package/dist/runtime/components/document/TemplateBuilder.vue +536 -536
  26. package/dist/runtime/components/form/ActionPad.vue +156 -156
  27. package/dist/runtime/components/form/Birthdate.vue +116 -116
  28. package/dist/runtime/components/form/CheckboxGroup.vue +99 -99
  29. package/dist/runtime/components/form/CodeEditor.vue +45 -45
  30. package/dist/runtime/components/form/Date.vue +270 -270
  31. package/dist/runtime/components/form/DateTime.vue +220 -220
  32. package/dist/runtime/components/form/Dialog.vue +178 -178
  33. package/dist/runtime/components/form/EditPad.vue +157 -157
  34. package/dist/runtime/components/form/File.vue +295 -295
  35. package/dist/runtime/components/form/Hidden.vue +44 -44
  36. package/dist/runtime/components/form/Iterator.vue +538 -538
  37. package/dist/runtime/components/form/Login.vue +143 -143
  38. package/dist/runtime/components/form/Pad.vue +399 -399
  39. package/dist/runtime/components/form/SignPad.vue +226 -226
  40. package/dist/runtime/components/form/System.vue +34 -34
  41. package/dist/runtime/components/form/Table.vue +391 -391
  42. package/dist/runtime/components/form/TableData.vue +236 -236
  43. package/dist/runtime/components/form/Time.vue +177 -177
  44. package/dist/runtime/components/form/images/Capture.vue +245 -245
  45. package/dist/runtime/components/form/images/Edit.vue +133 -133
  46. package/dist/runtime/components/form/images/Field.vue +331 -331
  47. package/dist/runtime/components/form/images/Pad.vue +54 -54
  48. package/dist/runtime/components/label/Date.vue +37 -37
  49. package/dist/runtime/components/label/DateAgo.vue +102 -102
  50. package/dist/runtime/components/label/DateCount.vue +152 -152
  51. package/dist/runtime/components/label/Field.vue +111 -111
  52. package/dist/runtime/components/label/FormatMoney.vue +37 -37
  53. package/dist/runtime/components/label/Mask.vue +46 -46
  54. package/dist/runtime/components/label/Object.vue +21 -21
  55. package/dist/runtime/components/master/Autocomplete.vue +89 -89
  56. package/dist/runtime/components/master/Combobox.vue +88 -88
  57. package/dist/runtime/components/master/RadioGroup.vue +90 -90
  58. package/dist/runtime/components/master/Select.vue +70 -70
  59. package/dist/runtime/components/master/label.vue +55 -55
  60. package/dist/runtime/components/model/Autocomplete.vue +91 -91
  61. package/dist/runtime/components/model/Combobox.vue +90 -90
  62. package/dist/runtime/components/model/Pad.vue +114 -114
  63. package/dist/runtime/components/model/Select.vue +78 -84
  64. package/dist/runtime/components/model/Table.vue +370 -370
  65. package/dist/runtime/components/model/iterator.vue +497 -497
  66. package/dist/runtime/components/model/label.vue +58 -58
  67. package/dist/runtime/components/pdf/Print.vue +75 -75
  68. package/dist/runtime/components/pdf/View.vue +146 -146
  69. package/dist/runtime/composables/dialog.d.ts +1 -1
  70. package/dist/runtime/composables/graphql.d.ts +1 -1
  71. package/dist/runtime/composables/graphqlModel.d.ts +9 -9
  72. package/dist/runtime/composables/graphqlModelItem.d.ts +7 -7
  73. package/dist/runtime/composables/graphqlModelOperation.d.ts +6 -6
  74. package/dist/runtime/composables/userPermission.d.ts +1 -1
  75. package/dist/runtime/labs/Calendar.vue +99 -99
  76. package/dist/runtime/labs/form/EditMobile.vue +152 -152
  77. package/dist/runtime/labs/form/TextFieldMask.vue +43 -43
  78. package/dist/runtime/plugins/clientConfig.d.ts +1 -1
  79. package/dist/runtime/plugins/default.d.ts +1 -1
  80. package/dist/runtime/plugins/dialogManager.d.ts +1 -1
  81. package/dist/runtime/plugins/permission.d.ts +1 -1
  82. package/dist/runtime/types/alert.d.ts +11 -11
  83. package/dist/runtime/types/clientConfig.d.ts +13 -13
  84. package/dist/runtime/types/dialogManager.d.ts +35 -35
  85. package/dist/runtime/types/formDialog.d.ts +5 -5
  86. package/dist/runtime/types/graphqlOperation.d.ts +23 -23
  87. package/dist/runtime/types/menu.d.ts +31 -31
  88. package/dist/runtime/types/modules.d.ts +7 -7
  89. package/dist/runtime/types/permission.d.ts +13 -13
  90. package/package.json +131 -131
  91. package/scripts/enrich-vue-docs-from-ai.mjs +197 -197
  92. package/scripts/generate-ai-summary.mjs +321 -321
  93. package/scripts/generate-composables-md.mjs +129 -129
  94. package/scripts/postInstall.cjs +70 -70
  95. package/templates/.codegen/codegen.ts +32 -32
  96. package/templates/.codegen/plugin-schema-object.js +161 -161
@@ -1,152 +1,152 @@
1
- <script setup lang="ts">
2
- /**
3
- * LabelDateCount renders read-only label output with formatting logic for display-oriented model values.
4
- * This doc block is consumed by vue-docgen for generated API documentation.
5
- */
6
- import { DateTime } from "luxon";
7
- import { computed } from "vue";
8
-
9
- type Unit = 'years' | 'months' | 'days' | 'hours' | 'minutes' | 'seconds';
10
- type Locale = 'th' | 'en' | 'en-US' | 'th-TH';
11
-
12
- interface Props {
13
- modelValue: DateTime; // Bound value for v-model synchronization with the parent component.
14
- endDate?: DateTime; // date value used by component logic and display
15
- locale?: Locale; // Locale used for date/time formatting and localized labels.
16
- showSuffix?: boolean; // Appends relative-time suffix text like "ago" or "in".
17
- units?: Unit[]; // Time units allowed in relative date calculations.
18
- zeroBase?: boolean; // true = start at 0, false = start at 1 (inclusive)
19
- }
20
-
21
- /**
22
- * Public props accepted by LabelDateCount.
23
- * Document each prop field with intent, defaults, and side effects for clear generated docs.
24
- */
25
- const props = withDefaults(defineProps<Props>(), {
26
- locale: 'th',
27
- showSuffix: true,
28
- zeroBase: true,
29
- });
30
-
31
- // Fallback map: map complex locale (e.g., en-US) to base (e.g., en)
32
- const normalizeLocale = (locale: Locale): 'en' | 'th' => {
33
- if (locale.startsWith('en')) return 'en';
34
- if (locale.startsWith('th')) return 'th';
35
- return 'th'; // default fallback
36
- };
37
-
38
- const labelsEnPlural: Record<Unit, string> = {
39
- years: 'years',
40
- months: 'months',
41
- days: 'days',
42
- hours: 'hours',
43
- minutes: 'minutes',
44
- seconds: 'seconds',
45
- };
46
- const labelsEnSingular: Record<Unit, string> = {
47
- years: 'year',
48
- months: 'month',
49
- days: 'day',
50
- hours: 'hour',
51
- minutes: 'minute',
52
- seconds: 'second',
53
- };
54
-
55
- const localizedLabels: Record<'en' | 'th', Record<Unit, string>> = {
56
- en: labelsEnPlural, // จะสลับเป็น singular ตามค่าจริงตอน render
57
- th: {
58
- years: 'ปี',
59
- months: 'เดือน',
60
- days: 'วัน',
61
- hours: 'ชั่วโมง',
62
- minutes: 'นาที',
63
- seconds: 'วินาที',
64
- },
65
- };
66
-
67
- const localizedSuffix: Record<'en' | 'th', string> = {
68
- en: 'ago',
69
- th: 'ที่ผ่านมา',
70
- };
71
-
72
- const outputText = computed(() => {
73
- const base = props.endDate ?? DateTime.now(); // ใช้ endDate ถ้ามี ไม่งั้น now
74
- const baseLocale = normalizeLocale(props.locale);
75
-
76
- const units: Unit[] = props.units?.length
77
- ? props.units
78
- : ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];
79
-
80
- const diffObj = base.diff(props.modelValue, units).toObject();
81
-
82
- // helper: คืน label ตาม singular/plural (เฉพาะ en)
83
- const labelFor = (unit: Unit, value: number) => {
84
- if (baseLocale === 'en') {
85
- return value === 1 ? labelsEnSingular[unit] : labelsEnPlural[unit];
86
- }
87
- return localizedLabels[baseLocale][unit];
88
- };
89
-
90
- // ---------- โหมด single unit ----------
91
- if (!props.units) {
92
- const foundUnit = units.find((unit) => (diffObj[unit] ?? 0) >= 1);
93
- if (foundUnit) {
94
- const raw = Math.floor(diffObj[foundUnit] ?? 0); // >= 1
95
- const value = props.zeroBase ? raw : raw + 1; // inclusive (+1)
96
- const label = labelFor(foundUnit, value);
97
- const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
98
- return `${value} ${label}${suffix ? ` ${suffix}` : ''}`;
99
- }
100
-
101
- // ถ้าไม่มีหน่วยใด >= 1 ให้ใช้หน่วยเล็กสุด
102
- const lastUnit = units.at(-1)!;
103
- const raw = Math.max(0, Math.floor(diffObj[lastUnit] ?? 0));
104
- const value = props.zeroBase ? raw : 1; // inclusive: อย่างน้อย 1
105
- const label = labelFor(lastUnit, value);
106
- const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
107
- return `${value} ${label}${suffix ? ` ${suffix}` : ''}`;
108
- }
109
-
110
- // ---------- โหมด multi-unit ----------
111
- // เก็บค่าแบบตัวเลขก่อน แล้วค่อยเรนเดอร์
112
- const values = units.map((unit) => ({
113
- unit,
114
- raw: Math.max(0, Math.floor(diffObj[unit] ?? 0)),
115
- }));
116
-
117
- // เลือกหน่วยที่เล็กที่สุด
118
- const smallest = values[values.length - 1];
119
-
120
- // ถ้ามีค่าอย่างน้อยหนึ่งหน่วย > 0 และเป็น inclusive (zeroBase=false) => +1 ที่หน่วยเล็กสุด
121
- const anyPositive = values.some((v) => v.raw > 0);
122
- const adjusted = values.map((v, idx) => {
123
- if (!props.zeroBase && anyPositive && idx === values.length - 1) {
124
- return { ...v, raw: v.raw + 1 };
125
- }
126
- return v;
127
- });
128
-
129
- // สร้างข้อความจากหน่วยที่มีค่า > 0
130
- const parts = adjusted
131
- .filter((v) => v.raw > 0)
132
- .map((v) => `${v.raw} ${labelFor(v.unit, v.raw)}`);
133
-
134
- // หากทั้งหมดเป็น 0:
135
- if (parts.length === 0) {
136
- const minValue = props.zeroBase ? 0 : 1;
137
- const label = labelFor(smallest.unit, minValue);
138
- const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
139
- return `${minValue} ${label}${suffix ? ` ${suffix}` : ''}`;
140
- }
141
-
142
- const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
143
- return `${parts.join(' ')}${suffix ? ` ${suffix}` : ''}`;
144
- });
145
- </script>
146
-
147
- <template>
148
- <span>
149
- <i v-if="props.zeroBase" class="mdi mdi-clock-time-twelve-outline"></i>
150
- <span v-if="props.zeroBase">&nbsp;</span>{{ outputText }}
151
- </span>
152
- </template>
1
+ <script setup lang="ts">
2
+ /**
3
+ * LabelDateCount renders read-only label output with formatting logic for display-oriented model values.
4
+ * This doc block is consumed by vue-docgen for generated API documentation.
5
+ */
6
+ import { DateTime } from "luxon";
7
+ import { computed } from "vue";
8
+
9
+ type Unit = 'years' | 'months' | 'days' | 'hours' | 'minutes' | 'seconds';
10
+ type Locale = 'th' | 'en' | 'en-US' | 'th-TH';
11
+
12
+ interface Props {
13
+ modelValue: DateTime; // Bound value for v-model synchronization with the parent component.
14
+ endDate?: DateTime; // date value used by component logic and display
15
+ locale?: Locale; // Locale used for date/time formatting and localized labels.
16
+ showSuffix?: boolean; // Appends relative-time suffix text like "ago" or "in".
17
+ units?: Unit[]; // Time units allowed in relative date calculations.
18
+ zeroBase?: boolean; // true = start at 0, false = start at 1 (inclusive)
19
+ }
20
+
21
+ /**
22
+ * Public props accepted by LabelDateCount.
23
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
24
+ */
25
+ const props = withDefaults(defineProps<Props>(), {
26
+ locale: 'th',
27
+ showSuffix: true,
28
+ zeroBase: true,
29
+ });
30
+
31
+ // Fallback map: map complex locale (e.g., en-US) to base (e.g., en)
32
+ const normalizeLocale = (locale: Locale): 'en' | 'th' => {
33
+ if (locale.startsWith('en')) return 'en';
34
+ if (locale.startsWith('th')) return 'th';
35
+ return 'th'; // default fallback
36
+ };
37
+
38
+ const labelsEnPlural: Record<Unit, string> = {
39
+ years: 'years',
40
+ months: 'months',
41
+ days: 'days',
42
+ hours: 'hours',
43
+ minutes: 'minutes',
44
+ seconds: 'seconds',
45
+ };
46
+ const labelsEnSingular: Record<Unit, string> = {
47
+ years: 'year',
48
+ months: 'month',
49
+ days: 'day',
50
+ hours: 'hour',
51
+ minutes: 'minute',
52
+ seconds: 'second',
53
+ };
54
+
55
+ const localizedLabels: Record<'en' | 'th', Record<Unit, string>> = {
56
+ en: labelsEnPlural, // จะสลับเป็น singular ตามค่าจริงตอน render
57
+ th: {
58
+ years: 'ปี',
59
+ months: 'เดือน',
60
+ days: 'วัน',
61
+ hours: 'ชั่วโมง',
62
+ minutes: 'นาที',
63
+ seconds: 'วินาที',
64
+ },
65
+ };
66
+
67
+ const localizedSuffix: Record<'en' | 'th', string> = {
68
+ en: 'ago',
69
+ th: 'ที่ผ่านมา',
70
+ };
71
+
72
+ const outputText = computed(() => {
73
+ const base = props.endDate ?? DateTime.now(); // ใช้ endDate ถ้ามี ไม่งั้น now
74
+ const baseLocale = normalizeLocale(props.locale);
75
+
76
+ const units: Unit[] = props.units?.length
77
+ ? props.units
78
+ : ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];
79
+
80
+ const diffObj = base.diff(props.modelValue, units).toObject();
81
+
82
+ // helper: คืน label ตาม singular/plural (เฉพาะ en)
83
+ const labelFor = (unit: Unit, value: number) => {
84
+ if (baseLocale === 'en') {
85
+ return value === 1 ? labelsEnSingular[unit] : labelsEnPlural[unit];
86
+ }
87
+ return localizedLabels[baseLocale][unit];
88
+ };
89
+
90
+ // ---------- โหมด single unit ----------
91
+ if (!props.units) {
92
+ const foundUnit = units.find((unit) => (diffObj[unit] ?? 0) >= 1);
93
+ if (foundUnit) {
94
+ const raw = Math.floor(diffObj[foundUnit] ?? 0); // >= 1
95
+ const value = props.zeroBase ? raw : raw + 1; // inclusive (+1)
96
+ const label = labelFor(foundUnit, value);
97
+ const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
98
+ return `${value} ${label}${suffix ? ` ${suffix}` : ''}`;
99
+ }
100
+
101
+ // ถ้าไม่มีหน่วยใด >= 1 ให้ใช้หน่วยเล็กสุด
102
+ const lastUnit = units.at(-1)!;
103
+ const raw = Math.max(0, Math.floor(diffObj[lastUnit] ?? 0));
104
+ const value = props.zeroBase ? raw : 1; // inclusive: อย่างน้อย 1
105
+ const label = labelFor(lastUnit, value);
106
+ const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
107
+ return `${value} ${label}${suffix ? ` ${suffix}` : ''}`;
108
+ }
109
+
110
+ // ---------- โหมด multi-unit ----------
111
+ // เก็บค่าแบบตัวเลขก่อน แล้วค่อยเรนเดอร์
112
+ const values = units.map((unit) => ({
113
+ unit,
114
+ raw: Math.max(0, Math.floor(diffObj[unit] ?? 0)),
115
+ }));
116
+
117
+ // เลือกหน่วยที่เล็กที่สุด
118
+ const smallest = values[values.length - 1];
119
+
120
+ // ถ้ามีค่าอย่างน้อยหนึ่งหน่วย > 0 และเป็น inclusive (zeroBase=false) => +1 ที่หน่วยเล็กสุด
121
+ const anyPositive = values.some((v) => v.raw > 0);
122
+ const adjusted = values.map((v, idx) => {
123
+ if (!props.zeroBase && anyPositive && idx === values.length - 1) {
124
+ return { ...v, raw: v.raw + 1 };
125
+ }
126
+ return v;
127
+ });
128
+
129
+ // สร้างข้อความจากหน่วยที่มีค่า > 0
130
+ const parts = adjusted
131
+ .filter((v) => v.raw > 0)
132
+ .map((v) => `${v.raw} ${labelFor(v.unit, v.raw)}`);
133
+
134
+ // หากทั้งหมดเป็น 0:
135
+ if (parts.length === 0) {
136
+ const minValue = props.zeroBase ? 0 : 1;
137
+ const label = labelFor(smallest.unit, minValue);
138
+ const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
139
+ return `${minValue} ${label}${suffix ? ` ${suffix}` : ''}`;
140
+ }
141
+
142
+ const suffix = props.showSuffix ? localizedSuffix[baseLocale] : '';
143
+ return `${parts.join(' ')}${suffix ? ` ${suffix}` : ''}`;
144
+ });
145
+ </script>
146
+
147
+ <template>
148
+ <span>
149
+ <i v-if="props.zeroBase" class="mdi mdi-clock-time-twelve-outline"></i>
150
+ <span v-if="props.zeroBase">&nbsp;</span>{{ outputText }}
151
+ </span>
152
+ </template>
@@ -1,113 +1,113 @@
1
- <script lang="ts" setup>
2
- /**
3
- * LabelField renders read-only label output with formatting logic for display-oriented model values.
4
- * This doc block is consumed by vue-docgen for generated API documentation.
5
- */
6
- import { computed, ref } from 'vue';
7
-
8
- interface Props {
9
- label: string; // UI label displayed to end users
10
- value?: string | null; // Raw value rendered by this label field component.
11
- horizontal?: boolean; // Renders label and value in a horizontal layout.
12
- size?: 'large' | 'medium'; // Visual size preset controlling text and spacing.
13
- truncate?: boolean; // Truncates long text and keeps full value in tooltip/title.
14
- notFoundText?: string // Text shown when the resolved value or label is unavailable.
15
- }
16
-
17
- /**
18
- * Public props accepted by LabelField.
19
- * Document each prop field with intent, defaults, and side effects for clear generated docs.
20
- */
21
- const props = withDefaults(defineProps<Props>(), {
22
- label: '',
23
- value: '',
24
- horizontal: false,
25
- size: 'large',
26
- truncate: false,
27
- notFoundText : '-'
28
- });
29
-
30
- const valueText = ref<HTMLElement | null>(null);
31
- const isTooltip = ref(false);
32
-
33
- const calSize = computed(() => (props.size === 'medium' ? 'text-subtitle-1' : 'text-h6'));
34
- const calTruncate = computed(() => (props.truncate ? 'text-truncate' : ''));
35
-
36
- const setTruncate = (event: Event) => {
37
- const target = event.target as HTMLElement;
38
- isTooltip.value = target.offsetWidth < target.scrollWidth;
39
- };
40
- const valueData = computed(()=>{
41
- return (props.value) ? props.value : props.notFoundText
42
- })
43
-
44
- </script>
45
-
46
- <template>
47
- <div
48
- v-if="props.horizontal"
49
- class="d-flex align-top"
50
- v-bind="$attrs"
51
- @resize="setTruncate"
52
- >
53
- <div class="text-medium-emphasis text-no-wrap">
54
- <slot name="label">{{ props.label }}:</slot>
55
- </div>
56
- <div :class="`ml-1 ${calTruncate}`" ref="valueText">
57
- <slot name="value" :value="valueData">
58
- <div v-if="!props.truncate">{{ valueData }}</div>
59
- <div
60
- v-else
61
- @mouseover="setTruncate"
62
- @mouseout="isTooltip = false"
63
- >
64
- <v-tooltip :model-value="isTooltip" location="bottom">
65
- <template #activator="{ props }">
66
- <div
67
- class="text-truncate"
68
- v-bind="isTooltip ? props : ''"
69
- >
70
- {{ valueData }}
71
- </div>
72
- </template>
73
- <span>{{ valueData }}</span>
74
- </v-tooltip>
75
- </div>
76
- </slot>
77
- </div>
78
- </div>
79
-
80
- <v-card v-else variant="text" v-bind="$attrs">
81
- <VCardSubtitle class="ma-0 pa-0 text-black">
82
- <slot name="label">{{ props.label }}</slot>
83
- </VCardSubtitle>
84
- <VCardText :class="`pa-0 mb-2 ${calSize}`">
85
- <div :class="calTruncate" ref="valueText">
86
- <slot name="value" :value="valueData">
87
- <div v-if="!props.truncate">{{ valueData }}</div>
88
- <div
89
- v-else
90
- @mouseover="setTruncate"
91
- @mouseout="isTooltip = false"
92
- >
93
- <v-tooltip :model-value="isTooltip" location="bottom">
94
- <template #activator="{ props }">
95
- <div
96
- class="text-truncate"
97
- v-bind="isTooltip ? props : ''"
98
- >
99
- {{ valueData }}
100
- </div>
101
- </template>
102
- <span>{{ valueData }}</span>
103
- </v-tooltip>
104
- </div>
105
- </slot>
106
- </div>
107
- </VCardText>
108
- </v-card>
109
- </template>
110
-
1
+ <script lang="ts" setup>
2
+ /**
3
+ * LabelField renders read-only label output with formatting logic for display-oriented model values.
4
+ * This doc block is consumed by vue-docgen for generated API documentation.
5
+ */
6
+ import { computed, ref } from 'vue';
7
+
8
+ interface Props {
9
+ label: string; // UI label displayed to end users
10
+ value?: string | null; // Raw value rendered by this label field component.
11
+ horizontal?: boolean; // Renders label and value in a horizontal layout.
12
+ size?: 'large' | 'medium'; // Visual size preset controlling text and spacing.
13
+ truncate?: boolean; // Truncates long text and keeps full value in tooltip/title.
14
+ notFoundText?: string // Text shown when the resolved value or label is unavailable.
15
+ }
16
+
17
+ /**
18
+ * Public props accepted by LabelField.
19
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
20
+ */
21
+ const props = withDefaults(defineProps<Props>(), {
22
+ label: '',
23
+ value: '',
24
+ horizontal: false,
25
+ size: 'large',
26
+ truncate: false,
27
+ notFoundText : '-'
28
+ });
29
+
30
+ const valueText = ref<HTMLElement | null>(null);
31
+ const isTooltip = ref(false);
32
+
33
+ const calSize = computed(() => (props.size === 'medium' ? 'text-subtitle-1' : 'text-h6'));
34
+ const calTruncate = computed(() => (props.truncate ? 'text-truncate' : ''));
35
+
36
+ const setTruncate = (event: Event) => {
37
+ const target = event.target as HTMLElement;
38
+ isTooltip.value = target.offsetWidth < target.scrollWidth;
39
+ };
40
+ const valueData = computed(()=>{
41
+ return (props.value) ? props.value : props.notFoundText
42
+ })
43
+
44
+ </script>
45
+
46
+ <template>
47
+ <div
48
+ v-if="props.horizontal"
49
+ class="d-flex align-top"
50
+ v-bind="$attrs"
51
+ @resize="setTruncate"
52
+ >
53
+ <div class="text-medium-emphasis text-no-wrap">
54
+ <slot name="label">{{ props.label }}:</slot>
55
+ </div>
56
+ <div :class="`ml-1 ${calTruncate}`" ref="valueText">
57
+ <slot name="value" :value="valueData">
58
+ <div v-if="!props.truncate">{{ valueData }}</div>
59
+ <div
60
+ v-else
61
+ @mouseover="setTruncate"
62
+ @mouseout="isTooltip = false"
63
+ >
64
+ <v-tooltip :model-value="isTooltip" location="bottom">
65
+ <template #activator="{ props }">
66
+ <div
67
+ class="text-truncate"
68
+ v-bind="isTooltip ? props : ''"
69
+ >
70
+ {{ valueData }}
71
+ </div>
72
+ </template>
73
+ <span>{{ valueData }}</span>
74
+ </v-tooltip>
75
+ </div>
76
+ </slot>
77
+ </div>
78
+ </div>
79
+
80
+ <v-card v-else variant="text" v-bind="$attrs">
81
+ <VCardSubtitle class="ma-0 pa-0 text-black">
82
+ <slot name="label">{{ props.label }}</slot>
83
+ </VCardSubtitle>
84
+ <VCardText :class="`pa-0 mb-2 ${calSize}`">
85
+ <div :class="calTruncate" ref="valueText">
86
+ <slot name="value" :value="valueData">
87
+ <div v-if="!props.truncate">{{ valueData }}</div>
88
+ <div
89
+ v-else
90
+ @mouseover="setTruncate"
91
+ @mouseout="isTooltip = false"
92
+ >
93
+ <v-tooltip :model-value="isTooltip" location="bottom">
94
+ <template #activator="{ props }">
95
+ <div
96
+ class="text-truncate"
97
+ v-bind="isTooltip ? props : ''"
98
+ >
99
+ {{ valueData }}
100
+ </div>
101
+ </template>
102
+ <span>{{ valueData }}</span>
103
+ </v-tooltip>
104
+ </div>
105
+ </slot>
106
+ </div>
107
+ </VCardText>
108
+ </v-card>
109
+ </template>
110
+
111
111
  <style scoped>
112
112
 
113
- </style>
113
+ </style>
@@ -1,37 +1,37 @@
1
- <script lang="ts" setup>
2
- /**
3
- * LabelFormatMoney renders read-only label output with formatting logic for display-oriented model values.
4
- * This doc block is consumed by vue-docgen for generated API documentation.
5
- */
6
- import currency from 'currency.js'
7
- import { computed } from 'vue'
8
-
9
- interface Props {
10
- modelValue: number // Bound value for v-model synchronization with the parent component.
11
- decimal?: number // Number of decimal places used for currency formatting.
12
- currency?: string // Currency symbol or code displayed with formatted values.
13
- }
14
-
15
- /**
16
- * Public props accepted by LabelFormatMoney.
17
- * Document each prop field with intent, defaults, and side effects for clear generated docs.
18
- */
19
- const props = withDefaults(defineProps<Props>(), {
20
- modelValue: 0,
21
- decimal: 2,
22
- currency: '',
23
- })
24
-
25
- const formattedCurrency = computed(() => {
26
- return currency(props.modelValue, {
27
- pattern: `# !`,
28
- symbol: props.currency,
29
- separator: ',',
30
- precision: props.decimal,
31
- }).format()
32
- })
33
- </script>
34
-
35
- <template>
36
- {{ formattedCurrency }}
37
- </template>
1
+ <script lang="ts" setup>
2
+ /**
3
+ * LabelFormatMoney renders read-only label output with formatting logic for display-oriented model values.
4
+ * This doc block is consumed by vue-docgen for generated API documentation.
5
+ */
6
+ import currency from 'currency.js'
7
+ import { computed } from 'vue'
8
+
9
+ interface Props {
10
+ modelValue: number // Bound value for v-model synchronization with the parent component.
11
+ decimal?: number // Number of decimal places used for currency formatting.
12
+ currency?: string // Currency symbol or code displayed with formatted values.
13
+ }
14
+
15
+ /**
16
+ * Public props accepted by LabelFormatMoney.
17
+ * Document each prop field with intent, defaults, and side effects for clear generated docs.
18
+ */
19
+ const props = withDefaults(defineProps<Props>(), {
20
+ modelValue: 0,
21
+ decimal: 2,
22
+ currency: '',
23
+ })
24
+
25
+ const formattedCurrency = computed(() => {
26
+ return currency(props.modelValue, {
27
+ pattern: `# !`,
28
+ symbol: props.currency,
29
+ separator: ',',
30
+ precision: props.decimal,
31
+ }).format()
32
+ })
33
+ </script>
34
+
35
+ <template>
36
+ {{ formattedCurrency }}
37
+ </template>