KEPLIN Docs

Ajustes de la app

Tema, traducciones, autenticación y registro, cuentas de los usuarios, permisos y rotación de registros — todo lo que se afina en una app, sección a sección.

Cada app tiene sus propios ajustes — el tema es de esta app, las cuentas son de esta app, los permisos son de esta app. Por eso los ajustes viajan con ella cuando la exportas en un paquete (con las excepciones que la página «Importar y exportar apps» detalla). Esta página recorre todas las secciones, con atención especial a las seis que más se usan: tema, traducciones, autenticación, cuentas, permisos y rotación de registros.

Abrir los ajustes

  1. Abre la app en la barra lateral.
  2. En la parte superior de la barra de la app, haz clic en el botón de engranaje Ajustes de la app. El árbol de navegación da paso al árbol de los ajustes, organizado por grupos.
  3. Haz clic en una sección: se abre como una pestaña del espacio de trabajo — como una pantalla o un script — con el nombre de la app en la cabecera, la sección activa en una insignia al lado, y los botones de la sección (por ejemplo Guardar) siempre en la esquina superior derecha.

El árbol de los ajustes de la app, con los grupos y las secciones
El árbol de los ajustes de la app, con los grupos y las secciones

El mapa completo:

Grupo Sección Qué se define
Aplicación General Identificación, publicación, exportar y eliminar — ver las dos primeras páginas de este capítulo.
Aplicación Autenticación Cómo entran los usuarios en la app, registro público y recuperación.
Aplicación Notificaciones Los canales de notificación de la app: in-app y correo (SMTP propio).
Aplicación Almacenamiento A dónde van los archivos que los usuarios de la app suben (disco de la app, S3, SFTP, compartición de red).
Usuarios Usuarios de la app Las cuentas de quien usa la app construida.
Usuarios Permisos Roles y reglas: datos, pantallas, menús y acciones.
Apariencia Tema Colores, forma y tipografía de la app construida, con previsualización.
Localización Traducciones Los idiomas de la app y las frases traducidas, en una matriz.
Datos Rotación de registros Cuántos días se guarda cada tipo de registro antes de eliminarse.

Nota

Estos son los ajustes de la app — no confundir con los Ajustes de la plataforma (en la zona de administración de la barra lateral), que gobiernan la instalación entera: procesos de fondo, avisos, sesiones y límites globales.

Tema

La sección Tema pinta la app construida — la que tus usuarios ven — sin tocar ninguna pantalla. A la izquierda quedan los grupos de colores; a la derecha, el panel Preview muestra «Ejemplo con los tokens actuales — se actualiza en directo»: cada color que cambias aparece ahí al instante.

La sección Tema de los ajustes de la app: los grupos de colores a la izquierda y la previsualización en directo a la derecha.
La sección Tema de los ajustes de la app: los grupos de colores a la izquierda y la previsualización en directo a la derecha.

Cuadrícula de las pantallas

En la parte superior de la sección Tema queda la cuadrícula de las pantallas, que define cómo las 48 pistas de la cuadrícula se distribuyen por el ancho real de cada página:

Campo Qué hace
Canal (px) El intervalo fijo entre pistas. Dos widgets en pistas adyacentes quedan a esta distancia en cualquier monitor; las pistas crecen con el ancho, el canal no. Valor de origen: 16 px.
Ancho máximo (px) Por encima de este ancho el contenido deja de estirarse. Vacío = sin límite.
Alineación Dónde queda el contenido cuando la página es más ancha que el límite: centrado o a la izquierda.

Estos valores valen para todas las pantallas de la app. Una pantalla puede sustituir cualquiera de ellos en la categoría Cuadrícula del inspector del constructor de pantallas; un campo vacío en esa categoría hereda el valor de la app.

Grupo Qué pinta
Base «Fondo y texto de la app, contornos y focus.»
Superficies «Tarjetas y popovers (menús, dropdowns, tooltips).»
Colores «Colores semánticos de los componentes y el texto sobre cada uno» — primario, secundario, destructivo, acento, apagado.
Navegación «Barras de navegación de la app (superior, laterales, menús).» Por defecto siguen a las superficies; cámbialas para aplicar tu branding. La zona del logo de la barra superior tiene fondo propio (Fondo de la zona del logo); por defecto es el color de la barra.

Cada color tiene un selector visual y un campo hexadecimal (#rrggbb) — escribe o elige, es lo mismo. Al final de la lista, Forma y tipografía define el resto:

  • Radio de las esquinas — de Sin esquinas (0) a Máximo (1rem), en cinco pasos.
  • Posición de los avisos — en qué esquina aparecen los avisos (toasts) de la app.
  • Fuente (sans) — el stack de fuentes de la app.

Para guardar, Guardar; para volver a los colores de origen, Restaurar valores por defecto (los restaura en el editor — solo queda definitivo cuando guardes). El tema guardado se aplica de inmediato a la app construida, y viaja con ella en cualquier paquete.

Traducciones — los idiomas de la app

La sección Traducciones es una matriz: una fila por frase, una columna por idioma. Aquí es donde la app gana idiomas y donde las frases de las pantallas se traducen sin salir de un único cuadro.

La matriz de traducciones de la app: una fila por frase, una columna por idioma.
La matriz de traducciones de la app: una fila por frase, una columna por idioma.

  • Crear una frase: escribe en la última fila, que está siempre vacía esperando («escribir para crear…»). La Clave de la frase «(sale de la frase)» — es el propio texto en el idioma base el que la identifica en las pantallas.
  • Añadir un idioma: haz clic en el + de la cabecera, elige en «elegir idioma…» y confirma con Añadir idioma. Un idioma nuevo es una columna nueva, que nace vacía.
  • Cambiar el idioma base o eliminar un idioma: en el menú de la columna — Convertir en idioma base y Eliminar este idioma («Las traducciones de este idioma desaparecen con él.»).
  • Eliminar una frase: en el menú de la fila, Eliminar frase — sale de todos los idiomas cuando guardes.
  • Encontrar lo que falta: la búsqueda «Buscar en cualquier idioma…» y el filtro Por completar muestran solo las frases con celdas vacías.

En las pantallas, las frases se usan por el texto: t("Lista de clientes") en un evento TypeScript devuelve la traducción en el idioma de quien está usando la app. Para valores en medio de la frase, escríbelos entre llaves — «{n} registos» da «3 registos» — y la plataforma avisa (celda en amarillo) cuando una traducción pierde una llave que el original tiene: en ese idioma el valor no aparecería.

Consejo

Cambiar el texto de una frase ya guardada es cambiar su clave — y la plataforma la cambia también en las pantallas que la usan, diciendo en cuántas tocó. Nada queda apuntando a una frase que ya no existe.

Al final, Guardar: «Traducciones guardadas y compiladas.»

Quien usa la app elige el idioma en el selector de idioma de la navegación (el elemento Idioma) o en un botón de una pantalla que llame a keplin.i18n.setLocale. Sin elección, la app se abre en el idioma del navegador o del teléfono si la app lo tiene, y si no en el idioma base.

Autenticación y registro

La sección Autenticación define cómo se entra en la app construida — no en la plataforma. Son tres bloques:

La sección Autenticación de la app, con el modo de autenticación y el registro público
La sección Autenticación de la app, con el modo de autenticación y el registro público

Modo de autenticación — la elección de fondo:

Modo Cómo funciona
Username y contraseña «Los usuarios de la app entran con las credenciales gestionadas en la pestaña Usuarios.» Todo vive en la app; es el modo de origen.

El modo OAuth / OpenID Connect aún no está disponible: la única opción es la entrada con usuario y contraseña. Cuando exista, los campos del proveedor (issuer, client, secreto y scopes) aparecerán en esta sección.

Registro y recuperación — las pantallas de sistema públicas de la app:

  • Permitir registro público: activado, «cualquier visitante puede crear cuenta en la pantalla /register. Desactivado, la pantalla no se sirve.»
  • Role de los nuevos registros: «Role asignado automáticamente a quien se registra.» Elige un role de la lista de Permisos, o Sin role — pero sin role la cuenta entra y no ve datos ni pantallas.
  • La recuperación de contraseña envía el enlace por el canal de correo definido en Notificaciones — el canal tiene que estar activo y con el SMTP completo, si no, no hay correos de recuperación.

Guarda con Guardar («Autenticación guardada.»).

Usuarios de la app — las cuentas

La sección Usuarios de la app gestiona las cuentas de quien usa la app. El aviso de arriba es la regla de oro: «Estos usuarios son de la app construida — hacen login en la app en runtime y no tienen ningún acceso a la plataforma KEPLIN.»

La lista de usuarios de la app Gestión de Clientes: los roles de cada cuenta y el último acceso.
La lista de usuarios de la app Gestión de Clientes: los roles de cada cuenta y el último acceso.

La lista muestra cada cuenta con el Usuario, los Roles y el Último acceso («nunca entró» cuando nunca hubo login), y está hecha para responder preguntas:

  • La búsqueda «Buscar por nombre, usuario o correo…» y los filtros por role y estado encuentran cualquier cuenta.
  • El aviso ámbar «… usuario(s) sin ningún role — no ven datos ni pantallas» es clicable y filtra enseguida esas cuentas — es la causa número uno de «la app está vacía».
  • Selecciona varias cuentas para actuar en lote: Dar role, Quitar role, Activar, Desactivar — dar el mismo role a doce personas es una operación, no doce modales.

Crear o editar una cuenta (botón Nuevo usuario, o Editar en el menú de la fila — se abre en página, nunca en modal):

Campo Notas
Username Obligatorio. «Letras, números, punto, guion, _ y @.»
Nombre / Email Opcionales; el correo hace falta para la recuperación de contraseña.
Contraseña En la creación es la contraseña inicial — «el usuario puede cambiarla en la app.» En la edición, «solo rellena para definir una contraseña nueva.»
Activo Apagado, la cuenta existe pero «no puede entrar en la app.»
Roles Vistos por role. Una cuenta nueva trae premarcados los roles «por defecto» definidos en los Permisos.

Eliminar una cuenta (menú de la fila → Eliminar) es irreversible — el usuario deja de poder entrar en la app.

Nota

Los permisos no se editan en la cuenta. Se editan siempre en los roles, en la sección Permisos — una excepción puesta en una persona es una excepción que nadie vuelve a encontrar.

Permisos

La sección Permisos define qué puede hacer cada role en la app, en cuatro ejes: datos, pantallas, menús y acciones. «Los permisos se suman: quien tiene dos roles se queda con lo mejor de los dos.»

La sección Permisos de la app: los roles, con los usuarios y las reglas de cada uno, y las acciones declaradas debajo.
La sección Permisos de la app: los roles, con los usuarios y las reglas de cada uno, y las acciones declaradas debajo.

La lista de Roles muestra cada uno con el número de usuarios y de reglas, y las insignias «acceso total» y «por defecto». Nuevo role crea uno y abre enseguida su página, con cinco pestañas:

General — el Nombre, la Descripción y dos interruptores:

  • Acceso total: «Todo, sin excepciones — y sigue siendo correcto cuando la app crezca.» Es el role de administrador de la app; con él activado, las otras pestañas ni se aplican.
  • Dado por defecto: «Asignado a quien se registre o sea creado de nuevo.»

Datos — una fila por API de tabla, con cuatro marcas — Ver, Crear, Cambiar, Eliminar — y un Ámbito que dice a qué registros se llega:

Ámbito Significado
Todos los registros Sin restricción de filas.
Solo los míos Solo los registros cuyo «Campo que dice de quién es» sea el usuario con sesión.
Con condición… Solo los registros que cumplan un filtro que compones — con valores fijos o venidos de la sesión. Una condición «distinto de» o «ninguno de» incluye los registros con el campo vacío. Una condición sobre un campo que ya no existe en el modelo rechaza los datos, en lugar de mostrarlos todos.

«El ámbito se aplica en el servidor, en todas las lecturas y escrituras — en las pantallas, en el código, en los informes y en los workflows. Sin ninguna regla, este role no ve nada de esta API.»

Pantallas — para cada pantalla y cada dispositivo (Web, Tablet, Móvil), un nivel: Oculta («no aparece en los menús, y la ruta escrita a mano se rechaza»), Ver (solo lectura) («se abre en solo lectura — campos y botones que guardan quedan desactivados») o Editar. Los atajos «ver todas» / «ocultar todas» rellenan una columna entera. El «ver» es una ayuda visual; quien frena la escritura de verdad son los permisos de Datos, en el servidor.

Menús — al contrario que las pantallas, un menú es visible por defecto: la puerta es la pantalla, y esa ya está cerrada. Aquí se esconde el resto — un grupo entero, la campana de las notificaciones — por dispositivo. Desmarcar un grupo se lleva a los hijos con él.

Acciones — los verbos que solo existen en esta app: aprobar, cerrar, exportar. Se declaran en el panel Acciones de la lista de roles (una Clave como aprovar-despesa y un Nombre, botón Nueva acción) y cada role marca las que da. En las pantallas, cualquier widget tiene la propiedad «Acceso» para exigir una acción; en código TypeScript se pregunta keplin.session.can("aprovar-despesa").

Todo se guarda de una vez con Guardar («Permisos guardados.»). Eliminar un role avisa de cuántos usuarios se quedan sin él — «quien se quede sin ningún role deja de ver datos.»

Almacenamiento

La sección Almacenamiento dice adónde van los archivos que los usuarios de la app envían. Hay cuatro tipos:

Tipo Dónde quedan los archivos
Disco de la app En el disco de la app, en una subcarpeta de su almacén (uploads de origen).
S3 (o compatible) En un bucket S3 o compatible (MinIO, Wasabi, R2): endpoint, región, bucket, claves y un prefijo.
SFTP En un servidor por SSH, en una carpeta base.
Recurso compartido (Samba) En un recurso compartido Samba ya montado en el sistema operativo: el punto de montaje (por ejemplo /mnt/docs) y una subcarpeta.

Una app sin almacenamiento configurado gana el Disco de la app sola en el primer envío. Con varios, marca uno con Usar por defecto: es ahí adonde van los envíos que no eligen almacenamiento. Probar escribe, lee y borra un archivo de verdad, antes de guardar.

La subcarpeta es siempre una ruta relativa simple — carpetas separadas por /, sin .. — y el punto de montaje de un recurso compartido es siempre una ruta absoluta, fuera de la carpeta de datos de la plataforma y de la carpeta del programa. Una configuración fuera de estas reglas se rechaza al guardar.

Rotación de registros

Una app con tráfico escribe historial sin parar — llamadas, ejecuciones, clics. La sección Rotación de registros decide «cuántos días se guarda cada tipo de registro antes de eliminarse. Cero días significa guardar siempre.»

La matriz de la rotación de registros, con los días a guardar por tipo
La matriz de la rotación de registros, con los días a guardar por tipo

Es una cuadrícula con una fila por tipo de Registro y el plazo en Guardar (el campo muestra «Guardando siempre» cuando está a cero):

Registro Qué es De origen
Llamadas a las APIs «Una fila por petición GraphQL. Es lo que más rápido crece en una app con tráfico.» Guardar siempre
Ejecuciones de scripts «El historial que aparece en el botón «Ejecuciones» del editor de scripts.» Guardar siempre
Errores de las apps «Las ocurrencias de los problemas que el Radar muestra. Eliminar no hace desaparecer el problema, solo su historial.» Guardar siempre
Navegación y clics «Volumen alto y valor corto: sirve para investigar lo que acaba de pasar, no para historial.» 2 días
Programaciones «Las horas marcadas y lo que quedó sin cumplir. Lo que falló se guarda el doble de tiempo.» 30 días
Fichas de workflow «Solo las que ya terminaron. Las que aún corren o esperan a alguien nunca se eliminan. Las que fallaron quedan el doble de tiempo.» Guardar siempre
Auditoría «Quién hizo qué. Es compartida por todas las apps, por eso vale siempre el plazo más largo entre ellas.» Guardar siempre

La limpieza corre en todas las versiones de la app que tienen registros en disco — la de trabajo y las publicadas —, cada una con la política guardada en esa versión.

Guardar aplica la política («Rotación guardada.») y la limpieza pasa a correr de fondo, todos los días.

Consejo

En una app de producción, define plazos reales desde el primer día — 30 a 90 días para las llamadas a las APIs es un punto de partida saludable. «Guardar siempre» es óptimo en desarrollo y una factura de disco en producción.

Límites a tener en cuenta

Los límites que vas a encontrar en los ajustes y en los gestos de este capítulo:

Qué Límite
Nombre de la app 2 a 120 caracteres
Descripción de la app Hasta 500 caracteres
Username de un usuario de la app 2 a 120 caracteres (letras, números, punto, guion, _ y @)
Passphrase de exportación Mínimo 8 caracteres
Paquete de importación Máximo 1 GB
Rotación de registros 0 a 3650 días por tipo (0 = guardar siempre)

Los límites globales — la duración de las sesiones y el tamaño máximo de los archivos subidos — no son por app: viven en los Ajustes de la plataforma, en el panel «Sesiones y límites», y valen para toda la instalación.