next-recomponents 1.9.5 → 1.9.52

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.mts CHANGED
@@ -201,18 +201,20 @@ type Props = {
201
201
  };
202
202
  declare function DocumentViewer({ item }: Props): react_jsx_runtime.JSX.Element;
203
203
 
204
- interface Table3Props extends DetailedHTMLProps<TableHTMLAttributes<HTMLTableElement>, HTMLTableElement> {
205
- data: Record<string, any>[];
204
+ interface Table3Props<T extends Record<string, any>> extends DetailedHTMLProps<TableHTMLAttributes<HTMLTableElement>, HTMLTableElement> {
205
+ data: T[];
206
206
  selectItems?: boolean;
207
207
  maxItems?: number;
208
208
  onSave?: (e: any) => void;
209
209
  exportName?: string;
210
- colSizes?: Record<string, number>;
210
+ colSizes?: Partial<Record<keyof T, number>>;
211
211
  modal?: React$1.ReactNode;
212
- footer?: Record<string, "sum" | "count" | "avg">;
212
+ footer?: Partial<Record<keyof T, "sum" | "count" | "avg">>;
213
213
  header?: React$1.ReactNode;
214
214
  onChange?: (e: any) => any;
215
+ symbols?: Partial<Record<keyof T, React$1.ReactNode>>;
216
+ sortBy?: Partial<Record<keyof T, "asc" | "desc">>;
215
217
  }
216
- declare function Table3({ data, selectItems, maxItems, onSave, exportName, colSizes, modal, header, footer, onChange, ...props }: Table3Props): react_jsx_runtime.JSX.Element | null;
218
+ declare function Table3<T extends Record<string, any>>({ data, selectItems, maxItems, onSave, exportName, colSizes, modal, header, footer, onChange, symbols, sortBy, ...props }: Table3Props<T>): react_jsx_runtime.JSX.Element | null;
217
219
 
218
220
  export { Alert, Button, Container, DocumentViewer, Form, Input, Modal, MyCalendar, Pre, Select, Table, Table3, type TableEventProps, TextArea, regularExpresions, useDates, useExcel, useFormValues, useResources };
package/dist/index.d.ts CHANGED
@@ -201,18 +201,20 @@ type Props = {
201
201
  };
202
202
  declare function DocumentViewer({ item }: Props): react_jsx_runtime.JSX.Element;
203
203
 
204
- interface Table3Props extends DetailedHTMLProps<TableHTMLAttributes<HTMLTableElement>, HTMLTableElement> {
205
- data: Record<string, any>[];
204
+ interface Table3Props<T extends Record<string, any>> extends DetailedHTMLProps<TableHTMLAttributes<HTMLTableElement>, HTMLTableElement> {
205
+ data: T[];
206
206
  selectItems?: boolean;
207
207
  maxItems?: number;
208
208
  onSave?: (e: any) => void;
209
209
  exportName?: string;
210
- colSizes?: Record<string, number>;
210
+ colSizes?: Partial<Record<keyof T, number>>;
211
211
  modal?: React$1.ReactNode;
212
- footer?: Record<string, "sum" | "count" | "avg">;
212
+ footer?: Partial<Record<keyof T, "sum" | "count" | "avg">>;
213
213
  header?: React$1.ReactNode;
214
214
  onChange?: (e: any) => any;
215
+ symbols?: Partial<Record<keyof T, React$1.ReactNode>>;
216
+ sortBy?: Partial<Record<keyof T, "asc" | "desc">>;
215
217
  }
216
- declare function Table3({ data, selectItems, maxItems, onSave, exportName, colSizes, modal, header, footer, onChange, ...props }: Table3Props): react_jsx_runtime.JSX.Element | null;
218
+ declare function Table3<T extends Record<string, any>>({ data, selectItems, maxItems, onSave, exportName, colSizes, modal, header, footer, onChange, symbols, sortBy, ...props }: Table3Props<T>): react_jsx_runtime.JSX.Element | null;
217
219
 
218
220
  export { Alert, Button, Container, DocumentViewer, Form, Input, Modal, MyCalendar, Pre, Select, Table, Table3, type TableEventProps, TextArea, regularExpresions, useDates, useExcel, useFormValues, useResources };
package/dist/index.js CHANGED
@@ -12007,6 +12007,36 @@ function FilterOffIcon() {
12007
12007
  }
12008
12008
  );
12009
12009
  }
12010
+ function OrderDesc() {
12011
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
12012
+ "svg",
12013
+ {
12014
+ stroke: "currentColor",
12015
+ fill: "currentColor",
12016
+ strokeWidth: "0",
12017
+ viewBox: "0 0 448 512",
12018
+ height: "20px",
12019
+ width: "20px",
12020
+ xmlns: "http://www.w3.org/2000/svg",
12021
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", { d: "M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm112-128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z" })
12022
+ }
12023
+ );
12024
+ }
12025
+ function OrderAsc() {
12026
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
12027
+ "svg",
12028
+ {
12029
+ stroke: "currentColor",
12030
+ fill: "currentColor",
12031
+ strokeWidth: "0",
12032
+ viewBox: "0 0 448 512",
12033
+ height: "20px",
12034
+ width: "20px",
12035
+ xmlns: "http://www.w3.org/2000/svg",
12036
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", { d: "M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm240-64H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z" })
12037
+ }
12038
+ );
12039
+ }
12010
12040
  function EditIcon() {
12011
12041
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
12012
12042
  "svg",
@@ -45596,7 +45626,9 @@ function Filter({
45596
45626
  setObjectData,
45597
45627
  setPage,
45598
45628
  colSizes,
45599
- data
45629
+ data,
45630
+ sort,
45631
+ setSort
45600
45632
  }) {
45601
45633
  const [visible, setVisible] = (0, import_react33.useState)(false);
45602
45634
  const [text, setText] = (0, import_react33.useState)("");
@@ -45661,14 +45693,15 @@ function Filter({
45661
45693
  /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
45662
45694
  "div",
45663
45695
  {
45664
- style: {
45665
- minWidth: "100px",
45666
- maxWidth: `${((colSizes == null ? void 0 : colSizes[h]) || 0) + 100}px`,
45667
- width: `${colSizes == null ? void 0 : colSizes[h]}px`
45668
- },
45669
- className: `resize-x overflow-auto text-center flex justify-evenly p-1 items-center`,
45696
+ style: (colSizes == null ? void 0 : colSizes[h]) ? {
45697
+ minWidth: "100%",
45698
+ maxWidth: `${(colSizes[h] || 0) + 300}px`,
45699
+ width: `${colSizes[h]}px`
45700
+ } : { minWidth: "100%", maxWidth: "500px" },
45701
+ className: `resize-x overflow-hidden text-center flex justify-evenly p-1 items-center gap-2`,
45670
45702
  onClick: (e) => setVisible(!visible),
45671
45703
  children: [
45704
+ sort && Object.keys(sort)[0] == h && ((sort == null ? void 0 : sort[h]) == "asc" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-green-300", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(OrderAsc, {}) }) : (sort == null ? void 0 : sort[h]) == "desc" && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-green-300", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(OrderDesc, {}) })),
45672
45705
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { children: h }),
45673
45706
  selected.length < items.length && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "text-red-500 ", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(FilterOffIcon, {}) })
45674
45707
  ]
@@ -45680,6 +45713,48 @@ function Filter({
45680
45713
  className: "border shadow rounded bg-white p-1 absolute left-0 text-black",
45681
45714
  style: { zIndex: 9999 },
45682
45715
  children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex flex-col gap-1 w-[300px] min-w-[300px] resize-x overflow-auto", children: [
45716
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
45717
+ "div",
45718
+ {
45719
+ onClick: (e) => {
45720
+ const newSort = __spreadValues({}, sort);
45721
+ newSort[h] = "asc";
45722
+ const reorderedSort = __spreadValues({
45723
+ [h]: "asc"
45724
+ }, Object.fromEntries(
45725
+ Object.entries(newSort).filter(([key]) => key !== h)
45726
+ ));
45727
+ setSort(reorderedSort);
45728
+ setVisible(false);
45729
+ },
45730
+ className: "flex items-center gap-2 border p-1 hover:bg-blue-100",
45731
+ children: [
45732
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(OrderAsc, {}),
45733
+ " Ordenar de la A a la Z"
45734
+ ]
45735
+ }
45736
+ ),
45737
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
45738
+ "div",
45739
+ {
45740
+ onClick: (e) => {
45741
+ const newSort = __spreadValues({}, sort);
45742
+ newSort[h] = "desc";
45743
+ const reorderedSort = __spreadValues({
45744
+ [h]: "desc"
45745
+ }, Object.fromEntries(
45746
+ Object.entries(newSort).filter(([key]) => key !== h)
45747
+ ));
45748
+ setSort(reorderedSort);
45749
+ setVisible(false);
45750
+ },
45751
+ className: "flex items-center gap-2 border p-1 hover:bg-blue-100",
45752
+ children: [
45753
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(OrderDesc, {}),
45754
+ "Ordenar de la Z a la A"
45755
+ ]
45756
+ }
45757
+ ),
45683
45758
  selected.length < items.length && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
45684
45759
  "div",
45685
45760
  {
@@ -45794,7 +45869,9 @@ function TableHead({
45794
45869
  data,
45795
45870
  maxItems,
45796
45871
  colSizes,
45797
- modal
45872
+ modal,
45873
+ sort,
45874
+ setSort
45798
45875
  }) {
45799
45876
  return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("tr", { className: "bg-blue-500 text-white font-bold", children: [
45800
45877
  modal && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("th", { children: "-" }),
@@ -45834,7 +45911,9 @@ function TableHead({
45834
45911
  setObjectData,
45835
45912
  setPage,
45836
45913
  colSizes,
45837
- data
45914
+ data,
45915
+ sort,
45916
+ setSort
45838
45917
  },
45839
45918
  h
45840
45919
  );
@@ -45863,7 +45942,8 @@ function TR({
45863
45942
  index,
45864
45943
  selected,
45865
45944
  setSelected,
45866
- onChange
45945
+ onChange,
45946
+ symbols
45867
45947
  }) {
45868
45948
  const color2 = selected == index ? "bg-blue-600 text-white hover:bg-blue-800" : index % 2 == 0 ? "bg-white" : "bg-blue-50";
45869
45949
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
@@ -45937,7 +46017,18 @@ function TR({
45937
46017
  }, {})));
45938
46018
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("td", { className: `text-black `, children: cloned }, h);
45939
46019
  }
45940
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("td", { className: `text-center border max-w-[${colSize}px]`, children: row[h] }, h);
46020
+ return symbols && (symbols == null ? void 0 : symbols[h]) ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
46021
+ "td",
46022
+ {
46023
+ className: `text-center border max-w-[${colSize}px] flex items-center gap-1`,
46024
+ children: [
46025
+ symbols[h],
46026
+ " ",
46027
+ row[h]
46028
+ ]
46029
+ },
46030
+ h
46031
+ ) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("td", { className: `text-center border max-w-[${colSize}px]`, children: row[h] }, h);
45941
46032
  })
45942
46033
  ]
45943
46034
  },
@@ -45960,10 +46051,23 @@ function TableBody({
45960
46051
  modalRef,
45961
46052
  dialogRow,
45962
46053
  setDialogRow,
45963
- onChange
46054
+ onChange,
46055
+ symbols,
46056
+ sort
45964
46057
  }) {
45965
46058
  const [selected, setSelected] = (0, import_react35.useState)(-1);
45966
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tbody", { children: Object.keys(objectData).reverse().filter((id3) => {
46059
+ const sorted = Object.entries(objectData).sort(([, a], [, b]) => {
46060
+ for (const [key, order] of Object.entries(
46061
+ sort || { id: "desc", _id: "desc" }
46062
+ )) {
46063
+ const valA = a[key];
46064
+ const valB = b[key];
46065
+ if (valA === valB) continue;
46066
+ const comparison = valA > valB ? 1 : valA < valB ? -1 : 0;
46067
+ return order === "desc" ? -comparison : comparison;
46068
+ }
46069
+ return 0;
46070
+ }).filter(([id3, row]) => {
45967
46071
  var _a;
45968
46072
  return ((_a = objectData[id3]) == null ? void 0 : _a._visible) === true;
45969
46073
  }).filter((_id, key) => {
@@ -45971,7 +46075,7 @@ function TableBody({
45971
46075
  const start = (page - 1) * maxItems;
45972
46076
  const end = page * maxItems;
45973
46077
  return key >= start && key < end;
45974
- }).map((id3, index) => {
46078
+ }).map(([id3, k], index) => {
45975
46079
  const row = objectData[id3];
45976
46080
  return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
45977
46081
  TR,
@@ -45987,6 +46091,7 @@ function TableBody({
45987
46091
  modal,
45988
46092
  modalRef,
45989
46093
  dialogRow,
46094
+ symbols,
45990
46095
  setDialogRow,
45991
46096
  setSelected,
45992
46097
  selected,
@@ -45994,7 +46099,8 @@ function TableBody({
45994
46099
  }),
45995
46100
  id3
45996
46101
  );
45997
- }) });
46102
+ });
46103
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tbody", { children: sorted });
45998
46104
  }
45999
46105
 
46000
46106
  // src/table3/panel.tsx
@@ -46081,7 +46187,8 @@ function TableFooter({
46081
46187
  headers,
46082
46188
  footer,
46083
46189
  selectItems,
46084
- modal
46190
+ modal,
46191
+ symbols
46085
46192
  }) {
46086
46193
  function operacion(tipo, header) {
46087
46194
  switch (tipo) {
@@ -46106,7 +46213,11 @@ function TableFooter({
46106
46213
  if (header.startsWith("_")) {
46107
46214
  return null;
46108
46215
  } else if (footer == null ? void 0 : footer[header]) {
46109
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("th", { children: operacion(footer[header], header) }, header);
46216
+ return symbols && (symbols == null ? void 0 : symbols[header]) ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("th", { className: "flex items-center gap-1", children: [
46217
+ symbols[header],
46218
+ " ",
46219
+ operacion(footer[header], header)
46220
+ ] }, header) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("th", { children: operacion(footer[header], header) }, header);
46110
46221
  }
46111
46222
  return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("th", {}, header);
46112
46223
  })
@@ -46183,7 +46294,9 @@ function Table3(_a) {
46183
46294
  modal,
46184
46295
  header,
46185
46296
  footer,
46186
- onChange
46297
+ onChange,
46298
+ symbols,
46299
+ sortBy
46187
46300
  } = _b, props = __objRest(_b, [
46188
46301
  "data",
46189
46302
  "selectItems",
@@ -46194,7 +46307,9 @@ function Table3(_a) {
46194
46307
  "modal",
46195
46308
  "header",
46196
46309
  "footer",
46197
- "onChange"
46310
+ "onChange",
46311
+ "symbols",
46312
+ "sortBy"
46198
46313
  ]);
46199
46314
  const [handlers, setHandlers] = (0, import_react37.useState)({});
46200
46315
  const [page, setPage] = (0, import_react37.useState)(1);
@@ -46251,6 +46366,7 @@ function Table3(_a) {
46251
46366
  if (!objectData) return 0;
46252
46367
  return maxItems ? Math.ceil(Object.keys(objectData).length / maxItems) : 1;
46253
46368
  }, [objectData, maxItems]);
46369
+ const [sort, setSort] = (0, import_react37.useState)(sortBy);
46254
46370
  const modalRef = (0, import_react37.useRef)(null);
46255
46371
  const [dialogRow, setDialogRow] = (0, import_react37.useState)({});
46256
46372
  const context = __spreadValues({
@@ -46273,7 +46389,10 @@ function Table3(_a) {
46273
46389
  header,
46274
46390
  footer,
46275
46391
  onChange,
46276
- data
46392
+ data,
46393
+ symbols,
46394
+ sort,
46395
+ setSort
46277
46396
  }, props);
46278
46397
  (0, import_react37.useEffect)(() => {
46279
46398
  if ((dialogRow == null ? void 0 : dialogRow.id) || (dialogRow == null ? void 0 : dialogRow._id)) {
package/dist/index.mjs CHANGED
@@ -11988,6 +11988,36 @@ function FilterOffIcon() {
11988
11988
  }
11989
11989
  );
11990
11990
  }
11991
+ function OrderDesc() {
11992
+ return /* @__PURE__ */ jsx9(
11993
+ "svg",
11994
+ {
11995
+ stroke: "currentColor",
11996
+ fill: "currentColor",
11997
+ strokeWidth: "0",
11998
+ viewBox: "0 0 448 512",
11999
+ height: "20px",
12000
+ width: "20px",
12001
+ xmlns: "http://www.w3.org/2000/svg",
12002
+ children: /* @__PURE__ */ jsx9("path", { d: "M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm112-128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z" })
12003
+ }
12004
+ );
12005
+ }
12006
+ function OrderAsc() {
12007
+ return /* @__PURE__ */ jsx9(
12008
+ "svg",
12009
+ {
12010
+ stroke: "currentColor",
12011
+ fill: "currentColor",
12012
+ strokeWidth: "0",
12013
+ viewBox: "0 0 448 512",
12014
+ height: "20px",
12015
+ width: "20px",
12016
+ xmlns: "http://www.w3.org/2000/svg",
12017
+ children: /* @__PURE__ */ jsx9("path", { d: "M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm240-64H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z" })
12018
+ }
12019
+ );
12020
+ }
11991
12021
  function EditIcon() {
11992
12022
  return /* @__PURE__ */ jsx9(
11993
12023
  "svg",
@@ -45593,7 +45623,9 @@ function Filter({
45593
45623
  setObjectData,
45594
45624
  setPage,
45595
45625
  colSizes,
45596
- data
45626
+ data,
45627
+ sort,
45628
+ setSort
45597
45629
  }) {
45598
45630
  const [visible, setVisible] = useState12(false);
45599
45631
  const [text, setText] = useState12("");
@@ -45658,14 +45690,15 @@ function Filter({
45658
45690
  /* @__PURE__ */ jsxs18(
45659
45691
  "div",
45660
45692
  {
45661
- style: {
45662
- minWidth: "100px",
45663
- maxWidth: `${((colSizes == null ? void 0 : colSizes[h]) || 0) + 100}px`,
45664
- width: `${colSizes == null ? void 0 : colSizes[h]}px`
45665
- },
45666
- className: `resize-x overflow-auto text-center flex justify-evenly p-1 items-center`,
45693
+ style: (colSizes == null ? void 0 : colSizes[h]) ? {
45694
+ minWidth: "100%",
45695
+ maxWidth: `${(colSizes[h] || 0) + 300}px`,
45696
+ width: `${colSizes[h]}px`
45697
+ } : { minWidth: "100%", maxWidth: "500px" },
45698
+ className: `resize-x overflow-hidden text-center flex justify-evenly p-1 items-center gap-2`,
45667
45699
  onClick: (e) => setVisible(!visible),
45668
45700
  children: [
45701
+ sort && Object.keys(sort)[0] == h && ((sort == null ? void 0 : sort[h]) == "asc" ? /* @__PURE__ */ jsx27("div", { className: "text-green-300", children: /* @__PURE__ */ jsx27(OrderAsc, {}) }) : (sort == null ? void 0 : sort[h]) == "desc" && /* @__PURE__ */ jsx27("div", { className: "text-green-300", children: /* @__PURE__ */ jsx27(OrderDesc, {}) })),
45669
45702
  /* @__PURE__ */ jsx27("div", { children: h }),
45670
45703
  selected.length < items.length && /* @__PURE__ */ jsx27("div", { className: "text-red-500 ", children: /* @__PURE__ */ jsx27(FilterOffIcon, {}) })
45671
45704
  ]
@@ -45677,6 +45710,48 @@ function Filter({
45677
45710
  className: "border shadow rounded bg-white p-1 absolute left-0 text-black",
45678
45711
  style: { zIndex: 9999 },
45679
45712
  children: /* @__PURE__ */ jsxs18("div", { className: "flex flex-col gap-1 w-[300px] min-w-[300px] resize-x overflow-auto", children: [
45713
+ /* @__PURE__ */ jsxs18(
45714
+ "div",
45715
+ {
45716
+ onClick: (e) => {
45717
+ const newSort = __spreadValues({}, sort);
45718
+ newSort[h] = "asc";
45719
+ const reorderedSort = __spreadValues({
45720
+ [h]: "asc"
45721
+ }, Object.fromEntries(
45722
+ Object.entries(newSort).filter(([key]) => key !== h)
45723
+ ));
45724
+ setSort(reorderedSort);
45725
+ setVisible(false);
45726
+ },
45727
+ className: "flex items-center gap-2 border p-1 hover:bg-blue-100",
45728
+ children: [
45729
+ /* @__PURE__ */ jsx27(OrderAsc, {}),
45730
+ " Ordenar de la A a la Z"
45731
+ ]
45732
+ }
45733
+ ),
45734
+ /* @__PURE__ */ jsxs18(
45735
+ "div",
45736
+ {
45737
+ onClick: (e) => {
45738
+ const newSort = __spreadValues({}, sort);
45739
+ newSort[h] = "desc";
45740
+ const reorderedSort = __spreadValues({
45741
+ [h]: "desc"
45742
+ }, Object.fromEntries(
45743
+ Object.entries(newSort).filter(([key]) => key !== h)
45744
+ ));
45745
+ setSort(reorderedSort);
45746
+ setVisible(false);
45747
+ },
45748
+ className: "flex items-center gap-2 border p-1 hover:bg-blue-100",
45749
+ children: [
45750
+ /* @__PURE__ */ jsx27(OrderDesc, {}),
45751
+ "Ordenar de la Z a la A"
45752
+ ]
45753
+ }
45754
+ ),
45680
45755
  selected.length < items.length && /* @__PURE__ */ jsxs18(
45681
45756
  "div",
45682
45757
  {
@@ -45791,7 +45866,9 @@ function TableHead({
45791
45866
  data,
45792
45867
  maxItems,
45793
45868
  colSizes,
45794
- modal
45869
+ modal,
45870
+ sort,
45871
+ setSort
45795
45872
  }) {
45796
45873
  return /* @__PURE__ */ jsx28("thead", { children: /* @__PURE__ */ jsxs19("tr", { className: "bg-blue-500 text-white font-bold", children: [
45797
45874
  modal && /* @__PURE__ */ jsx28("th", { children: "-" }),
@@ -45831,7 +45908,9 @@ function TableHead({
45831
45908
  setObjectData,
45832
45909
  setPage,
45833
45910
  colSizes,
45834
- data
45911
+ data,
45912
+ sort,
45913
+ setSort
45835
45914
  },
45836
45915
  h
45837
45916
  );
@@ -45860,7 +45939,8 @@ function TR({
45860
45939
  index,
45861
45940
  selected,
45862
45941
  setSelected,
45863
- onChange
45942
+ onChange,
45943
+ symbols
45864
45944
  }) {
45865
45945
  const color2 = selected == index ? "bg-blue-600 text-white hover:bg-blue-800" : index % 2 == 0 ? "bg-white" : "bg-blue-50";
45866
45946
  return /* @__PURE__ */ jsxs20(
@@ -45934,7 +46014,18 @@ function TR({
45934
46014
  }, {})));
45935
46015
  return /* @__PURE__ */ jsx29("td", { className: `text-black `, children: cloned }, h);
45936
46016
  }
45937
- return /* @__PURE__ */ jsx29("td", { className: `text-center border max-w-[${colSize}px]`, children: row[h] }, h);
46017
+ return symbols && (symbols == null ? void 0 : symbols[h]) ? /* @__PURE__ */ jsxs20(
46018
+ "td",
46019
+ {
46020
+ className: `text-center border max-w-[${colSize}px] flex items-center gap-1`,
46021
+ children: [
46022
+ symbols[h],
46023
+ " ",
46024
+ row[h]
46025
+ ]
46026
+ },
46027
+ h
46028
+ ) : /* @__PURE__ */ jsx29("td", { className: `text-center border max-w-[${colSize}px]`, children: row[h] }, h);
45938
46029
  })
45939
46030
  ]
45940
46031
  },
@@ -45957,10 +46048,23 @@ function TableBody({
45957
46048
  modalRef,
45958
46049
  dialogRow,
45959
46050
  setDialogRow,
45960
- onChange
46051
+ onChange,
46052
+ symbols,
46053
+ sort
45961
46054
  }) {
45962
46055
  const [selected, setSelected] = useState13(-1);
45963
- return /* @__PURE__ */ jsx30("tbody", { children: Object.keys(objectData).reverse().filter((id3) => {
46056
+ const sorted = Object.entries(objectData).sort(([, a], [, b]) => {
46057
+ for (const [key, order] of Object.entries(
46058
+ sort || { id: "desc", _id: "desc" }
46059
+ )) {
46060
+ const valA = a[key];
46061
+ const valB = b[key];
46062
+ if (valA === valB) continue;
46063
+ const comparison = valA > valB ? 1 : valA < valB ? -1 : 0;
46064
+ return order === "desc" ? -comparison : comparison;
46065
+ }
46066
+ return 0;
46067
+ }).filter(([id3, row]) => {
45964
46068
  var _a;
45965
46069
  return ((_a = objectData[id3]) == null ? void 0 : _a._visible) === true;
45966
46070
  }).filter((_id, key) => {
@@ -45968,7 +46072,7 @@ function TableBody({
45968
46072
  const start = (page - 1) * maxItems;
45969
46073
  const end = page * maxItems;
45970
46074
  return key >= start && key < end;
45971
- }).map((id3, index) => {
46075
+ }).map(([id3, k], index) => {
45972
46076
  const row = objectData[id3];
45973
46077
  return /* @__PURE__ */ jsx30(
45974
46078
  TR,
@@ -45984,6 +46088,7 @@ function TableBody({
45984
46088
  modal,
45985
46089
  modalRef,
45986
46090
  dialogRow,
46091
+ symbols,
45987
46092
  setDialogRow,
45988
46093
  setSelected,
45989
46094
  selected,
@@ -45991,7 +46096,8 @@ function TableBody({
45991
46096
  }),
45992
46097
  id3
45993
46098
  );
45994
- }) });
46099
+ });
46100
+ return /* @__PURE__ */ jsx30("tbody", { children: sorted });
45995
46101
  }
45996
46102
 
45997
46103
  // src/table3/panel.tsx
@@ -46078,7 +46184,8 @@ function TableFooter({
46078
46184
  headers,
46079
46185
  footer,
46080
46186
  selectItems,
46081
- modal
46187
+ modal,
46188
+ symbols
46082
46189
  }) {
46083
46190
  function operacion(tipo, header) {
46084
46191
  switch (tipo) {
@@ -46103,7 +46210,11 @@ function TableFooter({
46103
46210
  if (header.startsWith("_")) {
46104
46211
  return null;
46105
46212
  } else if (footer == null ? void 0 : footer[header]) {
46106
- return /* @__PURE__ */ jsx32("th", { children: operacion(footer[header], header) }, header);
46213
+ return symbols && (symbols == null ? void 0 : symbols[header]) ? /* @__PURE__ */ jsxs22("th", { className: "flex items-center gap-1", children: [
46214
+ symbols[header],
46215
+ " ",
46216
+ operacion(footer[header], header)
46217
+ ] }, header) : /* @__PURE__ */ jsx32("th", { children: operacion(footer[header], header) }, header);
46107
46218
  }
46108
46219
  return /* @__PURE__ */ jsx32("th", {}, header);
46109
46220
  })
@@ -46180,7 +46291,9 @@ function Table3(_a) {
46180
46291
  modal,
46181
46292
  header,
46182
46293
  footer,
46183
- onChange
46294
+ onChange,
46295
+ symbols,
46296
+ sortBy
46184
46297
  } = _b, props = __objRest(_b, [
46185
46298
  "data",
46186
46299
  "selectItems",
@@ -46191,7 +46304,9 @@ function Table3(_a) {
46191
46304
  "modal",
46192
46305
  "header",
46193
46306
  "footer",
46194
- "onChange"
46307
+ "onChange",
46308
+ "symbols",
46309
+ "sortBy"
46195
46310
  ]);
46196
46311
  const [handlers, setHandlers] = useState14({});
46197
46312
  const [page, setPage] = useState14(1);
@@ -46248,6 +46363,7 @@ function Table3(_a) {
46248
46363
  if (!objectData) return 0;
46249
46364
  return maxItems ? Math.ceil(Object.keys(objectData).length / maxItems) : 1;
46250
46365
  }, [objectData, maxItems]);
46366
+ const [sort, setSort] = useState14(sortBy);
46251
46367
  const modalRef = useRef8(null);
46252
46368
  const [dialogRow, setDialogRow] = useState14({});
46253
46369
  const context = __spreadValues({
@@ -46270,7 +46386,10 @@ function Table3(_a) {
46270
46386
  header,
46271
46387
  footer,
46272
46388
  onChange,
46273
- data
46389
+ data,
46390
+ symbols,
46391
+ sort,
46392
+ setSort
46274
46393
  }, props);
46275
46394
  useEffect11(() => {
46276
46395
  if ((dialogRow == null ? void 0 : dialogRow.id) || (dialogRow == null ? void 0 : dialogRow._id)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-recomponents",
3
- "version": "1.9.5",
3
+ "version": "1.9.52",
4
4
  "description": "description 2",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,6 +13,38 @@ export function FilterOffIcon() {
13
13
  </svg>
14
14
  );
15
15
  }
16
+
17
+ export function OrderDesc() {
18
+ return (
19
+ <svg
20
+ stroke="currentColor"
21
+ fill="currentColor"
22
+ strokeWidth="0"
23
+ viewBox="0 0 448 512"
24
+ height="20px"
25
+ width="20px"
26
+ xmlns="http://www.w3.org/2000/svg"
27
+ >
28
+ <path d="M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm112-128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 65.63V48a16 16 0 0 0-16-16H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 190.37V208a16 16 0 0 0 16 16zm159.06 234.62l-59.27-160A16 16 0 0 0 372.72 288h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 480h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 480H432a16 16 0 0 0 15.06-21.38zM335.61 400L352 352l16.39 48z"></path>
29
+ </svg>
30
+ );
31
+ }
32
+
33
+ export function OrderAsc() {
34
+ return (
35
+ <svg
36
+ stroke="currentColor"
37
+ fill="currentColor"
38
+ strokeWidth="0"
39
+ viewBox="0 0 448 512"
40
+ height="20px"
41
+ width="20px"
42
+ xmlns="http://www.w3.org/2000/svg"
43
+ >
44
+ <path d="M176 352h-48V48a16 16 0 0 0-16-16H80a16 16 0 0 0-16 16v304H16c-14.19 0-21.36 17.24-11.29 27.31l80 96a16 16 0 0 0 22.62 0l80-96C197.35 369.26 190.22 352 176 352zm240-64H288a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h56l-61.26 70.45A32 32 0 0 0 272 446.37V464a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-56l61.26-70.45A32 32 0 0 0 432 321.63V304a16 16 0 0 0-16-16zm31.06-85.38l-59.27-160A16 16 0 0 0 372.72 32h-41.44a16 16 0 0 0-15.07 10.62l-59.27 160A16 16 0 0 0 272 224h24.83a16 16 0 0 0 15.23-11.08l4.42-12.92h71l4.41 12.92A16 16 0 0 0 407.16 224H432a16 16 0 0 0 15.06-21.38zM335.61 144L352 96l16.39 48z"></path>
45
+ </svg>
46
+ );
47
+ }
16
48
  export function EditIcon() {
17
49
  return (
18
50
  <svg
@@ -15,6 +15,8 @@ export default function TableBody({
15
15
  dialogRow,
16
16
  setDialogRow,
17
17
  onChange,
18
+ symbols,
19
+ sort,
18
20
  }: {
19
21
  objectData: any;
20
22
  setObjectData: any;
@@ -23,53 +25,67 @@ export default function TableBody({
23
25
  selectItems?: boolean;
24
26
  page: number;
25
27
  maxItems?: number;
26
- colSizes?: Record<string, number>;
28
+ colSizes?: Partial<Record<string, number>>;
27
29
  modal?: React.ReactNode;
28
30
  modalRef: React.RefObject<HTMLDialogElement>;
29
31
  dialogRow: any;
30
32
  setDialogRow: any;
31
33
  onChange?: any;
34
+ symbols?: Record<string, React.ReactNode>;
35
+ sort: any;
32
36
  }) {
33
37
  const [selected, setSelected] = useState(-1);
38
+ const sorted = Object.entries(objectData)
39
+ .sort(([, a]: any, [, b]: any) => {
40
+ for (const [key, order] of Object.entries(
41
+ sort || { id: "desc", _id: "desc" }
42
+ )) {
43
+ const valA = a[key];
44
+ const valB = b[key];
34
45
 
35
- return (
36
- <tbody>
37
- {Object.keys(objectData)
38
- .reverse()
39
- .filter((id) => {
40
- return objectData[id]?._visible === true;
41
- })
42
- .filter((_id, key) => {
43
- if (!maxItems || maxItems == Infinity) return true;
44
- const start = (page - 1) * maxItems; // ej: 0 en la página 1
45
- const end = page * maxItems; // ej: 10 en la página 1
46
- return key >= start && key < end; // 👈 usamos < en vez de <=
47
- })
48
- .map((id, index) => {
49
- const row = objectData[id];
50
- return (
51
- <TR
52
- key={id}
53
- {...{
54
- headers,
55
- index,
56
- setObjectData,
57
- id,
58
- row,
59
- handlers,
60
- selectItems,
61
- colSizes,
62
- modal,
63
- modalRef,
64
- dialogRow,
65
- setDialogRow,
66
- setSelected,
67
- selected,
68
- onChange,
69
- }}
70
- />
71
- );
72
- })}
73
- </tbody>
74
- );
46
+ if (valA === valB) continue; // pasa al siguiente criterio
47
+
48
+ const comparison = valA > valB ? 1 : valA < valB ? -1 : 0;
49
+
50
+ return order === "desc" ? -comparison : comparison;
51
+ }
52
+ return 0;
53
+ })
54
+ .filter(([id, row]) => {
55
+ return objectData[id]?._visible === true;
56
+ })
57
+ .filter((_id, key) => {
58
+ if (!maxItems || maxItems == Infinity) return true;
59
+ const start = (page - 1) * maxItems; // ej: 0 en la página 1
60
+ const end = page * maxItems; // ej: 10 en la página 1
61
+ return key >= start && key < end; // 👈 usamos < en vez de <=
62
+ })
63
+ .map(([id, k], index) => {
64
+ const row = objectData[id];
65
+ return (
66
+ <TR
67
+ key={id}
68
+ {...{
69
+ headers,
70
+ index,
71
+ setObjectData,
72
+ id,
73
+ row,
74
+ handlers,
75
+ selectItems,
76
+ colSizes,
77
+ modal,
78
+ modalRef,
79
+ dialogRow,
80
+ symbols,
81
+ setDialogRow,
82
+ setSelected,
83
+ selected,
84
+ onChange,
85
+ }}
86
+ />
87
+ );
88
+ });
89
+
90
+ return <tbody>{sorted}</tbody>;
75
91
  }
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useEffect, useMemo, useState } from "react";
3
- import { FilterOffIcon } from "../../src/table/filters";
3
+ import { FilterOffIcon, OrderAsc, OrderDesc } from "../../src/table/filters";
4
4
 
5
5
  export default function Filter({
6
6
  h,
@@ -9,6 +9,8 @@ export default function Filter({
9
9
  setPage,
10
10
  colSizes,
11
11
  data,
12
+ sort,
13
+ setSort,
12
14
  }: {
13
15
  h: any;
14
16
  objectData: any;
@@ -16,6 +18,8 @@ export default function Filter({
16
18
  setPage: any;
17
19
  colSizes?: Record<string, number>;
18
20
  data: any[];
21
+ sort: any;
22
+ setSort: any;
19
23
  }) {
20
24
  const [visible, setVisible] = useState(false);
21
25
  const [text, setText] = useState("");
@@ -101,14 +105,31 @@ export default function Filter({
101
105
  </div>
102
106
  <div className="relative w-full justify-center flex">
103
107
  <div
104
- style={{
105
- minWidth: "100px",
106
- maxWidth: `${(colSizes?.[h] || 0) + 100}px`,
107
- width: `${colSizes?.[h]}px`,
108
- }}
109
- className={`resize-x overflow-auto text-center flex justify-evenly p-1 items-center`}
108
+ style={
109
+ colSizes?.[h]
110
+ ? {
111
+ minWidth: "100%",
112
+ maxWidth: `${(colSizes[h] || 0) + 300}px`,
113
+ width: `${colSizes[h]}px`,
114
+ }
115
+ : { minWidth: "100%", maxWidth: "500px" }
116
+ }
117
+ className={`resize-x overflow-hidden text-center flex justify-evenly p-1 items-center gap-2`}
110
118
  onClick={(e) => setVisible(!visible)}
111
119
  >
120
+ {sort &&
121
+ Object.keys(sort)[0] == h &&
122
+ (sort?.[h] == "asc" ? (
123
+ <div className="text-green-300">
124
+ <OrderAsc />
125
+ </div>
126
+ ) : (
127
+ sort?.[h] == "desc" && (
128
+ <div className="text-green-300">
129
+ <OrderDesc />
130
+ </div>
131
+ )
132
+ ))}
112
133
  <div>{h}</div>
113
134
  {selected.length < items.length && (
114
135
  <div className="text-red-500 ">
@@ -123,6 +144,47 @@ export default function Filter({
123
144
  style={{ zIndex: 9999 }}
124
145
  >
125
146
  <div className="flex flex-col gap-1 w-[300px] min-w-[300px] resize-x overflow-auto">
147
+ <div
148
+ onClick={(e) => {
149
+ const newSort = { ...sort };
150
+ newSort[h] = "asc";
151
+
152
+ // reconstruir con la nueva clave primero
153
+ const reorderedSort = {
154
+ [h]: "asc",
155
+ ...Object.fromEntries(
156
+ Object.entries(newSort).filter(([key]) => key !== h)
157
+ ),
158
+ };
159
+
160
+ setSort(reorderedSort);
161
+ setVisible(false);
162
+ }}
163
+ className="flex items-center gap-2 border p-1 hover:bg-blue-100"
164
+ >
165
+ <OrderAsc /> Ordenar de la A a la Z
166
+ </div>
167
+ <div
168
+ onClick={(e) => {
169
+ const newSort = { ...sort };
170
+ newSort[h] = "desc";
171
+
172
+ // reconstruir con la nueva clave primero
173
+ const reorderedSort = {
174
+ [h]: "desc",
175
+ ...Object.fromEntries(
176
+ Object.entries(newSort).filter(([key]) => key !== h)
177
+ ),
178
+ };
179
+
180
+ setSort(reorderedSort);
181
+ setVisible(false);
182
+ }}
183
+ className="flex items-center gap-2 border p-1 hover:bg-blue-100"
184
+ >
185
+ <OrderDesc />
186
+ Ordenar de la Z a la A
187
+ </div>
126
188
  {selected.length < items.length && (
127
189
  <div
128
190
  className="p-1 flex items-center justify-between px-2 bg-red-200 border shadow rounded"
@@ -4,12 +4,14 @@ export default function TableFooter({
4
4
  footer,
5
5
  selectItems,
6
6
  modal,
7
+ symbols,
7
8
  }: {
8
9
  objectData: any;
9
10
  headers: string[];
10
- footer?: Record<string, "count" | "sum" | "avg">;
11
+ footer?: Partial<Record<string, "sum" | "count" | "avg">>;
11
12
  selectItems?: any;
12
13
  modal?: any;
14
+ symbols?: Record<string, React.ReactNode>;
13
15
  }) {
14
16
  function operacion(tipo: "count" | "sum" | "avg", header: string): any {
15
17
  switch (tipo) {
@@ -44,7 +46,13 @@ export default function TableFooter({
44
46
  if (header.startsWith("_")) {
45
47
  return null;
46
48
  } else if (footer?.[header]) {
47
- return <th key={header}>{operacion(footer[header], header)}</th>;
49
+ return symbols && symbols?.[header] ? (
50
+ <th key={header} className="flex items-center gap-1">
51
+ {symbols[header]} {operacion(footer[header], header)}
52
+ </th>
53
+ ) : (
54
+ <th key={header}>{operacion(footer[header], header)}</th>
55
+ );
48
56
  }
49
57
 
50
58
  return <th key={header}></th>;
@@ -12,6 +12,8 @@ export default function TableHead({
12
12
  maxItems,
13
13
  colSizes,
14
14
  modal,
15
+ sort,
16
+ setSort,
15
17
  }: {
16
18
  headers: string[];
17
19
  selectItems?: boolean;
@@ -23,6 +25,8 @@ export default function TableHead({
23
25
  maxItems?: number;
24
26
  colSizes?: Record<string, any>;
25
27
  modal?: React.ReactNode;
28
+ sort: any;
29
+ setSort: any;
26
30
  }) {
27
31
  return (
28
32
  <thead>
@@ -66,6 +70,8 @@ export default function TableHead({
66
70
  setPage={setPage}
67
71
  colSizes={colSizes}
68
72
  data={data}
73
+ sort={sort}
74
+ setSort={setSort}
69
75
  />
70
76
  );
71
77
  })}
@@ -15,24 +15,26 @@ import Panel from "./panel";
15
15
  import TableFooter from "./footer";
16
16
  import Dialog from "./dialog";
17
17
 
18
- interface Table3Props
18
+ interface Table3Props<T extends Record<string, any>>
19
19
  extends DetailedHTMLProps<
20
20
  TableHTMLAttributes<HTMLTableElement>,
21
21
  HTMLTableElement
22
22
  > {
23
- data: Record<string, any>[];
23
+ data: T[];
24
24
  selectItems?: boolean;
25
25
  maxItems?: number;
26
26
  onSave?: (e: any) => void;
27
27
  exportName?: string;
28
- colSizes?: Record<string, number>;
28
+ colSizes?: Partial<Record<keyof T, number>>;
29
29
  modal?: React.ReactNode;
30
- footer?: Record<string, "sum" | "count" | "avg">;
30
+ footer?: Partial<Record<keyof T, "sum" | "count" | "avg">>;
31
31
  header?: React.ReactNode;
32
32
  onChange?: (e: any) => any;
33
+ symbols?: Partial<Record<keyof T, React.ReactNode>>;
34
+ sortBy?: Partial<Record<keyof T, "asc" | "desc">>;
33
35
  }
34
36
 
35
- export default function Table3({
37
+ export default function Table3<T extends Record<string, any>>({
36
38
  data,
37
39
  selectItems,
38
40
  maxItems = Infinity,
@@ -43,8 +45,10 @@ export default function Table3({
43
45
  header,
44
46
  footer,
45
47
  onChange,
48
+ symbols,
49
+ sortBy,
46
50
  ...props
47
- }: Table3Props) {
51
+ }: Table3Props<T>) {
48
52
  const [handlers, setHandlers] = useState<Record<string, any>>({});
49
53
  const [page, setPage] = useState(1);
50
54
 
@@ -127,7 +131,7 @@ export default function Table3({
127
131
  if (!objectData) return 0;
128
132
  return maxItems ? Math.ceil(Object.keys(objectData).length / maxItems) : 1;
129
133
  }, [objectData, maxItems]);
130
-
134
+ const [sort, setSort] = useState(sortBy);
131
135
  const modalRef = useRef<HTMLDialogElement>(null);
132
136
  const [dialogRow, setDialogRow] = useState<any>({});
133
137
  const context = {
@@ -151,6 +155,9 @@ export default function Table3({
151
155
  footer,
152
156
  onChange,
153
157
  data,
158
+ symbols,
159
+ sort,
160
+ setSort,
154
161
  ...props,
155
162
  };
156
163
 
package/src/table3/tr.tsx CHANGED
@@ -17,6 +17,7 @@ export default function TR({
17
17
  selected,
18
18
  setSelected,
19
19
  onChange,
20
+ symbols,
20
21
  }: {
21
22
  handlers: any;
22
23
  setObjectData: any;
@@ -32,6 +33,7 @@ export default function TR({
32
33
  index: number;
33
34
  selected: number;
34
35
  setSelected: any;
36
+ symbols?: Record<string, React.ReactNode>;
35
37
  onChange: any;
36
38
  }) {
37
39
  const color =
@@ -137,7 +139,14 @@ export default function TR({
137
139
  </td>
138
140
  );
139
141
  }
140
- return (
142
+ return symbols && symbols?.[h] ? (
143
+ <td
144
+ key={h}
145
+ className={`text-center border max-w-[${colSize}px] flex items-center gap-1`}
146
+ >
147
+ {symbols[h]} {row[h]}
148
+ </td>
149
+ ) : (
141
150
  <td key={h} className={`text-center border max-w-[${colSize}px]`}>
142
151
  {row[h]}
143
152
  </td>