@underverse-ui/underverse 0.1.4 → 0.1.6
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 +59 -3
- package/dist/index.cjs +310 -339
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +283 -12
- package/dist/index.d.ts +283 -12
- package/dist/index.js +296 -326
- package/dist/index.js.map +1 -1
- package/package.json +12 -1
package/dist/index.js
CHANGED
|
@@ -2485,7 +2485,7 @@ var variantIcons = {
|
|
|
2485
2485
|
warning: /* @__PURE__ */ jsx18(WarningIcon, { className: "h-4 w-4 text-warning" }),
|
|
2486
2486
|
error: /* @__PURE__ */ jsx18(ErrorIcon, { className: "h-4 w-4 text-destructive" })
|
|
2487
2487
|
};
|
|
2488
|
-
var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions }) => {
|
|
2488
|
+
var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions, closeAriaLabel }) => {
|
|
2489
2489
|
const [open, setOpen] = useState13(true);
|
|
2490
2490
|
const t = useTranslations2("Common");
|
|
2491
2491
|
if (!open) return null;
|
|
@@ -2511,7 +2511,7 @@ var Alert = ({ title, description, variant = "default", className, icon, dismiss
|
|
|
2511
2511
|
{
|
|
2512
2512
|
onClick: handleClose,
|
|
2513
2513
|
className: "rounded-md p-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
2514
|
-
"aria-label": t("closeAlert"),
|
|
2514
|
+
"aria-label": closeAriaLabel || t("closeAlert"),
|
|
2515
2515
|
children: /* @__PURE__ */ jsx18(X6, { className: "h-4 w-4" })
|
|
2516
2516
|
}
|
|
2517
2517
|
)
|
|
@@ -3572,7 +3572,8 @@ var Pagination = ({
|
|
|
3572
3572
|
pageSize,
|
|
3573
3573
|
pageSizeOptions,
|
|
3574
3574
|
onPageSizeChange,
|
|
3575
|
-
totalItems
|
|
3575
|
+
totalItems,
|
|
3576
|
+
labels
|
|
3576
3577
|
}) => {
|
|
3577
3578
|
const t = useTranslations4("Pagination");
|
|
3578
3579
|
const createPageArray = () => {
|
|
@@ -3626,8 +3627,8 @@ var Pagination = ({
|
|
|
3626
3627
|
}
|
|
3627
3628
|
};
|
|
3628
3629
|
if (totalPages <= 1) return null;
|
|
3629
|
-
return /* @__PURE__ */ jsxs22("nav", { className: cn("flex flex-col gap-4", className), "aria-label": t("navigationLabel"), children: [
|
|
3630
|
-
showInfo && totalItems && /* @__PURE__ */ jsx24("div", { className: "text-sm text-muted-foreground text-center", children: t("showingResults", { startItem: startItem || 0, endItem: endItem || 0, totalItems }) }),
|
|
3630
|
+
return /* @__PURE__ */ jsxs22("nav", { className: cn("flex flex-col gap-4", className), "aria-label": labels?.navigationLabel || t("navigationLabel"), children: [
|
|
3631
|
+
showInfo && totalItems && /* @__PURE__ */ jsx24("div", { className: "text-sm text-muted-foreground text-center", children: labels?.showingResults ? labels.showingResults({ startItem: startItem || 0, endItem: endItem || 0, totalItems }) : t("showingResults", { startItem: startItem || 0, endItem: endItem || 0, totalItems }) }),
|
|
3631
3632
|
/* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-center gap-1", children: [
|
|
3632
3633
|
showFirstLast && /* @__PURE__ */ jsx24(
|
|
3633
3634
|
Button_default,
|
|
@@ -3638,8 +3639,8 @@ var Pagination = ({
|
|
|
3638
3639
|
onClick: () => onChange(1),
|
|
3639
3640
|
disabled: disabled || page === 1,
|
|
3640
3641
|
className: "hidden sm:flex",
|
|
3641
|
-
title: t("firstPage"),
|
|
3642
|
-
"aria-label": t("firstPage"),
|
|
3642
|
+
title: labels?.firstPage || t("firstPage"),
|
|
3643
|
+
"aria-label": labels?.firstPage || t("firstPage"),
|
|
3643
3644
|
"aria-disabled": disabled || page === 1
|
|
3644
3645
|
}
|
|
3645
3646
|
),
|
|
@@ -3651,10 +3652,10 @@ var Pagination = ({
|
|
|
3651
3652
|
icon: ChevronLeft,
|
|
3652
3653
|
onClick: () => onChange(Math.max(1, page - 1)),
|
|
3653
3654
|
disabled: disabled || page === 1,
|
|
3654
|
-
title: t("previousPage"),
|
|
3655
|
-
"aria-label": t("previousPage"),
|
|
3655
|
+
title: labels?.previousPage || t("previousPage"),
|
|
3656
|
+
"aria-label": labels?.previousPage || t("previousPage"),
|
|
3656
3657
|
"aria-disabled": disabled || page === 1,
|
|
3657
|
-
children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: t("previous") })
|
|
3658
|
+
children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.previous || t("previous") })
|
|
3658
3659
|
}
|
|
3659
3660
|
),
|
|
3660
3661
|
showPageNumbers && createPageArray().map((p, i) => {
|
|
@@ -3671,7 +3672,7 @@ var Pagination = ({
|
|
|
3671
3672
|
onClick: () => onChange(pageNumber),
|
|
3672
3673
|
disabled,
|
|
3673
3674
|
className: cn("min-w-[2.5rem]", isActive && "font-semibold"),
|
|
3674
|
-
"aria-label": t("pageNumber", { page: pageNumber }),
|
|
3675
|
+
"aria-label": labels?.pageNumber ? labels.pageNumber(pageNumber) : t("pageNumber", { page: pageNumber }),
|
|
3675
3676
|
"aria-current": isActive ? "page" : void 0,
|
|
3676
3677
|
children: pageNumber
|
|
3677
3678
|
},
|
|
@@ -3686,10 +3687,10 @@ var Pagination = ({
|
|
|
3686
3687
|
iconRight: ChevronRight2,
|
|
3687
3688
|
onClick: () => onChange(Math.min(totalPages, page + 1)),
|
|
3688
3689
|
disabled: disabled || page === totalPages,
|
|
3689
|
-
title: t("nextPage"),
|
|
3690
|
-
"aria-label": t("nextPage"),
|
|
3690
|
+
title: labels?.nextPage || t("nextPage"),
|
|
3691
|
+
"aria-label": labels?.nextPage || t("nextPage"),
|
|
3691
3692
|
"aria-disabled": disabled || page === totalPages,
|
|
3692
|
-
children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: t("next") })
|
|
3693
|
+
children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.next || t("next") })
|
|
3693
3694
|
}
|
|
3694
3695
|
),
|
|
3695
3696
|
showFirstLast && /* @__PURE__ */ jsx24(
|
|
@@ -3701,15 +3702,15 @@ var Pagination = ({
|
|
|
3701
3702
|
onClick: () => onChange(totalPages),
|
|
3702
3703
|
disabled: disabled || page === totalPages,
|
|
3703
3704
|
className: "hidden sm:flex",
|
|
3704
|
-
title: t("lastPage"),
|
|
3705
|
-
"aria-label": t("lastPage"),
|
|
3705
|
+
title: labels?.lastPage || t("lastPage"),
|
|
3706
|
+
"aria-label": labels?.lastPage || t("lastPage"),
|
|
3706
3707
|
"aria-disabled": disabled || page === totalPages
|
|
3707
3708
|
}
|
|
3708
3709
|
)
|
|
3709
3710
|
] }),
|
|
3710
3711
|
pageSizeOptions && onPageSizeChange && /* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-center gap-2 text-sm", children: [
|
|
3711
3712
|
/* @__PURE__ */ jsxs22("span", { className: "text-muted-foreground", children: [
|
|
3712
|
-
t("itemsPerPage"),
|
|
3713
|
+
labels?.itemsPerPage || t("itemsPerPage"),
|
|
3713
3714
|
":"
|
|
3714
3715
|
] }),
|
|
3715
3716
|
/* @__PURE__ */ jsx24("div", { className: "w-20", children: /* @__PURE__ */ jsx24(
|
|
@@ -3719,8 +3720,8 @@ var Pagination = ({
|
|
|
3719
3720
|
value: pageSize?.toString() || "10",
|
|
3720
3721
|
onChange: handlePageSizeChange,
|
|
3721
3722
|
placeholder: "10",
|
|
3722
|
-
searchPlaceholder: t("search"),
|
|
3723
|
-
emptyText: t("noOptions"),
|
|
3723
|
+
searchPlaceholder: labels?.search || t("search"),
|
|
3724
|
+
emptyText: labels?.noOptions || t("noOptions"),
|
|
3724
3725
|
disabled
|
|
3725
3726
|
}
|
|
3726
3727
|
) })
|
|
@@ -3976,7 +3977,10 @@ var DatePicker = ({
|
|
|
3976
3977
|
disabled = false,
|
|
3977
3978
|
size = "md",
|
|
3978
3979
|
label,
|
|
3979
|
-
required
|
|
3980
|
+
required,
|
|
3981
|
+
todayLabel,
|
|
3982
|
+
clearLabel,
|
|
3983
|
+
weekdayLabels
|
|
3980
3984
|
}) => {
|
|
3981
3985
|
const t = useTranslations5("DatePicker");
|
|
3982
3986
|
const locale = useLocale();
|
|
@@ -4117,10 +4121,10 @@ var DatePicker = ({
|
|
|
4117
4121
|
children: [
|
|
4118
4122
|
/* @__PURE__ */ jsxs23("div", { className: "flex items-center justify-between mb-4", children: [
|
|
4119
4123
|
/* @__PURE__ */ jsx27(Button_default, { variant: "ghost", size: "sm", onClick: () => navigateMonth("prev"), className: "p-1 h-auto", children: /* @__PURE__ */ jsx27(ChevronLeft2, { className: "h-4 w-4" }) }),
|
|
4120
|
-
/* @__PURE__ */ jsx27("div", { className: "text-sm font-semibold", children: viewDate.toLocaleDateString(
|
|
4124
|
+
/* @__PURE__ */ jsx27("div", { className: "text-sm font-semibold", children: viewDate.toLocaleDateString("en-US", { month: "long", year: "numeric" }) }),
|
|
4121
4125
|
/* @__PURE__ */ jsx27(Button_default, { variant: "ghost", size: "sm", onClick: () => navigateMonth("next"), className: "p-1 h-auto", children: /* @__PURE__ */ jsx27(ChevronRight3, { className: "h-4 w-4" }) })
|
|
4122
4126
|
] }),
|
|
4123
|
-
/* @__PURE__ */ jsx27("div", { className: cn("grid grid-cols-7 gap-1", size === "sm" ? "mb-1" : "mb-2"), children: (
|
|
4127
|
+
/* @__PURE__ */ jsx27("div", { className: cn("grid grid-cols-7 gap-1", size === "sm" ? "mb-1" : "mb-2"), children: (weekdayLabels || ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]).map((day) => /* @__PURE__ */ jsx27("div", { className: cn("text-muted-foreground text-center font-medium", size === "sm" ? "text-[10px] py-0.5" : "text-xs py-1"), children: day }, day)) }),
|
|
4124
4128
|
/* @__PURE__ */ jsx27("div", { className: "grid grid-cols-7 gap-1", children: renderCalendar() })
|
|
4125
4129
|
]
|
|
4126
4130
|
}
|
|
@@ -5347,199 +5351,31 @@ function ImageUpload({
|
|
|
5347
5351
|
] });
|
|
5348
5352
|
}
|
|
5349
5353
|
|
|
5350
|
-
// ../../components/ui/ProductImageUpload.tsx
|
|
5351
|
-
import { useState as useState25, useRef as useRef10 } from "react";
|
|
5352
|
-
import Image2 from "next/image";
|
|
5353
|
-
import { Upload as Upload2, X as X9, Image as ImageIcon2 } from "lucide-react";
|
|
5354
|
-
import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
5355
|
-
var ProductImageUpload = ({ value, onChange, disabled = false, className }) => {
|
|
5356
|
-
const [uploading, setUploading] = useState25(false);
|
|
5357
|
-
const [error, setError] = useState25(null);
|
|
5358
|
-
const [isDragging, setIsDragging] = useState25(false);
|
|
5359
|
-
const fileInputRef = useRef10(null);
|
|
5360
|
-
const handleFileChange = async (e) => {
|
|
5361
|
-
const file = e.target.files?.[0];
|
|
5362
|
-
if (!file) return;
|
|
5363
|
-
await uploadFile(file);
|
|
5364
|
-
};
|
|
5365
|
-
const uploadFile = async (file) => {
|
|
5366
|
-
const acceptedFormats = ["image/jpeg", "image/png", "image/webp", "image/gif"];
|
|
5367
|
-
if (!acceptedFormats.includes(file.type)) {
|
|
5368
|
-
setError(`\u0110\u1ECBnh d\u1EA1ng kh\xF4ng h\u1ED7 tr\u1EE3. Ch\u1EC9 ch\u1EA5p nh\u1EADn: JPG, PNG, WEBP, GIF`);
|
|
5369
|
-
return;
|
|
5370
|
-
}
|
|
5371
|
-
const maxSizeBytes = 10 * 1024 * 1024;
|
|
5372
|
-
if (file.size > maxSizeBytes) {
|
|
5373
|
-
setError(`File qu\xE1 l\u1EDBn. K\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a: 10MB`);
|
|
5374
|
-
return;
|
|
5375
|
-
}
|
|
5376
|
-
setError(null);
|
|
5377
|
-
setUploading(true);
|
|
5378
|
-
try {
|
|
5379
|
-
const formData = new FormData();
|
|
5380
|
-
formData.append("file", file);
|
|
5381
|
-
const response = await fetch("/api/upload/product-image", {
|
|
5382
|
-
method: "POST",
|
|
5383
|
-
body: formData,
|
|
5384
|
-
credentials: "include"
|
|
5385
|
-
});
|
|
5386
|
-
if (!response.ok) {
|
|
5387
|
-
throw new Error("Upload failed");
|
|
5388
|
-
}
|
|
5389
|
-
const result = await response.json();
|
|
5390
|
-
if (result.success && result.data?.path) {
|
|
5391
|
-
onChange(result.data.path);
|
|
5392
|
-
} else {
|
|
5393
|
-
throw new Error(result.message || "Upload failed");
|
|
5394
|
-
}
|
|
5395
|
-
} catch (err) {
|
|
5396
|
-
setError(err.message || "Kh\xF4ng th\u1EC3 upload \u1EA3nh");
|
|
5397
|
-
console.error("Upload error:", err);
|
|
5398
|
-
} finally {
|
|
5399
|
-
setUploading(false);
|
|
5400
|
-
if (fileInputRef.current) {
|
|
5401
|
-
fileInputRef.current.value = "";
|
|
5402
|
-
}
|
|
5403
|
-
}
|
|
5404
|
-
};
|
|
5405
|
-
const handleDragOver = (e) => {
|
|
5406
|
-
e.preventDefault();
|
|
5407
|
-
e.stopPropagation();
|
|
5408
|
-
if (!disabled && !uploading) {
|
|
5409
|
-
setIsDragging(true);
|
|
5410
|
-
}
|
|
5411
|
-
};
|
|
5412
|
-
const handleDragLeave = (e) => {
|
|
5413
|
-
e.preventDefault();
|
|
5414
|
-
e.stopPropagation();
|
|
5415
|
-
setIsDragging(false);
|
|
5416
|
-
};
|
|
5417
|
-
const handleDrop = async (e) => {
|
|
5418
|
-
e.preventDefault();
|
|
5419
|
-
e.stopPropagation();
|
|
5420
|
-
setIsDragging(false);
|
|
5421
|
-
if (disabled || uploading) return;
|
|
5422
|
-
const file = e.dataTransfer.files?.[0];
|
|
5423
|
-
if (file) {
|
|
5424
|
-
await uploadFile(file);
|
|
5425
|
-
}
|
|
5426
|
-
};
|
|
5427
|
-
const handleRemove = () => {
|
|
5428
|
-
onChange("");
|
|
5429
|
-
setError(null);
|
|
5430
|
-
};
|
|
5431
|
-
const handleClickUpload = () => {
|
|
5432
|
-
fileInputRef.current?.click();
|
|
5433
|
-
};
|
|
5434
|
-
return /* @__PURE__ */ jsxs29("div", { className: cn("space-y-4", className), children: [
|
|
5435
|
-
/* @__PURE__ */ jsx34(
|
|
5436
|
-
"input",
|
|
5437
|
-
{
|
|
5438
|
-
ref: fileInputRef,
|
|
5439
|
-
type: "file",
|
|
5440
|
-
accept: "image/jpeg,image/png,image/webp,image/gif",
|
|
5441
|
-
onChange: handleFileChange,
|
|
5442
|
-
disabled: disabled || uploading,
|
|
5443
|
-
className: "hidden"
|
|
5444
|
-
}
|
|
5445
|
-
),
|
|
5446
|
-
value ? /* @__PURE__ */ jsxs29("div", { className: "space-y-4", children: [
|
|
5447
|
-
/* @__PURE__ */ jsxs29("div", { className: "relative w-full aspect-square max-w-md rounded-xl overflow-hidden border-2 border-border bg-muted shadow-lg group", children: [
|
|
5448
|
-
/* @__PURE__ */ jsx34(
|
|
5449
|
-
Image2,
|
|
5450
|
-
{
|
|
5451
|
-
src: value,
|
|
5452
|
-
alt: "Product image",
|
|
5453
|
-
fill: true,
|
|
5454
|
-
className: "object-cover transition-transform duration-300 group-hover:scale-105",
|
|
5455
|
-
unoptimized: true
|
|
5456
|
-
}
|
|
5457
|
-
),
|
|
5458
|
-
/* @__PURE__ */ jsx34("div", { className: "absolute inset-0 bg-foreground/0 group-hover:bg-foreground/30 transition-colors duration-300 flex items-center justify-center opacity-0 group-hover:opacity-100", children: /* @__PURE__ */ jsxs29("div", { className: "flex gap-2", children: [
|
|
5459
|
-
/* @__PURE__ */ jsxs29(Button_default, { type: "button", variant: "default", size: "sm", onClick: handleClickUpload, disabled: disabled || uploading, children: [
|
|
5460
|
-
/* @__PURE__ */ jsx34(Upload2, { className: "w-4 h-4 mr-2" }),
|
|
5461
|
-
"Thay \u0111\u1ED5i"
|
|
5462
|
-
] }),
|
|
5463
|
-
/* @__PURE__ */ jsxs29(Button_default, { type: "button", variant: "danger", size: "sm", onClick: handleRemove, disabled: disabled || uploading, children: [
|
|
5464
|
-
/* @__PURE__ */ jsx34(X9, { className: "w-4 h-4 mr-2" }),
|
|
5465
|
-
"X\xF3a"
|
|
5466
|
-
] })
|
|
5467
|
-
] }) })
|
|
5468
|
-
] }),
|
|
5469
|
-
/* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
5470
|
-
/* @__PURE__ */ jsx34(ImageIcon2, { className: "w-4 h-4" }),
|
|
5471
|
-
/* @__PURE__ */ jsx34("span", { children: "\u1EA2nh s\u1EA3n ph\u1EA9m \u0111\xE3 t\u1EA3i l\xEAn th\xE0nh c\xF4ng" })
|
|
5472
|
-
] })
|
|
5473
|
-
] }) : /* @__PURE__ */ jsx34(
|
|
5474
|
-
"div",
|
|
5475
|
-
{
|
|
5476
|
-
className: cn(
|
|
5477
|
-
"w-full aspect-square max-w-md rounded-xl border-2 border-dashed transition-all duration-200",
|
|
5478
|
-
"bg-gradient-to-br from-muted/30 to-muted/10",
|
|
5479
|
-
"flex flex-col items-center justify-center cursor-pointer",
|
|
5480
|
-
"hover:border-primary/60 hover:bg-primary/5 hover:shadow-lg hover:scale-[1.02]",
|
|
5481
|
-
isDragging && "border-primary bg-primary/10 shadow-lg scale-[1.02]",
|
|
5482
|
-
(disabled || uploading) && "opacity-50 cursor-not-allowed hover:scale-100",
|
|
5483
|
-
!isDragging && !disabled && !uploading && "border-border"
|
|
5484
|
-
),
|
|
5485
|
-
onClick: !disabled && !uploading ? handleClickUpload : void 0,
|
|
5486
|
-
onDragOver: handleDragOver,
|
|
5487
|
-
onDragLeave: handleDragLeave,
|
|
5488
|
-
onDrop: handleDrop,
|
|
5489
|
-
children: /* @__PURE__ */ jsxs29("div", { className: "flex flex-col items-center justify-center p-8 text-center", children: [
|
|
5490
|
-
/* @__PURE__ */ jsx34(
|
|
5491
|
-
"div",
|
|
5492
|
-
{
|
|
5493
|
-
className: cn(
|
|
5494
|
-
"w-20 h-20 rounded-full flex items-center justify-center mb-4 transition-colors",
|
|
5495
|
-
isDragging ? "bg-primary/20" : "bg-primary/10"
|
|
5496
|
-
),
|
|
5497
|
-
children: /* @__PURE__ */ jsx34(Upload2, { className: cn("w-10 h-10 transition-colors", isDragging ? "text-primary" : "text-muted-foreground") })
|
|
5498
|
-
}
|
|
5499
|
-
),
|
|
5500
|
-
/* @__PURE__ */ jsx34("h3", { className: "text-lg font-semibold text-foreground mb-2", children: uploading ? "\u0110ang t\u1EA3i l\xEAn..." : isDragging ? "Th\u1EA3 \u1EA3nh v\xE0o \u0111\xE2y" : "T\u1EA3i \u1EA3nh s\u1EA3n ph\u1EA9m" }),
|
|
5501
|
-
/* @__PURE__ */ jsx34("p", { className: "text-sm text-muted-foreground mb-3 max-w-xs", children: uploading ? "Vui l\xF2ng \u0111\u1EE3i trong gi\xE2y l\xE1t" : "Click \u0111\u1EC3 ch\u1ECDn ho\u1EB7c k\xE9o th\u1EA3 \u1EA3nh v\xE0o \u0111\xE2y" }),
|
|
5502
|
-
/* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mt-2", children: [
|
|
5503
|
-
/* @__PURE__ */ jsx34("div", { className: "px-3 py-1.5 bg-muted rounded-full", children: "JPG, PNG, WEBP, GIF" }),
|
|
5504
|
-
/* @__PURE__ */ jsx34("div", { className: "px-3 py-1.5 bg-muted rounded-full", children: "T\u1ED1i \u0111a 10MB" })
|
|
5505
|
-
] }),
|
|
5506
|
-
uploading && /* @__PURE__ */ jsx34("div", { className: "mt-4 w-48 h-1.5 bg-muted rounded-full overflow-hidden", children: /* @__PURE__ */ jsx34("div", { className: "h-full bg-primary rounded-full animate-[progress_1s_ease-in-out_infinite]" }) })
|
|
5507
|
-
] })
|
|
5508
|
-
}
|
|
5509
|
-
),
|
|
5510
|
-
error && /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 p-3 rounded-lg bg-destructive/10 border border-destructive/20", children: [
|
|
5511
|
-
/* @__PURE__ */ jsx34(X9, { className: "w-4 h-4 text-destructive flex-shrink-0" }),
|
|
5512
|
-
/* @__PURE__ */ jsx34("p", { className: "text-sm text-destructive", children: error })
|
|
5513
|
-
] })
|
|
5514
|
-
] });
|
|
5515
|
-
};
|
|
5516
|
-
var ProductImageUpload_default = ProductImageUpload;
|
|
5517
|
-
|
|
5518
5354
|
// ../../components/ui/Carousel.tsx
|
|
5519
|
-
import * as
|
|
5355
|
+
import * as React27 from "react";
|
|
5520
5356
|
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
5521
|
-
import { Fragment as Fragment8, jsx as
|
|
5357
|
+
import { Fragment as Fragment8, jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
5522
5358
|
function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
|
|
5523
|
-
const [currentIndex, setCurrentIndex] =
|
|
5524
|
-
const totalSlides =
|
|
5525
|
-
const [isPaused, setIsPaused] =
|
|
5526
|
-
const scrollPrev =
|
|
5359
|
+
const [currentIndex, setCurrentIndex] = React27.useState(0);
|
|
5360
|
+
const totalSlides = React27.Children.count(children);
|
|
5361
|
+
const [isPaused, setIsPaused] = React27.useState(false);
|
|
5362
|
+
const scrollPrev = React27.useCallback(() => {
|
|
5527
5363
|
setCurrentIndex((prev) => prev > 0 ? prev - 1 : totalSlides - 1);
|
|
5528
5364
|
}, [totalSlides]);
|
|
5529
|
-
const scrollNext =
|
|
5365
|
+
const scrollNext = React27.useCallback(() => {
|
|
5530
5366
|
setCurrentIndex((prev) => prev < totalSlides - 1 ? prev + 1 : 0);
|
|
5531
5367
|
}, [totalSlides]);
|
|
5532
|
-
|
|
5368
|
+
React27.useEffect(() => {
|
|
5533
5369
|
if (!autoScroll || isPaused || totalSlides <= 1) return;
|
|
5534
5370
|
const interval = setInterval(() => {
|
|
5535
5371
|
scrollNext();
|
|
5536
5372
|
}, autoScrollInterval);
|
|
5537
5373
|
return () => clearInterval(interval);
|
|
5538
5374
|
}, [autoScroll, isPaused, totalSlides, autoScrollInterval, scrollNext]);
|
|
5539
|
-
return /* @__PURE__ */
|
|
5540
|
-
/* @__PURE__ */
|
|
5541
|
-
totalSlides > 1 && /* @__PURE__ */
|
|
5542
|
-
/* @__PURE__ */
|
|
5375
|
+
return /* @__PURE__ */ jsxs29("div", { className: "relative w-full overflow-hidden", onMouseEnter: () => setIsPaused(true), onMouseLeave: () => setIsPaused(false), children: [
|
|
5376
|
+
/* @__PURE__ */ jsx34("div", { className: "flex transition-transform duration-500 ease-in-out", style: { transform: `translateX(-${currentIndex * 100}%)` }, children: React27.Children.map(children, (child, idx) => /* @__PURE__ */ jsx34("div", { className: "flex-shrink-0 w-full h-full", children: child }, idx)) }),
|
|
5377
|
+
totalSlides > 1 && /* @__PURE__ */ jsxs29(Fragment8, { children: [
|
|
5378
|
+
/* @__PURE__ */ jsx34(
|
|
5543
5379
|
Button_default,
|
|
5544
5380
|
{
|
|
5545
5381
|
onClick: scrollPrev,
|
|
@@ -5549,7 +5385,7 @@ function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
|
|
|
5549
5385
|
className: "absolute left-4 top-1/2 -translate-y-1/2 hover:-translate-y-1/2 z-10 rounded-full will-change-transform bg-background/80 hover:bg-background border-border/50 hover:border-border text-foreground"
|
|
5550
5386
|
}
|
|
5551
5387
|
),
|
|
5552
|
-
/* @__PURE__ */
|
|
5388
|
+
/* @__PURE__ */ jsx34(
|
|
5553
5389
|
Button_default,
|
|
5554
5390
|
{
|
|
5555
5391
|
onClick: scrollNext,
|
|
@@ -5560,7 +5396,7 @@ function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
|
|
|
5560
5396
|
}
|
|
5561
5397
|
)
|
|
5562
5398
|
] }),
|
|
5563
|
-
totalSlides > 1 && /* @__PURE__ */
|
|
5399
|
+
totalSlides > 1 && /* @__PURE__ */ jsx34("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-2", children: Array.from({ length: totalSlides }, (_, idx) => /* @__PURE__ */ jsx34(
|
|
5564
5400
|
"button",
|
|
5565
5401
|
{
|
|
5566
5402
|
onClick: () => setCurrentIndex(idx),
|
|
@@ -5573,22 +5409,22 @@ function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
|
|
|
5573
5409
|
}
|
|
5574
5410
|
|
|
5575
5411
|
// ../../components/ui/ClientOnly.tsx
|
|
5576
|
-
import { useEffect as useEffect15, useState as
|
|
5577
|
-
import { Fragment as Fragment9, jsx as
|
|
5412
|
+
import { useEffect as useEffect15, useState as useState26 } from "react";
|
|
5413
|
+
import { Fragment as Fragment9, jsx as jsx35 } from "react/jsx-runtime";
|
|
5578
5414
|
function ClientOnly({ children, fallback = null }) {
|
|
5579
|
-
const [hasMounted, setHasMounted] =
|
|
5415
|
+
const [hasMounted, setHasMounted] = useState26(false);
|
|
5580
5416
|
useEffect15(() => {
|
|
5581
5417
|
setHasMounted(true);
|
|
5582
5418
|
}, []);
|
|
5583
5419
|
if (!hasMounted) {
|
|
5584
|
-
return /* @__PURE__ */
|
|
5420
|
+
return /* @__PURE__ */ jsx35(Fragment9, { children: fallback });
|
|
5585
5421
|
}
|
|
5586
|
-
return /* @__PURE__ */
|
|
5422
|
+
return /* @__PURE__ */ jsx35(Fragment9, { children });
|
|
5587
5423
|
}
|
|
5588
5424
|
|
|
5589
5425
|
// ../../components/ui/Loading.tsx
|
|
5590
5426
|
import { Activity as Activity3 } from "lucide-react";
|
|
5591
|
-
import { jsx as
|
|
5427
|
+
import { jsx as jsx36, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
5592
5428
|
var LoadingSpinner = ({
|
|
5593
5429
|
size = "md",
|
|
5594
5430
|
className,
|
|
@@ -5604,7 +5440,7 @@ var LoadingSpinner = ({
|
|
|
5604
5440
|
foreground: "text-foreground",
|
|
5605
5441
|
muted: "text-muted-foreground"
|
|
5606
5442
|
};
|
|
5607
|
-
return /* @__PURE__ */
|
|
5443
|
+
return /* @__PURE__ */ jsx36(
|
|
5608
5444
|
Activity3,
|
|
5609
5445
|
{
|
|
5610
5446
|
className: cn(
|
|
@@ -5625,7 +5461,7 @@ var LoadingDots = ({
|
|
|
5625
5461
|
foreground: "bg-foreground",
|
|
5626
5462
|
muted: "bg-muted-foreground"
|
|
5627
5463
|
};
|
|
5628
|
-
return /* @__PURE__ */
|
|
5464
|
+
return /* @__PURE__ */ jsx36("div", { className: cn("flex items-center space-x-1", className), children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx36(
|
|
5629
5465
|
"div",
|
|
5630
5466
|
{
|
|
5631
5467
|
className: cn(
|
|
@@ -5647,7 +5483,7 @@ var LoadingBar = ({
|
|
|
5647
5483
|
label
|
|
5648
5484
|
}) => {
|
|
5649
5485
|
const pct = progress ? Math.min(Math.max(progress, 0), 100) : void 0;
|
|
5650
|
-
return /* @__PURE__ */
|
|
5486
|
+
return /* @__PURE__ */ jsx36(
|
|
5651
5487
|
"div",
|
|
5652
5488
|
{
|
|
5653
5489
|
className: cn("w-full bg-muted rounded-full h-2", className),
|
|
@@ -5656,7 +5492,7 @@ var LoadingBar = ({
|
|
|
5656
5492
|
"aria-valuemax": pct === void 0 ? void 0 : 100,
|
|
5657
5493
|
"aria-valuenow": pct === void 0 ? void 0 : Math.round(pct),
|
|
5658
5494
|
"aria-label": label || "Loading",
|
|
5659
|
-
children: /* @__PURE__ */
|
|
5495
|
+
children: /* @__PURE__ */ jsx36(
|
|
5660
5496
|
"div",
|
|
5661
5497
|
{
|
|
5662
5498
|
className: cn(
|
|
@@ -5673,10 +5509,10 @@ var LoadingBar = ({
|
|
|
5673
5509
|
};
|
|
5674
5510
|
|
|
5675
5511
|
// ../../components/ui/Table.tsx
|
|
5676
|
-
import
|
|
5677
|
-
import { jsx as
|
|
5678
|
-
var Table =
|
|
5679
|
-
({ className, containerClassName, ...props }, ref) => /* @__PURE__ */
|
|
5512
|
+
import React28 from "react";
|
|
5513
|
+
import { jsx as jsx37, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
5514
|
+
var Table = React28.forwardRef(
|
|
5515
|
+
({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5680
5516
|
"div",
|
|
5681
5517
|
{
|
|
5682
5518
|
className: cn(
|
|
@@ -5686,7 +5522,7 @@ var Table = React29.forwardRef(
|
|
|
5686
5522
|
"backdrop-blur-sm transition-all duration-300",
|
|
5687
5523
|
containerClassName
|
|
5688
5524
|
),
|
|
5689
|
-
children: /* @__PURE__ */
|
|
5525
|
+
children: /* @__PURE__ */ jsx37(
|
|
5690
5526
|
"table",
|
|
5691
5527
|
{
|
|
5692
5528
|
ref,
|
|
@@ -5698,8 +5534,8 @@ var Table = React29.forwardRef(
|
|
|
5698
5534
|
)
|
|
5699
5535
|
);
|
|
5700
5536
|
Table.displayName = "Table";
|
|
5701
|
-
var TableHeader =
|
|
5702
|
-
({ className, children, filterRow, ...props }, ref) => /* @__PURE__ */
|
|
5537
|
+
var TableHeader = React28.forwardRef(
|
|
5538
|
+
({ className, children, filterRow, ...props }, ref) => /* @__PURE__ */ jsxs31(
|
|
5703
5539
|
"thead",
|
|
5704
5540
|
{
|
|
5705
5541
|
ref,
|
|
@@ -5717,7 +5553,7 @@ var TableHeader = React29.forwardRef(
|
|
|
5717
5553
|
)
|
|
5718
5554
|
);
|
|
5719
5555
|
TableHeader.displayName = "TableHeader";
|
|
5720
|
-
var TableBody =
|
|
5556
|
+
var TableBody = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5721
5557
|
"tbody",
|
|
5722
5558
|
{
|
|
5723
5559
|
ref,
|
|
@@ -5726,7 +5562,7 @@ var TableBody = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE_
|
|
|
5726
5562
|
}
|
|
5727
5563
|
));
|
|
5728
5564
|
TableBody.displayName = "TableBody";
|
|
5729
|
-
var TableFooter =
|
|
5565
|
+
var TableFooter = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5730
5566
|
"tfoot",
|
|
5731
5567
|
{
|
|
5732
5568
|
ref,
|
|
@@ -5738,7 +5574,7 @@ var TableFooter = React29.forwardRef(({ className, ...props }, ref) => /* @__PUR
|
|
|
5738
5574
|
}
|
|
5739
5575
|
));
|
|
5740
5576
|
TableFooter.displayName = "TableFooter";
|
|
5741
|
-
var TableRow =
|
|
5577
|
+
var TableRow = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5742
5578
|
"tr",
|
|
5743
5579
|
{
|
|
5744
5580
|
ref,
|
|
@@ -5752,7 +5588,7 @@ var TableRow = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
5752
5588
|
}
|
|
5753
5589
|
));
|
|
5754
5590
|
TableRow.displayName = "TableRow";
|
|
5755
|
-
var TableHead =
|
|
5591
|
+
var TableHead = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5756
5592
|
"th",
|
|
5757
5593
|
{
|
|
5758
5594
|
ref,
|
|
@@ -5764,7 +5600,7 @@ var TableHead = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE_
|
|
|
5764
5600
|
}
|
|
5765
5601
|
));
|
|
5766
5602
|
TableHead.displayName = "TableHead";
|
|
5767
|
-
var TableCell =
|
|
5603
|
+
var TableCell = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5768
5604
|
"td",
|
|
5769
5605
|
{
|
|
5770
5606
|
ref,
|
|
@@ -5773,7 +5609,7 @@ var TableCell = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE_
|
|
|
5773
5609
|
}
|
|
5774
5610
|
));
|
|
5775
5611
|
TableCell.displayName = "TableCell";
|
|
5776
|
-
var TableCaption =
|
|
5612
|
+
var TableCaption = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
|
|
5777
5613
|
"caption",
|
|
5778
5614
|
{
|
|
5779
5615
|
ref,
|
|
@@ -5785,12 +5621,12 @@ TableCaption.displayName = "TableCaption";
|
|
|
5785
5621
|
|
|
5786
5622
|
// ../../components/ui/DataTable.tsx
|
|
5787
5623
|
import { Filter as FilterIcon } from "lucide-react";
|
|
5788
|
-
import
|
|
5624
|
+
import React29 from "react";
|
|
5789
5625
|
import { useTranslations as useTranslations7 } from "next-intl";
|
|
5790
|
-
import { jsx as
|
|
5626
|
+
import { jsx as jsx38, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
5791
5627
|
function useDebounced(value, delay = 300) {
|
|
5792
|
-
const [debounced, setDebounced] =
|
|
5793
|
-
|
|
5628
|
+
const [debounced, setDebounced] = React29.useState(value);
|
|
5629
|
+
React29.useEffect(() => {
|
|
5794
5630
|
const id = setTimeout(() => setDebounced(value), delay);
|
|
5795
5631
|
return () => clearTimeout(id);
|
|
5796
5632
|
}, [value, delay]);
|
|
@@ -5811,17 +5647,18 @@ function DataTable({
|
|
|
5811
5647
|
enableDensityToggle = true,
|
|
5812
5648
|
striped = true,
|
|
5813
5649
|
// Mặc định bật màu nền sẽn kẽ cho các dòng
|
|
5814
|
-
className
|
|
5650
|
+
className,
|
|
5651
|
+
labels
|
|
5815
5652
|
}) {
|
|
5816
5653
|
const t = useTranslations7("Common");
|
|
5817
|
-
const [visibleCols, setVisibleCols] =
|
|
5818
|
-
const [filters, setFilters] =
|
|
5819
|
-
const [sort, setSort] =
|
|
5820
|
-
const [density, setDensity] =
|
|
5821
|
-
const [curPage, setCurPage] =
|
|
5822
|
-
const [curPageSize, setCurPageSize] =
|
|
5654
|
+
const [visibleCols, setVisibleCols] = React29.useState(() => columns.filter((c) => c.visible !== false).map((c) => c.key));
|
|
5655
|
+
const [filters, setFilters] = React29.useState({});
|
|
5656
|
+
const [sort, setSort] = React29.useState(null);
|
|
5657
|
+
const [density, setDensity] = React29.useState("normal");
|
|
5658
|
+
const [curPage, setCurPage] = React29.useState(page);
|
|
5659
|
+
const [curPageSize, setCurPageSize] = React29.useState(pageSize);
|
|
5823
5660
|
const debouncedFilters = useDebounced(filters, 350);
|
|
5824
|
-
|
|
5661
|
+
React29.useEffect(() => {
|
|
5825
5662
|
if (!onQueryChange) return;
|
|
5826
5663
|
onQueryChange({ filters: debouncedFilters, sort, page: curPage, pageSize: curPageSize });
|
|
5827
5664
|
}, [debouncedFilters, sort, curPage, curPageSize]);
|
|
@@ -5840,7 +5677,7 @@ function DataTable({
|
|
|
5840
5677
|
className: "h-8 w-full text-sm"
|
|
5841
5678
|
};
|
|
5842
5679
|
if (col.filter.type === "text") {
|
|
5843
|
-
return /* @__PURE__ */
|
|
5680
|
+
return /* @__PURE__ */ jsx38(
|
|
5844
5681
|
Input_default,
|
|
5845
5682
|
{
|
|
5846
5683
|
...commonProps,
|
|
@@ -5855,7 +5692,7 @@ function DataTable({
|
|
|
5855
5692
|
}
|
|
5856
5693
|
if (col.filter.type === "select") {
|
|
5857
5694
|
const options = col.filter.options || [];
|
|
5858
|
-
return /* @__PURE__ */
|
|
5695
|
+
return /* @__PURE__ */ jsx38(
|
|
5859
5696
|
Combobox,
|
|
5860
5697
|
{
|
|
5861
5698
|
options: ["", ...options],
|
|
@@ -5871,7 +5708,7 @@ function DataTable({
|
|
|
5871
5708
|
);
|
|
5872
5709
|
}
|
|
5873
5710
|
if (col.filter.type === "date") {
|
|
5874
|
-
return /* @__PURE__ */
|
|
5711
|
+
return /* @__PURE__ */ jsx38(
|
|
5875
5712
|
DatePicker,
|
|
5876
5713
|
{
|
|
5877
5714
|
placeholder: col.filter.placeholder || `Select ${String(col.title)}`,
|
|
@@ -5885,15 +5722,15 @@ function DataTable({
|
|
|
5885
5722
|
}
|
|
5886
5723
|
return null;
|
|
5887
5724
|
};
|
|
5888
|
-
const renderHeader = /* @__PURE__ */
|
|
5725
|
+
const renderHeader = /* @__PURE__ */ jsx38(TableRow, { children: visibleColumns.map((col) => /* @__PURE__ */ jsx38(
|
|
5889
5726
|
TableHead,
|
|
5890
5727
|
{
|
|
5891
5728
|
style: { width: col.width },
|
|
5892
5729
|
className: cn(col.align === "right" && "text-right", col.align === "center" && "text-center"),
|
|
5893
|
-
children: /* @__PURE__ */
|
|
5894
|
-
/* @__PURE__ */
|
|
5895
|
-
/* @__PURE__ */
|
|
5896
|
-
col.sortable && /* @__PURE__ */
|
|
5730
|
+
children: /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-between gap-2 select-none min-h-[2.5rem]", children: [
|
|
5731
|
+
/* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-1 min-w-0 flex-1", children: [
|
|
5732
|
+
/* @__PURE__ */ jsx38("span", { className: "truncate font-medium text-sm", children: col.title }),
|
|
5733
|
+
col.sortable && /* @__PURE__ */ jsx38(
|
|
5897
5734
|
"button",
|
|
5898
5735
|
{
|
|
5899
5736
|
className: cn(
|
|
@@ -5910,8 +5747,8 @@ function DataTable({
|
|
|
5910
5747
|
},
|
|
5911
5748
|
"aria-label": "Sort",
|
|
5912
5749
|
title: `Sort by ${String(col.title)}`,
|
|
5913
|
-
children: /* @__PURE__ */
|
|
5914
|
-
/* @__PURE__ */
|
|
5750
|
+
children: /* @__PURE__ */ jsxs32("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", className: "inline-block", children: [
|
|
5751
|
+
/* @__PURE__ */ jsx38(
|
|
5915
5752
|
"path",
|
|
5916
5753
|
{
|
|
5917
5754
|
d: "M7 8l3-3 3 3",
|
|
@@ -5922,7 +5759,7 @@ function DataTable({
|
|
|
5922
5759
|
opacity: sort?.key === col.key && sort.order === "asc" ? 1 : 0.4
|
|
5923
5760
|
}
|
|
5924
5761
|
),
|
|
5925
|
-
/* @__PURE__ */
|
|
5762
|
+
/* @__PURE__ */ jsx38(
|
|
5926
5763
|
"path",
|
|
5927
5764
|
{
|
|
5928
5765
|
d: "M7 12l3 3 3-3",
|
|
@@ -5937,11 +5774,11 @@ function DataTable({
|
|
|
5937
5774
|
}
|
|
5938
5775
|
)
|
|
5939
5776
|
] }),
|
|
5940
|
-
col.filter && /* @__PURE__ */
|
|
5777
|
+
col.filter && /* @__PURE__ */ jsx38(
|
|
5941
5778
|
Popover,
|
|
5942
5779
|
{
|
|
5943
5780
|
placement: "bottom-start",
|
|
5944
|
-
trigger: /* @__PURE__ */
|
|
5781
|
+
trigger: /* @__PURE__ */ jsx38(
|
|
5945
5782
|
"button",
|
|
5946
5783
|
{
|
|
5947
5784
|
className: cn(
|
|
@@ -5951,16 +5788,16 @@ function DataTable({
|
|
|
5951
5788
|
),
|
|
5952
5789
|
"aria-label": "Filter",
|
|
5953
5790
|
title: "Filter",
|
|
5954
|
-
children: /* @__PURE__ */
|
|
5791
|
+
children: /* @__PURE__ */ jsx38(FilterIcon, { className: "h-4 w-4" })
|
|
5955
5792
|
}
|
|
5956
5793
|
),
|
|
5957
|
-
children: /* @__PURE__ */
|
|
5958
|
-
/* @__PURE__ */
|
|
5794
|
+
children: /* @__PURE__ */ jsxs32("div", { className: "w-48 p-2 space-y-2", children: [
|
|
5795
|
+
/* @__PURE__ */ jsxs32("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: [
|
|
5959
5796
|
"Filter ",
|
|
5960
5797
|
col.title
|
|
5961
5798
|
] }),
|
|
5962
5799
|
renderFilterControl(col),
|
|
5963
|
-
filters[col.key] && /* @__PURE__ */
|
|
5800
|
+
filters[col.key] && /* @__PURE__ */ jsx38(
|
|
5964
5801
|
"button",
|
|
5965
5802
|
{
|
|
5966
5803
|
onClick: () => {
|
|
@@ -5982,29 +5819,29 @@ function DataTable({
|
|
|
5982
5819
|
},
|
|
5983
5820
|
col.key
|
|
5984
5821
|
)) });
|
|
5985
|
-
return /* @__PURE__ */
|
|
5986
|
-
/* @__PURE__ */
|
|
5987
|
-
/* @__PURE__ */
|
|
5988
|
-
/* @__PURE__ */
|
|
5989
|
-
enableDensityToggle && /* @__PURE__ */
|
|
5822
|
+
return /* @__PURE__ */ jsxs32("div", { className: cn("space-y-2", className), children: [
|
|
5823
|
+
/* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-between gap-4 mb-1", children: [
|
|
5824
|
+
/* @__PURE__ */ jsx38("div", { className: "text-sm text-muted-foreground", children: caption }),
|
|
5825
|
+
/* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-2", children: [
|
|
5826
|
+
enableDensityToggle && /* @__PURE__ */ jsx38(
|
|
5990
5827
|
DropdownMenu_default,
|
|
5991
5828
|
{
|
|
5992
|
-
trigger: /* @__PURE__ */
|
|
5993
|
-
/* @__PURE__ */
|
|
5994
|
-
t("density")
|
|
5829
|
+
trigger: /* @__PURE__ */ jsxs32(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
|
|
5830
|
+
/* @__PURE__ */ jsx38("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx38("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 10h16M4 14h16M4 18h16" }) }),
|
|
5831
|
+
labels?.density || t("density")
|
|
5995
5832
|
] }),
|
|
5996
5833
|
items: [
|
|
5997
|
-
{ label: t("compact"), onClick: () => setDensity("compact") },
|
|
5998
|
-
{ label: t("normal"), onClick: () => setDensity("normal") },
|
|
5999
|
-
{ label: t("comfortable"), onClick: () => setDensity("comfortable") }
|
|
5834
|
+
{ label: labels?.compact || t("compact"), onClick: () => setDensity("compact") },
|
|
5835
|
+
{ label: labels?.normal || t("normal"), onClick: () => setDensity("normal") },
|
|
5836
|
+
{ label: labels?.comfortable || t("comfortable"), onClick: () => setDensity("comfortable") }
|
|
6000
5837
|
]
|
|
6001
5838
|
}
|
|
6002
5839
|
),
|
|
6003
|
-
enableColumnVisibilityToggle && /* @__PURE__ */
|
|
5840
|
+
enableColumnVisibilityToggle && /* @__PURE__ */ jsx38(
|
|
6004
5841
|
DropdownMenu_default,
|
|
6005
5842
|
{
|
|
6006
|
-
trigger: /* @__PURE__ */
|
|
6007
|
-
/* @__PURE__ */
|
|
5843
|
+
trigger: /* @__PURE__ */ jsxs32(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
|
|
5844
|
+
/* @__PURE__ */ jsx38("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx38(
|
|
6008
5845
|
"path",
|
|
6009
5846
|
{
|
|
6010
5847
|
strokeLinecap: "round",
|
|
@@ -6013,17 +5850,17 @@ function DataTable({
|
|
|
6013
5850
|
d: "M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2"
|
|
6014
5851
|
}
|
|
6015
5852
|
) }),
|
|
6016
|
-
t("columns")
|
|
5853
|
+
labels?.columns || t("columns")
|
|
6017
5854
|
] }),
|
|
6018
|
-
children: columns.map((c) => /* @__PURE__ */
|
|
5855
|
+
children: columns.map((c) => /* @__PURE__ */ jsxs32(
|
|
6019
5856
|
DropdownMenuItem,
|
|
6020
5857
|
{
|
|
6021
5858
|
onClick: () => {
|
|
6022
5859
|
setVisibleCols((prev) => prev.includes(c.key) ? prev.filter((k) => k !== c.key) : [...prev, c.key]);
|
|
6023
5860
|
},
|
|
6024
5861
|
children: [
|
|
6025
|
-
/* @__PURE__ */
|
|
6026
|
-
/* @__PURE__ */
|
|
5862
|
+
/* @__PURE__ */ jsx38("input", { type: "checkbox", className: "mr-2 rounded border-border", readOnly: true, checked: visibleCols.includes(c.key) }),
|
|
5863
|
+
/* @__PURE__ */ jsx38("span", { className: "truncate", children: c.title })
|
|
6027
5864
|
]
|
|
6028
5865
|
},
|
|
6029
5866
|
c.key
|
|
@@ -6033,17 +5870,17 @@ function DataTable({
|
|
|
6033
5870
|
toolbar
|
|
6034
5871
|
] })
|
|
6035
5872
|
] }),
|
|
6036
|
-
/* @__PURE__ */
|
|
5873
|
+
/* @__PURE__ */ jsx38("div", { className: cn("relative rounded-lg border border-border/50 overflow-hidden", loading2 && "opacity-60 pointer-events-none"), children: /* @__PURE__ */ jsxs32(
|
|
6037
5874
|
Table,
|
|
6038
5875
|
{
|
|
6039
5876
|
containerClassName: "border-0 rounded-none shadow-none",
|
|
6040
5877
|
className: "[&_thead]:sticky [&_thead]:top-0 [&_thead]:z-[5] [&_thead]:bg-background [&_thead]:backdrop-blur-sm",
|
|
6041
5878
|
children: [
|
|
6042
|
-
/* @__PURE__ */
|
|
6043
|
-
/* @__PURE__ */
|
|
6044
|
-
/* @__PURE__ */
|
|
6045
|
-
/* @__PURE__ */
|
|
6046
|
-
/* @__PURE__ */
|
|
5879
|
+
/* @__PURE__ */ jsx38(TableHeader, { children: renderHeader }),
|
|
5880
|
+
/* @__PURE__ */ jsx38(TableBody, { children: loading2 ? /* @__PURE__ */ jsx38(TableRow, { children: /* @__PURE__ */ jsx38(TableCell, { colSpan: visibleColumns.length, className: "text-center py-8", children: /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-center gap-2 text-muted-foreground", children: [
|
|
5881
|
+
/* @__PURE__ */ jsxs32("svg", { className: "animate-spin h-4 w-4", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
|
|
5882
|
+
/* @__PURE__ */ jsx38("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
5883
|
+
/* @__PURE__ */ jsx38(
|
|
6047
5884
|
"path",
|
|
6048
5885
|
{
|
|
6049
5886
|
className: "opacity-75",
|
|
@@ -6052,10 +5889,10 @@ function DataTable({
|
|
|
6052
5889
|
}
|
|
6053
5890
|
)
|
|
6054
5891
|
] }),
|
|
6055
|
-
/* @__PURE__ */
|
|
6056
|
-
] }) }) }) : !data || data.length === 0 ? /* @__PURE__ */
|
|
5892
|
+
/* @__PURE__ */ jsx38("span", { className: "text-sm", children: "Loading..." })
|
|
5893
|
+
] }) }) }) : !data || data.length === 0 ? /* @__PURE__ */ jsx38(TableRow, { children: /* @__PURE__ */ jsx38(TableCell, { colSpan: visibleColumns.length, className: "text-center py-6 text-muted-foreground", children: "No data" }) }) : data.map((row, idx) => /* @__PURE__ */ jsx38(TableRow, { className: cn(densityRowClass, striped && idx % 2 === 0 && "bg-muted/30"), children: visibleColumns.map((col) => {
|
|
6057
5894
|
const value = col.dataIndex ? row[col.dataIndex] : void 0;
|
|
6058
|
-
return /* @__PURE__ */
|
|
5895
|
+
return /* @__PURE__ */ jsx38(
|
|
6059
5896
|
TableCell,
|
|
6060
5897
|
{
|
|
6061
5898
|
className: cn(
|
|
@@ -6073,7 +5910,7 @@ function DataTable({
|
|
|
6073
5910
|
]
|
|
6074
5911
|
}
|
|
6075
5912
|
) }),
|
|
6076
|
-
total > 0 && /* @__PURE__ */
|
|
5913
|
+
total > 0 && /* @__PURE__ */ jsx38("div", { className: "border-t bg-muted/30 p-4 rounded-b-lg", children: /* @__PURE__ */ jsx38(
|
|
6077
5914
|
Pagination,
|
|
6078
5915
|
{
|
|
6079
5916
|
page: curPage,
|
|
@@ -6092,8 +5929,8 @@ var DataTable_default = DataTable;
|
|
|
6092
5929
|
// ../../components/ui/NotificationModal.tsx
|
|
6093
5930
|
import { ExternalLink } from "lucide-react";
|
|
6094
5931
|
import { useTranslations as useTranslations8 } from "next-intl";
|
|
6095
|
-
import { jsx as
|
|
6096
|
-
function NotificationModal({ isOpen, onClose, notification }) {
|
|
5932
|
+
import { jsx as jsx39, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
5933
|
+
function NotificationModal({ isOpen, onClose, notification, titleText, openLinkText, closeText }) {
|
|
6097
5934
|
const t = useTranslations8("Common");
|
|
6098
5935
|
if (!notification) return null;
|
|
6099
5936
|
const formatTime2 = (dateString) => {
|
|
@@ -6113,26 +5950,26 @@ function NotificationModal({ isOpen, onClose, notification }) {
|
|
|
6113
5950
|
onClose();
|
|
6114
5951
|
}
|
|
6115
5952
|
};
|
|
6116
|
-
return /* @__PURE__ */
|
|
5953
|
+
return /* @__PURE__ */ jsx39(
|
|
6117
5954
|
Modal_default,
|
|
6118
5955
|
{
|
|
6119
5956
|
isOpen,
|
|
6120
5957
|
onClose,
|
|
6121
|
-
title: t("notifications"),
|
|
5958
|
+
title: titleText || t("notifications"),
|
|
6122
5959
|
size: "md",
|
|
6123
|
-
children: /* @__PURE__ */
|
|
6124
|
-
/* @__PURE__ */
|
|
6125
|
-
/* @__PURE__ */
|
|
5960
|
+
children: /* @__PURE__ */ jsxs33("div", { className: "space-y-4", children: [
|
|
5961
|
+
/* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-2 pb-2 border-b border-border", children: [
|
|
5962
|
+
/* @__PURE__ */ jsx39("div", { className: cn(
|
|
6126
5963
|
"w-2 h-2 rounded-full",
|
|
6127
5964
|
!notification.is_read ? "bg-primary" : "bg-border"
|
|
6128
5965
|
) }),
|
|
6129
|
-
/* @__PURE__ */
|
|
5966
|
+
/* @__PURE__ */ jsx39("span", { className: "text-xs text-muted-foreground", children: !notification.is_read ? t("newNotification") : t("readStatus") })
|
|
6130
5967
|
] }),
|
|
6131
|
-
notification.title && /* @__PURE__ */
|
|
6132
|
-
notification.body && /* @__PURE__ */
|
|
6133
|
-
/* @__PURE__ */
|
|
6134
|
-
/* @__PURE__ */
|
|
6135
|
-
hasLink && /* @__PURE__ */
|
|
5968
|
+
notification.title && /* @__PURE__ */ jsx39("h3", { className: "text-lg font-semibold text-foreground", children: notification.title }),
|
|
5969
|
+
notification.body && /* @__PURE__ */ jsx39("div", { className: "text-sm text-muted-foreground whitespace-pre-wrap leading-relaxed", children: notification.body }),
|
|
5970
|
+
/* @__PURE__ */ jsx39("div", { className: "text-xs text-muted-foreground border-t border-border pt-2", children: formatTime2(notification.created_at) }),
|
|
5971
|
+
/* @__PURE__ */ jsxs33("div", { className: "flex gap-2 justify-end pt-2", children: [
|
|
5972
|
+
hasLink && /* @__PURE__ */ jsxs33(
|
|
6136
5973
|
Button_default,
|
|
6137
5974
|
{
|
|
6138
5975
|
variant: "primary",
|
|
@@ -6140,18 +5977,18 @@ function NotificationModal({ isOpen, onClose, notification }) {
|
|
|
6140
5977
|
onClick: handleLinkClick,
|
|
6141
5978
|
className: "gap-2",
|
|
6142
5979
|
children: [
|
|
6143
|
-
/* @__PURE__ */
|
|
6144
|
-
t("openLink")
|
|
5980
|
+
/* @__PURE__ */ jsx39(ExternalLink, { className: "w-4 h-4" }),
|
|
5981
|
+
openLinkText || t("openLink")
|
|
6145
5982
|
]
|
|
6146
5983
|
}
|
|
6147
5984
|
),
|
|
6148
|
-
/* @__PURE__ */
|
|
5985
|
+
/* @__PURE__ */ jsx39(
|
|
6149
5986
|
Button_default,
|
|
6150
5987
|
{
|
|
6151
5988
|
variant: "ghost",
|
|
6152
5989
|
size: "sm",
|
|
6153
5990
|
onClick: onClose,
|
|
6154
|
-
children: t("close")
|
|
5991
|
+
children: closeText || t("close")
|
|
6155
5992
|
}
|
|
6156
5993
|
)
|
|
6157
5994
|
] })
|
|
@@ -6167,10 +6004,10 @@ import { usePathname } from "next/navigation";
|
|
|
6167
6004
|
import { Phone } from "lucide-react";
|
|
6168
6005
|
|
|
6169
6006
|
// ../../node_modules/react-icons/lib/iconBase.mjs
|
|
6170
|
-
import
|
|
6007
|
+
import React31 from "react";
|
|
6171
6008
|
|
|
6172
6009
|
// ../../node_modules/react-icons/lib/iconContext.mjs
|
|
6173
|
-
import
|
|
6010
|
+
import React30 from "react";
|
|
6174
6011
|
var DefaultContext = {
|
|
6175
6012
|
color: void 0,
|
|
6176
6013
|
size: void 0,
|
|
@@ -6178,7 +6015,7 @@ var DefaultContext = {
|
|
|
6178
6015
|
style: void 0,
|
|
6179
6016
|
attr: void 0
|
|
6180
6017
|
};
|
|
6181
|
-
var IconContext =
|
|
6018
|
+
var IconContext = React30.createContext && /* @__PURE__ */ React30.createContext(DefaultContext);
|
|
6182
6019
|
|
|
6183
6020
|
// ../../node_modules/react-icons/lib/iconBase.mjs
|
|
6184
6021
|
var _excluded = ["attr", "size", "title"];
|
|
@@ -6267,12 +6104,12 @@ function _toPrimitive(t, r) {
|
|
|
6267
6104
|
return ("string" === r ? String : Number)(t);
|
|
6268
6105
|
}
|
|
6269
6106
|
function Tree2Element(tree) {
|
|
6270
|
-
return tree && tree.map((node, i) => /* @__PURE__ */
|
|
6107
|
+
return tree && tree.map((node, i) => /* @__PURE__ */ React31.createElement(node.tag, _objectSpread({
|
|
6271
6108
|
key: i
|
|
6272
6109
|
}, node.attr), Tree2Element(node.child)));
|
|
6273
6110
|
}
|
|
6274
6111
|
function GenIcon(data) {
|
|
6275
|
-
return (props) => /* @__PURE__ */
|
|
6112
|
+
return (props) => /* @__PURE__ */ React31.createElement(IconBase, _extends({
|
|
6276
6113
|
attr: _objectSpread({}, data.attr)
|
|
6277
6114
|
}, props), Tree2Element(data.child));
|
|
6278
6115
|
}
|
|
@@ -6287,7 +6124,7 @@ function IconBase(props) {
|
|
|
6287
6124
|
var className;
|
|
6288
6125
|
if (conf.className) className = conf.className;
|
|
6289
6126
|
if (props.className) className = (className ? className + " " : "") + props.className;
|
|
6290
|
-
return /* @__PURE__ */
|
|
6127
|
+
return /* @__PURE__ */ React31.createElement("svg", _extends({
|
|
6291
6128
|
stroke: "currentColor",
|
|
6292
6129
|
fill: "currentColor",
|
|
6293
6130
|
strokeWidth: "0"
|
|
@@ -6299,9 +6136,9 @@ function IconBase(props) {
|
|
|
6299
6136
|
height: computedSize,
|
|
6300
6137
|
width: computedSize,
|
|
6301
6138
|
xmlns: "http://www.w3.org/2000/svg"
|
|
6302
|
-
}), title && /* @__PURE__ */
|
|
6139
|
+
}), title && /* @__PURE__ */ React31.createElement("title", null, title), props.children);
|
|
6303
6140
|
};
|
|
6304
|
-
return IconContext !== void 0 ? /* @__PURE__ */
|
|
6141
|
+
return IconContext !== void 0 ? /* @__PURE__ */ React31.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
|
|
6305
6142
|
}
|
|
6306
6143
|
|
|
6307
6144
|
// ../../node_modules/react-icons/fa/index.mjs
|
|
@@ -6315,9 +6152,9 @@ function SiZalo(props) {
|
|
|
6315
6152
|
}
|
|
6316
6153
|
|
|
6317
6154
|
// ../../components/ui/FloatingContacts.tsx
|
|
6318
|
-
import { jsx as
|
|
6155
|
+
import { jsx as jsx40, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
6319
6156
|
function MessengerIcon(props) {
|
|
6320
|
-
return /* @__PURE__ */
|
|
6157
|
+
return /* @__PURE__ */ jsx40("svg", { viewBox: "0 0 24 24", width: 24, height: 24, "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx40(
|
|
6321
6158
|
"path",
|
|
6322
6159
|
{
|
|
6323
6160
|
d: "M12 2C6.477 2 2 6.145 2 11.235c0 2.93 1.35 5.542 3.464 7.25v3.515l3.344-1.836c.894.247 1.843.375 2.192.375 5.523 0 10-4.145 10-9.235S17.523 2 12 2zm.994 12.444l-2.563-2.73-5.004 2.73 5.507-5.84 2.626 2.729 4.942-2.729-5.508 5.84z",
|
|
@@ -6326,10 +6163,10 @@ function MessengerIcon(props) {
|
|
|
6326
6163
|
) });
|
|
6327
6164
|
}
|
|
6328
6165
|
function ZaloIcon(props) {
|
|
6329
|
-
return /* @__PURE__ */
|
|
6166
|
+
return /* @__PURE__ */ jsx40(SiZalo, { size: 20, ...props });
|
|
6330
6167
|
}
|
|
6331
6168
|
function InstagramIcon(props) {
|
|
6332
|
-
return /* @__PURE__ */
|
|
6169
|
+
return /* @__PURE__ */ jsx40(FaInstagram, { size: 20, ...props });
|
|
6333
6170
|
}
|
|
6334
6171
|
function FloatingContacts({ className }) {
|
|
6335
6172
|
const pathname = usePathname();
|
|
@@ -6364,8 +6201,8 @@ function FloatingContacts({ className }) {
|
|
|
6364
6201
|
external: true
|
|
6365
6202
|
}
|
|
6366
6203
|
];
|
|
6367
|
-
return /* @__PURE__ */
|
|
6368
|
-
/* @__PURE__ */
|
|
6204
|
+
return /* @__PURE__ */ jsxs34("div", { className: cn("fixed bottom-6 right-4 z-[100000]", "flex flex-col items-end gap-3", className), "aria-label": "Quick contacts", children: [
|
|
6205
|
+
/* @__PURE__ */ jsx40(
|
|
6369
6206
|
Link2,
|
|
6370
6207
|
{
|
|
6371
6208
|
href: `tel:${hotline.replace(/\D/g, "")}`,
|
|
@@ -6376,10 +6213,10 @@ function FloatingContacts({ className }) {
|
|
|
6376
6213
|
"hover:scale-105 active:scale-95 transition-transform",
|
|
6377
6214
|
"bg-[#22c55e]"
|
|
6378
6215
|
),
|
|
6379
|
-
children: /* @__PURE__ */
|
|
6216
|
+
children: /* @__PURE__ */ jsx40(Phone, { className: "w-6 h-6" })
|
|
6380
6217
|
}
|
|
6381
6218
|
),
|
|
6382
|
-
moreItems.map(({ key, href, label, bg, Icon, external }) => /* @__PURE__ */
|
|
6219
|
+
moreItems.map(({ key, href, label, bg, Icon, external }) => /* @__PURE__ */ jsx40(
|
|
6383
6220
|
Link2,
|
|
6384
6221
|
{
|
|
6385
6222
|
href,
|
|
@@ -6391,7 +6228,7 @@ function FloatingContacts({ className }) {
|
|
|
6391
6228
|
"hover:scale-105 active:scale-95 transition-transform",
|
|
6392
6229
|
bg
|
|
6393
6230
|
),
|
|
6394
|
-
children: /* @__PURE__ */
|
|
6231
|
+
children: /* @__PURE__ */ jsx40(Icon, { className: "w-6 h-6" })
|
|
6395
6232
|
},
|
|
6396
6233
|
key
|
|
6397
6234
|
))
|
|
@@ -6400,7 +6237,7 @@ function FloatingContacts({ className }) {
|
|
|
6400
6237
|
|
|
6401
6238
|
// ../../components/ui/AccessDenied.tsx
|
|
6402
6239
|
import { Lock, ShieldAlert, Ban } from "lucide-react";
|
|
6403
|
-
import { jsx as
|
|
6240
|
+
import { jsx as jsx41, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
6404
6241
|
var VARIANT_STYLES = {
|
|
6405
6242
|
destructive: { bg: "bg-destructive/5", border: "border-destructive/20", text: "text-destructive" },
|
|
6406
6243
|
warning: { bg: "bg-warning/5", border: "border-warning/20", text: "text-warning" },
|
|
@@ -6421,15 +6258,147 @@ function AccessDenied({
|
|
|
6421
6258
|
}) {
|
|
6422
6259
|
const styles = VARIANT_STYLES[variant];
|
|
6423
6260
|
const UsedIcon = Icon || DEFAULT_ICONS[variant];
|
|
6424
|
-
return /* @__PURE__ */
|
|
6425
|
-
/* @__PURE__ */
|
|
6426
|
-
/* @__PURE__ */
|
|
6427
|
-
/* @__PURE__ */
|
|
6428
|
-
/* @__PURE__ */
|
|
6261
|
+
return /* @__PURE__ */ jsx41(Card_default, { className: cn("p-8 text-center shadow-sm", styles.bg, styles.border, className), children: /* @__PURE__ */ jsxs35("div", { className: "flex flex-col items-center gap-4", children: [
|
|
6262
|
+
/* @__PURE__ */ jsx41("div", { className: cn("p-3 rounded-lg", styles.bg.replace("/5", "/10")), children: /* @__PURE__ */ jsx41(UsedIcon, { className: cn("w-8 h-8", styles.text) }) }),
|
|
6263
|
+
/* @__PURE__ */ jsxs35("div", { children: [
|
|
6264
|
+
/* @__PURE__ */ jsx41("h3", { className: cn("font-semibold mb-2", styles.text), children: title }),
|
|
6265
|
+
/* @__PURE__ */ jsx41("p", { className: cn(styles.text.replace("text-", "text-") + "/80", "text-sm"), children: description })
|
|
6429
6266
|
] }),
|
|
6430
|
-
children && /* @__PURE__ */
|
|
6267
|
+
children && /* @__PURE__ */ jsx41("div", { className: "mt-2 flex flex-wrap gap-2 justify-center", children })
|
|
6431
6268
|
] }) });
|
|
6432
6269
|
}
|
|
6270
|
+
|
|
6271
|
+
// locales/en.json
|
|
6272
|
+
var en_default = {
|
|
6273
|
+
Common: {
|
|
6274
|
+
close: "Close",
|
|
6275
|
+
closeAlert: "Close alert",
|
|
6276
|
+
notifications: "Notifications",
|
|
6277
|
+
newNotification: "New",
|
|
6278
|
+
readStatus: "Read",
|
|
6279
|
+
openLink: "Open link",
|
|
6280
|
+
theme: "Theme",
|
|
6281
|
+
lightTheme: "Light",
|
|
6282
|
+
darkTheme: "Dark",
|
|
6283
|
+
systemTheme: "System",
|
|
6284
|
+
density: "Density",
|
|
6285
|
+
compact: "Compact",
|
|
6286
|
+
normal: "Normal",
|
|
6287
|
+
comfortable: "Comfortable",
|
|
6288
|
+
columns: "Columns"
|
|
6289
|
+
},
|
|
6290
|
+
ValidationInput: {
|
|
6291
|
+
required: "This field is required",
|
|
6292
|
+
typeMismatch: "Invalid format",
|
|
6293
|
+
pattern: "Invalid pattern",
|
|
6294
|
+
tooShort: "Too short",
|
|
6295
|
+
tooLong: "Too long",
|
|
6296
|
+
rangeUnderflow: "Below minimum",
|
|
6297
|
+
rangeOverflow: "Above maximum",
|
|
6298
|
+
stepMismatch: "Step mismatch",
|
|
6299
|
+
badInput: "Bad input",
|
|
6300
|
+
invalid: "Invalid value"
|
|
6301
|
+
},
|
|
6302
|
+
Loading: {
|
|
6303
|
+
loadingPage: "Loading page",
|
|
6304
|
+
pleaseWait: "Please wait"
|
|
6305
|
+
},
|
|
6306
|
+
DatePicker: {
|
|
6307
|
+
placeholder: "Select date",
|
|
6308
|
+
today: "Today",
|
|
6309
|
+
clear: "Clear"
|
|
6310
|
+
},
|
|
6311
|
+
Pagination: {
|
|
6312
|
+
navigationLabel: "Pagination navigation",
|
|
6313
|
+
showingResults: "Showing {startItem}\u2013{endItem} of {totalItems}",
|
|
6314
|
+
firstPage: "First page",
|
|
6315
|
+
previousPage: "Previous page",
|
|
6316
|
+
previous: "Previous",
|
|
6317
|
+
nextPage: "Next page",
|
|
6318
|
+
next: "Next",
|
|
6319
|
+
lastPage: "Last page",
|
|
6320
|
+
pageNumber: "Page {page}",
|
|
6321
|
+
itemsPerPage: "Items per page",
|
|
6322
|
+
search: "Search",
|
|
6323
|
+
noOptions: "No options"
|
|
6324
|
+
},
|
|
6325
|
+
OCR: {
|
|
6326
|
+
imageUpload: {
|
|
6327
|
+
dragDropText: "Drag & drop files here",
|
|
6328
|
+
browseFiles: "Browse files",
|
|
6329
|
+
supportedFormats: "Supported formats: images"
|
|
6330
|
+
}
|
|
6331
|
+
}
|
|
6332
|
+
};
|
|
6333
|
+
|
|
6334
|
+
// locales/vi.json
|
|
6335
|
+
var vi_default = {
|
|
6336
|
+
Common: {
|
|
6337
|
+
close: "\u0110\xF3ng",
|
|
6338
|
+
closeAlert: "\u0110\xF3ng c\u1EA3nh b\xE1o",
|
|
6339
|
+
notifications: "Th\xF4ng b\xE1o",
|
|
6340
|
+
newNotification: "M\u1EDBi",
|
|
6341
|
+
readStatus: "\u0110\xE3 \u0111\u1ECDc",
|
|
6342
|
+
openLink: "M\u1EDF li\xEAn k\u1EBFt",
|
|
6343
|
+
theme: "Ch\u1EE7 \u0111\u1EC1",
|
|
6344
|
+
lightTheme: "Giao di\u1EC7n s\xE1ng",
|
|
6345
|
+
darkTheme: "Giao di\u1EC7n t\u1ED1i",
|
|
6346
|
+
systemTheme: "Theo h\u1EC7 th\u1ED1ng",
|
|
6347
|
+
density: "M\u1EADt \u0111\u1ED9",
|
|
6348
|
+
compact: "G\u1ECDn",
|
|
6349
|
+
normal: "Th\u01B0\u1EDDng",
|
|
6350
|
+
comfortable: "Tho\u1EA3i m\xE1i",
|
|
6351
|
+
columns: "C\u1ED9t"
|
|
6352
|
+
},
|
|
6353
|
+
ValidationInput: {
|
|
6354
|
+
required: "Tr\u01B0\u1EDDng n\xE0y l\xE0 b\u1EAFt bu\u1ED9c",
|
|
6355
|
+
typeMismatch: "\u0110\u1ECBnh d\u1EA1ng kh\xF4ng h\u1EE3p l\u1EC7",
|
|
6356
|
+
pattern: "Sai m\u1EABu",
|
|
6357
|
+
tooShort: "Qu\xE1 ng\u1EAFn",
|
|
6358
|
+
tooLong: "Qu\xE1 d\xE0i",
|
|
6359
|
+
rangeUnderflow: "Nh\u1ECF h\u01A1n gi\xE1 tr\u1ECB t\u1ED1i thi\u1EC3u",
|
|
6360
|
+
rangeOverflow: "L\u1EDBn h\u01A1n gi\xE1 tr\u1ECB t\u1ED1i \u0111a",
|
|
6361
|
+
stepMismatch: "Sai b\u01B0\u1EDBc",
|
|
6362
|
+
badInput: "Gi\xE1 tr\u1ECB kh\xF4ng h\u1EE3p l\u1EC7",
|
|
6363
|
+
invalid: "Gi\xE1 tr\u1ECB kh\xF4ng h\u1EE3p l\u1EC7"
|
|
6364
|
+
},
|
|
6365
|
+
Loading: {
|
|
6366
|
+
loadingPage: "\u0110ang t\u1EA3i trang",
|
|
6367
|
+
pleaseWait: "Vui l\xF2ng ch\u1EDD"
|
|
6368
|
+
},
|
|
6369
|
+
DatePicker: {
|
|
6370
|
+
placeholder: "Ch\u1ECDn ng\xE0y",
|
|
6371
|
+
today: "H\xF4m nay",
|
|
6372
|
+
clear: "X\xF3a"
|
|
6373
|
+
},
|
|
6374
|
+
Pagination: {
|
|
6375
|
+
navigationLabel: "\u0110i\u1EC1u h\u01B0\u1EDBng ph\xE2n trang",
|
|
6376
|
+
showingResults: "Hi\u1EC3n th\u1ECB {startItem}\u2013{endItem} trong t\u1ED5ng {totalItems}",
|
|
6377
|
+
firstPage: "Trang \u0111\u1EA7u",
|
|
6378
|
+
previousPage: "Trang tr\u01B0\u1EDBc",
|
|
6379
|
+
previous: "Tr\u01B0\u1EDBc",
|
|
6380
|
+
nextPage: "Trang sau",
|
|
6381
|
+
next: "Sau",
|
|
6382
|
+
lastPage: "Trang cu\u1ED1i",
|
|
6383
|
+
pageNumber: "Trang {page}",
|
|
6384
|
+
itemsPerPage: "S\u1ED1 m\u1EE5c/trang",
|
|
6385
|
+
search: "T\xECm ki\u1EBFm",
|
|
6386
|
+
noOptions: "Kh\xF4ng c\xF3 l\u1EF1a ch\u1ECDn"
|
|
6387
|
+
},
|
|
6388
|
+
OCR: {
|
|
6389
|
+
imageUpload: {
|
|
6390
|
+
dragDropText: "K\xE9o & th\u1EA3 \u1EA3nh v\xE0o \u0111\xE2y",
|
|
6391
|
+
browseFiles: "Ch\u1ECDn t\u1EC7p",
|
|
6392
|
+
supportedFormats: "H\u1ED7 tr\u1EE3 c\xE1c \u0111\u1ECBnh d\u1EA1ng \u1EA3nh"
|
|
6393
|
+
}
|
|
6394
|
+
}
|
|
6395
|
+
};
|
|
6396
|
+
|
|
6397
|
+
// src/index.ts
|
|
6398
|
+
var underverseMessages = { en: en_default, vi: vi_default };
|
|
6399
|
+
function getUnderverseMessages(locale = "en") {
|
|
6400
|
+
return underverseMessages[locale] || underverseMessages.en;
|
|
6401
|
+
}
|
|
6433
6402
|
export {
|
|
6434
6403
|
AccessDenied,
|
|
6435
6404
|
Alert_default as Alert,
|
|
@@ -6470,7 +6439,6 @@ export {
|
|
|
6470
6439
|
Pagination,
|
|
6471
6440
|
PillTabs,
|
|
6472
6441
|
Popover,
|
|
6473
|
-
ProductImageUpload_default as ProductImageUpload,
|
|
6474
6442
|
Progress_default as Progress,
|
|
6475
6443
|
PulseBadge,
|
|
6476
6444
|
RadioGroup_default as RadioGroup,
|
|
@@ -6503,6 +6471,8 @@ export {
|
|
|
6503
6471
|
VARIANT_STYLES_BTN,
|
|
6504
6472
|
VerticalTabs,
|
|
6505
6473
|
cn,
|
|
6474
|
+
getUnderverseMessages,
|
|
6475
|
+
underverseMessages,
|
|
6506
6476
|
useToast
|
|
6507
6477
|
};
|
|
6508
6478
|
//# sourceMappingURL=index.js.map
|