deluge/deluge/ui/web/js/deluge-all/EditTrackersWindow.js
Calum Lind 358ff74d0e [Lint] Format files with Prettier
Use Prettier to auto-format javascript, CSS and YAML files so that less
manual work is involved and style is consistent across project.
2018-10-03 18:16:09 +01:00

240 lines
6.7 KiB
JavaScript

/*!
* Deluge.EditTrackers.js
*
* Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
*
* This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
* the additional special exception to link portions of this program with the OpenSSL library.
* See LICENSE for more details.
*/
Ext.ns('Deluge');
/**
* @class Deluge.EditTrackerWindow
* @extends Ext.Window
*/
Deluge.EditTrackersWindow = Ext.extend(Ext.Window, {
title: _('Edit Trackers'),
layout: 'fit',
width: 350,
height: 220,
plain: true,
closable: true,
resizable: true,
constrainHeader: true,
bodyStyle: 'padding: 5px',
buttonAlign: 'right',
closeAction: 'hide',
iconCls: 'x-deluge-edit-trackers',
initComponent: function() {
Deluge.EditTrackersWindow.superclass.initComponent.call(this);
this.addButton(_('Cancel'), this.onCancelClick, this);
this.addButton(_('OK'), this.onOkClick, this);
this.addEvents('save');
this.on('show', this.onShow, this);
this.on('save', this.onSave, this);
this.addWindow = new Deluge.AddTrackerWindow();
this.addWindow.on('add', this.onAddTrackers, this);
this.editWindow = new Deluge.EditTrackerWindow();
this.list = new Ext.list.ListView({
store: new Ext.data.JsonStore({
root: 'trackers',
fields: ['tier', 'url'],
}),
columns: [
{
header: _('Tier'),
width: 0.1,
dataIndex: 'tier',
},
{
header: _('Tracker'),
width: 0.9,
dataIndex: 'url',
},
],
columnSort: {
sortClasses: ['', ''],
},
stripeRows: true,
singleSelect: true,
listeners: {
dblclick: { fn: this.onListNodeDblClicked, scope: this },
selectionchange: { fn: this.onSelect, scope: this },
},
});
this.panel = this.add({
items: [this.list],
autoScroll: true,
bbar: new Ext.Toolbar({
items: [
{
text: _('Up'),
iconCls: 'icon-up',
handler: this.onUpClick,
scope: this,
},
{
text: _('Down'),
iconCls: 'icon-down',
handler: this.onDownClick,
scope: this,
},
'->',
{
text: _('Add'),
iconCls: 'icon-add',
handler: this.onAddClick,
scope: this,
},
{
text: _('Edit'),
iconCls: 'icon-edit-trackers',
handler: this.onEditClick,
scope: this,
},
{
text: _('Remove'),
iconCls: 'icon-remove',
handler: this.onRemoveClick,
scope: this,
},
],
}),
});
},
onAddClick: function() {
this.addWindow.show();
},
onAddTrackers: function(trackers) {
var store = this.list.getStore();
Ext.each(
trackers,
function(tracker) {
var duplicate = false,
heightestTier = -1;
store.each(function(record) {
if (record.get('tier') > heightestTier) {
heightestTier = record.get('tier');
}
if (tracker == record.get('tracker')) {
duplicate = true;
return false;
}
}, this);
if (duplicate) return;
store.add(
new store.recordType({
tier: heightestTier + 1,
url: tracker,
})
);
},
this
);
},
onCancelClick: function() {
this.hide();
},
onEditClick: function() {
var selected = this.list.getSelectedRecords()[0];
if (!selected) return;
this.editWindow.show(selected);
},
onHide: function() {
this.list.getStore().removeAll();
},
onListNodeDblClicked: function(list, index, node, e) {
this.editWindow.show(this.list.getRecord(node));
},
onOkClick: function() {
var trackers = [];
this.list.getStore().each(function(record) {
trackers.push({
tier: record.get('tier'),
url: record.get('url'),
});
}, this);
deluge.client.core.set_torrent_trackers(this.torrentId, trackers, {
failure: this.onSaveFail,
scope: this,
});
this.hide();
},
onRemoveClick: function() {
// Remove from the grid
var selected = this.list.getSelectedRecords()[0];
if (!selected) return;
this.list.getStore().remove(selected);
},
onRequestComplete: function(status) {
this.list.getStore().loadData(status);
this.list.getStore().sort('tier', 'ASC');
},
onSaveFail: function() {},
onSelect: function(list) {
if (list.getSelectionCount()) {
this.panel
.getBottomToolbar()
.items.get(4)
.enable();
}
},
onShow: function() {
this.panel
.getBottomToolbar()
.items.get(4)
.disable();
var r = deluge.torrents.getSelected();
this.torrentId = r.id;
deluge.client.core.get_torrent_status(r.id, ['trackers'], {
success: this.onRequestComplete,
scope: this,
});
},
onDownClick: function() {
var r = this.list.getSelectedRecords()[0];
if (!r) return;
r.set('tier', r.get('tier') + 1);
r.store.sort('tier', 'ASC');
r.store.commitChanges();
this.list.select(r.store.indexOf(r));
},
onUpClick: function() {
var r = this.list.getSelectedRecords()[0];
if (!r) return;
if (r.get('tier') == 0) return;
r.set('tier', r.get('tier') - 1);
r.store.sort('tier', 'ASC');
r.store.commitChanges();
this.list.select(r.store.indexOf(r));
},
});