next-recomponents 1.9.4 → 1.9.51
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 +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +144 -23
- package/dist/index.mjs +144 -23
- package/package.json +1 -1
- package/src/table/filters.tsx +32 -0
- package/src/table3/body.tsx +58 -41
- package/src/table3/filter.tsx +69 -7
- package/src/table3/footer.tsx +10 -2
- package/src/table3/head.tsx +6 -0
- package/src/table3/index.tsx +15 -8
- package/src/table3/panel.tsx +27 -24
- package/src/table3/tr.tsx +10 -1
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:
|
|
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<
|
|
210
|
+
colSizes?: Partial<Record<keyof T, number>>;
|
|
211
211
|
modal?: React$1.ReactNode;
|
|
212
|
-
footer?: Record<
|
|
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:
|
|
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<
|
|
210
|
+
colSizes?: Partial<Record<keyof T, number>>;
|
|
211
211
|
modal?: React$1.ReactNode;
|
|
212
|
-
footer?: Record<
|
|
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: "
|
|
45666
|
-
maxWidth: `${(
|
|
45667
|
-
width: `${colSizes
|
|
45668
|
-
},
|
|
45669
|
-
className: `resize-x overflow-
|
|
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
|
|
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,12 @@ 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
|
-
|
|
46059
|
+
const sorted = Object.entries(objectData).filter(([id3, row]) => {
|
|
45967
46060
|
var _a;
|
|
45968
46061
|
return ((_a = objectData[id3]) == null ? void 0 : _a._visible) === true;
|
|
45969
46062
|
}).filter((_id, key) => {
|
|
@@ -45971,7 +46064,18 @@ function TableBody({
|
|
|
45971
46064
|
const start = (page - 1) * maxItems;
|
|
45972
46065
|
const end = page * maxItems;
|
|
45973
46066
|
return key >= start && key < end;
|
|
45974
|
-
}).
|
|
46067
|
+
}).sort(([, a], [, b]) => {
|
|
46068
|
+
for (const [key, order] of Object.entries(
|
|
46069
|
+
sort || { id: "desc", _id: "desc" }
|
|
46070
|
+
)) {
|
|
46071
|
+
const valA = a[key];
|
|
46072
|
+
const valB = b[key];
|
|
46073
|
+
if (valA === valB) continue;
|
|
46074
|
+
const comparison = valA > valB ? 1 : valA < valB ? -1 : 0;
|
|
46075
|
+
return order === "desc" ? -comparison : comparison;
|
|
46076
|
+
}
|
|
46077
|
+
return 0;
|
|
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,9 @@ function TableBody({
|
|
|
45994
46099
|
}),
|
|
45995
46100
|
id3
|
|
45996
46101
|
);
|
|
45997
|
-
})
|
|
46102
|
+
});
|
|
46103
|
+
console.log(sorted);
|
|
46104
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tbody", { children: sorted });
|
|
45998
46105
|
}
|
|
45999
46106
|
|
|
46000
46107
|
// src/table3/panel.tsx
|
|
@@ -46005,7 +46112,8 @@ function Panel({
|
|
|
46005
46112
|
onSave,
|
|
46006
46113
|
objectData,
|
|
46007
46114
|
exportName,
|
|
46008
|
-
totalPages
|
|
46115
|
+
totalPages,
|
|
46116
|
+
maxItems
|
|
46009
46117
|
}) {
|
|
46010
46118
|
const excel = useExcel();
|
|
46011
46119
|
return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex gap-2 bg-gray-100 items-center", children: [
|
|
@@ -46044,7 +46152,7 @@ function Panel({
|
|
|
46044
46152
|
}
|
|
46045
46153
|
)
|
|
46046
46154
|
] }),
|
|
46047
|
-
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex gap-2 items-center text-2xl", children: [
|
|
46155
|
+
maxItems !== Infinity && /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex gap-2 items-center text-2xl", children: [
|
|
46048
46156
|
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("button", { onClick: () => setPage(1), disabled: page === 1, children: "\u23EE" }),
|
|
46049
46157
|
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("button", { onClick: () => setPage(page - 1), disabled: page === 1, children: "\u25C0" }),
|
|
46050
46158
|
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("span", { className: "text-sm", children: [
|
|
@@ -46080,7 +46188,8 @@ function TableFooter({
|
|
|
46080
46188
|
headers,
|
|
46081
46189
|
footer,
|
|
46082
46190
|
selectItems,
|
|
46083
|
-
modal
|
|
46191
|
+
modal,
|
|
46192
|
+
symbols
|
|
46084
46193
|
}) {
|
|
46085
46194
|
function operacion(tipo, header) {
|
|
46086
46195
|
switch (tipo) {
|
|
@@ -46105,7 +46214,11 @@ function TableFooter({
|
|
|
46105
46214
|
if (header.startsWith("_")) {
|
|
46106
46215
|
return null;
|
|
46107
46216
|
} else if (footer == null ? void 0 : footer[header]) {
|
|
46108
|
-
return /* @__PURE__ */ (0, import_jsx_runtime33.
|
|
46217
|
+
return symbols && (symbols == null ? void 0 : symbols[header]) ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("th", { className: "flex items-center gap-1", children: [
|
|
46218
|
+
symbols[header],
|
|
46219
|
+
" ",
|
|
46220
|
+
operacion(footer[header], header)
|
|
46221
|
+
] }, header) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("th", { children: operacion(footer[header], header) }, header);
|
|
46109
46222
|
}
|
|
46110
46223
|
return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("th", {}, header);
|
|
46111
46224
|
})
|
|
@@ -46182,7 +46295,9 @@ function Table3(_a) {
|
|
|
46182
46295
|
modal,
|
|
46183
46296
|
header,
|
|
46184
46297
|
footer,
|
|
46185
|
-
onChange
|
|
46298
|
+
onChange,
|
|
46299
|
+
symbols,
|
|
46300
|
+
sortBy
|
|
46186
46301
|
} = _b, props = __objRest(_b, [
|
|
46187
46302
|
"data",
|
|
46188
46303
|
"selectItems",
|
|
@@ -46193,7 +46308,9 @@ function Table3(_a) {
|
|
|
46193
46308
|
"modal",
|
|
46194
46309
|
"header",
|
|
46195
46310
|
"footer",
|
|
46196
|
-
"onChange"
|
|
46311
|
+
"onChange",
|
|
46312
|
+
"symbols",
|
|
46313
|
+
"sortBy"
|
|
46197
46314
|
]);
|
|
46198
46315
|
const [handlers, setHandlers] = (0, import_react37.useState)({});
|
|
46199
46316
|
const [page, setPage] = (0, import_react37.useState)(1);
|
|
@@ -46250,6 +46367,7 @@ function Table3(_a) {
|
|
|
46250
46367
|
if (!objectData) return 0;
|
|
46251
46368
|
return maxItems ? Math.ceil(Object.keys(objectData).length / maxItems) : 1;
|
|
46252
46369
|
}, [objectData, maxItems]);
|
|
46370
|
+
const [sort, setSort] = (0, import_react37.useState)(sortBy);
|
|
46253
46371
|
const modalRef = (0, import_react37.useRef)(null);
|
|
46254
46372
|
const [dialogRow, setDialogRow] = (0, import_react37.useState)({});
|
|
46255
46373
|
const context = __spreadValues({
|
|
@@ -46272,7 +46390,10 @@ function Table3(_a) {
|
|
|
46272
46390
|
header,
|
|
46273
46391
|
footer,
|
|
46274
46392
|
onChange,
|
|
46275
|
-
data
|
|
46393
|
+
data,
|
|
46394
|
+
symbols,
|
|
46395
|
+
sort,
|
|
46396
|
+
setSort
|
|
46276
46397
|
}, props);
|
|
46277
46398
|
(0, import_react37.useEffect)(() => {
|
|
46278
46399
|
if ((dialogRow == null ? void 0 : dialogRow.id) || (dialogRow == null ? void 0 : dialogRow._id)) {
|
|
@@ -46294,7 +46415,7 @@ function Table3(_a) {
|
|
|
46294
46415
|
}
|
|
46295
46416
|
),
|
|
46296
46417
|
header && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "font-bold text-2xl py-5 px-2 bg-blue-50", children: header }),
|
|
46297
|
-
|
|
46418
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Panel, __spreadValues({}, context)),
|
|
46298
46419
|
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("table", __spreadProps(__spreadValues({}, props), { style, children: [
|
|
46299
46420
|
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TableHead, __spreadValues({}, context)),
|
|
46300
46421
|
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TableBody, __spreadValues({}, context)),
|
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: "
|
|
45663
|
-
maxWidth: `${(
|
|
45664
|
-
width: `${colSizes
|
|
45665
|
-
},
|
|
45666
|
-
className: `resize-x overflow-
|
|
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
|
|
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,12 @@ 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
|
-
|
|
46056
|
+
const sorted = Object.entries(objectData).filter(([id3, row]) => {
|
|
45964
46057
|
var _a;
|
|
45965
46058
|
return ((_a = objectData[id3]) == null ? void 0 : _a._visible) === true;
|
|
45966
46059
|
}).filter((_id, key) => {
|
|
@@ -45968,7 +46061,18 @@ function TableBody({
|
|
|
45968
46061
|
const start = (page - 1) * maxItems;
|
|
45969
46062
|
const end = page * maxItems;
|
|
45970
46063
|
return key >= start && key < end;
|
|
45971
|
-
}).
|
|
46064
|
+
}).sort(([, a], [, b]) => {
|
|
46065
|
+
for (const [key, order] of Object.entries(
|
|
46066
|
+
sort || { id: "desc", _id: "desc" }
|
|
46067
|
+
)) {
|
|
46068
|
+
const valA = a[key];
|
|
46069
|
+
const valB = b[key];
|
|
46070
|
+
if (valA === valB) continue;
|
|
46071
|
+
const comparison = valA > valB ? 1 : valA < valB ? -1 : 0;
|
|
46072
|
+
return order === "desc" ? -comparison : comparison;
|
|
46073
|
+
}
|
|
46074
|
+
return 0;
|
|
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,9 @@ function TableBody({
|
|
|
45991
46096
|
}),
|
|
45992
46097
|
id3
|
|
45993
46098
|
);
|
|
45994
|
-
})
|
|
46099
|
+
});
|
|
46100
|
+
console.log(sorted);
|
|
46101
|
+
return /* @__PURE__ */ jsx30("tbody", { children: sorted });
|
|
45995
46102
|
}
|
|
45996
46103
|
|
|
45997
46104
|
// src/table3/panel.tsx
|
|
@@ -46002,7 +46109,8 @@ function Panel({
|
|
|
46002
46109
|
onSave,
|
|
46003
46110
|
objectData,
|
|
46004
46111
|
exportName,
|
|
46005
|
-
totalPages
|
|
46112
|
+
totalPages,
|
|
46113
|
+
maxItems
|
|
46006
46114
|
}) {
|
|
46007
46115
|
const excel = useExcel();
|
|
46008
46116
|
return /* @__PURE__ */ jsxs21("div", { className: "flex gap-2 bg-gray-100 items-center", children: [
|
|
@@ -46041,7 +46149,7 @@ function Panel({
|
|
|
46041
46149
|
}
|
|
46042
46150
|
)
|
|
46043
46151
|
] }),
|
|
46044
|
-
/* @__PURE__ */ jsxs21("div", { className: "flex gap-2 items-center text-2xl", children: [
|
|
46152
|
+
maxItems !== Infinity && /* @__PURE__ */ jsxs21("div", { className: "flex gap-2 items-center text-2xl", children: [
|
|
46045
46153
|
/* @__PURE__ */ jsx31("button", { onClick: () => setPage(1), disabled: page === 1, children: "\u23EE" }),
|
|
46046
46154
|
/* @__PURE__ */ jsx31("button", { onClick: () => setPage(page - 1), disabled: page === 1, children: "\u25C0" }),
|
|
46047
46155
|
/* @__PURE__ */ jsxs21("span", { className: "text-sm", children: [
|
|
@@ -46077,7 +46185,8 @@ function TableFooter({
|
|
|
46077
46185
|
headers,
|
|
46078
46186
|
footer,
|
|
46079
46187
|
selectItems,
|
|
46080
|
-
modal
|
|
46188
|
+
modal,
|
|
46189
|
+
symbols
|
|
46081
46190
|
}) {
|
|
46082
46191
|
function operacion(tipo, header) {
|
|
46083
46192
|
switch (tipo) {
|
|
@@ -46102,7 +46211,11 @@ function TableFooter({
|
|
|
46102
46211
|
if (header.startsWith("_")) {
|
|
46103
46212
|
return null;
|
|
46104
46213
|
} else if (footer == null ? void 0 : footer[header]) {
|
|
46105
|
-
return /* @__PURE__ */
|
|
46214
|
+
return symbols && (symbols == null ? void 0 : symbols[header]) ? /* @__PURE__ */ jsxs22("th", { className: "flex items-center gap-1", children: [
|
|
46215
|
+
symbols[header],
|
|
46216
|
+
" ",
|
|
46217
|
+
operacion(footer[header], header)
|
|
46218
|
+
] }, header) : /* @__PURE__ */ jsx32("th", { children: operacion(footer[header], header) }, header);
|
|
46106
46219
|
}
|
|
46107
46220
|
return /* @__PURE__ */ jsx32("th", {}, header);
|
|
46108
46221
|
})
|
|
@@ -46179,7 +46292,9 @@ function Table3(_a) {
|
|
|
46179
46292
|
modal,
|
|
46180
46293
|
header,
|
|
46181
46294
|
footer,
|
|
46182
|
-
onChange
|
|
46295
|
+
onChange,
|
|
46296
|
+
symbols,
|
|
46297
|
+
sortBy
|
|
46183
46298
|
} = _b, props = __objRest(_b, [
|
|
46184
46299
|
"data",
|
|
46185
46300
|
"selectItems",
|
|
@@ -46190,7 +46305,9 @@ function Table3(_a) {
|
|
|
46190
46305
|
"modal",
|
|
46191
46306
|
"header",
|
|
46192
46307
|
"footer",
|
|
46193
|
-
"onChange"
|
|
46308
|
+
"onChange",
|
|
46309
|
+
"symbols",
|
|
46310
|
+
"sortBy"
|
|
46194
46311
|
]);
|
|
46195
46312
|
const [handlers, setHandlers] = useState14({});
|
|
46196
46313
|
const [page, setPage] = useState14(1);
|
|
@@ -46247,6 +46364,7 @@ function Table3(_a) {
|
|
|
46247
46364
|
if (!objectData) return 0;
|
|
46248
46365
|
return maxItems ? Math.ceil(Object.keys(objectData).length / maxItems) : 1;
|
|
46249
46366
|
}, [objectData, maxItems]);
|
|
46367
|
+
const [sort, setSort] = useState14(sortBy);
|
|
46250
46368
|
const modalRef = useRef8(null);
|
|
46251
46369
|
const [dialogRow, setDialogRow] = useState14({});
|
|
46252
46370
|
const context = __spreadValues({
|
|
@@ -46269,7 +46387,10 @@ function Table3(_a) {
|
|
|
46269
46387
|
header,
|
|
46270
46388
|
footer,
|
|
46271
46389
|
onChange,
|
|
46272
|
-
data
|
|
46390
|
+
data,
|
|
46391
|
+
symbols,
|
|
46392
|
+
sort,
|
|
46393
|
+
setSort
|
|
46273
46394
|
}, props);
|
|
46274
46395
|
useEffect11(() => {
|
|
46275
46396
|
if ((dialogRow == null ? void 0 : dialogRow.id) || (dialogRow == null ? void 0 : dialogRow._id)) {
|
|
@@ -46291,7 +46412,7 @@ function Table3(_a) {
|
|
|
46291
46412
|
}
|
|
46292
46413
|
),
|
|
46293
46414
|
header && /* @__PURE__ */ jsx34("div", { className: "font-bold text-2xl py-5 px-2 bg-blue-50", children: header }),
|
|
46294
|
-
|
|
46415
|
+
/* @__PURE__ */ jsx34(Panel, __spreadValues({}, context)),
|
|
46295
46416
|
/* @__PURE__ */ jsxs24("table", __spreadProps(__spreadValues({}, props), { style, children: [
|
|
46296
46417
|
/* @__PURE__ */ jsx34(TableHead, __spreadValues({}, context)),
|
|
46297
46418
|
/* @__PURE__ */ jsx34(TableBody, __spreadValues({}, context)),
|
package/package.json
CHANGED
package/src/table/filters.tsx
CHANGED
|
@@ -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
|
package/src/table3/body.tsx
CHANGED
|
@@ -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,68 @@ 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
|
+
.filter(([id, row]) => {
|
|
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
|
+
.sort(([, a]: any, [, b]: any) => {
|
|
49
|
+
for (const [key, order] of Object.entries(
|
|
50
|
+
sort || { id: "desc", _id: "desc" }
|
|
51
|
+
)) {
|
|
52
|
+
const valA = a[key];
|
|
53
|
+
const valB = b[key];
|
|
34
54
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
})}
|
|
73
|
-
</tbody>
|
|
74
|
-
);
|
|
55
|
+
if (valA === valB) continue; // pasa al siguiente criterio
|
|
56
|
+
|
|
57
|
+
const comparison = valA > valB ? 1 : valA < valB ? -1 : 0;
|
|
58
|
+
|
|
59
|
+
return order === "desc" ? -comparison : comparison;
|
|
60
|
+
}
|
|
61
|
+
return 0;
|
|
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
|
+
console.log(sorted);
|
|
91
|
+
return <tbody>{sorted}</tbody>;
|
|
75
92
|
}
|
package/src/table3/filter.tsx
CHANGED
|
@@ -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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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"
|
package/src/table3/footer.tsx
CHANGED
|
@@ -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, "
|
|
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
|
|
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>;
|
package/src/table3/head.tsx
CHANGED
|
@@ -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
|
})}
|
package/src/table3/index.tsx
CHANGED
|
@@ -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:
|
|
23
|
+
data: T[];
|
|
24
24
|
selectItems?: boolean;
|
|
25
25
|
maxItems?: number;
|
|
26
26
|
onSave?: (e: any) => void;
|
|
27
27
|
exportName?: string;
|
|
28
|
-
colSizes?: Record<
|
|
28
|
+
colSizes?: Partial<Record<keyof T, number>>;
|
|
29
29
|
modal?: React.ReactNode;
|
|
30
|
-
footer?: Record<
|
|
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
|
|
|
@@ -182,7 +189,7 @@ export default function Table3({
|
|
|
182
189
|
{header && (
|
|
183
190
|
<div className="font-bold text-2xl py-5 px-2 bg-blue-50">{header}</div>
|
|
184
191
|
)}
|
|
185
|
-
|
|
192
|
+
<Panel {...context} />
|
|
186
193
|
<table {...props} style={style}>
|
|
187
194
|
<TableHead {...context} />
|
|
188
195
|
<TableBody {...context} />
|
package/src/table3/panel.tsx
CHANGED
|
@@ -8,6 +8,7 @@ export default function Panel({
|
|
|
8
8
|
objectData,
|
|
9
9
|
exportName,
|
|
10
10
|
totalPages,
|
|
11
|
+
maxItems,
|
|
11
12
|
}: {
|
|
12
13
|
page: number;
|
|
13
14
|
setPage: any;
|
|
@@ -15,6 +16,7 @@ export default function Panel({
|
|
|
15
16
|
objectData: any;
|
|
16
17
|
exportName?: string;
|
|
17
18
|
totalPages: number;
|
|
19
|
+
maxItems?: number;
|
|
18
20
|
}) {
|
|
19
21
|
const excel = useExcel();
|
|
20
22
|
return (
|
|
@@ -52,34 +54,35 @@ export default function Panel({
|
|
|
52
54
|
</button>
|
|
53
55
|
)}
|
|
54
56
|
</div>
|
|
57
|
+
{maxItems !== Infinity && (
|
|
58
|
+
<div className="flex gap-2 items-center text-2xl">
|
|
59
|
+
<button onClick={() => setPage(1)} disabled={page === 1}>
|
|
60
|
+
⏮
|
|
61
|
+
</button>
|
|
55
62
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
</button>
|
|
60
|
-
|
|
61
|
-
<button onClick={() => setPage(page - 1)} disabled={page === 1}>
|
|
62
|
-
◀
|
|
63
|
-
</button>
|
|
63
|
+
<button onClick={() => setPage(page - 1)} disabled={page === 1}>
|
|
64
|
+
◀
|
|
65
|
+
</button>
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
<span className="text-sm">
|
|
68
|
+
Página {page} / {totalPages}
|
|
69
|
+
</span>
|
|
68
70
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
<button
|
|
72
|
+
onClick={() => setPage(page + 1)}
|
|
73
|
+
disabled={page === totalPages}
|
|
74
|
+
>
|
|
75
|
+
▶
|
|
76
|
+
</button>
|
|
75
77
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
<button
|
|
79
|
+
onClick={() => setPage(totalPages)}
|
|
80
|
+
disabled={page === totalPages}
|
|
81
|
+
>
|
|
82
|
+
⏭
|
|
83
|
+
</button>
|
|
84
|
+
</div>
|
|
85
|
+
)}
|
|
83
86
|
</div>
|
|
84
87
|
);
|
|
85
88
|
}
|
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>
|