@acvl/mobile-components 0.0.2 → 0.0.4
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 +2 -2
- package/lib/module/camara/CampoDeFotos.js +34 -12
- package/lib/module/camara/CampoDeFotos.js.map +1 -1
- package/lib/module/camara/index.js.map +1 -1
- package/lib/module/componentes/ContenidoDePantalla.js +2 -1
- package/lib/module/componentes/ContenidoDePantalla.js.map +1 -1
- package/lib/module/formularios/SelectorDeOpcion.js +19 -27
- package/lib/module/formularios/SelectorDeOpcion.js.map +1 -1
- package/lib/module/formularios/TextoDeAccesoControlado.js +1 -1
- package/lib/module/formularios/campos.js +257 -129
- package/lib/module/formularios/campos.js.map +1 -1
- package/lib/module/hoja/HojaDeLista.js +8 -3
- package/lib/module/hoja/HojaDeLista.js.map +1 -1
- package/lib/module/hoja/HojaInferior.js +8 -3
- package/lib/module/hoja/HojaInferior.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/camara/CampoDeFotos.d.ts +17 -4
- package/lib/typescript/src/camara/CampoDeFotos.d.ts.map +1 -1
- package/lib/typescript/src/camara/index.d.ts +1 -1
- package/lib/typescript/src/camara/index.d.ts.map +1 -1
- package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts +6 -1
- package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts.map +1 -1
- package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts +10 -0
- package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts.map +1 -1
- package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts +1 -1
- package/lib/typescript/src/formularios/campos.d.ts +43 -8
- package/lib/typescript/src/formularios/campos.d.ts.map +1 -1
- package/lib/typescript/src/hoja/HojaDeLista.d.ts.map +1 -1
- package/lib/typescript/src/hoja/HojaInferior.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/camara/CampoDeFotos.tsx +41 -12
- package/src/camara/index.ts +6 -1
- package/src/componentes/ContenidoDePantalla.tsx +12 -2
- package/src/formularios/SelectorDeOpcion.tsx +40 -22
- package/src/formularios/TextoDeAccesoControlado.tsx +1 -1
- package/src/formularios/campos.tsx +276 -123
- package/src/hoja/HojaDeLista.tsx +15 -9
- package/src/hoja/HojaInferior.tsx +15 -9
- package/src/index.ts +1 -0
|
@@ -14,6 +14,7 @@ import EstadoVacio from "../componentes/EstadoVacio";
|
|
|
14
14
|
import IconoDeRenglon from "../componentes/IconoDeRenglon";
|
|
15
15
|
import { crearEstilos, renglon, tipografia, usePaleta } from "../tema";
|
|
16
16
|
import { Text, TextInput } from "../texto";
|
|
17
|
+
import { CajaDeCampo } from "./campos";
|
|
17
18
|
|
|
18
19
|
/** Una opción de una lista: lo que se guarda (`value`) y lo que se lee (`label`). */
|
|
19
20
|
export interface Opcion {
|
|
@@ -43,6 +44,16 @@ interface FuenteDeOpciones<T extends Opcion> {
|
|
|
43
44
|
grupo?: (opcion: T) => string;
|
|
44
45
|
vacio?: string;
|
|
45
46
|
disabled?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Lo que va a la derecha del rótulo: un «No aplica» que apaga el campo. No se apaga con él,
|
|
49
|
+
* porque es lo que lo vuelve a prender.
|
|
50
|
+
*/
|
|
51
|
+
accesorio?: React.ReactNode;
|
|
52
|
+
/**
|
|
53
|
+
* Señala el campo mientras no tenga nada elegido: lo que falta capturar en un formulario largo.
|
|
54
|
+
* En ámbar y no en rojo, que es del error.
|
|
55
|
+
*/
|
|
56
|
+
resaltarVacio?: boolean;
|
|
46
57
|
}
|
|
47
58
|
|
|
48
59
|
export interface PropsDeSelectorDeOpcion<T extends Opcion> extends FuenteDeOpciones<T> {
|
|
@@ -191,24 +202,30 @@ function RenglonDelSelector({
|
|
|
191
202
|
texto,
|
|
192
203
|
detalle,
|
|
193
204
|
disabled,
|
|
205
|
+
accesorio,
|
|
206
|
+
pendiente,
|
|
194
207
|
onPress,
|
|
195
208
|
}: {
|
|
196
209
|
etiqueta: string;
|
|
197
210
|
texto: string | null;
|
|
198
211
|
detalle?: string | null;
|
|
199
212
|
disabled?: boolean;
|
|
213
|
+
accesorio?: React.ReactNode;
|
|
214
|
+
/** Vacío y se pidió resaltarlo (`resaltarVacio`). */
|
|
215
|
+
pendiente?: boolean;
|
|
200
216
|
onPress: () => void;
|
|
201
217
|
}) {
|
|
202
218
|
const c = usePaleta();
|
|
203
219
|
const styles = useStyles();
|
|
204
220
|
return (
|
|
205
|
-
<
|
|
221
|
+
<CajaDeCampo
|
|
222
|
+
etiqueta={etiqueta}
|
|
223
|
+
accesorio={accesorio}
|
|
206
224
|
onPress={onPress}
|
|
207
|
-
disabled={disabled}
|
|
208
225
|
accessibilityRole="button"
|
|
209
|
-
|
|
226
|
+
disabled={disabled}
|
|
227
|
+
pendiente={pendiente}
|
|
210
228
|
>
|
|
211
|
-
<Text style={styles.etiqueta}>{etiqueta}</Text>
|
|
212
229
|
<View style={styles.renglon}>
|
|
213
230
|
<Text style={[styles.valor, !texto && styles.sinValor]}>{texto ?? "Elegir…"}</Text>
|
|
214
231
|
<IconoDeRenglon
|
|
@@ -218,7 +235,7 @@ function RenglonDelSelector({
|
|
|
218
235
|
/>
|
|
219
236
|
</View>
|
|
220
237
|
{detalle ? <Text style={styles.detalle}>{detalle}</Text> : null}
|
|
221
|
-
</
|
|
238
|
+
</CajaDeCampo>
|
|
222
239
|
);
|
|
223
240
|
}
|
|
224
241
|
|
|
@@ -239,6 +256,8 @@ export default function SelectorDeOpcion<T extends Opcion>(props: PropsDeSelecto
|
|
|
239
256
|
textoDeNinguno = "Ninguno",
|
|
240
257
|
vacio,
|
|
241
258
|
disabled,
|
|
259
|
+
accesorio,
|
|
260
|
+
resaltarVacio,
|
|
242
261
|
} = props;
|
|
243
262
|
const styles = useStyles();
|
|
244
263
|
const [abierto, setAbierto] = React.useState(false);
|
|
@@ -257,6 +276,8 @@ export default function SelectorDeOpcion<T extends Opcion>(props: PropsDeSelecto
|
|
|
257
276
|
texto={valor ? valor.label : null}
|
|
258
277
|
detalle={valor ? detalle?.(valor) : null}
|
|
259
278
|
disabled={disabled}
|
|
279
|
+
accesorio={accesorio}
|
|
280
|
+
pendiente={resaltarVacio && !valor}
|
|
260
281
|
onPress={() => setAbierto(true)}
|
|
261
282
|
/>
|
|
262
283
|
<HojaDeOpciones
|
|
@@ -294,7 +315,18 @@ export default function SelectorDeOpcion<T extends Opcion>(props: PropsDeSelecto
|
|
|
294
315
|
* haga falta en vez de recortarse.
|
|
295
316
|
*/
|
|
296
317
|
export function SelectorDeVarias<T extends Opcion>(props: PropsDeSelectorDeVarias<T>) {
|
|
297
|
-
const {
|
|
318
|
+
const {
|
|
319
|
+
etiqueta,
|
|
320
|
+
valor,
|
|
321
|
+
onElegir,
|
|
322
|
+
cargando,
|
|
323
|
+
detalle,
|
|
324
|
+
grupo,
|
|
325
|
+
vacio,
|
|
326
|
+
disabled,
|
|
327
|
+
accesorio,
|
|
328
|
+
resaltarVacio,
|
|
329
|
+
} = props;
|
|
298
330
|
const [abierto, setAbierto] = React.useState(false);
|
|
299
331
|
const [marcadas, setMarcadas] = React.useState<T[]>(valor);
|
|
300
332
|
const { texto, buscar, visibles } = useBuscador(props);
|
|
@@ -320,6 +352,8 @@ export function SelectorDeVarias<T extends Opcion>(props: PropsDeSelectorDeVaria
|
|
|
320
352
|
etiqueta={etiqueta}
|
|
321
353
|
texto={valor.length ? valor.map((o) => o.label).join(", ") : null}
|
|
322
354
|
disabled={disabled}
|
|
355
|
+
accesorio={accesorio}
|
|
356
|
+
pendiente={resaltarVacio && !valor.length}
|
|
323
357
|
onPress={abrir}
|
|
324
358
|
/>
|
|
325
359
|
<HojaDeOpciones
|
|
@@ -352,22 +386,6 @@ export function SelectorDeVarias<T extends Opcion>(props: PropsDeSelectorDeVaria
|
|
|
352
386
|
}
|
|
353
387
|
|
|
354
388
|
const useStyles = crearEstilos((c) => ({
|
|
355
|
-
campo: {
|
|
356
|
-
backgroundColor: c.superficie,
|
|
357
|
-
borderRadius: 14,
|
|
358
|
-
borderWidth: 2,
|
|
359
|
-
borderColor: c.secondaryLighter,
|
|
360
|
-
padding: 14,
|
|
361
|
-
gap: 4,
|
|
362
|
-
},
|
|
363
|
-
campoInactivo: { opacity: 0.5 },
|
|
364
|
-
etiqueta: {
|
|
365
|
-
...renglon(tipografia.etiqueta),
|
|
366
|
-
fontWeight: "800",
|
|
367
|
-
color: c.secondary,
|
|
368
|
-
textTransform: "uppercase",
|
|
369
|
-
letterSpacing: 0.8,
|
|
370
|
-
},
|
|
371
389
|
renglon: { flexDirection: "row", alignItems: "flex-start", gap: 8 },
|
|
372
390
|
valor: { flex: 1, ...renglon(tipografia.subtitulo), fontWeight: "800", color: c.texto },
|
|
373
391
|
sinValor: { color: c.secondaryLight, fontWeight: "600" },
|
|
@@ -10,7 +10,7 @@ import type { CampoAtado } from "./controlados";
|
|
|
10
10
|
* con contorno y la etiqueta que sube al escribir. Con `contrasena`, oculta lo escrito y lleva el
|
|
11
11
|
* ojo para verlo.
|
|
12
12
|
*
|
|
13
|
-
* Es de Paper y no `TextoControlado`, que lleva su rótulo
|
|
13
|
+
* Es de Paper y no `TextoControlado`, que lleva su rótulo dentro de la caja, porque así es la pantalla de
|
|
14
14
|
* entrada de las apps.
|
|
15
15
|
*/
|
|
16
16
|
export default function TextoDeAccesoControlado<T extends FieldValues>({
|