codenautas/backend-plus

View on GitHub
doc/grillas.md

Summary

Maintainability
Test Coverage
# Grillas de backend-plus

## desde el menú

Simplemente hay que definir la grilla en la opción del menú, por ejemplo `{menuType:'table', name:'clientes'}`. 

opc      | predeterminado  | uso
---------|-----------------|-------------
`table`  | `name`          | nombre de la grilla
`fc`     | `[]`            | Fixed Columns en formato `{column:'n', operator:'=', value: 1}` o `{column:'value'}` para mostrar solo una parte de la tabla

## desde wScreens

Se puede abrir una grilla cualquiera en forma programática desde cualquier pantalla y en cualquier momento por ejemplo desde una `wScreen` así:

```ts
var div = new html.div().create();
my.tableGrid('clientes',div);
```

La función my.tableGrid devuelve una objeto grilla (que se puede usar para acceder a la grilla desde el programa por ejemplo para refrescarla) y recibe un tercer parámetro con las opciones. 

```ts
var mi_grilla = my.tableGrid('clientes',divGrilla,{
    fixedFields:[
        {fieldName:'activo', value:true}
    ], 
    tableDef:{
        layout:{errorList:true},
        hiddenColumns:['saldo'], 
        title:'clientes activos nuevos',
        filterColumns:[
            {column:'fecha', operator:'<=', value:hasta_fecha},
        ],
        allow:{delete:false, insert:false},
        firstDisplayCount:10, 
        firstDisplayOverLimit:10
    }
});
```

En el ejemplo se ven las siguientes opciones

opc           | predeterminado  | uso
--------------|-----------------|-------------
`fixedFields` | `[]`            | Fixed Columns en formato `{column:'n', operator:'=', value: 1}` o `{column:'value'}` para mostrar solo una parte de la tabla
`tableDef`    |*sin cambios*    | Cambios que se quieren hacer en la definición de la tabla referida a la grilla que se muestra. Los cambios se refieren solo al lado del cliente. 

Y dentro de `tableDef` se pueden cambiar las mismas que en la definición (que tengan sentido del lado del cliente). Por ejemplo:

opc           |  uso
--------------|--------------
`layout`        | Opciones de despliegue
`hiddenColumns` | Columnas que empiezan ocultas (el usuario puede verlas pidiéndolo desde el menú contextual)
`title`         | Título de la grilla
`filterColumns` | Formato `{column:'c', operator:'=', value:1}` similar a `FixedFields` pero los criterios de las `filterColumns` las ve el usuario y las puede cambiar
`allow`         | Para quitar los botones de insertar y eliminar o hacer readonly los campos. Desde el servidor no se impide el cambio.
`firstDisplayCount` | Máxima cantidad de líneas a mostrar cuando la cantidad e líneas es mayor a `firstDisplayOverLimit`
`firstDisplayOverLimit` | Si la tabla tiene esta cantidad de líneas o menos se muestran todas aunque el valor sea mayor a `firstDisplayCount`. Se puede usar para provincias, en general se puede poner 20 líneas de máximo y 25 en *over limit* para que la tabla provincias aparezca entera y las largas se corten en 20.

## grillas basadas en otras (desde el servidor)

Se puede definir una grilla basándose en otra de base y cambiándole pocas cosas. Los casos de uso son:
   1. Cambiar los permisos o visibilización para ciertas filas o columnas, 
   por ejemplo la definición de la tabla empleados podría no mostrar. 
   En este caso se podría basar la grilla *mis empleados* sobre la grilla *empleados* agregando las columnas necesarias. 
   2. Agregar una columna especial con `clientSide`.
   3. Usar una tabla para seleccionar details. Por ejemplo podría haber una opción de menú llamado *movimientos del cliente*
   que abra una vista basada en clientes no editable que tenga como `detailTable` los movimientos.

En [definicion-tablas](definicion-tablas.md) se pueden ver todas las opciones para definir la tabla en el servidor. 

**Atención**: la llamada a `context.be.tableDefAdapt` es opcional, pero para basar grillas en otras no hay que usarlo en la tabla base ni en la redefinida. 

Ejemplo:
```ts

export function clientes_activos(context:TableContext):TableDefinition {
    var defTable =context.be.tableStructures.clientes(context);
    defTable.name='clientes_activos';
    defTable.title='clientes activos';
    defTable.table='clientes'; // esto significa que se va a usar la misma tabla física de base
    defTable.elementName='cliente';
    defTable.fields.forEach(function(fieldDef){
        if(fieldDef.name=='saldo'){
            fieldDef.visible=true;
        }
    })
    defTable.fields.push({
        name:'dar_de_baja', typeName:'boolean', clientSide:'clienteDarDeBaja'
    }); // cuando esté basado en una tabla física solo se pueden agregar campos que no sean campos físicos
    defTable.sql.where="(activo = true)";
    return context.be.tableDefAdapt(defTable,context);
} 

```