Mostrando entradas con la etiqueta jsClient. Mostrar todas las entradas
Mostrando entradas con la etiqueta jsClient. Mostrar todas las entradas

13 noviembre 2017

Componentes JSON&JS (Parte 12 de 12)

El JavaScript     

Una vez creado el fichero JSON del control y agregado a la carpeta Omnis correspondiente, será el momento para añadir el archivo JavaScript que le da soporte (si hemos usado el "JSON Control Editor" esto se habrá hecho automáticamente). Para hacerlo manualmente deberemos añadir lo siguiente al fichero html, que cargue nuestro formulario remoto:
 ≤script type="text/javascript" src="scripts/ctl_net_omnis_mycontrol.js"≥≤/script≥
Si lo colocamos bajo la sección para scripts del archivo "jsctempl.htm" (en la carpeta html) haremos que siempre se incluya en la página HTML que Omnis genera automáticamente para probar nuestro formularios remotos, pero, para la aplicación final, también deberemos incluirlo en la página HTML que lance la aplicación web o móvil desplegada.

06 noviembre 2017

Componentes JSON&JS (Parte 11 de 12)

html    

Es obligatorio y permite especificar cómo se generará el HTML inicial que remitirá al cliente el control (es el contenedor del control). Posee los siguientes elementos:
  • template
Obligatorio. Básicamente consiste en un texto que conforma la plantilla con el "div" que contendrá el control. Por ejemplo: ≤div %o %s data-props='%p' data-mvprops=‘%m’≥≤/div≥:

JsControls sustituirá el "%o" por los atributos del JavaScript, mediante su "id", por lo que deberá especificarse este elemento, reemplazará el "%s" con el atributo de estilo para la "div", basándose en las propiedades que soporta el control, también reemplazará el "%p" según las propiedades de control que siempre que no sean multi-valor. "%p" es reemplazado por una cadena JSON, que describe un objeto, donde cada uno de sus miembros contiene el nombre de la propiedad y su valor. 
El valor puede haber sido asignado por Omnis según lo requerido, para ciertos tipos de propiedades, tales como "color" e "icon". El cliente JavaScript usará esta cadena para componer un objeto adicional, con la configuración de la propiedad.

JsControls también reemplazará "%m" con las propiedades de control multi-valr. "%m" deberá omitirse si el control no hace uso de éste tipo de propiedades. Como en el caso de "%p", "%m" es sustituido por una cadena JSON, excepto que se trata de una matriz de objetos, con una entrada para cada elemento o valor-múltiple.
  • extrastyles
Opcional. Texto no superior a 255 caracteres con los atributos de estilo extra para incluir junto con el atributo de estilo "%s" en la plantilla, por ejemplo: "Margen: 2px".
  • padding
Opcional. Deberá ser un entero utilizado para establecer el "padding" (en píxeles) junto con "%s".
  • relativeposition
Opcional y booleano. (por defecto "false") Si es "true", el atributo de estilo que reemplaza "%s" usará posicionamiento relativo en lugar de absoluto. 
  • nowrap
Opcional y booleano. (por defecto "false") Si es "true", el atributo style que reemplaza el "%s" incluirá "white-space nowrap".
Ejemplo:
"html": {
"template": "
", "extrastyles":"margin:1px;"
}
La "div" resultante para el control podría verse así:

≤div style='position:absolute; top:0px; left:0px; height:106px; width:88px; font- family:'Times New Roman',Georgia,Serif; font-size:12pt;font- weight:bold; font- style:italic;text-align:right;color:#00FFFF; overflow- x:auto; overflow-y:auto;margin:1px;' data-backgroundcolor='#555555; rgba(85,85,85,1.0000)' data-dragmode='1' data- effect='1' data-linestyle='1' data-bordercolor='16711935' data- props='{"headercolor":"#FF0000","headericon":"icons/datafile/omnispic/001663 n16.png? 46", "rangeofinternalconstants":14, "rangeofexternalconstants":5, "headerpattern": 1, "headerfontstyle":4, "headerlinestyle":7, "headermultiline":"Lots of text entered like this\rwith multiple\rlines\r", "headerset": 13, "headerremotemenu":"NewRemoteMenu", "headerfont":"Courier New,Monospace"}'  data- mvprops='[{"mvprop1":1,"mvprop2":false,"mvprop3":""}, {"mvprop1": 2,"mvprop2":true, "mvprop3":"NewRemoteMenu"}, {"mvprop1": 2,"mvprop2":true,"mvprop3":"aaaa"}]'≥≤/div≥
Es importante el uso de comillas simples para encerrar los atributos de la plantilla, ya que JSON incluye comillas dobles. JsControls escapará el uso de comillas simples en el JSON que se inserten en como \u0027.


customtabname

El elemento "customtabname" es opcional y permite especificar el nombre que tendrá en la ficha de propiedades el control, al mostrarse sobre el "Property Manager". 

    30 octubre 2017

    Componentes JSON&JS (Parte 10 de 12)

    methods   

    Es opcional y permite especificar los métodos "client-executed" que proporciona el control. Cada miembro del grupo identifica un método. El nombre de cada uno es el también el nombre del método, incluyendo su prefijo "$". Los elementos válidos para la definición de un método son:
    • id
    Es obligatorio, será el número (entero positivo) del método. Debe ser único dentro del contexto del control. Es utilizado internamente por Omnis.
    • desc
    Es obligatorio, y deberá consistir en un texto descriptivo del método. 
    • type
    Es obligatorio e indica el tipo de dato que retorna el método. ("integer", "boolean", "character" o "list")
    • parameters
    Es opcional. Consiste en una matriz que describe los parámetros del método. Cada miembro de la matriz es un parámetro con los siguientes atributos: 
    • name
    Es obligatorio y es el nombre del parámetro. Omnis insertará el carácter "p" al comienzo de este nombre.
    • desc
    Es obligatorio y deberá consistir en un texto descriptivo del parámetro. 
    • type
    Es obligatorio e indica el tipo de datos que admitirá el parámetro. ("integer", "character", "boolean" o "list").
    • altered
    Opcional. Deberá ser booleano. (por defecto "false") Si es "true", el parámetro se marcará como no-alterable.  
    • optional 
    Opcional. Deberá ser booleano. (por defecto "false"). Si es "true", el parámetro se marcará como opcional. 
     Ejemplo:
    "methods": {
       "$mymethod1": { 
          "id": 1,
          "desc": "This is my method", 
          "type": "integer", "parameters": [
       {
          "name": "p1",
          "type": "character", 
          "altered": true,
          "desc": "The parameter p1"
       },
       {
          "name": "p2",
          "type": "integer",
          "desc": "The parameter p2", 
          "optional":true
        }
       ]
      }
    }

    25 octubre 2017

    Componentes JSON&JS (Parte 9 de 12)

    events  

    Es opcional y permite especificar los eventos que generará el control (además de los indicados en el grupo "flags"). Cada miembro del objeto events identifica un evento. El nombre de cada uno es también el nombre del evento, incluyendo su prefijo "ev". Se pueden incluir ciertos eventos estándar, tales como: "evClick", "evDoubleClick", "evTabSelected", "evCellChanges", "evHeaderClick" y "evHeadedListDisplayOrderChanged". Los elementos válidos de cada objeto-evento son:
    • id
    No debe especificarse para eventos estándar, pero, para el resto es obligatorio y debe ser un número entero positivo. Este identificador deberá coincidir con el identificador de evento, usado en la construcción del control JavaScript  y ser único dentro del contexto del mismo. 
    • desc
    No debe especificarse para eventos estándar, pero, para el resto es obligatorio y deberá consistir en un texto descriptivo del evento. 
    • parameters
    Define los parámetros del evento. Consiste es una lista, donde cada línea de la misma, identifica a cada uno de los parámetros, conformando por los siguientes elementos: 
    • name
    Es obligatorio y da nombre al parámetro. No deberá incluirse el prefijo "p". (ya que será agregado por Omnis) Tenga en cuenta que si se usara de nuevo el mismo nombre para definir otro parámetro, se tomará sólo su primera definición, ignorándose el resto, incluyendo su tipo y descripción.
    • type
    Es obligatorio e indica el tipo de datos que admitirá el parámetro. ("integer", "character", "boolean" o "list").
    • desc
    Es obligatorio y deberá consistir en un texto descriptivo del parámetro. 
     Ejemplo:
    "events": {
       "evNetOmnisControlOpened": { 
          "id": 1,
          "desc": "The event sent when the control opens", 
          "parameters": [
             {
                "name": "name",
                "type": "character",
                "desc": "The name event parameter"
             },
            {
               "name": "name2",
               "type": "integer",
               "desc": "The second event parameter"
            }
          ]
         },
         "evClick": {
         "parameters": [
            {
               "name": "zname1",
               "type": "character",
               "desc": "The zname1 event parameter"
            },
            {
               "name": "zname2",
               "type": "integer",
               "desc": "The zname2 event parameter"
            },
            {
              "name": "horzcell",
              "type": "character",
              "desc": "the horz cell event parameter"
            }
          ]
       }

    16 octubre 2017

    Componentes JSON&JS (Parte 8 de 12)

    multivalueproperties 

    El grupo de propiedades multivalor es opcional y permite configurar propiedades que pueden contener múltiples valores. A continuación describimos cada uno de sus miembros:
    • itemlistproperty
    Es obligatorio. Cuando un control admite propiedades con varios valores, éstas son guardadas en una lista. Cada fila de la lista contendrá el conjunto de propiedades de la pestaña o columna en particular. Llamaremos a la pestaña o columna "elemento". Esto significa que éstas propiedades mostrarán una lista de tipos, que se ocultará automáticamente sobre el "Property manager". 
    • itemcountproperty
    Es obligatorio y debe ser el nombre de una propiedad "integer" definida en el grupo de propiedades, de modo que se podrá especificar el número de elementos en la lista. Se podrá especificar un valor máximo para esta propiedad, a fin de restringir el número de elementos, de lo contrario se limitará a no más de 256. 
    • currentitemproperty
    Es obligatorio y debe ser el nombre de una propiedad "integer" definida en el grupo de propiedades. Identifica al elemento actual seleccionado en el "Property Manager", los cambios aplican sólo a propiedades multi-valor. 
    • moveitemproperty
    Es obligatorio y debe ser el nombre de una propiedad "integer" definida en el grupo de propiedades. Es utilizado para mover el elemento actual a una nueva posición en la lista de elementos.
    • properties
    Es obligatorio. Permite conformar su lista de valores. Cada miembro ("Property Name") deberá corresponder con el nombre de una propiedad de entre el grupo de propiedades principal; El valor para cada miembro conforma la lista de valores para la propiedad. Es importante no cambiar el orden de las columnas una vez se haya comenzado a utilizar el control.
    Ejemplo: 
    "multivalueproperties": { 
         "currentitemproperty": "curitem",
         "itemlistproperty": "itemlist",
         "moveitemproperty": "move",
         "itemcountproperty": "itemcount", 
         "properties": {
              "mvprop1": 1,
              "mvprop2": 2
             }
          }
    }

    constants 

    Es obligatorio y permite definir las constantes del control. Cada miembro del objeto constantes es en sí mismo un objeto que contiene los miembros que describen cada constante. Su nombre será también el nombre de la constante. Los elementos válidos para definir cada objeto constante son:
    • value
    Es el valor de tipo "integer" de la constante y es obligatorio.
    • desc
    Descripción de la constante. Un texto obligatorio, utilizado por el IDE como información adicional para la herramienta "catalog". 
    • group
    Identifica al grupo en el "catalog" al que pertenece la constante y es opcional. De forma predeterminada, todas las constantes pertenecerán al grupo "RF:jsControls-≤control name≥". Todas las constantes que figuren a continuación de la que contenga un nombre del grupo, se entenderá como pertenecientes a ese grupo, hasta que se especifique un nuevo nombre de grupo (si procede).
    Ejemplo: 
    "constants": { 
         "kNetOmnisControlHeaderColor": {
             "value": 123,
             "desc": "The description of this constant"
         },
         "kNetOmnisControl1Range1": { 
            "value": 3,
            "desc": "Range constant 1”, 
            “group": “Ranges"
         },
         "kNetOmnisControl1Range2": { 
            "value": 5,
            "desc": "Range constant 2"
         }
    }

    09 octubre 2017

    Componentes JSON&JS (Parte 7 de 12)

    properties

    Éste grupo es obligatorio. Contiene el conjunto de propiedades específicas del control. Cada uno de sus miembros es una propiedad y es en sí mismo un objeto que a su vez contiene los elementos que la describen. El nombre de cada miembro constituye el nombre de la propiedad, sin el prefijo "$".
    Los miembros válidos para cada propiedad son los siguientes:

    • id
    Es el identificador de la propiedad. Un entero positivo. Es obligatorio y es un campo crítico ya que Omnis usa éste dato para identificar la propiedad. Lo cual significa que no deberá cambiar estos valores de ID una vez que se ha comenzado a hacer uso del control. Id, debe ser único para todas las propiedades del control. Cuando "jsControls" carga el control, validará su unicidad. Normalmente se comenzar a numerar las propiedades desde 1. 

    • desc
    Es la descripción de la propiedad. Un texto obligatorio, utilizado por el IDE, por ejemplo, como "tooltip" de la propiedad en el "Property Manager". 

    • tab
    Es opcional y es el texto que identifica la ficha a la que pertenece en el "Property Manager". "custom" será la ficha predeterminada, si se omite. De lo contrario, deberá usarse uno de los siguientes valores: "custom", "general", "data", "appearance", "action", "prefs", "text", "pane", "sections", "java" o "column".

    • type
    Es obligatorio. Identifica el tipo de la propiedad. Puede ser uno de los básicos (integer, character, boolean o list) o uno específico como (color, dataname, font, icon, pattern, fontstyle, linestyle, multiline, set, o remotemenu). 

    • runtimeonly
    Es opcional y booleano, si es "true" indica que la propiedad es "runtime only". Su valor predeterminado si es omitido es "false". 

    • findandreplace
    Es opcional y booleano, si es "true" indica que la propiedad puede ser localizada mediante "find and replace". Su valor predeterminado es "false". 

    • extconstant
    Es opcional y booleano, si es "true" indica que la propiedad está restringida a un rango de constantes predefinidas para este control. Esto afectará al menú emergente en el "Property Manager". Puede usarse tanto con propiedades de tipo "integer" como con las de tipo "set"; En este último caso, el primer miembro del rango deberá ser una constante con valor cero, para representar al "set" vacío. 

    • intconstant
    Es opcional y booleano, si es "true" indica que la propiedad está restringida a un rango de constantes predefinidas desde el núcleo de Omnis. Esto afectará al menú emergente en el "Property Manager". Puede usarse tanto con propiedades de tipo "integer" como con las de tipo "set"; En este último caso, el primer miembro del rango deberá ser una constante con valor cero, para representar al "set" vacío. "extconstant" y "intcontant" no deben ser "true" al mismo tiempo. 

    • constrangestart y constrangeend
    Ambos deben existir si "extconstant" o "intconstant" son "true". En el caso de "intconstant", son "idents" (identificadores) de constantes que conformarán el rango de constantes a usar (podrá saber cuales son los "idents" de las constantes de núcleo Omnis, consultando el grupo "$constants" mediante el "Notation inspector"). En el caso de "extconstant", serán los nombres de las constantes definidas para el control; El conjunto estará entre "constrangestart" y "constrangeend" y en el orden en que figuren en el fichero "control.json". Tenga en cuenta que cuando se utiliza con un "set", los valores de las constantes deberán corresponderse con el "bit mask" (máscara) usada para representar el "set". 

    • min  y 
    --> max
    Son opcionales y solo se aplican cuando el tipo es "integer". Especifican los valores mínimos y máximos de la propiedad. 

    • initial
    Es opcional y puede ser utilizado para indicar el valor inicial de la propiedad. Para los tipos "character", deberá ser un texto. Para tipos "integer", deberá ser un número entero. Para tipos "boolean" deberá ser un valor booleano.
    Ejemplo:
    "properties": { 
         "headercolor": {
              "id": 1, 
              "desc": "The header color of the control", 
              "type": "color",
              "tab": “appearance”,
              "initial": 255
         },
         "headericon": { 
              "id": 2,
              "desc": "The header icon of the control", 
              "popuptype": "icon",
              "tab": "appearance"
         },
         "rangeofexternalconstants": { 
           "id": 3,
           "desc": "Range of external constants", 
           "type": "integer",
           "extconstant": true,
           "constrangestart": "kNetOmnisControl1Range1",
           "constrangeend": "kNetOmnisControl1Range3",
         }
    }

    02 octubre 2017

    Componentes JSON&JS (Parte 6 de 12)

    JSON Control Object


    Cada control posee un archivo JSON denominado "control.json" conteniendo su definición. A continuación describiremos en detalle cada uno de los miembros de este objeto según sus secciones:

    name


      El nombre es obligatorio; Determina el nombre del control como componente externo y también el nombre de la clase JavaScript en la forma "ctrl_≤nombre≥", por ejemplo para...
       "name": “net_omnis_control1"
      ...la clase JavaScript sería ctrl_net_omnis_control1. 

       flags


        El grupo "flags" es obligatorio. Permite configurar ciertas características del control. Cada miembro de éste grupo es opcional y si son omitidos su valor por defecto será "false", siendo sus miembros válidos los siguientes:
        • beforeafterevents y beforeevents  (excluyentes mutuamente
        Indica si el control admite el uso de "evAfter" y "evBefore", o sólamente "evBefore", respectivamente. Si ambos son omitidos, indicará que el control no soporta ninguno de éstos eventos (véase "events")
        •  backcolorandalpha
        Indica si el control admite las propiedades "backcolor" y "backalfa". 
        •  noenabled
        Indica si el control puede no tener habilitada la propiedad. 
        •  transparentbackground
        Indica que el control posee fondo transparente y que no hace uso de las propiedades "backcolor" y "backalfa". No puede ser usado con "backcolorandalpha" a "true". 
        •  hasdefaultborder
        Indica si la propiedad "$effect" del control, puede contener el valor "kJSborderDefault". 
        •  hasdisplayformat
        Indica si el control contiene propiedades en formato de fecha y número. 
        •  hasdragevents
        Indica si el control permite eventos de arrastrar y soltar (véase "events"). 
        Ejemplo:
        "flags": {
            "beforeafterevents": true, 
            "backcolorandalpha": true, 
            "noenabled": true, 
            "hasdefaultborder": false, 
            "hasdisplayformat": true, 
            "hasdragevents": true
        }, 

         standardproperties



          El grupo "standardproperties" es opcional. Contiene las propiedades estándar soportadas por el control; La inclusión de cualquiera de sus miembros significa que el control admitirá la propiedad. Se trata de propiedades básicas aplicables a todos los controles.
          Miembros válidos del grupo son: "“dataname", “effect", “bordercolor", “borderradius", “linestyle", “font", "textcolor", "align", “fontstyle", “fontsize", “horzscroll", “vertscroll", "autoscroll" y “dragmode”.
          Ejemplo:
          "standardproperties": [
               "dataname", 
               "effect", 
               "bordercolor", 
               "borderradius", 
               "linestyle",
          ],
            

            25 septiembre 2017

            Componentes JSON&JS (Parte 5 de 12)

            JSON Control Definition


            En esta entrada describiremos las diferentes propiedades que pueden ser definidas en el archivo JCD, todas ellas editables mediante el "JSON Control Editor" (recuerde que también pueden ser editadas mediante cualquier otro editor de textos externo).

            La nueva carpeta "html/controls", contiene a su vez una subcarpeta por cada control JSON ya definido. Los nombres de estas subcarpetas no son críticos, pero tiene sentido usar el mismo nombre que el usado para el control.

            El "JSON Control Editor" creará la carpeta "html/controls" tras construir su primer control, de lo contrario (si está usando un control ya existente) necesitará crear esta carpeta manualmente. (IMPORTANTE: No confundirse con la carpeta "htmlcontrols" la cual contiene los controles definidos para su uso con el objeto oBrowser)

            Cada carpeta de control, contendrá un archivo denominado "control.json". Además, podrá contener archivos PNG, con cualquier nombre pero siempre incluyendo los archivos PNG: "16x16", "16x16_2x", "48x48" y "48x48_2x", ya que serán los usados como icono representativo del control, en el "Component Store" y en los formularios remotos. Los archivos PNG deberán tener la extensión ".png".

            Un nuevo componente externo denominado "jsControls", (situado sobre la carpeta "jscomp") es el encargado de gestionar todos los controles JSON, éste realiza la carga y validación de cada uno de los controles durante el arranque. Todos los que pasan la validación son mostrados en el "Component Store". Si un control no pasa la validación, "jsControls" abre el registro de seguimiento (log) y agrega un mensaje para indicar que existe un problema con el control. El problema exacto se podrá consultar en un archivo denominado "control_errors.txt" situado sobre propia carpeta del control.

            Cada control deberá tener un nombre único y estar indicado dentro del fichero "control.json" (ver más adelante), podrá usarse una convención similar a Java, excepto que Omnis utiliza el carácter de subrayado en lugar del punto, por ejemplo. "net_omnis_control1", ya que el uso de puntos causaría problemas de incompatibilidad con la sintaxis de notación usada en Omnis.

            18 septiembre 2017

            Componentes JSON&JS (Parte 4 de 12)

            Uso de componentes JSON&JS ya preparados


            Para hacer uso de componentes JSON&JS ya preparados, (es decir los obtenidos de terceros) deberá comenzar por agregar los archivos con extensión ".js" a la carpeta "html/scripts", así como cualesquiera otros archivos CSS y de imagen necesarios para el correcto funcionamiento del control sobre las carpetas correspondientes. También necesitaremos disponer de las propiedades, métodos y eventos del control, contenidas en el fichero JSON de definición y creado mediante el "JSON Control Editor".

            Una nota técnica en el sitio web de Omnis describe con detalle el procedimiento a usar, siguiendo como modelo un componente JSON&JS disponible para descargar e instalar libremente:

            También necesitará consultar la guía "JavaScript Control Reference" del "JS SDK" y que podrá encontrar aquí:


            11 septiembre 2017

            Gestión de licencias del Servidor de Aplicaciones Omnis versión 8.1 y Web Service

            Desde la versión 8.1, las conexiones hacia el Servidor de Aplicaciones Omnis (mediante jsClient) realizadas desde un mismo navegador del cliente, ahora cuentan como un solo uso de licencia para el servidor. Anteriormente se contaba cada conexión como usuarios independientes, lo que incluía el consumo adicional de licencias de servidor.

            La tecnología "jsClient" ahora genera automáticamente un UUID de identificación, el cual guardará como una cookie (denominada OMNISCLIENTID) y que se enviará como parámetro con cada conexión. La cookie caducará tras un año, generando entonces un nuevo UUID. Las cookies deben estar habilitadas tanto en el servidor web, como en cualquier cliente que desee conectarse, para que esto funcione.

            En cuanto al uso de la extensión "Web Services", mencionar que ya no necesitamos un número de serie para hacer uso de servicios web basados en REST, no obstante recuerde que si hacemos uso del objeto "HTTPClientWorker" para generar un cliente de Servicios Web (WSDL), necesitaremos instalar y configurar Java (no será necesario con los nuevos objetos de OW3 CURL).

            Componentes JSON&JS (Parte 3 de 12)

            Propiedades


            Para establecer las propiedades del control, disponemos de los apartados siguientes:

            • Flags
            Permiten indicar que eventos estarán o no habilitados, si el control tendrá fondo transparente, si se permite la capacidad de arrastrar-soltar y otros por el estilo.

            • Standard properties
            Tabla de propiedades estándar soportadas por el control además de las básicas, tales como su nombre.

            • Properties
            Permite la definición de un objeto con las propiedades específicas del control; La columna nombre, (name) determina cada uno de los miembros del "object-properties" es el nombre de la propiedad, la cual deberá escribirse sin el símbolo "$". El resto de las columnas determinarán cada aspecto de la propiedad.

            • Multivalue properties
            Permite configurar posibles valores (múltiples valores) para las propiedades que así lo requieran.

            • Constants
            Permite la definición de un objeto con las constantes que tendremos disponibles para su uso con el control. (Name, Value y Desc) 

            • Events
            Permite definir que eventos generará el control (además de los especificados en el grupo "Flags") e incluye eventos estándar como "evClick"; Note que sus nombres incluyen el prefijo "ev" 

            •  Methods
            Permite indicar los nombres de los métodos de tipo "client-executed" (ejecución del lado del cliente) proporcionados por el control; El nombre del método deberá incluir el prefijo "$".

            •  Html
            Permite indicar cómo deberá generarse el HTML que enviará el control al cliente.

            La opción "Save" creará el archivo JSON del control sobre la carpeta "html/controls". La opción "Build" creará el archivo JavaScript correspondiente al control, sobre la carpeta "html/scripts" (localizable sobre el directorio raíz de instalación Omnis). También se le preguntará sobre la idónea inclusión de una referencia al archivo JavaScript del control, en el archivo "jsctempl.htm", lo cual garantizará que el control esté disponible para probarlo con cualquier formulario remoto que pueda contenerlo.

            Tras la creación de cualquier control JSON, deberá reiniciarse Omnis, a fin de que esté disponible para su uso. Después del reinicio, el control aparecerá sobre la pestaña "JSON Components" del "Component Store" listo para ser usado. Para su entrega con la aplicación final, deberá colocar los archivos JSON y JavaScript sobre las carpetas correspondientes del servidor Web y verificar que se esté haciendo referencia al mismo, desde la página html, encargada de cargar el formulario remoto.







            05 septiembre 2017

            Indicador de carga personalizado (comando "showloadingoverlay")

            Desde la versión Omnis Studio 8.0.2 en adelante es posible agregar un indicador de carga (imagen animada) sobre un determinado componente o bien cubriendo el entero formulario remoto, ésto es posible gracias a un nuevo "clientcommand", denominado "showloadingoverlay".

            Esto es realmente útil, pues nos permite mostrar al usuario un indicador de que se está la espera de la conclusión de un proceso largo, hasta que la información deseada aparezca actualizada para ese componente o formulario, al mismo tiempo que se evita posibles acciones del usuario sobre los elementos mostrados en el mismo. Resultará especialmente útil si están realizando operaciones asíncronas, como cargar una lista con valores desde un acceso SQL. Cómo ya sabemos, los llamados comandos-cliente, tales como "showloadingoverlay", deben ser ejecutados mediante el método "$clientcommand", del siguiente modo:

            Do $cinst.$clientcommand("showloadingoverlay",rowvariable)

            Donde "rowvariable" es "row(show,controlName,message,cssClass)".

            • show
            Valor booleano "kTrue" indica que deberá mostrarse, "kFalse" para ocultarlo.

            • controlName
            Es el la propiedad "$nombre" del componente en el formulario, sobre el que se deberá mostrar o eliminar el indicador. Dejar éste parámetro vacío, causará que el indicador se muestre sobre el entero formulario. 

            • message
            (Opcional) Texto para mostrar junto con el indicador.

            • cssClass
            (Opcional) Clase CSS para aplicar al indicador. Nos permite personalizar su apariencia.
            De forma predeterminada, el indicador oscurecerá lo que haya detrás, mostrando una animación, junto con el texto (opcional) incluido. Si desea personalizar su apariencia, puede hacerlo mediante el uso de CSS. Cree una clase CSS sobre el archivo "user.css" y pase su nombre de clase como parámetro cssClass.

            El indicador de carga estará contenido en un "div" de tipo "toplevel", a la que se le asignará el nombre de su clase CSS. Este div tiene como nombre de clase "indicator", la clase CSS tiene el nombre "container", además de un elemento "p" con "message" como nombre de clase . Son los nombres que deberemos usar al aplicar los estilos CSS.

            La clase "omnisLoadingOverlay" contenida en el fichero "omnis.css" puede servirnos como base.