blob: 164b5c2a1b222004e3ae18d0854ccab5867c1d88 [file] [log] [blame]
@page "ui"
@model BaSys40.Component.REST.Pages.IndexModel
@{
ViewData["Title"] = "Index";
}
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/4.3.1/cerulean/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<style>
.bd-placeholder-img {
font-size: 1.125rem;
text-anchor: middle;
}
@@media (min-width: 768px) {
.bd-placeholder-img-lg {
font-size: 3.5rem;
}
}
</style>
</head>
<body>
@{ var aas = Model.ServiceProvider.AssetAdministrationShell; }
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<img src="~/images/BaSys-Logo-transparent-1080x250.png" width="103" height="25" style="margin-top:15px" />
<!-- <a class="navbar-brand" href="#">@aas.IdShort</a>-->
</div>
<ul class="nav navbar-nav">
<li><a href="#">Main</a></li>
</ul>
<div class="navbar-right"></div>
</div>
</nav>
<main role="main" class="container">
<div class="starter-template">
<h1>@aas.IdShort - Asset Administration Shell UI</h1>
<p class="lead">Generic UI to discover the Asset Administration Shell </p>
</div>
</main>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading" style="background:#7ca1ce"><h4 style="color:white">Asset Administration Shell</h4></div>
<div class="list-group">
<div class="list-group-item">
<div class="row">
<div class="col-sm-2"><b>Identifier</b></div>
<div class="col-sm-10">@aas.Identification.Id</div>
</div>
</div>
<div class="list-group-item">
<div class="row">
<div class="col-sm-2"><b>IdShort</b></div>
<div class="col-sm-10">@aas.IdShort</div>
</div>
</div>
</div>
</div>
</div>
@{ var asset = Model.ServiceProvider.AssetAdministrationShell.Asset; }
<div class="container">
<div class="panel panel-default">
<div class="panel-heading" style="background:#b90276"><h4 style="color:white">Asset</h4></div>
<div class="list-group">
<div class="list-group-item">
<div class="row">
<div class="col-sm-2"><b>Identifier</b></div>
<div class="col-sm-10">@asset.Identification.Id</div>
</div>
</div>
<div class="list-group-item">
<div class="row">
<div class="col-sm-2"><b>IdShort</b></div>
<div class="col-sm-10">@asset.IdShort</div>
</div>
</div>
<div class="list-group-item">
<div class="row">
<div class="col-sm-2"><b>Semantic-Id</b></div>
<div class="col-sm-10">@asset.SemanticId?.First?.Value</div>
</div>
</div>
<div class="list-group-item">
<div class="row">
<div class="col-sm-2"><b>Kind</b></div>
<div class="col-sm-10">@asset.Kind?.ToString()</div>
</div>
</div>
</div>
</div>
</div>
@foreach (var submodel in Model.ServiceProvider.AssetAdministrationShell.Submodels)
{
<div class="container">
<div class="panel panel-default">
<div class="panel-heading" style="background:darkgreen">
<h4>
<a style="color:white" data-toggle="collapse" href="#@submodel.IdShort">@submodel.IdShort</a>
</h4>
</div>
<div id="@submodel.IdShort" class="panel-collapse collapse">
<div class="panel-body">
<div class="panel-group">
@if (submodel.DataElements?.Count > 0)
{
<div class="panel panel-default">
<div class="panel-heading" style="background:#005691"><h4 style="color:white">DataElements</h4></div>
<div class="panel-body">
<div class="panel-group">
@for (int i = 0; i < submodel.DataElements.Count; i++)
{
var dataElement = submodel.DataElements[i];
<div class="panel panel-warning">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#@dataElement.IdShort">@dataElement.IdShort</a>
</h4>
</div>
<div id="@dataElement.IdShort" class="panel-collapse collapse">
<div class="panel-body">
<div class="row">
<div class="col-sm-2"><b>Data-Type</b></div>
<div class="col-sm-10">@dataElement.ValueType?.DataObjectType?.Name?.ToUpper()</div>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-2"><b>Semantic-Id</b></div>
<div class="col-sm-10">@dataElement.SemanticId?.First?.Value</div>
</div>
</div>
<div class="panel-footer">
<div class="row">
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
<input id="Input_@dataElement.IdShort" type="text" class="form-control" placeholder="Value" value="@dataElement.Value?.ToString()">
</div>
</div>
<div class="col-sm-1"><button onclick="@("GetDataElementValue('" + submodel.IdShort + "', '" + dataElement.IdShort + "')")" id="@dataElement.IdShort;Retrieve" type="button" class="btn btn-primary">Retrieve</button></div>
<div class="col-sm-1"><button onclick="@("SetDataElementValue('" + submodel.IdShort + "', '" + dataElement.IdShort + "', '" + dataElement.ValueType?.DataObjectType?.Name + "', $('#Input_" + dataElement.IdShort + "').val() )")" id="@dataElement.IdShort;Update" type="button" class="btn btn-success">Update</button></div>
</div>
</div>
</div>
</div>
}
</div>
</div>
</div>
}
</div>
<div class="panel-group">
@if (submodel.Operations?.Count > 0)
{
<div class="panel panel-default">
<div class="panel-heading" style="background:#78be20"><h4 style="color:white">Operations</h4></div>
<div class="panel-body">
<div class="panel-group">
@for (int i = 0; i < submodel.Operations.Count; i++)
{
var operation = submodel.Operations[i];
<div class="panel panel-warning">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#@operation.IdShort">@operation.IdShort</a>
</h4>
</div>
<div id="@operation.IdShort" class="panel-collapse collapse">
@if (operation.In?.Count > 0)
{
foreach (var argument in operation.In)
{
<div class="panel-body">
<div class="row">
<div class="col-sm-2 argInName @submodel.IdShort @operation.IdShort"><b>@argument.IdShort (IN)</b></div>
<div class="col-sm-2 argInType @submodel.IdShort @operation.IdShort">@argument.DataType.DataObjectType.Name.ToUpper()</div>
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
<input id="msg" type="text" class="form-control argInValue @submodel.IdShort @operation.IdShort" name="msg" placeholder="Argument Value">
</div>
</div>
</div>
</div>
}
}
@if (operation.Out?.Count > 0)
{
foreach (var argument in operation.Out)
{
<div class="panel-body">
<div class="row">
<div class="col-sm-2 argOutName @submodel.IdShort @operation.IdShort"><b>@argument.IdShort (OUT)</b></div>
<div class="col-sm-2 argOutType @submodel.IdShort @operation.IdShort">@argument.DataType.DataObjectType.Name.ToUpper()</div>
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
<input id="argOutValue_@submodel.IdShort@operation.IdShort" type="text" class="form-control argOutValue @submodel.IdShort @operation.IdShort" name="msg" placeholder="Return Value">
</div>
</div>
</div>
</div>
}
}
<div class="panel-footer"><button onclick="@("ExecuteOperation('" + submodel.IdShort + "', '" + operation.IdShort + "')")" type="button" class="btn btn-success">Execute</button></div>
</div>
</div>
}
</div>
</div>
</div>
}
</div>
<div class="panel-group">
@if (submodel.Events?.Count > 0)
{
<div class="panel panel-default">
<div class="panel-heading" style="background:#00a8b0"><h4 style="color:white">Events</h4></div>
<div class="panel-body">
<div class="panel-group">
@for (int i = 0; i < submodel.Events.Count; i++)
{
var eventable = submodel.Events[i];
<div class="panel panel-warning">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#@eventable.IdShort">@eventable.IdShort</a>
</h4>
</div>
<div id="@eventable.IdShort" class="panel-collapse collapse">
</div>
</div>
}
</div>
</div>
</div>
}
</div>
</div>
</div>
</div>
</div>
}
<script>
function ExecuteOperation(submodelId, operationId) {
var argNames = document.getElementsByClassName("argInName " + submodelId + " " + operationId);
var argTypes = document.getElementsByClassName("argInType " + submodelId + " " + operationId);
var argValues = document.getElementsByClassName("argInValue " + submodelId + " " + operationId);
var argOutValues = document.getElementsByClassName("argOutValue " + submodelId + " " + operationId);
var args = [];
for (var i = 0; i < argNames.length; i++) {
var arg = { index: i, idShort: argNames.item(i).innerText, valueType: { dataObjectType: { name: argTypes.item(i).innerText.toLowerCase() } }, value: argValues.item(i).value };
args.push(arg);
}
$.ajax({
type: 'POST',
url: '/aas/submodels/' + submodelId + '/operations/' + operationId,
contentType: 'application/json',
data: JSON.stringify(args),
error: function () {
alert("Failed to exectute with args: " + JSON.stringify(args));
},
success: function (data) {
$('#argOutValue_' + submodelId + operationId).val(data.entity[0].value);
}
});
}
</script>
<script>
function GetDataElementValue(submodelId, dataElementId) {
$.ajax({
type: 'GET',
url: '/aas/submodels/' + submodelId + '/dataElements/' + dataElementId + '/value',
success: function (data) {
$('#Input_' + dataElementId).val(data.entity.value);
}
});
}
</script>
<script>
function SetDataElementValue(submodelId, dataElementId, dataObjectTypeName, val) {
var value = {
valueType: { dataObjectType: { name: dataObjectTypeName } }, value: val
};
$.ajax({
type: 'PUT',
url: '/aas/submodels/' + submodelId + '/dataElements/' + dataElementId + '/value',
contentType: 'application/json',
data: JSON.stringify(value),
error: function () {
$('#Input_' + dataElementId).val('Error updating Data-Element-Value');
},
statusCode: {
204: function () {
//alert("Successfully updated '" + dataElementId + "' to new value '" + val + "'");
}
},
success: function () { }
});
}
</script>
</body>
</html>