Some work about adaptive color scheme for Web UI (PR #19901)
http://[316:c51a:62a3:8b9::4]/d4708/qBittorrent/src/branch/adaptive-webui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
9.9 KiB
316 lines
9.9 KiB
<span id="torrentFiles"> |
|
<table class="torrentTable" cellpadding="0" cellspacing="0"> |
|
<thead> |
|
<tr> |
|
<th><a id="all_files_cb" style="margin-right: 2px;" class="tristate" onclick="javascript:switchCBState()"></a> _(Downloaded)</th> |
|
<th>_(Name)</th> |
|
<th>_(Size)</th> |
|
<th style="width: 90px;">_(Progress)</th> |
|
<th>_(Priority)</th> |
|
</tr> |
|
</thead> |
|
<tbody id="filesTable"></tbody> |
|
</table> |
|
</span> |
|
|
|
<script type="text/javascript"> |
|
var waitingTorrentFiles=false; |
|
var is_seed = true; |
|
var current_hash = ""; |
|
|
|
var setCBState = function(state) { |
|
if(state == "partial") { |
|
if(!$("all_files_cb").hasClass("partial")) { |
|
$("all_files_cb").removeClass("checked"); |
|
$("all_files_cb").addClass("partial"); |
|
} |
|
return; |
|
} |
|
if(state == "checked") { |
|
if(!$("all_files_cb").hasClass("checked")) { |
|
$("all_files_cb").removeClass("partial"); |
|
$("all_files_cb").addClass("checked"); |
|
} |
|
return; |
|
} |
|
$("all_files_cb").removeClass("partial"); |
|
$("all_files_cb").removeClass("checked"); |
|
} |
|
|
|
var switchCBState = function() { |
|
// Uncheck |
|
if($("all_files_cb").hasClass("partial")) { |
|
$("all_files_cb").removeClass("partial"); |
|
// Uncheck all checkboxes |
|
$$('input.DownloadedCB').each(function(item, index) { |
|
item.erase("checked"); |
|
setFilePriority(index, 0); |
|
}); |
|
return; |
|
} |
|
if($("all_files_cb").hasClass("checked")) { |
|
$("all_files_cb").removeClass("checked"); |
|
// Uncheck all checkboxes |
|
$$('input.DownloadedCB').each(function(item, index) { |
|
item.erase("checked"); |
|
setFilePriority(index, 0); |
|
}); |
|
return; |
|
} |
|
// Check |
|
$("all_files_cb").addClass("checked"); |
|
// Check all checkboxes |
|
$$('input.DownloadedCB').each(function(item, index) { |
|
item.set("checked", "checked"); |
|
setFilePriority(index, 1); |
|
}); |
|
} |
|
|
|
var allCBChecked = function() { |
|
var CBs = $$('input.DownloadedCB'); |
|
for(var i=0; i<CBs.length; i+=1) { |
|
var item = CBs[i]; |
|
if(!$defined(item.get('checked')) || !item.get('checked')) |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
var allCBUnchecked = function() { |
|
var CBs = $$('input.DownloadedCB'); |
|
for(var i=0; i<CBs.length; i+=1) { |
|
var item = CBs[i]; |
|
if($defined(item.get('checked')) && item.get('checked')) |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
var setFilePriority = function(id, priority) { |
|
if(current_hash == "") return; |
|
new Request({url: '/command/setFilePrio', method: 'post', data: {'hash': current_hash, 'id': id, 'priority': priority}}).send(); |
|
// Display or add combobox |
|
if(priority > 0) { |
|
$('comboPrio'+id).set("value", 1); |
|
$('comboPrio'+id).removeClass("invisible"); |
|
} else { |
|
$('comboPrio'+id).addClass("invisible"); |
|
} |
|
} |
|
|
|
var createDownloadedCB = function(id, downloaded) { |
|
var CB = new Element('input'); |
|
CB.set('type', 'checkbox'); |
|
if(downloaded) |
|
CB.set('checked', 'checked'); |
|
CB.set('id', 'cbPrio'+id); |
|
CB.set('class', 'DownloadedCB'); |
|
CB.addEvent('change', function(e){ |
|
var checked = 0; |
|
if($defined($('cbPrio'+id).get('checked')) && $('cbPrio'+id).get('checked')) |
|
checked = 1; |
|
setFilePriority(id, checked); |
|
if(allCBChecked()) { |
|
setCBState("checked"); |
|
} else { |
|
if(allCBUnchecked()) { |
|
setCBState("unchecked"); |
|
} else { |
|
setCBState("partial"); |
|
} |
|
} |
|
}); |
|
return CB; |
|
} |
|
|
|
var createPriorityCombo = function(id, selected_prio) { |
|
var select = new Element('select'); |
|
select.set('id', 'comboPrio'+id); |
|
select.addEvent('change', function(e){ |
|
var new_prio = $('comboPrio'+id).get('value'); |
|
setFilePriority(id, new_prio); |
|
}); |
|
var opt = new Element("option"); |
|
opt.set('value', '1') |
|
opt.set('html', "_(Normal)"); |
|
if(selected_prio <= 1) |
|
opt.setAttribute('selected', ''); |
|
opt.injectInside(select); |
|
opt = new Element("option"); |
|
opt.set('value', '2') |
|
opt.set('html', "_(High)"); |
|
if(selected_prio == 2) |
|
opt.setAttribute('selected', ''); |
|
opt.injectInside(select); |
|
opt = new Element("option"); |
|
opt.set('value', '7') |
|
opt.set('html', "_(Maximum)"); |
|
if(selected_prio == 7) |
|
opt.setAttribute('selected', ''); |
|
opt.injectInside(select); |
|
if(is_seed || selected_prio < 1) { |
|
select.addClass("invisible"); |
|
} else { |
|
select.removeClass("invisible"); |
|
} |
|
return select; |
|
} |
|
|
|
var filesDynTable = new Class ({ |
|
|
|
initialize: function(){ |
|
}, |
|
|
|
setup: function(table){ |
|
this.table = $(table); |
|
this.rows = new Hash(); |
|
}, |
|
|
|
removeRow: function(id){ |
|
if(this.rows.has(id)) { |
|
var tr = this.rows.get(id); |
|
tr.dispose(); |
|
this.rows.erase(id); |
|
return true; |
|
} |
|
return false; |
|
}, |
|
|
|
removeAllRows: function() { |
|
this.rows.each(function(tr, id) { |
|
this.removeRow(id); |
|
}.bind(this)); |
|
}, |
|
|
|
updateRow: function(tr, row, id){ |
|
var tds = tr.getElements('td'); |
|
for(var i=0; i<row.length; i++) { |
|
if(i==3) { |
|
$('pbf_'+id).setValue(row[i].toFloat()); |
|
} else { |
|
if(i==0) { |
|
if(row[i] > 0) |
|
tds[i].getChildren('input')[0].set('checked', 'checked'); |
|
else |
|
tds[i].getChildren('input')[0].removeProperty('checked') |
|
} else { |
|
if(i == 4) { |
|
if(!is_seed && row[i] > 0) { |
|
tds[i].getChildren('select').set('value', row[i]); |
|
$('comboPrio'+id).removeClass("invisible"); |
|
} else { |
|
if(!$('comboPrio'+id).hasClass("invisible")) |
|
$('comboPrio'+id).addClass("invisible"); |
|
} |
|
} else { |
|
tds[i].set('html', row[i]); |
|
} |
|
} |
|
} |
|
} |
|
return true; |
|
}, |
|
|
|
insertRow: function(id, row) { |
|
if(this.rows.has(id)) { |
|
var tr = this.rows.get(id); |
|
this.updateRow(tr, row, id); |
|
return; |
|
} |
|
//this.removeRow(id); |
|
var tr = new Element('tr'); |
|
this.rows.set(id, tr); |
|
for(var i=0; i<row.length; i++) |
|
{ |
|
var td = new Element('td'); |
|
if(i==3) { |
|
td.adopt(new ProgressBar(row[i].toFloat(), {'id': 'pbf_'+id, 'width':80})); |
|
} else { |
|
if(i == 0) { |
|
var tree_img = new Element('img', {src: 'images/L.gif', style: 'margin-bottom: -2px'}); |
|
td.adopt(tree_img, createDownloadedCB(id,row[i])); |
|
} else { |
|
if(i == 4) { |
|
td.adopt(createPriorityCombo(id,row[i])); |
|
} else { |
|
td.set('html', row[i]); |
|
} |
|
} |
|
} |
|
td.injectInside(tr); |
|
} |
|
tr.injectInside(this.table); |
|
}, |
|
}); |
|
|
|
var loadTorrentFilesData = function() { |
|
if(!$defined($('filesTable'))) { |
|
// Tab changed |
|
return; |
|
} |
|
var new_hash = myTable.getCurrentTorrentHash(); |
|
if(new_hash == "") { |
|
fTable.removeAllRows(); |
|
loadTorrentFilesData.delay(1500); |
|
return; |
|
} |
|
if(new_hash != current_hash) { |
|
fTable.removeAllRows(); |
|
current_hash = new_hash; |
|
} |
|
var url = 'json/propertiesFiles/'+current_hash; |
|
if (!waitingTorrentFiles) { |
|
waitingTorrentFiles=true; |
|
var request = new Request.JSON({ |
|
url: url, |
|
noCache: true, |
|
method: 'get', |
|
onFailure: function() { |
|
$('error_div').set('html', 'qBittorrent client is not reachable'); |
|
waitingTorrentFiles=false; |
|
loadTorrentFilesData.delay(2000); |
|
}, |
|
onSuccess: function(files) { |
|
$('error_div').set('html', ''); |
|
if(files){ |
|
// Update Trackers data |
|
var i=0; |
|
files.each(function(file){ |
|
if(i == 0) { |
|
is_seed = file.is_seed; |
|
} |
|
var row = new Array(); |
|
row.length = 4; |
|
row[0] = file.priority; |
|
row[1] = file.name; |
|
row[2] = file.size; |
|
row[3] = (file.progress*100).round(1); |
|
row[4] = file.priority; |
|
fTable.insertRow(i, row); |
|
i++; |
|
}.bind(this)); |
|
// Set global CB state |
|
if(allCBChecked()) { |
|
setCBState("checked"); |
|
} else { |
|
if(allCBUnchecked()) { |
|
setCBState("unchecked"); |
|
} else { |
|
setCBState("partial"); |
|
} |
|
} |
|
} else { |
|
fTable.removeAllRows(); |
|
} |
|
waitingTorrentFiles=false; |
|
loadTorrentFilesData.delay(1500); |
|
} |
|
}).send(); |
|
} |
|
|
|
} |
|
fTable = new filesDynTable(); |
|
fTable.setup($('filesTable')); |
|
// Initial loading |
|
loadTorrentFilesData(); |
|
</script>
|
|
|