@sistemas-ucol-mx/ucol-dynamic 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.
Files changed (2) hide show
  1. package/README.md +445 -0
  2. package/package.json +113 -0
package/README.md ADDED
@@ -0,0 +1,445 @@
1
+ # ucol-dynamic
2
+
3
+ <div align="center">
4
+
5
+ ![Version](https://img.shields.io/badge/version-0.1.23-blue.svg)
6
+ ![React](https://img.shields.io/badge/react-19.0.0-61dafb.svg)
7
+ ![TypeScript](https://img.shields.io/badge/typescript-5.7.3-blue.svg)
8
+ ![Ant Design](https://img.shields.io/badge/antd-5.24.0-1890ff.svg)
9
+ ![TailwindCSS](https://img.shields.io/badge/tailwindcss-4.1.11-38bdf8.svg)
10
+
11
+ **Una librería completa de componentes React para crear interfaces de usuario modernas y dinámicas**
12
+
13
+ [Demo en vivo](https://ucol-dynamic.netlify.app/) | [Documentación](https://github.com/8Wada/ucol-dynamic) | [Reportar un error](https://github.com/8Wada/ucol-dynamic/issues)
14
+
15
+ </div>
16
+
17
+ ---
18
+
19
+ ## 📋 Tabla de Contenidos
20
+
21
+ - [Características](#-características)
22
+ - [Instalación](#-instalación)
23
+ - [Componentes Principales](#-componentes-principales)
24
+ - [Guía de Inicio Rápido](#-guía-de-inicio-rápido)
25
+ - [Documentación de Componentes](#-documentación-de-componentes)
26
+ - [Hooks Personalizados](#-hooks-personalizados)
27
+ - [API y Configuración](#-api-y-configuración)
28
+ - [Desarrollo](#-desarrollo)
29
+ - [Scripts Disponibles](#-scripts-disponibles)
30
+ - [Tecnologías](#-tecnologías)
31
+ - [Contribuir](#-contribuir)
32
+ - [Licencia](#-licencia)
33
+
34
+ ## ✨ Características
35
+
36
+ - 🎨 **Componentes Dinámicos**: Formularios, tablas y CRUD completamente configurables
37
+ - 🔐 **Sistema de Permisos**: Control granular de acceso basado en roles
38
+ - 📊 **Exportación de Datos**: Soporte para Excel y PDF
39
+ - 📤 **Carga Masiva**: Importación de datos mediante archivos Excel/CSV
40
+ - 🎯 **TypeScript First**: Totalmente tipado para mejor experiencia de desarrollo
41
+ - 🚀 **React Query**: Gestión de estado del servidor integrada
42
+ - 💅 **Estilos Modernos**: Combinación de Ant Design y Tailwind CSS
43
+ - 📱 **Responsive**: Diseño adaptable a todos los dispositivos
44
+ - 🎭 **Storybook**: Documentación interactiva de componentes
45
+ - ⚡ **Optimizado**: Bundle optimizado con Vite
46
+
47
+ ## 📦 Instalación
48
+
49
+ ### Usando npm
50
+
51
+ ```bash
52
+ npm install @sistemas-ucol-mx/ucol-dynamic
53
+ ```
54
+
55
+ ### Usando pnpm
56
+
57
+ ```bash
58
+ pnpm install @sistemas-ucol-mx/ucol-dynamic
59
+ ```
60
+
61
+ o
62
+
63
+ ```bash
64
+ pnpm add @sistemas-ucol-mx/ucol-dynamic
65
+ ```
66
+
67
+ ### Usando yarn
68
+
69
+ ```bash
70
+ yarn add @sistemas-ucol-mx/ucol-dynamic
71
+ ```
72
+
73
+ ## 📚 Peer Dependencies
74
+
75
+ La librería requiere las siguientes dependencias instaladas en tu proyecto:
76
+
77
+ ```json
78
+ {
79
+ "antd": "^5.24.0",
80
+ "axios": "^1.7.9",
81
+ "dayjs": "^1.11.13",
82
+ "react": "19.0.0",
83
+ "react-dom": "19.0.0"
84
+ }
85
+ ```
86
+
87
+ ### Instalación de Peer Dependencies
88
+
89
+ ```bash
90
+ npm install antd axios dayjs react react-dom
91
+ ```
92
+
93
+ ### Importar estilos
94
+
95
+ No olvides importar los estilos CSS en tu aplicación:
96
+
97
+ ```tsx
98
+ import '@sistemas-ucol-mx/ucol-dynamic/dist/style.css';
99
+ ```
100
+
101
+ ## 🧩 Componentes Principales
102
+
103
+ ### 🎯 DynamicCrud
104
+
105
+ Componente completo CRUD con tabla, formulario modal y acciones personalizables.
106
+
107
+ ```tsx
108
+ import { DynamicCrud } from '@sistemas-ucol-mx/ucol-dynamic';
109
+
110
+ <DynamicCrud
111
+ title="Gestión de Usuarios"
112
+ description="Administra los usuarios del sistema"
113
+ columns={[
114
+ { title: 'Nombre', dataIndex: 'name', key: 'name' },
115
+ { title: 'Email', dataIndex: 'email', key: 'email' },
116
+ ]}
117
+ fields={[
118
+ { name: 'name', label: 'Nombre', type: 'text', required: true },
119
+ { name: 'email', label: 'Email', type: 'email', required: true },
120
+ ]}
121
+ data={users}
122
+ onCreate={handleCreate}
123
+ onEdit={handleEdit}
124
+ onDelete={handleDelete}
125
+ />
126
+ ```
127
+
128
+ ### 📝 DynamicForm
129
+
130
+ Formulario dinámico generado a partir de configuración JSON.
131
+
132
+ ```tsx
133
+ import { DynamicForm } from '@sistemas-ucol-mx/ucol-dynamic';
134
+
135
+ <DynamicForm
136
+ mode="create"
137
+ title="Nuevo Usuario"
138
+ layout="vertical"
139
+ cols={2}
140
+ fields={[
141
+ { name: 'name', label: 'Nombre', type: 'text', required: true },
142
+ { name: 'email', label: 'Email', type: 'email', required: true },
143
+ { name: 'age', label: 'Edad', type: 'number' },
144
+ { name: 'active', label: 'Activo', type: 'switch' },
145
+ ]}
146
+ onSubmit={handleSubmit}
147
+ />
148
+ ```
149
+
150
+ ### 📊 DynamicTable
151
+
152
+ Tabla configurable con búsqueda, filtros, paginación y exportación.
153
+
154
+ ```tsx
155
+ import { DynamicTable } from '@sistemas-ucol-mx/ucol-dynamic';
156
+
157
+ <DynamicTable
158
+ title="Lista de Productos"
159
+ columns={columns}
160
+ data={products}
161
+ loading={isLoading}
162
+ showCreateButton
163
+ onCreate={handleCreate}
164
+ onEdit={handleEdit}
165
+ onDelete={handleDelete}
166
+ exportToExcel={{
167
+ fileName: 'productos',
168
+ sheetName: 'Productos',
169
+ data: products,
170
+ columns: columns
171
+ }}
172
+ searchConfig={{
173
+ searchableFields: ['name', 'category', 'price']
174
+ }}
175
+ />
176
+ ```
177
+
178
+ ### 🔘 Btn (Button)
179
+
180
+ Botón versátil con presets, variantes de color e iconos.
181
+
182
+ ```tsx
183
+ import { Btn } from '@sistemas-ucol-mx/ucol-dynamic';
184
+
185
+ // Botón con preset
186
+ <Btn preset="save" variant="success">Guardar</Btn>
187
+ <Btn preset="delete" variant="danger">Eliminar</Btn>
188
+ <Btn preset="edit" variant="info">Editar</Btn>
189
+
190
+ // Botón personalizado
191
+ <Btn
192
+ icon={<CustomIcon />}
193
+ variant="warning"
194
+ size="large"
195
+ >
196
+ Acción Personalizada
197
+ </Btn>
198
+
199
+ // Solo icono
200
+ <Btn preset="add" iconOnly />
201
+ ```
202
+
203
+ ### 🔐 PermissionsProvider
204
+
205
+ Sistema de gestión de permisos basado en roles.
206
+
207
+ ```tsx
208
+ import { PermissionsProvider, usePermissions } from '@sistemas-ucol-mx/ucol-dynamic';
209
+
210
+ // Configurar permisos
211
+ const permissionsConfig = {
212
+ users: {
213
+ admin: ['create', 'read', 'update', 'delete'],
214
+ user: ['read'],
215
+ }
216
+ };
217
+
218
+ // Envolver tu aplicación
219
+ <PermissionsProvider role="admin" config={permissionsConfig}>
220
+ <App />
221
+ </PermissionsProvider>
222
+
223
+ // Usar en componentes
224
+ function UserActions() {
225
+ const { canCreate, canDelete } = usePermissions('users');
226
+
227
+ return (
228
+ <>
229
+ {canCreate && <Btn preset="add">Crear</Btn>}
230
+ {canDelete && <Btn preset="delete">Eliminar</Btn>}
231
+ </>
232
+ );
233
+ }
234
+ ```
235
+
236
+ ### 📤 BulkUploadModal
237
+
238
+ Modal para carga masiva de datos con validación.
239
+
240
+ ```tsx
241
+ import { BulkUploadModal } from '@sistemas-ucol-mx/ucol-dynamic';
242
+
243
+ <BulkUploadModal
244
+ title="Importar Usuarios"
245
+ visible={showModal}
246
+ config={{
247
+ allowedFormats: ['xlsx', 'csv'],
248
+ maxFileSize: 5,
249
+ templateFields: [
250
+ { name: 'name', label: 'Nombre', required: true },
251
+ { name: 'email', label: 'Email', required: true },
252
+ ]
253
+ }}
254
+ onValidateData={validateUsers}
255
+ onFinish={importUsers}
256
+ onCancel={() => setShowModal(false)}
257
+ />
258
+ ```
259
+
260
+ ### 🔍 SharedField
261
+
262
+ Campo de formulario compartido con validación y tipos múltiples.
263
+
264
+ ```tsx
265
+ import { SharedField } from '@sistemas-ucol-mx/ucol-dynamic';
266
+
267
+ <SharedField
268
+ name="username"
269
+ label="Usuario"
270
+ type="text"
271
+ required={true}
272
+ placeholder="Ingresa tu usuario"
273
+ validations={{
274
+ minLength: 3,
275
+ maxLength: 20,
276
+ pattern: /^[a-zA-Z0-9]+$/
277
+ }}
278
+ />
279
+ ```
280
+
281
+ ## 🎣 Hooks Personalizados
282
+
283
+ ### useCrudOperations
284
+
285
+ Hook para operaciones CRUD con React Query integrado.
286
+
287
+ ```tsx
288
+ import { useCrudOperations } from '@sistemas-ucol-mx/ucol-dynamic';
289
+
290
+ function UserManagement() {
291
+ const {
292
+ data: users,
293
+ isLoading,
294
+ createItemAsync,
295
+ updateItemAsync,
296
+ deleteItemAsync,
297
+ refetch
298
+ } = useCrudOperations({
299
+ getAll: () => api.getUsers(),
300
+ create: (user) => api.createUser(user),
301
+ update: (user) => api.updateUser(user),
302
+ delete: (user) => api.deleteUser(user.id),
303
+ idField: 'id',
304
+ entityName: 'usuario'
305
+ });
306
+
307
+ const handleCreate = async (values) => {
308
+ await createItemAsync(values);
309
+ };
310
+
311
+ return <DynamicTable data={users} loading={isLoading} />;
312
+ }
313
+ ```
314
+
315
+ ### useFetchQuery
316
+
317
+ Hook wrapper de React Query con configuración predeterminada.
318
+
319
+ ```tsx
320
+ import { useFetchQuery } from '@sistemas-ucol-mx/ucol-dynamic';
321
+
322
+ const { data, isLoading, error } = useFetchQuery({
323
+ queryKey: ['users'],
324
+ queryFn: fetchUsers,
325
+ config: {
326
+ onSuccess: (data) => console.log('Datos cargados:', data),
327
+ onError: (error) => console.error('Error:', error)
328
+ }
329
+ });
330
+ ```
331
+
332
+ ### useNotification
333
+
334
+ Hook para mostrar notificaciones del sistema.
335
+
336
+ ```tsx
337
+ import { openNotification } from '@sistemas-ucol-mx/ucol-dynamic';
338
+
339
+ openNotification('success', 'Operación exitosa', 'Los datos se guardaron correctamente');
340
+ openNotification('error', 'Error', 'No se pudo completar la operación');
341
+ openNotification('warning', 'Advertencia', 'Revisa los datos ingresados');
342
+ openNotification('info', 'Información', 'Proceso en curso');
343
+ ```
344
+
345
+ ### useAsync
346
+
347
+ Hook para manejar operaciones asíncronas.
348
+
349
+ ```tsx
350
+ import { useAsync } from '@sistemas-ucol-mx/ucol-dynamic';
351
+
352
+ function DataDisplay() {
353
+ const { data, loading, error } = useAsync(
354
+ async () => await fetchData(),
355
+ [dependency]
356
+ );
357
+
358
+ if (loading) return <Spin />;
359
+ if (error) return <Alert type="error" message={error.message} />;
360
+
361
+ return <div>{JSON.stringify(data)}</div>;
362
+ }
363
+ ```
364
+
365
+ ## ⚙️ API y Configuración
366
+
367
+ ### Configuración de API en DynamicForm
368
+
369
+ ```tsx
370
+ <DynamicForm
371
+ apiConfig={{
372
+ url: 'https://api.example.com/users',
373
+ method: 'POST',
374
+ headers: {
375
+ 'Authorization': 'Bearer token',
376
+ 'Content-Type': 'application/json'
377
+ },
378
+ responseDataPath: 'data.user'
379
+ }}
380
+ />
381
+ ```
382
+
383
+ ### Tipos de Campos de Formulario
384
+
385
+ - `text` - Campo de texto
386
+ - `textarea` - Área de texto
387
+ - `number` - Número
388
+ - `email` - Email
389
+ - `password` - Contraseña
390
+ - `select` - Lista desplegable
391
+ - `multiselect` - Selección múltiple
392
+ - `checkbox` - Casilla de verificación
393
+ - `radio` - Botones de radio
394
+ - `switch` - Interruptor
395
+ - `date` - Selector de fecha
396
+ - `daterange` - Rango de fechas
397
+ - `time` - Selector de hora
398
+ - `upload` - Carga de archivos
399
+ - `slider` - Deslizador
400
+ - `color` - Selector de color
401
+
402
+ ### Validaciones
403
+
404
+ ```tsx
405
+ {
406
+ required: true,
407
+ minLength: 5,
408
+ maxLength: 50,
409
+ min: 0,
410
+ max: 100,
411
+ pattern: /^[A-Z]/,
412
+ email: true,
413
+ url: true,
414
+ customValidator: (value) => value !== 'admin' || 'No se permite este valor'
415
+ }
416
+ ```
417
+
418
+ ## 🚀 Tecnologías
419
+
420
+ - **React 19** - Librería de UI
421
+ - **TypeScript 5.7** - Tipado estático
422
+ - **Vite 6** - Build tool y dev server
423
+ - **Ant Design 5** - Framework de componentes UI
424
+ - **Tailwind CSS 4** - Framework de utilidades CSS
425
+ - **TanStack Query (React Query)** - Gestión de estado del servidor
426
+ - **Storybook 8** - Desarrollo y documentación de componentes
427
+ - **React Icons** - Iconos
428
+ - **Axios** - Cliente HTTP
429
+ - **Day.js** - Manejo de fechas
430
+ - **jsPDF & jsPDF-AutoTable** - Generación de PDFs
431
+ - **XLSX** - Manejo de archivos Excel
432
+ - **AJV** - Validación de esquemas JSON
433
+
434
+ ## 👥 Autores
435
+
436
+ - **@RKamey** - *Colaborador*
437
+ - **@8Wada** - *Colaborador*
438
+
439
+ ---
440
+
441
+ <div align="center">
442
+
443
+ **Hecho con ❤️ por el equipo de Innovardix**
444
+
445
+ </div>
package/package.json ADDED
@@ -0,0 +1,113 @@
1
+ {
2
+ "name": "@sistemas-ucol-mx/ucol-dynamic",
3
+ "version": "1.0.0",
4
+ "description": "Biblioteca de componentes React con Ant Design y Tailwind CSS",
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/ucol-dynamic.umd.cjs",
10
+ "module": "./dist/ucol-dynamic.js",
11
+ "types": "./dist/ucol-dynamic.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/ucol-dynamic.js",
15
+ "require": "./dist/ucol-dynamic.umd.cjs",
16
+ "types": "./dist/ucol-dynamic.d.ts"
17
+ },
18
+ "./style.css": "./dist/style.css"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/sistemas-ucol-mx/capi_ui.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/sistemas-ucol-mx/capi_ui/issues"
26
+ },
27
+ "homepage": "https://ucol-dynamic.netlify.app/",
28
+ "publishConfig": {
29
+ "access": "public",
30
+ "registry": "https://registry.npmjs.org/"
31
+ },
32
+ "keywords": [
33
+ "react",
34
+ "typescript",
35
+ "vite",
36
+ "tailwindcss",
37
+ "antd",
38
+ "components",
39
+ "ui-library"
40
+ ],
41
+ "author": "Innovardix",
42
+ "license": "MIT",
43
+ "scripts": {
44
+ "dev": "vite",
45
+ "build": "tsc -b && vite build",
46
+ "lint": "eslint .",
47
+ "preview": "vite preview",
48
+ "storybook": "storybook dev -p 6006",
49
+ "build-storybook": "storybook build"
50
+ },
51
+ "peerDependencies": {
52
+ "antd": "6.3.0",
53
+ "axios": "^1.13.5",
54
+ "dayjs": "^1.11.13",
55
+ "react": "19.2.4",
56
+ "react-dom": "19.2.4"
57
+ },
58
+ "dependencies": {
59
+ "@ant-design/icons": "^6.1.0",
60
+ "@tailwindcss/vite": "^4.1.11",
61
+ "@tanstack/react-query": "^5.67.3",
62
+ "ajv": "^8.17.1",
63
+ "clsx": "^2.1.1",
64
+ "framer-motion": "^12.29.0",
65
+ "jspdf": "^2.5.2",
66
+ "jspdf-autotable": "^3.8.4",
67
+ "react-icons": "^5.4.0",
68
+ "xlsx": "^0.18.5"
69
+ },
70
+ "devDependencies": {
71
+ "@chromatic-com/storybook": "^3.2.6",
72
+ "@eslint/js": "^9.17.0",
73
+ "@storybook/addon-docs": "^8.6.14",
74
+ "@storybook/addon-essentials": "^8.6.14",
75
+ "@storybook/addon-interactions": "^8.6.14",
76
+ "@storybook/addon-onboarding": "^8.6.14",
77
+ "@storybook/addon-storysource": "^8.6.14",
78
+ "@storybook/addon-styling-webpack": "^1.0.1",
79
+ "@storybook/blocks": "^8.6.14",
80
+ "@storybook/react": "^8.6.14",
81
+ "@storybook/react-vite": "^8.6.14",
82
+ "@storybook/test": "^8.6.14",
83
+ "@tailwindcss/postcss": "^4.0.0",
84
+ "@types/react": "19.2.14",
85
+ "@types/react-dom": "19.2.3",
86
+ "@vitejs/plugin-react": "^5.1.4",
87
+ "antd": "^6.3.0",
88
+ "autoprefixer": "^10.4.20",
89
+ "axios": "^1.13.5",
90
+ "dayjs": "^1.11.19",
91
+ "eslint": "^9.17.0",
92
+ "eslint-plugin-react-hooks": "^5.0.0",
93
+ "eslint-plugin-react-refresh": "^0.4.16",
94
+ "eslint-plugin-storybook": "^0.11.6",
95
+ "globals": "^15.14.0",
96
+ "postcss": "^8.4.49",
97
+ "react": "19.2.4",
98
+ "react-dom": "19.2.4",
99
+ "storybook": "^8.6.14",
100
+ "storybook-addon-customize-antd-theme": "^1.1.0",
101
+ "tailwindcss": "^4.1.11",
102
+ "terser": "^5.37.0",
103
+ "typescript": "^5.7.3",
104
+ "typescript-eslint": "^8.18.2",
105
+ "vite": "^7.2.7",
106
+ "vite-plugin-dts": "^4.5.0"
107
+ },
108
+ "eslintConfig": {
109
+ "extends": [
110
+ "plugin:storybook/recommended"
111
+ ]
112
+ }
113
+ }