You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
514 lines
17 KiB
514 lines
17 KiB
<!DOCTYPE html>
|
|
<html lang="en" >
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>OpenRPA</title>
|
|
<link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css">
|
|
<script
|
|
src="3rdParty/jQuery/jquery-3.1.1.min.js"
|
|
crossorigin="anonymous"></script>
|
|
<script src="3rdParty/Semantic-UI-CSS-master/semantic.min.js"></script>
|
|
<script src="3rdParty/Handlebars/handlebars-v4.1.2.js"></script>
|
|
<script>
|
|
var mGlobal={}
|
|
$(document)
|
|
.ready(function() {
|
|
// fix main menu to page on passing
|
|
$('.main.menu').visibility({
|
|
type: 'fixed'
|
|
});
|
|
$('.overlay').visibility({
|
|
type: 'fixed',
|
|
offset: 80
|
|
});
|
|
|
|
// lazy load images
|
|
$('.image').visibility({
|
|
type: 'image',
|
|
transition: 'vertical flip in',
|
|
duration: 500
|
|
});
|
|
|
|
// show dropdown on hover
|
|
$('.main.menu .ui.dropdown').dropdown({
|
|
on: 'hover'
|
|
});
|
|
String.prototype.replaceAll = function(search, replace){
|
|
return this.split(search).join(replace);
|
|
}
|
|
mGlobal.GeneralGenerateHTMLCodeHandlebars=function(inInnerTemplateSelector,inData) {
|
|
lHTMLTemplate=$(inInnerTemplateSelector)[0].innerHTML
|
|
console.log(lHTMLTemplate)
|
|
//Компиляция
|
|
var template = Handlebars.compile(lHTMLTemplate);
|
|
//Вставка данных
|
|
var lHTMLResult = template(inData);
|
|
return lHTMLResult
|
|
}
|
|
mGlobal.GeneralGenerateHTMLCode=function(inTemplateHTMLSelector,inItemDictionary,inKeywordPrefix="::",inKeywordPostfix="::") {
|
|
///Получить заготовку
|
|
lTemplateHTMLCode=$(inTemplateHTMLSelector)[0].outerHTML
|
|
///Определить ключь экранирования специальных ключевых слов
|
|
///Выполнить циклические замены, если там есть пожходящие ключи
|
|
lResultHTMLCode=lTemplateHTMLCode
|
|
for(var lKey in inItemDictionary) {
|
|
lHTMLKey=inKeywordPrefix+lKey+inKeywordPostfix;
|
|
lResultHTMLCode=lResultHTMLCode.replaceAll(lHTMLKey,inItemDictionary[lKey])
|
|
}
|
|
///Вернуть результат
|
|
return lResultHTMLCode
|
|
}
|
|
//////////////////////////
|
|
/////Info JS module
|
|
//////////////////////////
|
|
mGlobal.Info={};
|
|
|
|
mGlobal.Info.TableActivityLogScheduleListRefresh=function() {
|
|
///Обнулить таблицу
|
|
$(".openrpa-info-table-activitylogschedulelist").html("")
|
|
$.ajax({
|
|
type: "POST",
|
|
url: 'ProcessingRun',
|
|
data: '{"actionList":[{"type":"ActivityLogScheduleListGet"}]}',
|
|
success:
|
|
function(lData,l2,l3)
|
|
{
|
|
var lResponseJSON=JSON.parse(lData)
|
|
///Отправить запрос на формирование таблицы
|
|
lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-info-table-activitylogschedulelist",lResponseJSON["actionListResult"][0])
|
|
///Установить HTML код
|
|
$(".openrpa-info-table-activitylogschedulelist").html(lHTMLCode)
|
|
},
|
|
dataType: "text"
|
|
});
|
|
}
|
|
|
|
|
|
mGlobal.Info.TablePlanLogListRefresh=function() {
|
|
///Обнулить таблицу
|
|
$(".openrpa-info-table-planloglist").html("")
|
|
$.ajax({
|
|
type: "POST",
|
|
url: 'ProcessingRun',
|
|
data: '{"actionList":[{"type":"PlanLogListGet"}]}',
|
|
success:
|
|
function(lData,l2,l3)
|
|
{
|
|
var lResponseJSON=JSON.parse(lData)
|
|
lResponseJSON["actionListResult"][0]["result"].forEach(function(lItem){lItem["processPathName"]=("processPath" in lItem ? lItem["processPath"] : lItem["processName"])})
|
|
///Отправить запрос на формирование таблицы
|
|
lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-info-table-planloglist",lResponseJSON["actionListResult"][0]);
|
|
///Установить HTML код
|
|
$(".openrpa-info-table-planloglist").html(lHTMLCode)
|
|
},
|
|
dataType: "text"
|
|
});
|
|
}
|
|
|
|
//////////////////////////
|
|
/////Controller JS module
|
|
//////////////////////////
|
|
mGlobal.Controller={};
|
|
mGlobal.Controller.CMDRun=function() {
|
|
///Обнулить таблицу
|
|
lCMDCode=$(".openrpa-controller-cmd-run-input")[0].value
|
|
$.ajax({
|
|
type: "POST",
|
|
url: 'ProcessingRun',
|
|
data: '{"actionList":[{"type":"ActivityCMDRun", "code":"'+lCMDCode+'"}]}',
|
|
success:
|
|
function(lData,l2,l3)
|
|
{
|
|
var lResponseJSON=JSON.parse(lData)
|
|
///Отправить запрос на формирование таблицы
|
|
lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result)
|
|
},
|
|
dataType: "text"
|
|
});
|
|
}
|
|
mGlobal.Controller.CMDRunGUILogout=function() {
|
|
///Обнулить таблицу
|
|
lCMDCode="for /f \"skip=1 tokens=2\" %s in ('query user %USERNAME%') do (tscon \\dest:console)"
|
|
lCMDCode = lCMDCode.replace(/\\n/g, "\\n")
|
|
.replace(/\\'/g, "\\'")
|
|
.replace(/\\"/g, '\\"')
|
|
.replace(/\\&/g, "\\&")
|
|
.replace(/\\r/g, "\\r")
|
|
.replace(/\\t/g, "\\t")
|
|
.replace(/\\b/g, "\\b")
|
|
.replace(/\\f/g, "\\f")
|
|
.replace('"', "\\\"");
|
|
$.ajax({
|
|
type: "POST",
|
|
url: 'ProcessingRun',
|
|
data: '{"actionList":[{"type":"ActivityCMDRun", "code":"'+lCMDCode+'"}]}',
|
|
success:
|
|
function(lData,l2,l3)
|
|
{
|
|
var lResponseJSON=JSON.parse(lData)
|
|
///Отправить запрос на формирование таблицы
|
|
lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result)
|
|
},
|
|
dataType: "text"
|
|
});
|
|
}
|
|
|
|
|
|
///Перезагрузить Orchestrator
|
|
mGlobal.Controller.OrchestratorRestart=function() {
|
|
$.ajax({
|
|
type: "POST",
|
|
url: 'ProcessingRun',
|
|
data: '{"actionList":[{"type":"ActivityRestartOrchestrator"}]}',
|
|
success:
|
|
function(lData,l2,l3)
|
|
{
|
|
var lResponseJSON=JSON.parse(lData)
|
|
},
|
|
dataType: "text"
|
|
});
|
|
}
|
|
|
|
//////////////////////////
|
|
/////Monitor JS module
|
|
//////////////////////////
|
|
mGlobal.Monitor={};
|
|
mGlobal.Monitor.ScreenshotModal={};
|
|
mGlobal.Monitor.GenerateUniqueID=function(inPrefix="tempUID=") {
|
|
return inPrefix+Math.round(Math.random()*1000)+"-"+Math.round(Math.random()*10000)+"-"+Math.round(Math.random()*1000)
|
|
}
|
|
//inHostURI: http://localhost:8081
|
|
mGlobal.Monitor.ScreenshotModal.Show=function(inHostURI=" ") {
|
|
$('.ui.modal.daemon-screenshot').modal('show');
|
|
|
|
//Функция обновления картинки
|
|
lScreenshotUpdate=function() {
|
|
lScreenshotSrc=inHostURI+"/GetScreenshot?"+mGlobal.Monitor.GenerateUniqueID()
|
|
$(".daemon-screenshot img").attr('src', lScreenshotSrc);
|
|
}
|
|
|
|
mGlobal.Monitor.ScreenshotModal.timerId=setInterval(lScreenshotUpdate,1500)
|
|
|
|
}
|
|
mGlobal.Monitor.ScreenshotModal.Close=function() {
|
|
clearInterval(mGlobal.Monitor.ScreenshotModal.timerId);
|
|
}
|
|
///Monitor
|
|
mGlobal.Monitor.DaemonList={}
|
|
mGlobal.Monitor.DaemonList.fRefreshTable=function() {
|
|
///Загрузка данных
|
|
$.ajax({
|
|
type: "GET",
|
|
url: 'Monitor/JSONDaemonListGet',
|
|
data: '',
|
|
success:
|
|
function(lData,l2,l3)
|
|
{
|
|
var lResponseJSON=JSON.parse(lData)
|
|
///Сформировать HTML код новой таблицы
|
|
lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-monitor-table-general",lResponseJSON)
|
|
///Очистить дерево
|
|
//mGlobal.ElementTree.fClear();
|
|
///Прогрузить новую таблицу
|
|
$(".openrpa-monitor").html(lHTMLCode)
|
|
},
|
|
dataType: "text"
|
|
});
|
|
}
|
|
|
|
/////////////////////////////////////
|
|
///Инициализация страницы
|
|
////////////////////////////////////
|
|
mGlobal.Info.TableActivityLogScheduleListRefresh();
|
|
mGlobal.Info.TablePlanLogListRefresh();
|
|
})
|
|
;
|
|
</script>
|
|
|
|
<style type="text/css">
|
|
|
|
body {
|
|
background-color: #FFFFFF;
|
|
}
|
|
.main.container {
|
|
margin-top: 2em;
|
|
}
|
|
|
|
|
|
|
|
.overlay {
|
|
float: left;
|
|
margin: 0em 3em 1em 0em;
|
|
}
|
|
.overlay .menu {
|
|
position: relative;
|
|
left: 0;
|
|
transition: left 0.5s ease;
|
|
}
|
|
|
|
.main.menu.fixed {
|
|
background-color: #FFFFFF;
|
|
border: 1px solid #DDD;
|
|
box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.2);
|
|
}
|
|
.overlay.fixed .menu {
|
|
left: 800px;
|
|
}
|
|
|
|
.text.container .left.floated.image {
|
|
margin: 2em 2em 2em -4em;
|
|
}
|
|
.text.container .right.floated.image {
|
|
margin: 2em -4em 2em 2em;
|
|
}
|
|
|
|
.ui.footer.segment {
|
|
margin: 5em 0em 0em;
|
|
padding: 5em 0em;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="ui internally celled grid">
|
|
<div class="row black">
|
|
<div class="three wide column">
|
|
<h1 class="ui header inverted">OpenRPA</h1>
|
|
</div>
|
|
<div class="eleven wide column">
|
|
<h1 class="ui header inverted">Orchestrator Web GUI</h1>
|
|
</div>
|
|
<div class="two wide column">
|
|
<h5>by UnicodeLabs</h5>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="row">
|
|
<div class="ten wide column" >
|
|
<h4 class="ui horizontal divider header">
|
|
<i class="clipboard list icon"></i>
|
|
Activity log
|
|
</h4>
|
|
<div class="ui info message">
|
|
<button class="ui icon button labeled" onclick="mGlobal.Info.TableActivityLogScheduleListRefresh();">
|
|
<i class="sync alternate icon"></i>
|
|
Refresh
|
|
</button>
|
|
|
|
</div>
|
|
<div class="openrpa-info-table-activitylogschedulelist">
|
|
</div >
|
|
<script class="openrpa-hidden-info-table-activitylogschedulelist" style="display:none" type="text/x-handlebars-template">
|
|
<table class="ui celled table">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Activity type</th>
|
|
<th>Process</th>
|
|
<th>Activity DateTime plan</th>
|
|
<th>Activity DateTime fact</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{#result}}
|
|
<tr>
|
|
<td>{{@index}}</td>
|
|
<td>{{activityType}}</td>
|
|
<td>{{processPath}}</td>
|
|
<td>{{activityDateTime}}</td>
|
|
<td class="negative">{{activityStartDateTime}}</td>
|
|
</tr>
|
|
{{/result}}
|
|
</tbody>
|
|
</table>
|
|
</script>
|
|
</div>
|
|
<div class="ten wide column rpa-property-list" >
|
|
<h4 class="ui horizontal divider header">
|
|
<i class="clipboard list icon"></i>
|
|
Plan log
|
|
</h4>
|
|
<div class="ui info message">
|
|
<button class="ui icon button labeled" onclick="mGlobal.Info.TablePlanLogListRefresh();">
|
|
<i class="sync alternate icon"></i>
|
|
Refresh
|
|
</button>
|
|
</div>
|
|
<div class="openrpa-info-table-planloglist">
|
|
</div >
|
|
<script class="openrpa-hidden-info-table-planloglist" style="display:none" type="text/x-handlebars-template">
|
|
<table class="ui celled table">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Activity type</th>
|
|
<th>Time</th>
|
|
<th>Process path/Process name</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{#result}}
|
|
<tr>
|
|
<td>{{@index}}</td>
|
|
<td>{{activityType}}</td>
|
|
<td>{{time}}</td>
|
|
<td>{{processPathName}}</td>
|
|
</tr>
|
|
{{/result}}
|
|
</tbody>
|
|
</table>
|
|
</script>
|
|
</div>
|
|
</div>
|
|
<div class="row black">
|
|
<div class="three wide column">
|
|
|
|
</div>
|
|
<div class="three wide column">
|
|
<h2 class="ui header inverted">Monitor</h2>
|
|
</div>
|
|
<div class="two wide column">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<button class="ui labeled icon button" onclick="mGlobal.Monitor.ScreenshotModal.Show();">
|
|
<i class="desktop icon"></i>
|
|
Look machine screenshot
|
|
</button>
|
|
<button class="ui labeled icon button red" onclick="mGlobal.Controller.OrchestratorRestart();">
|
|
<i class="redo icon"></i>
|
|
Restart Orchestrator
|
|
</button>
|
|
|
|
<script class="openrpa-hidden-monitor-table-general" style="display:none" type="text/x-handlebars-template">
|
|
<table class="ui celled table">
|
|
<thead>
|
|
<tr>
|
|
<th>Machine name</th>
|
|
<th>Machihe host</th>
|
|
<th>Status</th>
|
|
<th>Actions,length: {{childs.length}}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{#webServerMonitorList}}
|
|
<tr><td>{{daemonName}}</td><td>{{daemonURI}}</td><td class="negative">None</td></tr>
|
|
{{/webServerMonitorList}}
|
|
</tbody>
|
|
</table>
|
|
</script>
|
|
<div class="row openrpa-monitor">
|
|
|
|
</div>
|
|
<div class="row black">
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<div class="ui inverted vertical footer segment">
|
|
<div class="ui center aligned container">
|
|
<div class="ui stackable inverted divided grid">
|
|
<div class="three wide column">
|
|
<h4 class="ui inverted header">Pywinauto</h4>
|
|
<div class="ui inverted link list">
|
|
<a href="https://pywinauto.readthedocs.io/en/latest/code/pywinauto.findwindows.html" class="item" target="_blank">Specification manual</a>
|
|
<a href="https://pywinauto.readthedocs.io/en/latest/code/code.html#main-user-modules" class="item" target="_blank">Classes manual</a>
|
|
<a href="https://pywinauto.readthedocs.io/en/latest/code/code.html#main-user-modules" class="item" target="_blank">How to use manual</a>
|
|
<a href="https://pywinauto.readthedocs.io/en/latest/code/pywinauto.base_wrapper.html" class="item" target="_blank">Base wrapper manual</a>
|
|
</div>
|
|
</div>
|
|
<div class="three wide column">
|
|
<h4 class="ui inverted header">Semantic UI</h4>
|
|
<div class="ui inverted link list">
|
|
<a href="https://semantic-ui.com/usage/theming.html" class="item" target="_blank">Color manual</a>
|
|
<a href="https://semantic-ui.com/elements/input.html" class="item" target="_blank">Input manual</a>
|
|
<a href="https://semantic-ui.com/elements/icon.html" class="item" target="_blank">Icon list</a>
|
|
<a href="https://semantic-ui.com/elements/button.html" class="item" target="_blank">Button manual</a>
|
|
</div>
|
|
</div>
|
|
<div class="three wide column">
|
|
<h4 class="ui inverted header">GitLab</h4>
|
|
<div class="ui inverted link list">
|
|
<a href="https://gitlab.com/UnicodeLabs/OpenRPA" class="item" target="_blank">OpenRPA repository</a>
|
|
<a href="https://gitlab.com/UnicodeLabs" class="item" target="_blank">UnicodeLabs</a>
|
|
<a href="#" class="item">Link -</a>
|
|
<a href="#" class="item">Link -</a>
|
|
</div>
|
|
</div>
|
|
<div class="seven wide column">
|
|
<h4 class="ui inverted header">OpenRPA</h4>
|
|
<p>Open source Robotic Process Automation software by the Unicode Labs (Created by Ivan Maslov). Under the MIT license.</p>
|
|
</div>
|
|
</div>
|
|
<div class="ui inverted section divider"></div>
|
|
<div class="ui horizontal inverted small divided link list">
|
|
<a class="item" href="#">Site Map</a>
|
|
<a class="item" href="#">Contact Us</a>
|
|
<a class="item" href="#">Terms and Conditions</a>
|
|
<a class="item" href="#">Privacy Policy</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="ui basic modal">
|
|
<div class="ui icon header">
|
|
</div>
|
|
<div class="content">
|
|
<p>Here is the message text!</p>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui red basic cancel inverted button">
|
|
<i class="remove icon"></i>
|
|
No
|
|
</div>
|
|
<div class="ui green ok inverted button">
|
|
<i class="checkmark icon"></i>
|
|
Yes
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="ui daemon-screenshot modal">
|
|
<div class="ui icon header">
|
|
</div>
|
|
<div class="content">
|
|
<img src="GetScreenshot" class="ui fluid image">
|
|
<div class="ui fluid action input">
|
|
<input class="openrpa-controller-cmd-run-input" type="text" placeholder="CMD Code...">
|
|
<div class="ui button" onclick="mGlobal.Controller.CMDRun();">Run!</div>
|
|
<div class="ui button" onclick="mGlobal.Controller.CMDRunGUILogout();">GUI Logout</div>
|
|
</div>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui green ok inverted button" onclick="mGlobal.Monitor.ScreenshotModal.Close()">
|
|
<i class="checkmark icon"></i>
|
|
Close
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ui modal openrpa-code-list-gui-import-modal">
|
|
<i class="close icon"></i>
|
|
<div class="header">
|
|
Code list import
|
|
</div>
|
|
<div class="content">
|
|
<div class="description">
|
|
<div class="ui header">Insert your JSON specification here.</div>
|
|
<p><textarea style="width:100%" rows="6" cols="60"></textarea></p>
|
|
</div>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui black deny button">
|
|
Cancel
|
|
</div>
|
|
<div class="ui positive right labeled icon button" onclick="mGlobal.CodeList.fActionSpecificationImportFromJSON();">
|
|
Parse
|
|
<i class="checkmark icon"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
|