@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.
- package/README.md +115 -96
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -0
- package/dist/runtime/components/Alert.vue +58 -54
- package/dist/runtime/components/BarcodeReader.vue +130 -122
- package/dist/runtime/components/ExportCSV.vue +110 -102
- package/dist/runtime/components/FileBtn.vue +79 -67
- package/dist/runtime/components/ImportCSV.vue +151 -139
- package/dist/runtime/components/MrzReader.vue +168 -0
- package/dist/runtime/components/SplitterPanel.vue +67 -59
- package/dist/runtime/components/TabsGroup.vue +39 -31
- package/dist/runtime/components/TextBarcode.vue +66 -54
- package/dist/runtime/components/device/IdCardButton.vue +95 -83
- package/dist/runtime/components/device/IdCardWebSocket.vue +207 -195
- package/dist/runtime/components/device/Scanner.vue +350 -338
- package/dist/runtime/components/dialog/Confirm.vue +112 -100
- package/dist/runtime/components/dialog/Host.vue +88 -84
- package/dist/runtime/components/dialog/Index.vue +84 -72
- package/dist/runtime/components/dialog/Loading.vue +51 -39
- package/dist/runtime/components/dialog/default/Confirm.vue +112 -100
- package/dist/runtime/components/dialog/default/Loading.vue +60 -48
- package/dist/runtime/components/dialog/default/Notify.vue +82 -70
- package/dist/runtime/components/dialog/default/Printing.vue +46 -34
- package/dist/runtime/components/dialog/default/VerifyUser.vue +144 -132
- package/dist/runtime/components/document/Form.vue +50 -42
- package/dist/runtime/components/document/TemplateBuilder.vue +536 -524
- package/dist/runtime/components/form/ActionPad.vue +156 -144
- package/dist/runtime/components/form/Birthdate.vue +116 -104
- package/dist/runtime/components/form/CheckboxGroup.vue +99 -87
- package/dist/runtime/components/form/CodeEditor.vue +45 -37
- package/dist/runtime/components/form/Date.vue +270 -258
- package/dist/runtime/components/form/DateTime.vue +220 -208
- package/dist/runtime/components/form/Dialog.vue +178 -166
- package/dist/runtime/components/form/EditPad.vue +157 -145
- package/dist/runtime/components/form/File.vue +295 -283
- package/dist/runtime/components/form/Hidden.vue +44 -32
- package/dist/runtime/components/form/Iterator.vue +538 -526
- package/dist/runtime/components/form/Login.vue +143 -131
- package/dist/runtime/components/form/Pad.vue +399 -387
- package/dist/runtime/components/form/SignPad.vue +226 -218
- package/dist/runtime/components/form/System.vue +34 -26
- package/dist/runtime/components/form/Table.vue +391 -379
- package/dist/runtime/components/form/TableData.vue +236 -224
- package/dist/runtime/components/form/Time.vue +177 -165
- package/dist/runtime/components/form/images/Capture.vue +245 -237
- package/dist/runtime/components/form/images/Edit.vue +133 -121
- package/dist/runtime/components/form/images/Field.vue +331 -320
- package/dist/runtime/components/form/images/Pad.vue +54 -42
- package/dist/runtime/components/label/Date.vue +37 -29
- package/dist/runtime/components/label/DateAgo.vue +102 -94
- package/dist/runtime/components/label/DateCount.vue +152 -144
- package/dist/runtime/components/label/Field.vue +111 -103
- package/dist/runtime/components/label/FormatMoney.vue +37 -29
- package/dist/runtime/components/label/Mask.vue +46 -38
- package/dist/runtime/components/label/Object.vue +21 -13
- package/dist/runtime/components/master/Autocomplete.vue +89 -81
- package/dist/runtime/components/master/Combobox.vue +88 -80
- package/dist/runtime/components/master/RadioGroup.vue +90 -78
- package/dist/runtime/components/master/Select.vue +70 -62
- package/dist/runtime/components/master/label.vue +55 -47
- package/dist/runtime/components/model/Autocomplete.vue +91 -79
- package/dist/runtime/components/model/Combobox.vue +90 -78
- package/dist/runtime/components/model/Pad.vue +114 -102
- package/dist/runtime/components/model/Select.vue +78 -72
- package/dist/runtime/components/model/Table.vue +370 -358
- package/dist/runtime/components/model/iterator.vue +497 -489
- package/dist/runtime/components/model/label.vue +58 -50
- package/dist/runtime/components/pdf/Print.vue +75 -63
- package/dist/runtime/components/pdf/View.vue +146 -134
- package/dist/runtime/composables/alert.d.ts +4 -0
- package/dist/runtime/composables/api.d.ts +4 -0
- package/dist/runtime/composables/dialog.d.ts +1 -1
- package/dist/runtime/composables/document/templateFormHidden.d.ts +4 -0
- package/dist/runtime/composables/graphql.d.ts +1 -1
- package/dist/runtime/composables/graphqlModel.d.ts +9 -9
- package/dist/runtime/composables/graphqlModelItem.d.ts +7 -7
- package/dist/runtime/composables/graphqlModelOperation.d.ts +6 -6
- package/dist/runtime/composables/localStorageModel.d.ts +4 -0
- package/dist/runtime/composables/lookupList.d.ts +4 -0
- package/dist/runtime/composables/menu.d.ts +4 -0
- package/dist/runtime/composables/useMrzReader.d.ts +48 -0
- package/dist/runtime/composables/useMrzReader.js +423 -0
- package/dist/runtime/composables/useTesseract.d.ts +16 -0
- package/dist/runtime/composables/useTesseract.js +45 -0
- package/dist/runtime/composables/userPermission.d.ts +1 -1
- package/dist/runtime/labs/Calendar.vue +99 -99
- package/dist/runtime/labs/form/EditMobile.vue +152 -152
- package/dist/runtime/labs/form/TextFieldMask.vue +43 -43
- package/dist/runtime/plugins/clientConfig.d.ts +1 -1
- package/dist/runtime/plugins/default.d.ts +1 -1
- package/dist/runtime/plugins/dialogManager.d.ts +1 -1
- package/dist/runtime/plugins/permission.d.ts +1 -1
- package/dist/runtime/types/alert.d.ts +11 -11
- package/dist/runtime/types/clientConfig.d.ts +13 -13
- package/dist/runtime/types/dialogManager.d.ts +35 -35
- package/dist/runtime/types/formDialog.d.ts +5 -5
- package/dist/runtime/types/graphqlOperation.d.ts +23 -23
- package/dist/runtime/types/menu.d.ts +31 -31
- package/dist/runtime/types/modules.d.ts +7 -7
- package/dist/runtime/types/permission.d.ts +13 -13
- package/dist/runtime/utils/asset.d.ts +2 -0
- package/dist/runtime/utils/asset.js +49 -0
- package/package.json +131 -122
- package/scripts/enrich-vue-docs-from-ai.mjs +197 -0
- package/scripts/generate-ai-summary.mjs +321 -0
- package/scripts/generate-composables-md.mjs +129 -0
- package/scripts/postInstall.cjs +70 -70
- package/templates/.codegen/codegen.ts +32 -32
- package/templates/.codegen/plugin-schema-object.js +161 -161
- package/templates/public/tesseract/mrz.traineddata.gz +0 -0
- package/templates/public/tesseract/ocrb.traineddata.gz +0 -0
|
@@ -1,144 +1,152 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
years: '
|
|
40
|
-
months: '
|
|
41
|
-
days: '
|
|
42
|
-
hours: '
|
|
43
|
-
minutes: '
|
|
44
|
-
seconds: '
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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"> </span>{{ outputText }}
|
|
151
|
+
</span>
|
|
152
|
+
</template>
|
|
@@ -1,105 +1,113 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
label
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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>
|