@datosgeo-atdt/geo-ui 0.10.1 → 0.11.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/README.md +306 -0
- package/dist/components/DataTable.d.ts +19 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/geo-ui.js +5857 -5733
- package/dist/geo-ui.js.map +1 -1
- package/dist/geo-ui.umd.cjs +57 -57
- package/dist/geo-ui.umd.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@ Librería de componentes reutilizables en React para aplicaciones geoespaciales.
|
|
|
6
6
|
|
|
7
7
|
- **MapaPMTiles**: Componente para renderizar mapas vectoriales usando MapLibre GL y PMTiles
|
|
8
8
|
- **TotalesDisplay**: Componente para mostrar totales y estadísticas con soporte responsive
|
|
9
|
+
- **DataTable**: Componente de tabla flexible con carga automática de CSV
|
|
9
10
|
- **Join CSV**: Unión automática de datos tabulares con geometrías vectoriales
|
|
10
11
|
- **Estilos temáticos**: Soporte para modo booleano y clasificación Jenks
|
|
11
12
|
- **TypeScript**: Completamente tipado para mejor experiencia de desarrollo
|
|
@@ -605,6 +606,311 @@ Puedes sobrescribir los estilos usando tu propio CSS:
|
|
|
605
606
|
|
|
606
607
|
---
|
|
607
608
|
|
|
609
|
+
## DataTable
|
|
610
|
+
|
|
611
|
+
Componente de tabla genérico y flexible para mostrar datos tabulares con soporte para carga automática de CSV desde la carpeta `public`.
|
|
612
|
+
|
|
613
|
+
### Características
|
|
614
|
+
|
|
615
|
+
- **Carga automática de CSV**: Lee archivos CSV desde la carpeta `public` y parsea los datos
|
|
616
|
+
- **Detección automática de columnas**: Extrae los nombres de las columnas directamente del CSV
|
|
617
|
+
- **Columnas personalizables**: Define qué columnas mostrar y su ancho
|
|
618
|
+
- **Tamaño ajustable**: Props `width` y `height` para controlar dimensiones
|
|
619
|
+
- **Formato automático de números**: Formatea números con separadores de miles (estilo mexicano)
|
|
620
|
+
- **Índice opcional**: Puede mostrar numeración de filas
|
|
621
|
+
- **Responsive**: Se adapta automáticamente a móvil
|
|
622
|
+
- **Estados de carga**: Muestra "Cargando datos..." mientras procesa el CSV
|
|
623
|
+
- **Manejo de errores**: Muestra mensajes descriptivos si falla la carga
|
|
624
|
+
- **TypeScript**: Completamente tipado
|
|
625
|
+
|
|
626
|
+
### Uso Básico
|
|
627
|
+
|
|
628
|
+
#### Importar el componente
|
|
629
|
+
|
|
630
|
+
```tsx
|
|
631
|
+
import { DataTable } from '@atdt/geo-ui';
|
|
632
|
+
import '@atdt/geo-ui/style.css';
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
#### Ejemplo 1: Cargar CSV automáticamente desde public/
|
|
636
|
+
|
|
637
|
+
Si tienes un archivo `alcaldias.csv` en la carpeta `public/` de tu proyecto:
|
|
638
|
+
|
|
639
|
+
```csv
|
|
640
|
+
alcaldia,poblacion
|
|
641
|
+
Iztapalapa,1815786
|
|
642
|
+
Gustavo A. Madero,1185772
|
|
643
|
+
Álvaro Obregón,749982
|
|
644
|
+
Tlalpan,677104
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
Simplemente especifica la ruta del archivo:
|
|
648
|
+
|
|
649
|
+
```tsx
|
|
650
|
+
import { DataTable } from '@atdt/geo-ui';
|
|
651
|
+
|
|
652
|
+
function App() {
|
|
653
|
+
return (
|
|
654
|
+
<DataTable
|
|
655
|
+
csvPath="/alcaldias.csv"
|
|
656
|
+
width="600px"
|
|
657
|
+
height="400px"
|
|
658
|
+
/>
|
|
659
|
+
);
|
|
660
|
+
}
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
**El componente automáticamente:**
|
|
664
|
+
- Carga el CSV desde `public/alcaldias.csv`
|
|
665
|
+
- Detecta los nombres de las columnas (`alcaldia`, `poblacion`)
|
|
666
|
+
- Los usa como headers de la tabla
|
|
667
|
+
- Parsea los datos y los muestra
|
|
668
|
+
- Formatea números con separadores de miles (1,815,786)
|
|
669
|
+
|
|
670
|
+
#### Ejemplo 2: Personalizar nombres de columnas
|
|
671
|
+
|
|
672
|
+
Puedes sobrescribir los nombres de las columnas del CSV:
|
|
673
|
+
|
|
674
|
+
```tsx
|
|
675
|
+
import { DataTable } from '@atdt/geo-ui';
|
|
676
|
+
|
|
677
|
+
function App() {
|
|
678
|
+
return (
|
|
679
|
+
<DataTable
|
|
680
|
+
csvPath="/alcaldias.csv"
|
|
681
|
+
columns={[
|
|
682
|
+
{ key: 'alcaldia', label: 'Alcaldía', width: '60%' },
|
|
683
|
+
{ key: 'poblacion', label: 'Población Total', width: '40%' }
|
|
684
|
+
]}
|
|
685
|
+
width="800px"
|
|
686
|
+
height="500px"
|
|
687
|
+
showIndex={true}
|
|
688
|
+
indexLabel="#"
|
|
689
|
+
/>
|
|
690
|
+
);
|
|
691
|
+
}
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
#### Ejemplo 3: Datos directos (sin CSV)
|
|
695
|
+
|
|
696
|
+
También puedes pasar datos directamente sin cargar un CSV:
|
|
697
|
+
|
|
698
|
+
```tsx
|
|
699
|
+
import { DataTable } from '@atdt/geo-ui';
|
|
700
|
+
|
|
701
|
+
function App() {
|
|
702
|
+
const datos = [
|
|
703
|
+
{ nombre: 'Ciudad de México', habitantes: 9209944 },
|
|
704
|
+
{ nombre: 'Guadalajara', habitantes: 1495189 },
|
|
705
|
+
{ nombre: 'Monterrey', habitantes: 1142994 }
|
|
706
|
+
];
|
|
707
|
+
|
|
708
|
+
return (
|
|
709
|
+
<DataTable
|
|
710
|
+
data={datos}
|
|
711
|
+
columns={[
|
|
712
|
+
{ key: 'nombre', label: 'Ciudad', width: '50%' },
|
|
713
|
+
{ key: 'habitantes', label: 'Habitantes', width: '50%' }
|
|
714
|
+
]}
|
|
715
|
+
width="100%"
|
|
716
|
+
/>
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
#### Ejemplo 4: Con índice numérico
|
|
722
|
+
|
|
723
|
+
```tsx
|
|
724
|
+
<DataTable
|
|
725
|
+
csvPath="/datos.csv"
|
|
726
|
+
showIndex={true}
|
|
727
|
+
indexLabel="#"
|
|
728
|
+
width="700px"
|
|
729
|
+
/>
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
#### Ejemplo 5: Tabla responsive
|
|
733
|
+
|
|
734
|
+
```tsx
|
|
735
|
+
// Se adapta automáticamente a móvil
|
|
736
|
+
<DataTable
|
|
737
|
+
csvPath="/estadisticas.csv"
|
|
738
|
+
width="100%"
|
|
739
|
+
height="auto"
|
|
740
|
+
/>
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
### Props de DataTable
|
|
744
|
+
|
|
745
|
+
#### Props de Datos (al menos una opción es requerida)
|
|
746
|
+
|
|
747
|
+
| Prop | Tipo | Descripción |
|
|
748
|
+
|------|------|-------------|
|
|
749
|
+
| `data` | `Record<string, any>[]` | Array de objetos con los datos a mostrar |
|
|
750
|
+
| `csvPath` | `string` | Ruta del archivo CSV en la carpeta `public` (ej: `/datos.csv`) |
|
|
751
|
+
|
|
752
|
+
#### Props de Configuración
|
|
753
|
+
|
|
754
|
+
| Prop | Tipo | Default | Descripción |
|
|
755
|
+
|------|------|---------|-------------|
|
|
756
|
+
| `columns` | `DataTableColumn[]` | Auto-detectado | Definición de columnas a mostrar |
|
|
757
|
+
| `width` | `string` | `"100%"` | Ancho de la tabla |
|
|
758
|
+
| `height` | `string` | `"auto"` | Alto de la tabla |
|
|
759
|
+
| `className` | `string` | `""` | Clases CSS adicionales |
|
|
760
|
+
| `showIndex` | `boolean` | `false` | Mostrar columna con índice numérico |
|
|
761
|
+
| `indexLabel` | `string` | `"#"` | Etiqueta para la columna de índice |
|
|
762
|
+
|
|
763
|
+
#### Tipo DataTableColumn
|
|
764
|
+
|
|
765
|
+
```tsx
|
|
766
|
+
interface DataTableColumn {
|
|
767
|
+
key: string; // Campo del objeto/CSV
|
|
768
|
+
label: string; // Texto a mostrar en el header
|
|
769
|
+
width?: string; // Ancho de la columna (ej: "40%", "200px")
|
|
770
|
+
}
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
### Ejemplos Completos
|
|
774
|
+
|
|
775
|
+
#### Ejemplo con CSV de productos
|
|
776
|
+
|
|
777
|
+
```tsx
|
|
778
|
+
import { DataTable } from '@atdt/geo-ui';
|
|
779
|
+
|
|
780
|
+
// public/productos.csv
|
|
781
|
+
// nombre,categoria,precio,stock
|
|
782
|
+
// Laptop Dell,Electrónica,15999,50
|
|
783
|
+
// Mouse Logitech,Accesorios,299,150
|
|
784
|
+
// Monitor Samsung,Electrónica,4599,30
|
|
785
|
+
|
|
786
|
+
function App() {
|
|
787
|
+
return (
|
|
788
|
+
<DataTable
|
|
789
|
+
csvPath="/productos.csv"
|
|
790
|
+
columns={[
|
|
791
|
+
{ key: 'nombre', label: 'Producto', width: '30%' },
|
|
792
|
+
{ key: 'categoria', label: 'Categoría', width: '25%' },
|
|
793
|
+
{ key: 'precio', label: 'Precio', width: '25%' },
|
|
794
|
+
{ key: 'stock', label: 'Stock', width: '20%' }
|
|
795
|
+
]}
|
|
796
|
+
width="900px"
|
|
797
|
+
height="500px"
|
|
798
|
+
showIndex={true}
|
|
799
|
+
/>
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
#### Ejemplo con datos dinámicos
|
|
805
|
+
|
|
806
|
+
```tsx
|
|
807
|
+
import { DataTable } from '@atdt/geo-ui';
|
|
808
|
+
import { useState, useEffect } from 'react';
|
|
809
|
+
|
|
810
|
+
function App() {
|
|
811
|
+
const [datos, setDatos] = useState([]);
|
|
812
|
+
|
|
813
|
+
useEffect(() => {
|
|
814
|
+
// Cargar datos desde una API
|
|
815
|
+
fetch('https://api.example.com/estadisticas')
|
|
816
|
+
.then(res => res.json())
|
|
817
|
+
.then(data => setDatos(data));
|
|
818
|
+
}, []);
|
|
819
|
+
|
|
820
|
+
return (
|
|
821
|
+
<DataTable
|
|
822
|
+
data={datos}
|
|
823
|
+
columns={[
|
|
824
|
+
{ key: 'region', label: 'Región' },
|
|
825
|
+
{ key: 'total', label: 'Total' }
|
|
826
|
+
]}
|
|
827
|
+
/>
|
|
828
|
+
);
|
|
829
|
+
}
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
#### Ejemplo integrando con MapaPMTiles
|
|
833
|
+
|
|
834
|
+
```tsx
|
|
835
|
+
import { MapaPMTiles, DataTable } from '@atdt/geo-ui';
|
|
836
|
+
import '@atdt/geo-ui/style.css';
|
|
837
|
+
|
|
838
|
+
function App() {
|
|
839
|
+
return (
|
|
840
|
+
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '20px' }}>
|
|
841
|
+
<MapaPMTiles
|
|
842
|
+
csvPath="/datos_entidades.csv"
|
|
843
|
+
fitToIds={["09", "15", "14"]}
|
|
844
|
+
mode="jenks"
|
|
845
|
+
enablePopup={true}
|
|
846
|
+
/>
|
|
847
|
+
|
|
848
|
+
<DataTable
|
|
849
|
+
csvPath="/datos_entidades.csv"
|
|
850
|
+
columns={[
|
|
851
|
+
{ key: 'entidad', label: 'Entidad', width: '60%' },
|
|
852
|
+
{ key: 'valor', label: 'Valor', width: '40%' }
|
|
853
|
+
]}
|
|
854
|
+
width="100%"
|
|
855
|
+
height="600px"
|
|
856
|
+
/>
|
|
857
|
+
</div>
|
|
858
|
+
);
|
|
859
|
+
}
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
### Formato de Números
|
|
863
|
+
|
|
864
|
+
Los números se formatean automáticamente con separadores de miles usando el formato mexicano:
|
|
865
|
+
|
|
866
|
+
- `1815786` → `1,815,786`
|
|
867
|
+
- `9209944` → `9,209,944`
|
|
868
|
+
- `150` → `150`
|
|
869
|
+
|
|
870
|
+
### Estados de Carga
|
|
871
|
+
|
|
872
|
+
El componente muestra diferentes estados:
|
|
873
|
+
|
|
874
|
+
1. **Cargando**: "Cargando datos..." mientras lee el CSV
|
|
875
|
+
2. **Error**: Mensaje de error en rojo si falla la carga
|
|
876
|
+
3. **Vacío**: "No hay datos para mostrar" si el CSV está vacío
|
|
877
|
+
4. **Datos**: Tabla renderizada con los datos
|
|
878
|
+
|
|
879
|
+
### Responsive
|
|
880
|
+
|
|
881
|
+
El componente se adapta automáticamente a diferentes tamaños de pantalla:
|
|
882
|
+
|
|
883
|
+
- **Desktop**: Headers y celdas con tamaño `1.11vw`
|
|
884
|
+
- **Mobile** (≤600px):
|
|
885
|
+
- Headers con tamaño `3.5vw`
|
|
886
|
+
- Celdas con tamaño `4vw`
|
|
887
|
+
- Padding ajustado para pantallas pequeñas
|
|
888
|
+
|
|
889
|
+
### Personalización de Estilos
|
|
890
|
+
|
|
891
|
+
Puedes sobrescribir los estilos usando la clase `className`:
|
|
892
|
+
|
|
893
|
+
```tsx
|
|
894
|
+
<DataTable
|
|
895
|
+
csvPath="/datos.csv"
|
|
896
|
+
className="mi-tabla-custom"
|
|
897
|
+
/>
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
```css
|
|
901
|
+
.mi-tabla-custom {
|
|
902
|
+
border: 2px solid #66827f;
|
|
903
|
+
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
.mi-tabla-custom .tableHeader {
|
|
907
|
+
background-color: #66827f;
|
|
908
|
+
color: white;
|
|
909
|
+
}
|
|
910
|
+
```
|
|
911
|
+
|
|
912
|
+
---
|
|
913
|
+
|
|
608
914
|
## Props de MapaPMTiles
|
|
609
915
|
|
|
610
916
|
### Props Obligatorias
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface DataTableColumn {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
width?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DataTableProps {
|
|
8
|
+
data?: Record<string, any>[];
|
|
9
|
+
columns?: DataTableColumn[];
|
|
10
|
+
csvPath?: string;
|
|
11
|
+
width?: string;
|
|
12
|
+
height?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
showIndex?: boolean;
|
|
15
|
+
indexLabel?: string;
|
|
16
|
+
}
|
|
17
|
+
declare const DataTable: React.FC<DataTableProps>;
|
|
18
|
+
export default DataTable;
|
|
19
|
+
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../src/components/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAqKvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|