setup.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. <style>
  2. .system {height:99%; overflow:hidden;}
  3. .data-info .board{ height:300px; display:grid; grid-template-columns:auto 200px 200px; gap:20px; align-items:center}
  4. /*.board { background-image: linear-gradient(to bottom, #ffffff,#ffffff,#f3f3f3,#d3d3d3d3)}*/
  5. .number {font-size:48px; font-family:courier;padding:8px; ;}
  6. .etl {display:grid; grid-template-columns: 250px auto; gap:2;}
  7. .chart {box-shadow : 0px 1px 4px 2px #d3d3d3; width:200px; height:250px;
  8. display:grid; align-items:center;
  9. background-image: linear-gradient(to bottom,#f3f3f3,#ffffff);
  10. overflow:hidden;
  11. }
  12. .dialog { width:450px; min-height:200px; display:grid; grid-template-rows: 40px 80% auto; gap:4px}
  13. .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}
  14. .dialog .action {display:grid; align-items: flex-end; padding-left:25%; padding-right:25%;}
  15. .dialog .message {display:grid; align-items: center; grid-template-columns: 20% auto;}
  16. .dialog .message .text {line-height:2; text-transform: capitalize;}
  17. .fa-exclamation-triangle {color:orange}
  18. .fa-question-circle{color:#009df7}
  19. </style>
  20. <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
  21. <script src="{{context}}/static/js/io/dialog.js"></script>
  22. <script src="{{context}}/static/js/io/io.js"></script>
  23. <script src="{{context}}/static/js/io/healthcare.js"></script>
  24. <script>
  25. var select = function(node){
  26. var value = $($(node).children()[0]).attr('data-value')
  27. jx.utils.patterns.visitor($('.tab'),function(_item){
  28. var button = $(_item).children()[0]
  29. $(_item).removeClass('selected')
  30. //alert([$(button).attr('data-value'),value])
  31. if($(button).attr('data-value') == value){
  32. $(node).addClass('selected')
  33. $('.'+value).show()
  34. }else{
  35. var m = '.'+ $(button).attr('data-value')
  36. $(m).hide()
  37. }
  38. })
  39. }
  40. var monitor = {}
  41. monitor.listen = {handler:null}
  42. monitor.data = function(){
  43. var http = HttpClient.instance()
  44. http.get("/data",function(x){
  45. var r = JSON.parse(x.responseText)
  46. var keys = jx.utils.keys(r) //-- process,files
  47. for (var i in keys){
  48. var prefix = keys[i]
  49. if(prefix == 'process'){
  50. if(r[prefix].counts != 0){
  51. //
  52. // We should insure the listeners are enabled
  53. if(monitor.listen.handler == null){
  54. /*monitor.listen.handler = setInterval(
  55. function(){
  56. console.log('running ...')
  57. monitor.data()},5000)*/
  58. }
  59. }else{
  60. if (monitor.listen.handler != null){
  61. clearInterval(monitor.listen.handler)
  62. }
  63. dialog.close()
  64. }
  65. }
  66. monitor.render(prefix,r[prefix])
  67. }
  68. })
  69. }
  70. monitor.render = function(prefix,r){
  71. prefix = '.'+prefix
  72. var div = jx.dom.get.instance('DIV')
  73. var label = jx.dom.get.instance('DIV')
  74. div.align = 'center'
  75. div.innerHTML = r.counts
  76. div.className = 'number'
  77. label.innerHTML = prefix.replace(/\./,'')
  78. label.style.textTransform = 'capitalize'
  79. label.className = 'small bold border-top'
  80. div.append(label)
  81. $(prefix + ' .board').empty()
  82. $(prefix+' .board').append(div)
  83. var charts = jx.utils.patterns.visitor(r.chart,function(option){
  84. var div = jx.dom.get.instance('div')
  85. div.className = 'chart'
  86. div.align='center'
  87. $(prefix+' .board').append(div)
  88. var chart = new ApexCharts($(div)[0],option)
  89. //chart.render()
  90. div.chart = chart
  91. return chart
  92. })
  93. var observers = jx.utils.patterns.visitor(charts,function(_item){
  94. var m = function(_chart){
  95. this.chart = _chart ;
  96. this.apply = function(caller){this.chart.render();
  97. caller.notify()
  98. }
  99. }
  100. return new m(_item)
  101. })
  102. jx.utils.patterns.observer(observers,'apply')
  103. //jx.utils.patterns.iterator(charts,'render')
  104. /*setTimeout(function(){
  105. jx.utils.patterns.visitor(charts,function(_item){_item.render()})
  106. },1000) */
  107. }
  108. var setup = {}
  109. setup.open = function(){
  110. $('.dashboard').slideUp(
  111. function(){
  112. $('.setup').slideDown()
  113. }
  114. )
  115. }
  116. $(document).ready(function(){
  117. /*var shandler = new io();
  118. if (shandler.disconnected ==false){
  119. shandler.disconnect()
  120. }
  121. var socket = io.connect()
  122. socket.on('connect',function(e){
  123. socket.emit('connect',{name:'steve'})
  124. })
  125. socket.on('update',function(e){
  126. console.log(e)
  127. console.log()
  128. })
  129. var socket = io.connect('http://localhost:81',{cors:{AccessControlAllowOrigin:'*'}}) //('http://localhost:81/stream')
  130. socket.on('procs',function(e){
  131. })
  132. socket.on('data',function(e){
  133. $('.logs').empty()
  134. var div = $('.logs')
  135. var option = e.apex
  136. option.plotOptions.pie.size = 220
  137. option.plotOptions.pie = {dataLabels: {show:true,name:{show:true},value:{show:true}}}
  138. option.legend.show = false
  139. console.log(option)
  140. c = new ApexCharts(div[0],option)
  141. c.render()
  142. socket.emit("procs",{"name":"steve"})
  143. })*/
  144. select($('.tab')[0])
  145. monitor.data()
  146. $('.email').text($('#email').val())
  147. })
  148. </script>
  149. <div class="system setup">
  150. <div class="status">
  151. {% if not store.type %}
  152. <div >
  153. <span class="caption bold border-bottom" style="padding-right:10">Current Configuration</span>
  154. <p></p>
  155. <div style="display:grid; align-items:center; grid-template-columns:32px auto;">
  156. <i class="fa fa-times" style="font-size:28; margin:4px;"></i> <span>System needs to be initialized !</span>
  157. </div>
  158. <p></p>
  159. <div class="active-button border-round" style="width:50%">
  160. <div class="icon">
  161. <i class="fas fa-cog" style="font-size:28"></i>
  162. </div>
  163. <div class="bold" align="center">Initialize</div>
  164. </div>
  165. </div>
  166. {% else %}
  167. <div class="border-right">
  168. <span class="caption bold border-bottom" style="padding-right:10">Current Configuration</span>
  169. <p>
  170. </p>
  171. <div class="item" style="display:grid; align-items:center">
  172. <div class="bold" style="text-transform: capitalize;">Owner </div><div class="bold">:</div>
  173. <div>
  174. <input type="text" id="email" value="{{owner}}">
  175. </div>
  176. </div>
  177. <div class="item">
  178. <div class="bold" style="text-transform: capitalize;">store</div><div class="bold">:</div>
  179. <div class="">{{store.type}}</div>
  180. </div>
  181. <p></p>
  182. <div class="active-button border-round" style="width:50%" onclick="healthcare.io.update()">
  183. <div class="icon">
  184. <I class="fas fa-download" style="font-size:28"></I>
  185. </div>
  186. <div class="bold" align="center">Update Config</div>
  187. </div>
  188. <p>
  189. <div class="code">
  190. #<br>
  191. healthcare-io.py --init <span class="email"></span> --store mongo
  192. </div>
  193. </p>
  194. </div>
  195. {%endif%}
  196. <p></p>
  197. <br>
  198. <div class="border-right">
  199. <span class="caption bold border-bottom" style="padding-right:10">Manage Plan</span>
  200. <p></p>
  201. <div style="line-height: 2;">Insure your account is tied to a cloud service provider.
  202. <br>We support <span class="bold">google-drive, dropbox, one-drive or box. </span>
  203. </div>
  204. <p>
  205. <div class="bold active-button border-round" style="width:50%" onclick="jx.modal.show({url:'https://healthcareio.the-phi.com/store/healthcareio/plans'})">
  206. <div>
  207. <img src="{{context}}/static/img/logo.svg" />
  208. </div>
  209. <div align="center">Open Plan Console</div>
  210. </div>
  211. </p>
  212. </div>
  213. <br>
  214. <div class="border-right" style="height:30%"></div>
  215. </div>
  216. <div class="_border-right"></div>
  217. <div >
  218. <span class="caption bold border-bottom" style="padding-right:10">
  219. Manage Processes</span>
  220. <p>
  221. <div class="input-form" style="grid-template-columns: 30% auto;">
  222. <div class="item" style="grid-row:1; grid-column:1; ">
  223. <div class="label">Process #</div>
  224. <input type="text" class="procs batch"placeholder="#" style="width:64px; text-align:right" value="{{args.batch}}" onchange="healthcare.io.apply()"/>
  225. </div>
  226. <div class="item" style="grid-row:1; grid-column:2 ">
  227. <div class="label">Folder #</div>
  228. <input type="text" placeholder="Process counts" value="/data"/ class="data folder" disabled>
  229. </div>
  230. </div>
  231. <div style="display:grid; grid-template-columns:repeat(2,215px); gap:2px;">
  232. <div class="active-button border-round bold io-apply" style="margin-top:32; display:none" onclick="healthcare.io.apply()">
  233. <div class="icon"><i class="far fa-save" style="font-size:28; color:#4682B4"></i></div>
  234. <div align="center">Apply</div>
  235. </div>
  236. <div class="active-button border-round bold" style="margin-top:32" onclick="healthcare.io.stop()">
  237. <i class="far fa-stop-circle" style="font-size:28; color:maroon"></i>
  238. <div align="center">Stop</div>
  239. </div>
  240. <div class="active-button border-round bold" style="margin-top:32" onclick="healthcare.io.run()">
  241. <i class="fas fa-running" style="font-size:28; color:green"></i>
  242. <div align="center">Run</div>
  243. </div>
  244. </div>
  245. </p>
  246. <p>
  247. <div class="code">
  248. <div class="bold"># The command that will be executed</div>
  249. <div>healthcare-io.py --parse --folder /data --batch <span class="batch">{{args.batch}}</span></div>
  250. </div>
  251. </p>
  252. <p>
  253. <div style="display:grid; grid-template-columns:auto 48px ; gap:2px">
  254. <div class="bold caption border-bottom">Process Monitoring</div>
  255. <div class="active" align="center" title="reload" onclick="monitor.data()"><i class="fas fa-sync"></i></div>
  256. </div>
  257. <div class="small">Powered by smart-top</div>
  258. <p></p>
  259. <div class="tabs">
  260. <div class="tab selected" onclick="select(this)">
  261. <div class="active" data-value="process" >
  262. <i class="far fa-clock" style="color:maroon"></i>
  263. <span>Process</span>
  264. </div>
  265. </div>
  266. <div class="tab" onclick="select(this)">
  267. <div class="active" data-value="files"><i class="fas fa-file-alt"></i> Files</div>
  268. </div>
  269. <div class="tab" onclick="select(this)">
  270. <div class="active" data-value="export"><i class="fas fa-upload"></i> Export</div>
  271. </div>
  272. </div>
  273. <div class="data-info">
  274. <div class="process ">
  275. <div class="board"></div>
  276. <div class="small" align="center">
  277. <div class="border-top bold" style="color:#4682B4;">Running Processes and resource usage</div>
  278. </div>
  279. </div>
  280. <div class="files">
  281. <div class="board"></div>
  282. <div class="small" align="center">
  283. <div class="border-top bold" style="color:#4682B4;">Summary of files found and processed</div>
  284. </div>
  285. </div>
  286. <div class="export">
  287. <p></p>
  288. <div class="etl">
  289. <div class="" >
  290. <div class="menu" style="position:absolute; width:200">
  291. <div class="items ">
  292. <div class="bold active" style="display:grid; grid-template-columns:80% auto;">
  293. <span>
  294. <i class="fas fa-cloud"></i>
  295. Cloud</span>
  296. <span class="glyph">
  297. <i class="fas fa-angle-down"></i>
  298. </span>
  299. </div>
  300. <div class="item-group border-round border small">
  301. <div class="item" onclick="healthcare.io.publish.database.init('s3')">AWS S3</div>
  302. <div class="item" onclick="healthcare.io.publish.database.init('bigquery')">Google Bigquery</div>
  303. </div>
  304. </div>
  305. <div class="items ">
  306. <div class="bold active"style="display:grid; grid-template-columns:80% auto;">
  307. <span>
  308. <i class="fas fa-database"></i>
  309. Database</span>
  310. <span class="glyph">
  311. <i class="fas fa-angle-down"></i>
  312. </span>
  313. </div>
  314. <div class="item-group border-round border small">
  315. <div class="bold">SQL</div>
  316. <div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('postgresql')">PostgreSQL</div>
  317. <div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('mysql')">MySQL</div>
  318. <div class="bold">NoSQL</div>
  319. <div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('mongodb')">Mongodb</div>
  320. <div class="item" style="margin-left:15px; margin-right:32px" onclick="healthcare.io.publish.database.init('couchdb')">Couchdb</div>
  321. </div>
  322. </div>
  323. </div>
  324. </div>
  325. <div>
  326. <div class="active-button border-round" style="width:50%">
  327. <div class="icon"><i class="fas fa-running" style="font-size:28"></i></div> <div class="bold" align="center">Start</div>
  328. </div>
  329. </div>
  330. </div>
  331. </div>
  332. </div>
  333. </p>
  334. </div>
  335. </div>