@datosgeo-atdt/geo-ui 0.10.2 → 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 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"}