react-apextable-pro 1.0.0
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/LICENSE +15 -0
- package/README.md +179 -0
- package/dist/index.d.mts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +15 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, ApexTable Pro Contributors
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# π ApexTable Pro
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/react-apextable-pro)
|
|
6
|
+
[](https://github.com/DavidFranco3/react-apextable-pro)
|
|
7
|
+
[](https://opensource.org/licenses/ISC)
|
|
8
|
+
[](https://www.typescriptlang.org/)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## β¨ Features that set us apart
|
|
13
|
+
|
|
14
|
+
- πΎ **State Persistence**: Never lose your view configuration. ApexTable automatically remembers column visibility, sticky pins, active filters, and sort orders across page reloads.
|
|
15
|
+
- π **Dynamic Sticky Columns**: Fix up to 3 columns to the left. The library automatically calculates pixel-perfect offsets to prevent overlap and maintains background integrity.
|
|
16
|
+
- π **Intelligent Multi-Sort**: Shift+Click to sort by multiple columns. Includes visual indicators and priority numbering (1, 2, 3...).
|
|
17
|
+
- π **Global Smart Filter**: Real-time, debounced search across all table fields with zero extra configuration.
|
|
18
|
+
- π€ **High-Fidelity Exports**: One-click **CSV** and **PDF** generation. PDF exports include auto-calculated table layouts and professional headers.
|
|
19
|
+
- π **Premium Design System**: Built-in support for Dark Mode using CSS variables. Gorgeous, modern aesthetics that feel truly "premium".
|
|
20
|
+
- ποΈ **TypeScript First**: Robust type definitions for `ApexTableColumn` and `ApexTableProps` to catch errors at compile-time.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## π¦ Installation
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install react-apextable-pro
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Required Peer Dependencies
|
|
31
|
+
Ensure these are present in your project:
|
|
32
|
+
```bash
|
|
33
|
+
npm install react-data-table-component react-csv jspdf jspdf-autotable sweetalert2 prop-types
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### External Assets
|
|
37
|
+
ApexTable uses **FontAwesome** for its interactive icons. Add this to your `index.html`:
|
|
38
|
+
```html
|
|
39
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## π Usage Examples
|
|
45
|
+
|
|
46
|
+
### 1. Basic Implementation
|
|
47
|
+
Perfect for simple data listing with full search and persistence.
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import { ApexTable, ApexTableColumn } from 'react-apextable-pro';
|
|
51
|
+
|
|
52
|
+
const data = [
|
|
53
|
+
{ id: 1, name: 'John Doe', role: 'Admin', status: 'Active' },
|
|
54
|
+
{ id: 2, name: 'Jane Smith', role: 'Editor', status: 'Inactive' },
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
const columns: ApexTableColumn<typeof data[0]>[] = [
|
|
58
|
+
{ name: 'ID', selector: row => row.id, sortable: true, width: '80px' },
|
|
59
|
+
{ name: 'Nombre', selector: row => row.name, sortable: true },
|
|
60
|
+
{ name: 'Rol', selector: row => row.role, sortable: true },
|
|
61
|
+
{ name: 'Estado', selector: row => row.status, sortable: true },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
function App() {
|
|
65
|
+
return (
|
|
66
|
+
<div className="container">
|
|
67
|
+
<ApexTable
|
|
68
|
+
datos={data}
|
|
69
|
+
columnas={columns}
|
|
70
|
+
storagePrefix="user_management" // Unique key for state persistence
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. Advanced Performance (Inventory Demo)
|
|
78
|
+
Showcasing custom cell rendering, conditional styling, and expandable rows.
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
import { ApexTable } from 'react-apextable-pro';
|
|
82
|
+
|
|
83
|
+
const columns = [
|
|
84
|
+
{
|
|
85
|
+
name: 'Stock',
|
|
86
|
+
selector: row => row.stock,
|
|
87
|
+
cell: row => (
|
|
88
|
+
<div style={{ color: row.stock < 5 ? 'red' : 'green' }}>
|
|
89
|
+
{row.stock} units
|
|
90
|
+
</div>
|
|
91
|
+
)
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Price',
|
|
95
|
+
selector: row => row.price,
|
|
96
|
+
cell: row => `$${row.price.toFixed(2)}`
|
|
97
|
+
}
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
const ExpandDetails = ({ data }) => (
|
|
101
|
+
<div style={{ padding: '20px' }}>
|
|
102
|
+
<h4>Detailed view for {data.name}</h4>
|
|
103
|
+
<p>Last inventory check: {data.last_check}</p>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
function Inventory() {
|
|
108
|
+
return (
|
|
109
|
+
<ApexTable
|
|
110
|
+
datos={inventoryData}
|
|
111
|
+
columnas={columns}
|
|
112
|
+
expandableRows={true}
|
|
113
|
+
expandableRowsComponent={ExpandDetails}
|
|
114
|
+
conditionalRowStyles={[
|
|
115
|
+
{
|
|
116
|
+
when: row => row.stock === 0,
|
|
117
|
+
style: { backgroundColor: '#fff5f5' }
|
|
118
|
+
}
|
|
119
|
+
]}
|
|
120
|
+
/>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## π API Reference
|
|
128
|
+
|
|
129
|
+
### ApexTable Props
|
|
130
|
+
|
|
131
|
+
| Prop | Type | Default | Description |
|
|
132
|
+
| :--- | :--- | :--- | :--- |
|
|
133
|
+
| `datos` | `T[]` | `[]` | **Required**. The data array to display. |
|
|
134
|
+
| `columnas` | `ApexTableColumn<T>[]` | `[]` | **Required**. Column definitions. |
|
|
135
|
+
| `storagePrefix` | `string` | `"dt_config"` | Prefix for `localStorage` keys to persist state. |
|
|
136
|
+
| `hiddenOptions` | `boolean` | `false` | If true, hides the search bar and action buttons. |
|
|
137
|
+
| `expandableRows` | `boolean` | `false` | Enables expandable row functionality. |
|
|
138
|
+
| `expandableRowsComponent` | `React.FC` | `null` | Component to render when a row is expanded. |
|
|
139
|
+
| `...otherProps` | `TableProps` | `-` | Any prop supported by `react-data-table-component`. |
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## π¨ Design & Customization
|
|
144
|
+
|
|
145
|
+
### Dark Mode
|
|
146
|
+
ApexTable detects dark mode via the `.dark` class on the `<html>` or `<body>` element. It automatically switches colors for:
|
|
147
|
+
- Header background and text.
|
|
148
|
+
- Row background and text.
|
|
149
|
+
- Pagination controls.
|
|
150
|
+
- Modals and inputs.
|
|
151
|
+
|
|
152
|
+
### Custom CSS Variables
|
|
153
|
+
You can override the theme by defining these variables in your CSS:
|
|
154
|
+
|
|
155
|
+
```css
|
|
156
|
+
:root {
|
|
157
|
+
--dt-primary: #764ba2;
|
|
158
|
+
--dt-bg: #ffffff;
|
|
159
|
+
--dt-header-bg: #f8fafc;
|
|
160
|
+
--dt-border-color: #e2e8f0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* Dark mode overrides */
|
|
164
|
+
.dark {
|
|
165
|
+
--dt-bg: #1e293b;
|
|
166
|
+
--dt-header-bg: #0f172a;
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## π€ Contributing
|
|
173
|
+
|
|
174
|
+
We welcome contributions! If you find a bug or have a feature request, please open an issue or submit a pull request on the repository.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## π License
|
|
179
|
+
ApexTable is released under the **ISC License**. Created with β€οΈ by the community.
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { TableProps, ConditionalStyles } from 'react-data-table-component';
|
|
4
|
+
|
|
5
|
+
interface ApexTableColumn<T> {
|
|
6
|
+
name: string;
|
|
7
|
+
selector?: (row: T) => any;
|
|
8
|
+
sortable?: boolean;
|
|
9
|
+
sortFunction?: (a: T, b: T) => number;
|
|
10
|
+
right?: boolean;
|
|
11
|
+
center?: boolean;
|
|
12
|
+
compact?: boolean;
|
|
13
|
+
wrap?: boolean;
|
|
14
|
+
grow?: number;
|
|
15
|
+
maxWidth?: string;
|
|
16
|
+
minWidth?: string;
|
|
17
|
+
width?: string;
|
|
18
|
+
cell?: (row: T) => React.ReactNode;
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
}
|
|
21
|
+
interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'expandableRowExpanded'> {
|
|
22
|
+
datos: T[];
|
|
23
|
+
columnas: ApexTableColumn<T>[];
|
|
24
|
+
hiddenOptions?: boolean;
|
|
25
|
+
expandableRows?: boolean;
|
|
26
|
+
expandableRowsComponent?: React.FC<{
|
|
27
|
+
data: T;
|
|
28
|
+
}>;
|
|
29
|
+
expandableRowExpanded?: (row: T) => boolean;
|
|
30
|
+
conditionalRowStyles?: ConditionalStyles<T>[];
|
|
31
|
+
storagePrefix?: string;
|
|
32
|
+
}
|
|
33
|
+
declare const ApexTable: <T extends Record<string, any>>({ datos, columnas, hiddenOptions, expandableRows, expandableRowsComponent, expandableRowExpanded, conditionalRowStyles, storagePrefix, ...otherProps }: ApexTableProps<T>) => react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
export { ApexTable, type ApexTableColumn, type ApexTableProps };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { TableProps, ConditionalStyles } from 'react-data-table-component';
|
|
4
|
+
|
|
5
|
+
interface ApexTableColumn<T> {
|
|
6
|
+
name: string;
|
|
7
|
+
selector?: (row: T) => any;
|
|
8
|
+
sortable?: boolean;
|
|
9
|
+
sortFunction?: (a: T, b: T) => number;
|
|
10
|
+
right?: boolean;
|
|
11
|
+
center?: boolean;
|
|
12
|
+
compact?: boolean;
|
|
13
|
+
wrap?: boolean;
|
|
14
|
+
grow?: number;
|
|
15
|
+
maxWidth?: string;
|
|
16
|
+
minWidth?: string;
|
|
17
|
+
width?: string;
|
|
18
|
+
cell?: (row: T) => React.ReactNode;
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
}
|
|
21
|
+
interface ApexTableProps<T> extends Omit<TableProps<T>, 'columns' | 'data' | 'expandableRowExpanded'> {
|
|
22
|
+
datos: T[];
|
|
23
|
+
columnas: ApexTableColumn<T>[];
|
|
24
|
+
hiddenOptions?: boolean;
|
|
25
|
+
expandableRows?: boolean;
|
|
26
|
+
expandableRowsComponent?: React.FC<{
|
|
27
|
+
data: T;
|
|
28
|
+
}>;
|
|
29
|
+
expandableRowExpanded?: (row: T) => boolean;
|
|
30
|
+
conditionalRowStyles?: ConditionalStyles<T>[];
|
|
31
|
+
storagePrefix?: string;
|
|
32
|
+
}
|
|
33
|
+
declare const ApexTable: <T extends Record<string, any>>({ datos, columnas, hiddenOptions, expandableRows, expandableRowsComponent, expandableRowExpanded, conditionalRowStyles, storagePrefix, ...otherProps }: ApexTableProps<T>) => react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
export { ApexTable, type ApexTableColumn, type ApexTableProps };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";var we=Object.create;var z=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)z(i,u,{get:l[u],enumerable:!0})},U=(i,l,u,m)=>{if(l&&typeof l=="object"||typeof l=="function")for(let x of Ce(l))!Ne.call(i,x)&&x!==u&&z(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)):{},U(l||!i||!i.__esModule?z(u,"default",{value:i,enumerable:!0}):u,i)),Re=i=>U(z({},"__esModule",{value:!0}),i);var Oe={};Te(Oe,{ApexTable:()=>oe});module.exports=Re(Oe);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"),Q=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"),G=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,G.jsx)("input",{...m,value:x,onChange:S=>_(S.target.value)})},q=Ie;var t=require("react/jsx-runtime"),_e=({datos:i=[],columnas:l=[],hiddenOptions:u=!1,expandableRows:m=!1,expandableRowsComponent:x,expandableRowExpanded:_,conditionalRowStyles:S=[],storagePrefix:B="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`${B}_${e}_${a}`},[l,B]),[A,J]=(0,c.useState)(()=>typeof window>"u"?"":localStorage.getItem(`${p}_filter`)||""),[N,D]=(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),[W,V]=(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`,A)},[A,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`);J(n||"")},[p]);let se=e=>{let o=String(e);if(J(o),!o||o.length===0){D(i);return}let a=o.toLowerCase(),s=i.filter(n=>Object.values(n).some(r=>r==null?!1:String(r).toLowerCase().includes(a)));D(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)(()=>{D(i)},[i]);let le=()=>{V(!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"),V(!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 M=(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=M[e.name];if(a===-1||s===void 0)return"";let n=20+o;return`
|
|
3
|
+
.rdt_TableCol:nth-child(${a+1}),
|
|
4
|
+
.rdt_TableCell:nth-child(${a+1}) {
|
|
5
|
+
position: sticky !important;
|
|
6
|
+
left: ${s}px;
|
|
7
|
+
z-index: ${n};
|
|
8
|
+
background-color: var(--dt-row-hover-bg);
|
|
9
|
+
background-clip: padding-box;
|
|
10
|
+
}
|
|
11
|
+
.rdt_TableCol:nth-child(${a+1}) {
|
|
12
|
+
z-index: ${n+1};
|
|
13
|
+
}
|
|
14
|
+
`}).join(""),[O,M,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,K=C.includes(e.name),ve=K||C.length<3,Y=o?!1:a!==!1,j=e.sortable!==!1&&(e.selector||e.sortFunction);return{...w,right:o,center:Y,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:$=>{$.stopPropagation(),j&&me(e,$)},style:{cursor:j?"pointer":"default",display:"flex",alignItems:"center",width:"100%",justifyContent:Y?"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:$=>$.stopPropagation(),children:[(0,t.jsx)("input",{type:"checkbox",className:"custom-checkbox-input",checked:K,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)(q,{value:A,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:W,children:[(0,t.jsx)("i",{className:"fas fa-file-pdf"}),(0,t.jsx)("span",{children:W?"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)(Q.default,{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=_e;0&&(module.exports={ApexTable});
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
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 xe}from"react";import he 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 me,useEffect as U}from"react";import{jsx as ge}from"react/jsx-runtime";var be=({value:c,onChange:f,debounce:g=300,...b})=>{let[T,j]=me(c);return U(()=>{j(c)},[c]),U(()=>{let R=setTimeout(()=>{f(T)},g);return()=>clearTimeout(R)},[T,g,f]),ge("input",{...b,value:T,onChange:R=>j(R.target.value)})},q=be;import{jsx as s,jsxs as i}from"react/jsx-runtime";var Ce=({datos:c=[],columnas:f=[],hiddenOptions:g=!1,expandableRows:b=!1,expandableRowsComponent:T,expandableRowExpanded:j,conditionalRowStyles:R=[],storagePrefix:B="dt_config",...G})=>{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]),[D,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}}),[Q,_]=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,X]=h({}),[x,E]=h(()=>{if(typeof window>"u")return[];let e=localStorage.getItem(`${d}_sort`);return e?JSON.parse(e):[]}),L=xe(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`,D)},[D,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 Z=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)},ee=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 te=()=>{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)},oe=e=>{S(t=>t.includes(e)?t.filter(o=>o!==e):[...t,e])},ae=()=>{S(f.map(e=>e.name))},ne=()=>{S([])},v=C(()=>f.filter(e=>y.includes(e.name)),[f,y]),$=C(()=>v.filter(e=>N.includes(e.name)),[v,N]),re=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])||X(o)},[v,O,I.length]);let M=C(()=>{let e={},t=0;return $.forEach(o=>{e[o.name]=t,t+=O[o.name]||0}),e},[$,O]),se=C(()=>$.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
|
+
.rdt_TableCol:nth-child(${o+1}),
|
|
4
|
+
.rdt_TableCell:nth-child(${o+1}) {
|
|
5
|
+
position: sticky !important;
|
|
6
|
+
left: ${r}px;
|
|
7
|
+
z-index: ${a};
|
|
8
|
+
background-color: var(--dt-row-hover-bg);
|
|
9
|
+
background-clip: padding-box;
|
|
10
|
+
}
|
|
11
|
+
.rdt_TableCol:nth-child(${o+1}) {
|
|
12
|
+
z-index: ${a+1};
|
|
13
|
+
}
|
|
14
|
+
`}).join(""),[$,M,v]),ie=(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})},le=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})]})},ce=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),ue=K||N.length<3,Y=t?!1:o!==!1,z=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:A=>{A.stopPropagation(),z&&ie(e,A)},style:{cursor:z?"pointer":"default",display:"flex",alignItems:"center",width:"100%",justifyContent:Y?"center":t?"flex-end":"flex-start",userSelect:"none"},title:z?"Clic para ordenar. Shift+clic para ordenar por m\xFAltiples columnas":"",children:[i("label",{className:"custom-checkbox-label",onClick:A=>A.stopPropagation(),children:[s("input",{type:"checkbox",className:"custom-checkbox-input",checked:K,disabled:!ue,onChange:()=>re(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}),z&&le(e)]})}}),de=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]),pe={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)"}}}},fe=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:se}),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:D,onChange:Z,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:fe,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:te,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(he,{columns:ce,data:de,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:ee,customStyles:pe,expandableRows:b,expandableRowsComponent:T,expandableRowExpanded:j,conditionalRowStyles:R,...G,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"})]})})]}),Q&&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:ae,children:[s("i",{className:"fas fa-check-double"}),"Seleccionar Todo"]}),i("button",{className:"btn-column-action",onClick:ne,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:()=>oe(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"]})]})]})})]})},Se=Ce;export{Se as ApexTable};
|
|
15
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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":"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","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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-apextable-pro",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "ApexTable: A high-performance, professional-grade React data table library with built-in persistence, sticky columns, and advanced exports.",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup",
|
|
13
|
+
"dev": "tsup --watch",
|
|
14
|
+
"lint": "tsc --noEmit",
|
|
15
|
+
"example": "vite example"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"react",
|
|
19
|
+
"datatable",
|
|
20
|
+
"grid",
|
|
21
|
+
"sticky",
|
|
22
|
+
"persistence",
|
|
23
|
+
"csv",
|
|
24
|
+
"pdf"
|
|
25
|
+
],
|
|
26
|
+
"author": "David Franco",
|
|
27
|
+
"license": "ISC",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/DavidFranco3/react-apextable-pro.git"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/DavidFranco3/react-apextable-pro/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/DavidFranco3/react-apextable-pro#readme",
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"jspdf": "^2.5.1",
|
|
38
|
+
"jspdf-autotable": "^3.8.2",
|
|
39
|
+
"react": ">=16",
|
|
40
|
+
"react-csv": "^2.2.2",
|
|
41
|
+
"react-data-table-component": "^7.6.2",
|
|
42
|
+
"react-dom": ">=16",
|
|
43
|
+
"sweetalert2": "^11.10.1"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^25.5.0",
|
|
47
|
+
"@types/react": "^18.2.0",
|
|
48
|
+
"@types/react-dom": "^18.2.0",
|
|
49
|
+
"@vitejs/plugin-react": "^4.2.1",
|
|
50
|
+
"jspdf": "^2.5.1",
|
|
51
|
+
"jspdf-autotable": "^3.8.2",
|
|
52
|
+
"react": "^18.2.0",
|
|
53
|
+
"react-csv": "^2.2.2",
|
|
54
|
+
"react-data-table-component": "^7.6.2",
|
|
55
|
+
"react-dom": "^18.2.0",
|
|
56
|
+
"sweetalert2": "^11.10.1",
|
|
57
|
+
"tsup": "^8.0.1",
|
|
58
|
+
"typescript": "^5.3.3",
|
|
59
|
+
"vite": "^5.0.10"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"prop-types": "^15.8.1"
|
|
63
|
+
}
|
|
64
|
+
}
|