@underverse-ui/underverse 0.1.26 → 0.1.30

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/dist/index.d.cts CHANGED
@@ -596,6 +596,7 @@ interface PaginationProps {
596
596
  showPageNumbers?: boolean;
597
597
  showInfo?: boolean;
598
598
  disabled?: boolean;
599
+ alignment?: "left" | "center" | "right";
599
600
  pageSize?: number;
600
601
  pageSizeOptions?: number[];
601
602
  onPageSizeChange?: (size: number) => void;
@@ -949,6 +950,7 @@ interface DataTableProps<T> {
949
950
  total?: number;
950
951
  page?: number;
951
952
  pageSize?: number;
953
+ pageSizeOptions?: number[];
952
954
  onQueryChange?: (q: DataTableQuery) => void;
953
955
  caption?: React__default.ReactNode;
954
956
  toolbar?: React__default.ReactNode;
@@ -964,7 +966,7 @@ interface DataTableProps<T> {
964
966
  comfortable?: string;
965
967
  };
966
968
  }
967
- declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, onQueryChange, caption, toolbar, enableColumnVisibilityToggle, enableDensityToggle, striped, // Mặc định bật màu nền sẽn kẽ cho các dòng
969
+ declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, pageSizeOptions, onQueryChange, caption, toolbar, enableColumnVisibilityToggle, enableDensityToggle, striped, // Mặc định bật màu nền sẽn kẽ cho các dòng
968
970
  className, labels, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
969
971
 
970
972
  interface TableProps extends React__default.HTMLAttributes<HTMLTableElement> {
package/dist/index.d.ts CHANGED
@@ -596,6 +596,7 @@ interface PaginationProps {
596
596
  showPageNumbers?: boolean;
597
597
  showInfo?: boolean;
598
598
  disabled?: boolean;
599
+ alignment?: "left" | "center" | "right";
599
600
  pageSize?: number;
600
601
  pageSizeOptions?: number[];
601
602
  onPageSizeChange?: (size: number) => void;
@@ -949,6 +950,7 @@ interface DataTableProps<T> {
949
950
  total?: number;
950
951
  page?: number;
951
952
  pageSize?: number;
953
+ pageSizeOptions?: number[];
952
954
  onQueryChange?: (q: DataTableQuery) => void;
953
955
  caption?: React__default.ReactNode;
954
956
  toolbar?: React__default.ReactNode;
@@ -964,7 +966,7 @@ interface DataTableProps<T> {
964
966
  comfortable?: string;
965
967
  };
966
968
  }
967
- declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, onQueryChange, caption, toolbar, enableColumnVisibilityToggle, enableDensityToggle, striped, // Mặc định bật màu nền sẽn kẽ cho các dòng
969
+ declare function DataTable<T extends Record<string, any>>({ columns, data, rowKey, loading, total, page, pageSize, pageSizeOptions, onQueryChange, caption, toolbar, enableColumnVisibilityToggle, enableDensityToggle, striped, // Mặc định bật màu nền sẽn kẽ cho các dòng
968
970
  className, labels, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
969
971
 
970
972
  interface TableProps extends React__default.HTMLAttributes<HTMLTableElement> {
package/dist/index.js CHANGED
@@ -4095,6 +4095,7 @@ var Pagination = ({
4095
4095
  showPageNumbers = true,
4096
4096
  showInfo = false,
4097
4097
  disabled = false,
4098
+ alignment = "left",
4098
4099
  pageSize,
4099
4100
  pageSizeOptions,
4100
4101
  onPageSizeChange,
@@ -4102,6 +4103,17 @@ var Pagination = ({
4102
4103
  labels
4103
4104
  }) => {
4104
4105
  const t = useTranslations4("Pagination");
4106
+ const getTextAlignmentClass = (align) => {
4107
+ switch (align) {
4108
+ case "left":
4109
+ return "text-left";
4110
+ case "center":
4111
+ return "text-center";
4112
+ case "right":
4113
+ return "text-right";
4114
+ }
4115
+ };
4116
+ const textAlignmentClass = getTextAlignmentClass(alignment);
4105
4117
  const createPageArray = () => {
4106
4118
  const delta = 2;
4107
4119
  const range = [];
@@ -4154,103 +4166,107 @@ var Pagination = ({
4154
4166
  };
4155
4167
  if (totalPages <= 1) return null;
4156
4168
  return /* @__PURE__ */ jsxs22("nav", { className: cn("flex flex-col gap-4", className), "aria-label": labels?.navigationLabel || t("navigationLabel"), children: [
4157
- 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 }) }),
4158
- /* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-center gap-1", children: [
4159
- showFirstLast && /* @__PURE__ */ jsx24(
4160
- Button_default,
4161
- {
4162
- variant: getButtonVariant(false),
4163
- size,
4164
- icon: ChevronsLeft,
4165
- onClick: () => onChange(1),
4166
- disabled: disabled || page === 1,
4167
- className: "hidden sm:flex",
4168
- title: labels?.firstPage || t("firstPage"),
4169
- "aria-label": labels?.firstPage || t("firstPage"),
4170
- "aria-disabled": disabled || page === 1
4171
- }
4172
- ),
4173
- showPrevNext && /* @__PURE__ */ jsx24(
4174
- Button_default,
4175
- {
4176
- variant: getButtonVariant(false),
4177
- size,
4178
- icon: ChevronLeft,
4179
- onClick: () => onChange(Math.max(1, page - 1)),
4180
- disabled: disabled || page === 1,
4181
- title: labels?.previousPage || t("previousPage"),
4182
- "aria-label": labels?.previousPage || t("previousPage"),
4183
- "aria-disabled": disabled || page === 1,
4184
- children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.previous || t("previous") })
4185
- }
4186
- ),
4187
- showPageNumbers && createPageArray().map((p, i) => {
4188
- if (p === "...") {
4189
- return /* @__PURE__ */ jsx24(Button_default, { variant: "ghost", size, disabled: true, icon: MoreHorizontal2, className: "cursor-default" }, i);
4190
- }
4191
- const pageNumber = p;
4192
- const isActive = page === pageNumber;
4193
- return /* @__PURE__ */ jsx24(
4169
+ showInfo && totalItems && /* @__PURE__ */ jsx24("div", { className: cn("text-sm text-muted-foreground", textAlignmentClass), children: labels?.showingResults ? labels.showingResults({ startItem: startItem || 0, endItem: endItem || 0, totalItems }) : t("showingResults", { startItem: startItem || 0, endItem: endItem || 0, totalItems }) }),
4170
+ /* @__PURE__ */ jsxs22("div", { className: cn("flex items-center justify-between", {
4171
+ "flex-row-reverse": alignment === "right" || alignment === "center"
4172
+ }), children: [
4173
+ /* @__PURE__ */ jsxs22("div", { className: cn("flex items-center gap-1"), children: [
4174
+ showFirstLast && /* @__PURE__ */ jsx24(
4194
4175
  Button_default,
4195
4176
  {
4196
- variant: getButtonVariant(isActive),
4177
+ variant: getButtonVariant(false),
4197
4178
  size,
4198
- onClick: () => onChange(pageNumber),
4199
- disabled,
4200
- className: cn("min-w-[2.5rem]", isActive && "font-semibold"),
4201
- "aria-label": labels?.pageNumber ? labels.pageNumber(pageNumber) : t("pageNumber", { page: pageNumber }),
4202
- "aria-current": isActive ? "page" : void 0,
4203
- children: pageNumber
4204
- },
4205
- i
4206
- );
4207
- }),
4208
- showPrevNext && /* @__PURE__ */ jsx24(
4209
- Button_default,
4210
- {
4211
- variant: getButtonVariant(false),
4212
- size,
4213
- iconRight: ChevronRight2,
4214
- onClick: () => onChange(Math.min(totalPages, page + 1)),
4215
- disabled: disabled || page === totalPages,
4216
- title: labels?.nextPage || t("nextPage"),
4217
- "aria-label": labels?.nextPage || t("nextPage"),
4218
- "aria-disabled": disabled || page === totalPages,
4219
- children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.next || t("next") })
4220
- }
4221
- ),
4222
- showFirstLast && /* @__PURE__ */ jsx24(
4223
- Button_default,
4224
- {
4225
- variant: getButtonVariant(false),
4226
- size,
4227
- icon: ChevronsRight,
4228
- onClick: () => onChange(totalPages),
4229
- disabled: disabled || page === totalPages,
4230
- className: "hidden sm:flex",
4231
- title: labels?.lastPage || t("lastPage"),
4232
- "aria-label": labels?.lastPage || t("lastPage"),
4233
- "aria-disabled": disabled || page === totalPages
4234
- }
4235
- )
4236
- ] }),
4237
- pageSizeOptions && onPageSizeChange && /* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-center gap-2 text-sm", children: [
4238
- /* @__PURE__ */ jsxs22("span", { className: "text-muted-foreground", children: [
4239
- labels?.itemsPerPage || t("itemsPerPage"),
4240
- ":"
4179
+ icon: ChevronsLeft,
4180
+ onClick: () => onChange(1),
4181
+ disabled: disabled || page === 1,
4182
+ className: "hidden sm:flex",
4183
+ title: labels?.firstPage || t("firstPage"),
4184
+ "aria-label": labels?.firstPage || t("firstPage"),
4185
+ "aria-disabled": disabled || page === 1
4186
+ }
4187
+ ),
4188
+ showPrevNext && /* @__PURE__ */ jsx24(
4189
+ Button_default,
4190
+ {
4191
+ variant: getButtonVariant(false),
4192
+ size,
4193
+ icon: ChevronLeft,
4194
+ onClick: () => onChange(Math.max(1, page - 1)),
4195
+ disabled: disabled || page === 1,
4196
+ title: labels?.previousPage || t("previousPage"),
4197
+ "aria-label": labels?.previousPage || t("previousPage"),
4198
+ "aria-disabled": disabled || page === 1,
4199
+ children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.previous || t("previous") })
4200
+ }
4201
+ ),
4202
+ showPageNumbers && createPageArray().map((p, i) => {
4203
+ if (p === "...") {
4204
+ return /* @__PURE__ */ jsx24(Button_default, { variant: "ghost", size, disabled: true, icon: MoreHorizontal2, className: "cursor-default" }, i);
4205
+ }
4206
+ const pageNumber = p;
4207
+ const isActive = page === pageNumber;
4208
+ return /* @__PURE__ */ jsx24(
4209
+ Button_default,
4210
+ {
4211
+ variant: getButtonVariant(isActive),
4212
+ size,
4213
+ onClick: () => onChange(pageNumber),
4214
+ disabled,
4215
+ className: cn("min-w-[2.5rem]", isActive && "font-semibold"),
4216
+ "aria-label": labels?.pageNumber ? labels.pageNumber(pageNumber) : t("pageNumber", { page: pageNumber }),
4217
+ "aria-current": isActive ? "page" : void 0,
4218
+ children: pageNumber
4219
+ },
4220
+ i
4221
+ );
4222
+ }),
4223
+ showPrevNext && /* @__PURE__ */ jsx24(
4224
+ Button_default,
4225
+ {
4226
+ variant: getButtonVariant(false),
4227
+ size,
4228
+ iconRight: ChevronRight2,
4229
+ onClick: () => onChange(Math.min(totalPages, page + 1)),
4230
+ disabled: disabled || page === totalPages,
4231
+ title: labels?.nextPage || t("nextPage"),
4232
+ "aria-label": labels?.nextPage || t("nextPage"),
4233
+ "aria-disabled": disabled || page === totalPages,
4234
+ children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.next || t("next") })
4235
+ }
4236
+ ),
4237
+ showFirstLast && /* @__PURE__ */ jsx24(
4238
+ Button_default,
4239
+ {
4240
+ variant: getButtonVariant(false),
4241
+ size,
4242
+ icon: ChevronsRight,
4243
+ onClick: () => onChange(totalPages),
4244
+ disabled: disabled || page === totalPages,
4245
+ className: "hidden sm:flex",
4246
+ title: labels?.lastPage || t("lastPage"),
4247
+ "aria-label": labels?.lastPage || t("lastPage"),
4248
+ "aria-disabled": disabled || page === totalPages
4249
+ }
4250
+ )
4241
4251
  ] }),
4242
- /* @__PURE__ */ jsx24("div", { className: "w-20", children: /* @__PURE__ */ jsx24(
4243
- Combobox,
4244
- {
4245
- options: pageSizeOptionsStrings,
4246
- value: pageSize?.toString() || "10",
4247
- onChange: handlePageSizeChange,
4248
- placeholder: "10",
4249
- searchPlaceholder: labels?.search || t("search"),
4250
- emptyText: labels?.noOptions || t("noOptions"),
4251
- disabled
4252
- }
4253
- ) })
4252
+ pageSizeOptions && onPageSizeChange && /* @__PURE__ */ jsxs22("div", { className: cn("flex items-center gap-2 text-sm"), children: [
4253
+ /* @__PURE__ */ jsxs22("span", { className: "text-muted-foreground", children: [
4254
+ labels?.itemsPerPage || t("itemsPerPage"),
4255
+ ":"
4256
+ ] }),
4257
+ /* @__PURE__ */ jsx24("div", { className: "w-20", children: /* @__PURE__ */ jsx24(
4258
+ Combobox,
4259
+ {
4260
+ options: pageSizeOptionsStrings,
4261
+ value: pageSize?.toString() || "10",
4262
+ onChange: handlePageSizeChange,
4263
+ placeholder: "10",
4264
+ searchPlaceholder: labels?.search || t("search"),
4265
+ emptyText: labels?.noOptions || t("noOptions"),
4266
+ disabled
4267
+ }
4268
+ ) })
4269
+ ] })
4254
4270
  ] })
4255
4271
  ] });
4256
4272
  };
@@ -7003,6 +7019,7 @@ function DataTable({
7003
7019
  total = 0,
7004
7020
  page = 1,
7005
7021
  pageSize = 20,
7022
+ pageSizeOptions,
7006
7023
  onQueryChange,
7007
7024
  caption,
7008
7025
  toolbar,
@@ -7021,6 +7038,12 @@ function DataTable({
7021
7038
  const [curPage, setCurPage] = React30.useState(page);
7022
7039
  const [curPageSize, setCurPageSize] = React30.useState(pageSize);
7023
7040
  const debouncedFilters = useDebounced(filters, 350);
7041
+ React30.useEffect(() => {
7042
+ setCurPage(page);
7043
+ }, [page]);
7044
+ React30.useEffect(() => {
7045
+ setCurPageSize(pageSize);
7046
+ }, [pageSize]);
7024
7047
  React30.useEffect(() => {
7025
7048
  if (!onQueryChange) return;
7026
7049
  onQueryChange({ filters: debouncedFilters, sort, page: curPage, pageSize: curPageSize });
@@ -7182,6 +7205,12 @@ function DataTable({
7182
7205
  },
7183
7206
  col.key
7184
7207
  )) });
7208
+ const isServerMode = Boolean(onQueryChange);
7209
+ const displayedData = isServerMode ? data : React30.useMemo(() => {
7210
+ const start = (curPage - 1) * curPageSize;
7211
+ return data.slice(start, start + curPageSize);
7212
+ }, [data, curPage, curPageSize]);
7213
+ const totalItems = isServerMode ? total : data.length;
7185
7214
  return /* @__PURE__ */ jsxs33("div", { className: cn("space-y-2", className), children: [
7186
7215
  /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between gap-4 mb-1", children: [
7187
7216
  /* @__PURE__ */ jsx39("div", { className: "text-sm text-muted-foreground", children: caption }),
@@ -7253,7 +7282,7 @@ function DataTable({
7253
7282
  )
7254
7283
  ] }),
7255
7284
  /* @__PURE__ */ jsx39("span", { className: "text-sm", children: "Loading..." })
7256
- ] }) }) }) : !data || data.length === 0 ? /* @__PURE__ */ jsx39(TableRow, { children: /* @__PURE__ */ jsx39(TableCell, { colSpan: visibleColumns.length, className: "text-center py-6 text-muted-foreground", children: "No data" }) }) : data.map((row, idx) => /* @__PURE__ */ jsx39(TableRow, { className: cn(densityRowClass, striped && idx % 2 === 0 && "bg-muted/30"), children: visibleColumns.map((col) => {
7285
+ ] }) }) }) : !displayedData || displayedData.length === 0 ? /* @__PURE__ */ jsx39(TableRow, { children: /* @__PURE__ */ jsx39(TableCell, { colSpan: visibleColumns.length, className: "text-center py-6 text-muted-foreground", children: "No data" }) }) : displayedData.map((row, idx) => /* @__PURE__ */ jsx39(TableRow, { className: cn(densityRowClass, striped && idx % 2 === 0 && "bg-muted/30"), children: visibleColumns.map((col) => {
7257
7286
  const value = col.dataIndex ? row[col.dataIndex] : void 0;
7258
7287
  return /* @__PURE__ */ jsx39(
7259
7288
  TableCell,
@@ -7273,16 +7302,21 @@ function DataTable({
7273
7302
  ]
7274
7303
  }
7275
7304
  ) }),
7276
- total > 0 && /* @__PURE__ */ jsx39("div", { className: "border-t bg-muted/30 p-4 rounded-b-lg", children: /* @__PURE__ */ jsx39(
7305
+ totalItems > 0 && /* @__PURE__ */ jsx39("div", { className: "border-t bg-muted/30 p-4 rounded-b-lg", children: /* @__PURE__ */ jsx39(
7277
7306
  Pagination,
7278
7307
  {
7279
7308
  page: curPage,
7280
- totalPages: Math.ceil(total / curPageSize),
7309
+ totalPages: Math.ceil(totalItems / curPageSize),
7281
7310
  onChange: (p) => setCurPage(p),
7282
7311
  className: "",
7283
7312
  showInfo: true,
7284
- totalItems: total,
7285
- pageSize: curPageSize
7313
+ totalItems,
7314
+ pageSize: curPageSize,
7315
+ pageSizeOptions,
7316
+ onPageSizeChange: (s) => {
7317
+ setCurPage(1);
7318
+ setCurPageSize(s);
7319
+ }
7286
7320
  }
7287
7321
  ) })
7288
7322
  ] });