569 lines
22 KiB
HTML
569 lines
22 KiB
HTML
<!doctype html>
|
|
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
|
|
<title>MiLight Hub</title>
|
|
|
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" title="main"/>
|
|
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet"/>
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.0/css/bootstrap-slider.min.css" rel="stylesheet"/>
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css" rel="stylesheet"/>
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/css/bootstrap-select.min.css" rel="stylesheet"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<!--[if lt IE 9]>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.js"></script>
|
|
<![endif]-->
|
|
<link href="css/style.css" rel="stylesheet" />
|
|
<link href="data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA/38NABD+CwD/jQsA9pUOABRu/wD/HQwA+gPrAP4MbAAZ8f8ACxb9AP4GkwCW/AoADYj+AP59CQD7FAkAC//nAJYK/QAQ/w4Acgv/AP71CwCSDP8A+AkYAP7rBAAN/+0A/xEcAP1rCwAM/okADf+HAI/7CgAL/5sADP95AA0U/wD4/gsADXr+ABAO/gDlC/8A+v0NAA3/EwB4Ef8A8wr7AP0IeAAN7P4Abf8LAAuJ/wCVDv8A+hcGACH+DgBz/wsA+g7/ABT+ZQAMCv0Aagn/AJT/DQD+EPsADP7sAOf/DAD/Dx0A/g2AAB4N/gB0/gwADZz/ABLu/wAM/BYA+wqMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkYAAAAAAAAAAAAAAUsAAA+NwAAGzIAAAAAAAAAIj0AKhAAHh8AAAAAAAoAAAANAAAAABwAAAA/AAAzIAAAAAAAAAAAAAAmAgAAADsjAAAAAAAAAAASLwAAAAAAAAAAAAAAAAAAAAAAABMnNAAAAAAAAAAAAAArMDwVLREAAAAAAAAAAAAADDUdAAAAAAAAAAAAAAAAAAAAAAAAJDEAAAAAAAAAACU4AAAAKDYAAAAAAAAAAAAAFCEAAAcAAAA6AAAAAAEAAAAXAAAAAABACAAWLgAaAwAAAAAAAAALKQAAOQYAAA4EAAAAAAAAAAAAABkPAAAAAAAAAP5/AADmZwAA8k8AALvdAACf+QAAz/MAAP//AAAf+AAAH/gAAP//AADP8wAAn/kAALvdAADyTwAA5mcAAP5/AAA=" rel="icon" type="image/x-icon" />
|
|
</head>
|
|
|
|
<body>
|
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
|
|
<script src="js/theme-select.js" lang="text/javascript"></script>
|
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
|
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.0/bootstrap-slider.min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/js/bootstrap-select.min.js"></script>
|
|
|
|
<script src="js/rgb2hsv.js" lang="text/javascript"></script>
|
|
<script src="js/script.js" lang="text/javascript"></script>
|
|
|
|
<nav class="navbar navbar-inverse">
|
|
<div class="container">
|
|
<div class="navbar-header">
|
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
|
<span class="sr-only">Toggle navigation</span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
<a class="navbar-brand" href="/">MiLight Hub</a>
|
|
</div>
|
|
<div class="collapse navbar-collapse">
|
|
<ul class="nav navbar-nav">
|
|
<li><a href="#settings" data-toggle="modal" data-target="#settings-modal">Settings</a></li>
|
|
<li>
|
|
<a href="#sniff" id="sniff">
|
|
<i class="glyphicon glyphicon-play"></i>
|
|
<span>Start Sniffing</span>
|
|
</a>
|
|
</li>
|
|
<li class="dropdown">
|
|
<a href="#admin" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Admin <span class="caret"></span></a>
|
|
<ul class="dropdown-menu">
|
|
<li><a href="#admin-actions" data-toggle="modal" data-target="#admin-actions-modal">Actions</a></li>
|
|
<li role="separator" class="divider"></li>
|
|
<li><a href="#check-updates" id="updates-btn" data-toggle="modal" data-target="#updates-modal">Check for Updates</a></li>
|
|
<li><a href="#updates" data-toggle="modal" data-target="#update-firmware-modal">Update Firmware</a></li>
|
|
<li><a href="#backup" data-toggle="modal" data-target="#backup-settings-modal">Backup</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="dropdown" id="theme-dropdown">
|
|
<a id="theme-label" href="#" class="dropdown-toggle" data-toggle="dropdown">Theme<b class="caret"></b></a>
|
|
<ul id="theme-list" class="dropdown-menu">
|
|
<li><a href="#" class="change-style-menu-item">Bootstrap (Default)</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<div class="container" id="content">
|
|
<div class="row" id="device-id-aliases-row">
|
|
<div class="col-sm-3">
|
|
<label for="deviceAliases" id="device-id-aliases">
|
|
Device Name
|
|
</label>
|
|
<select id="deviceAliases" placeholder="Create alias...">
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div></div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-3">
|
|
<label for="deviceId" id="device-id-label">
|
|
Device Id
|
|
<span class="error-info"></span>
|
|
</label>
|
|
<select id="deviceId" placeholder="Enter hub ID">
|
|
</select>
|
|
</div>
|
|
|
|
<div class="col-sm-4">
|
|
<div class="mode-option" id="group-option" data-for="cct,rgbw,rgb_cct,fut089,fut091">
|
|
<label for="groupId">Group</label>
|
|
|
|
<div class="btn-group" id="groupId" data-toggle="buttons">
|
|
<label class="btn btn-default active">
|
|
<input type="radio" name="options" autocomplete="off" data-value="1" checked> 1
|
|
</label>
|
|
<label class="btn btn-default">
|
|
<input type="radio" name="options" autocomplete="off" data-value="2"> 2
|
|
</label>
|
|
<label class="btn btn-default">
|
|
<input type="radio" name="options" autocomplete="off" data-value="3"> 3
|
|
</label>
|
|
<label class="btn btn-default">
|
|
<input type="radio" name="options" autocomplete="off" data-value="4"> 4
|
|
</label>
|
|
<label class="btn btn-default mode-option" data-for="fut089">
|
|
<input type="radio" name="options" autocomplete="off" data-value="5"> 5
|
|
</label>
|
|
<label class="btn btn-default mode-option" data-for="fut089">
|
|
<input type="radio" name="options" autocomplete="off" data-value="6"> 6
|
|
</label>
|
|
<label class="btn btn-default mode-option" data-for="fut089">
|
|
<input type="radio" name="options" autocomplete="off" data-value="7"> 7
|
|
</label>
|
|
<label class="btn btn-default mode-option" data-for="fut089">
|
|
<input type="radio" name="options" autocomplete="off" data-value="8"> 8
|
|
</label>
|
|
<label class="btn btn-default">
|
|
<input type="radio" name="options" autocomplete="off" data-value="0"> All
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-sm-4">
|
|
<label for="mode">Remote Type</label>
|
|
<div class="dropdown">
|
|
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
|
|
<label>Mode</label>
|
|
<span class="caret"></span>
|
|
</button>
|
|
<ul class="dropdown-menu" id="mode">
|
|
<li data-value="rgbw">
|
|
<a href="#">RGBW</a>
|
|
</li>
|
|
<li data-value="cct">
|
|
<a href="#">CCT</a>
|
|
</li>
|
|
<li data-value="rgb_cct" class="active">
|
|
<a href="#">RGB+CCT</a>
|
|
</li>
|
|
<li data-value="rgb">
|
|
<a href="#">RGB</a>
|
|
</li>
|
|
<li data-value="fut089">
|
|
<a href="#">FUT089 / B8</a>
|
|
</li>
|
|
<li data-value="fut091">
|
|
<a href="#">FUT091 / B2</a>
|
|
</li>
|
|
<li data-value="fut020">
|
|
<a href="#">FUT020</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row"><div class="col-sm-12">
|
|
<div class="mode-option" data-for="rgbw,rgb_cct,rgb,fut089,fut020">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<h5>Hue</h5>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<span class="hue-picker">
|
|
<span class="hue-picker-inner"></span>
|
|
<span class="hue-value-display"></span>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div></div>
|
|
|
|
<div class="mode-option" data-for="rgb_cct,fut089">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<h5>Saturation</h5>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<input class="slider raw-update" name="saturation"
|
|
data-slider-min="0"
|
|
data-slider-max="100"
|
|
data-slider-value="100"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mode-option" data-for="cct,rgb_cct,fut089,fut091">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<h5>Color Temperature</h5>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<div class="white-temp-picker">
|
|
<input class="slider raw-update" name="temperature"
|
|
data-slider-min="0"
|
|
data-slider-max="100"
|
|
data-slider-value="100"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<h5>Brightness</h5>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<input class="slider raw-update" name="level"
|
|
data-slider-min="0"
|
|
data-slider-max="100"
|
|
data-slider-value="100"
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<h5>Commands</h5>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<ul class="command-buttons">
|
|
<li>
|
|
<input type="checkbox" name="status" class="raw-update" data-toggle="toggle" checked/>
|
|
</li>
|
|
<div class="mode-option inline" data-for="rgbw,rgb_cct,fut089,fut020">
|
|
<li>
|
|
<button type="button" class="btn btn-default command-btn" data-command="set_white">White</button>
|
|
</li>
|
|
</div>
|
|
<li>
|
|
<button type="button" id="btnHeight" class="btn btn-info command-btn" data-command="night_mode">Night</button>
|
|
</li>
|
|
<li>
|
|
<button type="button" class="btn btn-success command-btn" data-command="pair">
|
|
<i class="glyphicon glyphicon-plus"></i>
|
|
Pair
|
|
</button>
|
|
</li>
|
|
<li>
|
|
<button type="button" class="btn btn-danger command-btn" data-command="unpair">
|
|
<i class="glyphicon glyphicon-remove"></i>
|
|
Unpair
|
|
</button>
|
|
</li>
|
|
</ul>
|
|
<p></p>
|
|
<ul class="command-buttons">
|
|
<div class="mode-option inline" data-for="rgb,fut020">
|
|
<li>
|
|
<div class="plus-minus-group">
|
|
<button type="button" class="btn btn-default btn-number command-btn" data-command="previous_mode">
|
|
<span class="glyphicon glyphicon-minus"></span>
|
|
</button>
|
|
<span class="title">Mode</span>
|
|
<button type="button" class="btn btn-default btn-number command-btn clearfix" data-command="next_mode">
|
|
<span class="glyphicon glyphicon-plus"></span>
|
|
</button>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
</li>
|
|
</div>
|
|
<div class="mode-option inline" data-for="rgbw,rgb_cct,fut089">
|
|
<li>
|
|
<div class="dropdown">
|
|
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
|
|
Mode
|
|
<span class="caret"></span>
|
|
</button>
|
|
<ul class="dropdown-menu mode-dropdown">
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
</div>
|
|
<div class="mode-option inline" data-for="rgb,rgbw,rgb_cct,fut089">
|
|
<li>
|
|
<div class="plus-minus-group">
|
|
<button type="button" class="btn btn-default btn-number command-btn" data-command="mode_speed_down">
|
|
<span class="glyphicon glyphicon-minus"></span>
|
|
</button>
|
|
<span class="title">Speed</span>
|
|
<button type="button" class="btn btn-default btn-number command-btn" data-command="mode_speed_up">
|
|
<span class="glyphicon glyphicon-plus"></span>
|
|
</button>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
</li>
|
|
</div>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- The content of this modal is dynamically injected into the settings modal -->
|
|
<div id="gateway-servers-modal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog">
|
|
<!-- Modal content-->
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
<h2 class="modal-title">Gateway Servers</h2>
|
|
</div>
|
|
<div class="modal-body">
|
|
|
|
<div class="row">
|
|
<div class="col col-sm-12">
|
|
<form id="gateway-server-form">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Device ID</th>
|
|
<th>UDP Port</th>
|
|
<th>Protocol Version</th>
|
|
<th>
|
|
<a class="btn btn-success gateway-add-btn" id="add-server-btn">
|
|
<i class="glyphicon glyphicon-plus"></i>
|
|
</a>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="gateway-server-configs">
|
|
</tbody>
|
|
</table>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div> </div>
|
|
|
|
<div id="settings-modal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog">
|
|
<!-- Modal content-->
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
<h2 class="modal-title">Settings</h2>
|
|
</div>
|
|
<div class="modal-body">
|
|
|
|
<div> </div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<form action="#" id="settings">
|
|
<input type="submit" class="btn btn-success" value="Submit" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="alert alert-warning alert-block" id="traffic-sniff">
|
|
<button type="button" class="close" id="traffic-sniff-close">×</button>
|
|
<h4>Traffic sniffed (sent and received)</h4>
|
|
<div id="sniffed-traffic"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="update-firmware-modal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog">
|
|
<!-- Modal content-->
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
<h2 class="modal-title">Update Firmware</h2>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="alert alert-warning">
|
|
<p>
|
|
<b>
|
|
Always take a
|
|
<a href="/settings" download="settings.json">backup of your settings</a>
|
|
before upgrading.
|
|
</b>
|
|
Sometimes upgrades change flash offsets, which can corrupt the filesystem. If this happens, clear
|
|
flash, re-upload the firmware, and restore the backup of your settings.
|
|
</p>
|
|
</div>
|
|
<div class="alert alert-warning">
|
|
<p>
|
|
Download firmware binaries from the
|
|
<a href="https://github.com/sidoh/esp8266_milight_hub/releases">GitHub releases page</a>.
|
|
Check for a new version by clicking on the "Check for Updates" button.
|
|
</p>
|
|
|
|
<p>
|
|
<b>Make sure the binary you're uploading was compiled for your board!</b>
|
|
Firmware with incompatible settings could prevent boots. If this happens,
|
|
reflash the board with USB.
|
|
</p>
|
|
</div>
|
|
<form action="/firmware" method="post" enctype="multipart/form-data">
|
|
<div class="input-group">
|
|
<label class="input-group-btn">
|
|
<span class="btn btn-primary">
|
|
Browse
|
|
<input type="file" name="file" accept=".bin" style="display: none;">
|
|
</span>
|
|
</label>
|
|
|
|
<input type="text" class="form-control" readonly="">
|
|
|
|
<label class="input-group-btn">
|
|
<span class="btn btn-success">
|
|
Upload Firmware
|
|
<input type="submit" style="display: none;">
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="updates-modal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog">
|
|
<!-- Modal content-->
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
<h2 class="modal-title">Update</h2>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div id="version-summary"></div>
|
|
|
|
<hr />
|
|
|
|
<h4>Current Version</h4>
|
|
<div id="current-version"></div>
|
|
|
|
<div id="latest-version">
|
|
<h4>Latest Version</h4>
|
|
|
|
<div class="status"></div>
|
|
<div id="latest-version-info">
|
|
<label>Version</label>
|
|
<div class="info-key" data-key="tag_name"></div>
|
|
|
|
<label>Release Date</label>
|
|
<div class="info-key" data-key="published_at"></div>
|
|
|
|
<label>Release Notes</label>
|
|
<pre class="info-key" data-key="body"></pre>
|
|
|
|
<div>
|
|
<a class="info-key" data-prop="href" data-key="html_url">View on GitHub</a>
|
|
</div>
|
|
|
|
<div>
|
|
<a class="info-key" id="firmware-link">Download Firmware</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="backup-settings-modal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog">
|
|
<!-- Modal content-->
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
<h2 class="modal-title">Backup & Restore Settings</h2>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div>
|
|
<h3 class="section-title">Backup Settings</h3>
|
|
<a href="/settings" download="settings.json" class="btn btn-primary">Backup Settings</a>
|
|
</div>
|
|
|
|
<div>
|
|
<h3 class="section-title">Restore Settings</h3>
|
|
<form action="/settings" method="post" enctype="multipart/form-data">
|
|
<div class="input-group">
|
|
<label class="input-group-btn">
|
|
<span class="btn btn-primary">
|
|
Browse
|
|
<input type="file" name="file" accept=".json" style="display: none;">
|
|
</span>
|
|
</label>
|
|
|
|
<input type="text" class="form-control" readonly="">
|
|
|
|
<label class="input-group-btn">
|
|
<span class="btn btn-success">
|
|
Upload
|
|
<input type="submit" style="display: none;">
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="admin-actions-modal" class="modal fade" role="dialog">
|
|
<div class="modal-dialog">
|
|
<!-- Modal content-->
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
<h2 class="modal-title">Admin Actions</h2>
|
|
</div>
|
|
<div class="modal-body">
|
|
<ul class="action-buttons">
|
|
<li>
|
|
<button class="btn btn-danger btn-sm system-btn" data-command="restart">Restart</button>
|
|
</li>
|
|
<li>
|
|
<button class="btn btn-danger btn-sm system-btn" data-command="clear_wifi_config">Clear Wifi Config</button>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|