@goplusvn/core 0.1.1 → 0.1.3
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/package.json +31 -175
- package/dist/audit/index.d.mts +0 -115
- package/dist/audit/index.d.ts +0 -115
- package/dist/audit/index.js +0 -204
- package/dist/audit/index.js.map +0 -1
- package/dist/audit/index.mjs +0 -200
- package/dist/audit/index.mjs.map +0 -1
- package/dist/auth/index.d.mts +0 -86
- package/dist/auth/index.d.ts +0 -86
- package/dist/auth/index.js +0 -210
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/index.mjs +0 -198
- package/dist/auth/index.mjs.map +0 -1
- package/dist/button-1dWvP9Ib.d.mts +0 -30
- package/dist/button-1dWvP9Ib.d.ts +0 -30
- package/dist/calendar-2QzdEo1z.d.mts +0 -20
- package/dist/calendar-2QzdEo1z.d.ts +0 -20
- package/dist/code-generation/index.d.mts +0 -30
- package/dist/code-generation/index.d.ts +0 -30
- package/dist/code-generation/index.js +0 -31
- package/dist/code-generation/index.js.map +0 -1
- package/dist/code-generation/index.mjs +0 -28
- package/dist/code-generation/index.mjs.map +0 -1
- package/dist/configs/index.d.mts +0 -175
- package/dist/configs/index.d.ts +0 -175
- package/dist/configs/index.js +0 -254
- package/dist/configs/index.js.map +0 -1
- package/dist/configs/index.mjs +0 -233
- package/dist/configs/index.mjs.map +0 -1
- package/dist/crud/index.d.mts +0 -646
- package/dist/crud/index.d.ts +0 -646
- package/dist/crud/index.js +0 -11772
- package/dist/crud/index.js.map +0 -1
- package/dist/crud/index.mjs +0 -11665
- package/dist/crud/index.mjs.map +0 -1
- package/dist/crud/server.d.mts +0 -20
- package/dist/crud/server.d.ts +0 -20
- package/dist/crud/server.js +0 -123
- package/dist/crud/server.js.map +0 -1
- package/dist/crud/server.mjs +0 -120
- package/dist/crud/server.mjs.map +0 -1
- package/dist/data-table-skeleton-12NA8Mjx.d.mts +0 -39
- package/dist/data-table-skeleton-12NA8Mjx.d.ts +0 -39
- package/dist/dialog-bKfjZMTd.d.mts +0 -22
- package/dist/dialog-bKfjZMTd.d.ts +0 -22
- package/dist/dynamic-icon-DrGIiu2N.d.mts +0 -10
- package/dist/dynamic-icon-DrGIiu2N.d.ts +0 -10
- package/dist/home/index.d.mts +0 -269
- package/dist/home/index.d.ts +0 -269
- package/dist/home/index.js +0 -1678
- package/dist/home/index.js.map +0 -1
- package/dist/home/index.mjs +0 -1635
- package/dist/home/index.mjs.map +0 -1
- package/dist/hooks/index.d.mts +0 -7
- package/dist/hooks/index.d.ts +0 -7
- package/dist/hooks/index.js +0 -8316
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/index.mjs +0 -8255
- package/dist/hooks/index.mjs.map +0 -1
- package/dist/index-50hpiPrV.d.ts +0 -116
- package/dist/index-B9zQVEVi.d.mts +0 -116
- package/dist/index.d.mts +0 -5
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -123
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -118
- package/dist/index.mjs.map +0 -1
- package/dist/infrastructure/index.d.mts +0 -423
- package/dist/infrastructure/index.d.ts +0 -423
- package/dist/infrastructure/index.js +0 -633
- package/dist/infrastructure/index.js.map +0 -1
- package/dist/infrastructure/index.mjs +0 -619
- package/dist/infrastructure/index.mjs.map +0 -1
- package/dist/label-DWTEkNPo.d.ts +0 -226
- package/dist/label-LPpdcoBx.d.mts +0 -226
- package/dist/layout/index.d.mts +0 -48
- package/dist/layout/index.d.ts +0 -48
- package/dist/layout/index.js +0 -117
- package/dist/layout/index.js.map +0 -1
- package/dist/layout/index.mjs +0 -90
- package/dist/layout/index.mjs.map +0 -1
- package/dist/navigation/index.d.mts +0 -16
- package/dist/navigation/index.d.ts +0 -16
- package/dist/navigation/index.js +0 -53
- package/dist/navigation/index.js.map +0 -1
- package/dist/navigation/index.mjs +0 -50
- package/dist/navigation/index.mjs.map +0 -1
- package/dist/notification/index.d.mts +0 -105
- package/dist/notification/index.d.ts +0 -105
- package/dist/notification/index.js +0 -278
- package/dist/notification/index.js.map +0 -1
- package/dist/notification/index.mjs +0 -274
- package/dist/notification/index.mjs.map +0 -1
- package/dist/organization/index.d.mts +0 -99
- package/dist/organization/index.d.ts +0 -99
- package/dist/organization/index.js +0 -360
- package/dist/organization/index.js.map +0 -1
- package/dist/organization/index.mjs +0 -352
- package/dist/organization/index.mjs.map +0 -1
- package/dist/plugin/index.d.mts +0 -83
- package/dist/plugin/index.d.ts +0 -83
- package/dist/plugin/index.js +0 -86
- package/dist/plugin/index.js.map +0 -1
- package/dist/plugin/index.mjs +0 -84
- package/dist/plugin/index.mjs.map +0 -1
- package/dist/providers/index.d.mts +0 -25
- package/dist/providers/index.d.ts +0 -25
- package/dist/providers/index.js +0 -84
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/index.mjs +0 -77
- package/dist/providers/index.mjs.map +0 -1
- package/dist/rbac/index.d.mts +0 -226
- package/dist/rbac/index.d.ts +0 -226
- package/dist/rbac/index.js +0 -4784
- package/dist/rbac/index.js.map +0 -1
- package/dist/rbac/index.mjs +0 -4722
- package/dist/rbac/index.mjs.map +0 -1
- package/dist/rbac/permissions.d.mts +0 -26
- package/dist/rbac/permissions.d.ts +0 -26
- package/dist/rbac/permissions.js +0 -94
- package/dist/rbac/permissions.js.map +0 -1
- package/dist/rbac/permissions.mjs +0 -90
- package/dist/rbac/permissions.mjs.map +0 -1
- package/dist/rbac/server.d.mts +0 -1
- package/dist/rbac/server.d.ts +0 -1
- package/dist/rbac/server.js +0 -128
- package/dist/rbac/server.js.map +0 -1
- package/dist/rbac/server.mjs +0 -124
- package/dist/rbac/server.mjs.map +0 -1
- package/dist/schemas/index.d.mts +0 -1257
- package/dist/schemas/index.d.ts +0 -1257
- package/dist/schemas/index.js +0 -572
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/index.mjs +0 -523
- package/dist/schemas/index.mjs.map +0 -1
- package/dist/server-QuYCTa89.d.mts +0 -83
- package/dist/server-QuYCTa89.d.ts +0 -83
- package/dist/sonner-C74GlRDQ.d.mts +0 -71
- package/dist/sonner-C74GlRDQ.d.ts +0 -71
- package/dist/status-BOXZgIqX.d.mts +0 -12
- package/dist/status-BOXZgIqX.d.ts +0 -12
- package/dist/system/index.d.mts +0 -77
- package/dist/system/index.d.ts +0 -77
- package/dist/system/index.js +0 -102
- package/dist/system/index.js.map +0 -1
- package/dist/system/index.mjs +0 -100
- package/dist/system/index.mjs.map +0 -1
- package/dist/tabs-C6FfBwPY.d.mts +0 -18
- package/dist/tabs-C6FfBwPY.d.ts +0 -18
- package/dist/tenant-provider-B8eC_Wpb.d.mts +0 -27
- package/dist/tenant-provider-B8eC_Wpb.d.ts +0 -27
- package/dist/types/index.d.mts +0 -469
- package/dist/types/index.d.ts +0 -469
- package/dist/types/index.js +0 -25
- package/dist/types/index.js.map +0 -1
- package/dist/types/index.mjs +0 -21
- package/dist/types/index.mjs.map +0 -1
- package/dist/ui/auth.d.mts +0 -39
- package/dist/ui/auth.d.ts +0 -39
- package/dist/ui/auth.js +0 -4941
- package/dist/ui/auth.js.map +0 -1
- package/dist/ui/auth.mjs +0 -4896
- package/dist/ui/auth.mjs.map +0 -1
- package/dist/ui/crud.d.mts +0 -2
- package/dist/ui/crud.d.ts +0 -2
- package/dist/ui/crud.js +0 -4
- package/dist/ui/crud.js.map +0 -1
- package/dist/ui/crud.mjs +0 -3
- package/dist/ui/crud.mjs.map +0 -1
- package/dist/ui/data-display.d.mts +0 -596
- package/dist/ui/data-display.d.ts +0 -596
- package/dist/ui/data-display.js +0 -5307
- package/dist/ui/data-display.js.map +0 -1
- package/dist/ui/data-display.mjs +0 -5212
- package/dist/ui/data-display.mjs.map +0 -1
- package/dist/ui/feedback.d.mts +0 -55
- package/dist/ui/feedback.d.ts +0 -55
- package/dist/ui/feedback.js +0 -2608
- package/dist/ui/feedback.js.map +0 -1
- package/dist/ui/feedback.mjs +0 -2526
- package/dist/ui/feedback.mjs.map +0 -1
- package/dist/ui/forms.d.mts +0 -309
- package/dist/ui/forms.d.ts +0 -309
- package/dist/ui/forms.js +0 -4656
- package/dist/ui/forms.js.map +0 -1
- package/dist/ui/forms.mjs +0 -4571
- package/dist/ui/forms.mjs.map +0 -1
- package/dist/ui/index.d.mts +0 -331
- package/dist/ui/index.d.ts +0 -331
- package/dist/ui/index.js +0 -16953
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/index.mjs +0 -16598
- package/dist/ui/index.mjs.map +0 -1
- package/dist/ui/primitives/client.d.mts +0 -61
- package/dist/ui/primitives/client.d.ts +0 -61
- package/dist/ui/primitives/client.js +0 -3408
- package/dist/ui/primitives/client.js.map +0 -1
- package/dist/ui/primitives/client.mjs +0 -3256
- package/dist/ui/primitives/client.mjs.map +0 -1
- package/dist/ui/primitives.d.mts +0 -113
- package/dist/ui/primitives.d.ts +0 -113
- package/dist/ui/primitives.js +0 -3356
- package/dist/ui/primitives.js.map +0 -1
- package/dist/ui/primitives.mjs +0 -3227
- package/dist/ui/primitives.mjs.map +0 -1
- package/dist/user/index.d.mts +0 -228
- package/dist/user/index.d.ts +0 -228
- package/dist/user/index.js +0 -4306
- package/dist/user/index.js.map +0 -1
- package/dist/user/index.mjs +0 -4260
- package/dist/user/index.mjs.map +0 -1
- package/dist/utils/index.d.mts +0 -205
- package/dist/utils/index.d.ts +0 -205
- package/dist/utils/index.js +0 -574
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/index.mjs +0 -514
- package/dist/utils/index.mjs.map +0 -1
- package/dist/workflow/index.d.mts +0 -40
- package/dist/workflow/index.d.ts +0 -40
- package/dist/workflow/index.js +0 -3710
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/index.mjs +0 -3677
- package/dist/workflow/index.mjs.map +0 -1
package/dist/utils/index.js
DELETED
|
@@ -1,574 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var clsx = require('clsx');
|
|
4
|
-
var tailwindMerge = require('tailwind-merge');
|
|
5
|
-
|
|
6
|
-
// src/utils/index.ts
|
|
7
|
-
|
|
8
|
-
// src/configs/status.ts
|
|
9
|
-
var STATUS_ACTIVE = "active";
|
|
10
|
-
var STATUS_INACTIVE = "inactive";
|
|
11
|
-
var STATUS_VALUES = [STATUS_ACTIVE, STATUS_INACTIVE];
|
|
12
|
-
var STATUS_OPTIONS = [
|
|
13
|
-
{ label: "crud.common.options.active", value: STATUS_ACTIVE },
|
|
14
|
-
{ label: "crud.common.options.inactive", value: STATUS_INACTIVE }
|
|
15
|
-
];
|
|
16
|
-
var STATUS_COLORS = {
|
|
17
|
-
[STATUS_ACTIVE]: "success",
|
|
18
|
-
[STATUS_INACTIVE]: "warning"
|
|
19
|
-
};
|
|
20
|
-
function booleanToStatus(value) {
|
|
21
|
-
return value ? STATUS_ACTIVE : STATUS_INACTIVE;
|
|
22
|
-
}
|
|
23
|
-
function statusToBoolean(value) {
|
|
24
|
-
return value === STATUS_ACTIVE;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// src/utils/index.ts
|
|
28
|
-
function cn(...inputs) {
|
|
29
|
-
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
30
|
-
}
|
|
31
|
-
function getInitials(fullName) {
|
|
32
|
-
if (fullName.length === 0) return "";
|
|
33
|
-
const names = fullName.split(" ");
|
|
34
|
-
const initials = names.map((name) => name.charAt(0).toUpperCase()).join("");
|
|
35
|
-
return initials;
|
|
36
|
-
}
|
|
37
|
-
function slugify(text) {
|
|
38
|
-
return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
|
|
39
|
-
}
|
|
40
|
-
function camelCaseToTitleCase(camelCaseStr) {
|
|
41
|
-
return camelCaseStr.replace(/([A-Z])/g, " $1").replace(/^./, (char) => char.toUpperCase());
|
|
42
|
-
}
|
|
43
|
-
function titleCaseToCamelCase(titleCaseStr) {
|
|
44
|
-
return titleCaseStr.toLowerCase().replace(/[-_\s]+(.)/g, (_, char) => char.toUpperCase()).replace(/[-_]/g, "");
|
|
45
|
-
}
|
|
46
|
-
var isEven = (num) => num % 2 === 0;
|
|
47
|
-
var isNonNegative = (num) => num >= 0;
|
|
48
|
-
function readMoney(amount) {
|
|
49
|
-
if (!Number.isFinite(amount)) return "Kh\xF4ng \u0111\u1ED3ng";
|
|
50
|
-
const isNegative = amount < 0;
|
|
51
|
-
amount = Math.floor(Math.abs(amount));
|
|
52
|
-
if (amount === 0) return "Kh\xF4ng \u0111\u1ED3ng";
|
|
53
|
-
const unit = ["", "ngh\xECn", "tri\u1EC7u", "t\u1EF7", "ngh\xECn t\u1EF7", "tri\u1EC7u t\u1EF7"];
|
|
54
|
-
const digit = [
|
|
55
|
-
"kh\xF4ng",
|
|
56
|
-
"m\u1ED9t",
|
|
57
|
-
"hai",
|
|
58
|
-
"ba",
|
|
59
|
-
"b\u1ED1n",
|
|
60
|
-
"n\u0103m",
|
|
61
|
-
"s\xE1u",
|
|
62
|
-
"b\u1EA3y",
|
|
63
|
-
"t\xE1m",
|
|
64
|
-
"ch\xEDn"
|
|
65
|
-
];
|
|
66
|
-
let str = amount.toString();
|
|
67
|
-
const groups = [];
|
|
68
|
-
while (str.length > 0) {
|
|
69
|
-
groups.push(str.slice(-3));
|
|
70
|
-
str = str.slice(0, -3);
|
|
71
|
-
}
|
|
72
|
-
let result = "";
|
|
73
|
-
for (let i = 0; i < groups.length; i++) {
|
|
74
|
-
const group = groups[i];
|
|
75
|
-
if (group === "000") continue;
|
|
76
|
-
const [a, b, c] = group.padStart(3, "0").split("").map(Number);
|
|
77
|
-
let groupResult = "";
|
|
78
|
-
const hasHundreds = a !== 0 || groups.length > 1;
|
|
79
|
-
if (hasHundreds) {
|
|
80
|
-
groupResult += `${digit[a]} tr\u0103m `;
|
|
81
|
-
}
|
|
82
|
-
if (b === 0 && c !== 0) {
|
|
83
|
-
if (hasHundreds) groupResult += "l\u1EBB ";
|
|
84
|
-
} else if (b === 1) {
|
|
85
|
-
groupResult += "m\u01B0\u1EDDi ";
|
|
86
|
-
} else if (b > 1) {
|
|
87
|
-
groupResult += `${digit[b]} m\u01B0\u01A1i `;
|
|
88
|
-
}
|
|
89
|
-
if (c === 1 && b > 1) {
|
|
90
|
-
groupResult += "m\u1ED1t ";
|
|
91
|
-
} else if (c === 5 && b > 0) {
|
|
92
|
-
groupResult += "l\u0103m ";
|
|
93
|
-
} else if (c !== 0) {
|
|
94
|
-
groupResult += `${digit[c]} `;
|
|
95
|
-
}
|
|
96
|
-
if (i === groups.length - 1 && a === 0) {
|
|
97
|
-
groupResult = groupResult.replace("kh\xF4ng tr\u0103m ", "");
|
|
98
|
-
if (b === 0) groupResult = groupResult.replace("l\u1EBB ", "");
|
|
99
|
-
}
|
|
100
|
-
if (groupResult.trim() !== "") {
|
|
101
|
-
result = `${groupResult.trim()} ${unit[i]} ${result}`;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
result = result.trim() + " \u0111\u1ED3ng";
|
|
105
|
-
if (isNegative) {
|
|
106
|
-
return "\xC2m " + result;
|
|
107
|
-
}
|
|
108
|
-
return result.charAt(0).toUpperCase() + result.slice(1);
|
|
109
|
-
}
|
|
110
|
-
function formatCurrency(value, locales = "vi", currency = "VND") {
|
|
111
|
-
return new Intl.NumberFormat(locales === "vi" ? "vi-VN" : locales, {
|
|
112
|
-
style: "decimal",
|
|
113
|
-
maximumFractionDigits: 0
|
|
114
|
-
}).format(value);
|
|
115
|
-
}
|
|
116
|
-
function formatNumber(value, options) {
|
|
117
|
-
const {
|
|
118
|
-
locale = "vi-VN",
|
|
119
|
-
minimumFractionDigits = 0,
|
|
120
|
-
maximumFractionDigits = 2
|
|
121
|
-
} = options || {};
|
|
122
|
-
return new Intl.NumberFormat(locale, {
|
|
123
|
-
minimumFractionDigits,
|
|
124
|
-
maximumFractionDigits
|
|
125
|
-
}).format(value);
|
|
126
|
-
}
|
|
127
|
-
function formatPercent(value, locales = "vi") {
|
|
128
|
-
return new Intl.NumberFormat(locales === "vi" ? "vi-VN" : locales, {
|
|
129
|
-
style: "percent",
|
|
130
|
-
maximumFractionDigits: 0
|
|
131
|
-
}).format(value);
|
|
132
|
-
}
|
|
133
|
-
function formatNumberToCompact(value, locales = "vi") {
|
|
134
|
-
return new Intl.NumberFormat(locales === "vi" ? "vi-VN" : locales, {
|
|
135
|
-
notation: "compact",
|
|
136
|
-
compactDisplay: "short"
|
|
137
|
-
}).format(value);
|
|
138
|
-
}
|
|
139
|
-
function formatFileSize(bytes, decimals = 2) {
|
|
140
|
-
if (bytes === 0) return "0 Bytes";
|
|
141
|
-
const k = 1e3;
|
|
142
|
-
const dm = decimals < 0 ? 0 : decimals;
|
|
143
|
-
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB"];
|
|
144
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
145
|
-
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
|
146
|
-
}
|
|
147
|
-
function formatUnreadCount(unreadCount) {
|
|
148
|
-
return unreadCount >= 100 ? "+99" : unreadCount;
|
|
149
|
-
}
|
|
150
|
-
function formatDate(date, options) {
|
|
151
|
-
const { locale = "vi-VN", format = "medium" } = options || {};
|
|
152
|
-
const dateObj = typeof date === "string" ? new Date(date) : date;
|
|
153
|
-
const formatOptions = {
|
|
154
|
-
short: { day: "2-digit", month: "2-digit", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" },
|
|
155
|
-
medium: { day: "2-digit", month: "short", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" },
|
|
156
|
-
long: { day: "numeric", month: "long", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" },
|
|
157
|
-
full: { weekday: "long", day: "numeric", month: "long", year: "numeric", timeZone: "Asia/Ho_Chi_Minh" }
|
|
158
|
-
};
|
|
159
|
-
return new Intl.DateTimeFormat(locale, formatOptions[format]).format(dateObj);
|
|
160
|
-
}
|
|
161
|
-
function formatDateTime(date, options) {
|
|
162
|
-
const { locale = "vi-VN" } = options || {};
|
|
163
|
-
const dateObj = typeof date === "string" ? new Date(date) : date;
|
|
164
|
-
return new Intl.DateTimeFormat(locale, {
|
|
165
|
-
day: "2-digit",
|
|
166
|
-
month: "2-digit",
|
|
167
|
-
year: "numeric",
|
|
168
|
-
hour: "2-digit",
|
|
169
|
-
minute: "2-digit",
|
|
170
|
-
timeZone: "Asia/Ho_Chi_Minh"
|
|
171
|
-
}).format(dateObj);
|
|
172
|
-
}
|
|
173
|
-
function formatRelativeDate(value) {
|
|
174
|
-
if (!value) return "No Date";
|
|
175
|
-
const date = new Date(value);
|
|
176
|
-
const today = /* @__PURE__ */ new Date();
|
|
177
|
-
const yesterday = /* @__PURE__ */ new Date();
|
|
178
|
-
yesterday.setDate(today.getDate() - 1);
|
|
179
|
-
const vnDateStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(date);
|
|
180
|
-
const vnTodayStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(today);
|
|
181
|
-
const vnYesterdayStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(yesterday);
|
|
182
|
-
if (vnDateStr === vnTodayStr) return "Today";
|
|
183
|
-
if (vnDateStr === vnYesterdayStr) return "Yesterday";
|
|
184
|
-
return formatDate(date);
|
|
185
|
-
}
|
|
186
|
-
function isBeforeToday(date) {
|
|
187
|
-
const vnTodayStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(/* @__PURE__ */ new Date());
|
|
188
|
-
const vnDateStr = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Ho_Chi_Minh", year: "numeric", month: "2-digit", day: "2-digit" }).format(date);
|
|
189
|
-
return vnDateStr < vnTodayStr;
|
|
190
|
-
}
|
|
191
|
-
function ensureWithPrefix(value, prefix) {
|
|
192
|
-
return value.startsWith(prefix) ? value : `${prefix}${value}`;
|
|
193
|
-
}
|
|
194
|
-
function ensureWithSuffix(value, suffix) {
|
|
195
|
-
return value.endsWith(suffix) ? value : `${value}${suffix}`;
|
|
196
|
-
}
|
|
197
|
-
function ensureWithoutPrefix(value, prefix) {
|
|
198
|
-
return value.startsWith(prefix) ? value.slice(prefix.length) : value;
|
|
199
|
-
}
|
|
200
|
-
function ensureWithoutSuffix(value, suffix) {
|
|
201
|
-
return value.endsWith(suffix) ? value.slice(0, -suffix.length) : value;
|
|
202
|
-
}
|
|
203
|
-
function isActivePathname(basePathname, currentPathname, exactMatch = false) {
|
|
204
|
-
if (typeof basePathname !== "string" || typeof currentPathname !== "string") {
|
|
205
|
-
throw new Error("Both basePathname and currentPathname must be strings");
|
|
206
|
-
}
|
|
207
|
-
if (exactMatch) {
|
|
208
|
-
return basePathname === currentPathname;
|
|
209
|
-
}
|
|
210
|
-
return currentPathname.startsWith(basePathname) && (currentPathname.length === basePathname.length || currentPathname[basePathname.length] === "/");
|
|
211
|
-
}
|
|
212
|
-
function wait(ms = 250) {
|
|
213
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
214
|
-
}
|
|
215
|
-
function debounce(func, wait2) {
|
|
216
|
-
let timeout = null;
|
|
217
|
-
return (...args) => {
|
|
218
|
-
if (timeout) {
|
|
219
|
-
clearTimeout(timeout);
|
|
220
|
-
}
|
|
221
|
-
timeout = setTimeout(() => func(...args), wait2);
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
function deepClone(obj) {
|
|
225
|
-
return JSON.parse(JSON.stringify(obj));
|
|
226
|
-
}
|
|
227
|
-
function isEmpty(value) {
|
|
228
|
-
if (value === null || value === void 0) return true;
|
|
229
|
-
if (typeof value === "string") return value.trim() === "";
|
|
230
|
-
if (Array.isArray(value)) return value.length === 0;
|
|
231
|
-
if (typeof value === "object") return Object.keys(value).length === 0;
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
function generateId(prefix) {
|
|
235
|
-
const id = Math.random().toString(36).substring(2, 11);
|
|
236
|
-
return prefix ? `${prefix}_${id}` : id;
|
|
237
|
-
}
|
|
238
|
-
function getDictionaryValue(key, section, fallback) {
|
|
239
|
-
const value = section[key];
|
|
240
|
-
if (typeof value !== "string") {
|
|
241
|
-
if (fallback !== void 0) {
|
|
242
|
-
return fallback;
|
|
243
|
-
}
|
|
244
|
-
const normalizedKey = key.replace(/[-_]/g, "");
|
|
245
|
-
const normalizedValue = section[normalizedKey];
|
|
246
|
-
if (typeof normalizedValue === "string") {
|
|
247
|
-
return normalizedValue;
|
|
248
|
-
}
|
|
249
|
-
return key;
|
|
250
|
-
}
|
|
251
|
-
return value;
|
|
252
|
-
}
|
|
253
|
-
function formatOverviewCardValue(value, formatStyle) {
|
|
254
|
-
switch (formatStyle) {
|
|
255
|
-
case "percent":
|
|
256
|
-
return formatPercent(value);
|
|
257
|
-
case "currency":
|
|
258
|
-
return formatCurrency(value);
|
|
259
|
-
default:
|
|
260
|
-
return value.toLocaleString("vi-VN", {
|
|
261
|
-
maximumFractionDigits: 0
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
function getCreditCardBrandName(number) {
|
|
266
|
-
const re = {
|
|
267
|
-
visa: /^4/,
|
|
268
|
-
mastercard: /^5[1-5]/,
|
|
269
|
-
amex: /^3[47]/,
|
|
270
|
-
discover: /^6(?:011|5)/
|
|
271
|
-
};
|
|
272
|
-
for (const [type, regex] of Object.entries(re)) {
|
|
273
|
-
if (regex.test(number)) return type;
|
|
274
|
-
}
|
|
275
|
-
return "unknown";
|
|
276
|
-
}
|
|
277
|
-
function remToPx(rem) {
|
|
278
|
-
if (typeof document === "undefined") return rem * 16;
|
|
279
|
-
const rootFontSize = parseFloat(
|
|
280
|
-
getComputedStyle(document.documentElement).fontSize
|
|
281
|
-
);
|
|
282
|
-
return rem * rootFontSize;
|
|
283
|
-
}
|
|
284
|
-
function isUrl(text) {
|
|
285
|
-
try {
|
|
286
|
-
new URL(text);
|
|
287
|
-
return true;
|
|
288
|
-
} catch {
|
|
289
|
-
return false;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
function ratingToPercentage(rating, maxRating, fractionDigits = 0) {
|
|
293
|
-
const value = (rating / maxRating * 100).toFixed(fractionDigits);
|
|
294
|
-
return value + "%";
|
|
295
|
-
}
|
|
296
|
-
function ensureRedirectPathname(basePathname, redirectPathname) {
|
|
297
|
-
const searchParams = new URLSearchParams({
|
|
298
|
-
redirectTo: ensureWithoutSuffix(redirectPathname, "/")
|
|
299
|
-
});
|
|
300
|
-
return ensureWithSuffix(basePathname, "?" + searchParams.toString());
|
|
301
|
-
}
|
|
302
|
-
function getDiscountedPrice(price, discountRate, isAnnual = false) {
|
|
303
|
-
if (isAnnual) {
|
|
304
|
-
const annualPrice = price * 12;
|
|
305
|
-
const discountedAnnualPrice = annualPrice * (1 - discountRate);
|
|
306
|
-
return discountedAnnualPrice / 12;
|
|
307
|
-
} else {
|
|
308
|
-
return price * (1 - discountRate);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
function timeToDate(timeString, baseDate = /* @__PURE__ */ new Date()) {
|
|
312
|
-
if (!/^\d{2}:\d{2}$/.test(timeString)) {
|
|
313
|
-
throw new Error("Invalid time format. Use 'HH:mm'.");
|
|
314
|
-
}
|
|
315
|
-
const [hours, minutes] = timeString.split(":").map(Number);
|
|
316
|
-
const date = new Date(baseDate);
|
|
317
|
-
date.setHours(hours, minutes, 0, 0);
|
|
318
|
-
return date;
|
|
319
|
-
}
|
|
320
|
-
function formatFileType(type) {
|
|
321
|
-
return type.slice(0, type.lastIndexOf("/"));
|
|
322
|
-
}
|
|
323
|
-
function formatDateWithTime(value) {
|
|
324
|
-
const date = new Date(value);
|
|
325
|
-
return new Intl.DateTimeFormat("vi-VN", {
|
|
326
|
-
day: "2-digit",
|
|
327
|
-
month: "2-digit",
|
|
328
|
-
year: "numeric",
|
|
329
|
-
hour: "2-digit",
|
|
330
|
-
minute: "2-digit",
|
|
331
|
-
timeZone: "Asia/Ho_Chi_Minh"
|
|
332
|
-
}).format(date);
|
|
333
|
-
}
|
|
334
|
-
function formatDateShort(value) {
|
|
335
|
-
const date = new Date(value);
|
|
336
|
-
return new Intl.DateTimeFormat("en-US", {
|
|
337
|
-
month: "short",
|
|
338
|
-
day: "2-digit",
|
|
339
|
-
timeZone: "Asia/Ho_Chi_Minh"
|
|
340
|
-
}).format(date);
|
|
341
|
-
}
|
|
342
|
-
function formatTime(value) {
|
|
343
|
-
const date = new Date(value);
|
|
344
|
-
return new Intl.DateTimeFormat("en-US", {
|
|
345
|
-
hour: "numeric",
|
|
346
|
-
minute: "2-digit",
|
|
347
|
-
hour12: true,
|
|
348
|
-
timeZone: "Asia/Ho_Chi_Minh"
|
|
349
|
-
}).format(date);
|
|
350
|
-
}
|
|
351
|
-
function formatDuration(value) {
|
|
352
|
-
const numberValue = Number(value);
|
|
353
|
-
const isNegative = numberValue < 0;
|
|
354
|
-
const absoluteValue = Math.abs(numberValue);
|
|
355
|
-
const hours = Math.floor(absoluteValue / 36e5);
|
|
356
|
-
const minutes = Math.floor(absoluteValue % 36e5 / 6e4);
|
|
357
|
-
const seconds = Math.floor(absoluteValue % 6e4 / 1e3);
|
|
358
|
-
const parts = [];
|
|
359
|
-
if (hours) parts.push(`${hours}h`);
|
|
360
|
-
if (minutes) parts.push(`${minutes}m`);
|
|
361
|
-
if (seconds) parts.push(`${seconds}s`);
|
|
362
|
-
const formattedDuration = parts.join(" ") || "0s";
|
|
363
|
-
return isNegative ? `-${formattedDuration}` : formattedDuration;
|
|
364
|
-
}
|
|
365
|
-
function formatDistance(value) {
|
|
366
|
-
const date = new Date(value);
|
|
367
|
-
const now = /* @__PURE__ */ new Date();
|
|
368
|
-
const diffMs = now.getTime() - date.getTime();
|
|
369
|
-
const diffMins = Math.floor(diffMs / 6e4);
|
|
370
|
-
const diffHours = Math.floor(diffMs / 36e5);
|
|
371
|
-
const diffDays = Math.floor(diffMs / 864e5);
|
|
372
|
-
if (diffMins < 1) return "just now";
|
|
373
|
-
if (diffMins < 60) return `${diffMins} mins ago`;
|
|
374
|
-
if (diffHours < 24) return `${diffHours} hrs ago`;
|
|
375
|
-
if (diffDays < 30) return `${diffDays} days ago`;
|
|
376
|
-
if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;
|
|
377
|
-
return `${Math.floor(diffDays / 365)} years ago`;
|
|
378
|
-
}
|
|
379
|
-
var LOCALE_LIST = ["vi", "en"];
|
|
380
|
-
function isPathnameMissingLocale(pathname) {
|
|
381
|
-
return !LOCALE_LIST.some((locale) => pathname.startsWith(`/${locale}`));
|
|
382
|
-
}
|
|
383
|
-
function getLocaleFromPathname(pathname) {
|
|
384
|
-
return LOCALE_LIST.find((locale) => pathname.startsWith(`/${locale}`));
|
|
385
|
-
}
|
|
386
|
-
function ensureLocalizedPathname(pathname, locale) {
|
|
387
|
-
if (!pathname || !locale)
|
|
388
|
-
throw new Error("Pathname or Locale cannot be empty");
|
|
389
|
-
return isPathnameMissingLocale(pathname) ? `${ensureWithPrefix(locale, "/")}${ensureWithPrefix(pathname, "/")}` : pathname;
|
|
390
|
-
}
|
|
391
|
-
function relocalizePathname(pathname, locale) {
|
|
392
|
-
if (!pathname || !locale)
|
|
393
|
-
throw new Error("Pathname or Locale cannot be empty");
|
|
394
|
-
const segments = pathname.split("/");
|
|
395
|
-
segments[1] = locale;
|
|
396
|
-
return segments.join("/");
|
|
397
|
-
}
|
|
398
|
-
var Logger = class {
|
|
399
|
-
log(level, message, context, error) {
|
|
400
|
-
const entry = {
|
|
401
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
402
|
-
level,
|
|
403
|
-
message,
|
|
404
|
-
context
|
|
405
|
-
};
|
|
406
|
-
if (error instanceof Error) {
|
|
407
|
-
entry.error = {
|
|
408
|
-
name: error.name,
|
|
409
|
-
message: error.message,
|
|
410
|
-
stack: error.stack
|
|
411
|
-
};
|
|
412
|
-
} else if (error) {
|
|
413
|
-
entry.error = error;
|
|
414
|
-
}
|
|
415
|
-
const logString = JSON.stringify(entry);
|
|
416
|
-
switch (level) {
|
|
417
|
-
case "error":
|
|
418
|
-
console.error(logString);
|
|
419
|
-
break;
|
|
420
|
-
case "warn":
|
|
421
|
-
console.warn(logString);
|
|
422
|
-
break;
|
|
423
|
-
case "debug":
|
|
424
|
-
if (process.env.NODE_ENV === "development") console.debug(logString);
|
|
425
|
-
break;
|
|
426
|
-
default:
|
|
427
|
-
console.log(logString);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
info(message, context) {
|
|
431
|
-
this.log("info", message, context);
|
|
432
|
-
}
|
|
433
|
-
warn(message, context) {
|
|
434
|
-
this.log("warn", message, context);
|
|
435
|
-
}
|
|
436
|
-
error(message, error, context) {
|
|
437
|
-
this.log("error", message, context, error);
|
|
438
|
-
}
|
|
439
|
-
debug(message, context) {
|
|
440
|
-
this.log("debug", message, context);
|
|
441
|
-
}
|
|
442
|
-
};
|
|
443
|
-
var logger = new Logger();
|
|
444
|
-
function shouldExcludeFromTabs(pathname) {
|
|
445
|
-
const excludePatterns = [
|
|
446
|
-
"/sign-in",
|
|
447
|
-
"/sign-out",
|
|
448
|
-
"/forgot-password",
|
|
449
|
-
"/new-password",
|
|
450
|
-
"/verify-email",
|
|
451
|
-
"/register",
|
|
452
|
-
"/unauthorized",
|
|
453
|
-
"/not-found",
|
|
454
|
-
"/maintenance",
|
|
455
|
-
"/coming-soon"
|
|
456
|
-
];
|
|
457
|
-
if (pathname.includes("/ui/") || pathname.includes("/colors") || pathname.includes("/typography"))
|
|
458
|
-
return true;
|
|
459
|
-
return excludePatterns.some((pattern) => pathname.includes(pattern));
|
|
460
|
-
}
|
|
461
|
-
function normalizePathname(pathname) {
|
|
462
|
-
return pathname.replace(/^\/[a-z]{2}(\/|$)/, "/") || "/";
|
|
463
|
-
}
|
|
464
|
-
function formatSegmentLabel(segment) {
|
|
465
|
-
return segment.replace(/[-_]+/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
|
|
466
|
-
}
|
|
467
|
-
function findRouteTitle(pathname, navigations) {
|
|
468
|
-
const result = findRouteInfo(pathname, navigations);
|
|
469
|
-
return result?.title || null;
|
|
470
|
-
}
|
|
471
|
-
function findRouteIcon(pathname, navigations) {
|
|
472
|
-
const result = findRouteInfo(pathname, navigations);
|
|
473
|
-
return result?.iconName || null;
|
|
474
|
-
}
|
|
475
|
-
function findRouteInfo(pathname, navigations) {
|
|
476
|
-
const normalizedPath = normalizePathname(pathname);
|
|
477
|
-
let exactMatch = null;
|
|
478
|
-
const prefixMatches = [];
|
|
479
|
-
function searchItems(items) {
|
|
480
|
-
if (!items) return;
|
|
481
|
-
for (const item of items) {
|
|
482
|
-
if ("href" in item && item.href) {
|
|
483
|
-
const itemPath = normalizePathname(item.href);
|
|
484
|
-
if (normalizedPath === itemPath) {
|
|
485
|
-
exactMatch = {
|
|
486
|
-
title: item.title,
|
|
487
|
-
iconName: "iconName" in item ? item.iconName : void 0
|
|
488
|
-
};
|
|
489
|
-
} else if (normalizedPath.startsWith(itemPath + "/")) {
|
|
490
|
-
prefixMatches.push({
|
|
491
|
-
itemPath,
|
|
492
|
-
routeInfo: {
|
|
493
|
-
title: item.title,
|
|
494
|
-
iconName: "iconName" in item ? item.iconName : void 0
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
if ("items" in item && item.items) searchItems(item.items);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
for (const nav of navigations) {
|
|
503
|
-
searchItems(nav.items);
|
|
504
|
-
if (exactMatch) return exactMatch;
|
|
505
|
-
}
|
|
506
|
-
if (prefixMatches.length > 0) {
|
|
507
|
-
prefixMatches.sort((a, b) => b.itemPath.length - a.itemPath.length);
|
|
508
|
-
return prefixMatches[0].routeInfo;
|
|
509
|
-
}
|
|
510
|
-
const segments = normalizedPath.split("/").filter(Boolean);
|
|
511
|
-
return segments.length > 0 ? { title: formatSegmentLabel(segments[segments.length - 1]) } : { title: "Home" };
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
exports.STATUS_ACTIVE = STATUS_ACTIVE;
|
|
515
|
-
exports.STATUS_COLORS = STATUS_COLORS;
|
|
516
|
-
exports.STATUS_INACTIVE = STATUS_INACTIVE;
|
|
517
|
-
exports.STATUS_OPTIONS = STATUS_OPTIONS;
|
|
518
|
-
exports.STATUS_VALUES = STATUS_VALUES;
|
|
519
|
-
exports.booleanToStatus = booleanToStatus;
|
|
520
|
-
exports.camelCaseToTitleCase = camelCaseToTitleCase;
|
|
521
|
-
exports.cn = cn;
|
|
522
|
-
exports.debounce = debounce;
|
|
523
|
-
exports.deepClone = deepClone;
|
|
524
|
-
exports.ensureLocalizedPathname = ensureLocalizedPathname;
|
|
525
|
-
exports.ensureRedirectPathname = ensureRedirectPathname;
|
|
526
|
-
exports.ensureWithPrefix = ensureWithPrefix;
|
|
527
|
-
exports.ensureWithSuffix = ensureWithSuffix;
|
|
528
|
-
exports.ensureWithoutPrefix = ensureWithoutPrefix;
|
|
529
|
-
exports.ensureWithoutSuffix = ensureWithoutSuffix;
|
|
530
|
-
exports.findRouteIcon = findRouteIcon;
|
|
531
|
-
exports.findRouteTitle = findRouteTitle;
|
|
532
|
-
exports.formatCurrency = formatCurrency;
|
|
533
|
-
exports.formatDate = formatDate;
|
|
534
|
-
exports.formatDateShort = formatDateShort;
|
|
535
|
-
exports.formatDateTime = formatDateTime;
|
|
536
|
-
exports.formatDateWithTime = formatDateWithTime;
|
|
537
|
-
exports.formatDistance = formatDistance;
|
|
538
|
-
exports.formatDuration = formatDuration;
|
|
539
|
-
exports.formatFileSize = formatFileSize;
|
|
540
|
-
exports.formatFileType = formatFileType;
|
|
541
|
-
exports.formatNumber = formatNumber;
|
|
542
|
-
exports.formatNumberToCompact = formatNumberToCompact;
|
|
543
|
-
exports.formatOverviewCardValue = formatOverviewCardValue;
|
|
544
|
-
exports.formatPercent = formatPercent;
|
|
545
|
-
exports.formatRelativeDate = formatRelativeDate;
|
|
546
|
-
exports.formatTime = formatTime;
|
|
547
|
-
exports.formatUnreadCount = formatUnreadCount;
|
|
548
|
-
exports.generateId = generateId;
|
|
549
|
-
exports.getCreditCardBrandName = getCreditCardBrandName;
|
|
550
|
-
exports.getDictionaryValue = getDictionaryValue;
|
|
551
|
-
exports.getDiscountedPrice = getDiscountedPrice;
|
|
552
|
-
exports.getInitials = getInitials;
|
|
553
|
-
exports.getLocaleFromPathname = getLocaleFromPathname;
|
|
554
|
-
exports.isActivePathname = isActivePathname;
|
|
555
|
-
exports.isBeforeToday = isBeforeToday;
|
|
556
|
-
exports.isEmpty = isEmpty;
|
|
557
|
-
exports.isEven = isEven;
|
|
558
|
-
exports.isNonNegative = isNonNegative;
|
|
559
|
-
exports.isPathnameMissingLocale = isPathnameMissingLocale;
|
|
560
|
-
exports.isUrl = isUrl;
|
|
561
|
-
exports.logger = logger;
|
|
562
|
-
exports.normalizePathname = normalizePathname;
|
|
563
|
-
exports.ratingToPercentage = ratingToPercentage;
|
|
564
|
-
exports.readMoney = readMoney;
|
|
565
|
-
exports.relocalizePathname = relocalizePathname;
|
|
566
|
-
exports.remToPx = remToPx;
|
|
567
|
-
exports.shouldExcludeFromTabs = shouldExcludeFromTabs;
|
|
568
|
-
exports.slugify = slugify;
|
|
569
|
-
exports.statusToBoolean = statusToBoolean;
|
|
570
|
-
exports.timeToDate = timeToDate;
|
|
571
|
-
exports.titleCaseToCamelCase = titleCaseToCamelCase;
|
|
572
|
-
exports.wait = wait;
|
|
573
|
-
//# sourceMappingURL=index.js.map
|
|
574
|
-
//# sourceMappingURL=index.js.map
|