2016-07-05 18:06:22 +00:00
<!doctype html>
< html class = "no-js" lang = "" >
2017-04-08 04:05:20 +00:00
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" >
2019-10-04 01:56:01 +00:00
< title > NodeODM - Web UI< / title >
2017-04-08 04:05:20 +00:00
< meta name = "description" content = "" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< link rel = "stylesheet" href = "css/bootstrap.min.css" >
< style >
2020-03-02 21:38:46 +00:00
body{
margin-top: 0;
}
#body-row{
margin-top: 16px;
2017-04-08 04:05:20 +00:00
}
2019-01-31 22:16:37 +00:00
.navbar{
background-color: #3498db;
}
a:hover, a:focus, a:active, a{
color: #3498db;
}
#images{
font-weight: bold;
}
#btnSelectFiles, #images{
display: inline-block;
}
2020-03-02 21:38:46 +00:00
.btn-success{
background-color: #4582ec;
border-color: #4582ec;
}
.btn-success:hover, .btn-success:active, .btn-success:focus, .btn-success:active:hover,
.btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus{
background-color: #3d74d4;
border-color: #4582ec;
}
2021-05-23 16:33:09 +00:00
.task{
background: white;
}
2017-04-08 04:05:20 +00:00
< / style >
2020-12-07 14:13:04 +00:00
< link rel = "stylesheet" href = "css/main.css?t=1" >
2017-04-08 04:05:20 +00:00
< script src = "js/vendor/modernizr-2.8.3.min.js" > < / script >
< / head >
< body >
<!-- [if lt IE 8]>
2016-07-05 18:06:22 +00:00
< p class = "browserupgrade" > You are using an < strong > outdated< / strong > browser. Please < a href = "http://browsehappy.com/" > upgrade your browser< / a > to improve your experience.< / p >
<![endif]-->
2020-03-02 21:38:46 +00:00
< div class = "container-fluid" >
< div class = "row" id = "body-row" >
< div class = "col-xs-12 col-sm-4" >
2017-04-08 04:05:20 +00:00
< form enctype = "multipart/form-data" onsubmit = "return false;" >
2019-01-31 22:16:37 +00:00
< div id = "app" >
< div id = "imagesInput" class = "form-group" data-bind = "visible: mode() === 'file'" >
< div id = "images" > Images and GCP File (optional):< / div > < button id = "btnSelectFiles" class = "btn btn-default btn-sm" data-bind = "attr: {disabled: uploading()}" > Add Files...< / button >
2019-02-01 18:04:09 +00:00
< div data-bind = "visible: filesCount() && !uploading()" > Selected files: < span data-bind = "text: filesCount()" > < / span > < / div >
< div data-bind = "visible: uploading()" class = "progress" style = "margin-top: 12px;" >
< div class = "progress-bar progress-bar-success" role = "progressbar" data-bind = "text: uploadedFiles() + ' / ' + filesCount() + ' files', style: {width: uploadedPercentage()}" >
< / div >
< / div >
< div data-bind = "visible: uploading()" style = "min-height: 230px;" >
< div data-bind = "foreach: fileUploadStatus.items" >
< div class = "progress" >
< div class = "progress-bar progress-bar-info" role = "progressbar" data-bind = "text: key() + ': ' + parseInt(value()) + '%', style: {width: value() + '%'}" > < / div >
< / div >
< / div >
< / div >
2019-01-31 22:16:37 +00:00
< / div >
< div id = "zipFileInput" class = "form-group" data-bind = "visible: mode() === 'url'" >
< label for = "zipurl" > URL to zip file with Images and GCP File (optional):< / label > < input id = "zipurl" name = "zipurl" class = "form-control" type = "text" data-bind = "attr: {disabled: uploading()}" >
2019-02-01 18:04:09 +00:00
< div data-bind = "visible: uploading()" >
Uploading...
< / div >
2019-01-31 22:16:37 +00:00
< / div >
< div id = "errorBlock" data-bind = "visible: error().length > 0, click: dismissError" > ⚠️ < span data-bind = "text: error" > < / span > < / div >
< hr / >
< div class = "text-right" >
2019-06-05 15:45:53 +00:00
<!-- <input type="button" class="btn btn - info" data - bind="visible: mode() === 'file', click: toggleMode" value="Switch to URL" />
2019-01-31 22:16:37 +00:00
< input type = "button" class = "btn btn-info" data-bind = "visible: mode() === 'url', click: toggleMode" value = "Switch to File Upload" / >
2019-06-05 15:45:53 +00:00
-->
2019-01-31 22:16:37 +00:00
< input type = "submit" class = "btn btn-success" data-bind = "attr: {disabled: uploading()}, value: uploading() ? 'Uploading...' : 'Start Task', click: startTask" / >
< / div >
2017-04-08 04:05:20 +00:00
< / div >
< div id = "options" >
< div class = "form-inline form-group form-horizontal" >
< div data-bind = "visible: error(), text: error()" class = "alert alert-warning" role = "alert" > < / div >
< button style = "position: relative; top: -45px;" type = "submit" class = "btn btn-default" data-bind = "visible: !error(), click: function(){ showOptions(!showOptions()); }, text: (showOptions() ? 'Hide' : 'Show') + ' Options'" > < / button >
< div data-bind = "visible: showOptions()" >
2019-01-04 16:36:14 +00:00
< div >
2019-10-04 01:56:01 +00:00
< label for = "taskName" > Project Name:< / lable >
< br / >
< input type = "text" class = "form-control" value = "" id = "taskName" / >
< button type = "submit" class = "btn glyphicon glyphicon-info-sign btn-info" data-toggle = "tooltip" data-placement = "top" title = "Assign a name to the project." > < / button >
< button id = "resetTaskName" type = "submit" class = "btn glyphicon glyphicon glyphicon-repeat btn-default" data-toggle = "tooltip" data-placement = "top" title = "Reset to default" > < / button >
< br / > < br / >
2019-01-04 16:36:14 +00:00
< label for = "doPostProcessing" > generate 2D and potree point cloud tiles:< / label >
< br / >
2019-10-04 01:56:01 +00:00
2019-01-04 16:36:14 +00:00
< div class = "checkbox" >
< label >
< input type = "checkbox" id = "doPostProcessing" > Enable
< / label >
< / div >
< button type = "submit" class = "btn glyphicon glyphicon-info-sign btn-info" data-toggle = "tooltip" data-placement = "top" title = "Generate 2D and Potree Point Cloud Tiles" > < / button >
< button id = "resetDoPostProcessing" type = "submit" class = "btn glyphicon glyphicon glyphicon-repeat btn-default" data-toggle = "tooltip" data-placement = "top" title = "Reset to default" > < / button >
< br / > < br / >
2019-10-04 01:56:01 +00:00
2019-01-04 16:36:14 +00:00
< / div >
2018-11-13 17:04:50 +00:00
< div >
2017-04-12 03:55:52 +00:00
< label for = "webhook" > webhook callback url (optional):< / label >
< br / >
< input id = "webhook" name = "webhook" class = "form-control" type = "text" >
2019-01-04 16:36:14 +00:00
< button type = "submit" class = "btn glyphicon glyphicon-info-sign btn-info" data-toggle = "tooltip" data-placement = "top" title = "Optional webhook" > < / button >
2017-04-12 03:55:52 +00:00
< button id = "resetWebhook" type = "submit" class = "btn glyphicon glyphicon glyphicon-repeat btn-default" data-toggle = "tooltip" data-placement = "top" title = "Reset to default" > < / button >
2018-11-13 17:04:50 +00:00
< br / > < br / >
2017-04-12 03:55:52 +00:00
< / div >
2017-04-08 04:05:20 +00:00
< div data-bind = "foreach: options" >
< label data-bind = "text: properties.name + (properties.domain ? ' (' + properties.domain + ')' : '')" > < / label > < br / >
2020-12-07 14:13:04 +00:00
<!-- ko if: properties.type !== 'bool' && properties.type !== 'enum' -->
2017-04-08 04:05:20 +00:00
< input type = "text" class = "form-control" data-bind = "attr: {placeholder: properties.value}, value: value" >
<!-- /ko -->
<!-- ko if: properties.type === 'bool' -->
< div class = "checkbox" >
< label >
2018-11-13 17:04:50 +00:00
< input type = "checkbox" data-bind = "checked: value" > Enable
< / label >
2017-04-08 04:05:20 +00:00
< / div >
<!-- /ko -->
2020-12-07 14:13:04 +00:00
<!-- ko if: properties.type === 'enum' -->
< div class = "selectBox" >
< label >
< select class = "form-control" data-bind = "options: properties.domain, value: value" > < / select >
< / label >
< / div >
<!-- /ko -->
2017-04-08 04:05:20 +00:00
< button type = "submit" class = "btn glyphicon glyphicon-info-sign btn-info" data-toggle = "tooltip" data-placement = "top" data-bind = "attr: {title: properties.help}" > < / button >
< button type = "submit" class = "btn glyphicon glyphicon glyphicon-repeat btn-default" data-toggle = "tooltip" data-placement = "top" title = "Reset to default" data-bind = "click: resetToDefault" > < / button >
2016-07-05 18:06:22 +00:00
2017-04-08 04:05:20 +00:00
< br / > < br / >
< / div >
< / div >
< / div >
< / div >
< / form >
2016-07-26 19:20:37 +00:00
< / div >
2020-03-02 21:38:46 +00:00
< div class = "col-xs-12 col-sm-8" id = "taskList" >
2020-01-19 21:37:54 +00:00
< div data-bind = "visible: error() != ''" >
< div class = "alert alert-warning" role = "alert" data-bind = "text: error()" > < / div >
< / div >
< div data-bind = "visible: loading()" >
Loading task list... < span class = "glyphicon glyphicon-refresh spinning" > < / span >
< / div >
< p data-bind = "visible: !loading() && tasks().length === 0" > No running tasks.< / p >
2017-04-08 04:05:20 +00:00
< div data-bind = "foreach: tasks" >
< div class = "task" data-bind = "css: {pulsePositive: info().status && info().status.code === 40, pulseNegative: info().status && info().status.code === 30}" >
< p data-bind = "visible: loading()" > Retrieving < span data-bind = "text: uuid" > < / span > ... < span class = "glyphicon glyphicon-refresh spinning" > < / span > < / p >
< div data-bind = "visible: !loading() && !info().error" >
< div class = "taskItem" > < strong > UUID:< / strong >
2018-12-03 02:39:11 +00:00
< a data-bind = "text: info().uuid, click: openInfo" href = "#" > < / a >
2017-04-08 04:05:20 +00:00
< / div >
< div class = "taskItem" > < strong > Name:< / strong > < span data-bind = "text: info().name" > < / span > < / div >
< div class = "taskItem" > < strong > Images:< / strong > < span data-bind = "text: info().imagesCount" > < / span > < / div >
< div class = "taskItem" > < strong > Status:< / strong > < span data-bind = "text: statusDescr()" > < / span > < / div >
< div class = "taskItem" > < strong > Time Elapsed:< / strong > < span data-bind = "text: timeElapsed()" > < / span > < / div >
2019-02-20 20:50:17 +00:00
< div class = "taskItem" > < strong > Console Output:< / strong > < a href = "javascript:void(0);" data-bind = "click: viewOutput, visible: !viewingOutput()" > View< / a > < a href = "javascript:void(0);" data-bind = "click: hideOutput, visible: viewingOutput()" > Hide< / a > | < a href = "#" data-bind = "click: downloadOutput" > Export< / a > < / a > < / div >
< textarea class = "consoleOutput" data-bind = "value: output().join('\n'), visible: viewingOutput(), event: {mouseover: consoleMouseOver, mouseout: consoleMouseOut}, attr: {id: 'console_' + uuid}" > < / textarea >
2019-02-13 18:31:18 +00:00
< div data-bind = "visible: showDownload()" style = "float: left; margin-top: 6px; padding-top: 6px; border-top: 1px solid #eee;" >
2019-06-05 15:45:53 +00:00
< div class = "taskItem" > < strong > Download: < / strong > < a data-bind = "attr: {'href': downloadLink()}" > All Assets< / a > < / div >
2019-02-13 18:31:18 +00:00
< / div >
2017-04-08 04:05:20 +00:00
< span data-bind = "css: 'statusIcon glyphicon ' + icon()" > < / span >
2019-05-19 20:58:45 +00:00
< div data-bind = "visible: info().status && info().status.code === 20" class = "progress" style = "margin-top: 12px;" >
< div class = "progress-bar progress-bar-info" role = "progressbar" data-bind = "text: parseInt(info().progress) + '%', style: {width: info().progress + '%'}" > < / div >
< / div >
2017-04-08 04:05:20 +00:00
< div class = "actionButtons" >
< button data-bind = "click: cancel, visible: showCancel()" type = "button" class = "btn btn-primary btn-sm" >
2019-02-13 18:31:18 +00:00
< span class = "glyphicon glyphicon-remove-circle" > < / span > Cancel
< / button >
2016-07-07 22:07:17 +00:00
2017-04-08 04:05:20 +00:00
< button data-bind = "click: restart, visible: showRestart()" type = "button" class = "btn btn-primary btn-sm" >
2019-02-13 18:31:18 +00:00
< span class = "glyphicon glyphicon-play" > < / span > Restart
< / button >
2016-07-14 21:42:12 +00:00
2017-04-08 04:05:20 +00:00
< button data-bind = "click: remove, visible: showRemove()" type = "button" class = "btn btn-primary btn-sm" >
2019-02-13 18:31:18 +00:00
< span class = "glyphicon glyphicon-remove-circle" > < / span > Remove
< / button >
2017-04-08 04:05:20 +00:00
< / div >
< / div >
<!-- Error messages -->
< div data-bind = "visible: info().error !== undefined" >
< div class = "alert alert-warning" role = "alert" data-bind = "text: info().error" > < / div >
< div class = "actionButtons" >
< button data-bind = "click: remove" type = "button" class = "btn btn-primary btn-sm" >
2019-02-13 18:31:18 +00:00
< span class = "glyphicon glyphicon-remove-circle" > < / span > Remove
< / button >
2017-04-08 04:05:20 +00:00
< / div >
< / div >
< / div >
2016-07-06 18:44:20 +00:00
< / div >
< / div >
2016-07-05 18:06:22 +00:00
< / div >
2017-04-08 04:05:20 +00:00
< / div >
<!-- /container -->
< script src = "//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js" > < / script >
< script >
window.jQuery || document.write('< script src = "js/vendor/jquery-1.11.2.min.js" > < \ / s c r i p t > ' )
< / script >
< script src = "js/vendor/bootstrap.min.js" > < / script >
< script src = "js/vendor/knockout-3.4.0.js" > < / script >
2019-02-01 18:04:09 +00:00
< script src = "js/vendor/ko.observableDictionary.js" > < / script >
2019-01-31 22:16:37 +00:00
< script src = "js/dropzone.js" type = "text/javascript" > < / script >
2020-01-19 21:37:54 +00:00
< script src = "js/main.js?t=2" > < / script >
2017-04-08 04:05:20 +00:00
< / body >
2018-10-25 17:18:13 +00:00
< / html >