In last part we will describe how to create UI template for modernized screens.
There are two steps involved in screen templating:
- HTML template with templating engine
- HTML design according to used framework
Templating engine
We use Template7 as our HTML rendering engine. All documentation can be found on engine site so we will not describe templating engine. It is enough to know we are using it to generate HTML UI representing terminal screens.
Templating engine use combination of HTML codes and templating engine instructions to insert data from JSON data structure exported from screen.
All interactions are based on "click events" on elements containing "data-type" attribute. Different actions will be applied based on "type" of action.
List of all action types:
data-type | Description | event |
---|---|---|
cursor | place cursor to screen row / col | onClick |
export | export screen to "excel" or "word" or "screen" | onClick |
submit | transfer all fields from UI to terminal | onClick |
action | transfer selected field from UI to terminal | onClick |
select | same as action, used for SEELCT tag | onChange |
NOTE: All types except "export" use data-cmd to submit screen with requested terminal keyboard command as PFn, ENTER, RESET, ATTN, SYSREQ etc.
NOTE: For "export", valid values for data-cmd are "word" or "excel" or "screen".
List of all attributes:
Attribute | Description |
---|---|
data-row | set cursor to row |
data-col | set cursor to column |
data-cmd | terminal keyboard command to send |
data-auto | if true, disable auto enter on field |
data-id | target field |
data-val | set value to target field |
data-opt | find field at position instead using data-id |
Attribute combinations table
data-type | action | select | submit | cursor | export |
---|---|---|---|---|---|
data-row | * | * | * | ||
data-col | * | * | * | ||
data-cmd | * | * | * | * | |
data-auto | * | * | * | ||
data-id | * | * | * | ||
data-val | * | * | |||
data-opt | * | * |
Examples
Add basic data to HTML (add title to document):
<div>{{data.title}}</div>
Add field (will set field default data from field value):
<input type="text" name="f1" data-id="1"
maxlength="{{this.$fields.f1.len}}"
value="{{data.fld1}}">
Add submit button (will iterate over all fields, validate them, update values from UI and submit terminal screen) :
<a href="#" data-id="1" data-type="submit" data-cmd="ENTER">
CONFIRM
</a>
Add action button (will focus on field 1 [data-id] and press F4 [data-cmd]) :
<a href="#" data-id="1" data-type="action" data-cmd="PF4">
FILTER
</a>
Add action button (will focus on row /col and press ENTER [data-cmd]) :
<a href="#" data-row="1" data-col="20" data-type="cursor" data-cmd="ENTER">
SELECT
</a>
Add option button (will focus on field 1 [data-id], populate field with 99 [data-val] and press ENTER [data-cmd]).
<a href="#" data-type="action" data-id="1" data-cmd="ENTER" data-val="90">
SIGN OFF
</a>
Add option button (will focus on field if found at [data-opt], populate field with wrkactjob [data-val] and press ENTER [data-cmd]).
<a href="#" data-type="action" data-opt="[[19,6],[20,6]]" data-cmd="ENTER" data-val="wrkactjob">
SIGN OFF
</a>
Template engine add-on functions
We added our own function to Tempalte7 rendering engine to improve integration with 5250 terminal:
Escape helper
Used to escape text that contains html codes.
{{escape this.title}}
Field helper
Safe way to get field object information. If field does not exist, template will not break. Can be easily used for example to define input field max length etc.
maxlength="{{fld 'f10' 'len'}}"
If Field helper
Safe way to create field based condition rendering. If field is missing, template will not break.
Here is an example to generate editable or readonly input field based on field type.
{{#iffld 'f1' 'isBypass'}} readonly {{else}} maxlength="{{fld 'f1' 'len'}}" {{/iffld}}
Temp variable helper
Used for complex iterative operations when we need to use tep variable for intermediate data storage.
{{set "a" this.title}}, then use as {{ @root.title}} from for/each statement.
Select and check box helpers
Used on "select" and "check box" input type html elements. Helpers will return selected or checked html attributes.
<select data-id="{{js '@index+1' }}" data-type="select" data-cmd="ENTER">
<option value="" {{isSelected '' this}}></option>
{{#each @root.$options}}
<option value="{{this.v}}" {{isSelected this.v @root.tmp}}>
{{this.v}}
</option>
{{/each}}
</select>
UI framework
As this is pure web technology, which framework will be used is up to developer and its preference. In our modernization process we use 2 frameworks - Framework7 for mobile UI development and modified Bootstrap 4 for browser interface.
Base idea is to create index.html page which will load all required resources like framework, CSS and base page structure.
Second step is to add DIV element with specific ID. That ID should be set in screen mapping definition object as shown below. In this case target DIV is a #wrapper element. In other words, every HTML generated from template will be injected inside target DIV.
{
"templates": {
"default" : {
"output": "#wrapper"
}
}
}
Subfile support
To add mouse scroll, touch swipe or screen scroll to send page-up and page-down subfile actions, one should add data-type=subfile to the table containing terminal screen subfiles. When this option is used, additional on-screen actions for subfile scrolling is not needed.
<table data-type="subfile"> ....