react-apextable-pro 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.d.mts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -12
package/README.md
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
**ApexTable** is a high-performance, professional-grade React data table library built on top of `react-data-table-component`. It evolves the standard data table into a feature-rich "Power Grid" with native support for persistence, advanced sticky columns, multi-sorting, and high-fidelity exports.
|
|
4
4
|
|
|
5
|
-
[](https://davidfranco3.github.io/react-apextable-pro/)
|
|
6
|
+
[](https://www.npmjs.com/package/react-apextable-pro)
|
|
6
7
|
[](https://github.com/DavidFranco3/react-apextable-pro)
|
|
7
8
|
[](https://opensource.org/licenses/ISC)
|
|
8
9
|
[](https://www.typescriptlang.org/)
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import React from 'react';
|
|
3
2
|
import { TableProps, ConditionalStyles } from 'react-data-table-component';
|
|
4
3
|
|
|
@@ -30,6 +29,6 @@ interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'ex
|
|
|
30
29
|
conditionalRowStyles?: ConditionalStyles<T>[];
|
|
31
30
|
storagePrefix?: string;
|
|
32
31
|
}
|
|
33
|
-
declare const ApexTable: <T extends Record<string, any>>({ datos, columnas, hiddenOptions, expandableRows, expandableRowsComponent, expandableRowExpanded, conditionalRowStyles, storagePrefix, ...otherProps }: ApexTableProps<T>) =>
|
|
32
|
+
declare const ApexTable: <T extends Record<string, any>>({ datos, columnas, hiddenOptions, expandableRows, expandableRowsComponent, expandableRowExpanded, conditionalRowStyles, storagePrefix, ...otherProps }: ApexTableProps<T>) => React.JSX.Element;
|
|
34
33
|
|
|
35
34
|
export { ApexTable, type ApexTableColumn, type ApexTableProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import React from 'react';
|
|
3
2
|
import { TableProps, ConditionalStyles } from 'react-data-table-component';
|
|
4
3
|
|
|
@@ -30,6 +29,6 @@ interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'ex
|
|
|
30
29
|
conditionalRowStyles?: ConditionalStyles<T>[];
|
|
31
30
|
storagePrefix?: string;
|
|
32
31
|
}
|
|
33
|
-
declare const ApexTable: <T extends Record<string, any>>({ datos, columnas, hiddenOptions, expandableRows, expandableRowsComponent, expandableRowExpanded, conditionalRowStyles, storagePrefix, ...otherProps }: ApexTableProps<T>) =>
|
|
32
|
+
declare const ApexTable: <T extends Record<string, any>>({ datos, columnas, hiddenOptions, expandableRows, expandableRowsComponent, expandableRowExpanded, conditionalRowStyles, storagePrefix, ...otherProps }: ApexTableProps<T>) => React.JSX.Element;
|
|
34
33
|
|
|
35
34
|
export { ApexTable, type ApexTableColumn, type ApexTableProps };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var we=Object.create;var
|
|
2
|
-
`);var c=require("react"),
|
|
1
|
+
"use strict";var we=Object.create;var $=Object.defineProperty;var ke=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty;var Te=(i,l)=>{for(var u in l)$(i,u,{get:l[u],enumerable:!0})},q=(i,l,u,m)=>{if(l&&typeof l=="object"||typeof l=="function")for(let x of Ce(l))!Ne.call(i,x)&&x!==u&&$(i,x,{get:()=>l[x],enumerable:!(m=ke(l,x))||m.enumerable});return i};var L=(i,l,u)=>(u=i!=null?we(Se(i)):{},q(l||!i||!i.__esModule?$(u,"default",{value:i,enumerable:!0}):u,i)),Re=i=>q($({},"__esModule",{value:!0}),i);var je={};Te(je,{ApexTable:()=>oe});module.exports=Re(je);function H(i,{insertAt:l}={}){if(!i||typeof document>"u")return;let u=document.head||document.getElementsByTagName("head")[0],m=document.createElement("style");m.type="text/css",l==="top"&&u.firstChild?u.insertBefore(m,u.firstChild):u.appendChild(m),m.styleSheet?m.styleSheet.cssText=i:m.appendChild(document.createTextNode(i))}H(`:root{--dt-bg: #ffffff;--dt-header-bg: #f8f9fa;--dt-header-text: #495057;--dt-row-text: #212529;--dt-row-hover-bg: #f1f3f5;--dt-row-stripe-bg: #f8f9fa;--dt-border-color: #dee2e6;--dt-disabled-text: #adb5bd;--dt-input-bg: #ffffff;--dt-input-border: #ced4da;--dt-input-text: #495057;--dt-badge-bg: #e7f5ff;--dt-badge-text: #0d6efd;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .1)}html.dark{--dt-bg: #1e293b;--dt-header-bg: #0f172a;--dt-header-text: #e2e8f0;--dt-row-text: #f1f5f9;--dt-row-hover-bg: #334155;--dt-row-stripe-bg: #1e293b;--dt-border-color: #334155;--dt-disabled-text: #64748b;--dt-input-bg: #1e293b;--dt-input-border: #334155;--dt-input-text: #f1f5f9;--dt-badge-bg: #1e293b;--dt-badge-text: #60a5fa;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .5)}.rdt_Table{background:transparent!important}.datatable-container{background:var(--dt-bg);border-radius:1.5rem;box-shadow:var(--dt-shadow);padding:1.5rem;overflow:auto!important;color:var(--dt-row-text);transition:all .2s ease}.rdt_TableHeadRow{background-color:var(--dt-header-bg)!important;border-bottom:2px solid var(--dt-border-color)!important}html.dark .rdt_TableRow{background-color:#1e293b}html.dark .datatable-container{background-color:#1e293b!important;color:#f1f5f9!important}.rdt_TableCell{word-break:normal!important;overflow-wrap:normal!important;white-space:normal!important}.rdt_TableCell .inline-flex,.rdt_TableCell button,.rdt_TableCell a{white-space:nowrap!important}.sticky-info-label{font-size:12px;color:var(--dt-header-text);margin-bottom:12px;display:flex;align-items:center;gap:6px}.custom-header-wrapper{display:flex;align-items:center;gap:8px}.custom-checkbox-label{position:relative;cursor:pointer;width:18px;height:18px}.custom-checkbox-input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.custom-checkbox-checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:var(--dt-input-border);border-radius:4px;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--dt-disabled-text)}.custom-checkbox-label:hover .custom-checkbox-checkmark{background-color:var(--dt-border-color)}.custom-checkbox-input:checked~.custom-checkbox-checkmark{background-color:#0d6efd;color:#fff}.custom-checkbox-input:disabled~.custom-checkbox-checkmark{background-color:var(--dt-header-bg);cursor:not-allowed;opacity:.7}.custom-checkbox-checkmark .fa-thumbtack{font-size:10px;transition:transform .2s ease}.custom-checkbox-input:checked~.custom-checkbox-checkmark .fa-thumbtack{transform:rotate(45deg)}.search-bar-container{background:var(--dt-header-bg);border-radius:8px;padding:16px;margin-bottom:20px;border:1px solid var(--dt-border-color)}.search-input-wrapper{position:relative;flex:1;max-width:400px}.search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dt-header-text);pointer-events:none}.search-input{padding-left:40px!important;border:1px solid var(--dt-input-border);border-radius:6px;padding:10px 12px;font-size:14px;width:100%;transition:all .2s ease;background-color:var(--dt-input-bg);color:var(--dt-input-text)}.search-input:focus{outline:none;border-color:#0d6efd;box-shadow:0 0 0 3px #0d6efd1a}.action-buttons{display:flex;gap:8px;flex-wrap:wrap}.btn-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;border-radius:6px;transition:all .2s ease;border:none;cursor:pointer}.btn-action:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.btn-csv{background-color:#198754;color:#fff}.btn-csv:hover{background-color:#157347}.btn-pdf{background-color:#dc3545;color:#fff}.btn-pdf:hover{background-color:#bb2d3b}.btn-columns{background-color:#0d6efd;color:#fff}.btn-columns:hover{background-color:#0b5ed7}.btn-action:disabled{opacity:.6;cursor:not-allowed;transform:none}.stats-badge{display:inline-flex;align-items:center;padding:4px 12px;background:var(--dt-badge-bg);color:var(--dt-badge-text);border-radius:20px;font-size:12px;font-weight:600}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;animation:dtp-fadeIn .2s ease}@keyframes dtp-fadeIn{0%{opacity:0}to{opacity:1}}.modal-content-custom{background:var(--dt-bg);color:var(--dt-row-text);border-radius:12px;box-shadow:var(--dt-shadow);width:90%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;animation:dtp-slideUp .3s ease;border:1px solid var(--dt-border-color)}@keyframes dtp-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.modal-header-custom{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:20px 24px;border-radius:12px 12px 0 0;display:flex;justify-content:space-between;align-items:center}.modal-title-custom{font-weight:600;font-size:18px;margin:0;display:flex;align-items:center;gap:8px}.modal-close-btn{background:#fff3;border:none;color:#fff;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.modal-close-btn:hover{background:#ffffff4d}.modal-body-custom{padding:24px;overflow-y:auto;flex:1}.modal-footer-custom{padding:16px 24px;border-top:1px solid var(--dt-border-color);display:flex;justify-content:flex-end;gap:8px}.column-actions{display:flex;gap:8px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--dt-border-color)}.btn-column-action{flex:1;padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid var(--dt-border-color);background:var(--dt-input-bg);color:var(--dt-row-text);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:4px}.btn-column-action:hover{background:var(--dt-row-hover-bg);border-color:#adb5bd}.column-checkbox-wrapper{padding:10px;border-radius:6px;transition:background-color .2s ease;display:flex;align-items:center}.column-checkbox-wrapper:hover{background-color:var(--dt-row-hover-bg)}.column-checkbox{display:flex;align-items:center;cursor:pointer;font-size:14px;user-select:none}.column-checkbox input{margin-right:8px;cursor:pointer}.btn-modal{padding:8px 16px;font-size:14px;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:6px}.btn-modal-light{background:var(--dt-header-bg);color:var(--dt-header-text)}.btn-modal-light:hover{background:var(--dt-row-hover-bg)}.btn-modal-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.btn-modal-primary:hover{box-shadow:0 4px 12px #667eea66}@media(max-width:768px){.search-bar-container{flex-direction:column;gap:12px}.search-input-wrapper{max-width:100%}.action-buttons{justify-content:stretch}.btn-action{flex:1;justify-content:center}.modal-content-custom{width:95%;margin:10px}}
|
|
2
|
+
`);var c=require("react"),B=L(require("react-data-table-component")),X=require("react-csv"),Z=require("jspdf"),ee=L(require("jspdf-autotable")),te=L(require("sweetalert2"));var I=require("react"),Q=require("react/jsx-runtime"),Ie=({value:i,onChange:l,debounce:u=300,...m})=>{let[x,_]=(0,I.useState)(i);return(0,I.useEffect)(()=>{_(i)},[i]),(0,I.useEffect)(()=>{let S=setTimeout(()=>{l(x)},u);return()=>clearTimeout(S)},[x,u,l]),(0,Q.jsx)("input",{...m,value:x,onChange:S=>_(S.target.value)})},G=Ie;var t=require("react/jsx-runtime"),_e=B.default?.default||B.default,Oe=({datos:i=[],columnas:l=[],hiddenOptions:u=!1,expandableRows:m=!1,expandableRowsComponent:x,expandableRowExpanded:_,conditionalRowStyles:S=[],storagePrefix:J="dt_config",...ae})=>{let p=(0,c.useMemo)(()=>{if(typeof window>"u")return"";let e=window.location.pathname,o=l.map(s=>s.name).join(","),a=0;for(let s=0;s<o.length;s++){let n=o.charCodeAt(s);a=(a<<5)-a+n,a|=0}return`${J}_${e}_${a}`},[l,J]),[z,W]=(0,c.useState)(()=>typeof window>"u"?"":localStorage.getItem(`${p}_filter`)||""),[N,A]=(0,c.useState)(i),[y,k]=(0,c.useState)(()=>{let e=l.map(a=>a.name);if(typeof window>"u")return e;let o=localStorage.getItem(`${p}_visible`);if(!o)return e;try{let a=JSON.parse(o),s=e.filter(n=>!a.includes(n));return[...a,...s]}catch{return e}}),[ne,T]=(0,c.useState)(!1),[V,M]=(0,c.useState)(!1),[C,F]=(0,c.useState)(()=>{if(typeof window>"u")return[];let e=localStorage.getItem(`${p}_sticky`);return e?JSON.parse(e):[]}),[R,re]=(0,c.useState)({}),[h,P]=(0,c.useState)(()=>{if(typeof window>"u")return[];let e=localStorage.getItem(`${p}_sort`);return e?JSON.parse(e):[]}),E=(0,c.useRef)(null);(0,c.useEffect)(()=>{p&&localStorage.setItem(`${p}_visible`,JSON.stringify(y))},[y,p]),(0,c.useEffect)(()=>{p&&localStorage.setItem(`${p}_sticky`,JSON.stringify(C))},[C,p]),(0,c.useEffect)(()=>{p&&localStorage.setItem(`${p}_filter`,z)},[z,p]),(0,c.useEffect)(()=>{p&&localStorage.setItem(`${p}_sort`,JSON.stringify(h))},[h,p]),(0,c.useEffect)(()=>{if(!p)return;let e=localStorage.getItem(`${p}_visible`),o=l.map(r=>r.name);if(e)try{let r=JSON.parse(e),f=o.filter(d=>!r.includes(d));k([...r,...f])}catch{k(o)}else k(o);let a=localStorage.getItem(`${p}_sticky`);F(a?JSON.parse(a):[]);let s=localStorage.getItem(`${p}_sort`);P(s?JSON.parse(s):[]);let n=localStorage.getItem(`${p}_filter`);W(n||"")},[p]);let se=e=>{let o=String(e);if(W(o),!o||o.length===0){A(i);return}let a=o.toLowerCase(),s=i.filter(n=>Object.values(n).some(r=>r==null?!1:String(r).toLowerCase().includes(a)));A(s)},ie=e=>{te.default.fire({title:"Detalle de la Fila",html:`<pre style="text-align: left; font-size: 12px; background: #f4f4f4; padding: 10px; border-radius: 4px; overflow: auto;">${JSON.stringify(e,null,2)}</pre>`,width:"600px",confirmButtonColor:"#764ba2"})};(0,c.useEffect)(()=>{A(i)},[i]);let le=()=>{M(!0),setTimeout(()=>{let e=new Z.jsPDF,o=l.filter(s=>y.includes(s.name)).map(s=>s.name),a=i.map(s=>l.filter(n=>y.includes(n.name)).map(n=>{let r;return typeof n.selector=="function"?r=n.selector(s):r=s[n.selector],r!=null&&typeof r=="object"?JSON.stringify(r):r||""}));(0,ee.default)(e,{head:[o],body:a,startY:20,theme:"grid",styles:{halign:"justify"}}),e.save("data.pdf"),M(!1)},100)},ce=e=>{k(o=>o.includes(e)?o.filter(a=>a!==e):[...o,e])},de=()=>{k(l.map(e=>e.name))},pe=()=>{k([])},v=(0,c.useMemo)(()=>l.filter(e=>y.includes(e.name)),[l,y]),O=(0,c.useMemo)(()=>v.filter(e=>C.includes(e.name)),[v,C]),fe=e=>{F(o=>o.includes(e)?o.filter(s=>s!==e):o.length<3?[...o,e]:o)};(0,c.useEffect)(()=>{if(!E.current)return;let e=E.current.querySelector(".rdt_TableRow");if(!e)return;let o=e.querySelectorAll(".rdt_TableCell");if(!o.length)return;let a={};v.forEach((d,b)=>{if(o[b]){let g=o[b].getBoundingClientRect().width;a[d.name]=g}});let s=Object.keys(R),n=Object.keys(a);s.length===n.length&&n.every(d=>R[d]===a[d])||re(a)},[v,R,N.length]);let K=(0,c.useMemo)(()=>{let e={},o=0;return O.forEach(a=>{e[a.name]=o,o+=R[a.name]||0}),e},[O,R]),ue=(0,c.useMemo)(()=>O.map((e,o)=>{let a=v.findIndex(r=>r.name===e.name),s=K[e.name];if(a===-1||s===void 0)return"";let n=20+o;return`
|
|
3
3
|
.rdt_TableCol:nth-child(${a+1}),
|
|
4
4
|
.rdt_TableCell:nth-child(${a+1}) {
|
|
5
5
|
position: sticky !important;
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
.rdt_TableCol:nth-child(${a+1}) {
|
|
12
12
|
z-index: ${n+1};
|
|
13
13
|
}
|
|
14
|
-
`}).join(""),[O,
|
|
14
|
+
`}).join(""),[O,K,v]),me=(e,o)=>{if(e.sortable===!1||!e.selector&&!e.sortFunction&&!e.name)return;let a=o.shiftKey;P(s=>{let n=s.findIndex(f=>f.columnName===e.name),r=[...s];if(a)if(n>=0){let f=s[n];f&&(f.direction==="asc"?r[n]={...f,direction:"desc"}:r.splice(n,1))}else r.push({columnName:e.name,selector:e.selector,sortFunction:e.sortFunction,direction:"asc"});else if(n>=0){let f=s[n];f&&(r=[{...f,direction:f.direction==="asc"?"desc":"asc"}])}else r=[{columnName:e.name,selector:e.selector,sortFunction:e.sortFunction,direction:"asc"}];return r})},be=e=>{if(e.sortable===!1||!e.selector&&!e.sortFunction)return null;let o=h.findIndex(n=>n.columnName===e.name);if(o===-1)return(0,t.jsx)("span",{className:"ms-1",style:{opacity:.3,fontSize:"11px",color:"var(--dt-header-text)"},children:(0,t.jsx)("i",{className:"fas fa-sort"})});let a=h[o],s=a?a.direction==="asc":!0;return(0,t.jsxs)("span",{className:"ms-1 d-flex align-items-center",style:{fontSize:"12px",color:"#0d6efd",fontWeight:"bold"},children:[(0,t.jsx)("i",{className:s?"fas fa-sort-up":"fas fa-sort-down"}),h.length>1&&(0,t.jsx)("small",{className:"ms-1",style:{fontSize:"10px"},children:o+1})]})},ge=v.map(e=>{let{right:o,center:a,compact:s,wrap:n,grow:r,maxWidth:f,minWidth:d,width:b,reorder:g,...w}=e,Y=C.includes(e.name),ve=Y||C.length<3,U=o?!1:a!==!1,j=e.sortable!==!1&&(e.selector||e.sortFunction);return{...w,right:o,center:U,compact:s,wrap:n!==void 0?n:!0,grow:r,maxWidth:f,minWidth:d,width:b,reorder:g,sortable:!1,name:(0,t.jsxs)("div",{className:"custom-header-wrapper",onClick:D=>{D.stopPropagation(),j&&me(e,D)},style:{cursor:j?"pointer":"default",display:"flex",alignItems:"center",width:"100%",justifyContent:U?"center":o?"flex-end":"flex-start",userSelect:"none"},title:j?"Clic para ordenar. Shift+clic para ordenar por m\xFAltiples columnas":"",children:[(0,t.jsxs)("label",{className:"custom-checkbox-label",onClick:D=>D.stopPropagation(),children:[(0,t.jsx)("input",{type:"checkbox",className:"custom-checkbox-input",checked:Y,disabled:!ve,onChange:()=>fe(e.name)}),(0,t.jsx)("span",{className:"custom-checkbox-checkmark",children:(0,t.jsx)("i",{className:"fas fa-thumbtack"})})]}),(0,t.jsx)("span",{className:"custom-header-name",style:{marginLeft:"8px"},children:e.name}),j&&be(e)]})}}),xe=(0,c.useMemo)(()=>h.length===0?N:[...N].sort((e,o)=>{for(let a=0;a<h.length;a++){let s=h[a];if(!s)continue;let{selector:n,sortFunction:r,direction:f}=s,d=f==="asc"?1:-1;if(r){let w=r(e,o);if(w!==0)return w*d;continue}if(!n)continue;let b=typeof n=="function"?n(e):e[n],g=typeof n=="function"?n(o):o[n];if(b=b??"",g=g??"",typeof b=="string"&&typeof g=="string"){let w=b.localeCompare(g,void 0,{numeric:!0,sensitivity:"base"});if(w!==0)return w*d}else if(typeof b=="number"&&typeof g=="number"){if(b!==g)return(b-g)*d}else{if(b<g)return-1*d;if(b>g)return 1*d}}return 0}),[N,h]),he={headRow:{style:{backgroundColor:"var(--dt-header-bg)",borderBottom:"2px solid var(--dt-border-color)",fontWeight:"600",fontSize:"14px",color:"var(--dt-header-text)",minHeight:"52px"}},headCells:{style:{paddingLeft:"10px",paddingRight:"10px",justifyContent:"center",textAlign:"center"}},rows:{style:{fontSize:"13px",color:"var(--dt-row-text)",backgroundColor:"var(--dt-bg)",minHeight:"44px","&:hover":{backgroundColor:"var(--dt-row-hover-bg)",cursor:"pointer",transition:"background-color 0.2s ease",color:"var(--dt-row-text)"}},stripedStyle:{backgroundColor:"var(--dt-row-stripe-bg)",color:"var(--dt-row-text)"}},cells:{style:{paddingLeft:"10px",paddingRight:"10px",justifyContent:"center",textAlign:"center"}},pagination:{style:{borderTop:"1px solid var(--dt-border-color)",fontSize:"13px",minHeight:"56px",backgroundColor:"var(--dt-bg)",color:"var(--dt-row-text)"},pageButtonsStyle:{color:"var(--dt-row-text)",fill:"var(--dt-row-text)","&:disabled":{color:"var(--dt-disabled-text)",fill:"var(--dt-disabled-text)"},"&:hover:not(:disabled)":{backgroundColor:"var(--dt-row-hover-bg)"},"&:focus":{outline:"none",backgroundColor:"var(--dt-row-hover-bg)"}}}},ye=(0,c.useMemo)(()=>{if(!i||i.length===0||!i[0])return[];let e=Object.keys(i[0]),o=[];e.forEach(r=>{if(["created_at","updated_at","deleted_at"].includes(r))return;let f=i.find(d=>d[r]!==null&&d[r]!==void 0);if(f){let d=f[r];if(typeof d=="object"&&!(d instanceof Date))return;o.push(r)}else o.push(r)});let a=o.map(()=>""),s=o,n=i.map(r=>o.map(f=>{let d=r[f];return d??""}));return[a,s,...n]},[i]);return(0,t.jsxs)("section",{className:"apextable-wrapper",children:[(0,t.jsx)("style",{children:ue}),(0,t.jsxs)("div",{className:"datatable-container",ref:E,children:[(0,t.jsx)("div",{className:"search-bar-container",hidden:u,children:(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"16px"},children:(0,t.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",justifyContent:"space-between",alignItems:"center",gap:"16px"},children:[(0,t.jsxs)("div",{className:"search-input-wrapper",children:[(0,t.jsx)("i",{className:"fas fa-search search-icon"}),(0,t.jsx)(G,{value:z,onChange:se,placeholder:"Buscar en todos los campos...",className:"search-input"})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"12px",flexWrap:"wrap"},children:[(0,t.jsxs)("span",{className:"stats-badge",children:[N.length," de ",i.length," registros"]}),(0,t.jsxs)("div",{className:"action-buttons",children:[(0,t.jsx)(X.CSVLink,{data:ye,filename:`export_${new Date().toISOString().split("T")[0]}.csv`,style:{textDecoration:"none"},children:(0,t.jsxs)("button",{className:"btn-action btn-csv",children:[(0,t.jsx)("i",{className:"fas fa-file-csv"}),(0,t.jsx)("span",{children:"CSV"})]})}),(0,t.jsxs)("button",{onClick:le,className:"btn-action btn-pdf",disabled:V,children:[(0,t.jsx)("i",{className:"fas fa-file-pdf"}),(0,t.jsx)("span",{children:V?"Exportando...":"PDF"})]}),(0,t.jsxs)("button",{className:"btn-action btn-columns",onClick:()=>T(!0),children:[(0,t.jsx)("i",{className:"fas fa-columns"}),(0,t.jsx)("span",{children:"Columnas"})]})]})]})]})})}),(0,t.jsxs)("div",{className:"sticky-info-label",children:[(0,t.jsx)("i",{className:"fas fa-info-circle"}),(0,t.jsxs)("span",{children:["Use la chincheta (",(0,t.jsx)("i",{className:"fas fa-thumbtack"}),") para fijar hasta 3 columnas."]})]}),(0,t.jsx)(_e,{columns:ge,data:xe,pagination:!0,paginationPerPage:15,paginationRowsPerPageOptions:[5,10,15,20,25,50],striped:!0,highlightOnHover:!0,pointerOnHover:!0,responsive:!0,fixedHeader:!0,fixedHeaderScrollHeight:"calc(100vh - 320px)",onRowDoubleClicked:ie,customStyles:he,expandableRows:m,expandableRowsComponent:x,expandableRowExpanded:_,conditionalRowStyles:S,...ae,noDataComponent:(0,t.jsxs)("div",{style:{padding:"40px",textAlign:"center",color:"#6c757d"},children:[(0,t.jsx)("i",{className:"fas fa-inbox",style:{fontSize:"48px",marginBottom:"16px",opacity:.5}}),(0,t.jsx)("p",{style:{margin:0,fontSize:"14px"},children:"No se encontraron registros"})]})})]}),ne&&(0,t.jsx)("div",{className:"modal-overlay",onClick:()=>T(!1),children:(0,t.jsxs)("div",{className:"modal-content-custom",onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:"modal-header-custom",children:[(0,t.jsxs)("h5",{className:"modal-title-custom",children:[(0,t.jsx)("i",{className:"fas fa-columns"}),"Gestionar Columnas"]}),(0,t.jsx)("button",{className:"modal-close-btn",onClick:()=>T(!1),children:(0,t.jsx)("i",{className:"fas fa-times"})})]}),(0,t.jsxs)("div",{className:"modal-body-custom",children:[(0,t.jsxs)("div",{className:"column-actions",children:[(0,t.jsxs)("button",{className:"btn-column-action",onClick:de,children:[(0,t.jsx)("i",{className:"fas fa-check-double"}),"Seleccionar Todo"]}),(0,t.jsxs)("button",{className:"btn-column-action",onClick:pe,children:[(0,t.jsx)("i",{className:"fas fa-times"}),"Deseleccionar Todo"]})]}),l.map(e=>(0,t.jsx)("div",{className:"column-checkbox-wrapper",children:(0,t.jsxs)("label",{className:"column-checkbox",children:[(0,t.jsx)("input",{type:"checkbox",checked:y.includes(e.name),onChange:()=>ce(e.name)}),(0,t.jsx)("span",{style:{marginLeft:"8px"},children:e.name})]})},e.name))]}),(0,t.jsxs)("div",{className:"modal-footer-custom",children:[(0,t.jsx)("button",{className:"btn-modal btn-modal-light",onClick:()=>T(!1),children:"Cerrar"}),(0,t.jsxs)("button",{className:"btn-modal btn-modal-primary",onClick:()=>T(!1),children:[(0,t.jsx)("i",{className:"fas fa-check"}),"Aplicar"]})]})]})})]})},oe=Oe;0&&(module.exports={ApexTable});
|
|
15
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","#style-inject:#style-inject","../src/styles/table.css","../src/components/ApexTable.tsx","../src/components/DebouncedInput.tsx"],"sourcesContent":["import \"./styles/table.css\";\nexport { default as ApexTable } from \"./components/ApexTable\";\nexport type { ApexTableColumn, ApexTableProps } from \"./components/ApexTable\";\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root{--dt-bg: #ffffff;--dt-header-bg: #f8f9fa;--dt-header-text: #495057;--dt-row-text: #212529;--dt-row-hover-bg: #f1f3f5;--dt-row-stripe-bg: #f8f9fa;--dt-border-color: #dee2e6;--dt-disabled-text: #adb5bd;--dt-input-bg: #ffffff;--dt-input-border: #ced4da;--dt-input-text: #495057;--dt-badge-bg: #e7f5ff;--dt-badge-text: #0d6efd;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .1)}html.dark{--dt-bg: #1e293b;--dt-header-bg: #0f172a;--dt-header-text: #e2e8f0;--dt-row-text: #f1f5f9;--dt-row-hover-bg: #334155;--dt-row-stripe-bg: #1e293b;--dt-border-color: #334155;--dt-disabled-text: #64748b;--dt-input-bg: #1e293b;--dt-input-border: #334155;--dt-input-text: #f1f5f9;--dt-badge-bg: #1e293b;--dt-badge-text: #60a5fa;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .5)}.rdt_Table{background:transparent!important}.datatable-container{background:var(--dt-bg);border-radius:1.5rem;box-shadow:var(--dt-shadow);padding:1.5rem;overflow:auto!important;color:var(--dt-row-text);transition:all .2s ease}.rdt_TableHeadRow{background-color:var(--dt-header-bg)!important;border-bottom:2px solid var(--dt-border-color)!important}html.dark .rdt_TableRow{background-color:#1e293b}html.dark .datatable-container{background-color:#1e293b!important;color:#f1f5f9!important}.rdt_TableCell{word-break:normal!important;overflow-wrap:normal!important;white-space:normal!important}.rdt_TableCell .inline-flex,.rdt_TableCell button,.rdt_TableCell a{white-space:nowrap!important}.sticky-info-label{font-size:12px;color:var(--dt-header-text);margin-bottom:12px;display:flex;align-items:center;gap:6px}.custom-header-wrapper{display:flex;align-items:center;gap:8px}.custom-checkbox-label{position:relative;cursor:pointer;width:18px;height:18px}.custom-checkbox-input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.custom-checkbox-checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:var(--dt-input-border);border-radius:4px;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--dt-disabled-text)}.custom-checkbox-label:hover .custom-checkbox-checkmark{background-color:var(--dt-border-color)}.custom-checkbox-input:checked~.custom-checkbox-checkmark{background-color:#0d6efd;color:#fff}.custom-checkbox-input:disabled~.custom-checkbox-checkmark{background-color:var(--dt-header-bg);cursor:not-allowed;opacity:.7}.custom-checkbox-checkmark .fa-thumbtack{font-size:10px;transition:transform .2s ease}.custom-checkbox-input:checked~.custom-checkbox-checkmark .fa-thumbtack{transform:rotate(45deg)}.search-bar-container{background:var(--dt-header-bg);border-radius:8px;padding:16px;margin-bottom:20px;border:1px solid var(--dt-border-color)}.search-input-wrapper{position:relative;flex:1;max-width:400px}.search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dt-header-text);pointer-events:none}.search-input{padding-left:40px!important;border:1px solid var(--dt-input-border);border-radius:6px;padding:10px 12px;font-size:14px;width:100%;transition:all .2s ease;background-color:var(--dt-input-bg);color:var(--dt-input-text)}.search-input:focus{outline:none;border-color:#0d6efd;box-shadow:0 0 0 3px #0d6efd1a}.action-buttons{display:flex;gap:8px;flex-wrap:wrap}.btn-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;border-radius:6px;transition:all .2s ease;border:none;cursor:pointer}.btn-action:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.btn-csv{background-color:#198754;color:#fff}.btn-csv:hover{background-color:#157347}.btn-pdf{background-color:#dc3545;color:#fff}.btn-pdf:hover{background-color:#bb2d3b}.btn-columns{background-color:#0d6efd;color:#fff}.btn-columns:hover{background-color:#0b5ed7}.btn-action:disabled{opacity:.6;cursor:not-allowed;transform:none}.stats-badge{display:inline-flex;align-items:center;padding:4px 12px;background:var(--dt-badge-bg);color:var(--dt-badge-text);border-radius:20px;font-size:12px;font-weight:600}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;animation:dtp-fadeIn .2s ease}@keyframes dtp-fadeIn{0%{opacity:0}to{opacity:1}}.modal-content-custom{background:var(--dt-bg);color:var(--dt-row-text);border-radius:12px;box-shadow:var(--dt-shadow);width:90%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;animation:dtp-slideUp .3s ease;border:1px solid var(--dt-border-color)}@keyframes dtp-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.modal-header-custom{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:20px 24px;border-radius:12px 12px 0 0;display:flex;justify-content:space-between;align-items:center}.modal-title-custom{font-weight:600;font-size:18px;margin:0;display:flex;align-items:center;gap:8px}.modal-close-btn{background:#fff3;border:none;color:#fff;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.modal-close-btn:hover{background:#ffffff4d}.modal-body-custom{padding:24px;overflow-y:auto;flex:1}.modal-footer-custom{padding:16px 24px;border-top:1px solid var(--dt-border-color);display:flex;justify-content:flex-end;gap:8px}.column-actions{display:flex;gap:8px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--dt-border-color)}.btn-column-action{flex:1;padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid var(--dt-border-color);background:var(--dt-input-bg);color:var(--dt-row-text);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:4px}.btn-column-action:hover{background:var(--dt-row-hover-bg);border-color:#adb5bd}.column-checkbox-wrapper{padding:10px;border-radius:6px;transition:background-color .2s ease;display:flex;align-items:center}.column-checkbox-wrapper:hover{background-color:var(--dt-row-hover-bg)}.column-checkbox{display:flex;align-items:center;cursor:pointer;font-size:14px;user-select:none}.column-checkbox input{margin-right:8px;cursor:pointer}.btn-modal{padding:8px 16px;font-size:14px;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:6px}.btn-modal-light{background:var(--dt-header-bg);color:var(--dt-header-text)}.btn-modal-light:hover{background:var(--dt-row-hover-bg)}.btn-modal-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.btn-modal-primary:hover{box-shadow:0 4px 12px #667eea66}@media(max-width:768px){.search-bar-container{flex-direction:column;gap:12px}.search-input-wrapper{max-width:100%}.action-buttons{justify-content:stretch}.btn-action{flex:1;justify-content:center}.modal-content-custom{width:95%;margin:10px}}\\n\")","import React, { useState, useEffect, useMemo, useRef } from \"react\";\nimport DataTable from \"react-data-table-component\";\nimport type { TableProps, ConditionalStyles } from \"react-data-table-component\";\nimport { CSVLink } from \"react-csv\";\nimport { jsPDF } from \"jspdf\";\nimport autoTable from \"jspdf-autotable\";\nimport Swal from 'sweetalert2';\nimport DebouncedInput from \"./DebouncedInput\";\n\n// Extend TableColumn to include our custom properties\nexport interface ApexTableColumn<T> {\n name: string;\n selector?: (row: T) => any;\n sortable?: boolean;\n sortFunction?: (a: T, b: T) => number;\n right?: boolean;\n center?: boolean;\n compact?: boolean;\n wrap?: boolean;\n grow?: number;\n maxWidth?: string;\n minWidth?: string;\n width?: string;\n cell?: (row: T) => React.ReactNode;\n [key: string]: any;\n}\n\nexport interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'expandableRowExpanded'> {\n datos: T[];\n columnas: ApexTableColumn<T>[];\n hiddenOptions?: boolean;\n expandableRows?: boolean;\n expandableRowsComponent?: React.FC<{ data: T }>;\n expandableRowExpanded?: (row: T) => boolean;\n conditionalRowStyles?: ConditionalStyles<T>[];\n storagePrefix?: string;\n}\n\ninterface SortConfig {\n columnName: string;\n selector?: any;\n sortFunction?: any;\n direction: 'asc' | 'desc';\n}\n\nconst ApexTable = <T extends Record<string, any>>({\n datos = [],\n columnas = [],\n hiddenOptions = false,\n expandableRows = false,\n expandableRowsComponent,\n expandableRowExpanded,\n conditionalRowStyles = [],\n storagePrefix = \"dt_config\",\n ...otherProps\n}: ApexTableProps<T>) => {\n \n // ✅ unique key for this table instance on this page\n const storageKey = useMemo(() => {\n if (typeof window === 'undefined') return '';\n const path = window.location.pathname;\n const colNames = columnas.map(c => c.name).join(',');\n let hash = 0;\n for (let i = 0; i < colNames.length; i++) {\n const char = colNames.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0;\n }\n return `${storagePrefix}_${path}_${hash}`;\n }, [columnas, storagePrefix]);\n\n const [filterValue, setFilterValue] = useState<string>(() => {\n if (typeof window === 'undefined') return \"\";\n const saved = localStorage.getItem(`${storageKey}_filter`);\n return saved || \"\";\n });\n \n const [filteredData, setFilteredData] = useState<T[]>(datos);\n\n const [visibleColumns, setVisibleColumns] = useState<string[]>(() => {\n const allNames = columnas.map((col) => col.name);\n if (typeof window === 'undefined') return allNames;\n const saved = localStorage.getItem(`${storageKey}_visible`);\n if (!saved) return allNames;\n\n try {\n const parsed = JSON.parse(saved);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n return [...parsed, ...newColumns];\n } catch (e) {\n return allNames;\n }\n });\n\n const [showModal, setShowModal] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n\n const [stickyColumns, setStickyColumns] = useState<string[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sticky`);\n return saved ? JSON.parse(saved) : [];\n });\n\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\n const [sortConfig, setSortConfig] = useState<SortConfig[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sort`);\n return saved ? JSON.parse(saved) : [];\n });\n \n const tableRef = useRef<HTMLDivElement>(null);\n\n // ✅ Sync state to localStorage\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_visible`, JSON.stringify(visibleColumns));\n }\n }, [visibleColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sticky`, JSON.stringify(stickyColumns));\n }\n }, [stickyColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_filter`, filterValue);\n }\n }, [filterValue, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sort`, JSON.stringify(sortConfig));\n }\n }, [sortConfig, storageKey]);\n\n // ✅ Sync states if columns/hash change without remounting\n useEffect(() => {\n if (!storageKey) return;\n\n const savedVisible = localStorage.getItem(`${storageKey}_visible`);\n const allNames = columnas.map(col => col.name);\n if (savedVisible) {\n try {\n const parsed = JSON.parse(savedVisible);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n setVisibleColumns([...parsed, ...newColumns]);\n } catch (e) {\n setVisibleColumns(allNames);\n }\n }\n else setVisibleColumns(allNames);\n\n const savedSticky = localStorage.getItem(`${storageKey}_sticky`);\n if (savedSticky) setStickyColumns(JSON.parse(savedSticky));\n else setStickyColumns([]);\n\n const savedSort = localStorage.getItem(`${storageKey}_sort`);\n if (savedSort) setSortConfig(JSON.parse(savedSort));\n else setSortConfig([]);\n\n const savedFilter = localStorage.getItem(`${storageKey}_filter`);\n setFilterValue(savedFilter || \"\");\n }, [storageKey]);\n\n const handleFilterChange = (searchValue: string | number) => {\n const val = String(searchValue);\n setFilterValue(val);\n\n if (!val || val.length === 0) {\n setFilteredData(datos);\n return;\n }\n\n const searchLower = val.toLowerCase();\n\n const filtered = datos.filter((row) =>\n Object.values(row).some((value) => {\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n })\n );\n\n setFilteredData(filtered);\n };\n\n const handleDoubleClick = (row: T) => {\n Swal.fire({\n title: 'Detalle de la Fila',\n html: `<pre style=\"text-align: left; font-size: 12px; background: #f4f4f4; padding: 10px; border-radius: 4px; overflow: auto;\">${JSON.stringify(row, null, 2)}</pre>`,\n width: '600px',\n confirmButtonColor: '#764ba2'\n });\n };\n\n useEffect(() => {\n setFilteredData(datos);\n }, [datos]);\n\n const downloadPDF = () => {\n setIsExporting(true);\n setTimeout(() => {\n const doc = new jsPDF() as any;\n const tableColumn = columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => col.name);\n\n const tableRows = datos.map((row) => {\n return columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => {\n let value;\n if (typeof col.selector === \"function\") {\n value = col.selector(row);\n } else {\n // Basic mapping if selector was a string property name (though we typed it as function)\n value = (row as any)[col.selector as any];\n }\n const formattedValue =\n value !== undefined &&\n value !== null &&\n typeof value === \"object\"\n ? JSON.stringify(value)\n : value || \"\";\n return formattedValue;\n });\n });\n\n autoTable(doc, {\n head: [tableColumn],\n body: tableRows,\n startY: 20,\n theme: \"grid\",\n styles: {\n halign: \"justify\",\n },\n });\n doc.save(\"data.pdf\");\n setIsExporting(false);\n }, 100);\n };\n\n const handleColumnVisibilityChange = (columnName: string) => {\n setVisibleColumns((prevVisibleColumns) =>\n prevVisibleColumns.includes(columnName)\n ? prevVisibleColumns.filter((name) => name !== columnName)\n : [...prevVisibleColumns, columnName]\n );\n };\n\n const selectAllColumns = () => {\n setVisibleColumns(columnas.map((col) => col.name));\n };\n\n const deselectAllColumns = () => {\n setVisibleColumns([]);\n };\n\n const filteredColumns = useMemo(\n () => columnas.filter((col) => visibleColumns.includes(col.name)),\n [columnas, visibleColumns]\n );\n\n const orderedStickyColumns = useMemo(\n () => filteredColumns.filter((col) => stickyColumns.includes(col.name)),\n [filteredColumns, stickyColumns]\n );\n\n const toggleStickyColumn = (name: string) => {\n setStickyColumns((prev) => {\n const isSticky = prev.includes(name);\n if (isSticky) {\n return prev.filter((colName) => colName !== name);\n } else {\n if (prev.length < 3) {\n return [...prev, name];\n }\n return prev;\n }\n });\n };\n\n useEffect(() => {\n if (!tableRef.current) return;\n\n const firstRow = tableRef.current.querySelector(\".rdt_TableRow\");\n if (!firstRow) return;\n\n const rowCells = firstRow.querySelectorAll(\".rdt_TableCell\");\n if (!rowCells.length) return;\n\n const newWidths: Record<string, number> = {};\n\n filteredColumns.forEach((col, index) => {\n if (rowCells[index]) {\n const width = rowCells[index].getBoundingClientRect().width;\n newWidths[col.name] = width;\n }\n });\n\n const oldKeys = Object.keys(columnWidths);\n const newKeys = Object.keys(newWidths);\n\n const sameLength = oldKeys.length === newKeys.length;\n const sameValues =\n sameLength &&\n newKeys.every((key) => columnWidths[key] === newWidths[key]);\n\n if (!sameValues) {\n setColumnWidths(newWidths);\n }\n }, [filteredColumns, columnWidths, filteredData.length]);\n\n const stickyOffsets = useMemo(() => {\n const offsets: Record<string, number> = {};\n let currentOffset = 0;\n\n orderedStickyColumns.forEach((col) => {\n offsets[col.name] = currentOffset;\n currentOffset += columnWidths[col.name] || 0;\n });\n\n return offsets;\n }, [orderedStickyColumns, columnWidths]);\n\n const dynamicStyles = useMemo(() => {\n return orderedStickyColumns\n .map((col, orderIndex) => {\n const index = filteredColumns.findIndex((c) => c.name === col.name);\n const offset = stickyOffsets[col.name];\n\n if (index === -1 || offset === undefined) return \"\";\n\n const zBase = 20 + orderIndex;\n\n return `\n .rdt_TableCol:nth-child(${index + 1}),\n .rdt_TableCell:nth-child(${index + 1}) {\n position: sticky !important;\n left: ${offset}px;\n z-index: ${zBase};\n background-color: var(--dt-row-hover-bg);\n background-clip: padding-box;\n }\n .rdt_TableCol:nth-child(${index + 1}) {\n z-index: ${zBase + 1};\n }\n `;\n })\n .join(\"\");\n }, [orderedStickyColumns, stickyOffsets, filteredColumns]);\n\n const handleColumnSort = (col: ApexTableColumn<T>, e: React.MouseEvent) => {\n if (col.sortable === false) return;\n if (!col.selector && !col.sortFunction && !col.name) return;\n\n const isShift = e.shiftKey;\n setSortConfig(prev => {\n const index = prev.findIndex(s => s.columnName === col.name);\n let updated = [...prev];\n\n if (!isShift) {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n updated = [{ ...existing, direction: existing.direction === 'asc' ? 'desc' : 'asc' }];\n }\n } else {\n updated = [{ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' }];\n }\n } else {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n if (existing.direction === 'asc') {\n updated[index] = { ...existing, direction: 'desc' };\n } else {\n updated.splice(index, 1);\n }\n }\n } else {\n updated.push({ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' });\n }\n }\n return updated;\n });\n };\n\n const renderSortIcon = (col: ApexTableColumn<T>) => {\n if (col.sortable === false) return null;\n if (!col.selector && !col.sortFunction) return null;\n\n const sortIndex = sortConfig.findIndex(s => s.columnName === col.name);\n\n if (sortIndex === -1) {\n return (\n <span className=\"ms-1\" style={{ opacity: 0.3, fontSize: '11px', color: 'var(--dt-header-text)' }}>\n <i className=\"fas fa-sort\"></i>\n </span>\n );\n }\n\n const config = sortConfig[sortIndex];\n const isAsc = config ? config.direction === 'asc' : true;\n return (\n <span className=\"ms-1 d-flex align-items-center\" style={{ fontSize: '12px', color: '#0d6efd', fontWeight: 'bold' }}>\n <i className={isAsc ? \"fas fa-sort-up\" : \"fas fa-sort-down\"}></i>\n {sortConfig.length > 1 && (\n <small className=\"ms-1\" style={{ fontSize: '10px' }}>\n {sortIndex + 1}\n </small>\n )}\n </span>\n );\n };\n\n const processedColumns = filteredColumns.map((col) => {\n const {\n right,\n center: colCenter,\n compact,\n wrap,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n ...safeProps\n } = col;\n\n const isSticky = stickyColumns.includes(col.name);\n const canBeMadeSticky = isSticky || stickyColumns.length < 3;\n const center = right ? false : (colCenter !== false);\n const isSortableColumn = col.sortable !== false && (col.selector || col.sortFunction);\n\n return {\n ...safeProps,\n right,\n center,\n compact,\n wrap: wrap !== undefined ? wrap : true,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n sortable: false, \n name: (\n <div\n className=\"custom-header-wrapper\"\n onClick={(e) => {\n e.stopPropagation();\n if (isSortableColumn) handleColumnSort(col, e);\n }}\n style={{\n cursor: isSortableColumn ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n justifyContent: center ? 'center' : right ? 'flex-end' : 'flex-start',\n userSelect: \"none\"\n }}\n title={isSortableColumn ? \"Clic para ordenar. Shift+clic para ordenar por múltiples columnas\" : \"\"}\n >\n <label className=\"custom-checkbox-label\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n className=\"custom-checkbox-input\"\n checked={isSticky}\n disabled={!canBeMadeSticky}\n onChange={() => toggleStickyColumn(col.name)}\n />\n <span className=\"custom-checkbox-checkmark\">\n <i className=\"fas fa-thumbtack\"></i>\n </span>\n </label>\n <span className=\"custom-header-name\" style={{ marginLeft: '8px' }}>{col.name}</span>\n {isSortableColumn && renderSortIcon(col)}\n </div>\n ),\n };\n });\n\n const sortedData = useMemo(() => {\n if (sortConfig.length === 0) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n for (let i = 0; i < sortConfig.length; i++) {\n const config = sortConfig[i];\n if (!config) continue;\n \n const { selector, sortFunction, direction } = config;\n const dirMultiplier = direction === 'asc' ? 1 : -1;\n\n if (sortFunction) {\n const res = sortFunction(a, b);\n if (res !== 0) return res * dirMultiplier;\n continue;\n }\n\n if (!selector) continue;\n\n let valA = typeof selector === 'function' ? selector(a) : (a as any)[selector];\n let valB = typeof selector === 'function' ? selector(b) : (b as any)[selector];\n\n valA = valA ?? \"\";\n valB = valB ?? \"\";\n\n if (typeof valA === \"string\" && typeof valB === \"string\") {\n const comp = valA.localeCompare(valB, undefined, { numeric: true, sensitivity: 'base' });\n if (comp !== 0) return comp * dirMultiplier;\n } else if (typeof valA === \"number\" && typeof valB === \"number\") {\n if (valA !== valB) return (valA - valB) * dirMultiplier;\n } else {\n if (valA < valB) return -1 * dirMultiplier;\n if (valA > valB) return 1 * dirMultiplier;\n }\n }\n return 0;\n });\n }, [filteredData, sortConfig]);\n\n const customStyles = {\n headRow: {\n style: {\n backgroundColor: \"var(--dt-header-bg)\",\n borderBottom: \"2px solid var(--dt-border-color)\",\n fontWeight: \"600\",\n fontSize: \"14px\",\n color: \"var(--dt-header-text)\",\n minHeight: \"52px\",\n },\n },\n headCells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n rows: {\n style: {\n fontSize: \"13px\",\n color: \"var(--dt-row-text)\",\n backgroundColor: \"var(--dt-bg)\",\n minHeight: \"44px\",\n \"&:hover\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease\",\n color: \"var(--dt-row-text)\",\n },\n },\n stripedStyle: {\n backgroundColor: \"var(--dt-row-stripe-bg)\",\n color: \"var(--dt-row-text)\",\n },\n },\n cells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n pagination: {\n style: {\n borderTop: \"1px solid var(--dt-border-color)\",\n fontSize: \"13px\",\n minHeight: \"56px\",\n backgroundColor: \"var(--dt-bg)\",\n color: \"var(--dt-row-text)\",\n },\n pageButtonsStyle: {\n color: \"var(--dt-row-text)\",\n fill: \"var(--dt-row-text)\",\n \"&:disabled\": {\n color: \"var(--dt-disabled-text)\",\n fill: \"var(--dt-disabled-text)\",\n },\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n \"&:focus\": {\n outline: \"none\",\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n },\n },\n };\n\n const csvData = useMemo(() => {\n if (!datos || datos.length === 0 || !datos[0]) return [];\n\n const originalKeys = Object.keys(datos[0]);\n const validKeys: string[] = [];\n\n originalKeys.forEach(key => {\n if (['created_at', 'updated_at', 'deleted_at'].includes(key)) return;\n\n const firstValid = datos.find(row => row[key] !== null && row[key] !== undefined);\n if (firstValid) {\n const val = firstValid[key];\n if (typeof val === 'object' && !(val instanceof Date)) {\n return;\n }\n validKeys.push(key);\n } else {\n validKeys.push(key);\n }\n });\n\n const blankRow = validKeys.map(() => \"\");\n const headerRow = validKeys;\n const processed = datos.map(row => {\n return validKeys.map(key => {\n const val = row[key];\n return val !== null && val !== undefined ? val : \"\";\n });\n });\n\n return [blankRow, headerRow, ...processed];\n }, [datos]);\n\n return (\n <section className=\"apextable-wrapper\">\n <style>{dynamicStyles}</style>\n\n <div className=\"datatable-container\" ref={tableRef}>\n <div className=\"search-bar-container\" hidden={hiddenOptions}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"16px\" }}>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", justifyContent: \"space-between\", alignItems: \"center\", gap: \"16px\" }}>\n <div className=\"search-input-wrapper\">\n <i className=\"fas fa-search search-icon\"></i>\n <DebouncedInput\n value={filterValue}\n onChange={handleFilterChange}\n placeholder=\"Buscar en todos los campos...\"\n className=\"search-input\"\n />\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"12px\", flexWrap: \"wrap\" }}>\n <span className=\"stats-badge\">\n {filteredData.length} de {datos.length} registros\n </span>\n\n <div className=\"action-buttons\">\n <CSVLink\n data={csvData}\n filename={`export_${new Date().toISOString().split('T')[0]}.csv`}\n style={{ textDecoration: \"none\" }}\n >\n <button className=\"btn-action btn-csv\">\n <i className=\"fas fa-file-csv\" />\n <span>CSV</span>\n </button>\n </CSVLink>\n\n <button\n onClick={downloadPDF}\n className=\"btn-action btn-pdf\"\n disabled={isExporting}\n >\n <i className=\"fas fa-file-pdf\" />\n <span>\n {isExporting ? \"Exportando...\" : \"PDF\"}\n </span>\n </button>\n\n <button\n className=\"btn-action btn-columns\"\n onClick={() => setShowModal(true)}\n >\n <i className=\"fas fa-columns\" />\n <span>Columnas</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"sticky-info-label\">\n <i className=\"fas fa-info-circle\"></i>\n <span>\n Use la chincheta (<i className=\"fas fa-thumbtack\"></i>) para fijar hasta 3 columnas.\n </span>\n </div>\n\n <DataTable\n columns={processedColumns as any}\n data={sortedData}\n pagination\n paginationPerPage={15}\n paginationRowsPerPageOptions={[5, 10, 15, 20, 25, 50]}\n striped\n highlightOnHover\n pointerOnHover\n responsive\n fixedHeader\n fixedHeaderScrollHeight=\"calc(100vh - 320px)\"\n onRowDoubleClicked={handleDoubleClick}\n customStyles={customStyles}\n expandableRows={expandableRows}\n expandableRowsComponent={expandableRowsComponent as any}\n expandableRowExpanded={expandableRowExpanded as any}\n conditionalRowStyles={conditionalRowStyles}\n {...otherProps}\n noDataComponent={\n <div style={{ padding: \"40px\", textAlign: \"center\" as const, color: \"#6c757d\" }}>\n <i className=\"fas fa-inbox\" style={{ fontSize: \"48px\", marginBottom: \"16px\", opacity: 0.5 }} />\n <p style={{ margin: 0, fontSize: \"14px\" }}>No se encontraron registros</p>\n </div>\n }\n />\n </div>\n\n {/* Modal de Columnas */}\n {showModal && (\n <div className=\"modal-overlay\" onClick={() => setShowModal(false)}>\n <div className=\"modal-content-custom\" onClick={(e) => e.stopPropagation()}>\n <div className=\"modal-header-custom\">\n <h5 className=\"modal-title-custom\">\n <i className=\"fas fa-columns\" />\n Gestionar Columnas\n </h5>\n <button className=\"modal-close-btn\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-times\" />\n </button>\n </div>\n\n <div className=\"modal-body-custom\">\n <div className=\"column-actions\">\n <button className=\"btn-column-action\" onClick={selectAllColumns}>\n <i className=\"fas fa-check-double\" />\n Seleccionar Todo\n </button>\n <button className=\"btn-column-action\" onClick={deselectAllColumns}>\n <i className=\"fas fa-times\" />\n Deseleccionar Todo\n </button>\n </div>\n\n {columnas.map((col) => (\n <div key={col.name} className=\"column-checkbox-wrapper\">\n <label className=\"column-checkbox\">\n <input\n type=\"checkbox\"\n checked={visibleColumns.includes(col.name)}\n onChange={() => handleColumnVisibilityChange(col.name)}\n />\n <span style={{ marginLeft: '8px' }}>{col.name}</span>\n </label>\n </div>\n ))}\n </div>\n\n <div className=\"modal-footer-custom\">\n <button className=\"btn-modal btn-modal-light\" onClick={() => setShowModal(false)}>\n Cerrar\n </button>\n <button className=\"btn-modal btn-modal-primary\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-check\" />\n Aplicar\n </button>\n </div>\n </div>\n </div>\n )}\n </section>\n );\n};\n\nexport default ApexTable;\n","import React, { useState, useEffect } from \"react\";\n\ninterface DebouncedInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string | number;\n onChange: (value: string | number) => void;\n debounce?: number;\n}\n\nconst DebouncedInput: React.FC<DebouncedInputProps> = ({\n value: initialValue,\n onChange,\n debounce = 300,\n ...props\n}) => {\n const [value, setValue] = useState(initialValue);\n\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n onChange(value);\n }, debounce);\n\n return () => clearTimeout(timeout);\n }, [value, debounce, onChange]);\n\n return (\n <input\n {...props}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n );\n};\n\nexport default DebouncedInput;\n"],"mappings":"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","names":["index_exports","__export","ApexTable_default","__toCommonJS","styleInject","css","insertAt","head","style","styleInject","import_react","import_react_data_table_component","import_react_csv","import_jspdf","import_jspdf_autotable","import_sweetalert2","import_react","import_jsx_runtime","DebouncedInput","initialValue","onChange","debounce","props","value","setValue","timeout","e","DebouncedInput_default","import_jsx_runtime","ApexTable","datos","columnas","hiddenOptions","expandableRows","expandableRowsComponent","expandableRowExpanded","conditionalRowStyles","storagePrefix","otherProps","storageKey","path","colNames","c","hash","i","char","filterValue","setFilterValue","filteredData","setFilteredData","visibleColumns","setVisibleColumns","allNames","col","saved","parsed","newColumns","name","showModal","setShowModal","isExporting","setIsExporting","stickyColumns","setStickyColumns","columnWidths","setColumnWidths","sortConfig","setSortConfig","tableRef","savedVisible","savedSticky","savedSort","savedFilter","handleFilterChange","searchValue","val","searchLower","filtered","row","value","handleDoubleClick","Swal","downloadPDF","doc","tableColumn","tableRows","autoTable","handleColumnVisibilityChange","columnName","prevVisibleColumns","selectAllColumns","deselectAllColumns","filteredColumns","orderedStickyColumns","toggleStickyColumn","prev","colName","firstRow","rowCells","newWidths","index","width","oldKeys","newKeys","key","stickyOffsets","offsets","currentOffset","dynamicStyles","orderIndex","offset","zBase","handleColumnSort","e","isShift","s","updated","existing","renderSortIcon","sortIndex","config","isAsc","processedColumns","right","colCenter","compact","wrap","grow","maxWidth","minWidth","reorder","safeProps","isSticky","canBeMadeSticky","center","isSortableColumn","sortedData","a","b","selector","sortFunction","direction","dirMultiplier","res","valA","valB","comp","customStyles","csvData","originalKeys","validKeys","firstValid","blankRow","headerRow","processed","DebouncedInput_default","DataTable","ApexTable_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","#style-inject:#style-inject","../src/styles/table.css","../src/components/ApexTable.tsx","../src/components/DebouncedInput.tsx"],"sourcesContent":["import \"./styles/table.css\";\nexport { default as ApexTable } from \"./components/ApexTable\";\nexport type { ApexTableColumn, ApexTableProps } from \"./components/ApexTable\";\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root{--dt-bg: #ffffff;--dt-header-bg: #f8f9fa;--dt-header-text: #495057;--dt-row-text: #212529;--dt-row-hover-bg: #f1f3f5;--dt-row-stripe-bg: #f8f9fa;--dt-border-color: #dee2e6;--dt-disabled-text: #adb5bd;--dt-input-bg: #ffffff;--dt-input-border: #ced4da;--dt-input-text: #495057;--dt-badge-bg: #e7f5ff;--dt-badge-text: #0d6efd;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .1)}html.dark{--dt-bg: #1e293b;--dt-header-bg: #0f172a;--dt-header-text: #e2e8f0;--dt-row-text: #f1f5f9;--dt-row-hover-bg: #334155;--dt-row-stripe-bg: #1e293b;--dt-border-color: #334155;--dt-disabled-text: #64748b;--dt-input-bg: #1e293b;--dt-input-border: #334155;--dt-input-text: #f1f5f9;--dt-badge-bg: #1e293b;--dt-badge-text: #60a5fa;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .5)}.rdt_Table{background:transparent!important}.datatable-container{background:var(--dt-bg);border-radius:1.5rem;box-shadow:var(--dt-shadow);padding:1.5rem;overflow:auto!important;color:var(--dt-row-text);transition:all .2s ease}.rdt_TableHeadRow{background-color:var(--dt-header-bg)!important;border-bottom:2px solid var(--dt-border-color)!important}html.dark .rdt_TableRow{background-color:#1e293b}html.dark .datatable-container{background-color:#1e293b!important;color:#f1f5f9!important}.rdt_TableCell{word-break:normal!important;overflow-wrap:normal!important;white-space:normal!important}.rdt_TableCell .inline-flex,.rdt_TableCell button,.rdt_TableCell a{white-space:nowrap!important}.sticky-info-label{font-size:12px;color:var(--dt-header-text);margin-bottom:12px;display:flex;align-items:center;gap:6px}.custom-header-wrapper{display:flex;align-items:center;gap:8px}.custom-checkbox-label{position:relative;cursor:pointer;width:18px;height:18px}.custom-checkbox-input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.custom-checkbox-checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:var(--dt-input-border);border-radius:4px;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--dt-disabled-text)}.custom-checkbox-label:hover .custom-checkbox-checkmark{background-color:var(--dt-border-color)}.custom-checkbox-input:checked~.custom-checkbox-checkmark{background-color:#0d6efd;color:#fff}.custom-checkbox-input:disabled~.custom-checkbox-checkmark{background-color:var(--dt-header-bg);cursor:not-allowed;opacity:.7}.custom-checkbox-checkmark .fa-thumbtack{font-size:10px;transition:transform .2s ease}.custom-checkbox-input:checked~.custom-checkbox-checkmark .fa-thumbtack{transform:rotate(45deg)}.search-bar-container{background:var(--dt-header-bg);border-radius:8px;padding:16px;margin-bottom:20px;border:1px solid var(--dt-border-color)}.search-input-wrapper{position:relative;flex:1;max-width:400px}.search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dt-header-text);pointer-events:none}.search-input{padding-left:40px!important;border:1px solid var(--dt-input-border);border-radius:6px;padding:10px 12px;font-size:14px;width:100%;transition:all .2s ease;background-color:var(--dt-input-bg);color:var(--dt-input-text)}.search-input:focus{outline:none;border-color:#0d6efd;box-shadow:0 0 0 3px #0d6efd1a}.action-buttons{display:flex;gap:8px;flex-wrap:wrap}.btn-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;border-radius:6px;transition:all .2s ease;border:none;cursor:pointer}.btn-action:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.btn-csv{background-color:#198754;color:#fff}.btn-csv:hover{background-color:#157347}.btn-pdf{background-color:#dc3545;color:#fff}.btn-pdf:hover{background-color:#bb2d3b}.btn-columns{background-color:#0d6efd;color:#fff}.btn-columns:hover{background-color:#0b5ed7}.btn-action:disabled{opacity:.6;cursor:not-allowed;transform:none}.stats-badge{display:inline-flex;align-items:center;padding:4px 12px;background:var(--dt-badge-bg);color:var(--dt-badge-text);border-radius:20px;font-size:12px;font-weight:600}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;animation:dtp-fadeIn .2s ease}@keyframes dtp-fadeIn{0%{opacity:0}to{opacity:1}}.modal-content-custom{background:var(--dt-bg);color:var(--dt-row-text);border-radius:12px;box-shadow:var(--dt-shadow);width:90%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;animation:dtp-slideUp .3s ease;border:1px solid var(--dt-border-color)}@keyframes dtp-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.modal-header-custom{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:20px 24px;border-radius:12px 12px 0 0;display:flex;justify-content:space-between;align-items:center}.modal-title-custom{font-weight:600;font-size:18px;margin:0;display:flex;align-items:center;gap:8px}.modal-close-btn{background:#fff3;border:none;color:#fff;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.modal-close-btn:hover{background:#ffffff4d}.modal-body-custom{padding:24px;overflow-y:auto;flex:1}.modal-footer-custom{padding:16px 24px;border-top:1px solid var(--dt-border-color);display:flex;justify-content:flex-end;gap:8px}.column-actions{display:flex;gap:8px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--dt-border-color)}.btn-column-action{flex:1;padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid var(--dt-border-color);background:var(--dt-input-bg);color:var(--dt-row-text);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:4px}.btn-column-action:hover{background:var(--dt-row-hover-bg);border-color:#adb5bd}.column-checkbox-wrapper{padding:10px;border-radius:6px;transition:background-color .2s ease;display:flex;align-items:center}.column-checkbox-wrapper:hover{background-color:var(--dt-row-hover-bg)}.column-checkbox{display:flex;align-items:center;cursor:pointer;font-size:14px;user-select:none}.column-checkbox input{margin-right:8px;cursor:pointer}.btn-modal{padding:8px 16px;font-size:14px;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:6px}.btn-modal-light{background:var(--dt-header-bg);color:var(--dt-header-text)}.btn-modal-light:hover{background:var(--dt-row-hover-bg)}.btn-modal-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.btn-modal-primary:hover{box-shadow:0 4px 12px #667eea66}@media(max-width:768px){.search-bar-container{flex-direction:column;gap:12px}.search-input-wrapper{max-width:100%}.action-buttons{justify-content:stretch}.btn-action{flex:1;justify-content:center}.modal-content-custom{width:95%;margin:10px}}\\n\")","import React, { useState, useEffect, useMemo, useRef } from \"react\";\nimport DataTable from \"react-data-table-component\";\nimport type { TableProps, ConditionalStyles } from \"react-data-table-component\";\nimport { CSVLink } from \"react-csv\";\nimport { jsPDF } from \"jspdf\";\nimport autoTable from \"jspdf-autotable\";\nimport Swal from 'sweetalert2';\nimport DebouncedInput from \"./DebouncedInput\";\n\nconst DataTableComponent: any = (DataTable as any)?.default || DataTable;\n\n\n// Extend TableColumn to include our custom properties\nexport interface ApexTableColumn<T> {\n name: string;\n selector?: (row: T) => any;\n sortable?: boolean;\n sortFunction?: (a: T, b: T) => number;\n right?: boolean;\n center?: boolean;\n compact?: boolean;\n wrap?: boolean;\n grow?: number;\n maxWidth?: string;\n minWidth?: string;\n width?: string;\n cell?: (row: T) => React.ReactNode;\n [key: string]: any;\n}\n\nexport interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'expandableRowExpanded'> {\n datos: T[];\n columnas: ApexTableColumn<T>[];\n hiddenOptions?: boolean;\n expandableRows?: boolean;\n expandableRowsComponent?: React.FC<{ data: T }>;\n expandableRowExpanded?: (row: T) => boolean;\n conditionalRowStyles?: ConditionalStyles<T>[];\n storagePrefix?: string;\n}\n\ninterface SortConfig {\n columnName: string;\n selector?: any;\n sortFunction?: any;\n direction: 'asc' | 'desc';\n}\n\nconst ApexTable = <T extends Record<string, any>>({\n datos = [],\n columnas = [],\n hiddenOptions = false,\n expandableRows = false,\n expandableRowsComponent,\n expandableRowExpanded,\n conditionalRowStyles = [],\n storagePrefix = \"dt_config\",\n ...otherProps\n}: ApexTableProps<T>) => {\n \n // ✅ unique key for this table instance on this page\n const storageKey = useMemo(() => {\n if (typeof window === 'undefined') return '';\n const path = window.location.pathname;\n const colNames = columnas.map(c => c.name).join(',');\n let hash = 0;\n for (let i = 0; i < colNames.length; i++) {\n const char = colNames.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0;\n }\n return `${storagePrefix}_${path}_${hash}`;\n }, [columnas, storagePrefix]);\n\n const [filterValue, setFilterValue] = useState<string>(() => {\n if (typeof window === 'undefined') return \"\";\n const saved = localStorage.getItem(`${storageKey}_filter`);\n return saved || \"\";\n });\n \n const [filteredData, setFilteredData] = useState<T[]>(datos);\n\n const [visibleColumns, setVisibleColumns] = useState<string[]>(() => {\n const allNames = columnas.map((col) => col.name);\n if (typeof window === 'undefined') return allNames;\n const saved = localStorage.getItem(`${storageKey}_visible`);\n if (!saved) return allNames;\n\n try {\n const parsed = JSON.parse(saved);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n return [...parsed, ...newColumns];\n } catch (e) {\n return allNames;\n }\n });\n\n const [showModal, setShowModal] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n\n const [stickyColumns, setStickyColumns] = useState<string[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sticky`);\n return saved ? JSON.parse(saved) : [];\n });\n\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\n const [sortConfig, setSortConfig] = useState<SortConfig[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sort`);\n return saved ? JSON.parse(saved) : [];\n });\n \n const tableRef = useRef<HTMLDivElement>(null);\n\n // ✅ Sync state to localStorage\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_visible`, JSON.stringify(visibleColumns));\n }\n }, [visibleColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sticky`, JSON.stringify(stickyColumns));\n }\n }, [stickyColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_filter`, filterValue);\n }\n }, [filterValue, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sort`, JSON.stringify(sortConfig));\n }\n }, [sortConfig, storageKey]);\n\n // ✅ Sync states if columns/hash change without remounting\n useEffect(() => {\n if (!storageKey) return;\n\n const savedVisible = localStorage.getItem(`${storageKey}_visible`);\n const allNames = columnas.map(col => col.name);\n if (savedVisible) {\n try {\n const parsed = JSON.parse(savedVisible);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n setVisibleColumns([...parsed, ...newColumns]);\n } catch (e) {\n setVisibleColumns(allNames);\n }\n }\n else setVisibleColumns(allNames);\n\n const savedSticky = localStorage.getItem(`${storageKey}_sticky`);\n if (savedSticky) setStickyColumns(JSON.parse(savedSticky));\n else setStickyColumns([]);\n\n const savedSort = localStorage.getItem(`${storageKey}_sort`);\n if (savedSort) setSortConfig(JSON.parse(savedSort));\n else setSortConfig([]);\n\n const savedFilter = localStorage.getItem(`${storageKey}_filter`);\n setFilterValue(savedFilter || \"\");\n }, [storageKey]);\n\n const handleFilterChange = (searchValue: string | number) => {\n const val = String(searchValue);\n setFilterValue(val);\n\n if (!val || val.length === 0) {\n setFilteredData(datos);\n return;\n }\n\n const searchLower = val.toLowerCase();\n\n const filtered = datos.filter((row) =>\n Object.values(row).some((value) => {\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n })\n );\n\n setFilteredData(filtered);\n };\n\n const handleDoubleClick = (row: T) => {\n Swal.fire({\n title: 'Detalle de la Fila',\n html: `<pre style=\"text-align: left; font-size: 12px; background: #f4f4f4; padding: 10px; border-radius: 4px; overflow: auto;\">${JSON.stringify(row, null, 2)}</pre>`,\n width: '600px',\n confirmButtonColor: '#764ba2'\n });\n };\n\n useEffect(() => {\n setFilteredData(datos);\n }, [datos]);\n\n const downloadPDF = () => {\n setIsExporting(true);\n setTimeout(() => {\n const doc = new jsPDF() as any;\n const tableColumn = columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => col.name);\n\n const tableRows = datos.map((row) => {\n return columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => {\n let value;\n if (typeof col.selector === \"function\") {\n value = col.selector(row);\n } else {\n // Basic mapping if selector was a string property name (though we typed it as function)\n value = (row as any)[col.selector as any];\n }\n const formattedValue =\n value !== undefined &&\n value !== null &&\n typeof value === \"object\"\n ? JSON.stringify(value)\n : value || \"\";\n return formattedValue;\n });\n });\n\n autoTable(doc, {\n head: [tableColumn],\n body: tableRows,\n startY: 20,\n theme: \"grid\",\n styles: {\n halign: \"justify\",\n },\n });\n doc.save(\"data.pdf\");\n setIsExporting(false);\n }, 100);\n };\n\n const handleColumnVisibilityChange = (columnName: string) => {\n setVisibleColumns((prevVisibleColumns) =>\n prevVisibleColumns.includes(columnName)\n ? prevVisibleColumns.filter((name) => name !== columnName)\n : [...prevVisibleColumns, columnName]\n );\n };\n\n const selectAllColumns = () => {\n setVisibleColumns(columnas.map((col) => col.name));\n };\n\n const deselectAllColumns = () => {\n setVisibleColumns([]);\n };\n\n const filteredColumns = useMemo(\n () => columnas.filter((col) => visibleColumns.includes(col.name)),\n [columnas, visibleColumns]\n );\n\n const orderedStickyColumns = useMemo(\n () => filteredColumns.filter((col) => stickyColumns.includes(col.name)),\n [filteredColumns, stickyColumns]\n );\n\n const toggleStickyColumn = (name: string) => {\n setStickyColumns((prev) => {\n const isSticky = prev.includes(name);\n if (isSticky) {\n return prev.filter((colName) => colName !== name);\n } else {\n if (prev.length < 3) {\n return [...prev, name];\n }\n return prev;\n }\n });\n };\n\n useEffect(() => {\n if (!tableRef.current) return;\n\n const firstRow = tableRef.current.querySelector(\".rdt_TableRow\");\n if (!firstRow) return;\n\n const rowCells = firstRow.querySelectorAll(\".rdt_TableCell\");\n if (!rowCells.length) return;\n\n const newWidths: Record<string, number> = {};\n\n filteredColumns.forEach((col, index) => {\n if (rowCells[index]) {\n const width = rowCells[index].getBoundingClientRect().width;\n newWidths[col.name] = width;\n }\n });\n\n const oldKeys = Object.keys(columnWidths);\n const newKeys = Object.keys(newWidths);\n\n const sameLength = oldKeys.length === newKeys.length;\n const sameValues =\n sameLength &&\n newKeys.every((key) => columnWidths[key] === newWidths[key]);\n\n if (!sameValues) {\n setColumnWidths(newWidths);\n }\n }, [filteredColumns, columnWidths, filteredData.length]);\n\n const stickyOffsets = useMemo(() => {\n const offsets: Record<string, number> = {};\n let currentOffset = 0;\n\n orderedStickyColumns.forEach((col) => {\n offsets[col.name] = currentOffset;\n currentOffset += columnWidths[col.name] || 0;\n });\n\n return offsets;\n }, [orderedStickyColumns, columnWidths]);\n\n const dynamicStyles = useMemo(() => {\n return orderedStickyColumns\n .map((col, orderIndex) => {\n const index = filteredColumns.findIndex((c) => c.name === col.name);\n const offset = stickyOffsets[col.name];\n\n if (index === -1 || offset === undefined) return \"\";\n\n const zBase = 20 + orderIndex;\n\n return `\n .rdt_TableCol:nth-child(${index + 1}),\n .rdt_TableCell:nth-child(${index + 1}) {\n position: sticky !important;\n left: ${offset}px;\n z-index: ${zBase};\n background-color: var(--dt-row-hover-bg);\n background-clip: padding-box;\n }\n .rdt_TableCol:nth-child(${index + 1}) {\n z-index: ${zBase + 1};\n }\n `;\n })\n .join(\"\");\n }, [orderedStickyColumns, stickyOffsets, filteredColumns]);\n\n const handleColumnSort = (col: ApexTableColumn<T>, e: React.MouseEvent) => {\n if (col.sortable === false) return;\n if (!col.selector && !col.sortFunction && !col.name) return;\n\n const isShift = e.shiftKey;\n setSortConfig(prev => {\n const index = prev.findIndex(s => s.columnName === col.name);\n let updated = [...prev];\n\n if (!isShift) {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n updated = [{ ...existing, direction: existing.direction === 'asc' ? 'desc' : 'asc' }];\n }\n } else {\n updated = [{ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' }];\n }\n } else {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n if (existing.direction === 'asc') {\n updated[index] = { ...existing, direction: 'desc' };\n } else {\n updated.splice(index, 1);\n }\n }\n } else {\n updated.push({ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' });\n }\n }\n return updated;\n });\n };\n\n const renderSortIcon = (col: ApexTableColumn<T>) => {\n if (col.sortable === false) return null;\n if (!col.selector && !col.sortFunction) return null;\n\n const sortIndex = sortConfig.findIndex(s => s.columnName === col.name);\n\n if (sortIndex === -1) {\n return (\n <span className=\"ms-1\" style={{ opacity: 0.3, fontSize: '11px', color: 'var(--dt-header-text)' }}>\n <i className=\"fas fa-sort\"></i>\n </span>\n );\n }\n\n const config = sortConfig[sortIndex];\n const isAsc = config ? config.direction === 'asc' : true;\n return (\n <span className=\"ms-1 d-flex align-items-center\" style={{ fontSize: '12px', color: '#0d6efd', fontWeight: 'bold' }}>\n <i className={isAsc ? \"fas fa-sort-up\" : \"fas fa-sort-down\"}></i>\n {sortConfig.length > 1 && (\n <small className=\"ms-1\" style={{ fontSize: '10px' }}>\n {sortIndex + 1}\n </small>\n )}\n </span>\n );\n };\n\n const processedColumns = filteredColumns.map((col) => {\n const {\n right,\n center: colCenter,\n compact,\n wrap,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n ...safeProps\n } = col;\n\n const isSticky = stickyColumns.includes(col.name);\n const canBeMadeSticky = isSticky || stickyColumns.length < 3;\n const center = right ? false : (colCenter !== false);\n const isSortableColumn = col.sortable !== false && (col.selector || col.sortFunction);\n\n return {\n ...safeProps,\n right,\n center,\n compact,\n wrap: wrap !== undefined ? wrap : true,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n sortable: false, \n name: (\n <div\n className=\"custom-header-wrapper\"\n onClick={(e) => {\n e.stopPropagation();\n if (isSortableColumn) handleColumnSort(col, e);\n }}\n style={{\n cursor: isSortableColumn ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n justifyContent: center ? 'center' : right ? 'flex-end' : 'flex-start',\n userSelect: \"none\"\n }}\n title={isSortableColumn ? \"Clic para ordenar. Shift+clic para ordenar por múltiples columnas\" : \"\"}\n >\n <label className=\"custom-checkbox-label\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n className=\"custom-checkbox-input\"\n checked={isSticky}\n disabled={!canBeMadeSticky}\n onChange={() => toggleStickyColumn(col.name)}\n />\n <span className=\"custom-checkbox-checkmark\">\n <i className=\"fas fa-thumbtack\"></i>\n </span>\n </label>\n <span className=\"custom-header-name\" style={{ marginLeft: '8px' }}>{col.name}</span>\n {isSortableColumn && renderSortIcon(col)}\n </div>\n ),\n };\n });\n\n const sortedData = useMemo(() => {\n if (sortConfig.length === 0) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n for (let i = 0; i < sortConfig.length; i++) {\n const config = sortConfig[i];\n if (!config) continue;\n \n const { selector, sortFunction, direction } = config;\n const dirMultiplier = direction === 'asc' ? 1 : -1;\n\n if (sortFunction) {\n const res = sortFunction(a, b);\n if (res !== 0) return res * dirMultiplier;\n continue;\n }\n\n if (!selector) continue;\n\n let valA = typeof selector === 'function' ? selector(a) : (a as any)[selector];\n let valB = typeof selector === 'function' ? selector(b) : (b as any)[selector];\n\n valA = valA ?? \"\";\n valB = valB ?? \"\";\n\n if (typeof valA === \"string\" && typeof valB === \"string\") {\n const comp = valA.localeCompare(valB, undefined, { numeric: true, sensitivity: 'base' });\n if (comp !== 0) return comp * dirMultiplier;\n } else if (typeof valA === \"number\" && typeof valB === \"number\") {\n if (valA !== valB) return (valA - valB) * dirMultiplier;\n } else {\n if (valA < valB) return -1 * dirMultiplier;\n if (valA > valB) return 1 * dirMultiplier;\n }\n }\n return 0;\n });\n }, [filteredData, sortConfig]);\n\n const customStyles = {\n headRow: {\n style: {\n backgroundColor: \"var(--dt-header-bg)\",\n borderBottom: \"2px solid var(--dt-border-color)\",\n fontWeight: \"600\",\n fontSize: \"14px\",\n color: \"var(--dt-header-text)\",\n minHeight: \"52px\",\n },\n },\n headCells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n rows: {\n style: {\n fontSize: \"13px\",\n color: \"var(--dt-row-text)\",\n backgroundColor: \"var(--dt-bg)\",\n minHeight: \"44px\",\n \"&:hover\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease\",\n color: \"var(--dt-row-text)\",\n },\n },\n stripedStyle: {\n backgroundColor: \"var(--dt-row-stripe-bg)\",\n color: \"var(--dt-row-text)\",\n },\n },\n cells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n pagination: {\n style: {\n borderTop: \"1px solid var(--dt-border-color)\",\n fontSize: \"13px\",\n minHeight: \"56px\",\n backgroundColor: \"var(--dt-bg)\",\n color: \"var(--dt-row-text)\",\n },\n pageButtonsStyle: {\n color: \"var(--dt-row-text)\",\n fill: \"var(--dt-row-text)\",\n \"&:disabled\": {\n color: \"var(--dt-disabled-text)\",\n fill: \"var(--dt-disabled-text)\",\n },\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n \"&:focus\": {\n outline: \"none\",\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n },\n },\n };\n\n const csvData = useMemo(() => {\n if (!datos || datos.length === 0 || !datos[0]) return [];\n\n const originalKeys = Object.keys(datos[0]);\n const validKeys: string[] = [];\n\n originalKeys.forEach(key => {\n if (['created_at', 'updated_at', 'deleted_at'].includes(key)) return;\n\n const firstValid = datos.find(row => row[key] !== null && row[key] !== undefined);\n if (firstValid) {\n const val = firstValid[key];\n if (typeof val === 'object' && !(val instanceof Date)) {\n return;\n }\n validKeys.push(key);\n } else {\n validKeys.push(key);\n }\n });\n\n const blankRow = validKeys.map(() => \"\");\n const headerRow = validKeys;\n const processed = datos.map(row => {\n return validKeys.map(key => {\n const val = row[key];\n return val !== null && val !== undefined ? val : \"\";\n });\n });\n\n return [blankRow, headerRow, ...processed];\n }, [datos]);\n\n return (\n <section className=\"apextable-wrapper\">\n <style>{dynamicStyles}</style>\n\n <div className=\"datatable-container\" ref={tableRef}>\n <div className=\"search-bar-container\" hidden={hiddenOptions}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"16px\" }}>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", justifyContent: \"space-between\", alignItems: \"center\", gap: \"16px\" }}>\n <div className=\"search-input-wrapper\">\n <i className=\"fas fa-search search-icon\"></i>\n <DebouncedInput\n value={filterValue}\n onChange={handleFilterChange}\n placeholder=\"Buscar en todos los campos...\"\n className=\"search-input\"\n />\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"12px\", flexWrap: \"wrap\" }}>\n <span className=\"stats-badge\">\n {filteredData.length} de {datos.length} registros\n </span>\n\n <div className=\"action-buttons\">\n <CSVLink\n data={csvData}\n filename={`export_${new Date().toISOString().split('T')[0]}.csv`}\n style={{ textDecoration: \"none\" }}\n >\n <button className=\"btn-action btn-csv\">\n <i className=\"fas fa-file-csv\" />\n <span>CSV</span>\n </button>\n </CSVLink>\n\n <button\n onClick={downloadPDF}\n className=\"btn-action btn-pdf\"\n disabled={isExporting}\n >\n <i className=\"fas fa-file-pdf\" />\n <span>\n {isExporting ? \"Exportando...\" : \"PDF\"}\n </span>\n </button>\n\n <button\n className=\"btn-action btn-columns\"\n onClick={() => setShowModal(true)}\n >\n <i className=\"fas fa-columns\" />\n <span>Columnas</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"sticky-info-label\">\n <i className=\"fas fa-info-circle\"></i>\n <span>\n Use la chincheta (<i className=\"fas fa-thumbtack\"></i>) para fijar hasta 3 columnas.\n </span>\n </div>\n\n <DataTableComponent\n columns={processedColumns as any}\n data={sortedData}\n pagination\n paginationPerPage={15}\n paginationRowsPerPageOptions={[5, 10, 15, 20, 25, 50]}\n striped\n highlightOnHover\n pointerOnHover\n responsive\n fixedHeader\n fixedHeaderScrollHeight=\"calc(100vh - 320px)\"\n onRowDoubleClicked={handleDoubleClick}\n customStyles={customStyles}\n expandableRows={expandableRows}\n expandableRowsComponent={expandableRowsComponent as any}\n expandableRowExpanded={expandableRowExpanded as any}\n conditionalRowStyles={conditionalRowStyles}\n {...otherProps}\n noDataComponent={\n <div style={{ padding: \"40px\", textAlign: \"center\" as const, color: \"#6c757d\" }}>\n <i className=\"fas fa-inbox\" style={{ fontSize: \"48px\", marginBottom: \"16px\", opacity: 0.5 }} />\n <p style={{ margin: 0, fontSize: \"14px\" }}>No se encontraron registros</p>\n </div>\n }\n />\n </div>\n\n {/* Modal de Columnas */}\n {showModal && (\n <div className=\"modal-overlay\" onClick={() => setShowModal(false)}>\n <div className=\"modal-content-custom\" onClick={(e) => e.stopPropagation()}>\n <div className=\"modal-header-custom\">\n <h5 className=\"modal-title-custom\">\n <i className=\"fas fa-columns\" />\n Gestionar Columnas\n </h5>\n <button className=\"modal-close-btn\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-times\" />\n </button>\n </div>\n\n <div className=\"modal-body-custom\">\n <div className=\"column-actions\">\n <button className=\"btn-column-action\" onClick={selectAllColumns}>\n <i className=\"fas fa-check-double\" />\n Seleccionar Todo\n </button>\n <button className=\"btn-column-action\" onClick={deselectAllColumns}>\n <i className=\"fas fa-times\" />\n Deseleccionar Todo\n </button>\n </div>\n\n {columnas.map((col) => (\n <div key={col.name} className=\"column-checkbox-wrapper\">\n <label className=\"column-checkbox\">\n <input\n type=\"checkbox\"\n checked={visibleColumns.includes(col.name)}\n onChange={() => handleColumnVisibilityChange(col.name)}\n />\n <span style={{ marginLeft: '8px' }}>{col.name}</span>\n </label>\n </div>\n ))}\n </div>\n\n <div className=\"modal-footer-custom\">\n <button className=\"btn-modal btn-modal-light\" onClick={() => setShowModal(false)}>\n Cerrar\n </button>\n <button className=\"btn-modal btn-modal-primary\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-check\" />\n Aplicar\n </button>\n </div>\n </div>\n </div>\n )}\n </section>\n );\n};\n\nexport default ApexTable;\n","import React, { useState, useEffect } from \"react\";\n\ninterface DebouncedInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string | number;\n onChange: (value: string | number) => void;\n debounce?: number;\n}\n\nconst DebouncedInput: React.FC<DebouncedInputProps> = ({\n value: initialValue,\n onChange,\n debounce = 300,\n ...props\n}) => {\n const [value, setValue] = useState(initialValue);\n\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n onChange(value);\n }, debounce);\n\n return () => clearTimeout(timeout);\n }, [value, debounce, onChange]);\n\n return (\n <input\n {...props}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n );\n};\n\nexport default DebouncedInput;\n"],"mappings":"skBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,eAAAE,KAAA,eAAAC,GAAAH,ICCyB,SAARI,EAA6BC,EAAK,CAAE,SAAAC,CAAS,EAAI,CAAC,EAAG,CAC1D,GAAI,CAACD,GAAO,OAAO,SAAa,IAAa,OAE7C,IAAME,EAAO,SAAS,MAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC/DC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WAETF,IAAa,OACXC,EAAK,WACPA,EAAK,aAAaC,EAAOD,EAAK,UAAU,EAK1CA,EAAK,YAAYC,CAAK,EAGpBA,EAAM,WACRA,EAAM,WAAW,QAAUH,EAE3BG,EAAM,YAAY,SAAS,eAAeH,CAAG,CAAC,CAElD,CCvB8BI,EAAY;AAAA,CAAumN,ECA3pN,IAAAC,EAA4D,iBAC5DC,EAAsB,yCAEtBC,EAAwB,qBACxBC,EAAsB,iBACtBC,GAAsB,8BACtBC,GAAiB,0BCNjB,IAAAC,EAA2C,iBA6BvCC,EAAA,6BArBEC,GAAgD,CAAC,CACrD,MAAOC,EACP,SAAAC,EACA,SAAAC,EAAW,IACX,GAAGC,CACL,IAAM,CACJ,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAASL,CAAY,EAE/C,sBAAU,IAAM,CACdK,EAASL,CAAY,CACvB,EAAG,CAACA,CAAY,CAAC,KAEjB,aAAU,IAAM,CACd,IAAMM,EAAU,WAAW,IAAM,CAC/BL,EAASG,CAAK,CAChB,EAAGF,CAAQ,EAEX,MAAO,IAAM,aAAaI,CAAO,CACnC,EAAG,CAACF,EAAOF,EAAUD,CAAQ,CAAC,KAG5B,OAAC,SACE,GAAGE,EACJ,MAAOC,EACP,SAAWG,GAAMF,EAASE,EAAE,OAAO,KAAK,EAC1C,CAEJ,EAEOC,EAAQT,GD4WK,IAAAU,EAAA,6BAxYdC,GAA2B,EAAAC,SAAmB,SAAW,EAAAA,QAuCzDC,GAAY,CAAgC,CAC9C,MAAAC,EAAQ,CAAC,EACT,SAAAC,EAAW,CAAC,EACZ,cAAAC,EAAgB,GAChB,eAAAC,EAAiB,GACjB,wBAAAC,EACA,sBAAAC,EACA,qBAAAC,EAAuB,CAAC,EACxB,cAAAC,EAAgB,YAChB,GAAGC,EACP,IAAyB,CAGrB,IAAMC,KAAa,WAAQ,IAAM,CAC7B,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAMC,EAAO,OAAO,SAAS,SACvBC,EAAWV,EAAS,IAAIW,GAAKA,EAAE,IAAI,EAAE,KAAK,GAAG,EAC/CC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIH,EAAS,OAAQG,IAAK,CACtC,IAAMC,EAAOJ,EAAS,WAAWG,CAAC,EAClCD,GAASA,GAAQ,GAAKA,EAAQE,EAC9BF,GAAQ,CACZ,CACA,MAAO,GAAGN,CAAa,IAAIG,CAAI,IAAIG,CAAI,EAC3C,EAAG,CAACZ,EAAUM,CAAa,CAAC,EAEtB,CAACS,EAAaC,CAAc,KAAI,YAAiB,IAC/C,OAAO,OAAW,IAAoB,GAC5B,aAAa,QAAQ,GAAGR,CAAU,SAAS,GACzC,EACnB,EAEK,CAACS,EAAcC,CAAe,KAAI,YAAcnB,CAAK,EAErD,CAACoB,EAAgBC,CAAiB,KAAI,YAAmB,IAAM,CACjE,IAAMC,EAAWrB,EAAS,IAAKsB,GAAQA,EAAI,IAAI,EAC/C,GAAI,OAAO,OAAW,IAAa,OAAOD,EAC1C,IAAME,EAAQ,aAAa,QAAQ,GAAGf,CAAU,UAAU,EAC1D,GAAI,CAACe,EAAO,OAAOF,EAEnB,GAAI,CACA,IAAMG,EAAS,KAAK,MAAMD,CAAK,EACzBE,EAAaJ,EAAS,OAAOK,GAAQ,CAACF,EAAO,SAASE,CAAI,CAAC,EACjE,MAAO,CAAC,GAAGF,EAAQ,GAAGC,CAAU,CACpC,MAAY,CACR,OAAOJ,CACX,CACJ,CAAC,EAEK,CAACM,GAAWC,CAAY,KAAI,YAAS,EAAK,EAC1C,CAACC,EAAaC,CAAc,KAAI,YAAS,EAAK,EAE9C,CAACC,EAAeC,CAAgB,KAAI,YAAmB,IAAM,CAC/D,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,IAAMT,EAAQ,aAAa,QAAQ,GAAGf,CAAU,SAAS,EACzD,OAAOe,EAAQ,KAAK,MAAMA,CAAK,EAAI,CAAC,CACxC,CAAC,EAEK,CAACU,EAAcC,EAAe,KAAI,YAAiC,CAAC,CAAC,EACrE,CAACC,EAAYC,CAAa,KAAI,YAAuB,IAAM,CAC7D,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,IAAMb,EAAQ,aAAa,QAAQ,GAAGf,CAAU,OAAO,EACvD,OAAOe,EAAQ,KAAK,MAAMA,CAAK,EAAI,CAAC,CACxC,CAAC,EAEKc,KAAW,UAAuB,IAAI,KAG5C,aAAU,IAAM,CACR7B,GACA,aAAa,QAAQ,GAAGA,CAAU,WAAY,KAAK,UAAUW,CAAc,CAAC,CAEpF,EAAG,CAACA,EAAgBX,CAAU,CAAC,KAE/B,aAAU,IAAM,CACRA,GACA,aAAa,QAAQ,GAAGA,CAAU,UAAW,KAAK,UAAUuB,CAAa,CAAC,CAElF,EAAG,CAACA,EAAevB,CAAU,CAAC,KAE9B,aAAU,IAAM,CACRA,GACA,aAAa,QAAQ,GAAGA,CAAU,UAAWO,CAAW,CAEhE,EAAG,CAACA,EAAaP,CAAU,CAAC,KAE5B,aAAU,IAAM,CACRA,GACA,aAAa,QAAQ,GAAGA,CAAU,QAAS,KAAK,UAAU2B,CAAU,CAAC,CAE7E,EAAG,CAACA,EAAY3B,CAAU,CAAC,KAG3B,aAAU,IAAM,CACZ,GAAI,CAACA,EAAY,OAEjB,IAAM8B,EAAe,aAAa,QAAQ,GAAG9B,CAAU,UAAU,EAC3Da,EAAWrB,EAAS,IAAIsB,GAAOA,EAAI,IAAI,EAC7C,GAAIgB,EACA,GAAI,CACA,IAAMd,EAAS,KAAK,MAAMc,CAAY,EAChCb,EAAaJ,EAAS,OAAOK,GAAQ,CAACF,EAAO,SAASE,CAAI,CAAC,EACjEN,EAAkB,CAAC,GAAGI,EAAQ,GAAGC,CAAU,CAAC,CAChD,MAAY,CACRL,EAAkBC,CAAQ,CAC9B,MAECD,EAAkBC,CAAQ,EAE/B,IAAMkB,EAAc,aAAa,QAAQ,GAAG/B,CAAU,SAAS,EAC9CwB,EAAbO,EAA8B,KAAK,MAAMA,CAAW,EAClC,CAAC,CADkC,EAGzD,IAAMC,EAAY,aAAa,QAAQ,GAAGhC,CAAU,OAAO,EAC5C4B,EAAXI,EAAyB,KAAK,MAAMA,CAAS,EAC9B,CAAC,CAD8B,EAGlD,IAAMC,EAAc,aAAa,QAAQ,GAAGjC,CAAU,SAAS,EAC/DQ,EAAeyB,GAAe,EAAE,CACpC,EAAG,CAACjC,CAAU,CAAC,EAEf,IAAMkC,GAAsBC,GAAiC,CACzD,IAAMC,EAAM,OAAOD,CAAW,EAG9B,GAFA3B,EAAe4B,CAAG,EAEd,CAACA,GAAOA,EAAI,SAAW,EAAG,CAC1B1B,EAAgBnB,CAAK,EACrB,MACJ,CAEA,IAAM8C,EAAcD,EAAI,YAAY,EAE9BE,EAAW/C,EAAM,OAAQgD,GAC3B,OAAO,OAAOA,CAAG,EAAE,KAAMC,GACjBA,GAAU,KAAoC,GAC3C,OAAOA,CAAK,EAAE,YAAY,EAAE,SAASH,CAAW,CAC1D,CACL,EAEA3B,EAAgB4B,CAAQ,CAC5B,EAEMG,GAAqBF,GAAW,CAClC,GAAAG,QAAK,KAAK,CACN,MAAO,qBACP,KAAM,2HAA2H,KAAK,UAAUH,EAAK,KAAM,CAAC,CAAC,SAC7J,MAAO,QACP,mBAAoB,SACxB,CAAC,CACL,KAEA,aAAU,IAAM,CACZ7B,EAAgBnB,CAAK,CACzB,EAAG,CAACA,CAAK,CAAC,EAEV,IAAMoD,GAAc,IAAM,CACtBrB,EAAe,EAAI,EACnB,WAAW,IAAM,CACb,IAAMsB,EAAM,IAAI,QACVC,EAAcrD,EACf,OAAQsB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EACjD,IAAKA,GAAQA,EAAI,IAAI,EAEpBgC,EAAYvD,EAAM,IAAKgD,GAClB/C,EACF,OAAQsB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EACjD,IAAKA,GAAQ,CACV,IAAI0B,EACJ,OAAI,OAAO1B,EAAI,UAAa,WACxB0B,EAAQ1B,EAAI,SAASyB,CAAG,EAGxBC,EAASD,EAAYzB,EAAI,QAAe,EAIpC0B,GAAU,MACV,OAAOA,GAAU,SACf,KAAK,UAAUA,CAAK,EACpBA,GAAS,EAEvB,CAAC,CACR,KAED,GAAAO,SAAUH,EAAK,CACX,KAAM,CAACC,CAAW,EAClB,KAAMC,EACN,OAAQ,GACR,MAAO,OACP,OAAQ,CACJ,OAAQ,SACZ,CACJ,CAAC,EACDF,EAAI,KAAK,UAAU,EACnBtB,EAAe,EAAK,CACxB,EAAG,GAAG,CACV,EAEM0B,GAAgCC,GAAuB,CACzDrC,EAAmBsC,GACfA,EAAmB,SAASD,CAAU,EAChCC,EAAmB,OAAQhC,GAASA,IAAS+B,CAAU,EACvD,CAAC,GAAGC,EAAoBD,CAAU,CAC5C,CACJ,EAEME,GAAmB,IAAM,CAC3BvC,EAAkBpB,EAAS,IAAKsB,GAAQA,EAAI,IAAI,CAAC,CACrD,EAEMsC,GAAqB,IAAM,CAC7BxC,EAAkB,CAAC,CAAC,CACxB,EAEMyC,KAAkB,WACpB,IAAM7D,EAAS,OAAQsB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EAChE,CAACtB,EAAUmB,CAAc,CAC7B,EAEM2C,KAAuB,WACzB,IAAMD,EAAgB,OAAQvC,GAAQS,EAAc,SAAST,EAAI,IAAI,CAAC,EACtE,CAACuC,EAAiB9B,CAAa,CACnC,EAEMgC,GAAsBrC,GAAiB,CACzCM,EAAkBgC,GACGA,EAAK,SAAStC,CAAI,EAExBsC,EAAK,OAAQC,GAAYA,IAAYvC,CAAI,EAE5CsC,EAAK,OAAS,EACP,CAAC,GAAGA,EAAMtC,CAAI,EAElBsC,CAEd,CACL,KAEA,aAAU,IAAM,CACZ,GAAI,CAAC3B,EAAS,QAAS,OAEvB,IAAM6B,EAAW7B,EAAS,QAAQ,cAAc,eAAe,EAC/D,GAAI,CAAC6B,EAAU,OAEf,IAAMC,EAAWD,EAAS,iBAAiB,gBAAgB,EAC3D,GAAI,CAACC,EAAS,OAAQ,OAEtB,IAAMC,EAAoC,CAAC,EAE3CP,EAAgB,QAAQ,CAACvC,EAAK+C,IAAU,CACpC,GAAIF,EAASE,CAAK,EAAG,CACjB,IAAMC,EAAQH,EAASE,CAAK,EAAE,sBAAsB,EAAE,MACtDD,EAAU9C,EAAI,IAAI,EAAIgD,CAC1B,CACJ,CAAC,EAED,IAAMC,EAAU,OAAO,KAAKtC,CAAY,EAClCuC,EAAU,OAAO,KAAKJ,CAAS,EAElBG,EAAQ,SAAWC,EAAQ,QAG1CA,EAAQ,MAAOC,GAAQxC,EAAawC,CAAG,IAAML,EAAUK,CAAG,CAAC,GAG3DvC,GAAgBkC,CAAS,CAEjC,EAAG,CAACP,EAAiB5B,EAAchB,EAAa,MAAM,CAAC,EAEvD,IAAMyD,KAAgB,WAAQ,IAAM,CAChC,IAAMC,EAAkC,CAAC,EACrCC,EAAgB,EAEpB,OAAAd,EAAqB,QAASxC,GAAQ,CAClCqD,EAAQrD,EAAI,IAAI,EAAIsD,EACpBA,GAAiB3C,EAAaX,EAAI,IAAI,GAAK,CAC/C,CAAC,EAEMqD,CACX,EAAG,CAACb,EAAsB7B,CAAY,CAAC,EAEjC4C,MAAgB,WAAQ,IACnBf,EACF,IAAI,CAACxC,EAAKwD,IAAe,CACtB,IAAMT,EAAQR,EAAgB,UAAWlD,GAAMA,EAAE,OAASW,EAAI,IAAI,EAC5DyD,EAASL,EAAcpD,EAAI,IAAI,EAErC,GAAI+C,IAAU,IAAMU,IAAW,OAAW,MAAO,GAEjD,IAAMC,EAAQ,GAAKF,EAEnB,MAAO;AAAA,8CACuBT,EAAQ,CAAC;AAAA,+CACRA,EAAQ,CAAC;AAAA;AAAA,gCAExBU,CAAM;AAAA,mCACHC,CAAK;AAAA;AAAA;AAAA;AAAA,8CAIMX,EAAQ,CAAC;AAAA,mCACpBW,EAAQ,CAAC;AAAA;AAAA,iBAGhC,CAAC,EACA,KAAK,EAAE,EACb,CAAClB,EAAsBY,EAAeb,CAAe,CAAC,EAEnDoB,GAAmB,CAAC3D,EAAyB4D,IAAwB,CAEvE,GADI5D,EAAI,WAAa,IACjB,CAACA,EAAI,UAAY,CAACA,EAAI,cAAgB,CAACA,EAAI,KAAM,OAErD,IAAM6D,EAAUD,EAAE,SAClB9C,EAAc4B,GAAQ,CAClB,IAAMK,EAAQL,EAAK,UAAUoB,GAAKA,EAAE,aAAe9D,EAAI,IAAI,EACvD+D,EAAU,CAAC,GAAGrB,CAAI,EAEtB,GAAKmB,EAUD,GAAId,GAAS,EAAG,CACZ,IAAMiB,EAAWtB,EAAKK,CAAK,EACvBiB,IACEA,EAAS,YAAc,MACvBD,EAAQhB,CAAK,EAAI,CAAE,GAAGiB,EAAU,UAAW,MAAO,EAElDD,EAAQ,OAAOhB,EAAO,CAAC,EAGjC,MACIgB,EAAQ,KAAK,CAAE,WAAY/D,EAAI,KAAM,SAAUA,EAAI,SAAU,aAAcA,EAAI,aAAc,UAAW,KAAM,CAAC,UAnB/G+C,GAAS,EAAG,CACZ,IAAMiB,EAAWtB,EAAKK,CAAK,EACvBiB,IACFD,EAAU,CAAC,CAAE,GAAGC,EAAU,UAAWA,EAAS,YAAc,MAAQ,OAAS,KAAM,CAAC,EAE1F,MACID,EAAU,CAAC,CAAE,WAAY/D,EAAI,KAAM,SAAUA,EAAI,SAAU,aAAcA,EAAI,aAAc,UAAW,KAAM,CAAC,EAgBrH,OAAO+D,CACX,CAAC,CACL,EAEME,GAAkBjE,GAA4B,CAEhD,GADIA,EAAI,WAAa,IACjB,CAACA,EAAI,UAAY,CAACA,EAAI,aAAc,OAAO,KAE/C,IAAMkE,EAAYrD,EAAW,UAAUiD,GAAKA,EAAE,aAAe9D,EAAI,IAAI,EAErE,GAAIkE,IAAc,GACd,SACI,OAAC,QAAK,UAAU,OAAO,MAAO,CAAE,QAAS,GAAK,SAAU,OAAQ,MAAO,uBAAwB,EAC3F,mBAAC,KAAE,UAAU,cAAc,EAC/B,EAIR,IAAMC,EAAStD,EAAWqD,CAAS,EAC7BE,EAAQD,EAASA,EAAO,YAAc,MAAQ,GACpD,SACI,QAAC,QAAK,UAAU,iCAAiC,MAAO,CAAE,SAAU,OAAQ,MAAO,UAAW,WAAY,MAAO,EAC7G,oBAAC,KAAE,UAAWC,EAAQ,iBAAmB,mBAAoB,EAC5DvD,EAAW,OAAS,MACjB,OAAC,SAAM,UAAU,OAAO,MAAO,CAAE,SAAU,MAAO,EAC7C,SAAAqD,EAAY,EACjB,GAER,CAER,EAEMG,GAAmB9B,EAAgB,IAAKvC,GAAQ,CAClD,GAAM,CACF,MAAAsE,EACA,OAAQC,EACR,QAAAC,EACA,KAAAC,EACA,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAA5B,EACA,QAAA6B,EACA,GAAGC,CACP,EAAI9E,EAEE+E,EAAWtE,EAAc,SAAST,EAAI,IAAI,EAC1CgF,GAAkBD,GAAYtE,EAAc,OAAS,EACrDwE,EAASX,EAAQ,GAASC,IAAc,GACxCW,EAAmBlF,EAAI,WAAa,KAAUA,EAAI,UAAYA,EAAI,cAExE,MAAO,CACH,GAAG8E,EACH,MAAAR,EACA,OAAAW,EACA,QAAAT,EACA,KAAMC,IAAS,OAAYA,EAAO,GAClC,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAA5B,EACA,QAAA6B,EACA,SAAU,GACV,QACI,QAAC,OACG,UAAU,wBACV,QAAUjB,GAAM,CACZA,EAAE,gBAAgB,EACdsB,GAAkBvB,GAAiB3D,EAAK4D,CAAC,CACjD,EACA,MAAO,CACH,OAAQsB,EAAmB,UAAY,UACvC,QAAS,OACT,WAAY,SACZ,MAAO,OACP,eAAgBD,EAAS,SAAWX,EAAQ,WAAa,aACzD,WAAY,MAChB,EACA,MAAOY,EAAmB,uEAAsE,GAEhG,qBAAC,SAAM,UAAU,wBAAwB,QAAUtB,GAAMA,EAAE,gBAAgB,EACvE,oBAAC,SACG,KAAK,WACL,UAAU,wBACV,QAASmB,EACT,SAAU,CAACC,GACX,SAAU,IAAMvC,GAAmBzC,EAAI,IAAI,EAC/C,KACA,OAAC,QAAK,UAAU,4BACZ,mBAAC,KAAE,UAAU,mBAAmB,EACpC,GACJ,KACA,OAAC,QAAK,UAAU,qBAAqB,MAAO,CAAE,WAAY,KAAM,EAAI,SAAAA,EAAI,KAAK,EAC5EkF,GAAoBjB,GAAejE,CAAG,GAC3C,CAER,CACJ,CAAC,EAEKmF,MAAa,WAAQ,IACnBtE,EAAW,SAAW,EAAUlB,EAE7B,CAAC,GAAGA,CAAY,EAAE,KAAK,CAACyF,EAAGC,IAAM,CACpC,QAAS9F,EAAI,EAAGA,EAAIsB,EAAW,OAAQtB,IAAK,CACxC,IAAM4E,EAAStD,EAAWtB,CAAC,EAC3B,GAAI,CAAC4E,EAAQ,SAEb,GAAM,CAAE,SAAAmB,EAAU,aAAAC,EAAc,UAAAC,CAAU,EAAIrB,EACxCsB,EAAgBD,IAAc,MAAQ,EAAI,GAEhD,GAAID,EAAc,CACd,IAAMG,EAAMH,EAAaH,EAAGC,CAAC,EAC7B,GAAIK,IAAQ,EAAG,OAAOA,EAAMD,EAC5B,QACJ,CAEA,GAAI,CAACH,EAAU,SAEf,IAAIK,EAAO,OAAOL,GAAa,WAAaA,EAASF,CAAC,EAAKA,EAAUE,CAAQ,EACzEM,EAAO,OAAON,GAAa,WAAaA,EAASD,CAAC,EAAKA,EAAUC,CAAQ,EAK7E,GAHAK,EAAOA,GAAQ,GACfC,EAAOA,GAAQ,GAEX,OAAOD,GAAS,UAAY,OAAOC,GAAS,SAAU,CACtD,IAAMC,EAAOF,EAAK,cAAcC,EAAM,OAAW,CAAE,QAAS,GAAM,YAAa,MAAO,CAAC,EACvF,GAAIC,IAAS,EAAG,OAAOA,EAAOJ,CAClC,SAAW,OAAOE,GAAS,UAAY,OAAOC,GAAS,UACnD,GAAID,IAASC,EAAM,OAAQD,EAAOC,GAAQH,MACvC,CACH,GAAIE,EAAOC,EAAM,MAAO,GAAKH,EAC7B,GAAIE,EAAOC,EAAM,MAAO,GAAIH,CAChC,CACJ,CACA,MAAO,EACX,CAAC,EACF,CAAC9F,EAAckB,CAAU,CAAC,EAEvBiF,GAAe,CACjB,QAAS,CACL,MAAO,CACH,gBAAiB,sBACjB,aAAc,mCACd,WAAY,MACZ,SAAU,OACV,MAAO,wBACP,UAAW,MACf,CACJ,EACA,UAAW,CACP,MAAO,CACH,YAAa,OACb,aAAc,OACd,eAAgB,SAChB,UAAW,QACf,CACJ,EACA,KAAM,CACF,MAAO,CACH,SAAU,OACV,MAAO,qBACP,gBAAiB,eACjB,UAAW,OACX,UAAW,CACP,gBAAiB,yBACjB,OAAQ,UACR,WAAY,6BACZ,MAAO,oBACX,CACJ,EACA,aAAc,CACV,gBAAiB,0BACjB,MAAO,oBACX,CACJ,EACA,MAAO,CACH,MAAO,CACH,YAAa,OACb,aAAc,OACd,eAAgB,SAChB,UAAW,QACf,CACJ,EACA,WAAY,CACR,MAAO,CACH,UAAW,mCACX,SAAU,OACV,UAAW,OACX,gBAAiB,eACjB,MAAO,oBACX,EACA,iBAAkB,CACd,MAAO,qBACP,KAAM,qBACN,aAAc,CACV,MAAO,0BACP,KAAM,yBACV,EACA,yBAA0B,CACtB,gBAAiB,wBACrB,EACA,UAAW,CACP,QAAS,OACT,gBAAiB,wBACrB,CACJ,CACJ,CACJ,EAEMC,MAAU,WAAQ,IAAM,CAC1B,GAAI,CAACtH,GAASA,EAAM,SAAW,GAAK,CAACA,EAAM,CAAC,EAAG,MAAO,CAAC,EAEvD,IAAMuH,EAAe,OAAO,KAAKvH,EAAM,CAAC,CAAC,EACnCwH,EAAsB,CAAC,EAE7BD,EAAa,QAAQ7C,GAAO,CACxB,GAAI,CAAC,aAAc,aAAc,YAAY,EAAE,SAASA,CAAG,EAAG,OAE9D,IAAM+C,EAAazH,EAAM,KAAKgD,GAAOA,EAAI0B,CAAG,IAAM,MAAQ1B,EAAI0B,CAAG,IAAM,MAAS,EAChF,GAAI+C,EAAY,CACZ,IAAM5E,EAAM4E,EAAW/C,CAAG,EAC1B,GAAI,OAAO7B,GAAQ,UAAY,EAAEA,aAAe,MAC5C,OAEJ2E,EAAU,KAAK9C,CAAG,CACtB,MACI8C,EAAU,KAAK9C,CAAG,CAE1B,CAAC,EAED,IAAMgD,EAAWF,EAAU,IAAI,IAAM,EAAE,EACjCG,EAAYH,EACZI,EAAY5H,EAAM,IAAIgD,GACjBwE,EAAU,IAAI9C,GAAO,CACxB,IAAM7B,EAAMG,EAAI0B,CAAG,EACnB,OAAO7B,GAA0C,EACrD,CAAC,CACJ,EAED,MAAO,CAAC6E,EAAUC,EAAW,GAAGC,CAAS,CAC7C,EAAG,CAAC5H,CAAK,CAAC,EAEV,SACI,QAAC,WAAQ,UAAU,oBACf,oBAAC,SAAO,SAAA8E,GAAc,KAEtB,QAAC,OAAI,UAAU,sBAAsB,IAAKxC,EACtC,oBAAC,OAAI,UAAU,uBAAuB,OAAQpC,EAC1C,mBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,EAChE,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,eAAgB,gBAAiB,WAAY,SAAU,IAAK,MAAO,EAChH,qBAAC,OAAI,UAAU,uBACX,oBAAC,KAAE,UAAU,4BAA4B,KACzC,OAAC2H,EAAA,CACG,MAAO7G,EACP,SAAU2B,GACV,YAAY,gCACZ,UAAU,eACd,GACJ,KAEA,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,OAAQ,SAAU,MAAO,EAC/E,qBAAC,QAAK,UAAU,cACX,UAAAzB,EAAa,OAAO,OAAKlB,EAAM,OAAO,cAC3C,KAEA,QAAC,OAAI,UAAU,iBACX,oBAAC,WACG,KAAMsH,GACN,SAAU,UAAU,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,OAC1D,MAAO,CAAE,eAAgB,MAAO,EAEhC,oBAAC,UAAO,UAAU,qBACd,oBAAC,KAAE,UAAU,kBAAkB,KAC/B,OAAC,QAAK,eAAG,GACb,EACJ,KAEA,QAAC,UACG,QAASlE,GACT,UAAU,qBACV,SAAUtB,EAEV,oBAAC,KAAE,UAAU,kBAAkB,KAC/B,OAAC,QACI,SAAAA,EAAc,gBAAkB,MACrC,GACJ,KAEA,QAAC,UACG,UAAU,yBACV,QAAS,IAAMD,EAAa,EAAI,EAEhC,oBAAC,KAAE,UAAU,iBAAiB,KAC9B,OAAC,QAAK,oBAAQ,GAClB,GACJ,GACJ,GACJ,EACJ,EACJ,KAEA,QAAC,OAAI,UAAU,oBACX,oBAAC,KAAE,UAAU,qBAAqB,KAClC,QAAC,QAAK,kCACgB,OAAC,KAAE,UAAU,mBAAmB,EAAI,kCAC1D,GACJ,KAEA,OAAChC,GAAA,CACG,QAAS+F,GACT,KAAMc,GACN,WAAU,GACV,kBAAmB,GACnB,6BAA8B,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EACpD,QAAO,GACP,iBAAgB,GAChB,eAAc,GACd,WAAU,GACV,YAAW,GACX,wBAAwB,sBACxB,mBAAoBxD,GACpB,aAAcmE,GACd,eAAgBlH,EAChB,wBAAyBC,EACzB,sBAAuBC,EACvB,qBAAsBC,EACrB,GAAGE,GACJ,mBACI,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,UAAW,SAAmB,MAAO,SAAU,EAC1E,oBAAC,KAAE,UAAU,eAAe,MAAO,CAAE,SAAU,OAAQ,aAAc,OAAQ,QAAS,EAAI,EAAG,KAC7F,OAAC,KAAE,MAAO,CAAE,OAAQ,EAAG,SAAU,MAAO,EAAG,uCAA2B,GAC1E,EAER,GACJ,EAGCoB,OACG,OAAC,OAAI,UAAU,gBAAgB,QAAS,IAAMC,EAAa,EAAK,EAC5D,oBAAC,OAAI,UAAU,uBAAuB,QAAU,GAAM,EAAE,gBAAgB,EACpE,qBAAC,OAAI,UAAU,sBACX,qBAAC,MAAG,UAAU,qBACV,oBAAC,KAAE,UAAU,iBAAiB,EAAE,sBAEpC,KACA,OAAC,UAAO,UAAU,kBAAkB,QAAS,IAAMA,EAAa,EAAK,EACjE,mBAAC,KAAE,UAAU,eAAe,EAChC,GACJ,KAEA,QAAC,OAAI,UAAU,oBACX,qBAAC,OAAI,UAAU,iBACX,qBAAC,UAAO,UAAU,oBAAoB,QAAS+B,GAC3C,oBAAC,KAAE,UAAU,sBAAsB,EAAE,oBAEzC,KACA,QAAC,UAAO,UAAU,oBAAoB,QAASC,GAC3C,oBAAC,KAAE,UAAU,eAAe,EAAE,sBAElC,GACJ,EAEC5D,EAAS,IAAKsB,MACX,OAAC,OAAmB,UAAU,0BAC1B,oBAAC,SAAM,UAAU,kBACb,oBAAC,SACG,KAAK,WACL,QAASH,EAAe,SAASG,EAAI,IAAI,EACzC,SAAU,IAAMkC,GAA6BlC,EAAI,IAAI,EACzD,KACA,OAAC,QAAK,MAAO,CAAE,WAAY,KAAM,EAAI,SAAAA,EAAI,KAAK,GAClD,GARMA,EAAI,IASd,CACH,GACL,KAEA,QAAC,OAAI,UAAU,sBACX,oBAAC,UAAO,UAAU,4BAA4B,QAAS,IAAMM,EAAa,EAAK,EAAG,kBAElF,KACA,QAAC,UAAO,UAAU,8BAA8B,QAAS,IAAMA,EAAa,EAAK,EAC7E,oBAAC,KAAE,UAAU,eAAe,EAAE,WAElC,GACJ,GACJ,EACJ,GAER,CAER,EAEOiG,GAAQ/H","names":["index_exports","__export","ApexTable_default","__toCommonJS","styleInject","css","insertAt","head","style","styleInject","import_react","import_react_data_table_component","import_react_csv","import_jspdf","import_jspdf_autotable","import_sweetalert2","import_react","import_jsx_runtime","DebouncedInput","initialValue","onChange","debounce","props","value","setValue","timeout","e","DebouncedInput_default","import_jsx_runtime","DataTableComponent","DataTable","ApexTable","datos","columnas","hiddenOptions","expandableRows","expandableRowsComponent","expandableRowExpanded","conditionalRowStyles","storagePrefix","otherProps","storageKey","path","colNames","c","hash","i","char","filterValue","setFilterValue","filteredData","setFilteredData","visibleColumns","setVisibleColumns","allNames","col","saved","parsed","newColumns","name","showModal","setShowModal","isExporting","setIsExporting","stickyColumns","setStickyColumns","columnWidths","setColumnWidths","sortConfig","setSortConfig","tableRef","savedVisible","savedSticky","savedSort","savedFilter","handleFilterChange","searchValue","val","searchLower","filtered","row","value","handleDoubleClick","Swal","downloadPDF","doc","tableColumn","tableRows","autoTable","handleColumnVisibilityChange","columnName","prevVisibleColumns","selectAllColumns","deselectAllColumns","filteredColumns","orderedStickyColumns","toggleStickyColumn","prev","colName","firstRow","rowCells","newWidths","index","width","oldKeys","newKeys","key","stickyOffsets","offsets","currentOffset","dynamicStyles","orderIndex","offset","zBase","handleColumnSort","e","isShift","s","updated","existing","renderSortIcon","sortIndex","config","isAsc","processedColumns","right","colCenter","compact","wrap","grow","maxWidth","minWidth","reorder","safeProps","isSticky","canBeMadeSticky","center","isSortableColumn","sortedData","a","b","selector","sortFunction","direction","dirMultiplier","res","valA","valB","comp","customStyles","csvData","originalKeys","validKeys","firstValid","blankRow","headerRow","processed","DebouncedInput_default","ApexTable_default"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function H(c,{insertAt:f}={}){if(!c||typeof document>"u")return;let g=document.head||document.getElementsByTagName("head")[0],b=document.createElement("style");b.type="text/css",f==="top"&&g.firstChild?g.insertBefore(b,g.firstChild):g.appendChild(b),b.styleSheet?b.styleSheet.cssText=c:b.appendChild(document.createTextNode(c))}H(`:root{--dt-bg: #ffffff;--dt-header-bg: #f8f9fa;--dt-header-text: #495057;--dt-row-text: #212529;--dt-row-hover-bg: #f1f3f5;--dt-row-stripe-bg: #f8f9fa;--dt-border-color: #dee2e6;--dt-disabled-text: #adb5bd;--dt-input-bg: #ffffff;--dt-input-border: #ced4da;--dt-input-text: #495057;--dt-badge-bg: #e7f5ff;--dt-badge-text: #0d6efd;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .1)}html.dark{--dt-bg: #1e293b;--dt-header-bg: #0f172a;--dt-header-text: #e2e8f0;--dt-row-text: #f1f5f9;--dt-row-hover-bg: #334155;--dt-row-stripe-bg: #1e293b;--dt-border-color: #334155;--dt-disabled-text: #64748b;--dt-input-bg: #1e293b;--dt-input-border: #334155;--dt-input-text: #f1f5f9;--dt-badge-bg: #1e293b;--dt-badge-text: #60a5fa;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .5)}.rdt_Table{background:transparent!important}.datatable-container{background:var(--dt-bg);border-radius:1.5rem;box-shadow:var(--dt-shadow);padding:1.5rem;overflow:auto!important;color:var(--dt-row-text);transition:all .2s ease}.rdt_TableHeadRow{background-color:var(--dt-header-bg)!important;border-bottom:2px solid var(--dt-border-color)!important}html.dark .rdt_TableRow{background-color:#1e293b}html.dark .datatable-container{background-color:#1e293b!important;color:#f1f5f9!important}.rdt_TableCell{word-break:normal!important;overflow-wrap:normal!important;white-space:normal!important}.rdt_TableCell .inline-flex,.rdt_TableCell button,.rdt_TableCell a{white-space:nowrap!important}.sticky-info-label{font-size:12px;color:var(--dt-header-text);margin-bottom:12px;display:flex;align-items:center;gap:6px}.custom-header-wrapper{display:flex;align-items:center;gap:8px}.custom-checkbox-label{position:relative;cursor:pointer;width:18px;height:18px}.custom-checkbox-input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.custom-checkbox-checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:var(--dt-input-border);border-radius:4px;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--dt-disabled-text)}.custom-checkbox-label:hover .custom-checkbox-checkmark{background-color:var(--dt-border-color)}.custom-checkbox-input:checked~.custom-checkbox-checkmark{background-color:#0d6efd;color:#fff}.custom-checkbox-input:disabled~.custom-checkbox-checkmark{background-color:var(--dt-header-bg);cursor:not-allowed;opacity:.7}.custom-checkbox-checkmark .fa-thumbtack{font-size:10px;transition:transform .2s ease}.custom-checkbox-input:checked~.custom-checkbox-checkmark .fa-thumbtack{transform:rotate(45deg)}.search-bar-container{background:var(--dt-header-bg);border-radius:8px;padding:16px;margin-bottom:20px;border:1px solid var(--dt-border-color)}.search-input-wrapper{position:relative;flex:1;max-width:400px}.search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dt-header-text);pointer-events:none}.search-input{padding-left:40px!important;border:1px solid var(--dt-input-border);border-radius:6px;padding:10px 12px;font-size:14px;width:100%;transition:all .2s ease;background-color:var(--dt-input-bg);color:var(--dt-input-text)}.search-input:focus{outline:none;border-color:#0d6efd;box-shadow:0 0 0 3px #0d6efd1a}.action-buttons{display:flex;gap:8px;flex-wrap:wrap}.btn-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;border-radius:6px;transition:all .2s ease;border:none;cursor:pointer}.btn-action:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.btn-csv{background-color:#198754;color:#fff}.btn-csv:hover{background-color:#157347}.btn-pdf{background-color:#dc3545;color:#fff}.btn-pdf:hover{background-color:#bb2d3b}.btn-columns{background-color:#0d6efd;color:#fff}.btn-columns:hover{background-color:#0b5ed7}.btn-action:disabled{opacity:.6;cursor:not-allowed;transform:none}.stats-badge{display:inline-flex;align-items:center;padding:4px 12px;background:var(--dt-badge-bg);color:var(--dt-badge-text);border-radius:20px;font-size:12px;font-weight:600}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;animation:dtp-fadeIn .2s ease}@keyframes dtp-fadeIn{0%{opacity:0}to{opacity:1}}.modal-content-custom{background:var(--dt-bg);color:var(--dt-row-text);border-radius:12px;box-shadow:var(--dt-shadow);width:90%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;animation:dtp-slideUp .3s ease;border:1px solid var(--dt-border-color)}@keyframes dtp-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.modal-header-custom{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:20px 24px;border-radius:12px 12px 0 0;display:flex;justify-content:space-between;align-items:center}.modal-title-custom{font-weight:600;font-size:18px;margin:0;display:flex;align-items:center;gap:8px}.modal-close-btn{background:#fff3;border:none;color:#fff;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.modal-close-btn:hover{background:#ffffff4d}.modal-body-custom{padding:24px;overflow-y:auto;flex:1}.modal-footer-custom{padding:16px 24px;border-top:1px solid var(--dt-border-color);display:flex;justify-content:flex-end;gap:8px}.column-actions{display:flex;gap:8px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--dt-border-color)}.btn-column-action{flex:1;padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid var(--dt-border-color);background:var(--dt-input-bg);color:var(--dt-row-text);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:4px}.btn-column-action:hover{background:var(--dt-row-hover-bg);border-color:#adb5bd}.column-checkbox-wrapper{padding:10px;border-radius:6px;transition:background-color .2s ease;display:flex;align-items:center}.column-checkbox-wrapper:hover{background-color:var(--dt-row-hover-bg)}.column-checkbox{display:flex;align-items:center;cursor:pointer;font-size:14px;user-select:none}.column-checkbox input{margin-right:8px;cursor:pointer}.btn-modal{padding:8px 16px;font-size:14px;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:6px}.btn-modal-light{background:var(--dt-header-bg);color:var(--dt-header-text)}.btn-modal-light:hover{background:var(--dt-row-hover-bg)}.btn-modal-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.btn-modal-primary:hover{box-shadow:0 4px 12px #667eea66}@media(max-width:768px){.search-bar-container{flex-direction:column;gap:12px}.search-input-wrapper{max-width:100%}.action-buttons{justify-content:stretch}.btn-action{flex:1;justify-content:center}.modal-content-custom{width:95%;margin:10px}}
|
|
2
|
-
`);import{useState as h,useEffect as k,useMemo as C,useRef as
|
|
2
|
+
`);import{useState as h,useEffect as k,useMemo as C,useRef as he}from"react";import G from"react-data-table-component";import{CSVLink as ye}from"react-csv";import{jsPDF as ve}from"jspdf";import we from"jspdf-autotable";import ke from"sweetalert2";import{useState as be,useEffect as U}from"react";import{jsx as xe}from"react/jsx-runtime";var ge=({value:c,onChange:f,debounce:g=300,...b})=>{let[T,j]=be(c);return U(()=>{j(c)},[c]),U(()=>{let R=setTimeout(()=>{f(T)},g);return()=>clearTimeout(R)},[T,g,f]),xe("input",{...b,value:T,onChange:R=>j(R.target.value)})},q=ge;import{jsx as s,jsxs as i}from"react/jsx-runtime";var Ce=G?.default||G,Se=({datos:c=[],columnas:f=[],hiddenOptions:g=!1,expandableRows:b=!1,expandableRowsComponent:T,expandableRowExpanded:j,conditionalRowStyles:R=[],storagePrefix:B="dt_config",...Q})=>{let d=C(()=>{if(typeof window>"u")return"";let e=window.location.pathname,t=f.map(r=>r.name).join(","),o=0;for(let r=0;r<t.length;r++){let a=t.charCodeAt(r);o=(o<<5)-o+a,o|=0}return`${B}_${e}_${o}`},[f,B]),[A,J]=h(()=>typeof window>"u"?"":localStorage.getItem(`${d}_filter`)||""),[I,F]=h(c),[y,S]=h(()=>{let e=f.map(o=>o.name);if(typeof window>"u")return e;let t=localStorage.getItem(`${d}_visible`);if(!t)return e;try{let o=JSON.parse(t),r=e.filter(a=>!o.includes(a));return[...o,...r]}catch{return e}}),[X,_]=h(!1),[W,V]=h(!1),[N,P]=h(()=>{if(typeof window>"u")return[];let e=localStorage.getItem(`${d}_sticky`);return e?JSON.parse(e):[]}),[O,Z]=h({}),[x,E]=h(()=>{if(typeof window>"u")return[];let e=localStorage.getItem(`${d}_sort`);return e?JSON.parse(e):[]}),L=he(null);k(()=>{d&&localStorage.setItem(`${d}_visible`,JSON.stringify(y))},[y,d]),k(()=>{d&&localStorage.setItem(`${d}_sticky`,JSON.stringify(N))},[N,d]),k(()=>{d&&localStorage.setItem(`${d}_filter`,A)},[A,d]),k(()=>{d&&localStorage.setItem(`${d}_sort`,JSON.stringify(x))},[x,d]),k(()=>{if(!d)return;let e=localStorage.getItem(`${d}_visible`),t=f.map(n=>n.name);if(e)try{let n=JSON.parse(e),p=t.filter(l=>!n.includes(l));S([...n,...p])}catch{S(t)}else S(t);let o=localStorage.getItem(`${d}_sticky`);P(o?JSON.parse(o):[]);let r=localStorage.getItem(`${d}_sort`);E(r?JSON.parse(r):[]);let a=localStorage.getItem(`${d}_filter`);J(a||"")},[d]);let ee=e=>{let t=String(e);if(J(t),!t||t.length===0){F(c);return}let o=t.toLowerCase(),r=c.filter(a=>Object.values(a).some(n=>n==null?!1:String(n).toLowerCase().includes(o)));F(r)},te=e=>{ke.fire({title:"Detalle de la Fila",html:`<pre style="text-align: left; font-size: 12px; background: #f4f4f4; padding: 10px; border-radius: 4px; overflow: auto;">${JSON.stringify(e,null,2)}</pre>`,width:"600px",confirmButtonColor:"#764ba2"})};k(()=>{F(c)},[c]);let oe=()=>{V(!0),setTimeout(()=>{let e=new ve,t=f.filter(r=>y.includes(r.name)).map(r=>r.name),o=c.map(r=>f.filter(a=>y.includes(a.name)).map(a=>{let n;return typeof a.selector=="function"?n=a.selector(r):n=r[a.selector],n!=null&&typeof n=="object"?JSON.stringify(n):n||""}));we(e,{head:[t],body:o,startY:20,theme:"grid",styles:{halign:"justify"}}),e.save("data.pdf"),V(!1)},100)},ae=e=>{S(t=>t.includes(e)?t.filter(o=>o!==e):[...t,e])},ne=()=>{S(f.map(e=>e.name))},re=()=>{S([])},v=C(()=>f.filter(e=>y.includes(e.name)),[f,y]),D=C(()=>v.filter(e=>N.includes(e.name)),[v,N]),se=e=>{P(t=>t.includes(e)?t.filter(r=>r!==e):t.length<3?[...t,e]:t)};k(()=>{if(!L.current)return;let e=L.current.querySelector(".rdt_TableRow");if(!e)return;let t=e.querySelectorAll(".rdt_TableCell");if(!t.length)return;let o={};v.forEach((l,u)=>{if(t[u]){let m=t[u].getBoundingClientRect().width;o[l.name]=m}});let r=Object.keys(O),a=Object.keys(o);r.length===a.length&&a.every(l=>O[l]===o[l])||Z(o)},[v,O,I.length]);let M=C(()=>{let e={},t=0;return D.forEach(o=>{e[o.name]=t,t+=O[o.name]||0}),e},[D,O]),ie=C(()=>D.map((e,t)=>{let o=v.findIndex(n=>n.name===e.name),r=M[e.name];if(o===-1||r===void 0)return"";let a=20+t;return`
|
|
3
3
|
.rdt_TableCol:nth-child(${o+1}),
|
|
4
4
|
.rdt_TableCell:nth-child(${o+1}) {
|
|
5
5
|
position: sticky !important;
|
|
@@ -11,5 +11,5 @@ function H(c,{insertAt:f}={}){if(!c||typeof document>"u")return;let g=document.h
|
|
|
11
11
|
.rdt_TableCol:nth-child(${o+1}) {
|
|
12
12
|
z-index: ${a+1};
|
|
13
13
|
}
|
|
14
|
-
`}).join(""),[
|
|
14
|
+
`}).join(""),[D,M,v]),le=(e,t)=>{if(e.sortable===!1||!e.selector&&!e.sortFunction&&!e.name)return;let o=t.shiftKey;E(r=>{let a=r.findIndex(p=>p.columnName===e.name),n=[...r];if(o)if(a>=0){let p=r[a];p&&(p.direction==="asc"?n[a]={...p,direction:"desc"}:n.splice(a,1))}else n.push({columnName:e.name,selector:e.selector,sortFunction:e.sortFunction,direction:"asc"});else if(a>=0){let p=r[a];p&&(n=[{...p,direction:p.direction==="asc"?"desc":"asc"}])}else n=[{columnName:e.name,selector:e.selector,sortFunction:e.sortFunction,direction:"asc"}];return n})},ce=e=>{if(e.sortable===!1||!e.selector&&!e.sortFunction)return null;let t=x.findIndex(a=>a.columnName===e.name);if(t===-1)return s("span",{className:"ms-1",style:{opacity:.3,fontSize:"11px",color:"var(--dt-header-text)"},children:s("i",{className:"fas fa-sort"})});let o=x[t],r=o?o.direction==="asc":!0;return i("span",{className:"ms-1 d-flex align-items-center",style:{fontSize:"12px",color:"#0d6efd",fontWeight:"bold"},children:[s("i",{className:r?"fas fa-sort-up":"fas fa-sort-down"}),x.length>1&&s("small",{className:"ms-1",style:{fontSize:"10px"},children:t+1})]})},de=v.map(e=>{let{right:t,center:o,compact:r,wrap:a,grow:n,maxWidth:p,minWidth:l,width:u,reorder:m,...w}=e,K=N.includes(e.name),me=K||N.length<3,Y=t?!1:o!==!1,$=e.sortable!==!1&&(e.selector||e.sortFunction);return{...w,right:t,center:Y,compact:r,wrap:a!==void 0?a:!0,grow:n,maxWidth:p,minWidth:l,width:u,reorder:m,sortable:!1,name:i("div",{className:"custom-header-wrapper",onClick:z=>{z.stopPropagation(),$&&le(e,z)},style:{cursor:$?"pointer":"default",display:"flex",alignItems:"center",width:"100%",justifyContent:Y?"center":t?"flex-end":"flex-start",userSelect:"none"},title:$?"Clic para ordenar. Shift+clic para ordenar por m\xFAltiples columnas":"",children:[i("label",{className:"custom-checkbox-label",onClick:z=>z.stopPropagation(),children:[s("input",{type:"checkbox",className:"custom-checkbox-input",checked:K,disabled:!me,onChange:()=>se(e.name)}),s("span",{className:"custom-checkbox-checkmark",children:s("i",{className:"fas fa-thumbtack"})})]}),s("span",{className:"custom-header-name",style:{marginLeft:"8px"},children:e.name}),$&&ce(e)]})}}),pe=C(()=>x.length===0?I:[...I].sort((e,t)=>{for(let o=0;o<x.length;o++){let r=x[o];if(!r)continue;let{selector:a,sortFunction:n,direction:p}=r,l=p==="asc"?1:-1;if(n){let w=n(e,t);if(w!==0)return w*l;continue}if(!a)continue;let u=typeof a=="function"?a(e):e[a],m=typeof a=="function"?a(t):t[a];if(u=u??"",m=m??"",typeof u=="string"&&typeof m=="string"){let w=u.localeCompare(m,void 0,{numeric:!0,sensitivity:"base"});if(w!==0)return w*l}else if(typeof u=="number"&&typeof m=="number"){if(u!==m)return(u-m)*l}else{if(u<m)return-1*l;if(u>m)return 1*l}}return 0}),[I,x]),fe={headRow:{style:{backgroundColor:"var(--dt-header-bg)",borderBottom:"2px solid var(--dt-border-color)",fontWeight:"600",fontSize:"14px",color:"var(--dt-header-text)",minHeight:"52px"}},headCells:{style:{paddingLeft:"10px",paddingRight:"10px",justifyContent:"center",textAlign:"center"}},rows:{style:{fontSize:"13px",color:"var(--dt-row-text)",backgroundColor:"var(--dt-bg)",minHeight:"44px","&:hover":{backgroundColor:"var(--dt-row-hover-bg)",cursor:"pointer",transition:"background-color 0.2s ease",color:"var(--dt-row-text)"}},stripedStyle:{backgroundColor:"var(--dt-row-stripe-bg)",color:"var(--dt-row-text)"}},cells:{style:{paddingLeft:"10px",paddingRight:"10px",justifyContent:"center",textAlign:"center"}},pagination:{style:{borderTop:"1px solid var(--dt-border-color)",fontSize:"13px",minHeight:"56px",backgroundColor:"var(--dt-bg)",color:"var(--dt-row-text)"},pageButtonsStyle:{color:"var(--dt-row-text)",fill:"var(--dt-row-text)","&:disabled":{color:"var(--dt-disabled-text)",fill:"var(--dt-disabled-text)"},"&:hover:not(:disabled)":{backgroundColor:"var(--dt-row-hover-bg)"},"&:focus":{outline:"none",backgroundColor:"var(--dt-row-hover-bg)"}}}},ue=C(()=>{if(!c||c.length===0||!c[0])return[];let e=Object.keys(c[0]),t=[];e.forEach(n=>{if(["created_at","updated_at","deleted_at"].includes(n))return;let p=c.find(l=>l[n]!==null&&l[n]!==void 0);if(p){let l=p[n];if(typeof l=="object"&&!(l instanceof Date))return;t.push(n)}else t.push(n)});let o=t.map(()=>""),r=t,a=c.map(n=>t.map(p=>{let l=n[p];return l??""}));return[o,r,...a]},[c]);return i("section",{className:"apextable-wrapper",children:[s("style",{children:ie}),i("div",{className:"datatable-container",ref:L,children:[s("div",{className:"search-bar-container",hidden:g,children:s("div",{style:{display:"flex",flexDirection:"column",gap:"16px"},children:i("div",{style:{display:"flex",flexWrap:"wrap",justifyContent:"space-between",alignItems:"center",gap:"16px"},children:[i("div",{className:"search-input-wrapper",children:[s("i",{className:"fas fa-search search-icon"}),s(q,{value:A,onChange:ee,placeholder:"Buscar en todos los campos...",className:"search-input"})]}),i("div",{style:{display:"flex",alignItems:"center",gap:"12px",flexWrap:"wrap"},children:[i("span",{className:"stats-badge",children:[I.length," de ",c.length," registros"]}),i("div",{className:"action-buttons",children:[s(ye,{data:ue,filename:`export_${new Date().toISOString().split("T")[0]}.csv`,style:{textDecoration:"none"},children:i("button",{className:"btn-action btn-csv",children:[s("i",{className:"fas fa-file-csv"}),s("span",{children:"CSV"})]})}),i("button",{onClick:oe,className:"btn-action btn-pdf",disabled:W,children:[s("i",{className:"fas fa-file-pdf"}),s("span",{children:W?"Exportando...":"PDF"})]}),i("button",{className:"btn-action btn-columns",onClick:()=>_(!0),children:[s("i",{className:"fas fa-columns"}),s("span",{children:"Columnas"})]})]})]})]})})}),i("div",{className:"sticky-info-label",children:[s("i",{className:"fas fa-info-circle"}),i("span",{children:["Use la chincheta (",s("i",{className:"fas fa-thumbtack"}),") para fijar hasta 3 columnas."]})]}),s(Ce,{columns:de,data:pe,pagination:!0,paginationPerPage:15,paginationRowsPerPageOptions:[5,10,15,20,25,50],striped:!0,highlightOnHover:!0,pointerOnHover:!0,responsive:!0,fixedHeader:!0,fixedHeaderScrollHeight:"calc(100vh - 320px)",onRowDoubleClicked:te,customStyles:fe,expandableRows:b,expandableRowsComponent:T,expandableRowExpanded:j,conditionalRowStyles:R,...Q,noDataComponent:i("div",{style:{padding:"40px",textAlign:"center",color:"#6c757d"},children:[s("i",{className:"fas fa-inbox",style:{fontSize:"48px",marginBottom:"16px",opacity:.5}}),s("p",{style:{margin:0,fontSize:"14px"},children:"No se encontraron registros"})]})})]}),X&&s("div",{className:"modal-overlay",onClick:()=>_(!1),children:i("div",{className:"modal-content-custom",onClick:e=>e.stopPropagation(),children:[i("div",{className:"modal-header-custom",children:[i("h5",{className:"modal-title-custom",children:[s("i",{className:"fas fa-columns"}),"Gestionar Columnas"]}),s("button",{className:"modal-close-btn",onClick:()=>_(!1),children:s("i",{className:"fas fa-times"})})]}),i("div",{className:"modal-body-custom",children:[i("div",{className:"column-actions",children:[i("button",{className:"btn-column-action",onClick:ne,children:[s("i",{className:"fas fa-check-double"}),"Seleccionar Todo"]}),i("button",{className:"btn-column-action",onClick:re,children:[s("i",{className:"fas fa-times"}),"Deseleccionar Todo"]})]}),f.map(e=>s("div",{className:"column-checkbox-wrapper",children:i("label",{className:"column-checkbox",children:[s("input",{type:"checkbox",checked:y.includes(e.name),onChange:()=>ae(e.name)}),s("span",{style:{marginLeft:"8px"},children:e.name})]})},e.name))]}),i("div",{className:"modal-footer-custom",children:[s("button",{className:"btn-modal btn-modal-light",onClick:()=>_(!1),children:"Cerrar"}),i("button",{className:"btn-modal btn-modal-primary",onClick:()=>_(!1),children:[s("i",{className:"fas fa-check"}),"Aplicar"]})]})]})})]})},Ne=Se;export{Ne as ApexTable};
|
|
15
15
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["#style-inject:#style-inject","../src/styles/table.css","../src/components/ApexTable.tsx","../src/components/DebouncedInput.tsx"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root{--dt-bg: #ffffff;--dt-header-bg: #f8f9fa;--dt-header-text: #495057;--dt-row-text: #212529;--dt-row-hover-bg: #f1f3f5;--dt-row-stripe-bg: #f8f9fa;--dt-border-color: #dee2e6;--dt-disabled-text: #adb5bd;--dt-input-bg: #ffffff;--dt-input-border: #ced4da;--dt-input-text: #495057;--dt-badge-bg: #e7f5ff;--dt-badge-text: #0d6efd;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .1)}html.dark{--dt-bg: #1e293b;--dt-header-bg: #0f172a;--dt-header-text: #e2e8f0;--dt-row-text: #f1f5f9;--dt-row-hover-bg: #334155;--dt-row-stripe-bg: #1e293b;--dt-border-color: #334155;--dt-disabled-text: #64748b;--dt-input-bg: #1e293b;--dt-input-border: #334155;--dt-input-text: #f1f5f9;--dt-badge-bg: #1e293b;--dt-badge-text: #60a5fa;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .5)}.rdt_Table{background:transparent!important}.datatable-container{background:var(--dt-bg);border-radius:1.5rem;box-shadow:var(--dt-shadow);padding:1.5rem;overflow:auto!important;color:var(--dt-row-text);transition:all .2s ease}.rdt_TableHeadRow{background-color:var(--dt-header-bg)!important;border-bottom:2px solid var(--dt-border-color)!important}html.dark .rdt_TableRow{background-color:#1e293b}html.dark .datatable-container{background-color:#1e293b!important;color:#f1f5f9!important}.rdt_TableCell{word-break:normal!important;overflow-wrap:normal!important;white-space:normal!important}.rdt_TableCell .inline-flex,.rdt_TableCell button,.rdt_TableCell a{white-space:nowrap!important}.sticky-info-label{font-size:12px;color:var(--dt-header-text);margin-bottom:12px;display:flex;align-items:center;gap:6px}.custom-header-wrapper{display:flex;align-items:center;gap:8px}.custom-checkbox-label{position:relative;cursor:pointer;width:18px;height:18px}.custom-checkbox-input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.custom-checkbox-checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:var(--dt-input-border);border-radius:4px;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--dt-disabled-text)}.custom-checkbox-label:hover .custom-checkbox-checkmark{background-color:var(--dt-border-color)}.custom-checkbox-input:checked~.custom-checkbox-checkmark{background-color:#0d6efd;color:#fff}.custom-checkbox-input:disabled~.custom-checkbox-checkmark{background-color:var(--dt-header-bg);cursor:not-allowed;opacity:.7}.custom-checkbox-checkmark .fa-thumbtack{font-size:10px;transition:transform .2s ease}.custom-checkbox-input:checked~.custom-checkbox-checkmark .fa-thumbtack{transform:rotate(45deg)}.search-bar-container{background:var(--dt-header-bg);border-radius:8px;padding:16px;margin-bottom:20px;border:1px solid var(--dt-border-color)}.search-input-wrapper{position:relative;flex:1;max-width:400px}.search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dt-header-text);pointer-events:none}.search-input{padding-left:40px!important;border:1px solid var(--dt-input-border);border-radius:6px;padding:10px 12px;font-size:14px;width:100%;transition:all .2s ease;background-color:var(--dt-input-bg);color:var(--dt-input-text)}.search-input:focus{outline:none;border-color:#0d6efd;box-shadow:0 0 0 3px #0d6efd1a}.action-buttons{display:flex;gap:8px;flex-wrap:wrap}.btn-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;border-radius:6px;transition:all .2s ease;border:none;cursor:pointer}.btn-action:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.btn-csv{background-color:#198754;color:#fff}.btn-csv:hover{background-color:#157347}.btn-pdf{background-color:#dc3545;color:#fff}.btn-pdf:hover{background-color:#bb2d3b}.btn-columns{background-color:#0d6efd;color:#fff}.btn-columns:hover{background-color:#0b5ed7}.btn-action:disabled{opacity:.6;cursor:not-allowed;transform:none}.stats-badge{display:inline-flex;align-items:center;padding:4px 12px;background:var(--dt-badge-bg);color:var(--dt-badge-text);border-radius:20px;font-size:12px;font-weight:600}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;animation:dtp-fadeIn .2s ease}@keyframes dtp-fadeIn{0%{opacity:0}to{opacity:1}}.modal-content-custom{background:var(--dt-bg);color:var(--dt-row-text);border-radius:12px;box-shadow:var(--dt-shadow);width:90%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;animation:dtp-slideUp .3s ease;border:1px solid var(--dt-border-color)}@keyframes dtp-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.modal-header-custom{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:20px 24px;border-radius:12px 12px 0 0;display:flex;justify-content:space-between;align-items:center}.modal-title-custom{font-weight:600;font-size:18px;margin:0;display:flex;align-items:center;gap:8px}.modal-close-btn{background:#fff3;border:none;color:#fff;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.modal-close-btn:hover{background:#ffffff4d}.modal-body-custom{padding:24px;overflow-y:auto;flex:1}.modal-footer-custom{padding:16px 24px;border-top:1px solid var(--dt-border-color);display:flex;justify-content:flex-end;gap:8px}.column-actions{display:flex;gap:8px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--dt-border-color)}.btn-column-action{flex:1;padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid var(--dt-border-color);background:var(--dt-input-bg);color:var(--dt-row-text);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:4px}.btn-column-action:hover{background:var(--dt-row-hover-bg);border-color:#adb5bd}.column-checkbox-wrapper{padding:10px;border-radius:6px;transition:background-color .2s ease;display:flex;align-items:center}.column-checkbox-wrapper:hover{background-color:var(--dt-row-hover-bg)}.column-checkbox{display:flex;align-items:center;cursor:pointer;font-size:14px;user-select:none}.column-checkbox input{margin-right:8px;cursor:pointer}.btn-modal{padding:8px 16px;font-size:14px;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:6px}.btn-modal-light{background:var(--dt-header-bg);color:var(--dt-header-text)}.btn-modal-light:hover{background:var(--dt-row-hover-bg)}.btn-modal-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.btn-modal-primary:hover{box-shadow:0 4px 12px #667eea66}@media(max-width:768px){.search-bar-container{flex-direction:column;gap:12px}.search-input-wrapper{max-width:100%}.action-buttons{justify-content:stretch}.btn-action{flex:1;justify-content:center}.modal-content-custom{width:95%;margin:10px}}\\n\")","import React, { useState, useEffect, useMemo, useRef } from \"react\";\nimport DataTable from \"react-data-table-component\";\nimport type { TableProps, ConditionalStyles } from \"react-data-table-component\";\nimport { CSVLink } from \"react-csv\";\nimport { jsPDF } from \"jspdf\";\nimport autoTable from \"jspdf-autotable\";\nimport Swal from 'sweetalert2';\nimport DebouncedInput from \"./DebouncedInput\";\n\n// Extend TableColumn to include our custom properties\nexport interface ApexTableColumn<T> {\n name: string;\n selector?: (row: T) => any;\n sortable?: boolean;\n sortFunction?: (a: T, b: T) => number;\n right?: boolean;\n center?: boolean;\n compact?: boolean;\n wrap?: boolean;\n grow?: number;\n maxWidth?: string;\n minWidth?: string;\n width?: string;\n cell?: (row: T) => React.ReactNode;\n [key: string]: any;\n}\n\nexport interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'expandableRowExpanded'> {\n datos: T[];\n columnas: ApexTableColumn<T>[];\n hiddenOptions?: boolean;\n expandableRows?: boolean;\n expandableRowsComponent?: React.FC<{ data: T }>;\n expandableRowExpanded?: (row: T) => boolean;\n conditionalRowStyles?: ConditionalStyles<T>[];\n storagePrefix?: string;\n}\n\ninterface SortConfig {\n columnName: string;\n selector?: any;\n sortFunction?: any;\n direction: 'asc' | 'desc';\n}\n\nconst ApexTable = <T extends Record<string, any>>({\n datos = [],\n columnas = [],\n hiddenOptions = false,\n expandableRows = false,\n expandableRowsComponent,\n expandableRowExpanded,\n conditionalRowStyles = [],\n storagePrefix = \"dt_config\",\n ...otherProps\n}: ApexTableProps<T>) => {\n \n // ✅ unique key for this table instance on this page\n const storageKey = useMemo(() => {\n if (typeof window === 'undefined') return '';\n const path = window.location.pathname;\n const colNames = columnas.map(c => c.name).join(',');\n let hash = 0;\n for (let i = 0; i < colNames.length; i++) {\n const char = colNames.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0;\n }\n return `${storagePrefix}_${path}_${hash}`;\n }, [columnas, storagePrefix]);\n\n const [filterValue, setFilterValue] = useState<string>(() => {\n if (typeof window === 'undefined') return \"\";\n const saved = localStorage.getItem(`${storageKey}_filter`);\n return saved || \"\";\n });\n \n const [filteredData, setFilteredData] = useState<T[]>(datos);\n\n const [visibleColumns, setVisibleColumns] = useState<string[]>(() => {\n const allNames = columnas.map((col) => col.name);\n if (typeof window === 'undefined') return allNames;\n const saved = localStorage.getItem(`${storageKey}_visible`);\n if (!saved) return allNames;\n\n try {\n const parsed = JSON.parse(saved);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n return [...parsed, ...newColumns];\n } catch (e) {\n return allNames;\n }\n });\n\n const [showModal, setShowModal] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n\n const [stickyColumns, setStickyColumns] = useState<string[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sticky`);\n return saved ? JSON.parse(saved) : [];\n });\n\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\n const [sortConfig, setSortConfig] = useState<SortConfig[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sort`);\n return saved ? JSON.parse(saved) : [];\n });\n \n const tableRef = useRef<HTMLDivElement>(null);\n\n // ✅ Sync state to localStorage\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_visible`, JSON.stringify(visibleColumns));\n }\n }, [visibleColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sticky`, JSON.stringify(stickyColumns));\n }\n }, [stickyColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_filter`, filterValue);\n }\n }, [filterValue, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sort`, JSON.stringify(sortConfig));\n }\n }, [sortConfig, storageKey]);\n\n // ✅ Sync states if columns/hash change without remounting\n useEffect(() => {\n if (!storageKey) return;\n\n const savedVisible = localStorage.getItem(`${storageKey}_visible`);\n const allNames = columnas.map(col => col.name);\n if (savedVisible) {\n try {\n const parsed = JSON.parse(savedVisible);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n setVisibleColumns([...parsed, ...newColumns]);\n } catch (e) {\n setVisibleColumns(allNames);\n }\n }\n else setVisibleColumns(allNames);\n\n const savedSticky = localStorage.getItem(`${storageKey}_sticky`);\n if (savedSticky) setStickyColumns(JSON.parse(savedSticky));\n else setStickyColumns([]);\n\n const savedSort = localStorage.getItem(`${storageKey}_sort`);\n if (savedSort) setSortConfig(JSON.parse(savedSort));\n else setSortConfig([]);\n\n const savedFilter = localStorage.getItem(`${storageKey}_filter`);\n setFilterValue(savedFilter || \"\");\n }, [storageKey]);\n\n const handleFilterChange = (searchValue: string | number) => {\n const val = String(searchValue);\n setFilterValue(val);\n\n if (!val || val.length === 0) {\n setFilteredData(datos);\n return;\n }\n\n const searchLower = val.toLowerCase();\n\n const filtered = datos.filter((row) =>\n Object.values(row).some((value) => {\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n })\n );\n\n setFilteredData(filtered);\n };\n\n const handleDoubleClick = (row: T) => {\n Swal.fire({\n title: 'Detalle de la Fila',\n html: `<pre style=\"text-align: left; font-size: 12px; background: #f4f4f4; padding: 10px; border-radius: 4px; overflow: auto;\">${JSON.stringify(row, null, 2)}</pre>`,\n width: '600px',\n confirmButtonColor: '#764ba2'\n });\n };\n\n useEffect(() => {\n setFilteredData(datos);\n }, [datos]);\n\n const downloadPDF = () => {\n setIsExporting(true);\n setTimeout(() => {\n const doc = new jsPDF() as any;\n const tableColumn = columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => col.name);\n\n const tableRows = datos.map((row) => {\n return columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => {\n let value;\n if (typeof col.selector === \"function\") {\n value = col.selector(row);\n } else {\n // Basic mapping if selector was a string property name (though we typed it as function)\n value = (row as any)[col.selector as any];\n }\n const formattedValue =\n value !== undefined &&\n value !== null &&\n typeof value === \"object\"\n ? JSON.stringify(value)\n : value || \"\";\n return formattedValue;\n });\n });\n\n autoTable(doc, {\n head: [tableColumn],\n body: tableRows,\n startY: 20,\n theme: \"grid\",\n styles: {\n halign: \"justify\",\n },\n });\n doc.save(\"data.pdf\");\n setIsExporting(false);\n }, 100);\n };\n\n const handleColumnVisibilityChange = (columnName: string) => {\n setVisibleColumns((prevVisibleColumns) =>\n prevVisibleColumns.includes(columnName)\n ? prevVisibleColumns.filter((name) => name !== columnName)\n : [...prevVisibleColumns, columnName]\n );\n };\n\n const selectAllColumns = () => {\n setVisibleColumns(columnas.map((col) => col.name));\n };\n\n const deselectAllColumns = () => {\n setVisibleColumns([]);\n };\n\n const filteredColumns = useMemo(\n () => columnas.filter((col) => visibleColumns.includes(col.name)),\n [columnas, visibleColumns]\n );\n\n const orderedStickyColumns = useMemo(\n () => filteredColumns.filter((col) => stickyColumns.includes(col.name)),\n [filteredColumns, stickyColumns]\n );\n\n const toggleStickyColumn = (name: string) => {\n setStickyColumns((prev) => {\n const isSticky = prev.includes(name);\n if (isSticky) {\n return prev.filter((colName) => colName !== name);\n } else {\n if (prev.length < 3) {\n return [...prev, name];\n }\n return prev;\n }\n });\n };\n\n useEffect(() => {\n if (!tableRef.current) return;\n\n const firstRow = tableRef.current.querySelector(\".rdt_TableRow\");\n if (!firstRow) return;\n\n const rowCells = firstRow.querySelectorAll(\".rdt_TableCell\");\n if (!rowCells.length) return;\n\n const newWidths: Record<string, number> = {};\n\n filteredColumns.forEach((col, index) => {\n if (rowCells[index]) {\n const width = rowCells[index].getBoundingClientRect().width;\n newWidths[col.name] = width;\n }\n });\n\n const oldKeys = Object.keys(columnWidths);\n const newKeys = Object.keys(newWidths);\n\n const sameLength = oldKeys.length === newKeys.length;\n const sameValues =\n sameLength &&\n newKeys.every((key) => columnWidths[key] === newWidths[key]);\n\n if (!sameValues) {\n setColumnWidths(newWidths);\n }\n }, [filteredColumns, columnWidths, filteredData.length]);\n\n const stickyOffsets = useMemo(() => {\n const offsets: Record<string, number> = {};\n let currentOffset = 0;\n\n orderedStickyColumns.forEach((col) => {\n offsets[col.name] = currentOffset;\n currentOffset += columnWidths[col.name] || 0;\n });\n\n return offsets;\n }, [orderedStickyColumns, columnWidths]);\n\n const dynamicStyles = useMemo(() => {\n return orderedStickyColumns\n .map((col, orderIndex) => {\n const index = filteredColumns.findIndex((c) => c.name === col.name);\n const offset = stickyOffsets[col.name];\n\n if (index === -1 || offset === undefined) return \"\";\n\n const zBase = 20 + orderIndex;\n\n return `\n .rdt_TableCol:nth-child(${index + 1}),\n .rdt_TableCell:nth-child(${index + 1}) {\n position: sticky !important;\n left: ${offset}px;\n z-index: ${zBase};\n background-color: var(--dt-row-hover-bg);\n background-clip: padding-box;\n }\n .rdt_TableCol:nth-child(${index + 1}) {\n z-index: ${zBase + 1};\n }\n `;\n })\n .join(\"\");\n }, [orderedStickyColumns, stickyOffsets, filteredColumns]);\n\n const handleColumnSort = (col: ApexTableColumn<T>, e: React.MouseEvent) => {\n if (col.sortable === false) return;\n if (!col.selector && !col.sortFunction && !col.name) return;\n\n const isShift = e.shiftKey;\n setSortConfig(prev => {\n const index = prev.findIndex(s => s.columnName === col.name);\n let updated = [...prev];\n\n if (!isShift) {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n updated = [{ ...existing, direction: existing.direction === 'asc' ? 'desc' : 'asc' }];\n }\n } else {\n updated = [{ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' }];\n }\n } else {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n if (existing.direction === 'asc') {\n updated[index] = { ...existing, direction: 'desc' };\n } else {\n updated.splice(index, 1);\n }\n }\n } else {\n updated.push({ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' });\n }\n }\n return updated;\n });\n };\n\n const renderSortIcon = (col: ApexTableColumn<T>) => {\n if (col.sortable === false) return null;\n if (!col.selector && !col.sortFunction) return null;\n\n const sortIndex = sortConfig.findIndex(s => s.columnName === col.name);\n\n if (sortIndex === -1) {\n return (\n <span className=\"ms-1\" style={{ opacity: 0.3, fontSize: '11px', color: 'var(--dt-header-text)' }}>\n <i className=\"fas fa-sort\"></i>\n </span>\n );\n }\n\n const config = sortConfig[sortIndex];\n const isAsc = config ? config.direction === 'asc' : true;\n return (\n <span className=\"ms-1 d-flex align-items-center\" style={{ fontSize: '12px', color: '#0d6efd', fontWeight: 'bold' }}>\n <i className={isAsc ? \"fas fa-sort-up\" : \"fas fa-sort-down\"}></i>\n {sortConfig.length > 1 && (\n <small className=\"ms-1\" style={{ fontSize: '10px' }}>\n {sortIndex + 1}\n </small>\n )}\n </span>\n );\n };\n\n const processedColumns = filteredColumns.map((col) => {\n const {\n right,\n center: colCenter,\n compact,\n wrap,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n ...safeProps\n } = col;\n\n const isSticky = stickyColumns.includes(col.name);\n const canBeMadeSticky = isSticky || stickyColumns.length < 3;\n const center = right ? false : (colCenter !== false);\n const isSortableColumn = col.sortable !== false && (col.selector || col.sortFunction);\n\n return {\n ...safeProps,\n right,\n center,\n compact,\n wrap: wrap !== undefined ? wrap : true,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n sortable: false, \n name: (\n <div\n className=\"custom-header-wrapper\"\n onClick={(e) => {\n e.stopPropagation();\n if (isSortableColumn) handleColumnSort(col, e);\n }}\n style={{\n cursor: isSortableColumn ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n justifyContent: center ? 'center' : right ? 'flex-end' : 'flex-start',\n userSelect: \"none\"\n }}\n title={isSortableColumn ? \"Clic para ordenar. Shift+clic para ordenar por múltiples columnas\" : \"\"}\n >\n <label className=\"custom-checkbox-label\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n className=\"custom-checkbox-input\"\n checked={isSticky}\n disabled={!canBeMadeSticky}\n onChange={() => toggleStickyColumn(col.name)}\n />\n <span className=\"custom-checkbox-checkmark\">\n <i className=\"fas fa-thumbtack\"></i>\n </span>\n </label>\n <span className=\"custom-header-name\" style={{ marginLeft: '8px' }}>{col.name}</span>\n {isSortableColumn && renderSortIcon(col)}\n </div>\n ),\n };\n });\n\n const sortedData = useMemo(() => {\n if (sortConfig.length === 0) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n for (let i = 0; i < sortConfig.length; i++) {\n const config = sortConfig[i];\n if (!config) continue;\n \n const { selector, sortFunction, direction } = config;\n const dirMultiplier = direction === 'asc' ? 1 : -1;\n\n if (sortFunction) {\n const res = sortFunction(a, b);\n if (res !== 0) return res * dirMultiplier;\n continue;\n }\n\n if (!selector) continue;\n\n let valA = typeof selector === 'function' ? selector(a) : (a as any)[selector];\n let valB = typeof selector === 'function' ? selector(b) : (b as any)[selector];\n\n valA = valA ?? \"\";\n valB = valB ?? \"\";\n\n if (typeof valA === \"string\" && typeof valB === \"string\") {\n const comp = valA.localeCompare(valB, undefined, { numeric: true, sensitivity: 'base' });\n if (comp !== 0) return comp * dirMultiplier;\n } else if (typeof valA === \"number\" && typeof valB === \"number\") {\n if (valA !== valB) return (valA - valB) * dirMultiplier;\n } else {\n if (valA < valB) return -1 * dirMultiplier;\n if (valA > valB) return 1 * dirMultiplier;\n }\n }\n return 0;\n });\n }, [filteredData, sortConfig]);\n\n const customStyles = {\n headRow: {\n style: {\n backgroundColor: \"var(--dt-header-bg)\",\n borderBottom: \"2px solid var(--dt-border-color)\",\n fontWeight: \"600\",\n fontSize: \"14px\",\n color: \"var(--dt-header-text)\",\n minHeight: \"52px\",\n },\n },\n headCells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n rows: {\n style: {\n fontSize: \"13px\",\n color: \"var(--dt-row-text)\",\n backgroundColor: \"var(--dt-bg)\",\n minHeight: \"44px\",\n \"&:hover\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease\",\n color: \"var(--dt-row-text)\",\n },\n },\n stripedStyle: {\n backgroundColor: \"var(--dt-row-stripe-bg)\",\n color: \"var(--dt-row-text)\",\n },\n },\n cells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n pagination: {\n style: {\n borderTop: \"1px solid var(--dt-border-color)\",\n fontSize: \"13px\",\n minHeight: \"56px\",\n backgroundColor: \"var(--dt-bg)\",\n color: \"var(--dt-row-text)\",\n },\n pageButtonsStyle: {\n color: \"var(--dt-row-text)\",\n fill: \"var(--dt-row-text)\",\n \"&:disabled\": {\n color: \"var(--dt-disabled-text)\",\n fill: \"var(--dt-disabled-text)\",\n },\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n \"&:focus\": {\n outline: \"none\",\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n },\n },\n };\n\n const csvData = useMemo(() => {\n if (!datos || datos.length === 0 || !datos[0]) return [];\n\n const originalKeys = Object.keys(datos[0]);\n const validKeys: string[] = [];\n\n originalKeys.forEach(key => {\n if (['created_at', 'updated_at', 'deleted_at'].includes(key)) return;\n\n const firstValid = datos.find(row => row[key] !== null && row[key] !== undefined);\n if (firstValid) {\n const val = firstValid[key];\n if (typeof val === 'object' && !(val instanceof Date)) {\n return;\n }\n validKeys.push(key);\n } else {\n validKeys.push(key);\n }\n });\n\n const blankRow = validKeys.map(() => \"\");\n const headerRow = validKeys;\n const processed = datos.map(row => {\n return validKeys.map(key => {\n const val = row[key];\n return val !== null && val !== undefined ? val : \"\";\n });\n });\n\n return [blankRow, headerRow, ...processed];\n }, [datos]);\n\n return (\n <section className=\"apextable-wrapper\">\n <style>{dynamicStyles}</style>\n\n <div className=\"datatable-container\" ref={tableRef}>\n <div className=\"search-bar-container\" hidden={hiddenOptions}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"16px\" }}>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", justifyContent: \"space-between\", alignItems: \"center\", gap: \"16px\" }}>\n <div className=\"search-input-wrapper\">\n <i className=\"fas fa-search search-icon\"></i>\n <DebouncedInput\n value={filterValue}\n onChange={handleFilterChange}\n placeholder=\"Buscar en todos los campos...\"\n className=\"search-input\"\n />\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"12px\", flexWrap: \"wrap\" }}>\n <span className=\"stats-badge\">\n {filteredData.length} de {datos.length} registros\n </span>\n\n <div className=\"action-buttons\">\n <CSVLink\n data={csvData}\n filename={`export_${new Date().toISOString().split('T')[0]}.csv`}\n style={{ textDecoration: \"none\" }}\n >\n <button className=\"btn-action btn-csv\">\n <i className=\"fas fa-file-csv\" />\n <span>CSV</span>\n </button>\n </CSVLink>\n\n <button\n onClick={downloadPDF}\n className=\"btn-action btn-pdf\"\n disabled={isExporting}\n >\n <i className=\"fas fa-file-pdf\" />\n <span>\n {isExporting ? \"Exportando...\" : \"PDF\"}\n </span>\n </button>\n\n <button\n className=\"btn-action btn-columns\"\n onClick={() => setShowModal(true)}\n >\n <i className=\"fas fa-columns\" />\n <span>Columnas</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"sticky-info-label\">\n <i className=\"fas fa-info-circle\"></i>\n <span>\n Use la chincheta (<i className=\"fas fa-thumbtack\"></i>) para fijar hasta 3 columnas.\n </span>\n </div>\n\n <DataTable\n columns={processedColumns as any}\n data={sortedData}\n pagination\n paginationPerPage={15}\n paginationRowsPerPageOptions={[5, 10, 15, 20, 25, 50]}\n striped\n highlightOnHover\n pointerOnHover\n responsive\n fixedHeader\n fixedHeaderScrollHeight=\"calc(100vh - 320px)\"\n onRowDoubleClicked={handleDoubleClick}\n customStyles={customStyles}\n expandableRows={expandableRows}\n expandableRowsComponent={expandableRowsComponent as any}\n expandableRowExpanded={expandableRowExpanded as any}\n conditionalRowStyles={conditionalRowStyles}\n {...otherProps}\n noDataComponent={\n <div style={{ padding: \"40px\", textAlign: \"center\" as const, color: \"#6c757d\" }}>\n <i className=\"fas fa-inbox\" style={{ fontSize: \"48px\", marginBottom: \"16px\", opacity: 0.5 }} />\n <p style={{ margin: 0, fontSize: \"14px\" }}>No se encontraron registros</p>\n </div>\n }\n />\n </div>\n\n {/* Modal de Columnas */}\n {showModal && (\n <div className=\"modal-overlay\" onClick={() => setShowModal(false)}>\n <div className=\"modal-content-custom\" onClick={(e) => e.stopPropagation()}>\n <div className=\"modal-header-custom\">\n <h5 className=\"modal-title-custom\">\n <i className=\"fas fa-columns\" />\n Gestionar Columnas\n </h5>\n <button className=\"modal-close-btn\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-times\" />\n </button>\n </div>\n\n <div className=\"modal-body-custom\">\n <div className=\"column-actions\">\n <button className=\"btn-column-action\" onClick={selectAllColumns}>\n <i className=\"fas fa-check-double\" />\n Seleccionar Todo\n </button>\n <button className=\"btn-column-action\" onClick={deselectAllColumns}>\n <i className=\"fas fa-times\" />\n Deseleccionar Todo\n </button>\n </div>\n\n {columnas.map((col) => (\n <div key={col.name} className=\"column-checkbox-wrapper\">\n <label className=\"column-checkbox\">\n <input\n type=\"checkbox\"\n checked={visibleColumns.includes(col.name)}\n onChange={() => handleColumnVisibilityChange(col.name)}\n />\n <span style={{ marginLeft: '8px' }}>{col.name}</span>\n </label>\n </div>\n ))}\n </div>\n\n <div className=\"modal-footer-custom\">\n <button className=\"btn-modal btn-modal-light\" onClick={() => setShowModal(false)}>\n Cerrar\n </button>\n <button className=\"btn-modal btn-modal-primary\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-check\" />\n Aplicar\n </button>\n </div>\n </div>\n </div>\n )}\n </section>\n );\n};\n\nexport default ApexTable;\n","import React, { useState, useEffect } from \"react\";\n\ninterface DebouncedInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string | number;\n onChange: (value: string | number) => void;\n debounce?: number;\n}\n\nconst DebouncedInput: React.FC<DebouncedInputProps> = ({\n value: initialValue,\n onChange,\n debounce = 300,\n ...props\n}) => {\n const [value, setValue] = useState(initialValue);\n\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n onChange(value);\n }, debounce);\n\n return () => clearTimeout(timeout);\n }, [value, debounce, onChange]);\n\n return (\n <input\n {...props}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n );\n};\n\nexport default DebouncedInput;\n"],"mappings":"AACyB,SAARA,EAA6BC,EAAK,CAAE,SAAAC,CAAS,EAAI,CAAC,EAAG,CAC1D,GAAI,CAACD,GAAO,OAAO,SAAa,IAAa,OAE7C,IAAME,EAAO,SAAS,MAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC/DC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WAETF,IAAa,OACXC,EAAK,WACPA,EAAK,aAAaC,EAAOD,EAAK,UAAU,EAK1CA,EAAK,YAAYC,CAAK,EAGpBA,EAAM,WACRA,EAAM,WAAW,QAAUH,EAE3BG,EAAM,YAAY,SAAS,eAAeH,CAAG,CAAC,CAElD,CCvB8BI,EAAY;AAAA,CAAumN,ECA3pN,OAAgB,YAAAC,EAAU,aAAAC,EAAW,WAAAC,EAAS,UAAAC,OAAc,QAC5D,OAAOC,OAAe,6BAEtB,OAAS,WAAAC,OAAe,YACxB,OAAS,SAAAC,OAAa,QACtB,OAAOC,OAAe,kBACtB,OAAOC,OAAU,cCNjB,OAAgB,YAAAC,GAAU,aAAAC,MAAiB,QA6BvC,cAAAC,OAAA,oBArBJ,IAAMC,GAAgD,CAAC,CACrD,MAAOC,EACP,SAAAC,EACA,SAAAC,EAAW,IACX,GAAGC,CACL,IAAM,CACJ,GAAM,CAACC,EAAOC,CAAQ,EAAIT,GAASI,CAAY,EAE/C,OAAAH,EAAU,IAAM,CACdQ,EAASL,CAAY,CACvB,EAAG,CAACA,CAAY,CAAC,EAEjBH,EAAU,IAAM,CACd,IAAMS,EAAU,WAAW,IAAM,CAC/BL,EAASG,CAAK,CAChB,EAAGF,CAAQ,EAEX,MAAO,IAAM,aAAaI,CAAO,CACnC,EAAG,CAACF,EAAOF,EAAUD,CAAQ,CAAC,EAG5BH,GAAC,SACE,GAAGK,EACJ,MAAOC,EACP,SAAWG,GAAMF,EAASE,EAAE,OAAO,KAAK,EAC1C,CAEJ,EAEOC,EAAQT,GDyWK,cAAAU,EAQR,QAAAC,MARQ,oBAjWpB,IAAMC,GAAY,CAAgC,CAC9C,MAAAC,EAAQ,CAAC,EACT,SAAAC,EAAW,CAAC,EACZ,cAAAC,EAAgB,GAChB,eAAAC,EAAiB,GACjB,wBAAAC,EACA,sBAAAC,EACA,qBAAAC,EAAuB,CAAC,EACxB,cAAAC,EAAgB,YAChB,GAAGC,CACP,IAAyB,CAGrB,IAAMC,EAAaC,EAAQ,IAAM,CAC7B,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAMC,EAAO,OAAO,SAAS,SACvBC,EAAWX,EAAS,IAAIY,GAAKA,EAAE,IAAI,EAAE,KAAK,GAAG,EAC/CC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIH,EAAS,OAAQG,IAAK,CACtC,IAAMC,EAAOJ,EAAS,WAAWG,CAAC,EAClCD,GAASA,GAAQ,GAAKA,EAAQE,EAC9BF,GAAQ,CACZ,CACA,MAAO,GAAGP,CAAa,IAAII,CAAI,IAAIG,CAAI,EAC3C,EAAG,CAACb,EAAUM,CAAa,CAAC,EAEtB,CAACU,EAAaC,CAAc,EAAIC,EAAiB,IAC/C,OAAO,OAAW,IAAoB,GAC5B,aAAa,QAAQ,GAAGV,CAAU,SAAS,GACzC,EACnB,EAEK,CAACW,EAAcC,CAAe,EAAIF,EAAcnB,CAAK,EAErD,CAACsB,EAAgBC,CAAiB,EAAIJ,EAAmB,IAAM,CACjE,IAAMK,EAAWvB,EAAS,IAAKwB,GAAQA,EAAI,IAAI,EAC/C,GAAI,OAAO,OAAW,IAAa,OAAOD,EAC1C,IAAME,EAAQ,aAAa,QAAQ,GAAGjB,CAAU,UAAU,EAC1D,GAAI,CAACiB,EAAO,OAAOF,EAEnB,GAAI,CACA,IAAMG,EAAS,KAAK,MAAMD,CAAK,EACzBE,EAAaJ,EAAS,OAAOK,GAAQ,CAACF,EAAO,SAASE,CAAI,CAAC,EACjE,MAAO,CAAC,GAAGF,EAAQ,GAAGC,CAAU,CACpC,MAAY,CACR,OAAOJ,CACX,CACJ,CAAC,EAEK,CAACM,EAAWC,CAAY,EAAIZ,EAAS,EAAK,EAC1C,CAACa,EAAaC,CAAc,EAAId,EAAS,EAAK,EAE9C,CAACe,EAAeC,CAAgB,EAAIhB,EAAmB,IAAM,CAC/D,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,IAAMO,EAAQ,aAAa,QAAQ,GAAGjB,CAAU,SAAS,EACzD,OAAOiB,EAAQ,KAAK,MAAMA,CAAK,EAAI,CAAC,CACxC,CAAC,EAEK,CAACU,EAAcC,CAAe,EAAIlB,EAAiC,CAAC,CAAC,EACrE,CAACmB,EAAYC,CAAa,EAAIpB,EAAuB,IAAM,CAC7D,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,IAAMO,EAAQ,aAAa,QAAQ,GAAGjB,CAAU,OAAO,EACvD,OAAOiB,EAAQ,KAAK,MAAMA,CAAK,EAAI,CAAC,CACxC,CAAC,EAEKc,EAAWC,GAAuB,IAAI,EAG5CC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,WAAY,KAAK,UAAUa,CAAc,CAAC,CAEpF,EAAG,CAACA,EAAgBb,CAAU,CAAC,EAE/BiC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,UAAW,KAAK,UAAUyB,CAAa,CAAC,CAElF,EAAG,CAACA,EAAezB,CAAU,CAAC,EAE9BiC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,UAAWQ,CAAW,CAEhE,EAAG,CAACA,EAAaR,CAAU,CAAC,EAE5BiC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,QAAS,KAAK,UAAU6B,CAAU,CAAC,CAE7E,EAAG,CAACA,EAAY7B,CAAU,CAAC,EAG3BiC,EAAU,IAAM,CACZ,GAAI,CAACjC,EAAY,OAEjB,IAAMkC,EAAe,aAAa,QAAQ,GAAGlC,CAAU,UAAU,EAC3De,EAAWvB,EAAS,IAAIwB,GAAOA,EAAI,IAAI,EAC7C,GAAIkB,EACA,GAAI,CACA,IAAMhB,EAAS,KAAK,MAAMgB,CAAY,EAChCf,EAAaJ,EAAS,OAAOK,GAAQ,CAACF,EAAO,SAASE,CAAI,CAAC,EACjEN,EAAkB,CAAC,GAAGI,EAAQ,GAAGC,CAAU,CAAC,CAChD,MAAY,CACRL,EAAkBC,CAAQ,CAC9B,MAECD,EAAkBC,CAAQ,EAE/B,IAAMoB,EAAc,aAAa,QAAQ,GAAGnC,CAAU,SAAS,EAC9C0B,EAAbS,EAA8B,KAAK,MAAMA,CAAW,EAClC,CAAC,CADkC,EAGzD,IAAMC,EAAY,aAAa,QAAQ,GAAGpC,CAAU,OAAO,EAC5C8B,EAAXM,EAAyB,KAAK,MAAMA,CAAS,EAC9B,CAAC,CAD8B,EAGlD,IAAMC,EAAc,aAAa,QAAQ,GAAGrC,CAAU,SAAS,EAC/DS,EAAe4B,GAAe,EAAE,CACpC,EAAG,CAACrC,CAAU,CAAC,EAEf,IAAMsC,EAAsBC,GAAiC,CACzD,IAAMC,EAAM,OAAOD,CAAW,EAG9B,GAFA9B,EAAe+B,CAAG,EAEd,CAACA,GAAOA,EAAI,SAAW,EAAG,CAC1B5B,EAAgBrB,CAAK,EACrB,MACJ,CAEA,IAAMkD,EAAcD,EAAI,YAAY,EAE9BE,EAAWnD,EAAM,OAAQoD,GAC3B,OAAO,OAAOA,CAAG,EAAE,KAAMC,GACjBA,GAAU,KAAoC,GAC3C,OAAOA,CAAK,EAAE,YAAY,EAAE,SAASH,CAAW,CAC1D,CACL,EAEA7B,EAAgB8B,CAAQ,CAC5B,EAEMG,GAAqBF,GAAW,CAClCG,GAAK,KAAK,CACN,MAAO,qBACP,KAAM,2HAA2H,KAAK,UAAUH,EAAK,KAAM,CAAC,CAAC,SAC7J,MAAO,QACP,mBAAoB,SACxB,CAAC,CACL,EAEAV,EAAU,IAAM,CACZrB,EAAgBrB,CAAK,CACzB,EAAG,CAACA,CAAK,CAAC,EAEV,IAAMwD,GAAc,IAAM,CACtBvB,EAAe,EAAI,EACnB,WAAW,IAAM,CACb,IAAMwB,EAAM,IAAIC,GACVC,EAAc1D,EACf,OAAQwB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EACjD,IAAKA,GAAQA,EAAI,IAAI,EAEpBmC,EAAY5D,EAAM,IAAKoD,GAClBnD,EACF,OAAQwB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EACjD,IAAKA,GAAQ,CACV,IAAI4B,EACJ,OAAI,OAAO5B,EAAI,UAAa,WACxB4B,EAAQ5B,EAAI,SAAS2B,CAAG,EAGxBC,EAASD,EAAY3B,EAAI,QAAe,EAIpC4B,GAAU,MACV,OAAOA,GAAU,SACf,KAAK,UAAUA,CAAK,EACpBA,GAAS,EAEvB,CAAC,CACR,EAEDQ,GAAUJ,EAAK,CACX,KAAM,CAACE,CAAW,EAClB,KAAMC,EACN,OAAQ,GACR,MAAO,OACP,OAAQ,CACJ,OAAQ,SACZ,CACJ,CAAC,EACDH,EAAI,KAAK,UAAU,EACnBxB,EAAe,EAAK,CACxB,EAAG,GAAG,CACV,EAEM6B,GAAgCC,GAAuB,CACzDxC,EAAmByC,GACfA,EAAmB,SAASD,CAAU,EAChCC,EAAmB,OAAQnC,GAASA,IAASkC,CAAU,EACvD,CAAC,GAAGC,EAAoBD,CAAU,CAC5C,CACJ,EAEME,GAAmB,IAAM,CAC3B1C,EAAkBtB,EAAS,IAAKwB,GAAQA,EAAI,IAAI,CAAC,CACrD,EAEMyC,GAAqB,IAAM,CAC7B3C,EAAkB,CAAC,CAAC,CACxB,EAEM4C,EAAkBzD,EACpB,IAAMT,EAAS,OAAQwB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EAChE,CAACxB,EAAUqB,CAAc,CAC7B,EAEM8C,EAAuB1D,EACzB,IAAMyD,EAAgB,OAAQ1C,GAAQS,EAAc,SAAST,EAAI,IAAI,CAAC,EACtE,CAAC0C,EAAiBjC,CAAa,CACnC,EAEMmC,GAAsBxC,GAAiB,CACzCM,EAAkBmC,GACGA,EAAK,SAASzC,CAAI,EAExByC,EAAK,OAAQC,GAAYA,IAAY1C,CAAI,EAE5CyC,EAAK,OAAS,EACP,CAAC,GAAGA,EAAMzC,CAAI,EAElByC,CAEd,CACL,EAEA5B,EAAU,IAAM,CACZ,GAAI,CAACF,EAAS,QAAS,OAEvB,IAAMgC,EAAWhC,EAAS,QAAQ,cAAc,eAAe,EAC/D,GAAI,CAACgC,EAAU,OAEf,IAAMC,EAAWD,EAAS,iBAAiB,gBAAgB,EAC3D,GAAI,CAACC,EAAS,OAAQ,OAEtB,IAAMC,EAAoC,CAAC,EAE3CP,EAAgB,QAAQ,CAAC1C,EAAKkD,IAAU,CACpC,GAAIF,EAASE,CAAK,EAAG,CACjB,IAAMC,EAAQH,EAASE,CAAK,EAAE,sBAAsB,EAAE,MACtDD,EAAUjD,EAAI,IAAI,EAAImD,CAC1B,CACJ,CAAC,EAED,IAAMC,EAAU,OAAO,KAAKzC,CAAY,EAClC0C,EAAU,OAAO,KAAKJ,CAAS,EAElBG,EAAQ,SAAWC,EAAQ,QAG1CA,EAAQ,MAAOC,GAAQ3C,EAAa2C,CAAG,IAAML,EAAUK,CAAG,CAAC,GAG3D1C,EAAgBqC,CAAS,CAEjC,EAAG,CAACP,EAAiB/B,EAAchB,EAAa,MAAM,CAAC,EAEvD,IAAM4D,EAAgBtE,EAAQ,IAAM,CAChC,IAAMuE,EAAkC,CAAC,EACrCC,EAAgB,EAEpB,OAAAd,EAAqB,QAAS3C,GAAQ,CAClCwD,EAAQxD,EAAI,IAAI,EAAIyD,EACpBA,GAAiB9C,EAAaX,EAAI,IAAI,GAAK,CAC/C,CAAC,EAEMwD,CACX,EAAG,CAACb,EAAsBhC,CAAY,CAAC,EAEjC+C,GAAgBzE,EAAQ,IACnB0D,EACF,IAAI,CAAC3C,EAAK2D,IAAe,CACtB,IAAMT,EAAQR,EAAgB,UAAWtD,GAAMA,EAAE,OAASY,EAAI,IAAI,EAC5D4D,EAASL,EAAcvD,EAAI,IAAI,EAErC,GAAIkD,IAAU,IAAMU,IAAW,OAAW,MAAO,GAEjD,IAAMC,EAAQ,GAAKF,EAEnB,MAAO;AAAA,8CACuBT,EAAQ,CAAC;AAAA,+CACRA,EAAQ,CAAC;AAAA;AAAA,gCAExBU,CAAM;AAAA,mCACHC,CAAK;AAAA;AAAA;AAAA;AAAA,8CAIMX,EAAQ,CAAC;AAAA,mCACpBW,EAAQ,CAAC;AAAA;AAAA,iBAGhC,CAAC,EACA,KAAK,EAAE,EACb,CAAClB,EAAsBY,EAAeb,CAAe,CAAC,EAEnDoB,GAAmB,CAAC9D,EAAyB+D,IAAwB,CAEvE,GADI/D,EAAI,WAAa,IACjB,CAACA,EAAI,UAAY,CAACA,EAAI,cAAgB,CAACA,EAAI,KAAM,OAErD,IAAMgE,EAAUD,EAAE,SAClBjD,EAAc+B,GAAQ,CAClB,IAAMK,EAAQL,EAAK,UAAUoB,GAAKA,EAAE,aAAejE,EAAI,IAAI,EACvDkE,EAAU,CAAC,GAAGrB,CAAI,EAEtB,GAAKmB,EAUD,GAAId,GAAS,EAAG,CACZ,IAAMiB,EAAWtB,EAAKK,CAAK,EACvBiB,IACEA,EAAS,YAAc,MACvBD,EAAQhB,CAAK,EAAI,CAAE,GAAGiB,EAAU,UAAW,MAAO,EAElDD,EAAQ,OAAOhB,EAAO,CAAC,EAGjC,MACIgB,EAAQ,KAAK,CAAE,WAAYlE,EAAI,KAAM,SAAUA,EAAI,SAAU,aAAcA,EAAI,aAAc,UAAW,KAAM,CAAC,UAnB/GkD,GAAS,EAAG,CACZ,IAAMiB,EAAWtB,EAAKK,CAAK,EACvBiB,IACFD,EAAU,CAAC,CAAE,GAAGC,EAAU,UAAWA,EAAS,YAAc,MAAQ,OAAS,KAAM,CAAC,EAE1F,MACID,EAAU,CAAC,CAAE,WAAYlE,EAAI,KAAM,SAAUA,EAAI,SAAU,aAAcA,EAAI,aAAc,UAAW,KAAM,CAAC,EAgBrH,OAAOkE,CACX,CAAC,CACL,EAEME,GAAkBpE,GAA4B,CAEhD,GADIA,EAAI,WAAa,IACjB,CAACA,EAAI,UAAY,CAACA,EAAI,aAAc,OAAO,KAE/C,IAAMqE,EAAYxD,EAAW,UAAUoD,GAAKA,EAAE,aAAejE,EAAI,IAAI,EAErE,GAAIqE,IAAc,GACd,OACIjG,EAAC,QAAK,UAAU,OAAO,MAAO,CAAE,QAAS,GAAK,SAAU,OAAQ,MAAO,uBAAwB,EAC3F,SAAAA,EAAC,KAAE,UAAU,cAAc,EAC/B,EAIR,IAAMkG,EAASzD,EAAWwD,CAAS,EAC7BE,EAAQD,EAASA,EAAO,YAAc,MAAQ,GACpD,OACIjG,EAAC,QAAK,UAAU,iCAAiC,MAAO,CAAE,SAAU,OAAQ,MAAO,UAAW,WAAY,MAAO,EAC7G,UAAAD,EAAC,KAAE,UAAWmG,EAAQ,iBAAmB,mBAAoB,EAC5D1D,EAAW,OAAS,GACjBzC,EAAC,SAAM,UAAU,OAAO,MAAO,CAAE,SAAU,MAAO,EAC7C,SAAAiG,EAAY,EACjB,GAER,CAER,EAEMG,GAAmB9B,EAAgB,IAAK1C,GAAQ,CAClD,GAAM,CACF,MAAAyE,EACA,OAAQC,EACR,QAAAC,EACA,KAAAC,EACA,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAA5B,EACA,QAAA6B,EACA,GAAGC,CACP,EAAIjF,EAEEkF,EAAWzE,EAAc,SAAST,EAAI,IAAI,EAC1CmF,GAAkBD,GAAYzE,EAAc,OAAS,EACrD2E,EAASX,EAAQ,GAASC,IAAc,GACxCW,EAAmBrF,EAAI,WAAa,KAAUA,EAAI,UAAYA,EAAI,cAExE,MAAO,CACH,GAAGiF,EACH,MAAAR,EACA,OAAAW,EACA,QAAAT,EACA,KAAMC,IAAS,OAAYA,EAAO,GAClC,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAA5B,EACA,QAAA6B,EACA,SAAU,GACV,KACI3G,EAAC,OACG,UAAU,wBACV,QAAU0F,GAAM,CACZA,EAAE,gBAAgB,EACdsB,GAAkBvB,GAAiB9D,EAAK+D,CAAC,CACjD,EACA,MAAO,CACH,OAAQsB,EAAmB,UAAY,UACvC,QAAS,OACT,WAAY,SACZ,MAAO,OACP,eAAgBD,EAAS,SAAWX,EAAQ,WAAa,aACzD,WAAY,MAChB,EACA,MAAOY,EAAmB,uEAAsE,GAEhG,UAAAhH,EAAC,SAAM,UAAU,wBAAwB,QAAU0F,GAAMA,EAAE,gBAAgB,EACvE,UAAA3F,EAAC,SACG,KAAK,WACL,UAAU,wBACV,QAAS8G,EACT,SAAU,CAACC,GACX,SAAU,IAAMvC,GAAmB5C,EAAI,IAAI,EAC/C,EACA5B,EAAC,QAAK,UAAU,4BACZ,SAAAA,EAAC,KAAE,UAAU,mBAAmB,EACpC,GACJ,EACAA,EAAC,QAAK,UAAU,qBAAqB,MAAO,CAAE,WAAY,KAAM,EAAI,SAAA4B,EAAI,KAAK,EAC5EqF,GAAoBjB,GAAepE,CAAG,GAC3C,CAER,CACJ,CAAC,EAEKsF,GAAarG,EAAQ,IACnB4B,EAAW,SAAW,EAAUlB,EAE7B,CAAC,GAAGA,CAAY,EAAE,KAAK,CAAC4F,EAAGC,IAAM,CACpC,QAASlG,EAAI,EAAGA,EAAIuB,EAAW,OAAQvB,IAAK,CACxC,IAAMgF,EAASzD,EAAWvB,CAAC,EAC3B,GAAI,CAACgF,EAAQ,SAEb,GAAM,CAAE,SAAAmB,EAAU,aAAAC,EAAc,UAAAC,CAAU,EAAIrB,EACxCsB,EAAgBD,IAAc,MAAQ,EAAI,GAEhD,GAAID,EAAc,CACd,IAAMG,EAAMH,EAAaH,EAAGC,CAAC,EAC7B,GAAIK,IAAQ,EAAG,OAAOA,EAAMD,EAC5B,QACJ,CAEA,GAAI,CAACH,EAAU,SAEf,IAAIK,EAAO,OAAOL,GAAa,WAAaA,EAASF,CAAC,EAAKA,EAAUE,CAAQ,EACzEM,EAAO,OAAON,GAAa,WAAaA,EAASD,CAAC,EAAKA,EAAUC,CAAQ,EAK7E,GAHAK,EAAOA,GAAQ,GACfC,EAAOA,GAAQ,GAEX,OAAOD,GAAS,UAAY,OAAOC,GAAS,SAAU,CACtD,IAAMC,EAAOF,EAAK,cAAcC,EAAM,OAAW,CAAE,QAAS,GAAM,YAAa,MAAO,CAAC,EACvF,GAAIC,IAAS,EAAG,OAAOA,EAAOJ,CAClC,SAAW,OAAOE,GAAS,UAAY,OAAOC,GAAS,UACnD,GAAID,IAASC,EAAM,OAAQD,EAAOC,GAAQH,MACvC,CACH,GAAIE,EAAOC,EAAM,MAAO,GAAKH,EAC7B,GAAIE,EAAOC,EAAM,MAAO,GAAIH,CAChC,CACJ,CACA,MAAO,EACX,CAAC,EACF,CAACjG,EAAckB,CAAU,CAAC,EAEvBoF,GAAe,CACjB,QAAS,CACL,MAAO,CACH,gBAAiB,sBACjB,aAAc,mCACd,WAAY,MACZ,SAAU,OACV,MAAO,wBACP,UAAW,MACf,CACJ,EACA,UAAW,CACP,MAAO,CACH,YAAa,OACb,aAAc,OACd,eAAgB,SAChB,UAAW,QACf,CACJ,EACA,KAAM,CACF,MAAO,CACH,SAAU,OACV,MAAO,qBACP,gBAAiB,eACjB,UAAW,OACX,UAAW,CACP,gBAAiB,yBACjB,OAAQ,UACR,WAAY,6BACZ,MAAO,oBACX,CACJ,EACA,aAAc,CACV,gBAAiB,0BACjB,MAAO,oBACX,CACJ,EACA,MAAO,CACH,MAAO,CACH,YAAa,OACb,aAAc,OACd,eAAgB,SAChB,UAAW,QACf,CACJ,EACA,WAAY,CACR,MAAO,CACH,UAAW,mCACX,SAAU,OACV,UAAW,OACX,gBAAiB,eACjB,MAAO,oBACX,EACA,iBAAkB,CACd,MAAO,qBACP,KAAM,qBACN,aAAc,CACV,MAAO,0BACP,KAAM,yBACV,EACA,yBAA0B,CACtB,gBAAiB,wBACrB,EACA,UAAW,CACP,QAAS,OACT,gBAAiB,wBACrB,CACJ,CACJ,CACJ,EAEMC,GAAUjH,EAAQ,IAAM,CAC1B,GAAI,CAACV,GAASA,EAAM,SAAW,GAAK,CAACA,EAAM,CAAC,EAAG,MAAO,CAAC,EAEvD,IAAM4H,EAAe,OAAO,KAAK5H,EAAM,CAAC,CAAC,EACnC6H,EAAsB,CAAC,EAE7BD,EAAa,QAAQ7C,GAAO,CACxB,GAAI,CAAC,aAAc,aAAc,YAAY,EAAE,SAASA,CAAG,EAAG,OAE9D,IAAM+C,EAAa9H,EAAM,KAAKoD,GAAOA,EAAI2B,CAAG,IAAM,MAAQ3B,EAAI2B,CAAG,IAAM,MAAS,EAChF,GAAI+C,EAAY,CACZ,IAAM7E,EAAM6E,EAAW/C,CAAG,EAC1B,GAAI,OAAO9B,GAAQ,UAAY,EAAEA,aAAe,MAC5C,OAEJ4E,EAAU,KAAK9C,CAAG,CACtB,MACI8C,EAAU,KAAK9C,CAAG,CAE1B,CAAC,EAED,IAAMgD,EAAWF,EAAU,IAAI,IAAM,EAAE,EACjCG,EAAYH,EACZI,EAAYjI,EAAM,IAAIoD,GACjByE,EAAU,IAAI9C,GAAO,CACxB,IAAM9B,EAAMG,EAAI2B,CAAG,EACnB,OAAO9B,GAA0C,EACrD,CAAC,CACJ,EAED,MAAO,CAAC8E,EAAUC,EAAW,GAAGC,CAAS,CAC7C,EAAG,CAACjI,CAAK,CAAC,EAEV,OACIF,EAAC,WAAQ,UAAU,oBACf,UAAAD,EAAC,SAAO,SAAAsF,GAAc,EAEtBrF,EAAC,OAAI,UAAU,sBAAsB,IAAK0C,EACtC,UAAA3C,EAAC,OAAI,UAAU,uBAAuB,OAAQK,EAC1C,SAAAL,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,EAChE,SAAAC,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,eAAgB,gBAAiB,WAAY,SAAU,IAAK,MAAO,EAChH,UAAAA,EAAC,OAAI,UAAU,uBACX,UAAAD,EAAC,KAAE,UAAU,4BAA4B,EACzCA,EAACqI,EAAA,CACG,MAAOjH,EACP,SAAU8B,EACV,YAAY,gCACZ,UAAU,eACd,GACJ,EAEAjD,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,OAAQ,SAAU,MAAO,EAC/E,UAAAA,EAAC,QAAK,UAAU,cACX,UAAAsB,EAAa,OAAO,OAAKpB,EAAM,OAAO,cAC3C,EAEAF,EAAC,OAAI,UAAU,iBACX,UAAAD,EAACsI,GAAA,CACG,KAAMR,GACN,SAAU,UAAU,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,OAC1D,MAAO,CAAE,eAAgB,MAAO,EAEhC,SAAA7H,EAAC,UAAO,UAAU,qBACd,UAAAD,EAAC,KAAE,UAAU,kBAAkB,EAC/BA,EAAC,QAAK,eAAG,GACb,EACJ,EAEAC,EAAC,UACG,QAAS0D,GACT,UAAU,qBACV,SAAUxB,EAEV,UAAAnC,EAAC,KAAE,UAAU,kBAAkB,EAC/BA,EAAC,QACI,SAAAmC,EAAc,gBAAkB,MACrC,GACJ,EAEAlC,EAAC,UACG,UAAU,yBACV,QAAS,IAAMiC,EAAa,EAAI,EAEhC,UAAAlC,EAAC,KAAE,UAAU,iBAAiB,EAC9BA,EAAC,QAAK,oBAAQ,GAClB,GACJ,GACJ,GACJ,EACJ,EACJ,EAEAC,EAAC,OAAI,UAAU,oBACX,UAAAD,EAAC,KAAE,UAAU,qBAAqB,EAClCC,EAAC,QAAK,+BACgBD,EAAC,KAAE,UAAU,mBAAmB,EAAI,kCAC1D,GACJ,EAEAA,EAACuI,GAAA,CACG,QAASnC,GACT,KAAMc,GACN,WAAU,GACV,kBAAmB,GACnB,6BAA8B,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EACpD,QAAO,GACP,iBAAgB,GAChB,eAAc,GACd,WAAU,GACV,YAAW,GACX,wBAAwB,sBACxB,mBAAoBzD,GACpB,aAAcoE,GACd,eAAgBvH,EAChB,wBAAyBC,EACzB,sBAAuBC,EACvB,qBAAsBC,EACrB,GAAGE,EACJ,gBACIV,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,UAAW,SAAmB,MAAO,SAAU,EAC1E,UAAAD,EAAC,KAAE,UAAU,eAAe,MAAO,CAAE,SAAU,OAAQ,aAAc,OAAQ,QAAS,EAAI,EAAG,EAC7FA,EAAC,KAAE,MAAO,CAAE,OAAQ,EAAG,SAAU,MAAO,EAAG,uCAA2B,GAC1E,EAER,GACJ,EAGCiC,GACGjC,EAAC,OAAI,UAAU,gBAAgB,QAAS,IAAMkC,EAAa,EAAK,EAC5D,SAAAjC,EAAC,OAAI,UAAU,uBAAuB,QAAU,GAAM,EAAE,gBAAgB,EACpE,UAAAA,EAAC,OAAI,UAAU,sBACX,UAAAA,EAAC,MAAG,UAAU,qBACV,UAAAD,EAAC,KAAE,UAAU,iBAAiB,EAAE,sBAEpC,EACAA,EAAC,UAAO,UAAU,kBAAkB,QAAS,IAAMkC,EAAa,EAAK,EACjE,SAAAlC,EAAC,KAAE,UAAU,eAAe,EAChC,GACJ,EAEAC,EAAC,OAAI,UAAU,oBACX,UAAAA,EAAC,OAAI,UAAU,iBACX,UAAAA,EAAC,UAAO,UAAU,oBAAoB,QAASmE,GAC3C,UAAApE,EAAC,KAAE,UAAU,sBAAsB,EAAE,oBAEzC,EACAC,EAAC,UAAO,UAAU,oBAAoB,QAASoE,GAC3C,UAAArE,EAAC,KAAE,UAAU,eAAe,EAAE,sBAElC,GACJ,EAECI,EAAS,IAAKwB,GACX5B,EAAC,OAAmB,UAAU,0BAC1B,SAAAC,EAAC,SAAM,UAAU,kBACb,UAAAD,EAAC,SACG,KAAK,WACL,QAASyB,EAAe,SAASG,EAAI,IAAI,EACzC,SAAU,IAAMqC,GAA6BrC,EAAI,IAAI,EACzD,EACA5B,EAAC,QAAK,MAAO,CAAE,WAAY,KAAM,EAAI,SAAA4B,EAAI,KAAK,GAClD,GARMA,EAAI,IASd,CACH,GACL,EAEA3B,EAAC,OAAI,UAAU,sBACX,UAAAD,EAAC,UAAO,UAAU,4BAA4B,QAAS,IAAMkC,EAAa,EAAK,EAAG,kBAElF,EACAjC,EAAC,UAAO,UAAU,8BAA8B,QAAS,IAAMiC,EAAa,EAAK,EAC7E,UAAAlC,EAAC,KAAE,UAAU,eAAe,EAAE,WAElC,GACJ,GACJ,EACJ,GAER,CAER,EAEOwI,GAAQtI","names":["styleInject","css","insertAt","head","style","styleInject","useState","useEffect","useMemo","useRef","DataTable","CSVLink","jsPDF","autoTable","Swal","useState","useEffect","jsx","DebouncedInput","initialValue","onChange","debounce","props","value","setValue","timeout","e","DebouncedInput_default","jsx","jsxs","ApexTable","datos","columnas","hiddenOptions","expandableRows","expandableRowsComponent","expandableRowExpanded","conditionalRowStyles","storagePrefix","otherProps","storageKey","useMemo","path","colNames","c","hash","i","char","filterValue","setFilterValue","useState","filteredData","setFilteredData","visibleColumns","setVisibleColumns","allNames","col","saved","parsed","newColumns","name","showModal","setShowModal","isExporting","setIsExporting","stickyColumns","setStickyColumns","columnWidths","setColumnWidths","sortConfig","setSortConfig","tableRef","useRef","useEffect","savedVisible","savedSticky","savedSort","savedFilter","handleFilterChange","searchValue","val","searchLower","filtered","row","value","handleDoubleClick","Swal","downloadPDF","doc","jsPDF","tableColumn","tableRows","autoTable","handleColumnVisibilityChange","columnName","prevVisibleColumns","selectAllColumns","deselectAllColumns","filteredColumns","orderedStickyColumns","toggleStickyColumn","prev","colName","firstRow","rowCells","newWidths","index","width","oldKeys","newKeys","key","stickyOffsets","offsets","currentOffset","dynamicStyles","orderIndex","offset","zBase","handleColumnSort","e","isShift","s","updated","existing","renderSortIcon","sortIndex","config","isAsc","processedColumns","right","colCenter","compact","wrap","grow","maxWidth","minWidth","reorder","safeProps","isSticky","canBeMadeSticky","center","isSortableColumn","sortedData","a","b","selector","sortFunction","direction","dirMultiplier","res","valA","valB","comp","customStyles","csvData","originalKeys","validKeys","firstValid","blankRow","headerRow","processed","DebouncedInput_default","CSVLink","DataTable","ApexTable_default"]}
|
|
1
|
+
{"version":3,"sources":["#style-inject:#style-inject","../src/styles/table.css","../src/components/ApexTable.tsx","../src/components/DebouncedInput.tsx"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\":root{--dt-bg: #ffffff;--dt-header-bg: #f8f9fa;--dt-header-text: #495057;--dt-row-text: #212529;--dt-row-hover-bg: #f1f3f5;--dt-row-stripe-bg: #f8f9fa;--dt-border-color: #dee2e6;--dt-disabled-text: #adb5bd;--dt-input-bg: #ffffff;--dt-input-border: #ced4da;--dt-input-text: #495057;--dt-badge-bg: #e7f5ff;--dt-badge-text: #0d6efd;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .1)}html.dark{--dt-bg: #1e293b;--dt-header-bg: #0f172a;--dt-header-text: #e2e8f0;--dt-row-text: #f1f5f9;--dt-row-hover-bg: #334155;--dt-row-stripe-bg: #1e293b;--dt-border-color: #334155;--dt-disabled-text: #64748b;--dt-input-bg: #1e293b;--dt-input-border: #334155;--dt-input-text: #f1f5f9;--dt-badge-bg: #1e293b;--dt-badge-text: #60a5fa;--dt-shadow: 0 1px 3px rgba(0, 0, 0, .5)}.rdt_Table{background:transparent!important}.datatable-container{background:var(--dt-bg);border-radius:1.5rem;box-shadow:var(--dt-shadow);padding:1.5rem;overflow:auto!important;color:var(--dt-row-text);transition:all .2s ease}.rdt_TableHeadRow{background-color:var(--dt-header-bg)!important;border-bottom:2px solid var(--dt-border-color)!important}html.dark .rdt_TableRow{background-color:#1e293b}html.dark .datatable-container{background-color:#1e293b!important;color:#f1f5f9!important}.rdt_TableCell{word-break:normal!important;overflow-wrap:normal!important;white-space:normal!important}.rdt_TableCell .inline-flex,.rdt_TableCell button,.rdt_TableCell a{white-space:nowrap!important}.sticky-info-label{font-size:12px;color:var(--dt-header-text);margin-bottom:12px;display:flex;align-items:center;gap:6px}.custom-header-wrapper{display:flex;align-items:center;gap:8px}.custom-checkbox-label{position:relative;cursor:pointer;width:18px;height:18px}.custom-checkbox-input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.custom-checkbox-checkmark{position:absolute;top:0;left:0;height:18px;width:18px;background-color:var(--dt-input-border);border-radius:4px;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:var(--dt-disabled-text)}.custom-checkbox-label:hover .custom-checkbox-checkmark{background-color:var(--dt-border-color)}.custom-checkbox-input:checked~.custom-checkbox-checkmark{background-color:#0d6efd;color:#fff}.custom-checkbox-input:disabled~.custom-checkbox-checkmark{background-color:var(--dt-header-bg);cursor:not-allowed;opacity:.7}.custom-checkbox-checkmark .fa-thumbtack{font-size:10px;transition:transform .2s ease}.custom-checkbox-input:checked~.custom-checkbox-checkmark .fa-thumbtack{transform:rotate(45deg)}.search-bar-container{background:var(--dt-header-bg);border-radius:8px;padding:16px;margin-bottom:20px;border:1px solid var(--dt-border-color)}.search-input-wrapper{position:relative;flex:1;max-width:400px}.search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dt-header-text);pointer-events:none}.search-input{padding-left:40px!important;border:1px solid var(--dt-input-border);border-radius:6px;padding:10px 12px;font-size:14px;width:100%;transition:all .2s ease;background-color:var(--dt-input-bg);color:var(--dt-input-text)}.search-input:focus{outline:none;border-color:#0d6efd;box-shadow:0 0 0 3px #0d6efd1a}.action-buttons{display:flex;gap:8px;flex-wrap:wrap}.btn-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;font-size:13px;font-weight:500;border-radius:6px;transition:all .2s ease;border:none;cursor:pointer}.btn-action:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.btn-csv{background-color:#198754;color:#fff}.btn-csv:hover{background-color:#157347}.btn-pdf{background-color:#dc3545;color:#fff}.btn-pdf:hover{background-color:#bb2d3b}.btn-columns{background-color:#0d6efd;color:#fff}.btn-columns:hover{background-color:#0b5ed7}.btn-action:disabled{opacity:.6;cursor:not-allowed;transform:none}.stats-badge{display:inline-flex;align-items:center;padding:4px 12px;background:var(--dt-badge-bg);color:var(--dt-badge-text);border-radius:20px;font-size:12px;font-weight:600}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;animation:dtp-fadeIn .2s ease}@keyframes dtp-fadeIn{0%{opacity:0}to{opacity:1}}.modal-content-custom{background:var(--dt-bg);color:var(--dt-row-text);border-radius:12px;box-shadow:var(--dt-shadow);width:90%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;animation:dtp-slideUp .3s ease;border:1px solid var(--dt-border-color)}@keyframes dtp-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.modal-header-custom{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:20px 24px;border-radius:12px 12px 0 0;display:flex;justify-content:space-between;align-items:center}.modal-title-custom{font-weight:600;font-size:18px;margin:0;display:flex;align-items:center;gap:8px}.modal-close-btn{background:#fff3;border:none;color:#fff;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.modal-close-btn:hover{background:#ffffff4d}.modal-body-custom{padding:24px;overflow-y:auto;flex:1}.modal-footer-custom{padding:16px 24px;border-top:1px solid var(--dt-border-color);display:flex;justify-content:flex-end;gap:8px}.column-actions{display:flex;gap:8px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--dt-border-color)}.btn-column-action{flex:1;padding:8px 12px;font-size:13px;border-radius:6px;border:1px solid var(--dt-border-color);background:var(--dt-input-bg);color:var(--dt-row-text);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:4px}.btn-column-action:hover{background:var(--dt-row-hover-bg);border-color:#adb5bd}.column-checkbox-wrapper{padding:10px;border-radius:6px;transition:background-color .2s ease;display:flex;align-items:center}.column-checkbox-wrapper:hover{background-color:var(--dt-row-hover-bg)}.column-checkbox{display:flex;align-items:center;cursor:pointer;font-size:14px;user-select:none}.column-checkbox input{margin-right:8px;cursor:pointer}.btn-modal{padding:8px 16px;font-size:14px;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:6px}.btn-modal-light{background:var(--dt-header-bg);color:var(--dt-header-text)}.btn-modal-light:hover{background:var(--dt-row-hover-bg)}.btn-modal-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.btn-modal-primary:hover{box-shadow:0 4px 12px #667eea66}@media(max-width:768px){.search-bar-container{flex-direction:column;gap:12px}.search-input-wrapper{max-width:100%}.action-buttons{justify-content:stretch}.btn-action{flex:1;justify-content:center}.modal-content-custom{width:95%;margin:10px}}\\n\")","import React, { useState, useEffect, useMemo, useRef } from \"react\";\nimport DataTable from \"react-data-table-component\";\nimport type { TableProps, ConditionalStyles } from \"react-data-table-component\";\nimport { CSVLink } from \"react-csv\";\nimport { jsPDF } from \"jspdf\";\nimport autoTable from \"jspdf-autotable\";\nimport Swal from 'sweetalert2';\nimport DebouncedInput from \"./DebouncedInput\";\n\nconst DataTableComponent: any = (DataTable as any)?.default || DataTable;\n\n\n// Extend TableColumn to include our custom properties\nexport interface ApexTableColumn<T> {\n name: string;\n selector?: (row: T) => any;\n sortable?: boolean;\n sortFunction?: (a: T, b: T) => number;\n right?: boolean;\n center?: boolean;\n compact?: boolean;\n wrap?: boolean;\n grow?: number;\n maxWidth?: string;\n minWidth?: string;\n width?: string;\n cell?: (row: T) => React.ReactNode;\n [key: string]: any;\n}\n\nexport interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'expandableRowExpanded'> {\n datos: T[];\n columnas: ApexTableColumn<T>[];\n hiddenOptions?: boolean;\n expandableRows?: boolean;\n expandableRowsComponent?: React.FC<{ data: T }>;\n expandableRowExpanded?: (row: T) => boolean;\n conditionalRowStyles?: ConditionalStyles<T>[];\n storagePrefix?: string;\n}\n\ninterface SortConfig {\n columnName: string;\n selector?: any;\n sortFunction?: any;\n direction: 'asc' | 'desc';\n}\n\nconst ApexTable = <T extends Record<string, any>>({\n datos = [],\n columnas = [],\n hiddenOptions = false,\n expandableRows = false,\n expandableRowsComponent,\n expandableRowExpanded,\n conditionalRowStyles = [],\n storagePrefix = \"dt_config\",\n ...otherProps\n}: ApexTableProps<T>) => {\n \n // ✅ unique key for this table instance on this page\n const storageKey = useMemo(() => {\n if (typeof window === 'undefined') return '';\n const path = window.location.pathname;\n const colNames = columnas.map(c => c.name).join(',');\n let hash = 0;\n for (let i = 0; i < colNames.length; i++) {\n const char = colNames.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0;\n }\n return `${storagePrefix}_${path}_${hash}`;\n }, [columnas, storagePrefix]);\n\n const [filterValue, setFilterValue] = useState<string>(() => {\n if (typeof window === 'undefined') return \"\";\n const saved = localStorage.getItem(`${storageKey}_filter`);\n return saved || \"\";\n });\n \n const [filteredData, setFilteredData] = useState<T[]>(datos);\n\n const [visibleColumns, setVisibleColumns] = useState<string[]>(() => {\n const allNames = columnas.map((col) => col.name);\n if (typeof window === 'undefined') return allNames;\n const saved = localStorage.getItem(`${storageKey}_visible`);\n if (!saved) return allNames;\n\n try {\n const parsed = JSON.parse(saved);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n return [...parsed, ...newColumns];\n } catch (e) {\n return allNames;\n }\n });\n\n const [showModal, setShowModal] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n\n const [stickyColumns, setStickyColumns] = useState<string[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sticky`);\n return saved ? JSON.parse(saved) : [];\n });\n\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\n const [sortConfig, setSortConfig] = useState<SortConfig[]>(() => {\n if (typeof window === 'undefined') return [];\n const saved = localStorage.getItem(`${storageKey}_sort`);\n return saved ? JSON.parse(saved) : [];\n });\n \n const tableRef = useRef<HTMLDivElement>(null);\n\n // ✅ Sync state to localStorage\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_visible`, JSON.stringify(visibleColumns));\n }\n }, [visibleColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sticky`, JSON.stringify(stickyColumns));\n }\n }, [stickyColumns, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_filter`, filterValue);\n }\n }, [filterValue, storageKey]);\n\n useEffect(() => {\n if (storageKey) {\n localStorage.setItem(`${storageKey}_sort`, JSON.stringify(sortConfig));\n }\n }, [sortConfig, storageKey]);\n\n // ✅ Sync states if columns/hash change without remounting\n useEffect(() => {\n if (!storageKey) return;\n\n const savedVisible = localStorage.getItem(`${storageKey}_visible`);\n const allNames = columnas.map(col => col.name);\n if (savedVisible) {\n try {\n const parsed = JSON.parse(savedVisible);\n const newColumns = allNames.filter(name => !parsed.includes(name));\n setVisibleColumns([...parsed, ...newColumns]);\n } catch (e) {\n setVisibleColumns(allNames);\n }\n }\n else setVisibleColumns(allNames);\n\n const savedSticky = localStorage.getItem(`${storageKey}_sticky`);\n if (savedSticky) setStickyColumns(JSON.parse(savedSticky));\n else setStickyColumns([]);\n\n const savedSort = localStorage.getItem(`${storageKey}_sort`);\n if (savedSort) setSortConfig(JSON.parse(savedSort));\n else setSortConfig([]);\n\n const savedFilter = localStorage.getItem(`${storageKey}_filter`);\n setFilterValue(savedFilter || \"\");\n }, [storageKey]);\n\n const handleFilterChange = (searchValue: string | number) => {\n const val = String(searchValue);\n setFilterValue(val);\n\n if (!val || val.length === 0) {\n setFilteredData(datos);\n return;\n }\n\n const searchLower = val.toLowerCase();\n\n const filtered = datos.filter((row) =>\n Object.values(row).some((value) => {\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n })\n );\n\n setFilteredData(filtered);\n };\n\n const handleDoubleClick = (row: T) => {\n Swal.fire({\n title: 'Detalle de la Fila',\n html: `<pre style=\"text-align: left; font-size: 12px; background: #f4f4f4; padding: 10px; border-radius: 4px; overflow: auto;\">${JSON.stringify(row, null, 2)}</pre>`,\n width: '600px',\n confirmButtonColor: '#764ba2'\n });\n };\n\n useEffect(() => {\n setFilteredData(datos);\n }, [datos]);\n\n const downloadPDF = () => {\n setIsExporting(true);\n setTimeout(() => {\n const doc = new jsPDF() as any;\n const tableColumn = columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => col.name);\n\n const tableRows = datos.map((row) => {\n return columnas\n .filter((col) => visibleColumns.includes(col.name))\n .map((col) => {\n let value;\n if (typeof col.selector === \"function\") {\n value = col.selector(row);\n } else {\n // Basic mapping if selector was a string property name (though we typed it as function)\n value = (row as any)[col.selector as any];\n }\n const formattedValue =\n value !== undefined &&\n value !== null &&\n typeof value === \"object\"\n ? JSON.stringify(value)\n : value || \"\";\n return formattedValue;\n });\n });\n\n autoTable(doc, {\n head: [tableColumn],\n body: tableRows,\n startY: 20,\n theme: \"grid\",\n styles: {\n halign: \"justify\",\n },\n });\n doc.save(\"data.pdf\");\n setIsExporting(false);\n }, 100);\n };\n\n const handleColumnVisibilityChange = (columnName: string) => {\n setVisibleColumns((prevVisibleColumns) =>\n prevVisibleColumns.includes(columnName)\n ? prevVisibleColumns.filter((name) => name !== columnName)\n : [...prevVisibleColumns, columnName]\n );\n };\n\n const selectAllColumns = () => {\n setVisibleColumns(columnas.map((col) => col.name));\n };\n\n const deselectAllColumns = () => {\n setVisibleColumns([]);\n };\n\n const filteredColumns = useMemo(\n () => columnas.filter((col) => visibleColumns.includes(col.name)),\n [columnas, visibleColumns]\n );\n\n const orderedStickyColumns = useMemo(\n () => filteredColumns.filter((col) => stickyColumns.includes(col.name)),\n [filteredColumns, stickyColumns]\n );\n\n const toggleStickyColumn = (name: string) => {\n setStickyColumns((prev) => {\n const isSticky = prev.includes(name);\n if (isSticky) {\n return prev.filter((colName) => colName !== name);\n } else {\n if (prev.length < 3) {\n return [...prev, name];\n }\n return prev;\n }\n });\n };\n\n useEffect(() => {\n if (!tableRef.current) return;\n\n const firstRow = tableRef.current.querySelector(\".rdt_TableRow\");\n if (!firstRow) return;\n\n const rowCells = firstRow.querySelectorAll(\".rdt_TableCell\");\n if (!rowCells.length) return;\n\n const newWidths: Record<string, number> = {};\n\n filteredColumns.forEach((col, index) => {\n if (rowCells[index]) {\n const width = rowCells[index].getBoundingClientRect().width;\n newWidths[col.name] = width;\n }\n });\n\n const oldKeys = Object.keys(columnWidths);\n const newKeys = Object.keys(newWidths);\n\n const sameLength = oldKeys.length === newKeys.length;\n const sameValues =\n sameLength &&\n newKeys.every((key) => columnWidths[key] === newWidths[key]);\n\n if (!sameValues) {\n setColumnWidths(newWidths);\n }\n }, [filteredColumns, columnWidths, filteredData.length]);\n\n const stickyOffsets = useMemo(() => {\n const offsets: Record<string, number> = {};\n let currentOffset = 0;\n\n orderedStickyColumns.forEach((col) => {\n offsets[col.name] = currentOffset;\n currentOffset += columnWidths[col.name] || 0;\n });\n\n return offsets;\n }, [orderedStickyColumns, columnWidths]);\n\n const dynamicStyles = useMemo(() => {\n return orderedStickyColumns\n .map((col, orderIndex) => {\n const index = filteredColumns.findIndex((c) => c.name === col.name);\n const offset = stickyOffsets[col.name];\n\n if (index === -1 || offset === undefined) return \"\";\n\n const zBase = 20 + orderIndex;\n\n return `\n .rdt_TableCol:nth-child(${index + 1}),\n .rdt_TableCell:nth-child(${index + 1}) {\n position: sticky !important;\n left: ${offset}px;\n z-index: ${zBase};\n background-color: var(--dt-row-hover-bg);\n background-clip: padding-box;\n }\n .rdt_TableCol:nth-child(${index + 1}) {\n z-index: ${zBase + 1};\n }\n `;\n })\n .join(\"\");\n }, [orderedStickyColumns, stickyOffsets, filteredColumns]);\n\n const handleColumnSort = (col: ApexTableColumn<T>, e: React.MouseEvent) => {\n if (col.sortable === false) return;\n if (!col.selector && !col.sortFunction && !col.name) return;\n\n const isShift = e.shiftKey;\n setSortConfig(prev => {\n const index = prev.findIndex(s => s.columnName === col.name);\n let updated = [...prev];\n\n if (!isShift) {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n updated = [{ ...existing, direction: existing.direction === 'asc' ? 'desc' : 'asc' }];\n }\n } else {\n updated = [{ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' }];\n }\n } else {\n if (index >= 0) {\n const existing = prev[index];\n if (existing) {\n if (existing.direction === 'asc') {\n updated[index] = { ...existing, direction: 'desc' };\n } else {\n updated.splice(index, 1);\n }\n }\n } else {\n updated.push({ columnName: col.name, selector: col.selector, sortFunction: col.sortFunction, direction: 'asc' });\n }\n }\n return updated;\n });\n };\n\n const renderSortIcon = (col: ApexTableColumn<T>) => {\n if (col.sortable === false) return null;\n if (!col.selector && !col.sortFunction) return null;\n\n const sortIndex = sortConfig.findIndex(s => s.columnName === col.name);\n\n if (sortIndex === -1) {\n return (\n <span className=\"ms-1\" style={{ opacity: 0.3, fontSize: '11px', color: 'var(--dt-header-text)' }}>\n <i className=\"fas fa-sort\"></i>\n </span>\n );\n }\n\n const config = sortConfig[sortIndex];\n const isAsc = config ? config.direction === 'asc' : true;\n return (\n <span className=\"ms-1 d-flex align-items-center\" style={{ fontSize: '12px', color: '#0d6efd', fontWeight: 'bold' }}>\n <i className={isAsc ? \"fas fa-sort-up\" : \"fas fa-sort-down\"}></i>\n {sortConfig.length > 1 && (\n <small className=\"ms-1\" style={{ fontSize: '10px' }}>\n {sortIndex + 1}\n </small>\n )}\n </span>\n );\n };\n\n const processedColumns = filteredColumns.map((col) => {\n const {\n right,\n center: colCenter,\n compact,\n wrap,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n ...safeProps\n } = col;\n\n const isSticky = stickyColumns.includes(col.name);\n const canBeMadeSticky = isSticky || stickyColumns.length < 3;\n const center = right ? false : (colCenter !== false);\n const isSortableColumn = col.sortable !== false && (col.selector || col.sortFunction);\n\n return {\n ...safeProps,\n right,\n center,\n compact,\n wrap: wrap !== undefined ? wrap : true,\n grow,\n maxWidth,\n minWidth,\n width,\n reorder,\n sortable: false, \n name: (\n <div\n className=\"custom-header-wrapper\"\n onClick={(e) => {\n e.stopPropagation();\n if (isSortableColumn) handleColumnSort(col, e);\n }}\n style={{\n cursor: isSortableColumn ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n justifyContent: center ? 'center' : right ? 'flex-end' : 'flex-start',\n userSelect: \"none\"\n }}\n title={isSortableColumn ? \"Clic para ordenar. Shift+clic para ordenar por múltiples columnas\" : \"\"}\n >\n <label className=\"custom-checkbox-label\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n className=\"custom-checkbox-input\"\n checked={isSticky}\n disabled={!canBeMadeSticky}\n onChange={() => toggleStickyColumn(col.name)}\n />\n <span className=\"custom-checkbox-checkmark\">\n <i className=\"fas fa-thumbtack\"></i>\n </span>\n </label>\n <span className=\"custom-header-name\" style={{ marginLeft: '8px' }}>{col.name}</span>\n {isSortableColumn && renderSortIcon(col)}\n </div>\n ),\n };\n });\n\n const sortedData = useMemo(() => {\n if (sortConfig.length === 0) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n for (let i = 0; i < sortConfig.length; i++) {\n const config = sortConfig[i];\n if (!config) continue;\n \n const { selector, sortFunction, direction } = config;\n const dirMultiplier = direction === 'asc' ? 1 : -1;\n\n if (sortFunction) {\n const res = sortFunction(a, b);\n if (res !== 0) return res * dirMultiplier;\n continue;\n }\n\n if (!selector) continue;\n\n let valA = typeof selector === 'function' ? selector(a) : (a as any)[selector];\n let valB = typeof selector === 'function' ? selector(b) : (b as any)[selector];\n\n valA = valA ?? \"\";\n valB = valB ?? \"\";\n\n if (typeof valA === \"string\" && typeof valB === \"string\") {\n const comp = valA.localeCompare(valB, undefined, { numeric: true, sensitivity: 'base' });\n if (comp !== 0) return comp * dirMultiplier;\n } else if (typeof valA === \"number\" && typeof valB === \"number\") {\n if (valA !== valB) return (valA - valB) * dirMultiplier;\n } else {\n if (valA < valB) return -1 * dirMultiplier;\n if (valA > valB) return 1 * dirMultiplier;\n }\n }\n return 0;\n });\n }, [filteredData, sortConfig]);\n\n const customStyles = {\n headRow: {\n style: {\n backgroundColor: \"var(--dt-header-bg)\",\n borderBottom: \"2px solid var(--dt-border-color)\",\n fontWeight: \"600\",\n fontSize: \"14px\",\n color: \"var(--dt-header-text)\",\n minHeight: \"52px\",\n },\n },\n headCells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n rows: {\n style: {\n fontSize: \"13px\",\n color: \"var(--dt-row-text)\",\n backgroundColor: \"var(--dt-bg)\",\n minHeight: \"44px\",\n \"&:hover\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n cursor: \"pointer\",\n transition: \"background-color 0.2s ease\",\n color: \"var(--dt-row-text)\",\n },\n },\n stripedStyle: {\n backgroundColor: \"var(--dt-row-stripe-bg)\",\n color: \"var(--dt-row-text)\",\n },\n },\n cells: {\n style: {\n paddingLeft: \"10px\",\n paddingRight: \"10px\",\n justifyContent: \"center\",\n textAlign: \"center\" as const,\n },\n },\n pagination: {\n style: {\n borderTop: \"1px solid var(--dt-border-color)\",\n fontSize: \"13px\",\n minHeight: \"56px\",\n backgroundColor: \"var(--dt-bg)\",\n color: \"var(--dt-row-text)\",\n },\n pageButtonsStyle: {\n color: \"var(--dt-row-text)\",\n fill: \"var(--dt-row-text)\",\n \"&:disabled\": {\n color: \"var(--dt-disabled-text)\",\n fill: \"var(--dt-disabled-text)\",\n },\n \"&:hover:not(:disabled)\": {\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n \"&:focus\": {\n outline: \"none\",\n backgroundColor: \"var(--dt-row-hover-bg)\",\n },\n },\n },\n };\n\n const csvData = useMemo(() => {\n if (!datos || datos.length === 0 || !datos[0]) return [];\n\n const originalKeys = Object.keys(datos[0]);\n const validKeys: string[] = [];\n\n originalKeys.forEach(key => {\n if (['created_at', 'updated_at', 'deleted_at'].includes(key)) return;\n\n const firstValid = datos.find(row => row[key] !== null && row[key] !== undefined);\n if (firstValid) {\n const val = firstValid[key];\n if (typeof val === 'object' && !(val instanceof Date)) {\n return;\n }\n validKeys.push(key);\n } else {\n validKeys.push(key);\n }\n });\n\n const blankRow = validKeys.map(() => \"\");\n const headerRow = validKeys;\n const processed = datos.map(row => {\n return validKeys.map(key => {\n const val = row[key];\n return val !== null && val !== undefined ? val : \"\";\n });\n });\n\n return [blankRow, headerRow, ...processed];\n }, [datos]);\n\n return (\n <section className=\"apextable-wrapper\">\n <style>{dynamicStyles}</style>\n\n <div className=\"datatable-container\" ref={tableRef}>\n <div className=\"search-bar-container\" hidden={hiddenOptions}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"16px\" }}>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", justifyContent: \"space-between\", alignItems: \"center\", gap: \"16px\" }}>\n <div className=\"search-input-wrapper\">\n <i className=\"fas fa-search search-icon\"></i>\n <DebouncedInput\n value={filterValue}\n onChange={handleFilterChange}\n placeholder=\"Buscar en todos los campos...\"\n className=\"search-input\"\n />\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"12px\", flexWrap: \"wrap\" }}>\n <span className=\"stats-badge\">\n {filteredData.length} de {datos.length} registros\n </span>\n\n <div className=\"action-buttons\">\n <CSVLink\n data={csvData}\n filename={`export_${new Date().toISOString().split('T')[0]}.csv`}\n style={{ textDecoration: \"none\" }}\n >\n <button className=\"btn-action btn-csv\">\n <i className=\"fas fa-file-csv\" />\n <span>CSV</span>\n </button>\n </CSVLink>\n\n <button\n onClick={downloadPDF}\n className=\"btn-action btn-pdf\"\n disabled={isExporting}\n >\n <i className=\"fas fa-file-pdf\" />\n <span>\n {isExporting ? \"Exportando...\" : \"PDF\"}\n </span>\n </button>\n\n <button\n className=\"btn-action btn-columns\"\n onClick={() => setShowModal(true)}\n >\n <i className=\"fas fa-columns\" />\n <span>Columnas</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"sticky-info-label\">\n <i className=\"fas fa-info-circle\"></i>\n <span>\n Use la chincheta (<i className=\"fas fa-thumbtack\"></i>) para fijar hasta 3 columnas.\n </span>\n </div>\n\n <DataTableComponent\n columns={processedColumns as any}\n data={sortedData}\n pagination\n paginationPerPage={15}\n paginationRowsPerPageOptions={[5, 10, 15, 20, 25, 50]}\n striped\n highlightOnHover\n pointerOnHover\n responsive\n fixedHeader\n fixedHeaderScrollHeight=\"calc(100vh - 320px)\"\n onRowDoubleClicked={handleDoubleClick}\n customStyles={customStyles}\n expandableRows={expandableRows}\n expandableRowsComponent={expandableRowsComponent as any}\n expandableRowExpanded={expandableRowExpanded as any}\n conditionalRowStyles={conditionalRowStyles}\n {...otherProps}\n noDataComponent={\n <div style={{ padding: \"40px\", textAlign: \"center\" as const, color: \"#6c757d\" }}>\n <i className=\"fas fa-inbox\" style={{ fontSize: \"48px\", marginBottom: \"16px\", opacity: 0.5 }} />\n <p style={{ margin: 0, fontSize: \"14px\" }}>No se encontraron registros</p>\n </div>\n }\n />\n </div>\n\n {/* Modal de Columnas */}\n {showModal && (\n <div className=\"modal-overlay\" onClick={() => setShowModal(false)}>\n <div className=\"modal-content-custom\" onClick={(e) => e.stopPropagation()}>\n <div className=\"modal-header-custom\">\n <h5 className=\"modal-title-custom\">\n <i className=\"fas fa-columns\" />\n Gestionar Columnas\n </h5>\n <button className=\"modal-close-btn\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-times\" />\n </button>\n </div>\n\n <div className=\"modal-body-custom\">\n <div className=\"column-actions\">\n <button className=\"btn-column-action\" onClick={selectAllColumns}>\n <i className=\"fas fa-check-double\" />\n Seleccionar Todo\n </button>\n <button className=\"btn-column-action\" onClick={deselectAllColumns}>\n <i className=\"fas fa-times\" />\n Deseleccionar Todo\n </button>\n </div>\n\n {columnas.map((col) => (\n <div key={col.name} className=\"column-checkbox-wrapper\">\n <label className=\"column-checkbox\">\n <input\n type=\"checkbox\"\n checked={visibleColumns.includes(col.name)}\n onChange={() => handleColumnVisibilityChange(col.name)}\n />\n <span style={{ marginLeft: '8px' }}>{col.name}</span>\n </label>\n </div>\n ))}\n </div>\n\n <div className=\"modal-footer-custom\">\n <button className=\"btn-modal btn-modal-light\" onClick={() => setShowModal(false)}>\n Cerrar\n </button>\n <button className=\"btn-modal btn-modal-primary\" onClick={() => setShowModal(false)}>\n <i className=\"fas fa-check\" />\n Aplicar\n </button>\n </div>\n </div>\n </div>\n )}\n </section>\n );\n};\n\nexport default ApexTable;\n","import React, { useState, useEffect } from \"react\";\n\ninterface DebouncedInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string | number;\n onChange: (value: string | number) => void;\n debounce?: number;\n}\n\nconst DebouncedInput: React.FC<DebouncedInputProps> = ({\n value: initialValue,\n onChange,\n debounce = 300,\n ...props\n}) => {\n const [value, setValue] = useState(initialValue);\n\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n onChange(value);\n }, debounce);\n\n return () => clearTimeout(timeout);\n }, [value, debounce, onChange]);\n\n return (\n <input\n {...props}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n );\n};\n\nexport default DebouncedInput;\n"],"mappings":"AACyB,SAARA,EAA6BC,EAAK,CAAE,SAAAC,CAAS,EAAI,CAAC,EAAG,CAC1D,GAAI,CAACD,GAAO,OAAO,SAAa,IAAa,OAE7C,IAAME,EAAO,SAAS,MAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC/DC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WAETF,IAAa,OACXC,EAAK,WACPA,EAAK,aAAaC,EAAOD,EAAK,UAAU,EAK1CA,EAAK,YAAYC,CAAK,EAGpBA,EAAM,WACRA,EAAM,WAAW,QAAUH,EAE3BG,EAAM,YAAY,SAAS,eAAeH,CAAG,CAAC,CAElD,CCvB8BI,EAAY;AAAA,CAAumN,ECA3pN,OAAgB,YAAAC,EAAU,aAAAC,EAAW,WAAAC,EAAS,UAAAC,OAAc,QAC5D,OAAOC,MAAe,6BAEtB,OAAS,WAAAC,OAAe,YACxB,OAAS,SAAAC,OAAa,QACtB,OAAOC,OAAe,kBACtB,OAAOC,OAAU,cCNjB,OAAgB,YAAAC,GAAU,aAAAC,MAAiB,QA6BvC,cAAAC,OAAA,oBArBJ,IAAMC,GAAgD,CAAC,CACrD,MAAOC,EACP,SAAAC,EACA,SAAAC,EAAW,IACX,GAAGC,CACL,IAAM,CACJ,GAAM,CAACC,EAAOC,CAAQ,EAAIT,GAASI,CAAY,EAE/C,OAAAH,EAAU,IAAM,CACdQ,EAASL,CAAY,CACvB,EAAG,CAACA,CAAY,CAAC,EAEjBH,EAAU,IAAM,CACd,IAAMS,EAAU,WAAW,IAAM,CAC/BL,EAASG,CAAK,CAChB,EAAGF,CAAQ,EAEX,MAAO,IAAM,aAAaI,CAAO,CACnC,EAAG,CAACF,EAAOF,EAAUD,CAAQ,CAAC,EAG5BH,GAAC,SACE,GAAGK,EACJ,MAAOC,EACP,SAAWG,GAAMF,EAASE,EAAE,OAAO,KAAK,EAC1C,CAEJ,EAEOC,EAAQT,GD4WK,cAAAU,EAQR,QAAAC,MARQ,oBAxYpB,IAAMC,GAA2BC,GAAmB,SAAWA,EAuCzDC,GAAY,CAAgC,CAC9C,MAAAC,EAAQ,CAAC,EACT,SAAAC,EAAW,CAAC,EACZ,cAAAC,EAAgB,GAChB,eAAAC,EAAiB,GACjB,wBAAAC,EACA,sBAAAC,EACA,qBAAAC,EAAuB,CAAC,EACxB,cAAAC,EAAgB,YAChB,GAAGC,CACP,IAAyB,CAGrB,IAAMC,EAAaC,EAAQ,IAAM,CAC7B,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAMC,EAAO,OAAO,SAAS,SACvBC,EAAWX,EAAS,IAAIY,GAAKA,EAAE,IAAI,EAAE,KAAK,GAAG,EAC/CC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIH,EAAS,OAAQG,IAAK,CACtC,IAAMC,EAAOJ,EAAS,WAAWG,CAAC,EAClCD,GAASA,GAAQ,GAAKA,EAAQE,EAC9BF,GAAQ,CACZ,CACA,MAAO,GAAGP,CAAa,IAAII,CAAI,IAAIG,CAAI,EAC3C,EAAG,CAACb,EAAUM,CAAa,CAAC,EAEtB,CAACU,EAAaC,CAAc,EAAIC,EAAiB,IAC/C,OAAO,OAAW,IAAoB,GAC5B,aAAa,QAAQ,GAAGV,CAAU,SAAS,GACzC,EACnB,EAEK,CAACW,EAAcC,CAAe,EAAIF,EAAcnB,CAAK,EAErD,CAACsB,EAAgBC,CAAiB,EAAIJ,EAAmB,IAAM,CACjE,IAAMK,EAAWvB,EAAS,IAAKwB,GAAQA,EAAI,IAAI,EAC/C,GAAI,OAAO,OAAW,IAAa,OAAOD,EAC1C,IAAME,EAAQ,aAAa,QAAQ,GAAGjB,CAAU,UAAU,EAC1D,GAAI,CAACiB,EAAO,OAAOF,EAEnB,GAAI,CACA,IAAMG,EAAS,KAAK,MAAMD,CAAK,EACzBE,EAAaJ,EAAS,OAAOK,GAAQ,CAACF,EAAO,SAASE,CAAI,CAAC,EACjE,MAAO,CAAC,GAAGF,EAAQ,GAAGC,CAAU,CACpC,MAAY,CACR,OAAOJ,CACX,CACJ,CAAC,EAEK,CAACM,EAAWC,CAAY,EAAIZ,EAAS,EAAK,EAC1C,CAACa,EAAaC,CAAc,EAAId,EAAS,EAAK,EAE9C,CAACe,EAAeC,CAAgB,EAAIhB,EAAmB,IAAM,CAC/D,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,IAAMO,EAAQ,aAAa,QAAQ,GAAGjB,CAAU,SAAS,EACzD,OAAOiB,EAAQ,KAAK,MAAMA,CAAK,EAAI,CAAC,CACxC,CAAC,EAEK,CAACU,EAAcC,CAAe,EAAIlB,EAAiC,CAAC,CAAC,EACrE,CAACmB,EAAYC,CAAa,EAAIpB,EAAuB,IAAM,CAC7D,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,IAAMO,EAAQ,aAAa,QAAQ,GAAGjB,CAAU,OAAO,EACvD,OAAOiB,EAAQ,KAAK,MAAMA,CAAK,EAAI,CAAC,CACxC,CAAC,EAEKc,EAAWC,GAAuB,IAAI,EAG5CC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,WAAY,KAAK,UAAUa,CAAc,CAAC,CAEpF,EAAG,CAACA,EAAgBb,CAAU,CAAC,EAE/BiC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,UAAW,KAAK,UAAUyB,CAAa,CAAC,CAElF,EAAG,CAACA,EAAezB,CAAU,CAAC,EAE9BiC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,UAAWQ,CAAW,CAEhE,EAAG,CAACA,EAAaR,CAAU,CAAC,EAE5BiC,EAAU,IAAM,CACRjC,GACA,aAAa,QAAQ,GAAGA,CAAU,QAAS,KAAK,UAAU6B,CAAU,CAAC,CAE7E,EAAG,CAACA,EAAY7B,CAAU,CAAC,EAG3BiC,EAAU,IAAM,CACZ,GAAI,CAACjC,EAAY,OAEjB,IAAMkC,EAAe,aAAa,QAAQ,GAAGlC,CAAU,UAAU,EAC3De,EAAWvB,EAAS,IAAIwB,GAAOA,EAAI,IAAI,EAC7C,GAAIkB,EACA,GAAI,CACA,IAAMhB,EAAS,KAAK,MAAMgB,CAAY,EAChCf,EAAaJ,EAAS,OAAOK,GAAQ,CAACF,EAAO,SAASE,CAAI,CAAC,EACjEN,EAAkB,CAAC,GAAGI,EAAQ,GAAGC,CAAU,CAAC,CAChD,MAAY,CACRL,EAAkBC,CAAQ,CAC9B,MAECD,EAAkBC,CAAQ,EAE/B,IAAMoB,EAAc,aAAa,QAAQ,GAAGnC,CAAU,SAAS,EAC9C0B,EAAbS,EAA8B,KAAK,MAAMA,CAAW,EAClC,CAAC,CADkC,EAGzD,IAAMC,EAAY,aAAa,QAAQ,GAAGpC,CAAU,OAAO,EAC5C8B,EAAXM,EAAyB,KAAK,MAAMA,CAAS,EAC9B,CAAC,CAD8B,EAGlD,IAAMC,EAAc,aAAa,QAAQ,GAAGrC,CAAU,SAAS,EAC/DS,EAAe4B,GAAe,EAAE,CACpC,EAAG,CAACrC,CAAU,CAAC,EAEf,IAAMsC,GAAsBC,GAAiC,CACzD,IAAMC,EAAM,OAAOD,CAAW,EAG9B,GAFA9B,EAAe+B,CAAG,EAEd,CAACA,GAAOA,EAAI,SAAW,EAAG,CAC1B5B,EAAgBrB,CAAK,EACrB,MACJ,CAEA,IAAMkD,EAAcD,EAAI,YAAY,EAE9BE,EAAWnD,EAAM,OAAQoD,GAC3B,OAAO,OAAOA,CAAG,EAAE,KAAMC,GACjBA,GAAU,KAAoC,GAC3C,OAAOA,CAAK,EAAE,YAAY,EAAE,SAASH,CAAW,CAC1D,CACL,EAEA7B,EAAgB8B,CAAQ,CAC5B,EAEMG,GAAqBF,GAAW,CAClCG,GAAK,KAAK,CACN,MAAO,qBACP,KAAM,2HAA2H,KAAK,UAAUH,EAAK,KAAM,CAAC,CAAC,SAC7J,MAAO,QACP,mBAAoB,SACxB,CAAC,CACL,EAEAV,EAAU,IAAM,CACZrB,EAAgBrB,CAAK,CACzB,EAAG,CAACA,CAAK,CAAC,EAEV,IAAMwD,GAAc,IAAM,CACtBvB,EAAe,EAAI,EACnB,WAAW,IAAM,CACb,IAAMwB,EAAM,IAAIC,GACVC,EAAc1D,EACf,OAAQwB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EACjD,IAAKA,GAAQA,EAAI,IAAI,EAEpBmC,EAAY5D,EAAM,IAAKoD,GAClBnD,EACF,OAAQwB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EACjD,IAAKA,GAAQ,CACV,IAAI4B,EACJ,OAAI,OAAO5B,EAAI,UAAa,WACxB4B,EAAQ5B,EAAI,SAAS2B,CAAG,EAGxBC,EAASD,EAAY3B,EAAI,QAAe,EAIpC4B,GAAU,MACV,OAAOA,GAAU,SACf,KAAK,UAAUA,CAAK,EACpBA,GAAS,EAEvB,CAAC,CACR,EAEDQ,GAAUJ,EAAK,CACX,KAAM,CAACE,CAAW,EAClB,KAAMC,EACN,OAAQ,GACR,MAAO,OACP,OAAQ,CACJ,OAAQ,SACZ,CACJ,CAAC,EACDH,EAAI,KAAK,UAAU,EACnBxB,EAAe,EAAK,CACxB,EAAG,GAAG,CACV,EAEM6B,GAAgCC,GAAuB,CACzDxC,EAAmByC,GACfA,EAAmB,SAASD,CAAU,EAChCC,EAAmB,OAAQnC,GAASA,IAASkC,CAAU,EACvD,CAAC,GAAGC,EAAoBD,CAAU,CAC5C,CACJ,EAEME,GAAmB,IAAM,CAC3B1C,EAAkBtB,EAAS,IAAKwB,GAAQA,EAAI,IAAI,CAAC,CACrD,EAEMyC,GAAqB,IAAM,CAC7B3C,EAAkB,CAAC,CAAC,CACxB,EAEM4C,EAAkBzD,EACpB,IAAMT,EAAS,OAAQwB,GAAQH,EAAe,SAASG,EAAI,IAAI,CAAC,EAChE,CAACxB,EAAUqB,CAAc,CAC7B,EAEM8C,EAAuB1D,EACzB,IAAMyD,EAAgB,OAAQ1C,GAAQS,EAAc,SAAST,EAAI,IAAI,CAAC,EACtE,CAAC0C,EAAiBjC,CAAa,CACnC,EAEMmC,GAAsBxC,GAAiB,CACzCM,EAAkBmC,GACGA,EAAK,SAASzC,CAAI,EAExByC,EAAK,OAAQC,GAAYA,IAAY1C,CAAI,EAE5CyC,EAAK,OAAS,EACP,CAAC,GAAGA,EAAMzC,CAAI,EAElByC,CAEd,CACL,EAEA5B,EAAU,IAAM,CACZ,GAAI,CAACF,EAAS,QAAS,OAEvB,IAAMgC,EAAWhC,EAAS,QAAQ,cAAc,eAAe,EAC/D,GAAI,CAACgC,EAAU,OAEf,IAAMC,EAAWD,EAAS,iBAAiB,gBAAgB,EAC3D,GAAI,CAACC,EAAS,OAAQ,OAEtB,IAAMC,EAAoC,CAAC,EAE3CP,EAAgB,QAAQ,CAAC1C,EAAKkD,IAAU,CACpC,GAAIF,EAASE,CAAK,EAAG,CACjB,IAAMC,EAAQH,EAASE,CAAK,EAAE,sBAAsB,EAAE,MACtDD,EAAUjD,EAAI,IAAI,EAAImD,CAC1B,CACJ,CAAC,EAED,IAAMC,EAAU,OAAO,KAAKzC,CAAY,EAClC0C,EAAU,OAAO,KAAKJ,CAAS,EAElBG,EAAQ,SAAWC,EAAQ,QAG1CA,EAAQ,MAAOC,GAAQ3C,EAAa2C,CAAG,IAAML,EAAUK,CAAG,CAAC,GAG3D1C,EAAgBqC,CAAS,CAEjC,EAAG,CAACP,EAAiB/B,EAAchB,EAAa,MAAM,CAAC,EAEvD,IAAM4D,EAAgBtE,EAAQ,IAAM,CAChC,IAAMuE,EAAkC,CAAC,EACrCC,EAAgB,EAEpB,OAAAd,EAAqB,QAAS3C,GAAQ,CAClCwD,EAAQxD,EAAI,IAAI,EAAIyD,EACpBA,GAAiB9C,EAAaX,EAAI,IAAI,GAAK,CAC/C,CAAC,EAEMwD,CACX,EAAG,CAACb,EAAsBhC,CAAY,CAAC,EAEjC+C,GAAgBzE,EAAQ,IACnB0D,EACF,IAAI,CAAC3C,EAAK2D,IAAe,CACtB,IAAMT,EAAQR,EAAgB,UAAWtD,GAAMA,EAAE,OAASY,EAAI,IAAI,EAC5D4D,EAASL,EAAcvD,EAAI,IAAI,EAErC,GAAIkD,IAAU,IAAMU,IAAW,OAAW,MAAO,GAEjD,IAAMC,EAAQ,GAAKF,EAEnB,MAAO;AAAA,8CACuBT,EAAQ,CAAC;AAAA,+CACRA,EAAQ,CAAC;AAAA;AAAA,gCAExBU,CAAM;AAAA,mCACHC,CAAK;AAAA;AAAA;AAAA;AAAA,8CAIMX,EAAQ,CAAC;AAAA,mCACpBW,EAAQ,CAAC;AAAA;AAAA,iBAGhC,CAAC,EACA,KAAK,EAAE,EACb,CAAClB,EAAsBY,EAAeb,CAAe,CAAC,EAEnDoB,GAAmB,CAAC9D,EAAyB+D,IAAwB,CAEvE,GADI/D,EAAI,WAAa,IACjB,CAACA,EAAI,UAAY,CAACA,EAAI,cAAgB,CAACA,EAAI,KAAM,OAErD,IAAMgE,EAAUD,EAAE,SAClBjD,EAAc+B,GAAQ,CAClB,IAAMK,EAAQL,EAAK,UAAUoB,GAAKA,EAAE,aAAejE,EAAI,IAAI,EACvDkE,EAAU,CAAC,GAAGrB,CAAI,EAEtB,GAAKmB,EAUD,GAAId,GAAS,EAAG,CACZ,IAAMiB,EAAWtB,EAAKK,CAAK,EACvBiB,IACEA,EAAS,YAAc,MACvBD,EAAQhB,CAAK,EAAI,CAAE,GAAGiB,EAAU,UAAW,MAAO,EAElDD,EAAQ,OAAOhB,EAAO,CAAC,EAGjC,MACIgB,EAAQ,KAAK,CAAE,WAAYlE,EAAI,KAAM,SAAUA,EAAI,SAAU,aAAcA,EAAI,aAAc,UAAW,KAAM,CAAC,UAnB/GkD,GAAS,EAAG,CACZ,IAAMiB,EAAWtB,EAAKK,CAAK,EACvBiB,IACFD,EAAU,CAAC,CAAE,GAAGC,EAAU,UAAWA,EAAS,YAAc,MAAQ,OAAS,KAAM,CAAC,EAE1F,MACID,EAAU,CAAC,CAAE,WAAYlE,EAAI,KAAM,SAAUA,EAAI,SAAU,aAAcA,EAAI,aAAc,UAAW,KAAM,CAAC,EAgBrH,OAAOkE,CACX,CAAC,CACL,EAEME,GAAkBpE,GAA4B,CAEhD,GADIA,EAAI,WAAa,IACjB,CAACA,EAAI,UAAY,CAACA,EAAI,aAAc,OAAO,KAE/C,IAAMqE,EAAYxD,EAAW,UAAUoD,GAAKA,EAAE,aAAejE,EAAI,IAAI,EAErE,GAAIqE,IAAc,GACd,OACInG,EAAC,QAAK,UAAU,OAAO,MAAO,CAAE,QAAS,GAAK,SAAU,OAAQ,MAAO,uBAAwB,EAC3F,SAAAA,EAAC,KAAE,UAAU,cAAc,EAC/B,EAIR,IAAMoG,EAASzD,EAAWwD,CAAS,EAC7BE,EAAQD,EAASA,EAAO,YAAc,MAAQ,GACpD,OACInG,EAAC,QAAK,UAAU,iCAAiC,MAAO,CAAE,SAAU,OAAQ,MAAO,UAAW,WAAY,MAAO,EAC7G,UAAAD,EAAC,KAAE,UAAWqG,EAAQ,iBAAmB,mBAAoB,EAC5D1D,EAAW,OAAS,GACjB3C,EAAC,SAAM,UAAU,OAAO,MAAO,CAAE,SAAU,MAAO,EAC7C,SAAAmG,EAAY,EACjB,GAER,CAER,EAEMG,GAAmB9B,EAAgB,IAAK1C,GAAQ,CAClD,GAAM,CACF,MAAAyE,EACA,OAAQC,EACR,QAAAC,EACA,KAAAC,EACA,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAA5B,EACA,QAAA6B,EACA,GAAGC,CACP,EAAIjF,EAEEkF,EAAWzE,EAAc,SAAST,EAAI,IAAI,EAC1CmF,GAAkBD,GAAYzE,EAAc,OAAS,EACrD2E,EAASX,EAAQ,GAASC,IAAc,GACxCW,EAAmBrF,EAAI,WAAa,KAAUA,EAAI,UAAYA,EAAI,cAExE,MAAO,CACH,GAAGiF,EACH,MAAAR,EACA,OAAAW,EACA,QAAAT,EACA,KAAMC,IAAS,OAAYA,EAAO,GAClC,KAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAA5B,EACA,QAAA6B,EACA,SAAU,GACV,KACI7G,EAAC,OACG,UAAU,wBACV,QAAU4F,GAAM,CACZA,EAAE,gBAAgB,EACdsB,GAAkBvB,GAAiB9D,EAAK+D,CAAC,CACjD,EACA,MAAO,CACH,OAAQsB,EAAmB,UAAY,UACvC,QAAS,OACT,WAAY,SACZ,MAAO,OACP,eAAgBD,EAAS,SAAWX,EAAQ,WAAa,aACzD,WAAY,MAChB,EACA,MAAOY,EAAmB,uEAAsE,GAEhG,UAAAlH,EAAC,SAAM,UAAU,wBAAwB,QAAU4F,GAAMA,EAAE,gBAAgB,EACvE,UAAA7F,EAAC,SACG,KAAK,WACL,UAAU,wBACV,QAASgH,EACT,SAAU,CAACC,GACX,SAAU,IAAMvC,GAAmB5C,EAAI,IAAI,EAC/C,EACA9B,EAAC,QAAK,UAAU,4BACZ,SAAAA,EAAC,KAAE,UAAU,mBAAmB,EACpC,GACJ,EACAA,EAAC,QAAK,UAAU,qBAAqB,MAAO,CAAE,WAAY,KAAM,EAAI,SAAA8B,EAAI,KAAK,EAC5EqF,GAAoBjB,GAAepE,CAAG,GAC3C,CAER,CACJ,CAAC,EAEKsF,GAAarG,EAAQ,IACnB4B,EAAW,SAAW,EAAUlB,EAE7B,CAAC,GAAGA,CAAY,EAAE,KAAK,CAAC4F,EAAGC,IAAM,CACpC,QAASlG,EAAI,EAAGA,EAAIuB,EAAW,OAAQvB,IAAK,CACxC,IAAMgF,EAASzD,EAAWvB,CAAC,EAC3B,GAAI,CAACgF,EAAQ,SAEb,GAAM,CAAE,SAAAmB,EAAU,aAAAC,EAAc,UAAAC,CAAU,EAAIrB,EACxCsB,EAAgBD,IAAc,MAAQ,EAAI,GAEhD,GAAID,EAAc,CACd,IAAMG,EAAMH,EAAaH,EAAGC,CAAC,EAC7B,GAAIK,IAAQ,EAAG,OAAOA,EAAMD,EAC5B,QACJ,CAEA,GAAI,CAACH,EAAU,SAEf,IAAIK,EAAO,OAAOL,GAAa,WAAaA,EAASF,CAAC,EAAKA,EAAUE,CAAQ,EACzEM,EAAO,OAAON,GAAa,WAAaA,EAASD,CAAC,EAAKA,EAAUC,CAAQ,EAK7E,GAHAK,EAAOA,GAAQ,GACfC,EAAOA,GAAQ,GAEX,OAAOD,GAAS,UAAY,OAAOC,GAAS,SAAU,CACtD,IAAMC,EAAOF,EAAK,cAAcC,EAAM,OAAW,CAAE,QAAS,GAAM,YAAa,MAAO,CAAC,EACvF,GAAIC,IAAS,EAAG,OAAOA,EAAOJ,CAClC,SAAW,OAAOE,GAAS,UAAY,OAAOC,GAAS,UACnD,GAAID,IAASC,EAAM,OAAQD,EAAOC,GAAQH,MACvC,CACH,GAAIE,EAAOC,EAAM,MAAO,GAAKH,EAC7B,GAAIE,EAAOC,EAAM,MAAO,GAAIH,CAChC,CACJ,CACA,MAAO,EACX,CAAC,EACF,CAACjG,EAAckB,CAAU,CAAC,EAEvBoF,GAAe,CACjB,QAAS,CACL,MAAO,CACH,gBAAiB,sBACjB,aAAc,mCACd,WAAY,MACZ,SAAU,OACV,MAAO,wBACP,UAAW,MACf,CACJ,EACA,UAAW,CACP,MAAO,CACH,YAAa,OACb,aAAc,OACd,eAAgB,SAChB,UAAW,QACf,CACJ,EACA,KAAM,CACF,MAAO,CACH,SAAU,OACV,MAAO,qBACP,gBAAiB,eACjB,UAAW,OACX,UAAW,CACP,gBAAiB,yBACjB,OAAQ,UACR,WAAY,6BACZ,MAAO,oBACX,CACJ,EACA,aAAc,CACV,gBAAiB,0BACjB,MAAO,oBACX,CACJ,EACA,MAAO,CACH,MAAO,CACH,YAAa,OACb,aAAc,OACd,eAAgB,SAChB,UAAW,QACf,CACJ,EACA,WAAY,CACR,MAAO,CACH,UAAW,mCACX,SAAU,OACV,UAAW,OACX,gBAAiB,eACjB,MAAO,oBACX,EACA,iBAAkB,CACd,MAAO,qBACP,KAAM,qBACN,aAAc,CACV,MAAO,0BACP,KAAM,yBACV,EACA,yBAA0B,CACtB,gBAAiB,wBACrB,EACA,UAAW,CACP,QAAS,OACT,gBAAiB,wBACrB,CACJ,CACJ,CACJ,EAEMC,GAAUjH,EAAQ,IAAM,CAC1B,GAAI,CAACV,GAASA,EAAM,SAAW,GAAK,CAACA,EAAM,CAAC,EAAG,MAAO,CAAC,EAEvD,IAAM4H,EAAe,OAAO,KAAK5H,EAAM,CAAC,CAAC,EACnC6H,EAAsB,CAAC,EAE7BD,EAAa,QAAQ7C,GAAO,CACxB,GAAI,CAAC,aAAc,aAAc,YAAY,EAAE,SAASA,CAAG,EAAG,OAE9D,IAAM+C,EAAa9H,EAAM,KAAKoD,GAAOA,EAAI2B,CAAG,IAAM,MAAQ3B,EAAI2B,CAAG,IAAM,MAAS,EAChF,GAAI+C,EAAY,CACZ,IAAM7E,EAAM6E,EAAW/C,CAAG,EAC1B,GAAI,OAAO9B,GAAQ,UAAY,EAAEA,aAAe,MAC5C,OAEJ4E,EAAU,KAAK9C,CAAG,CACtB,MACI8C,EAAU,KAAK9C,CAAG,CAE1B,CAAC,EAED,IAAMgD,EAAWF,EAAU,IAAI,IAAM,EAAE,EACjCG,EAAYH,EACZI,EAAYjI,EAAM,IAAIoD,GACjByE,EAAU,IAAI9C,GAAO,CACxB,IAAM9B,EAAMG,EAAI2B,CAAG,EACnB,OAAO9B,GAA0C,EACrD,CAAC,CACJ,EAED,MAAO,CAAC8E,EAAUC,EAAW,GAAGC,CAAS,CAC7C,EAAG,CAACjI,CAAK,CAAC,EAEV,OACIJ,EAAC,WAAQ,UAAU,oBACf,UAAAD,EAAC,SAAO,SAAAwF,GAAc,EAEtBvF,EAAC,OAAI,UAAU,sBAAsB,IAAK4C,EACtC,UAAA7C,EAAC,OAAI,UAAU,uBAAuB,OAAQO,EAC1C,SAAAP,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,MAAO,EAChE,SAAAC,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,eAAgB,gBAAiB,WAAY,SAAU,IAAK,MAAO,EAChH,UAAAA,EAAC,OAAI,UAAU,uBACX,UAAAD,EAAC,KAAE,UAAU,4BAA4B,EACzCA,EAACuI,EAAA,CACG,MAAOjH,EACP,SAAU8B,GACV,YAAY,gCACZ,UAAU,eACd,GACJ,EAEAnD,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,OAAQ,SAAU,MAAO,EAC/E,UAAAA,EAAC,QAAK,UAAU,cACX,UAAAwB,EAAa,OAAO,OAAKpB,EAAM,OAAO,cAC3C,EAEAJ,EAAC,OAAI,UAAU,iBACX,UAAAD,EAACwI,GAAA,CACG,KAAMR,GACN,SAAU,UAAU,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,OAC1D,MAAO,CAAE,eAAgB,MAAO,EAEhC,SAAA/H,EAAC,UAAO,UAAU,qBACd,UAAAD,EAAC,KAAE,UAAU,kBAAkB,EAC/BA,EAAC,QAAK,eAAG,GACb,EACJ,EAEAC,EAAC,UACG,QAAS4D,GACT,UAAU,qBACV,SAAUxB,EAEV,UAAArC,EAAC,KAAE,UAAU,kBAAkB,EAC/BA,EAAC,QACI,SAAAqC,EAAc,gBAAkB,MACrC,GACJ,EAEApC,EAAC,UACG,UAAU,yBACV,QAAS,IAAMmC,EAAa,EAAI,EAEhC,UAAApC,EAAC,KAAE,UAAU,iBAAiB,EAC9BA,EAAC,QAAK,oBAAQ,GAClB,GACJ,GACJ,GACJ,EACJ,EACJ,EAEAC,EAAC,OAAI,UAAU,oBACX,UAAAD,EAAC,KAAE,UAAU,qBAAqB,EAClCC,EAAC,QAAK,+BACgBD,EAAC,KAAE,UAAU,mBAAmB,EAAI,kCAC1D,GACJ,EAEAA,EAACE,GAAA,CACG,QAASoG,GACT,KAAMc,GACN,WAAU,GACV,kBAAmB,GACnB,6BAA8B,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAE,EACpD,QAAO,GACP,iBAAgB,GAChB,eAAc,GACd,WAAU,GACV,YAAW,GACX,wBAAwB,sBACxB,mBAAoBzD,GACpB,aAAcoE,GACd,eAAgBvH,EAChB,wBAAyBC,EACzB,sBAAuBC,EACvB,qBAAsBC,EACrB,GAAGE,EACJ,gBACIZ,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,UAAW,SAAmB,MAAO,SAAU,EAC1E,UAAAD,EAAC,KAAE,UAAU,eAAe,MAAO,CAAE,SAAU,OAAQ,aAAc,OAAQ,QAAS,EAAI,EAAG,EAC7FA,EAAC,KAAE,MAAO,CAAE,OAAQ,EAAG,SAAU,MAAO,EAAG,uCAA2B,GAC1E,EAER,GACJ,EAGCmC,GACGnC,EAAC,OAAI,UAAU,gBAAgB,QAAS,IAAMoC,EAAa,EAAK,EAC5D,SAAAnC,EAAC,OAAI,UAAU,uBAAuB,QAAU,GAAM,EAAE,gBAAgB,EACpE,UAAAA,EAAC,OAAI,UAAU,sBACX,UAAAA,EAAC,MAAG,UAAU,qBACV,UAAAD,EAAC,KAAE,UAAU,iBAAiB,EAAE,sBAEpC,EACAA,EAAC,UAAO,UAAU,kBAAkB,QAAS,IAAMoC,EAAa,EAAK,EACjE,SAAApC,EAAC,KAAE,UAAU,eAAe,EAChC,GACJ,EAEAC,EAAC,OAAI,UAAU,oBACX,UAAAA,EAAC,OAAI,UAAU,iBACX,UAAAA,EAAC,UAAO,UAAU,oBAAoB,QAASqE,GAC3C,UAAAtE,EAAC,KAAE,UAAU,sBAAsB,EAAE,oBAEzC,EACAC,EAAC,UAAO,UAAU,oBAAoB,QAASsE,GAC3C,UAAAvE,EAAC,KAAE,UAAU,eAAe,EAAE,sBAElC,GACJ,EAECM,EAAS,IAAKwB,GACX9B,EAAC,OAAmB,UAAU,0BAC1B,SAAAC,EAAC,SAAM,UAAU,kBACb,UAAAD,EAAC,SACG,KAAK,WACL,QAAS2B,EAAe,SAASG,EAAI,IAAI,EACzC,SAAU,IAAMqC,GAA6BrC,EAAI,IAAI,EACzD,EACA9B,EAAC,QAAK,MAAO,CAAE,WAAY,KAAM,EAAI,SAAA8B,EAAI,KAAK,GAClD,GARMA,EAAI,IASd,CACH,GACL,EAEA7B,EAAC,OAAI,UAAU,sBACX,UAAAD,EAAC,UAAO,UAAU,4BAA4B,QAAS,IAAMoC,EAAa,EAAK,EAAG,kBAElF,EACAnC,EAAC,UAAO,UAAU,8BAA8B,QAAS,IAAMmC,EAAa,EAAK,EAC7E,UAAApC,EAAC,KAAE,UAAU,eAAe,EAAE,WAElC,GACJ,GACJ,EACJ,GAER,CAER,EAEOyI,GAAQrI","names":["styleInject","css","insertAt","head","style","styleInject","useState","useEffect","useMemo","useRef","DataTable","CSVLink","jsPDF","autoTable","Swal","useState","useEffect","jsx","DebouncedInput","initialValue","onChange","debounce","props","value","setValue","timeout","e","DebouncedInput_default","jsx","jsxs","DataTableComponent","DataTable","ApexTable","datos","columnas","hiddenOptions","expandableRows","expandableRowsComponent","expandableRowExpanded","conditionalRowStyles","storagePrefix","otherProps","storageKey","useMemo","path","colNames","c","hash","i","char","filterValue","setFilterValue","useState","filteredData","setFilteredData","visibleColumns","setVisibleColumns","allNames","col","saved","parsed","newColumns","name","showModal","setShowModal","isExporting","setIsExporting","stickyColumns","setStickyColumns","columnWidths","setColumnWidths","sortConfig","setSortConfig","tableRef","useRef","useEffect","savedVisible","savedSticky","savedSort","savedFilter","handleFilterChange","searchValue","val","searchLower","filtered","row","value","handleDoubleClick","Swal","downloadPDF","doc","jsPDF","tableColumn","tableRows","autoTable","handleColumnVisibilityChange","columnName","prevVisibleColumns","selectAllColumns","deselectAllColumns","filteredColumns","orderedStickyColumns","toggleStickyColumn","prev","colName","firstRow","rowCells","newWidths","index","width","oldKeys","newKeys","key","stickyOffsets","offsets","currentOffset","dynamicStyles","orderIndex","offset","zBase","handleColumnSort","e","isShift","s","updated","existing","renderSortIcon","sortIndex","config","isAsc","processedColumns","right","colCenter","compact","wrap","grow","maxWidth","minWidth","reorder","safeProps","isSticky","canBeMadeSticky","center","isSortableColumn","sortedData","a","b","selector","sortFunction","direction","dirMultiplier","res","valA","valB","comp","customStyles","csvData","originalKeys","validKeys","firstValid","blankRow","headerRow","processed","DebouncedInput_default","CSVLink","ApexTable_default"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-apextable-pro",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "ApexTable: A high-performance, professional-grade React data table library with built-in persistence, sticky columns, and advanced exports.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"keywords": [
|
|
18
18
|
"react",
|
|
19
|
+
"react19",
|
|
19
20
|
"datatable",
|
|
20
21
|
"grid",
|
|
21
22
|
"sticky",
|
|
@@ -38,25 +39,25 @@
|
|
|
38
39
|
"jspdf-autotable": "^3.8.2",
|
|
39
40
|
"react": ">=16",
|
|
40
41
|
"react-csv": "^2.2.2",
|
|
41
|
-
"react-data-table-component": "
|
|
42
|
+
"react-data-table-component": ">=7.0.0",
|
|
42
43
|
"react-dom": ">=16",
|
|
43
44
|
"sweetalert2": "^11.10.1"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^
|
|
47
|
-
"@types/react": "^
|
|
48
|
-
"@types/react-dom": "^
|
|
49
|
-
"@vitejs/plugin-react": "^4.
|
|
47
|
+
"@types/node": "^22.0.0",
|
|
48
|
+
"@types/react": "^19.0.0",
|
|
49
|
+
"@types/react-dom": "^19.0.0",
|
|
50
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
50
51
|
"jspdf": "^2.5.1",
|
|
51
52
|
"jspdf-autotable": "^3.8.2",
|
|
52
|
-
"react": "^
|
|
53
|
+
"react": "^19.0.0",
|
|
53
54
|
"react-csv": "^2.2.2",
|
|
54
55
|
"react-data-table-component": "^7.6.2",
|
|
55
|
-
"react-dom": "^
|
|
56
|
-
"sweetalert2": "^11.
|
|
57
|
-
"tsup": "^8.
|
|
58
|
-
"typescript": "^5.
|
|
59
|
-
"vite": "^5.
|
|
56
|
+
"react-dom": "^19.0.0",
|
|
57
|
+
"sweetalert2": "^11.17.2",
|
|
58
|
+
"tsup": "^8.3.6",
|
|
59
|
+
"typescript": "^5.7.3",
|
|
60
|
+
"vite": "^5.4.14"
|
|
60
61
|
},
|
|
61
62
|
"dependencies": {
|
|
62
63
|
"prop-types": "^15.8.1"
|