2020-12-11 12:56:11 +00:00
|
|
|
<style>
|
|
|
|
.system {height:99%; overflow:hidden;}
|
|
|
|
.data-info .board{ height:300px; display:grid; grid-template-columns:auto 200px 200px; gap:20px; align-items:center}
|
|
|
|
/*.board { background-image: linear-gradient(to bottom, #ffffff,#ffffff,#f3f3f3,#d3d3d3d3)}*/
|
|
|
|
.number {font-size:48px; font-family:courier;padding:8px; ;}
|
|
|
|
.etl {display:grid; grid-template-columns: 250px auto; gap:2;}
|
|
|
|
.chart {box-shadow : 0px 1px 4px 2px #d3d3d3; width:200px; height:250px;
|
|
|
|
display:grid; align-items:center;
|
|
|
|
background-image: linear-gradient(to bottom,#f3f3f3,#ffffff);
|
|
|
|
overflow:hidden;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.dialog { width:450px; min-height:200px; display:grid; grid-template-rows: 40px 80% auto; gap:4px}
|
|
|
|
.dialog .title-bar { border-top-left-radius: 8px; border-top-right-radius: 8px ; padding:4px; background-color:#f3f3f3; gap:2px; display:grid; grid-template-columns: auto 32px; align-items:center}
|
|
|
|
.dialog .action {display:grid; align-items: flex-end; padding-left:25%; padding-right:25%;}
|
|
|
|
.dialog .message {display:grid; align-items: center; grid-template-columns: 20% auto;}
|
|
|
|
.dialog .message .text {line-height:2; text-transform: capitalize;}
|
|
|
|
.fa-exclamation-triangle {color:orange}
|
|
|
|
.fa-question-circle{color:#009df7}
|
|
|
|
</style>
|
|
|
|
|
|
|
|
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
|
|
|
|
<script src="{{context}}/static/js/io/dialog.js"></script>
|
|
|
|
<script src="{{context}}/static/js/io/io.js"></script>
|
|
|
|
<script src="{{context}}/static/js/io/healthcare.js"></script>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
var select = function(node){
|
|
|
|
var value = $($(node).children()[0]).attr('data-value')
|
|
|
|
|
|
|
|
jx.utils.patterns.visitor($('.tab'),function(_item){
|
|
|
|
var button = $(_item).children()[0]
|
|
|
|
$(_item).removeClass('selected')
|
|
|
|
//alert([$(button).attr('data-value'),value])
|
|
|
|
if($(button).attr('data-value') == value){
|
|
|
|
$(node).addClass('selected')
|
|
|
|
$('.'+value).show()
|
|
|
|
|
|
|
|
}else{
|
|
|
|
var m = '.'+ $(button).attr('data-value')
|
|
|
|
|
|
|
|
$(m).hide()
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
var monitor = {}
|
|
|
|
monitor.listen = {handler:null}
|
|
|
|
|
|
|
|
monitor.data = function(){
|
|
|
|
var http = HttpClient.instance()
|
|
|
|
http.get("/data",function(x){
|
|
|
|
var r = JSON.parse(x.responseText)
|
|
|
|
var keys = jx.utils.keys(r) //-- process,files
|
|
|
|
for (var i in keys){
|
|
|
|
var prefix = keys[i]
|
|
|
|
if(prefix == 'process'){
|
|
|
|
if(r[prefix].counts != 0){
|
|
|
|
//
|
|
|
|
// We should insure the listeners are enabled
|
|
|
|
if(monitor.listen.handler == null){
|
2022-10-12 14:59:35 +00:00
|
|
|
/*monitor.listen.handler = setInterval(
|
2020-12-11 12:56:11 +00:00
|
|
|
function(){
|
|
|
|
console.log('running ...')
|
2022-10-12 14:59:35 +00:00
|
|
|
monitor.data()},5000)*/
|
2020-12-11 12:56:11 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
if (monitor.listen.handler != null){
|
|
|
|
|
|
|
|
clearInterval(monitor.listen.handler)
|
|
|
|
}
|
|
|
|
dialog.close()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
monitor.render(prefix,r[prefix])
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
monitor.render = function(prefix,r){
|
|
|
|
prefix = '.'+prefix
|
|
|
|
|
|
|
|
var div = jx.dom.get.instance('DIV')
|
|
|
|
var label = jx.dom.get.instance('DIV')
|
|
|
|
div.align = 'center'
|
|
|
|
|
|
|
|
div.innerHTML = r.counts
|
|
|
|
div.className = 'number'
|
|
|
|
label.innerHTML = prefix.replace(/\./,'')
|
|
|
|
label.style.textTransform = 'capitalize'
|
|
|
|
label.className = 'small bold border-top'
|
|
|
|
div.append(label)
|
|
|
|
|
|
|
|
|
|
|
|
$(prefix + ' .board').empty()
|
|
|
|
$(prefix+' .board').append(div)
|
|
|
|
|
|
|
|
var charts = jx.utils.patterns.visitor(r.chart,function(option){
|
|
|
|
|
|
|
|
|
|
|
|
var div = jx.dom.get.instance('div')
|
|
|
|
|
|
|
|
div.className = 'chart'
|
|
|
|
div.align='center'
|
|
|
|
$(prefix+' .board').append(div)
|
|
|
|
|
|
|
|
var chart = new ApexCharts($(div)[0],option)
|
|
|
|
//chart.render()
|
|
|
|
div.chart = chart
|
|
|
|
|
|
|
|
return chart
|
|
|
|
|
|
|
|
})
|
|
|
|
var observers = jx.utils.patterns.visitor(charts,function(_item){
|
|
|
|
var m = function(_chart){
|
|
|
|
this.chart = _chart ;
|
|
|
|
this.apply = function(caller){this.chart.render();
|
|
|
|
caller.notify()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new m(_item)
|
|
|
|
})
|
|
|
|
jx.utils.patterns.observer(observers,'apply')
|
|
|
|
//jx.utils.patterns.iterator(charts,'render')
|
|
|
|
|
|
|
|
/*setTimeout(function(){
|
|
|
|
jx.utils.patterns.visitor(charts,function(_item){_item.render()})
|
|
|
|
},1000) */
|
|
|
|
}
|
|
|
|
var setup = {}
|
|
|
|
setup.open = function(){
|
|
|
|
$('.dashboard').slideUp(
|
|
|
|
function(){
|
|
|
|
$('.setup').slideDown()
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
$(document).ready(function(){
|
|
|
|
/*var shandler = new io();
|
|
|
|
|
|
|
|
if (shandler.disconnected ==false){
|
|
|
|
shandler.disconnect()
|
|
|
|
}
|
|
|
|
var socket = io.connect()
|
|
|
|
socket.on('connect',function(e){
|
|
|
|
socket.emit('connect',{name:'steve'})
|
|
|
|
})
|
|
|
|
socket.on('update',function(e){
|
|
|
|
console.log(e)
|
|
|
|
console.log()
|
|
|
|
})
|
|
|
|
var socket = io.connect('http://localhost:81',{cors:{AccessControlAllowOrigin:'*'}}) //('http://localhost:81/stream')
|
|
|
|
socket.on('procs',function(e){
|
|
|
|
|
|
|
|
})
|
|
|
|
socket.on('data',function(e){
|
|
|
|
|
|
|
|
$('.logs').empty()
|
|
|
|
var div = $('.logs')
|
|
|
|
|
|
|
|
var option = e.apex
|
|
|
|
option.plotOptions.pie.size = 220
|
|
|
|
option.plotOptions.pie = {dataLabels: {show:true,name:{show:true},value:{show:true}}}
|
|
|
|
|
|
|
|
option.legend.show = false
|
|
|
|
console.log(option)
|
|
|
|
c = new ApexCharts(div[0],option)
|
|
|
|
c.render()
|
|
|
|
socket.emit("procs",{"name":"steve"})
|
|
|
|
})*/
|
|
|
|
|
|
|
|
select($('.tab')[0])
|
|
|
|
monitor.data()
|
|
|
|
|
|
|
|
$('.email').text($('#email').val())
|
|
|
|
})
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="system setup">
|
|
|
|
<div class="status">
|
|
|
|
|
|
|
|
{% if not store.type %}
|
|
|
|
<div >
|
|
|
|
<span class="caption bold border-bottom" style="padding-right:10">Current Configuration</span>
|
|
|
|
<p></p>
|
|
|
|
<div style="display:grid; align-items:center; grid-template-columns:32px auto;">
|
|
|
|
<i class="fa fa-times" style="font-size:28; margin:4px;"></i> <span>System needs to be initialized !</span>
|
|
|
|
</div>
|
|
|
|
<p></p>
|
|
|
|
<div class="active-button border-round" style="width:50%">
|
|
|
|
<div class="icon">
|
|
|
|
<i class="fas fa-cog" style="font-size:28"></i>
|
|
|
|
</div>
|
|
|
|
<div class="bold" align="center">Initialize</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{% else %}
|
|
|
|
<div class="border-right">
|
|
|
|
|
|
|
|
<span class="caption bold border-bottom" style="padding-right:10">Current Configuration</span>
|
|
|
|
<p>
|
|
|
|
</p>
|
|
|
|
<div class="item" style="display:grid; align-items:center">
|
|
|
|
<div class="bold" style="text-transform: capitalize;">Owner </div><div class="bold">:</div>
|
|
|
|
<div>
|
|
|
|
|
|
|
|
<input type="text" id="email" value="{{owner}}">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="item">
|
|
|
|
<div class="bold" style="text-transform: capitalize;">store</div><div class="bold">:</div>
|
|
|
|
<div class="">{{store.type}}</div>
|
|
|
|
</div>
|
|
|
|
<p></p>
|
|
|
|
<div class="active-button border-round" style="width:50%" onclick="healthcare.io.update()">
|
|
|
|
<div class="icon">
|
|
|
|
<I class="fas fa-download" style="font-size:28"></I>
|
|
|
|
</div>
|
|
|
|
<div class="bold" align="center">Update Config</div>
|
|
|
|
</div>
|
|
|
|
<p>
|
|
|
|
<div class="code">
|
|
|
|
#<br>
|
|
|
|
healthcare-io.py --init <span class="email"></span> --store mongo
|
|
|
|
</div>
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
{%endif%}
|
|
|
|
<p></p>
|
|
|
|
<br>
|
|
|
|
<div class="border-right">
|
|
|
|
<span class="caption bold border-bottom" style="padding-right:10">Manage Plan</span>
|
|
|
|
<p></p>
|
|
|
|
<div style="line-height: 2;">Insure your account is tied to a cloud service provider.
|
|
|
|
<br>We support <span class="bold">google-drive, dropbox, one-drive or box. </span>
|
|
|
|
</div>
|
|
|
|
<p>
|
|
|
|
<div class="bold active-button border-round" style="width:50%" onclick="jx.modal.show({url:'https://healthcareio.the-phi.com/store/healthcareio/plans'})">
|
|
|
|
<div>
|
|
|
|
<img src="{{context}}/static/img/logo.svg" />
|
|
|
|
</div>
|
|
|
|
<div align="center">Open Plan Console</div>
|
|
|
|
</div>
|
|
|
|
</p>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<br>
|
|
|
|
<div class="border-right" style="height:30%"></div>
|
|
|
|
</div>
|
|
|
|
<div class="_border-right"></div>
|
|
|
|
<div >
|
|
|
|
<span class="caption bold border-bottom" style="padding-right:10">
|
|
|
|
Manage Processes</span>
|
|
|
|
<p>
|
|
|
|
<div class="input-form" style="grid-template-columns: 30% auto;">
|
|
|
|
<div class="item" style="grid-row:1; grid-column:1; ">
|
|
|
|
<div class="label">Process #</div>
|
|
|
|
<input type="text" class="procs batch"placeholder="#" style="width:64px; text-align:right" value="{{args.batch}}" onchange="healthcare.io.apply()"/>
|
|
|
|
</div>
|
|
|
|
<div class="item" style="grid-row:1; grid-column:2 ">
|
|
|
|
<div class="label">Folder #</div>
|
|
|
|
<input type="text" placeholder="Process counts" value="/data"/ class="data folder" disabled>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div style="display:grid; grid-template-columns:repeat(2,215px); gap:2px;">
|
|
|
|
<div class="active-button border-round bold io-apply" style="margin-top:32; display:none" onclick="healthcare.io.apply()">
|
|
|
|
<div class="icon"><i class="far fa-save" style="font-size:28; color:#4682B4"></i></div>
|
|
|
|
<div align="center">Apply</div>
|
|
|
|
</div>
|
|
|
|
<div class="active-button border-round bold" style="margin-top:32" onclick="healthcare.io.stop()">
|
|
|
|
<i class="far fa-stop-circle" style="font-size:28; color:maroon"></i>
|
|
|
|
|
|
|
|
<div align="center">Stop</div>
|
|
|
|
</div>
|
|
|
|
<div class="active-button border-round bold" style="margin-top:32" onclick="healthcare.io.run()">
|
|
|
|
<i class="fas fa-running" style="font-size:28; color:green"></i>
|
|
|
|
<div align="center">Run</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
<div class="code">
|
|
|
|
<div class="bold"># The command that will be executed</div>
|
|
|
|
<div>healthcare-io.py --parse --folder /data --batch <span class="batch">{{args.batch}}</span></div>
|
|
|
|
</div>
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
<div style="display:grid; grid-template-columns:auto 48px ; gap:2px">
|
|
|
|
<div class="bold caption border-bottom">Process Monitoring</div>
|
|
|
|
<div class="active" align="center" title="reload" onclick="monitor.data()"><i class="fas fa-sync"></i></div>
|
|
|
|
</div>
|
|
|
|
<div class="small">Powered by smart-top</div>
|
|
|
|
<p></p>
|
|
|
|
<div class="tabs">
|
|
|
|
<div class="tab selected" onclick="select(this)">
|
|
|
|
<div class="active" data-value="process" >
|
|
|
|
<i class="far fa-clock" style="color:maroon"></i>
|
|
|
|
<span>Process</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="tab" onclick="select(this)">
|
|
|
|
<div class="active" data-value="files"><i class="fas fa-file-alt"></i> Files</div>
|
|
|
|
</div>
|
|
|
|
<div class="tab" onclick="select(this)">
|
|
|
|
<div class="active" data-value="export"><i class="fas fa-upload"></i> Export</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div class="data-info">
|
|
|
|
<div class="process ">
|
|
|
|
|
|
|
|
<div class="board"></div>
|
|
|
|
<div class="small" align="center">
|
|
|
|
<div class="border-top bold" style="color:#4682B4;">Running Processes and resource usage</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="files">
|
|
|
|
<div class="board"></div>
|
|
|
|
<div class="small" align="center">
|
|
|
|
<div class="border-top bold" style="color:#4682B4;">Summary of files found and processed</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div class="export">
|
|
|
|
<p></p>
|
|
|
|
<div class="etl">
|
|
|
|
<div class="" >
|
|
|
|
<div class="menu" style="position:absolute; width:200">
|
|
|
|
<div class="items ">
|
|
|
|
<div class="bold active" style="display:grid; grid-template-columns:80% auto;">
|
|
|
|
<span>
|
|
|
|
<i class="fas fa-cloud"></i>
|
|
|
|
Cloud</span>
|
|
|
|
<span class="glyph">
|
|
|
|
<i class="fas fa-angle-down"></i>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
<div class="item-group border-round border small">
|
|
|
|
<div class="item" onclick="healthcare.io.publish.database.init('s3')">AWS S3</div>
|
|
|
|
<div class="item" onclick="healthcare.io.publish.database.init('bigquery')">Google Bigquery</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="items ">
|
|
|
|
<div class="bold active"style="display:grid; grid-template-columns:80% auto;">
|
|
|
|
<span>
|
|
|
|
<i class="fas fa-database"></i>
|
|
|
|
Database</span>
|
|
|
|
<span class="glyph">
|
|
|
|
<i class="fas fa-angle-down"></i>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
<div class="item-group border-round border small">
|
|
|
|
<div class="bold">SQL</div>
|
|
|
|
|
|
|
|
<div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('postgresql')">PostgreSQL</div>
|
|
|
|
<div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('mysql')">MySQL</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bold">NoSQL</div>
|
|
|
|
<div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('mongodb')">Mongodb</div>
|
|
|
|
<div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('couchdb')">Couchdb</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<div class="active-button border-round" style="width:50%">
|
|
|
|
<div class="icon"><i class="fas fa-running" style="font-size:28"></i></div> <div class="bold" align="center">Start</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
</div>
|