@acvl/mobile-components 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +6 -5
  2. package/lib/module/camara/CampoDeFotos.js +124 -0
  3. package/lib/module/camara/CampoDeFotos.js.map +1 -0
  4. package/lib/module/camara/elegir.js +104 -0
  5. package/lib/module/camara/elegir.js.map +1 -0
  6. package/lib/module/camara/index.js +10 -0
  7. package/lib/module/camara/index.js.map +1 -0
  8. package/lib/module/camara/reducir.js.map +1 -0
  9. package/lib/module/componentes/ContenidoDePantalla.js +2 -1
  10. package/lib/module/componentes/ContenidoDePantalla.js.map +1 -1
  11. package/lib/module/componentes/Tarjeta.js +19 -3
  12. package/lib/module/componentes/Tarjeta.js.map +1 -1
  13. package/lib/module/formularios/CampoDeSeleccion.js +27 -2
  14. package/lib/module/formularios/CampoDeSeleccion.js.map +1 -1
  15. package/lib/module/formularios/campos.js +10 -2
  16. package/lib/module/formularios/campos.js.map +1 -1
  17. package/lib/module/formularios/controlados.js +3 -1
  18. package/lib/module/formularios/controlados.js.map +1 -1
  19. package/lib/module/fotos/elegir.js +5 -78
  20. package/lib/module/fotos/elegir.js.map +1 -1
  21. package/lib/module/fotos/index.js +4 -3
  22. package/lib/module/fotos/index.js.map +1 -1
  23. package/lib/module/hoja/HojaDeLista.js +211 -0
  24. package/lib/module/hoja/HojaDeLista.js.map +1 -0
  25. package/lib/module/hoja/HojaInferior.js +5 -1
  26. package/lib/module/hoja/HojaInferior.js.map +1 -1
  27. package/lib/module/hoja/index.js +1 -0
  28. package/lib/module/hoja/index.js.map +1 -1
  29. package/lib/module/index.js +2 -1
  30. package/lib/module/index.js.map +1 -1
  31. package/lib/module/listas/HojaDeFiltros.js +21 -11
  32. package/lib/module/listas/HojaDeFiltros.js.map +1 -1
  33. package/lib/module/listas/piezas.js +79 -16
  34. package/lib/module/listas/piezas.js.map +1 -1
  35. package/lib/module/pantallas/PantallaDeHistorial.js +328 -0
  36. package/lib/module/pantallas/PantallaDeHistorial.js.map +1 -0
  37. package/lib/typescript/src/camara/CampoDeFotos.d.ts +30 -0
  38. package/lib/typescript/src/camara/CampoDeFotos.d.ts.map +1 -0
  39. package/lib/typescript/src/camara/elegir.d.ts +47 -0
  40. package/lib/typescript/src/camara/elegir.d.ts.map +1 -0
  41. package/lib/typescript/src/camara/index.d.ts +4 -0
  42. package/lib/typescript/src/camara/index.d.ts.map +1 -0
  43. package/lib/typescript/src/camara/reducir.d.ts.map +1 -0
  44. package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts +6 -1
  45. package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts.map +1 -1
  46. package/lib/typescript/src/componentes/Tarjeta.d.ts +11 -1
  47. package/lib/typescript/src/componentes/Tarjeta.d.ts.map +1 -1
  48. package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts +4 -2
  49. package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts.map +1 -1
  50. package/lib/typescript/src/formularios/campos.d.ts +8 -2
  51. package/lib/typescript/src/formularios/campos.d.ts.map +1 -1
  52. package/lib/typescript/src/formularios/controlados.d.ts.map +1 -1
  53. package/lib/typescript/src/fotos/elegir.d.ts +1 -31
  54. package/lib/typescript/src/fotos/elegir.d.ts.map +1 -1
  55. package/lib/typescript/src/fotos/index.d.ts +2 -2
  56. package/lib/typescript/src/fotos/index.d.ts.map +1 -1
  57. package/lib/typescript/src/hoja/HojaDeLista.d.ts +50 -0
  58. package/lib/typescript/src/hoja/HojaDeLista.d.ts.map +1 -0
  59. package/lib/typescript/src/hoja/HojaInferior.d.ts.map +1 -1
  60. package/lib/typescript/src/hoja/index.d.ts +1 -0
  61. package/lib/typescript/src/hoja/index.d.ts.map +1 -1
  62. package/lib/typescript/src/index.d.ts +3 -2
  63. package/lib/typescript/src/index.d.ts.map +1 -1
  64. package/lib/typescript/src/listas/HojaDeFiltros.d.ts +20 -4
  65. package/lib/typescript/src/listas/HojaDeFiltros.d.ts.map +1 -1
  66. package/lib/typescript/src/listas/piezas.d.ts +27 -5
  67. package/lib/typescript/src/listas/piezas.d.ts.map +1 -1
  68. package/lib/typescript/src/pantallas/PantallaDeHistorial.d.ts +65 -0
  69. package/lib/typescript/src/pantallas/PantallaDeHistorial.d.ts.map +1 -0
  70. package/package.json +6 -1
  71. package/src/camara/CampoDeFotos.tsx +132 -0
  72. package/src/camara/elegir.ts +113 -0
  73. package/src/camara/index.ts +15 -0
  74. package/src/componentes/ContenidoDePantalla.tsx +12 -2
  75. package/src/componentes/Tarjeta.tsx +16 -2
  76. package/src/formularios/CampoDeSeleccion.tsx +18 -4
  77. package/src/formularios/campos.tsx +14 -0
  78. package/src/formularios/controlados.tsx +3 -1
  79. package/src/fotos/elegir.ts +10 -88
  80. package/src/fotos/index.ts +4 -13
  81. package/src/hoja/HojaDeLista.tsx +214 -0
  82. package/src/hoja/HojaInferior.tsx +2 -1
  83. package/src/hoja/index.ts +1 -0
  84. package/src/index.ts +8 -0
  85. package/src/listas/HojaDeFiltros.tsx +39 -14
  86. package/src/listas/piezas.tsx +93 -17
  87. package/src/pantallas/PantallaDeHistorial.tsx +293 -0
  88. package/lib/module/fotos/reducir.js.map +0 -1
  89. package/lib/typescript/src/fotos/reducir.d.ts.map +0 -1
  90. /package/lib/module/{fotos → camara}/reducir.js +0 -0
  91. /package/lib/typescript/src/{fotos → camara}/reducir.d.ts +0 -0
  92. /package/src/{fotos → camara}/reducir.ts +0 -0
@@ -0,0 +1,293 @@
1
+ import MaterialCommunityIcons from "@expo/vector-icons/MaterialCommunityIcons";
2
+ import React from "react";
3
+ import { ActivityIndicator, Pressable, RefreshControl, ScrollView, View } from "react-native";
4
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
5
+ import BotonGrande from "../componentes/BotonGrande";
6
+ import CabeceraEmpujada from "../componentes/CabeceraEmpujada";
7
+ import EstadoVacio from "../componentes/EstadoVacio";
8
+ import Tarjeta from "../componentes/Tarjeta";
9
+ import { crearEstilos, renglon, tipografia, usePaleta, type Paleta } from "../tema";
10
+ import { Text } from "../texto";
11
+
12
+ /**
13
+ * Un movimiento de la bitácora de un registro, como lo responde cualquier endpoint `historial/`
14
+ * de los backends de ACV (`BaseHistorySerializer`): el registro **entero** como quedó, con quién,
15
+ * cuándo y qué campos cambiaron.
16
+ */
17
+ export interface EventoDeHistorial {
18
+ /** Ya redactado por el backend: «Actualización - Concepto de Orden de envío». */
19
+ history_type: string;
20
+ /** El nombre completo de quien lo hizo; nulo si lo movió el sistema. */
21
+ history_user: string | null;
22
+ /** ISO en UTC. */
23
+ history_date: string;
24
+ /** Los que cambiaron en este paso; nulo en la creación, que no tiene contra qué compararse. */
25
+ campos_con_cambios: string[] | null;
26
+ [campo: string]: unknown;
27
+ }
28
+
29
+ /**
30
+ * Lo que devuelve cualquier endpoint `historial/`: la línea de tiempo, del más nuevo al más viejo,
31
+ * y aparte cómo se llama cada campo. Las etiquetas son además el filtro de qué se pinta: un campo
32
+ * sin etiqueta es de los internos de la bitácora.
33
+ */
34
+ export interface Historial {
35
+ history: EventoDeHistorial[];
36
+ labels: Record<string, string>;
37
+ }
38
+
39
+ type NombreDeIcono = React.ComponentProps<typeof MaterialCommunityIcons>["name"];
40
+
41
+ /**
42
+ * Cómo se pinta cada tipo de movimiento. El backend manda la acción ya redactada, así que el icono
43
+ * y el color salen del prefijo.
44
+ */
45
+ const TIPOS: { prefijo: string; icono: NombreDeIcono; colores: (c: Paleta) => Colores }[] = [
46
+ { prefijo: "Creación", icono: "plus-circle-outline", colores: (c) => c.exito },
47
+ { prefijo: "Actualización", icono: "pencil-outline", colores: (c) => c.info },
48
+ { prefijo: "Eliminación", icono: "minus-circle-outline", colores: (c) => c.error },
49
+ ];
50
+ type Colores = { fondo: string; tinta: string };
51
+
52
+ const pintaDe = (c: Paleta, tipo: string) => {
53
+ const t = TIPOS.find((x) => tipo.startsWith(x.prefijo));
54
+ return t
55
+ ? { icono: t.icono, ...t.colores(c) }
56
+ : { icono: "history" as NombreDeIcono, fondo: c.superficieTenue, tinta: c.secondary };
57
+ };
58
+
59
+ /** Parte «Acción - Modelo» en sus dos mitades; sin guion, todo es el encabezado. */
60
+ const partirTipo = (tipo: string) => {
61
+ const corte = tipo.indexOf(" - ");
62
+ if (corte === -1) return { accion: "", modelo: tipo };
63
+ return { accion: tipo.slice(0, corte), modelo: tipo.slice(corte + 3) };
64
+ };
65
+
66
+ /** El valor de un campo tal como viene de la bitácora, listo para pintarse. */
67
+ const formatear = (valor: unknown): string => {
68
+ if (valor === null || valor === undefined || valor === "") return "—";
69
+ if (typeof valor === "boolean") return valor ? "Sí" : "No";
70
+ if (Array.isArray(valor)) return valor.length ? valor.join(", ") : "—";
71
+ if (typeof valor === "object") return JSON.stringify(valor);
72
+ return String(valor);
73
+ };
74
+
75
+ /** La fecha y hora del movimiento, en la hora del teléfono. */
76
+ const fechaHora = (iso: string) => {
77
+ const fecha = new Date(iso);
78
+ return Number.isNaN(fecha.getTime())
79
+ ? "—"
80
+ : fecha.toLocaleString("es-MX", {
81
+ day: "2-digit",
82
+ month: "short",
83
+ year: "numeric",
84
+ hour: "2-digit",
85
+ minute: "2-digit",
86
+ });
87
+ };
88
+
89
+ /**
90
+ * Un movimiento.
91
+ *
92
+ * De entrada enseña sólo lo que cambió en ese paso: el evento trae el registro entero como quedó, y
93
+ * en un teléfono treinta campos por tarjeta esconden el que importa. El resto está a un toque, que
94
+ * es donde se va a buscar el dato que no se movió.
95
+ */
96
+ export function TarjetaDeEvento({
97
+ evento,
98
+ labels,
99
+ }: {
100
+ evento: EventoDeHistorial;
101
+ labels: Record<string, string>;
102
+ }) {
103
+ const c = usePaleta();
104
+ const styles = useStyles();
105
+ const [abierto, setAbierto] = React.useState(false);
106
+
107
+ const { accion, modelo } = partirTipo(evento.history_type);
108
+ const pinta = pintaDe(c, evento.history_type);
109
+
110
+ // Las etiquetas mandan qué se pinta y en qué orden.
111
+ const campos = Object.keys(labels).filter((campo) => campo in evento);
112
+ const cambiados = evento.campos_con_cambios;
113
+ const visibles = abierto ? campos : campos.filter((campo) => cambiados?.includes(campo));
114
+
115
+ return (
116
+ <Tarjeta style={styles.evento}>
117
+ <View style={styles.cabecera}>
118
+ <View style={[styles.icono, { backgroundColor: pinta.fondo }]}>
119
+ <MaterialCommunityIcons name={pinta.icono} size={20} color={pinta.tinta} />
120
+ </View>
121
+ <View style={styles.flex}>
122
+ <Text style={styles.titulo}>{modelo}</Text>
123
+ <Text style={styles.linea}>
124
+ {[accion, evento.history_user || "Sistema"].filter(Boolean).join(" · ")}
125
+ </Text>
126
+ <Text style={styles.linea}>{fechaHora(evento.history_date)}</Text>
127
+ </View>
128
+ </View>
129
+
130
+ {/* Un arreglo vacío es «se guardó sin mover nada»; nulo es la creación, que no lista
131
+ cambios. */}
132
+ {!abierto && cambiados?.length === 0 ? (
133
+ <Text style={styles.sinCambios}>Sin cambios en los campos.</Text>
134
+ ) : null}
135
+
136
+ {visibles.map((campo) => {
137
+ const cambiado = Boolean(cambiados?.includes(campo));
138
+ return (
139
+ <View key={campo} style={[styles.dato, cambiado && styles.datoCambiado]}>
140
+ <Text style={[styles.etiqueta, cambiado && styles.etiquetaCambiada]}>
141
+ {labels[campo]}
142
+ </Text>
143
+ <Text style={styles.valor}>{formatear(evento[campo])}</Text>
144
+ </View>
145
+ );
146
+ })}
147
+
148
+ {campos.length > 0 ? (
149
+ <Pressable
150
+ onPress={() => setAbierto((previo) => !previo)}
151
+ accessibilityRole="button"
152
+ hitSlop={8}
153
+ style={({ pressed }) => [styles.alternar, pressed && styles.presionada]}
154
+ >
155
+ <Text style={styles.alternarTexto}>
156
+ {abierto
157
+ ? "Ocultar campos"
158
+ : cambiados?.length
159
+ ? "Ver todos los campos"
160
+ : "Ver los campos"}
161
+ </Text>
162
+ <MaterialCommunityIcons
163
+ name={abierto ? "chevron-up" : "chevron-down"}
164
+ size={22}
165
+ color={c.primary}
166
+ />
167
+ </Pressable>
168
+ ) : null}
169
+ </Tarjeta>
170
+ );
171
+ }
172
+
173
+ /** Lo que la pantalla lee de un `use…Query` de RTK Query. */
174
+ interface ConsultaDeHistorial {
175
+ data?: Historial;
176
+ isLoading: boolean;
177
+ isFetching: boolean;
178
+ isError: boolean;
179
+ refetch: () => unknown;
180
+ }
181
+
182
+ /**
183
+ * La bitácora de un registro: quién lo movió, cuándo y qué le cambió. Es el panel de historial del
184
+ * portal, que allá se acopla al costado de la ficha; en el teléfono no hay costado, así que es una
185
+ * pantalla empujada a la que se llega desde las acciones de la ficha.
186
+ *
187
+ * Quien la usa pone la consulta (de dónde se pide, con su permiso). Conviene pedirla con
188
+ * `refetchOnMountOrArgChange`: se abre justo después de mover algo, y servir la caché enseñaría un
189
+ * historial sin el movimiento que se viene a comprobar.
190
+ *
191
+ * En varios registros el backend mezcla en una sola línea de tiempo el registro y lo que cuelga de
192
+ * él (una orden con sus conceptos, un embarque con su transporte); por eso cada tarjeta dice de qué
193
+ * registro habla.
194
+ */
195
+ export default function PantallaDeHistorial({
196
+ eyebrow,
197
+ consulta,
198
+ }: {
199
+ /** De qué registro es: «Recibo R-0012». */
200
+ eyebrow: string;
201
+ consulta: ConsultaDeHistorial;
202
+ }) {
203
+ const c = usePaleta();
204
+ const styles = useStyles();
205
+ const insets = useSafeAreaInsets();
206
+ const { data, isLoading, isFetching, isError, refetch } = consulta;
207
+ const eventos = data?.history ?? [];
208
+
209
+ return (
210
+ <View style={styles.root}>
211
+ <CabeceraEmpujada eyebrow={eyebrow} titulo="Historial" />
212
+ {/* El error sólo se queda con la pantalla cuando no hay nada que enseñar: un refresco
213
+ que falla no debe borrar el historial que ya se estaba leyendo. */}
214
+ {isError && !data ? (
215
+ <EstadoVacio
216
+ icono="cloud-off-outline"
217
+ titulo="No se pudo cargar el historial"
218
+ texto="Revisa tu señal e intenta de nuevo."
219
+ >
220
+ <BotonGrande icono="refresh" modo="contorno" onPress={() => refetch()}>
221
+ Reintentar
222
+ </BotonGrande>
223
+ </EstadoVacio>
224
+ ) : isLoading ? (
225
+ <ActivityIndicator color={c.primary} style={styles.cargando} />
226
+ ) : (
227
+ <ScrollView
228
+ contentContainerStyle={[
229
+ styles.contenido,
230
+ { paddingBottom: insets.bottom + 24 },
231
+ ]}
232
+ refreshControl={
233
+ <RefreshControl
234
+ refreshing={isFetching}
235
+ onRefresh={() => refetch()}
236
+ tintColor={c.primary}
237
+ colors={[c.primary]}
238
+ progressBackgroundColor={c.superficie}
239
+ />
240
+ }
241
+ >
242
+ {eventos.length === 0 ? (
243
+ <EstadoVacio icono="history" titulo="Sin movimientos registrados" />
244
+ ) : (
245
+ eventos.map((evento, indice) => (
246
+ // El backend no da una llave por evento (mezcla modelos con ids que se
247
+ // repiten); el índice sirve porque la lista se reemplaza entera.
248
+ <TarjetaDeEvento
249
+ key={indice}
250
+ evento={evento}
251
+ labels={data?.labels ?? {}}
252
+ />
253
+ ))
254
+ )}
255
+ </ScrollView>
256
+ )}
257
+ </View>
258
+ );
259
+ }
260
+
261
+ const useStyles = crearEstilos((c) => ({
262
+ root: { flex: 1, backgroundColor: c.fondo },
263
+ cargando: { marginTop: 40 },
264
+ contenido: { padding: 16, gap: 12 },
265
+ flex: { flex: 1 },
266
+ evento: { gap: 10 },
267
+ cabecera: { flexDirection: "row", alignItems: "flex-start", gap: 12 },
268
+ icono: {
269
+ width: 36,
270
+ height: 36,
271
+ borderRadius: 18,
272
+ alignItems: "center",
273
+ justifyContent: "center",
274
+ },
275
+ titulo: { ...renglon(tipografia.cuerpo), fontWeight: "800" },
276
+ linea: { ...renglon(tipografia.secundario), color: c.secondary },
277
+ sinCambios: { ...renglon(tipografia.secundario), color: c.secondary, fontStyle: "italic" },
278
+ // Un campo por renglón: con la letra grande, dos columnas parten los valores a media palabra.
279
+ dato: { borderRadius: 10, paddingVertical: 6, paddingHorizontal: 10, gap: 2 },
280
+ datoCambiado: { backgroundColor: c.primaryWash },
281
+ etiqueta: {
282
+ ...renglon(tipografia.etiqueta),
283
+ fontWeight: "800",
284
+ color: c.secondary,
285
+ textTransform: "uppercase",
286
+ letterSpacing: 0.6,
287
+ },
288
+ etiquetaCambiada: { color: c.primary },
289
+ valor: { ...renglon(tipografia.secundario), fontWeight: "600" },
290
+ alternar: { flexDirection: "row", alignItems: "center", gap: 2, alignSelf: "flex-start" },
291
+ alternarTexto: { ...renglon(tipografia.secundario), fontWeight: "700", color: c.primary },
292
+ presionada: { opacity: 0.6 },
293
+ }));
@@ -1 +0,0 @@
1
- {"version":3,"names":["ImageManipulator","SaveFormat","Image","LADO_MAXIMO","CALIDAD","reducirFoto","asset","width","height","cabe","Math","max","mimeType","contexto","manipulate","uri","resize","imagen","renderAsync","reducida","saveAsync","compress","format","JPEG","base","fileName","split","pop","replace","fileSize","undefined","error","console","warn","reducirImagenAdjunta","archivo","getSize","nombre","tipo","type"],"sourceRoot":"../../../src","sources":["fotos/reducir.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reducir.d.ts","sourceRoot":"","sources":["../../../../src/fotos/reducir.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;;;GAIG;AACH,eAAO,MAAM,WAAW,OAAO,CAAC;AAKhC;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+BpF;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBzD"}
File without changes
File without changes