Vista y Módulos de Formularios
© 2020 by César Arcila
This is still subject to change
Las especificaciones frontales para la vista o módulos de formularios de la plataforma OnMind puede entenderse como una capa abstracta y de unificación en la que se indica en un archivo JSON
los atributos para generar el módulo frontal de componentes orientados a la gestión interna en una empresa o negocio, en donde se procesan datos para su control, conocimiento y estrategia, entre otros aspectos. Se podría ver también como una extensión de caracter netamente técnico del Método OnMind al interior de OnMind.
Dicho lo anterior, resulta importante que hayas revisado primero la documentación sobre los componentes de la interfaz de usuario (UI) y los demás componentes Web de OnMind, así como tener fundamentos de programación en el lenguaje Javascript
moderno (2015+), aunque para empezar basicamente se requiere comprender el concepto de JSON
(JavaScript Object Notation) dado que se usará siendo un formato de intercambio de datos ligero y sencillo en el contexto respectivo.
Una ventaja que ofrece esta propuesta es posibilitar facilidad de comprensión tanto a programadores o analistas recién iniciados como de largo recorrido pero no actualizados en tecnologías web del momento, apuntando al desarrollo ágil (en tanto no se requiera abordar mayor cosa sobre el aspecto visual) y yendo directamente al punto tan pronto como sea posible. Por otra parte, se proyecta con ello a futuro una manera dónde se puede especificar algo y traducirlo en diversas plataformas o estilos. Se cuenta con una función para generar algunas plantillas (“scaffolding” o andamiaje) que se basa en lo que por ahora corresponde a las especificiones establecidas por mi parte como autor de estas.
Actualmente, el generador de formularios requiere la comprensión del concepto de arquetipos, sus hojas de datos y las concordancias de “Data Specs” (elemento
specs.main.form
que se puede encontrar avanzando este documento). La composición de formularios, sus eventos o métodos se encuentran en el documento de Componentes Web de OnMind.
Adicionalmente, para personalizaciones o un nivel avanzado existen Componentes UI de OnMind y Tips de Implementación con Riot de modo directo.
Un fundamento clave para el análisis y diseño con el método OnMind consiste en comprender los arquetipos. Esto nos lleva a identificar un modelo o patrón, es decir, cada vez que se necesita una estructura de datos ya se han definido como arquetipos y lo que se requiere es determinar a cuál correspondería mejor una nueva colección o hoja de datos. Puede revisarse el documento del Método OnMind, pero básicamente esto se ilustra pensando en una colección de datos grande o super-tabla (apoyándose en tecnología como BigData o NoSQL de ser necesario). Los principales arquetipos son los siguientes:
Prefijo | Nombre |
---|---|
one |
Identidades |
key |
Participantes |
you |
Círculos |
set |
Configuraciones o Entorno |
top |
Asuntos o Cosas |
ask |
Entradas o Solicitudes |
put |
Actividades o Bitácora |
sum |
Resumenes |
add |
Operaciones |
any |
Extraordinario |
Los arquetipos guardan una gerarquía interna o precedencia, por lo que no se requieren relaciones.
Definir una estructura general para una serie de especificaciones propuestas (muchas por implementar) es simplemente un intento de orientarnos a cierta portabilidad o comprender la visión técnica del método. Es decir, a partir de una especificación abstracta, quizás también declarativa, es posible llegar a implementar herramientas a nivel superior y generadores a nivel específico. Por ejemplo, una interfaz visual más sofisticada que genere el archivo de especificaciones y un proceso que corresponde a un generador con cierto estilo y librerías específicas. Bajo esta filosofía, de implementarse podría llegar a independizarse de algunas tecnologías, si se logra una tendencia genérica. En su propuesta inicial, OnMind hace uso de Javascript y una librería sencilla como Riot JS (que guarda semejanzas de estilo con HTML) para implementar código de formularios, pero esto podría variar si se hacen uso de especificaciones que luego pueden implentarse como proyectos con otras tecnologías. Veamos a continuación la estrucutra general:
{
"specs": {},
"nav": {},
"raw": {},
"top": {},
"bar": {},
"msg": {},
"fun": {},
"own": {}
}
En un esquema esencial bastaría con definir simplemente el elemento
specs
y establecer las concordancias de “Data Specs” (specs.main.form
) que es la manera simplificada cómo funciona el generador actualmente. Sin embargo, se documenta la especificación completa como parte de la visión del método.
En términos generales, esta sería una plantilla o estructura preliminar que deja ver los rasgos o elementos del nivel principal. Es importante recordar que estamos enfocándonos en un módulo o componente orientado a la gestión interna en una empresa o negocio, en donde se procesan datos para su control, conocimiento y estrategia. De allí que se implementan diferentes estados o instancias para dar un buen manejo y relación entre usabilidad y control admitido a un usuario de la interfaz, puesto que puede existir variación en la dinámica de un formulario cuando se inserta un registro nuevo y la que sucede cuando se está editando, por ejemplo, el identificador del registro debe protegerse de modificación o quizás exista un dato nuevo que aparece en el estado de edición dependiendo de la especificación dada. Dicho esto, se puede establecer la siguiente relacion de estados:
Elemento | Modo |
---|---|
new | Inserting |
see | Showing or Removing (read-only) |
set | Editing |
ask | Quering (reserved, not applied) |
for | Showing in Browse (iterable) |
.
Lo anterior sugiere que deberá implementarse el comportamiento de los datos por cada estado, es decir, especificarse para: new
, see
, set
y ask
(incluso para for
). Para mejor comprensión veamos la descripción de cada elemento de nivel principal.
Elemento | Descripción |
---|---|
specs | Especicación principal, pueden indicarse atributos de estilo |
nav | Corresponde a la barra de navegación y sus botones |
raw | Propiedades libres de estado (sin vincular) |
top | Datos relevantes para visualizar en una cabecera de un maestro-detalle |
bar | Opciones para implementar uso de la barra de menú lateral |
msg | Mensajes en idioma por defecto y secundario (traducción) |
fun | Reservado para sobreescribir el comportamiento de las funciones internas dado la necesidad o el requerimiento. |
own | Reservado para usar propiedades libres con alguna personalización específica para un usuario (o cliente) |
{
"specs": {
"languages": ["en","es"],
"main": {
"title": ["Title","Titulo"],
"icon": "",
"dai": "",
"archetype": "",
"making": "",
"rendering": "",
"tableref": "",
"oneness": "2",
"codefield": "id",
"linkfield": "id",
"nomode": ["ask"],
"form": {
"field1": {
"bind": "id",
"tag": "HIDDEN"
},
"field2": {
"bind": "column",
"tag": "INPUT",
"label": ["Name","Nombre"],
"new": {
"required": true,
"focus": true
},
"set": {
"tag": "INPUT",
"disabled": true
},
"ask": {
"tag": "HIDDEN"
},
"finder": true
},
}
},
"plus": [],
"stylish": {
"link": "default",
"engine" "default",
"hue": "default",
"inverse": false,
"mobilefirst": false,
},
"includes": [],
"components": {}
},
}
Los atributos relevantes que deben reportarse son los siguientes:
Atributo | Descripción |
---|---|
specs.main.title |
Titulo del módulo. Es posible omitirlo, en cuyo caso se asume el configurado para el objeto. Puede ser una lista para los lenguajes. |
specs.main.icon |
Icono para el módulo. Es posible omitirlo, en cuyo caso se asume el configurado para el objeto. |
specs.main.dai |
Ruta base de repositorio en la interfaz adaptadora de datos (DAI) |
specs.main.archetype |
Arquetipo. Se asocia con las clases superiores, categóricas y agrupadoras para identificar un modelo de datos de una manera abstracta dentro del repositorio de OnMind. En tanto se hace la analogía con objectos, los arquetipos corresponderían a las clases, es decir, son abstractos o una clasificación para los objetos. Se pueden citar, por ejemplo: YOU, SET, TOP, ASK, PUT, SUM, ADD |
specs.main.making |
Fabricación u objeto de base de datos relacionado con la hoja de datos. Tales objetos se gestionan en la central o plataforma de OnMind, deben haberse establecido y coincidir. |
specs.main.oneness |
Modalidad para aplicación de unicidad (1 o 2). Use 1 por defecto, el 2 indica que se genere un numero entero basado en la estampilla de tiempo y parte aleatoria. |
specs.main.codefield |
Codigo alternativo o llave candidata, que puede ser diferente del id. |
specs.main.linkfield |
Columna o propiedad usada para explorar registros de detalle en otros módulos o formularios, puede ser el mismo id o expresión que coresponda al enlace. |
specs.main.nomode |
Lista de modos de estados no aplicados para el componente o módulo. |
specs.main.form |
Especificaciones o definición de cada campo de datos. Usa propiedades como bind , tag , label , default , focus , finder , required , disabled , o modos (se aclara bajo el título: Sobre “Data Specs”) |
specs.includes |
Lista de nombres de librerías de scripts incluidas. Si la lista se encuentra vacía (null o [] ) se toma la plantilla por defecto. Por otra parte, si se requiere algo distinto a la plantilla por defecto precisamente se debe especificar toda la lista requerida (excepto la que se indique en specs.stylish.engine ). |
specs.components |
Lista de componentes. Los componentes pueden corresponder al conjunto disponible por la plataforma o a una librería incluida de un componente Riot |
Se reserva
specs.main.rendering
que correspondería a la representación o versión del objeto, considerada para ser implementada a largo plazo.
Se reservaspecs.plus
que posibilitaría bloques de datos adicionales aspecs.main
. Actualmente se cubre dada la dinámica o estilo adaptado para móviles (mobile-first), en donde se pasa de una página a otra cuando se explora el detalle.
Se reservaspecs.stylish
para fijar el comportamiento del estilo de modo personalizado. Actualmente, se asume el estilo por defecto establecido para la plataforma.
Lo que se busca es hacer una concordancia para especificar los datos en un formulario. Esto se usará en un generador. Cada dato o elemento para specs.main.form
, definido en formato JSON (ejemplo: { "x": {}, "y": {}, }
), puede tener los atributos que se describen a continuación:
Atributo | Descripción |
---|---|
bind |
Si se relaciona con un arquetipo del sistema, se establece la concordancia con el dato respectivo del meta-modelo o repositorio de datos internos (basado en arquetipos, su prefijo y el número del dato). |
tag |
Indica el componente o control a utilizar. Por ejemplo: tab-text , tab-view , tab-dropdown , tab-checkbox , tab-switch , tab-quantity , tab-money , tab-calendar , tab-time , tab-linkage . Puede remitirse al documento OnMind UI Components |
label |
Título o etiqueta a mostrar |
default |
Valor por defecto |
focus |
Indicador para determinar el enfoque inicial. Debe atribuirse a un campo (o según cada modo), sino el sistema tomará el primero que identifique internamente. |
finder |
Indicador para lista ágil de consulta en bloque. |
required |
Indicador para determinar si el dato es requerido. |
disabled |
Indicador para determinar si el dato se visualiza desabilitado. |
.
Se usa specs.main.form
considerando los modos o estados respectivos. Es decir, dada una dinámica con alguna particularidad se podrá definir haciendo uso de new
, see
, set
, ask
y for
, los cuales a su vez pueden usar propiedades como bind
, tag
, label
, focus
, finder
, required
, disabled
. Puede observarse en la estructura presentada. Tendríamos entonces lo siguiente:
Elemento | Descripción |
---|---|
new | Usado para campos o datos a solicitar en el estado de insercción |
see | Usado para campos o datos a visualizar cuando se selecciona un registro en una hoja de datos |
set | Usado para campos o datos a solicitar en el estado de edición |
ask | Usado para campos o datos a solicitar para consultas (actualmente para el filtro principal) |
for | Datos claves para visualizar en la hoja de datos iterables (listado o tabla)y el filtro de búsqueda en los resulstados obtenidos. Debería orientarse a datos relevantes comprendiendo que la disposición visual sugiere un estilo de previsualización y que cuando se selecciona un registro (see ) se puede ver el detalle respectivo. Además, se da prioridad a un estilo adaptado para móviles (mobile-first) alineados con un momento en donde la movilidad y lo digital son factores significativos. |
.
Se usa specs.main.form...new
(o new
) cuando existe alguna variación del comportamiento respecto a specs.main.form
, lo cual puede ser frecuente, por ejemplo, para una etiqueta o título, o un control de datos distinto en el evento de insercción. Este criterio sobre new
aplica también para see
, set
, ask
y for
respectivamente. A diferencia de see
que en pocas ocasiones se necesita indicar, for
siempre se debe especificar.
Internamente, también se usan las propiedades
super
,stage
yuse
. Además, paranew
, los eventosonsend
,oncancel
yonnext
tienen un comportamiento por defecto.
{
"nav": {
"tag": null,
"sidebarif": false,
"helpif": false
},
}
Internamente usa también las propiedades
stage
yuse
Reservado para una barra de propiedades como alternativa a
see
oset
de modo abierto, sin vincular campos, quedando definidos para su implementación.
{
"raw": {
"form": {
"field1": {
"name": 'user',
"tag": 'INPUT'
"label": ['User','Usuario'],
"required": true
},
"field2": {
"name": 'password',
"tag": 'PASSWORD',
"label": ['Password','Clave'],
"required": true
},
}
},
}
Actualmente se aplica una cabecera maestra. Se planifica para hacer o implementar un modo más sofisticado.
{
"top": {
"dai": "",
"archetype": "",
"making": "",
"rendering": "",
"tableref": "",
"form": {
"field1": {
"bind": 'id',
"tag": 'HIDDEN'
},
"field2": {
"bind": 'column',
"tag": 'INPUT',
"label": ['Header','Cabecera']
},
}
},
}
Internamente usa también las propiedades
stage
yuse
. Además los eventosonrow
,oncard
yonlinked
con un comportamiento por defecto.
Planificado para hacer o implementar desde cero correspondiendo a un menú de barra lateral
{
"bar": {
},
}
Reservado para mensajes y su traducción
{
"msg": {
},
}
Reservado para sobreescribir el comportamiento de las funciones internas dado la necesidad o el requerimiento. Los métodos o funciones de éste elemento se podrán ver en dellate citándose bajo el título “Eventos o métodos personalizables (fun)”.
{
"fun": {
"first": () => {},
"find": () => {}
},
}
Reservado para usar propiedades y metodos libres con alguna personalización específica para un usuario (o cliente), por ejemplo, funciones aplicadas al componente.
{
"own": {
"method": () => {}
},
}
{
"specs": {
"languages": ["en","es"],
"main": {
"title": ["Title","Titulo"],
"icon": "",
"dai": "",
"archetype": "",
"making": "",
"rendering": "",
"tableref": "",
"oneness": "2",
"codefield": "id",
"linkfield": "id",
"nomode": ["ask"],
"form": {
"field1": {
"bind": "id",
"tag": "HIDDEN"
},
"field2": {
"bind": "column",
"tag": "INPUT",
"label": ["Name","Nombre"],
"new": {
"required": true,
"focus": true
},
"set": {
"tag": "INPUT",
"disabled": true
},
"ask": {
"tag": "HIDDEN"
},
"finder": true
},
}
},
"stylish": {
"link": "default",
"hue": "default",
"inverse": false,
"mobilefirst": false
},
"includes": []
},
"nav": {
"sidebarif": false,
"helpif": false
},
"top": {
"dai": "",
"archetype": "",
"making": "",
"rendering": "",
"tableref": "",
"form": {
"field1": {
"bind": 'id',
"tag": 'HIDDEN'
},
"field2": {
"bind": 'column',
"tag": 'INPUT',
"label": ['Header','Cabecera']
},
}
},
}