import json
from flask import Flask, Response, jsonify
from pyrfc import Connection
def to_json(content, simple=False):
if simple:
js = simplejson.dumps(content, default=json_serial)
return Response(js, status=200, mimetype='application/json')
return jsonify(content)
app = Flask(__name__)
abap_client = Connection(dest="MME)
# Equipment
@app.route('/equipment/<path:path>', methods=['POST'])
def equipment(path):
try:
to_abap = json.loads(request.data)
if path == 'get':
from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_GET', to_abap)
elif path == 'getlist':
from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_GETL', to_abap)
elif path == 'change':
from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_CHANGE', to_abap)
elif path == 'install':
from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_INSTALL', to_abap)
elif path == 'dismantle':
from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_DISMTLE', to_abap)
else:
raise Exception ('not implemented: %s' % path)
return to_json(from_abap)
except Exception, e:
return serverError(e), 50
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8123)
$ npm install rfmcall
$ rfmcall MME BAPI_USER_GET_DETAIL
//
// BAPI_USER_GET_DETAIL
//
let params = {
// IMPORT PARAMETERS
USERNAME: "", // CHAR (12) User Name
//CACHE_RESULTS : "", // CHAR (1) Temporarily buffer results in work process
// TABLE PARAMETERS
RETURN: [], // BAPIRET2 Return Structure
//ACTIVITYGROUPS : [], // BAPIAGR Activity Groups
//ADDCOMREM : [], // BAPICOMREM BAPI Structure Communication Comments
//ADDFAX : [], // BAPIADFAX BAPI Structure Fax Numbers
...
...
};
...
...
// ACTIVITYGROUPS BAPIAGR Activity Groups
let ACTIVITYGROUPS = []; // BAPIAGR Activity Groups
let BAPIAGR = {
AGR_NAME : "", // CHAR (30) Role Name
AGR_TEXT : "", // CHAR (80) Role Description
FROM_DAT : "", // DATS (8) Date of menu generation
ORG_FLAG : "", // CHAR (1) Indicator: Indirect Assignment of the User to the Role
TO_DAT : "", // DATS (8) Date of menu generation
};
// ADDCOMREM BAPICOMREM BAPI Structure Communication Comments
let ADDCOMREM = []; // BAPICOMREM BAPI Structure Communication Comments
let BAPICOMREM = {
COMM_NOTES : "", // CHAR (50) Communication link notes
COMM_TYPE : "", // CHAR (3) Communication Method (Key) (Business Address Services)
CONSNUMBER : "", // NUMC (3) Sequence Number
ERRORFLAG : "", // CHAR (1) Flag: Record not processed
LANGU : "", // LANG (1) ALPHA=ISOLA Language Key
LANGU_ISO : "", // CHAR (2) 2-Character SAP Language Code
};
...
...
result = await client.call("BAPI_USER_GET_DETAIL", params);
import { UIApplication, UIHttpService, UIUtils } from '../../resources/index';
export class Equipment {
static inject = [UIApplication, UIHttpService];
static __bizDocType = 'BUSEQUI';
constructor(app, httpService) {
this.app = app;
this.httpService = httpService;
this.reset();
}
reset() {
this.ES_HEADER = {};
this.ES_SPECIFIC = {};
this.DMS = false;
this.KPI = [];
this.Attachments = [];
this.Characteristics = [];
this.selection = {};
this.url = {};
this.list = [];
}
getlist() {
this.list = [];
return this.httpService
.backend('/equipment/getlist', {
IV_PLANT: '1000'
})
.then(FROM_ABAP => {
this.list = FROM_ABAP.ET_EQUIPMENT;
})
.catch(error => {
this.reset();
this.app.toastError(error);
});
}
get(id = false) {
if (id) this.selection.EQUIID = id;
return this.httpService
.backend('/equipment/get', {
IV_EQUIID: this.selection.EQUIID,
IV_CHARACTERISTICS: 'X',
IV_DOCUMENT: 'X',
IV_WITH_TIMESTATS: 'X'
})
.then(FROM_ABAP => {
// header
this.ES_HEADER = FROM_ABAP.ES_HEADER;
this.ES_SPECIFIC = FROM_ABAP.ES_SPECIFIC;
// clone structures for X-fields change detection
this.IS_HEADER = UIUtils.abapStructClone(this.ES_HEADER);
this.IS_SPECIFIC = UIUtils.abapStructClone(this.ES_SPECIFIC);
// user status
this.ET_STATUS = FROM_ABAP.ET_USER_STATUS;
// DMS Attachments
this.Attachments = FROM_ABAP.ET_DOCUMENT;
// WebGUI url
this.href = this.app.webGuiUrl('IE03', false, this.selection.EQUIID);
this.hrefText = this.IS_HEADER.DESCRIPT + ' (' + this.selection.EQUIID + ')';
// Characteristics
this.Characteristics = [];
// add grouped characteristics
for (let chGroup of FROM_ABAP.ET_CHARACT_GROUP) {
this.addCharactGroup(
FROM_ABAP.ET_CHARACTERISTICS,
chGroup.CHARACT_GROUP,
chGroup.CHARACT_GROUP_NAME
);
}
// add ungrouped characteristics
this.addCharactGroup(FROM_ABAP.ET_CHARACTERISTICS, '', 'Ungrouped');
// mttr/mtbf kpi, requested by oiltank
this.KPI = [];
if (this.IS_HEADER.START_FROM) {
if (FROM_ABAP.ET_RESULT.length) {
this.KPI = [
{ id: 'BMON', name: 'No. of breakdowns reported in month', value: '' },
{ id: 'TBR', name: 'Time between repairs', value: '' },
{ id: 'BACT', name: 'No. of actual breakdowns', value: '' },
{ id: 'MTBR', name: 'Mean time between repairs ', value: '' },
{ id: 'TLDM', name: 'Total length of downtime in month', value: '' },
{ id: 'MTTRM', name: 'Mean Time To Repair in Month', value: '' }
];
let result = FROM_ABAP.ET_RESULT[0];
for (let line of this.KPI) {
if (line.id === 'BMON') line.value = result.NBDEFF;
else if (line.id === 'TBR') line.value = result.STBRHRS;
else if (line.id === 'BACT') line.value = result.SNBDREP;
else if (line.id === 'TLDM') line.value = result.STTRHRS;
}
for (let line of this.KPI) {
if (line.id === 'MTBR') {
if (result.SNBDREP) line.value = result.STBRHRS / result.NBDEFF;
}
if (line.id === 'TLDM') {
if (result.SNBDREP) line.value = result.STBRHRS / result.SNBDREP;
}
if (line.id === 'MTTRM') {
if (result.NBDEFF) line.value = result.STTRHRS / result.NBDEFF;
}
if (line.id !== 'BMON' && line.id !== 'BACT') {
line.value += ' H';
}
}
}
}
})
.catch(error => {
this.reset();
this.app.toastError(error);
});
}
save() {
// set X-fields
let header = [
'MANFACTURE',
'MANMODEL',
'MANPARNO',
'MANSERNO',
'MAINTPLANT',
'OBJECTTYPE',
'ABCINDIC',
'WORK_CTR'
];
let specific = ['EQUICATGRY', 'READ_FLOC'];
this.IS_HEADER_X = UIUtils.abapStructDiff(this.ES_HEADER, this.IS_HEADER, header);
this.IS_SPECIFIC_X = UIUtils.abapStructDiff(this.ES_SPECIFIC, this.IS_SPECIFIC, specific);
// Characteristics
let itChar = [];
for (let chGroup of this.Characteristics) {
for (let ch of chGroup.CHARLIST) {
itChar.push({
CLASS: ch.CLASS,
CHARACT: ch.NAME_CHAR,
VALUE: ch.VALUE,
VALUE_FROM: ch.VALUE_FROM,
VALUE_TO: ch.VALUE_TO
});
}
}
return this.httpService
.backend('/equipment/change', {
IV_EQUIID: this.selection.EQUIID,
IS_HEADER: this.ES_HEADER,
IS_HEADER_X: this.IS_HEADER_X,
IS_DATA_SPECIFIC: this.ES_SPECIFIC,
IS_DATA_SPECIFIC_X: this.IS_SPECIFIC_X,
IT_CHARACTERISTICS: itChar
})
.then(FROM_ABAP => {
this.app.toastSuccess({
type: 'success',
message: `Equipment saved: ${this.selection.EQUIID}`
});
})
.catch(error => {
this.app.toastError(error);
});
}
addCharactGroup(ET_CHARACTERISTICS, groupId, groupName) {
let chlist = [];
// add group
for (let ch of ET_CHARACTERISTICS) {
if (ch.CHARACT_GROUP === groupId) {
ch.NUMBER_DIGITS -= ch.NUMBER_DECIMALS; // adapt for MNUMBER 🙂
chlist.push(ch);
}
}
if (chlist.length) {
this.Characteristics.push({
groupId: groupId ? groupId : 'GROUPID',
groupDesc: groupName,
CHARLIST: chlist
});
}
}
}
$ git clone https://github.com/SAP/fundamental-tools
$ cd tools
$ python backend.py EQUIPMENT
Connected to host: coevi51 sid: MME client: 620 kernel: 745 user: DEMO lang: E
Model EQUIPMENT (8)
BAPI_EQUI_CHANGE
BAPI_EQUI_CREATE
BAPI_EQUI_CREATE_BY_REFERENCE
BAPI_EQUI_DISMANTLE
BAPI_EQUI_GETDETAIL
BAPI_EQUI_GETLIST
BAPI_EQUI_GETSTATUS
BAPI_EQUI_INSTALL
rfms: 8
params: 84
vars: 25
strucs: 35
tables: 24
all: 84
fields: 37
helps: 67
CA: 1
CH: 2
CL: 1
CT: 26
FV: 5
SH: 32
$ python frontend-angular.py # frontend-vue.py frontend-aurelia.py ...
Processed 8 ABAP API of EQUIPMENT model
<div fd-form-item>
<label fd-form-label>Distribution Channel</label>
<input fd-input fd-form-control
[(ngModel)]="DATA_GENERAL.DISTR_CHAN"
data-abap="{type: 'string', length: '2', mid: 'VTW'}"
data-shlp="{type:'SH', id:'CSH_TVTW'}"
/>
</div>
<div fd-form-item>
<fd-checkbox label="Referenced Configuration" [(ngModel)]="DATA_SPECIFIC.READ_CUREF"></fd-checkbox>
</div>
<div fd-form-item>
<label fd-form-label>Validity end date</label>
<fd-date-picker [type]="single" [(ngModel)]="DATA_FLEET.EXPIRY_DATE"></fd-date-picker>
</div>
<div fd-form-item>
<label fd-form-label>Cost Center</label>
<fd-combobox
[(ngModel)]="DATA_GENERAL.COSTCENTER"
[dropdownValues]="{type:'CT', id:'CSKS'}"
data-abap="{type: 'string', length: '10', mid: 'KOS', alpha: 'ALPHA'}"
>
</fd-combobox>
</div>
<div fd-form-item>
<label fd-form-label>Equipment category</label>
<fd-combobox
[(ngModel)]="DATA_SPECIFIC.EQUICATGRY"
[dropdownValues]="{type:'CT', id:'T370T'}"
data-abap="{type: 'string', length: '1', mid: 'EQT'}"
>
</fd-combobox>
</div>
<ui-input value.bind="DATA_GENERAL.DISTR_CHAN" shlp.bind='{"type":"SH", "id":"CSH_TVTW"}'
data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"2", "mid":"VTW"}'
label="Distribution Channel">
</ui-input>
<ui-checkbox value.bind="DATA_SPECIFIC.READ_CUREF" label="Referenced Configuration">
</ui-checkbox>
<ui-date date.bind="DATA_FLEET.EXPIRY_DATE" label="Validity end date"></ui-date>
<ui-combo value.bind="DATA_GENERAL.COSTCENTER" shlp.bind='{"type":"CT", "id":"CSKS"}'
data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"10", "mid":"KOS"}'
alpha-exit="ALPHA"
label="Cost Center">
</ui-combo>
<ui-combo value.bind="DATA_SPECIFIC.EQUICATGRY" shlp.bind='{"type":"CT", "id":"T370T"}'
data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"1", "mid":"EQT"}'
label="Equipment category">
</ui-combo>
<fd-form-item>
<fd-form-label>Distribution Channel</fd-form-label>
<fd-input v-model="DATA_GENERAL.DISTR_CHAN"
data-abap="{type: 'string', length: '2', mid: 'VTW'}"
data-shlp="{type:'SH', id:'CSH_TVTW'}"
/>
</fd-form-item>
<fd-form-item-checkbox label="Referenced Configuration">
<fd-checkbox v-model="DATA_SPECIFIC.READ_CUREF">
</fd-form-item-checkbox>
<fd-form-item>
<fd-form-label>Validity end date</fd-form-label>
<fd-date-picker v-model="DATA_FLEET.EXPIRY_DATE"></fd-date-picker>
</fd-form-item
<fd-form-item>
<fd-form-label>Cost Center</fd-form-label>
<fd-select v-model="DATA_GENERAL.COSTCENTER"
options="{type:'CT', id:'CSKS'}"
data-abap="{type: 'string', length: '10', mid: 'KOS', alpha: 'ALPHA'}"
>
</fd-select>
</fd-form-item>
<fd-form-item>
<fd-form-label>Equipment category</fd-form-label>
<fd-select v-model="DATA_SPECIFIC.EQUICATGRY"
options="{type:'CT', id:'T370T'}"
data-abap="{type: 'string', length: '1', mid: 'EQT'}"
>
</fd-select>
</fd-form-item>
<ui-datagrid data.bind="BAPI_EQUI_CHANGE EXTENSIONIN" title="Reference Structure for BAPI Parameters ExtensionIn/ExtensionOut"
data-summary="false" default-sort=""
selectable rowselect.trigger="object.selectObject($event.detail)">
<ui-dg-column sortable field="STRUCTURE" data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"30", "shlp":{"type":"b'CT'", "id":"b'DD02L'"}}' label="Structure name of BAPI table extension"></ui-dg-column>
<ui-dg-column sortable field="VALUEPART1" data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"240"}' label="Data part of BAPI extension parameter"></ui-dg-column>
<ui-dg-column sortable field="VALUEPART2" data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"240"}' label="Data part of BAPI extension parameter"></ui-dg-column>
<ui-dg-column sortable field="VALUEPART3" data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"240"}' label="Data part of BAPI extension parameter"></ui-dg-column>
<ui-dg-column sortable field="VALUEPART4" data-abap.bind='{"ddic":"CHAR", "type":"string", "length":"240"}' label="Data part of BAPI extension parameter"></ui-dg-column>
</ui-datagrid>
//
// BAPI_EQUI_CHANGE 0.2
//
BAPI_EQUI_CHANGE = {
// INPUT PARAMETERS
DATA_FLEET: {}, // BAPI_FLEET : Vehicle-Specific Data
DATA_FLEETX: {}, // BAPI_FLEETX : Flag Structure Belonging to BAPI_FLEET (for Change BAPIs)
DATA_GENERAL: {}, // BAPI_ITOB : General Data for Technical Objects
DATA_GENERALX: {}, // BAPI_ITOBX : Flag Structure for BAPI_ITOB for Fields to be Copied
DATA_SPECIFIC: {}, // BAPI_ITOB_EQ_ONLY : Equipment-Specific data
DATA_SPECIFICX: {}, // BAPI_ITOB_EQ_ONLYX : Flag Structure for BAPI_ITOB_EQ_ONLY for Fields to be Copied
EQUIPMENT: '', // CHAR(18) BAPI_ITOB_PARMS EQUIPMENT Number of Equipment to be Changed
VALID_DATE: '', // DATS(8) BAPI_ITOB_PARMS INST_DATE Date for Validity of an Equipment Usage Period Relevant Change
VALID_TIME: '', // TIMS(6) BAPI_ITOB_PARMS INST_TIME Time for Validity of a Equipment Usage Period Relevant Change
// OUTPUT PARAMETERS
DATA_FLEET_EXP: {}, // BAPI_FLEET : Vehicle-Specific Data
DATA_GENERAL_EXP: {}, // BAPI_ITOB : General Data for Technical Objects
DATA_SPECIFIC_EXP: {}, // BAPI_ITOB_EQ_ONLY : Equipment-Specific data
RETURN: {}, // BAPIRET2 : Return Parameter
// TABLE PARAMETERS
EXTENSIONIN: [], // BAPIPAREX : Reference Structure for BAPI Parameters ExtensionIn/ExtensionOut
EXTENSIONOUT: [] // BAPIPAREX : Reference Structure for BAPI Parameters ExtensionIn/ExtensionOut
};
<!-- Manufacturer -->
<div class="fd-layout-panel">
<div class="fd-layout-panel__header">
<div class="fd-layout-panel__head">
<h3 class="fd-layout-panel__title">
Manufacturer
</h3>
</div>
</div>
<div class="fd-layout-panel__body">
<div fd-form-item>
<label fd-form-label>Manufacturer of asset</label>
<input fd-input fd-form-control [(ngModel)]="equipment.ES_HEADER.MANFACTURE"
data-abap="{type: 'string', length: '30'}" />
</div>
<div fd-form-item>
<label fd-form-label>Manufacturer model number</label>
<input fd-input fd-form-control [(ngModel)]="equipment.ES_HEADER.MANMODEL"
data-abap="{type: 'string', length: '20'}" />
</div>
<div fd-form-item>
<label fd-form-label>Manufacturer part number</label>
<input fd-input fd-form-control [(ngModel)]="equipment.ES_HEADER.MANPARNO"
data-abap="{type: 'string', length: '30'}" />
</div>
<div fd-form-item>
<label fd-form-label>Manufacturer serial number</label>
<input fd-input fd-form-control [(ngModel)]="equipment.ES_HEADER.MANSERNO"
data-abap="{type: 'string', length: '30'}" />
</div>
</div>
</div>
<!-- Installed at -->
<div class="fd-layout-panel">
<div class="fd-layout-panel__header">
<div class="fd-layout-panel__head">
<h3 class="fd-layout-panel__title">
Installed at
</h3>
</div>
</div>
<div class="fd-layout-panel__body">
<div fd-form-item>
<label fd-form-label>Functional Location Label</label>
<input fd-input fd-form-control [(ngModel)]="equipment.ES_SPECIFIC.READ_FLOC"
data-abap="{type: 'string', length: '40', mid: 'IFL'}" data-shlp="{type: 'SH', id: 'IFLM'}" />
</div>
<div fd-form-item>
<label fd-form-label>Maintenance plant</label>
<input fd-input fd-form-control [(ngModel)]="equipment.ES_HEADER.MAINTPLANT"
data-abap="{type: 'string', length: '4', mid: 'SWK'}" data-shlp="{type:'SH', id:'H_T001W'}" />
</div>
<div fd-form-item>
<label fd-form-label>ABC indicator for technical object</label>
<fd-combobox [(ngModel)]="quipment.ES_HEADER.ABCINDIC" [dropdownValues]="{type:'CT', id:'T370C'}"
data-abap="{type: 'string', length: '1'}">
</fd-combobox>
</div>
</div>
</div>
<!-- Equi data -->
<div class="fd-layout-panel">
<div class="fd-layout-panel__header">
<div class="fd-layout-panel__head">
<h3 class="fd-layout-panel__title">
Equi data
</h3>
</div>
</div>
<div class="fd-layout-panel__body">
<div fd-form-item>
<label fd-form-label>Equipment category</label>
<fd-combobox [(ngModel)]="equipment.ES_SPECIFIC.EQUICATGRY" [dropdownValues]="{type:'CT', id:'T370T'}"
data-abap="{type: 'string', length: '1', mid: 'EQT'}">
</fd-combobox>
</div>
<div fd-form-item>
<label fd-form-label>Type of Technical Object</label>
<fd-combobox [(ngModel)]="equipment.ES_HEADER.OBJECTTYPE" [dropdownValues]="{type:'CT', id:'T370K'}"
data-abap="{type: 'string', length: '10'}">
</fd-combobox>
</div>
<div fd-form-item>
<label fd-form-label>ABC indicator for technical object</label>
<fd-combobox [(ngModel)]="equipment.ES_HEADER.ABCINDIC" [dropdownValues]="{type:'CT', id:'T370C'}"
data-abap="{type: 'string', length: '1'}">
</fd-combobox>
</div>
</div>
</div>
<template>
<require from="reuse/ui-attachments"></require>
<ui-page page-title="Equipment">
<template replace-part="page-header">
<ui-row class="navbar header">
<ui-button class="ui-btn-transparent" icon-prefix="nav-back" click.delegate="app.router.navigateBack()">
</ui-button>
<!--ui-button transparent click.delegate="toggleSidebar()" icon-prefix="menu2"></ui-button-->
<div style="flex: 1; text-align: center;">
${routeTitle} <a href.bind="equipment.href" target="_blank">${equipment.hrefText}</a>
</div>
</ui-row>
</template>
<template replace-part="page-footer">
<ui-row class="navbar footer">
<ui-column pull-right>
<ui-button transparent click.delegate="equipment.get()" label="Get"></ui-button>
<ui-button transparent click.delegate="equipment.save()" label="Save"></ui-button>
</ui-column>
</ui-row>
</template>
<ui-content scroll padded class="ui-app-view">
<ui-row padded>
<ui-column padded size="sm-6">
<h4>
<span role="presentation" aria-hidden="true"
class="sap-icon sap-icon-supplier ui-color-secondary"></span>
Manufacturer
</h4>
<ui-input ddic-length="30" ddic-type="CHAR" label="Manufacturer of asset"
value.bind="equipment.ES_HEADER.MANFACTURE">
</ui-input>
<ui-input ddic-length="20" ddic-type="CHAR" label="Manufacturer model number"
value.bind="equipment.ES_HEADER.MANMODEL">
</ui-input>
<ui-input ddic-length="30" ddic-type="CHAR" label="Manufacturer part number"
shlp.bind="{type: 'SH', id: 'IFLM'}" mid="IFL" value.bind="equipment.ES_HEADER.MANPARNO">
</ui-input>
<ui-input ddic-length="30" ddic-type="CHAR" label="Manufacturer serial number"
value.bind="equipment.ES_HEADER.MANSERNO">
</ui-input>
</ui-column>
<ui-column padded size="sm-6">
<h4>
<span role="presentation" aria-hidden="true"
class="sap-icon sap-icon-functional-location ui-color-secondary"></span>
Installed at
</h4>
<ui-input ddic-length="40" ddic-type="CHAR" label="Functional Location Label"
value.bind="equipment.ES_SPECIFIC.READ_FLOC" shlp.bind="{type: 'SH', id: 'IFLM'}" mid="IFL">
</ui-input>
<ui-input ddic-length="4" ddic-type="CHAR" label="Maintenance plant"
value.bind="equipment.ES_HEADER.MAINTPLANT"
shlp.bind="{type: 'SH', id: 'H_T001W', valueColumn: 'WERKS'}" mid="SWK">
</ui-input>
<ui-combo clear ddic-length="1" ddic-type="CHAR" label="ABC indicator for technical object"
value.bind="equipment.ES_HEADER.ABCINDIC" shlp.bind="{type: 'CT', id: 'T370C'}">
</ui-combo>
</ui-column>
<ui-column padded size="sm-6" show.bind="equipment.ET_STATUS.length">
<h4>
<span role="presentation" aria-hidden="true"
class="sap-icon sap-icon-order-status ui-color-secondary"></span>
Status
</h4>
<ul class="list-group">
<li repeat.for="status of equipment.ET_STATUS" class="list-group-item">
${status.DESCRIPTION} ${status.STATUS} ${status.TEXT}
</li>
</ul>
</ui-column>
<ui-column padded size="sm-6" show.bind="equipment.IS_HEADER.START_FROM">
<h4><span role="presentation" aria-hidden="true"
class="sap-icon sap-icon-kpi-corporate-performance ui-color-secondary"></span>
In Operation since ${equipment.IS_HEADER.START_FROM | dateFormat }
</h4>
<ul class="list-group">
<li repeat.for="line of equipment.KPI" class="list-group-item" style="padding: 0.25rem 0">
<ui-row>
<ui-column size="md-4" class="ui-color-secondary"> ${line.name} </ui-column>
<ui-column size="md-2" class="ui-text-end"> ${line.value} </ui-column>
</ui-row>
</li>
</ul>
</ui-column>
<ui-column padded size="sm-6">
<h4>Equi Data</h4>
<ui-combo clear ddic-length="1" ddic-type="CHAR" label="Equipment category"
value.bind="equipment.ES_SPECIFIC.EQUICATGRY" shlp.bind="{type: 'CT', id: 'T370T'}" mid="EQT">
</ui-combo>
<ui-combo clear ddic-length="10" ddic-type="CHAR" label="Type of Technical Object"
value.bind="equipment.ES_HEADER.OBJECTTYPE" shlp.bind="{type: 'CT', id: 'T370K'}">
</ui-combo>
<ui-combo clear ddic-length="1" ddic-type="CHAR" label="ABC indicator for technical object"
value.bind="equipment.ES_HEADER.ABCINDIC" shlp.bind="{type: 'CT', id: 'T370C'}">
</ui-combo>
</ui-column>
<ui-column size="sm-6">
<!--img if.bind="image.content"
src="data:${image.mimeType};base64,${image.content}" alt="photo"/-->
<!--embed src="pdfFiles/Test.pdf" width="600" height="500" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html"/-->
<ui-attachments attachments.bind="equipment.Attachments"></ui-attachments>
</ui-column>
<ui-column size="sm-6" show.bind="equipment.Characteristics.length">
<h4>Characteristics (${equipment.Characteristics.length})</h4>
<div class="" repeat.for="charGroup of equipment.Characteristics">
<ui-panel>
<ui-header light collapse="true">${charGroup.groupDesc} (${charGroup.CHARLIST.length})
</ui-header>
<ui-body scroll padded>
<div repeat.for="ch of charGroup.CHARLIST">
<!--span>${ch.DESCR_CHAR} ${ch.DATA_TYPE} sin: ${ch.SINGLE_VALUE} v: ${ch.VALUE} vfrom: ${ch.VALUE_FROM} unit:${ch.UNIT}</span-->
<ui-input if.one-time="ch.DATA_TYPE === 'CHAR' " ddic-type="CHAR"
label="${ch.DESCR_CHAR}" ddic-length="${ch.NUMBER_DIGITS}"
value.two-way="ch.VALUE"></ui-input>
<ui-input if.one-time="ch.DATA_TYPE === 'NUM' " ddic-type="DEC"
label="${ch.DESCR_CHAR}" ddic-length="${ch.NUMBER_DIGITS}.${NUMBER_DECIMALS}"
unit="${ch.UNIT}" value.two-way="ch.VALUE_FROM"></ui-input>
</div>
</ui-body>
</ui-panel>
</div>
</ui-column>
</ui-row>
</ui-content>
</ui-page>
</template>
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
37 | |
25 | |
17 | |
13 | |
7 | |
7 | |
7 | |
6 | |
6 | |
6 |