mirror of
https://github.com/unraid/webgui.git
synced 2026-01-25 02:58:58 -06:00
Merge pull request #430 from bergware/master
Dashboard: more updates and corrections
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
Menu="Dashboard:2"
|
||||
Title="UPS Summary"
|
||||
Tag="icon-ups"
|
||||
Menu="Dashboard:1"
|
||||
Cond="file_exists('/var/run/apcupsd.pid')"
|
||||
---
|
||||
<?PHP
|
||||
@@ -29,7 +27,7 @@ function getUPSstatus() {
|
||||
}
|
||||
$(getUPSstatus);
|
||||
</script>
|
||||
<table class="tablesorter shift ups">
|
||||
<table class="tablesorter ups">
|
||||
<thead><tr><th>UPS Status</th><th>Battery Charge</th><th>Runtime Left</th><th>Nominal Power</th><th>UPS Load</th><th>UPS Load %</th></tr></thead>
|
||||
<tbody id="ups_summary"><tr><td colspan="6"> </td></tr></tbody>
|
||||
</table>
|
||||
|
||||
@@ -26,30 +26,22 @@ $cpus = cpu_list();
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.ui.css')?>">
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.switchbutton.css')?>">
|
||||
<style>
|
||||
table#docker_containers{text-align:left}
|
||||
.basic{display:block}
|
||||
.advanced{display:none;white-space:nowrap}
|
||||
body{-webkit-overflow-scrolling:touch}
|
||||
img.started{opacity:1.0}
|
||||
img.stopped{opacity:0.3}
|
||||
img.paused{opacity:0.6}
|
||||
.log{cursor:zoom-in}
|
||||
.exec{cursor:pointer}
|
||||
.iconstatus{position:absolute;z-index:2;bottom:-4px;right:-4px;font-size:1.4rem;text-shadow:0 0 2px #FFF}
|
||||
.started{color:#009900}
|
||||
.stopped{color:#EF3D47}
|
||||
.paused{color:#F0DD33}
|
||||
.switch-button-label.off{color:inherit}
|
||||
tbody>tr.sortable:hover{cursor:move}
|
||||
table#docker_containers{text-align:left}
|
||||
th.five{width:5%}
|
||||
th.eight{width:8%}
|
||||
th.nine{width:9%}
|
||||
th.load{width:100px}
|
||||
tbody > tr.sortable:hover{cursor:move}
|
||||
input.wait{width:24px;margin:0 4px;padding:0 5px;border:none;box-shadow:none;background-color:transparent}
|
||||
table tbody td{line-height:normal}
|
||||
</style>
|
||||
<div id="iframe-popup" style="display:none;-webkit-overflow-scrolling:touch;"></div>
|
||||
<span class="status" style="margin-top:<?=$width?>px"><span><input type="checkbox" class="advancedview"></span></span>
|
||||
<table id="docker_containers" class="tablesorter shift">
|
||||
<thead><tr><th><a href="#" style="cursor:hand;margin-left:12px" onclick="resetSorting()" title="Reset sorting"><i class="fa fa-th-list"></i></a></th><th>Application</th><th>Version</th><th>Network</th><th>Port Mappings <small>(App to Host)</small></th><th>Volume Mappings <small>(App to Host)</small></th><th class="load advanced">CPU load</th><th class="load advanced">Memory load</th><th class="eight">Autostart</th><th class="five">Log</th></tr></thead>
|
||||
<thead><tr><th><a href="#" style="cursor:hand;margin-left:12px;display:inline-block;width:32px" onclick="resetSorting()" title="Reset sorting"><i class="fa fa-th-list"></i></a>Name</th><th>Version</th><th>Network</th><th>Port Mappings <small>(App to Host)</small></th><th>Volume Mappings <small>(App to Host)</small></th><th class="load advanced">CPU load</th><th class="load advanced">Memory load</th><th class="nine">Autostart</th><th class="five">Log</th></tr></thead>
|
||||
<tbody id="docker_list"><tr><td class="advanced"></td><td colspan='8'><div class="spinner"></div></td><td class="advanced"></td></tr></tbody>
|
||||
</table>
|
||||
<input type="button" onclick="addContainer()" value="Add Container" style="display:none">
|
||||
@@ -89,8 +81,10 @@ function resetSorting() {
|
||||
function listview() {
|
||||
var more = $.cookie('docker_listview_mode')=='advanced';
|
||||
if (more) {
|
||||
$.post('/plugins/dynamix.docker.manager/include/UpdateConfig.php',{action:'docker_load_start'});
|
||||
$('.docker_readmore').readmore('destroy');
|
||||
} else {
|
||||
$.post('/plugins/dynamix.docker.manager/include/UpdateConfig.php',{action:'docker_load_stop'});
|
||||
$('.docker_readmore').readmore({maxHeight:32,moreLink:"<a href='#' style='text-align:center'><i class='fa fa-chevron-down'></i></a>",lessLink:"<a href='#' style='text-align:center'><i class='fa fa-chevron-up'></i></a>"});
|
||||
}
|
||||
$('input.autostart').each(function(){
|
||||
@@ -112,7 +106,7 @@ function loadlist() {
|
||||
$('#docker_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',opacity:0.4,update:function(e,i){
|
||||
var row = $('#docker_list').find('tr:first');
|
||||
var names = ''; var index = '';
|
||||
row.parent().children().find('td.ct-name').each(function(){names+=$(this).text().replace(/Container ID.*$/,'')+';';index+=$(this).parent().parent().children().index($(this).parent())+';';});
|
||||
row.parent().children().find('td.ct-name').each(function(){names+=$(this).find('.appname').text()+';';index+=$(this).parent().parent().children().index($(this).parent())+';';});
|
||||
$.post('/plugins/dynamix.docker.manager/include/UserPrefs.php',{names:names,index:index});
|
||||
}});
|
||||
$('head').append('<script>'+data[1]+'<\/script>');
|
||||
@@ -154,8 +148,10 @@ watchDocker.on('message', function(data){
|
||||
var id = row.split(' ');
|
||||
var w1 = Math.round(Math.min(id[1].slice(0,-1)/<?=count($cpus)*count(preg_split('/[,-]/',$cpus[0]))?>,100)*100)/100+'%';
|
||||
var w2 = Math.round(Math.min(id[2].slice(0,-1),100)*100)/100+'%';
|
||||
$('#cpu-'+id[0]).css('width',w1).text(w1.replace('.','<?=$display['number'][0]?>'));
|
||||
$('#mem-'+id[0]).css('width',w2).text(w2.replace('.','<?=$display['number'][0]?>'));
|
||||
$('.cpu-'+id[0]).text(w1.replace('.','<?=$display['number'][0]?>'));
|
||||
$('.mem-'+id[0]).text(w2.replace('.','<?=$display['number'][0]?>'));
|
||||
$('#cpu-'+id[0]).css('width',w1);
|
||||
$('#mem-'+id[0]).css('width',w2);
|
||||
}
|
||||
});
|
||||
$(function() {
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/bash
|
||||
# daemonize the 'docker_load' script
|
||||
DAEMON="/usr/local/emhttp/plugins/dynamix.docker.manager/scripts/docker_load"
|
||||
if [[ "$(pgrep -f $DAEMON)" == "" ]]; then
|
||||
logger "Starting $(basename $DAEMON)"
|
||||
$DAEMON &>/dev/null &
|
||||
fi
|
||||
@@ -61,7 +61,10 @@ foreach ($containers as $ct) {
|
||||
$docker[] = "docker.push({name:'$name',id:'$id',state:$running,pause:$paused,update:'$updateStatus'});";
|
||||
$shape = $running ? ($paused ? 'pause' : 'play') : 'square';
|
||||
$status = $running ? ($paused ? 'paused' : 'started') : 'stopped';
|
||||
$color = $status=='started' ? 'green-text' : ($status=='paused' ? 'orange-text' : 'red-text');
|
||||
$update = $updateStatus=='false' ? 'blue-text' : '';
|
||||
$icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png';
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon' class='img'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
$wait = var_split($autostart[array_search($name,$names)],1);
|
||||
$ports = [];
|
||||
foreach ($ct['Ports'] as $port) {
|
||||
@@ -75,19 +78,16 @@ foreach ($containers as $ct) {
|
||||
list($host_path,$container_path,$access_mode) = explode(':',$mount);
|
||||
$paths[] = sprintf('%s<i class="fa fa-%s" style="margin:0 6px"></i>%s', htmlspecialchars($container_path), $access_mode=='ro'?'long-arrow-left':'arrows-h', htmlspecialchars($host_path));
|
||||
}
|
||||
echo "<tr class='sortable'><td style='width:48px;padding:4px'>";
|
||||
echo "<div id='$id' style='display:block; cursor:pointer'><div style='position:relative;width:48px;height:48px;margin:0px auto'>";
|
||||
echo "<img src='".htmlspecialchars($icon)."' class='$status' style='position:absolute;top:0;bottom:0;left:0;right:0;width:48px;height:48px'>";
|
||||
echo "<i id='load-$id' class='fa iconstatus fa-$shape $status' title='$status'></i></div></div>";
|
||||
echo "</td><td class='ct-name'>";
|
||||
echo "<tr class='sortable'><td class='ct-name' style='width:220px;padding:8px'>";
|
||||
if ($template) {
|
||||
echo "<a class='exec' onclick=\"editContainer('".addslashes(htmlspecialchars($name))."','".addslashes(htmlspecialchars($template))."')\">".htmlspecialchars($name)."</a>";
|
||||
$appname = "<a class='exec' onclick=\"editContainer('".addslashes(htmlspecialchars($name))."','".addslashes(htmlspecialchars($template))."')\">".htmlspecialchars($name)."</a>";
|
||||
} else {
|
||||
echo htmlspecialchars($name);
|
||||
$appname = htmlspecialchars($name);
|
||||
}
|
||||
echo "<div class='advanced' style='width:160px'>Container ID: $id</div>";
|
||||
if ($ct['BaseImage']) echo "<div class='advanced' style='width:160px;'><i class='fa fa-cubes' style='margin-right:5px'></i>".htmlspecialchars(${ct['BaseImage']})."</div>";
|
||||
echo "<div class='advanced'>By: ";
|
||||
echo "<span class='outer'><span id='$id' class='hand'>$image</span><span class='inner'><span class='appname $update'>$appname</span><br><i id='load-$id' class='fa fa-$shape $status $color'></i><span class='state'>$status</span></span></span>";
|
||||
echo "<span class='advanced'>Container ID: $id<br>";
|
||||
if ($ct['BaseImage']) echo "<i class='fa fa-cubes' style='margin-right:5px'></i>".htmlspecialchars(${ct['BaseImage']})."<br>";
|
||||
echo "By: ";
|
||||
$registry = $info['registry'];
|
||||
list($author,$version) = explode(':',$ct['Image']);
|
||||
if ($registry) {
|
||||
@@ -95,22 +95,23 @@ foreach ($containers as $ct) {
|
||||
} else {
|
||||
echo htmlspecialchars($author);
|
||||
}
|
||||
echo "</div></td><td class='updatecolumn'>";
|
||||
echo "</span></td><td class='updatecolumn'>";
|
||||
if ($updateStatus=='false') {
|
||||
echo "<div class='advanced'><span class='orange-text' style='white-space:nowrap;'><i class='fa fa-flash fa-fw'></i> update required</span></div>";
|
||||
echo "<a class='exec' onclick=\"updateContainer('".addslashes(htmlspecialchars($name))."');\"><span style='white-space:nowrap;'><i class='fa fa-cloud-download fa-fw'></i> update ready</span></a>";
|
||||
} elseif ($updateStatus=='true') {
|
||||
echo "<span style='color:#44B012;white-space:nowrap;'><i class='fa fa-check fa-fw'></i> up-to-date</span>";
|
||||
echo "<span class='green-text' style='white-space:nowrap;'><i class='fa fa-check fa-fw'></i> up-to-date</span>";
|
||||
echo "<div class='advanced'><a class='exec' onclick=\"updateContainer('".addslashes(htmlspecialchars($name))."');\"><span style='white-space:nowrap;'><i class='fa fa-cloud-download fa-fw'></i> force update</span></a></div>";
|
||||
} else {
|
||||
echo "<span style='color:#FF2400;white-space:nowrap;'><i class='fa fa-exclamation-triangle'></i> not available</span>";
|
||||
echo "<span class='orange-text' style='white-space:nowrap;'><i class='fa fa-warning'></i> not available</span>";
|
||||
echo "<div class='advanced'><a class='exec' onclick=\"updateContainer('".addslashes(htmlspecialchars($name))."');\"><span style='white-space:nowrap;'><i class='fa fa-cloud-download fa-fw'></i> force update</span></a></div>";
|
||||
}
|
||||
echo "<div class='advanced'><i class='fa fa-info-circle fa-fw'></i> $version</div></td>";
|
||||
echo "<td>{$ct['NetworkMode']}</td>";
|
||||
echo "<td style='white-space:nowrap'><span class='docker_readmore'>".implode('<br>',$ports)."</span></td>";
|
||||
echo "<td style='word-break:break-all'><span class='docker_readmore'>".implode('<br>',$paths)."</span></td>";
|
||||
echo "<td class='advanced'><div class='usage-disk sys load-$id'><span id='cpu-$id' style='width:0'></span></div></td>";
|
||||
echo "<td class='advanced'><div class='usage-disk sys load-$id'><span id='mem-$id' style='width:0'></span></div></td>";
|
||||
echo "<td class='advanced'><span class='cpu-$id'>0%</span><div class='usage-disk mm'><span id='cpu-$id' style='width:0'></span></div></td>";
|
||||
echo "<td class='advanced'><span class='mem-$id'>0%</span><div class='usage-disk mm'><span id='mem-$id' style='width:0'></span></div></td>";
|
||||
echo "<td><input type='checkbox' id='$id-auto' class='autostart' container='".htmlspecialchars($name)."'".($info['autostart'] ? ' checked':'').">";
|
||||
echo "<span id='$id-wait' style='float:right;display:none'>wait<input class='wait' container='".htmlspecialchars($name)."' type='number' value='$wait' placeholder='0' title='seconds'></span></td>";
|
||||
echo "<td><a class='log' onclick=\"containerLogs('".addslashes(htmlspecialchars($name))."','$id',false,false)\"><img class='basic' src='/plugins/dynamix/icons/log.png'><div class='advanced'>";
|
||||
@@ -120,15 +121,11 @@ foreach ($images as $image) {
|
||||
if (count($image['usedBy'])) continue;
|
||||
$id = $image['Id'];
|
||||
$menu[] = sprintf("addDockerImageContext('%s','%s');", $id, implode(',',$image['Tags']));
|
||||
echo "<tr class='advanced'><td style='width:48px;padding:4px'>";
|
||||
echo "<div id='$id' style='display:block;cursor:pointer'>";
|
||||
echo "<div style='position:relative;width:48px;height:48px;margin:0 auto'>";
|
||||
echo "<img src='/webGui/images/disk.png' style='position:absolute;opacity:0.3;top:0;bottom:0;left:0;right:0;width:48px;height:48px'>";
|
||||
echo "</div></div></td>";
|
||||
echo "<td><i>(orphan image)</i><div style='width:160px;'>Image ID: $id</div>";
|
||||
echo "<div style='width:160px'>".implode('<br>',array_map('htmlspecialchars',$image['Tags']))."</div></td>";
|
||||
echo "<td colspan='5'></td><td class='advanced' colspan='2'></td>";
|
||||
echo "<td><div class='advanced' style='width:124px'>Created ".htmlspecialchars($image['Created'])."</div></td></tr>";
|
||||
echo "<tr class='advanced'><td style='width:220px;padding:8px'>";
|
||||
echo "<span class='outer apps'><span id='$id' class='hand'><img src='/webGui/images/disk.png' class='img'></span><span class='inner'>(orphan image)<br><i class='fa fa-square stopped grey-text'></i><span class='state'>stopped</span></span></span>";
|
||||
echo "</td><td colspan='7'>Image ID: $id<br>";
|
||||
echo implode(', ',array_map('htmlspecialchars',$image['Tags']));
|
||||
echo "</td><td>Created ".htmlspecialchars($image['Created'])."</td></tr>";
|
||||
}
|
||||
echo "\0".implode($menu).implode($docker)."\0".(pgrep('rc.docker')!==false ? 1:0);
|
||||
?>
|
||||
|
||||
@@ -20,6 +20,14 @@ $template_repos = $dockerManPaths['template-repos'];
|
||||
$user_prefs = $dockerManPaths['user-prefs'];
|
||||
|
||||
switch ($_POST['action']) {
|
||||
case 'docker_load_start':
|
||||
$daemon = "/usr/local/emhttp/plugins/dynamix.docker.manager/scripts/docker_load";
|
||||
if (!exec("pgrep -f $daemon")) passthru("$daemon &>/dev/null &");
|
||||
break;
|
||||
case 'docker_load_stop':
|
||||
$daemon = "/usr/local/emhttp/plugins/dynamix.docker.manager/scripts/docker_load";
|
||||
if (exec("pgrep -f $daemon")) passthru("pkill -f $daemon &>/dev/null &");
|
||||
break;
|
||||
case 'autostart':
|
||||
// update container autostart setting
|
||||
$container = urldecode(($_POST['container']));
|
||||
|
||||
@@ -146,7 +146,7 @@ function rmImage(image, imageName) {
|
||||
});
|
||||
}
|
||||
function eventControl(params, spin) {
|
||||
if (spin) $('#'+params['container']).find('i').removeClass('fa-play fa-square fa-pause').addClass('fa-refresh fa-spin');
|
||||
if (spin) $('#'+params['container']).parent().find('i').removeClass('fa-play fa-square fa-pause').addClass('fa-refresh fa-spin');
|
||||
$.post(eventURL, params, function(data) {
|
||||
if (data.success === true) {
|
||||
if (spin) setTimeout(spin+'()',500); else location=window.location.href;
|
||||
|
||||
@@ -26,6 +26,7 @@ $check = $notify['version'] ? 0 : 1;
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.filetree.css')?>">
|
||||
<style>
|
||||
#plugin_tree{width:33%;height:200px;overflow-y:scroll}
|
||||
table tbody td{line-height:normal}
|
||||
</style>
|
||||
<script src="<?autov('/webGui/javascript/jquery.filetree.js')?>"></script>
|
||||
<script>
|
||||
|
||||
@@ -98,21 +98,19 @@ if (empty($vms)) {
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.filetree.css')?>">
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.switchbutton.css')?>">
|
||||
<style type="text/css">
|
||||
body{-webkit-overflow-scrolling:touch;}
|
||||
.fileTree{width:300px;max-height:150px;overflow-y:scroll;position:absolute;z-index:100;display:none;}
|
||||
.fileTree{width:300px;max-height:150px;overflow-y:scroll;position:absolute;z-index:100;display:none}
|
||||
div.four{font-size:1.1rem;width:300px}
|
||||
div.four label{float:left;display:table-cell;width:25%}
|
||||
div.four label:nth-child(4n+4){float:none;clear:both}
|
||||
div.four label.cpu1{width:32%}
|
||||
div.four label.cpu2{width:26%}
|
||||
div.Panel{float:unset;margin:4px;height:inherit;border:none;}
|
||||
div.Panel:hover{background-color:unset;}
|
||||
div.PanelText{display:none;}
|
||||
th.five{width:6%}
|
||||
tbody > tr.sortable:hover{cursor:move}
|
||||
th.eight{width:8%}
|
||||
tbody>tr.sortable:hover{cursor:move}
|
||||
table.domdisk tbody tr:nth-child(even){background-color:transparent}
|
||||
table tbody td{line-height:normal}
|
||||
</style>
|
||||
<table id="kvm_table" class="tablesorter four shift">
|
||||
<thead><tr><th><a href="#" style="cursor:hand;margin-left:12px" onclick="resetSorting()" title="Reset sorting"><i class="fa fa-th-list"></i></a></th><th>Name</th><th>Description</th><th>CPUs</th><th>Memory</th><th>vDisks</th><th>Graphics</th><th class="five">Autostart</th></tr></thead>
|
||||
<thead><tr><th><a href="#" style="cursor:hand;margin-left:12px;display:inline-block;width:32px" onclick="resetSorting()" title="Reset sorting"><i class="fa fa-th-list"></i></a>Name</th><th>Description</th><th>CPUs</th><th>Memory</th><th>vDisks</th><th>Graphics</th><th class="eight">Autostart</th></tr></thead>
|
||||
<tbody id="kvm_list"><tr><td colspan='8'><div class="spinner"></div></td></tr></tbody>
|
||||
</table>
|
||||
<input type="button" onclick="addVM()" id="btnAddVM" value="Add VM" style="display:none">
|
||||
@@ -158,7 +156,7 @@ function loadlist() {
|
||||
});
|
||||
var row = $('#kvm_list').find('tr:first');
|
||||
var names = ''; var index = '';
|
||||
row.parent().children().find('td.vm-name').each(function(){names+=$(this).text()+';';index+=$(this).parent().parent().children().index($(this).parent())+';';});
|
||||
row.parent().children().find('td.vm-name').each(function(){names+=$(this).find('a').text()+';';index+=$(this).parent().parent().children().index($(this).parent())+';';});
|
||||
$.post('/plugins/dynamix.vm.manager/include/UserPrefs.php',{names:names,index:index});
|
||||
}});
|
||||
$('head').append('<script>'+data[1]+'<\/script>');
|
||||
|
||||
@@ -42,7 +42,8 @@ foreach ($vms as $vm) {
|
||||
$id = $lv->domain_get_id($res) ?: '-';
|
||||
$is_autostart = $lv->domain_get_autostart($res);
|
||||
$state = $lv->domain_state_translate($dom['state']);
|
||||
$vmicon = $lv->domain_get_icon_url($res);
|
||||
$icon = $lv->domain_get_icon_url($res);
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon' class='img'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
$arrConfig = domain_to_config($uuid);
|
||||
if ($state == 'running') {
|
||||
$mem = $dom['memory'] / 1024;
|
||||
@@ -81,11 +82,28 @@ foreach ($vms as $vm) {
|
||||
unset($dom);
|
||||
$menu[] = sprintf("addVMContext('%s','%s','%s','%s','%s','%s');", addslashes($vm),addslashes($uuid),addslashes($template),$state,addslashes($vnc),addslashes($log));
|
||||
$kvm[] = "kvm.push({id:'$uuid',state:'$state'});";
|
||||
switch ($state) {
|
||||
case 'running':
|
||||
$shape = 'play';
|
||||
$status = 'started';
|
||||
$color = 'green-text';
|
||||
break;
|
||||
case 'paused':
|
||||
case 'pmsuspended':
|
||||
$shape = 'pause';
|
||||
$status = 'paused';
|
||||
$color = 'orange-text';
|
||||
break;
|
||||
default:
|
||||
$shape = 'square';
|
||||
$status = 'stopped';
|
||||
$color = 'red-text';
|
||||
break;
|
||||
}
|
||||
|
||||
/* VM information */
|
||||
echo "<tr parent-id='$i' class='sortable'>";
|
||||
echo "<td style='width:48px;padding:4px'>".renderVMContentIcon($uuid, $vm, $vmicon, $state)."</td>";
|
||||
echo "<td class='vm-name'><a href='#' onclick='return toggle_id(\"name-$i\")' title='click for more VM info'>$vm</a></td>";
|
||||
echo "<tr parent-id='$i' class='sortable'><td class='vm-name' style='width:220px;padding:8px'>";
|
||||
echo "<span class='outer'><span id='vm-$uuid' class='hand'>$image</span><span class='inner'><a href='#' onclick='return toggle_id(\"name-$i\")' title='click for more VM info'>$vm</a><br><i class='fa fa-$shape $status $color'></i><span class='state'>$status</span></span></span></td>";
|
||||
echo "<td>$desc</td>";
|
||||
echo "<td><a class='vcpu-$uuid' style='cursor:pointer'>$vcpu</a></td>";
|
||||
echo "<td>$mem</td>";
|
||||
@@ -95,9 +113,9 @@ foreach ($vms as $vm) {
|
||||
|
||||
/* Disk device information */
|
||||
echo "<tr child-id='$i' id='name-$i".(in_array('name-'.$i++,$show) ? "'>" : "' style='display:none'>");
|
||||
echo "<td colspan='8' style='overflow:hidden'>";
|
||||
echo "<td colspan='7' style='overflow:hidden'>";
|
||||
echo "<table class='tablesorter domdisk' id='domdisk_table'>";
|
||||
echo "<thead><tr><th><i class='fa fa-hdd-o'></i><b> Disk devices </b></th><th>Bus</th><th>Capacity</th><th>Allocation</th></tr></thead>";
|
||||
echo "<thead><tr><th><i class='fa fa-hdd-o'></i> <b>Disk devices</b></th><th>Bus</th><th>Capacity</th><th>Allocation</th></tr></thead>";
|
||||
echo "<tbody id='domdisk_list'>";
|
||||
|
||||
/* Display VM disks */
|
||||
|
||||
@@ -487,20 +487,6 @@
|
||||
$maxmem = number_format(($arrHostInfo['memory'] / 1048576), 1, '.', ' ');
|
||||
}
|
||||
|
||||
//set color on even rows for white or black theme
|
||||
function bcolor($row) {
|
||||
global $display;
|
||||
|
||||
if ($display['theme']=='gray')
|
||||
return "transparent";
|
||||
elseif ($display['theme']=='azure')
|
||||
return "transparent";
|
||||
elseif ($display['theme']=='black')
|
||||
return ($row % 2 == 0) ? "transparent":"#212121";
|
||||
else
|
||||
return ($row % 2 == 0) ? "transparent":"#ededed";
|
||||
}
|
||||
|
||||
function mk_dropdown_options($arrOptions, $strSelected) {
|
||||
foreach ($arrOptions as $key => $label) {
|
||||
echo mk_option($strSelected, $key, $label);
|
||||
@@ -519,30 +505,6 @@
|
||||
return $abbreviation;
|
||||
}
|
||||
|
||||
function renderVMContentIcon($uuid, $name, $icon, $state, $text=false) {
|
||||
switch ($state) {
|
||||
case 'running':
|
||||
$shape = 'play';
|
||||
$status = 'started';
|
||||
break;
|
||||
case 'paused': //no break on purpose
|
||||
case 'pmsuspended':
|
||||
$shape = 'pause';
|
||||
$status = 'paused';
|
||||
break;
|
||||
default:
|
||||
$shape = 'square';
|
||||
$status = 'stopped';
|
||||
break;
|
||||
}
|
||||
|
||||
return "<div id=\"vm-".htmlspecialchars($uuid)."\" class=\"Panel $status\" style=\"cursor:pointer\">
|
||||
<div style=\"display:block\"><div style=\"position:relative; width:48px; height:48px; margin:0px auto;\">
|
||||
<img src=\"$icon\" class=\"$status\" style=\"position:absolute; z-index:1; top:0; bottom:0; left:0; right:0; width:48px; height:48px;\"/>
|
||||
<i class=\"fa iconstatus fa-$shape $status\" title=\"$status\"></i>
|
||||
</div></div>".($text?"<div class=\"PanelText\"><span class=\"PanelText $status\">$name</span></div>":"")."</div>";
|
||||
}
|
||||
|
||||
function sanitizeVendor($strVendor) {
|
||||
// Specialized vendor name cleanup
|
||||
// e.g.: Advanced Micro Devices, Inc. [AMD/ATI] --> Advanced Micro Devices, Inc.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
function ajaxVMDispatch(params, spin){
|
||||
if (spin) $('#vm-'+params['uuid']).find('i').removeClass('fa-play fa-square fa-pause').addClass('fa-refresh fa-spin');
|
||||
if (spin) $('#vm-'+params['uuid']).parent().find('i').removeClass('fa-play fa-square fa-pause').addClass('fa-refresh fa-spin');
|
||||
$.post("/plugins/dynamix.vm.manager/include/VMajax.php", params, function(data) {
|
||||
if (data.error) {
|
||||
swal({
|
||||
|
||||
@@ -136,22 +136,15 @@ if ($memory_installed >= 1024) {
|
||||
$low = $memory_maximum < $memory_installed;
|
||||
if ($low) $memory_maximum = pow(2,ceil(log($memory_installed)/log(2)));
|
||||
?>
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.switchbutton.css')?>">
|
||||
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.ui.css')?>">
|
||||
<style>
|
||||
.switch-button-label{float:left;cursor:pointer}
|
||||
.switch-button-background{float:left;position:relative;top:12px;background:#ccc;border:1px solid #aaa;margin:0 10px;border-radius:4px;cursor:pointer}
|
||||
.switch-button-button{position:absolute;left:-1px;top:-1px;background:#fafafa;border:1px solid #aaa;border-radius:4px}
|
||||
img,i.img{width:32px;height:32px;margin-right:10px}
|
||||
i.started{color:#009900}
|
||||
i.stopped{color:#ef3d47}
|
||||
i.paused{color:#f0dd33}
|
||||
span.update{color:#3b5998}
|
||||
span.outer{float:left;margin-bottom:20px;margin-right:20px;cursor:pointer}
|
||||
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
||||
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
||||
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
||||
span.inner{width:135px;display:inline-block;vertical-align:top}
|
||||
span.state{font-size:1.1rem;margin-left:7px}
|
||||
.switch-button-background{top:12px}
|
||||
<?if ($themes2):?>
|
||||
.switch-button-label{margin-top:-4px}
|
||||
<?endif;?>
|
||||
span.outer{float:left}
|
||||
span.inner{width:124px}
|
||||
</style>
|
||||
<script src="<?autov('/webGui/javascript/jquery.switchbutton.js')?>"></script>
|
||||
<script src="<?autov('/plugins/dynamix.docker.manager/javascript/docker.js')?>"></script>
|
||||
@@ -258,12 +251,12 @@ foreach ($ports as $port) {
|
||||
|
||||
<table class='share_status dashboard box3'>
|
||||
<?if ($display['dashapps']!='none'):?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='docker'):?>
|
||||
<?if ($dockerd && ($display['dashapps']=='icons' || $display['dashapps']=='docker')):?>
|
||||
<thead><tr><td></td><td colspan='4'>Docker Containers<i class='fa blue-text chevron mt0' id='docker_view' onclick='toggleChevron("docker_view",0)'></i><span class='info apps'><input type='checkbox' id='apps'></span></td><td></td></tr></thead>
|
||||
<tbody class='docker_view' style='display:none'>
|
||||
</tbody>
|
||||
<?endif;?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='vms'):?>
|
||||
<?if ($libvirtd && ($display['dashapps']=='icons' || $display['dashapps']=='vms')):?>
|
||||
<thead><tr><td></td><td colspan='4' class='next'>Virtual Machines<i class='fa blue-text chevron mt0' id='vm_view' onclick='toggleChevron("vm_view",0)'></i><span class='info vms'><input type='checkbox' id='vms'></span></td><td></td></tr></thead>
|
||||
<tbody class='vm_view' style='display:none'>
|
||||
</tbody>
|
||||
@@ -452,8 +445,8 @@ function noVMs() {
|
||||
}
|
||||
function loadlist(init) {
|
||||
if (init) {
|
||||
$('#apps').switchButton({show_labels:false, checked:$.cookie('my_apps')=='startedOnly'});
|
||||
$('#vms').switchButton({show_labels:false, checked:$.cookie('my_vms')=='startedOnly'});
|
||||
$('#apps').switchButton({labels_placement:'left', off_label:'All Apps', on_label:'Started only', checked:$.cookie('my_apps')=='startedOnly'});
|
||||
$('#vms').switchButton({labels_placement:'left', off_label:'All VMs', on_label:'Started only', checked:$.cookie('my_vms')=='startedOnly'});
|
||||
$('#apps').change(function(){
|
||||
$('span.outer.apps.stopped').finish().toggle('fast',function(){noApps();})
|
||||
$('#apps').is(':checked') ? $.cookie('my_apps','startedOnly',{expires:3650}) : $.removeCookie('my_apps');
|
||||
@@ -464,7 +457,7 @@ function loadlist(init) {
|
||||
});
|
||||
context.init({preventDoubleContext:false,left:true,above:false});
|
||||
}
|
||||
$.post('/webGui/include/DashboardApps.php',{display:'<?=$display['dashapps']?>',docker:'<?=$dockerd?>',vm:'<?=$libvirtd?>'},function(d) {
|
||||
$.post('/webGui/include/DashboardApps.php',{display:'<?=$display['dashapps']?>'},function(d) {
|
||||
var data = d.split(/\0/);
|
||||
$('.docker_view').html(data[0]);
|
||||
$('.vm_view').html(data[1]);
|
||||
@@ -756,10 +749,10 @@ $(function() {
|
||||
<?if ($fans>0):?>
|
||||
toggleView('fan_view',true);
|
||||
<?endif;?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='docker'):?>
|
||||
<?if ($dockerd && ($display['dashapps']=='icons' || $display['dashapps']=='docker')):?>
|
||||
toggleView('docker_view',true);
|
||||
<?endif;?>
|
||||
<?if ($display['dashapps']=='icons' || $display['dashapps']=='vms'):?>
|
||||
<?if ($libvirtd && ($display['dashapps']=='icons' || $display['dashapps']=='vms')):?>
|
||||
toggleView('vm_view',true);
|
||||
<?endif;?>
|
||||
toggleView('parity_view',true);
|
||||
|
||||
@@ -20,101 +20,97 @@ $display = $_POST['display'];
|
||||
$menu = [];
|
||||
|
||||
if ($display=='icons' || $display=='docker') {
|
||||
echo "<tr><td></td><td colspan='4'>";
|
||||
if ($_POST['docker']) {
|
||||
$user_prefs = $dockerManPaths['user-prefs'];
|
||||
$DockerClient = new DockerClient();
|
||||
$DockerTemplates = new DockerTemplates();
|
||||
$containers = $DockerClient->getDockerContainers();
|
||||
$allInfo = $DockerTemplates->getAllInfo();
|
||||
if (file_exists($user_prefs)) {
|
||||
$prefs = parse_ini_file($user_prefs); $sort = [];
|
||||
foreach ($containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
|
||||
array_multisort($sort,SORT_NUMERIC,$containers);
|
||||
}
|
||||
foreach ($containers as $ct) {
|
||||
$name = $ct['Name'];
|
||||
$id = $ct['Id'];
|
||||
$info = &$allInfo[$name];
|
||||
$running = $info['running'] ? 1:0;
|
||||
$paused = $info['paused'] ? 1:0;
|
||||
$is_autostart = $info['autostart'] ? 'true':'false';
|
||||
$updateStatus = $info['updated']=='true'||$info['updated']=='undef' ? 'true':'false';
|
||||
$template = $info['template'];
|
||||
$shell = $info['shell'];
|
||||
$webGui = html_entity_decode($info['url']);
|
||||
$support = html_entity_decode($info['Support']);
|
||||
$project = html_entity_decode($info['Project']);
|
||||
$menu[] = sprintf("addDockerContainerContext('%s','%s','%s',%s,%s,%s,%s,'%s','%s','%s','%s','%s');", addslashes($name), addslashes($ct['ImageId']), addslashes($template), $running, $paused, $updateStatus, $is_autostart, addslashes($webGui), $shell, $id, addslashes($support), addslashes($project));
|
||||
$shape = $running ? ($paused ? 'pause' : 'play') : 'square';
|
||||
$status = $running ? ($paused ? 'paused' : 'started') : 'stopped';
|
||||
$update = $updateStatus=='false' ? 'update' : '';
|
||||
$icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png';
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
echo "<span id='$id' class='outer apps $status'>$image<span class='inner'><span class='$update'>$name</span><br><i class='fa fa-$shape $status'></i><span class='state'>$status</span></span></span>";
|
||||
}
|
||||
$none = count($containers) ? "No running docker containers" : "No docker containers defined";
|
||||
echo "<span id='no_apps' style='display:none'>$none<br><br></span>";
|
||||
} else {
|
||||
echo "Docker service not running<br><br>";
|
||||
$user_prefs = $dockerManPaths['user-prefs'];
|
||||
$DockerClient = new DockerClient();
|
||||
$DockerTemplates = new DockerTemplates();
|
||||
$containers = $DockerClient->getDockerContainers();
|
||||
$allInfo = $DockerTemplates->getAllInfo();
|
||||
if (file_exists($user_prefs)) {
|
||||
$prefs = parse_ini_file($user_prefs); $sort = [];
|
||||
foreach ($containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
|
||||
array_multisort($sort,SORT_NUMERIC,$containers);
|
||||
}
|
||||
echo "<tr><td></td><td colspan='4'>";
|
||||
foreach ($containers as $ct) {
|
||||
$name = $ct['Name'];
|
||||
$id = $ct['Id'];
|
||||
$info = &$allInfo[$name];
|
||||
$running = $info['running'] ? 1:0;
|
||||
$paused = $info['paused'] ? 1:0;
|
||||
$is_autostart = $info['autostart'] ? 'true':'false';
|
||||
$updateStatus = $info['updated']=='true'||$info['updated']=='undef' ? 'true':'false';
|
||||
$template = $info['template'];
|
||||
$shell = $info['shell'];
|
||||
$webGui = html_entity_decode($info['url']);
|
||||
$support = html_entity_decode($info['Support']);
|
||||
$project = html_entity_decode($info['Project']);
|
||||
$menu[] = sprintf("addDockerContainerContext('%s','%s','%s',%s,%s,%s,%s,'%s','%s','%s','%s','%s');", addslashes($name), addslashes($ct['ImageId']), addslashes($template), $running, $paused, $updateStatus, $is_autostart, addslashes($webGui), $shell, $id, addslashes($support), addslashes($project));
|
||||
$shape = $running ? ($paused ? 'pause' : 'play') : 'square';
|
||||
$status = $running ? ($paused ? 'paused' : 'started') : 'stopped';
|
||||
$color = $status=='started' ? 'green-text' : ($status=='paused' ? 'orange-text' : 'red-text');
|
||||
$update = $updateStatus=='false' ? 'blue-text' : '';
|
||||
$icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png';
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon' class='img'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
echo "<span class='outer apps $status'><span id='$id' class='hand'>$image</span><span class='inner'><span class='$update'>$name</span><br><i class='fa fa-$shape $status $color'></i><span class='state'>$status</span></span></span>";
|
||||
}
|
||||
$none = count($containers) ? "No running docker containers" : "No docker containers defined";
|
||||
echo "<span id='no_apps' style='display:none'>$none<br><br></span>";
|
||||
echo "</td><td></td></tr>";
|
||||
}
|
||||
echo "\0";
|
||||
if ($display=='icons' || $display=='vms') {
|
||||
echo "<tr><td></td><td colspan='4'>";
|
||||
if ($_POST['vm']) {
|
||||
$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
|
||||
$vms = $lv->get_domains();
|
||||
if (file_exists($user_prefs)) {
|
||||
$prefs = parse_ini_file($user_prefs); $sort = [];
|
||||
foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?? 999;
|
||||
array_multisort($sort,SORT_NUMERIC,$vms);
|
||||
} else {
|
||||
natcasesort($vms);
|
||||
}
|
||||
foreach ($vms as $vm) {
|
||||
$res = $lv->get_domain_by_name($vm);
|
||||
$uuid = libvirt_domain_get_uuid_string($res);
|
||||
$dom = $lv->domain_get_info($res);
|
||||
$id = $lv->domain_get_id($res);
|
||||
$state = $lv->domain_state_translate($dom['state']);
|
||||
$vncport = $lv->domain_get_vnc_port($res);
|
||||
$vnc = '';
|
||||
if ($vncport > 0) {
|
||||
$wsport = $lv->domain_get_ws_port($res);
|
||||
$vnc = '/plugins/dynamix.vm.manager/vnc.html?autoconnect=true&host='.$_SERVER['HTTP_HOST'].'&port=&path=/wsproxy/'.$wsport.'/';
|
||||
} else {
|
||||
$vncport = ($vncport < 0) ? "auto" : "";
|
||||
}
|
||||
$template = $lv->_get_single_xpath_result($res, '//domain/metadata/*[local-name()=\'vmtemplate\']/@name');
|
||||
if (empty($template)) $template = 'Custom';
|
||||
$log = (is_file("/var/log/libvirt/qemu/$vm.log") ? "libvirt/qemu/$vm.log" : '');
|
||||
$menu[] = sprintf("addVMContext('%s','%s','%s','%s','%s','%s');", addslashes($vm), addslashes($uuid), addslashes($template), $state, addslashes($vnc), addslashes($log));
|
||||
$icon = $lv->domain_get_icon_url($res);
|
||||
switch ($state) {
|
||||
case 'running':
|
||||
$shape = 'play';
|
||||
$status = 'started';
|
||||
break;
|
||||
case 'paused':
|
||||
case 'pmsuspended':
|
||||
$shape = 'pause';
|
||||
$status = 'paused';
|
||||
break;
|
||||
default:
|
||||
$shape = 'square';
|
||||
$status = 'stopped';
|
||||
break;
|
||||
}
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
echo "<span id='vm-$uuid' class='outer vms $status'>$image<span class='inner'>$vm<br><i class='fa fa-$shape $status'></i><span class='state'>$status</span></span></span>";
|
||||
}
|
||||
$none = count($vms) ? "No running virtual machines" : "No virtual machines defined";
|
||||
echo "<span id='no_vms' style='display:none'>$none<br><br></span>";
|
||||
$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
|
||||
$vms = $lv->get_domains();
|
||||
if (file_exists($user_prefs)) {
|
||||
$prefs = parse_ini_file($user_prefs); $sort = [];
|
||||
foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?? 999;
|
||||
array_multisort($sort,SORT_NUMERIC,$vms);
|
||||
} else {
|
||||
echo "VM service not running<br><br>";
|
||||
natcasesort($vms);
|
||||
}
|
||||
echo "<tr><td></td><td colspan='4'>";
|
||||
foreach ($vms as $vm) {
|
||||
$res = $lv->get_domain_by_name($vm);
|
||||
$uuid = libvirt_domain_get_uuid_string($res);
|
||||
$dom = $lv->domain_get_info($res);
|
||||
$id = $lv->domain_get_id($res);
|
||||
$state = $lv->domain_state_translate($dom['state']);
|
||||
$vncport = $lv->domain_get_vnc_port($res);
|
||||
$vnc = '';
|
||||
if ($vncport > 0) {
|
||||
$wsport = $lv->domain_get_ws_port($res);
|
||||
$vnc = '/plugins/dynamix.vm.manager/vnc.html?autoconnect=true&host='.$_SERVER['HTTP_HOST'].'&port=&path=/wsproxy/'.$wsport.'/';
|
||||
} else {
|
||||
$vncport = ($vncport < 0) ? "auto" : "";
|
||||
}
|
||||
$template = $lv->_get_single_xpath_result($res, '//domain/metadata/*[local-name()=\'vmtemplate\']/@name');
|
||||
if (empty($template)) $template = 'Custom';
|
||||
$log = (is_file("/var/log/libvirt/qemu/$vm.log") ? "libvirt/qemu/$vm.log" : '');
|
||||
$menu[] = sprintf("addVMContext('%s','%s','%s','%s','%s','%s');", addslashes($vm), addslashes($uuid), addslashes($template), $state, addslashes($vnc), addslashes($log));
|
||||
$icon = $lv->domain_get_icon_url($res);
|
||||
switch ($state) {
|
||||
case 'running':
|
||||
$shape = 'play';
|
||||
$status = 'started';
|
||||
$color = 'green-text';
|
||||
break;
|
||||
case 'paused':
|
||||
case 'pmsuspended':
|
||||
$shape = 'pause';
|
||||
$status = 'paused';
|
||||
$color = 'orange-text';
|
||||
break;
|
||||
default:
|
||||
$shape = 'square';
|
||||
$status = 'stopped';
|
||||
$color = 'red-text';
|
||||
break;
|
||||
}
|
||||
$image = substr($icon,-4)=='.png' ? "<img src='$icon' class='img'>" : (substr($icon,0,5)=='icon-' ? "<i class='$icon img'></i>" : "<i class='fa fa-$icon img'></i>");
|
||||
echo "<span class='outer vms $status'><span id='vm-$uuid' class='hand'>$image</span><span class='inner'>$vm<br><i class='fa fa-$shape $status $color'></i><span class='state'>$status</span></span></span>";
|
||||
}
|
||||
$none = count($vms) ? "No running virtual machines" : "No virtual machines defined";
|
||||
echo "<span id='no_vms' style='display:none'>$none<br><br></span>";
|
||||
echo "</td><td></td></tr>";
|
||||
}
|
||||
echo "\0";
|
||||
|
||||
@@ -25,7 +25,7 @@ $themes2 = in_array($theme,['gray','azure']);
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<meta name="viewport" content="width=1280">
|
||||
<meta name="viewport" content="width=1440">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<link type="image/png" rel="shortcut icon" href="/webGui/images/<?=$var['mdColor']?>.png">
|
||||
<link type="text/css" rel="stylesheet" href="<?autov("/webGui/styles/default-fonts.css")?>">
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
html{font-family:clear-sans;font-size:62.5%;height:100%}
|
||||
body{font-size:1.3rem;color:#606e7f;background-color:#e4e2e4;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
|
||||
@media (max-width:1280px){#template{min-width:1280px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1280px;margin:0}}
|
||||
@media (min-width:1921px){#template{min-width:1280px;max-width:1920px;margin:0 auto}}
|
||||
@media (max-width:1280px){#template{min-width:1260px;max-width:1260px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1260px;margin:0}}
|
||||
@media (min-width:1921px){#template{min-width:1260px;max-width:1920px;margin:0 auto}}
|
||||
img{border:none;text-decoration:none;vertical-align:middle}
|
||||
p{text-align:left}
|
||||
p.centered{text-align:left}
|
||||
@@ -153,7 +153,7 @@ table.share_status.share tr td:last-child{width:4%;text-align:right;padding-righ
|
||||
table.share_status.fixed tr>td+td{min-width:39px;font-size:1.1rem;text-align:center;padding:0}
|
||||
table.share_status.table{margin-top:36px}
|
||||
table.share_status.table tr>td{width:50%}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #606e7f}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 14px 10px;border:1px solid #606e7f}
|
||||
table.share_status.dashboard thead tr:first-child>td{line-height:5rem;font-size:1.6rem;font-weight:bold;letter-spacing:1.8px;border:none;padding-top:10px}
|
||||
table.share_status.dashboard tbody tr>td{line-height:normal;padding-top:3px;padding-bottom:3px}
|
||||
table.share_status.dashboard tbody tr{border-bottom:none}
|
||||
@@ -173,8 +173,8 @@ table.share_status.dashboard td i[class^="icon-u-"]{font-size:inherit}
|
||||
table.share_status.dashboard td span[class^="fa "]{font-size:1.6rem;margin-right:8px}
|
||||
table.share_status.dashboard td i#mycase[class^="case-"]{font-size:128px}
|
||||
table.share_status.dashboard td i#mycase[class^="fa "]{font-size:96px}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:-10px;margin-right:2px;cursor:pointer;color:#606e7f}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:0}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:0;margin-right:2px;cursor:pointer;color:#606e7f}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:14px}
|
||||
table.share_status.dashboard td div.section{display:inline-block;vertical-align:top;margin-left:4px;font-size:1.2rem;font-weight:bold;text-transform:uppercase;letter-spacing:1px}
|
||||
table.share_status.dashboard td div.section span{font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
table.share_status.dashboard td span.info{float:right;margin-right:20px;font-size:1.2rem;font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
@@ -256,10 +256,18 @@ span.three{margin-left:-23px}
|
||||
span.tub{margin-right:8px;font-size:2.4rem;cursor:pointer}
|
||||
span.score{font-size:1.1rem;color:#ffffff;position:absolute}
|
||||
span#dropbox{background:none;line-height:6rem;margin-right:20px}
|
||||
span.outer{margin-bottom:20px;margin-right:20px}
|
||||
span.hand{cursor:pointer}
|
||||
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
||||
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
||||
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
||||
span.inner{display:inline-block;vertical-align:top}
|
||||
span.state{font-size:1.1rem;margin-left:7px}
|
||||
i.padlock{margin-right:8px;cursor:default;vertical-align:middle}
|
||||
i.nolock{visibility:hidden;margin-right:8px;vertical-align:middle}
|
||||
i.lock{margin-left:8px;cursor:default;vertical-align:middle}
|
||||
i.orb{font-size:1.1rem;margin:0 8px 0 3px}
|
||||
img.img,i.img{width:32px;height:32px;margin-right:10px}
|
||||
img.icon{margin:-3px 4px 0 0}
|
||||
img.list{width:auto;max-width:48px;height:48px}
|
||||
i.list{font-size:4rem;color:#606e7f}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
html{font-family:clear-sans;font-size:62.5%;height:100%}
|
||||
body{font-size:1.3rem;color:#f2f2f2;background-color:#1c1b1b;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
|
||||
@media (max-width:1280px){#template{min-width:1280px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1280px;margin:0 10px}}
|
||||
@media (min-width:1921px){#template{min-width:1280px;max-width:1920px;margin:0 auto}}
|
||||
@media (max-width:1280px){#template{min-width:1260px;max-width:1260px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1260px;margin:0 10px}}
|
||||
@media (min-width:1921px){#template{min-width:1260px;max-width:1920px;margin:0 auto}}
|
||||
img{border:none;text-decoration:none;vertical-align:middle}
|
||||
p{text-align:justify}
|
||||
p.centered{text-align:left}
|
||||
@@ -44,7 +44,7 @@ select.slot{min-width:44rem;max-width:44rem}
|
||||
input.narrow{width:166px}
|
||||
input.trim{width:76px;min-width:76px}
|
||||
textarea{resize:none}
|
||||
#header{position:absolute;top:0;left:0;width:100%;min-width:1280px;height:91px;z-index:100;margin:0;color:#1c1b1b;background-color:#f2f2f2;background-size:100% 90px;background-repeat:no-repeat}
|
||||
#header{position:absolute;top:0;left:0;width:100%;min-width:1260px;height:91px;z-index:100;margin:0;color:#1c1b1b;background-color:#f2f2f2;background-size:100% 90px;background-repeat:no-repeat}
|
||||
#header .logo{float:left;margin-left:10px;color:#e22828;width:160px;text-align:center}
|
||||
#header .logo svg{width:160px;display:block;margin:25px 50px 8px 0}
|
||||
#header .block{margin:0;float:right;text-align:right;background-color:rgba(242,242,242,0.3);padding:10px 12px}
|
||||
@@ -57,7 +57,7 @@ textarea{resize:none}
|
||||
#title span.right{font-size:1.4rem;padding-top:2px;padding-right:10px;float:right}
|
||||
#title span img{padding-right:4px}
|
||||
#title.shift{margin-top:-30px}
|
||||
#menu{position:absolute;top:90px;left:0;width:100%;min-width:1280px;height:4rem;line-height:4rem;padding:0;margin:0;font-size:1.2rem;background-color:#f2f2f2;z-index:101}
|
||||
#menu{position:absolute;top:90px;left:0;width:100%;min-width:1260px;height:4rem;line-height:4rem;padding:0;margin:0;font-size:1.2rem;background-color:#f2f2f2;z-index:101}
|
||||
#nav-block{overflow:hidden;height:4rem;letter-spacing:1.8px}
|
||||
#nav-left{float:left}
|
||||
#nav-right{float:right}
|
||||
@@ -150,7 +150,7 @@ table.share_status.share tr td:last-child{width:4%;text-align:right;padding-righ
|
||||
table.share_status.fixed tr>td+td{min-width:39px;font-size:1.1rem;text-align:center;padding:0}
|
||||
table.share_status.table{margin-top:36px}
|
||||
table.share_status.table tr>td{width:50%}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #2b2b2b}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 14px 10px;border:1px solid #2b2b2b}
|
||||
table.share_status.dashboard thead tr:last-child{border-bottom:none}
|
||||
table.share_status.dashboard thead tr:first-child>td{background-color:transparent;height:4rem;line-height:4rem;font-size:1.6rem;font-weight:bold;letter-spacing:1.8px;text-transform:capitalize;vertical-align:middle}
|
||||
table.share_status.dashboard tbody tr:nth-child(even){background-color:transparent}
|
||||
@@ -174,8 +174,8 @@ table.share_status.dashboard td i[class^="icon-u-"]{font-size:inherit}
|
||||
table.share_status.dashboard td span[class^="fa "]{font-size:1.6rem;margin-right:8px}
|
||||
table.share_status.dashboard td i#mycase[class^="case-"]{font-size:128px}
|
||||
table.share_status.dashboard td i#mycase[class^="fa "]{font-size:96px}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:-10px;margin-right:2px;cursor:pointer;color:#f2f2f2}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:0}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:0;margin-right:2px;cursor:pointer;color:#f2f2f2}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:14px}
|
||||
table.share_status.dashboard td div.section{display:inline-block;vertical-align:top;margin-left:4px;font-size:1.2rem;font-weight:bold;text-transform:uppercase;letter-spacing:1px}
|
||||
table.share_status.dashboard td div.section span{font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
table.share_status.dashboard td span.info{float:right;margin-right:20px;font-size:1.2rem;font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
@@ -241,10 +241,18 @@ span.two{margin-left:-20px}
|
||||
span.three{margin-left:-23px}
|
||||
span.tub{margin-right:8px;font-size:2.4rem;cursor:pointer}
|
||||
span.score{font-size:1.2rem;color:#1c1b1b;position:absolute}
|
||||
span.outer{margin-bottom:20px;margin-right:20px}
|
||||
span.hand{cursor:pointer}
|
||||
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
||||
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
||||
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
||||
span.inner{display:inline-block;vertical-align:top}
|
||||
span.state{font-size:1.1rem;margin-left:7px}
|
||||
i.padlock{margin-right:8px;cursor:default;vertical-align:middle}
|
||||
i.nolock{visibility:hidden;margin-right:8px;vertical-align:middle}
|
||||
i.lock{margin-left:8px;cursor:default;vertical-align:middle}
|
||||
i.orb{font-size:1.1rem;margin:0 8px 0 3px}
|
||||
img.img,i.img{width:32px;height:32px;margin-right:10px}
|
||||
img.icon{margin:-3px 4px 0 0}
|
||||
img.list{width:auto;max-width:48px;height:48px}
|
||||
i.list{font-size:4rem;color:#f2f2f2}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
html{font-family:clear-sans;font-size:62.5%;height:100%}
|
||||
body{font-size:1.3rem;color:#606e7f;background-color:#1b1d1b;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
|
||||
@media (max-width:1280px){#template{min-width:1280px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1280px;margin:0}}
|
||||
@media (min-width:1921px){#template{min-width:1280px;max-width:1920px;margin:0 auto}}
|
||||
@media (max-width:1280px){#template{min-width:1260px;max-width:1260px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1260px;margin:0}}
|
||||
@media (min-width:1921px){#template{min-width:1260px;max-width:1920px;margin:0 auto}}
|
||||
img{border:none;text-decoration:none;vertical-align:middle}
|
||||
p{text-align:left}
|
||||
p.centered{text-align:left}
|
||||
@@ -153,7 +153,7 @@ table.share_status.share tr td:last-child{width:4%;text-align:right;padding-righ
|
||||
table.share_status.fixed tr>td+td{min-width:39px;font-size:1.1rem;text-align:center;padding:0}
|
||||
table.share_status.table{margin-top:36px}
|
||||
table.share_status.table tr>td{width:50%}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #606e7f}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 14px 10px;border:1px solid #606e7f}
|
||||
table.share_status.dashboard thead tr:first-child>td{line-height:5rem;font-size:1.6rem;font-weight:bold;letter-spacing:1.8px;border:none;padding-top:10px}
|
||||
table.share_status.dashboard tbody tr>td{line-height:normal;padding-top:3px;padding-bottom:3px}
|
||||
table.share_status.dashboard tbody tr{border-bottom:none}
|
||||
@@ -173,8 +173,8 @@ table.share_status.dashboard td i[class^="icon-u-"]{font-size:inherit}
|
||||
table.share_status.dashboard td span[class^="fa "]{font-size:1.6rem;margin-right:8px}
|
||||
table.share_status.dashboard td i#mycase[class^="case-"]{font-size:128px}
|
||||
table.share_status.dashboard td i#mycase[class^="fa "]{font-size:96px}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:-10px;margin-right:2px;cursor:pointer;color:#606e7f}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:0}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:0;margin-right:2px;cursor:pointer;color:#606e7f}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:14px}
|
||||
table.share_status.dashboard td div.section{display:inline-block;vertical-align:top;margin-left:4px;font-size:1.2rem;font-weight:bold;text-transform:uppercase;letter-spacing:1px}
|
||||
table.share_status.dashboard td div.section span{font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
table.share_status.dashboard td span.info{float:right;margin-right:20px;font-size:1.2rem;font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
@@ -256,10 +256,18 @@ span.three{margin-left:-23px}
|
||||
span.tub{margin-right:8px;font-size:2.4rem;cursor:pointer}
|
||||
span.score{font-size:1.1rem;color:#ffffff;position:absolute}
|
||||
span#dropbox{background:none;line-height:6rem;margin-right:20px}
|
||||
span.outer{margin-bottom:20px;margin-right:20px}
|
||||
span.hand{cursor:pointer}
|
||||
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
||||
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
||||
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
||||
span.inner{display:inline-block;vertical-align:top}
|
||||
span.state{font-size:1.1rem;margin-left:7px}
|
||||
i.padlock{margin-right:8px;cursor:default;vertical-align:middle}
|
||||
i.nolock{visibility:hidden;margin-right:8px;vertical-align:middle}
|
||||
i.lock{margin-left:8px;cursor:default;vertical-align:middle}
|
||||
i.orb{font-size:1.1rem;margin:0 8px 0 3px}
|
||||
img.img,i.img{width:32px;height:32px;margin-right:10px}
|
||||
img.icon{margin:-3px 4px 0 0}
|
||||
img.list{width:auto;max-width:48px;height:48px}
|
||||
i.list{font-size:4rem;color:#606e7f}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
html{font-family:clear-sans;font-size:62.5%;height:100%}
|
||||
body{font-size:1.3rem;color:#1c1b1b;background-color:#f2f2f2;padding:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
|
||||
@media (max-width:1280px){#template{min-width:1280px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1280px;margin:0 10px}}
|
||||
@media (min-width:1921px){#template{min-width:1280px;max-width:1920px;margin:0 auto}}
|
||||
@media (max-width:1280px){#template{min-width:1260px;max-width:1260px;margin:0}}
|
||||
@media (min-width:1281px){#template{min-width:1260px;margin:0 10px}}
|
||||
@media (min-width:1921px){#template{min-width:1260px;max-width:1920px;margin:0 auto}}
|
||||
img{border:none;text-decoration:none;vertical-align:middle}
|
||||
p{text-align:justify}
|
||||
p.centered{text-align:left}
|
||||
@@ -44,7 +44,7 @@ select.slot{min-width:44rem;max-width:44rem}
|
||||
input.narrow{width:166px}
|
||||
input.trim{width:76px;min-width:76px}
|
||||
textarea{resize:none}
|
||||
#header{position:absolute;top:0;left:0;width:100%;min-width:1280px;height:91px;z-index:100;margin:0;color:#f2f2f2;background-color:#1c1b1b;background-size:100% 90px;background-repeat:no-repeat}
|
||||
#header{position:absolute;top:0;left:0;width:100%;min-width:1260px;height:91px;z-index:100;margin:0;color:#f2f2f2;background-color:#1c1b1b;background-size:100% 90px;background-repeat:no-repeat}
|
||||
#header .logo{float:left;margin-left:10px;color:#e22828;width:160px;text-align:center}
|
||||
#header .logo svg{width:160px;display:block;margin:25px 50px 8px 0}
|
||||
#header .block{margin:0;float:right;text-align:right;background-color:rgba(28,27,27,0.3);padding:10px 12px}
|
||||
@@ -57,7 +57,7 @@ textarea{resize:none}
|
||||
#title span.right{font-size:1.4rem;padding-top:2px;padding-right:10px;float:right}
|
||||
#title span img{padding-right:4px}
|
||||
#title.shift{margin-top:-30px}
|
||||
#menu{position:absolute;top:90px;left:0;width:100%;min-width:1280px;height:4rem;line-height:4rem;padding:0;margin:0;font-size:1.2rem;background-color:#1c1b1b;z-index:101}
|
||||
#menu{position:absolute;top:90px;left:0;width:100%;min-width:1260px;height:4rem;line-height:4rem;padding:0;margin:0;font-size:1.2rem;background-color:#1c1b1b;z-index:101}
|
||||
#nav-block{overflow:hidden;height:4rem;letter-spacing:1.8px}
|
||||
#nav-left{float:left}
|
||||
#nav-right{float:right}
|
||||
@@ -150,7 +150,7 @@ table.share_status.share tr td:last-child{width:4%;text-align:right;padding-righ
|
||||
table.share_status.fixed tr>td+td{min-width:39px;font-size:1.1rem;text-align:center;padding:0}
|
||||
table.share_status.table{margin-top:36px}
|
||||
table.share_status.table tr>td{width:50%}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 20px 10px;border:1px solid #e3e3e3}
|
||||
table.share_status.dashboard{float:left;margin:6px 10px 14px 10px;border:1px solid #e3e3e3}
|
||||
table.share_status.dashboard thead tr:last-child{border-bottom:none}
|
||||
table.share_status.dashboard thead tr:first-child>td{background-color:transparent;height:4rem;line-height:4rem;font-size:1.6rem;font-weight:bold;letter-spacing:1.8px;text-transform:capitalize;vertical-align:middle}
|
||||
table.share_status.dashboard tbody tr:nth-child(even){background-color:transparent}
|
||||
@@ -174,8 +174,8 @@ table.share_status.dashboard td i[class^="icon-u-"]{font-size:inherit}
|
||||
table.share_status.dashboard td span[class^="fa "]{font-size:1.6rem;margin-right:8px}
|
||||
table.share_status.dashboard td i#mycase[class^="case-"]{font-size:128px}
|
||||
table.share_status.dashboard td i#mycase[class^="fa "]{font-size:96px}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:-10px;margin-right:2px;cursor:pointer;color:#1c1b1b}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:0}
|
||||
table.share_status.dashboard td i.chevron{float:right;font-size:1.1rem!important;margin-top:0;margin-right:2px;cursor:pointer;color:#1c1b1b}
|
||||
table.share_status.dashboard td i.chevron.mt0{margin-top:14px}
|
||||
table.share_status.dashboard td div.section{display:inline-block;vertical-align:top;margin-left:4px;font-size:1.2rem;font-weight:bold;text-transform:uppercase;letter-spacing:1px}
|
||||
table.share_status.dashboard td div.section span{font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
table.share_status.dashboard td span.info{float:right;margin-right:20px;font-size:1.2rem;font-weight:normal;text-transform:none;letter-spacing:0}
|
||||
@@ -241,10 +241,18 @@ span.two{margin-left:-20px}
|
||||
span.three{margin-left:-23px}
|
||||
span.tub{margin-right:8px;font-size:2.4rem;cursor:pointer}
|
||||
span.score{font-size:1.2rem;color:#1c1b1b;position:absolute}
|
||||
span.outer{margin-bottom:20px;margin-right:20px}
|
||||
span.hand{cursor:pointer}
|
||||
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
||||
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
||||
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
||||
span.inner{display:inline-block;vertical-align:top}
|
||||
span.state{font-size:1.1rem;margin-left:7px}
|
||||
i.padlock{margin-right:8px;cursor:default;vertical-align:middle}
|
||||
i.nolock{visibility:hidden;margin-right:8px;vertical-align:middle}
|
||||
i.lock{margin-left:8px;cursor:default;vertical-align:middle}
|
||||
i.orb{font-size:1.1rem;margin:0 8px 0 3px}
|
||||
img.img,i.img{width:32px;height:32px;margin-right:10px}
|
||||
img.icon{margin:-3px 4px 0 0}
|
||||
img.list{width:auto;max-width:48px;height:48px}
|
||||
i.list{font-size:4rem;color:#1c1b1b}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
.switch-button-label{float:left;font-size:1.4rem;cursor:pointer;}
|
||||
.switch-button-label.off{color:#adadad;}
|
||||
.switch-button-label.on{color:#0088CC;}
|
||||
.switch-button-background{float:left;position:relative;background:#ccc;border:1px solid #aaa;margin:1px 10px;border-radius:4px;cursor:pointer;}
|
||||
.switch-button-button{position:absolute;left:-1px;top:-1px;background:#FAFAFA;border:1px solid #aaa;border-radius:4px;}
|
||||
.switch-button-label{float:left;font-size:1.1rem;text-transform:uppercase;letter-spacing:1px;cursor:pointer}
|
||||
.switch-button-background{float:left;position:relative;background:#ccc;border:1px solid #aaa;margin:1px 10px;border-radius:4px;cursor:pointer}
|
||||
.switch-button-button{position:absolute;left:-1px;top:-1px;background:#fafafa;border:1px solid #aaa;border-radius:4px}
|
||||
Reference in New Issue
Block a user