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