diff --git a/src/webui/www/private/index.html b/src/webui/www/private/index.html
index 2bb6f9e55..31aee6fc1 100644
--- a/src/webui/www/private/index.html
+++ b/src/webui/www/private/index.html
@@ -19,6 +19,7 @@
+
diff --git a/src/webui/www/private/scripts/client.js b/src/webui/www/private/scripts/client.js
index 6b9455d28..87fca4150 100644
--- a/src/webui/www/private/scripts/client.js
+++ b/src/webui/www/private/scripts/client.js
@@ -64,17 +64,17 @@ let tagList = {};
let selectedTag = TAGS_ALL;
let setTagFilter = function() {};
-let selected_filter = getLocalStorageItem('selected_filter', 'all');
+let selected_filter = LocalPreferences.get('selected_filter', 'all');
let setFilter = function() {};
let toggleFilterDisplay = function() {};
const loadSelectedCategory = function() {
- selected_category = getLocalStorageItem('selected_category', CATEGORIES_ALL);
+ selected_category = LocalPreferences.get('selected_category', CATEGORIES_ALL);
};
loadSelectedCategory();
const loadSelectedTag = function() {
- selectedTag = getLocalStorageItem('selected_tag', TAGS_ALL);
+ selectedTag = LocalPreferences.get('selected_tag', TAGS_ALL);
};
loadSelectedTag();
@@ -115,8 +115,8 @@ window.addEvent('load', function() {
const saveColumnSizes = function() {
const filters_width = $('Filters').getSize().x;
const properties_height_rel = $('propertiesPanel').getSize().y / Window.getSize().y;
- localStorage.setItem('filters_width', filters_width);
- localStorage.setItem('properties_height_rel', properties_height_rel);
+ LocalPreferences.set('filters_width', filters_width);
+ LocalPreferences.set('properties_height_rel', properties_height_rel);
};
window.addEvent('resize', function() {
@@ -133,7 +133,7 @@ window.addEvent('load', function() {
MochaUI.Desktop.initialize();
const buildTransfersTab = function() {
- let filt_w = localStorage.getItem('filters_width');
+ let filt_w = LocalPreferences.get('filters_width');
if ($defined(filt_w))
filt_w = filt_w.toInt();
else
@@ -169,7 +169,7 @@ window.addEvent('load', function() {
setCategoryFilter = function(hash) {
selected_category = hash;
- localStorage.setItem('selected_category', selected_category);
+ LocalPreferences.set('selected_category', selected_category);
highlightSelectedCategory();
if (typeof torrentsTable.tableBody != 'undefined')
updateMainData();
@@ -177,7 +177,7 @@ window.addEvent('load', function() {
setTagFilter = function(hash) {
selectedTag = hash.toString();
- localStorage.setItem('selected_tag', selectedTag);
+ LocalPreferences.set('selected_tag', selectedTag);
highlightSelectedTag();
if (torrentsTable.tableBody !== undefined)
updateMainData();
@@ -196,7 +196,7 @@ window.addEvent('load', function() {
$("errored_filter").removeClass("selectedFilter");
$(f + "_filter").addClass("selectedFilter");
selected_filter = f;
- localStorage.setItem('selected_filter', f);
+ LocalPreferences.set('selected_filter', f);
// Reload torrents
if (typeof torrentsTable.tableBody != 'undefined')
updateMainData();
@@ -204,7 +204,7 @@ window.addEvent('load', function() {
toggleFilterDisplay = function(filter) {
const element = filter + "FilterList";
- localStorage.setItem('filter_' + filter + "_collapsed", !$(element).hasClass("invisible"));
+ LocalPreferences.set('filter_' + filter + "_collapsed", !$(element).hasClass("invisible"));
$(element).toggleClass("invisible")
const parent = $(element).getParent(".filterWrapper");
const toggleIcon = $(parent).getChildren(".filterTitle img");
@@ -234,8 +234,8 @@ window.addEvent('load', function() {
// Show Top Toolbar is enabled by default
let showTopToolbar = true;
- if (localStorage.getItem('show_top_toolbar') !== null)
- showTopToolbar = localStorage.getItem('show_top_toolbar') == "true";
+ if (LocalPreferences.get('show_top_toolbar') !== null)
+ showTopToolbar = LocalPreferences.get('show_top_toolbar') == "true";
if (!showTopToolbar) {
$('showTopToolbarLink').firstChild.style.opacity = '0';
$('mochaToolbar').addClass('invisible');
@@ -243,19 +243,19 @@ window.addEvent('load', function() {
// Show Status Bar is enabled by default
let showStatusBar = true;
- if (localStorage.getItem('show_status_bar') !== null)
- showStatusBar = localStorage.getItem('show_status_bar') === "true";
+ if (LocalPreferences.get('show_status_bar') !== null)
+ showStatusBar = LocalPreferences.get('show_status_bar') === "true";
if (!showStatusBar) {
$('showStatusBarLink').firstChild.style.opacity = '0';
$('desktopFooterWrapper').addClass('invisible');
}
- let speedInTitle = localStorage.getItem('speed_in_browser_title_bar') == "true";
+ let speedInTitle = LocalPreferences.get('speed_in_browser_title_bar') == "true";
if (!speedInTitle)
$('speedInBrowserTitleBarLink').firstChild.style.opacity = '0';
// After showing/hiding the toolbar + status bar
- let showSearchEngine = localStorage.getItem('show_search_engine') !== "false";
+ let showSearchEngine = LocalPreferences.get('show_search_engine') !== "false";
if (!showSearchEngine) {
// uncheck menu option
$('showSearchEngineLink').firstChild.style.opacity = '0';
@@ -705,7 +705,7 @@ window.addEvent('load', function() {
$('showTopToolbarLink').addEvent('click', function(e) {
showTopToolbar = !showTopToolbar;
- localStorage.setItem('show_top_toolbar', showTopToolbar.toString());
+ LocalPreferences.set('show_top_toolbar', showTopToolbar.toString());
if (showTopToolbar) {
$('showTopToolbarLink').firstChild.style.opacity = '1';
$('mochaToolbar').removeClass('invisible');
@@ -719,7 +719,7 @@ window.addEvent('load', function() {
$('showStatusBarLink').addEvent('click', function(e) {
showStatusBar = !showStatusBar;
- localStorage.setItem('show_status_bar', showStatusBar.toString());
+ LocalPreferences.set('show_status_bar', showStatusBar.toString());
if (showStatusBar) {
$('showStatusBarLink').firstChild.style.opacity = '1';
$('desktopFooterWrapper').removeClass('invisible');
@@ -737,7 +737,7 @@ window.addEvent('load', function() {
$('speedInBrowserTitleBarLink').addEvent('click', function(e) {
speedInTitle = !speedInTitle;
- localStorage.setItem('speed_in_browser_title_bar', speedInTitle.toString());
+ LocalPreferences.set('speed_in_browser_title_bar', speedInTitle.toString());
if (speedInTitle)
$('speedInBrowserTitleBarLink').firstChild.style.opacity = '1';
else
@@ -747,7 +747,7 @@ window.addEvent('load', function() {
$('showSearchEngineLink').addEvent('click', function(e) {
showSearchEngine = !showSearchEngine;
- localStorage.setItem('show_search_engine', showSearchEngine.toString());
+ LocalPreferences.set('show_search_engine', showSearchEngine.toString());
if (showSearchEngine) {
$('showSearchEngineLink').firstChild.style.opacity = '1';
$('mainWindowTabs').removeClass('invisible');
@@ -853,7 +853,7 @@ window.addEvent('load', function() {
onResize: saveColumnSizes,
height: null
});
- let prop_h = localStorage.getItem('properties_height_rel');
+ let prop_h = LocalPreferences.get('properties_height_rel');
if ($defined(prop_h))
prop_h = prop_h.toFloat() * Window.getSize().y;
else
@@ -895,7 +895,7 @@ window.addEvent('load', function() {
$('prop_general').removeClass("invisible");
hideFilesFilter();
updatePropertiesPanel();
- localStorage.setItem('selected_tab', this.id);
+ LocalPreferences.set('selected_tab', this.id);
});
$('PropTrackersLink').addEvent('click', function(e) {
@@ -903,7 +903,7 @@ window.addEvent('load', function() {
$('prop_trackers').removeClass("invisible");
hideFilesFilter();
updatePropertiesPanel();
- localStorage.setItem('selected_tab', this.id);
+ LocalPreferences.set('selected_tab', this.id);
});
$('PropPeersLink').addEvent('click', function(e) {
@@ -911,7 +911,7 @@ window.addEvent('load', function() {
$('prop_peers').removeClass("invisible");
hideFilesFilter();
updatePropertiesPanel();
- localStorage.setItem('selected_tab', this.id);
+ LocalPreferences.set('selected_tab', this.id);
});
$('PropWebSeedsLink').addEvent('click', function(e) {
@@ -919,7 +919,7 @@ window.addEvent('load', function() {
$('prop_webseeds').removeClass("invisible");
hideFilesFilter();
updatePropertiesPanel();
- localStorage.setItem('selected_tab', this.id);
+ LocalPreferences.set('selected_tab', this.id);
});
$('PropFilesLink').addEvent('click', function(e) {
@@ -927,7 +927,7 @@ window.addEvent('load', function() {
$('prop_files').removeClass("invisible");
showFilesFilter();
updatePropertiesPanel();
- localStorage.setItem('selected_tab', this.id);
+ LocalPreferences.set('selected_tab', this.id);
});
$('propertiesPanel_collapseToggle').addEvent('click', function(e) {
diff --git a/src/webui/www/private/scripts/dynamicTable.js b/src/webui/www/private/scripts/dynamicTable.js
index 5c5fc8b2b..81d308a8c 100644
--- a/src/webui/www/private/scripts/dynamicTable.js
+++ b/src/webui/www/private/scripts/dynamicTable.js
@@ -50,8 +50,8 @@ const DynamicTable = new Class({
this.selectedRows = [];
this.columns = [];
this.contextMenu = contextMenu;
- this.sortedColumn = getLocalStorageItem('sorted_column_' + this.dynamicTableDivId, 0);
- this.reverseSort = getLocalStorageItem('reverse_sort_' + this.dynamicTableDivId, '0');
+ this.sortedColumn = LocalPreferences.get('sorted_column_' + this.dynamicTableDivId, 0);
+ this.reverseSort = LocalPreferences.get('reverse_sort_' + this.dynamicTableDivId, '0');
this.initColumns();
this.loadColumnsOrder();
this.updateTableHeaders();
@@ -214,15 +214,15 @@ const DynamicTable = new Class({
resetElementBorderStyle(this.lastHoverTh);
el.setStyle('background-color', '');
if (this.currentHeaderAction === 'resize')
- localStorage.setItem('column_' + this.resizeTh.columnName + '_width_' + this.dynamicTableDivId, this.columns[this.resizeTh.columnName].width);
+ LocalPreferences.set('column_' + this.resizeTh.columnName + '_width_' + this.dynamicTableDivId, this.columns[this.resizeTh.columnName].width);
if ((this.currentHeaderAction === 'drag') && (el !== this.lastHoverTh)) {
this.saveColumnsOrder();
- const val = localStorage.getItem('columns_order_' + this.dynamicTableDivId).split(',');
+ const val = LocalPreferences.get('columns_order_' + this.dynamicTableDivId).split(',');
val.erase(el.columnName);
let pos = val.indexOf(this.lastHoverTh.columnName);
if (this.dropSide === 'right') ++pos;
val.splice(pos, 0, el.columnName);
- localStorage.setItem('columns_order_' + this.dynamicTableDivId, val.join(','));
+ LocalPreferences.set('columns_order_' + this.dynamicTableDivId, val.join(','));
this.loadColumnsOrder();
this.updateTableHeaders();
while (this.tableBody.firstChild)
@@ -283,7 +283,7 @@ const DynamicTable = new Class({
showColumn: function(columnName, show) {
this.columns[columnName].visible = show ? '1' : '0';
- localStorage.setItem('column_' + columnName + '_visible_' + this.dynamicTableDivId, show ? '1' : '0');
+ LocalPreferences.set('column_' + columnName + '_visible_' + this.dynamicTableDivId, show ? '1' : '0');
this.updateColumn(columnName);
},
@@ -339,11 +339,11 @@ const DynamicTable = new Class({
const column = {};
column['name'] = name;
column['title'] = name;
- column['visible'] = getLocalStorageItem('column_' + name + '_visible_' + this.dynamicTableDivId, defaultVisible ? '1' : '0');
+ column['visible'] = LocalPreferences.get('column_' + name + '_visible_' + this.dynamicTableDivId, defaultVisible ? '1' : '0');
column['force_hide'] = false;
column['caption'] = caption;
column['style'] = style;
- column['width'] = getLocalStorageItem('column_' + name + '_width_' + this.dynamicTableDivId, defaultWidth);
+ column['width'] = LocalPreferences.get('column_' + name + '_width_' + this.dynamicTableDivId, defaultWidth);
column['dataProperties'] = [name];
column['getRowValue'] = function(row, pos) {
if (pos === undefined)
@@ -372,7 +372,7 @@ const DynamicTable = new Class({
loadColumnsOrder: function() {
const columnsOrder = [];
- const val = localStorage.getItem('columns_order_' + this.dynamicTableDivId);
+ const val = LocalPreferences.get('columns_order_' + this.dynamicTableDivId);
if (val === null || val === undefined) return;
val.split(',').forEach(function(v) {
if ((v in this.columns) && (!columnsOrder.contains(v)))
@@ -394,7 +394,7 @@ const DynamicTable = new Class({
val += ',';
val += this.columns[i].name;
}
- localStorage.setItem('columns_order_' + this.dynamicTableDivId, val);
+ LocalPreferences.set('columns_order_' + this.dynamicTableDivId, val);
},
updateTableHeaders: function() {
@@ -456,7 +456,7 @@ const DynamicTable = new Class({
},
getSortedColumn: function() {
- return localStorage.getItem('sorted_column_' + this.dynamicTableDivId);
+ return LocalPreferences.get('sorted_column_' + this.dynamicTableDivId);
},
setSortedColumn: function(column) {
@@ -471,8 +471,8 @@ const DynamicTable = new Class({
this.reverseSort = this.reverseSort === '0' ? '1' : '0';
this.setSortedColumnIcon(column, null, (this.reverseSort === '1'));
}
- localStorage.setItem('sorted_column_' + this.dynamicTableDivId, column);
- localStorage.setItem('reverse_sort_' + this.dynamicTableDivId, this.reverseSort);
+ LocalPreferences.set('sorted_column_' + this.dynamicTableDivId, column);
+ LocalPreferences.set('reverse_sort_' + this.dynamicTableDivId, this.reverseSort);
this.updateTable(false);
},
diff --git a/src/webui/www/private/scripts/mocha-init.js b/src/webui/www/private/scripts/mocha-init.js
index 023a1befb..9bae8c74f 100644
--- a/src/webui/www/private/scripts/mocha-init.js
+++ b/src/webui/www/private/scripts/mocha-init.js
@@ -38,26 +38,7 @@
----------------------------------------------------------------- */
'use strict';
-/* Define localStorage object for older browsers */
-if (typeof localStorage == 'undefined') {
- window['localStorage'] = {
- getItem: function(name) {
- return Cookie.read(name);
- },
- setItem: function(name, value) {
- Cookie.write(name, value, {
- duration: 365 * 10
- });
- }
- };
-}
-
-function getLocalStorageItem(name, defaultVal) {
- let val = localStorage.getItem(name);
- if (val === null || val === undefined)
- val = defaultVal;
- return val;
-}
+const LocalPreferences = new LocalPreferencesClass();
let saveWindowSize = function() {};
let loadWindowWidth = function() {};
@@ -107,16 +88,16 @@ let setQueuePositionFN = function() {};
const initializeWindows = function() {
saveWindowSize = function(windowId) {
const size = $(windowId).getSize();
- localStorage.setItem('window_' + windowId + '_width', size.x);
- localStorage.setItem('window_' + windowId + '_height', size.y);
+ LocalPreferences.set('window_' + windowId + '_width', size.x);
+ LocalPreferences.set('window_' + windowId + '_height', size.y);
};
loadWindowWidth = function(windowId, defaultValue) {
- return getLocalStorageItem('window_' + windowId + '_width', defaultValue);
+ return LocalPreferences.get('window_' + windowId + '_width', defaultValue);
};
loadWindowHeight = function(windowId, defaultValue) {
- return getLocalStorageItem('window_' + windowId + '_height', defaultValue);
+ return LocalPreferences.get('window_' + windowId + '_height', defaultValue);
};
function addClickEvent(el, fn) {
diff --git a/src/webui/www/private/scripts/preferences.js b/src/webui/www/private/scripts/preferences.js
new file mode 100644
index 000000000..9d21fa4ab
--- /dev/null
+++ b/src/webui/www/private/scripts/preferences.js
@@ -0,0 +1,47 @@
+/*
+ * Bittorrent Client using Qt and libtorrent.
+ * Copyright (C) 2019 Thomas Piccirello
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give permission to
+ * link this program with the OpenSSL project's "OpenSSL" library (or with
+ * modified versions of it that use the same license as the "OpenSSL" library),
+ * and distribute the linked executables. You must obey the GNU General Public
+ * License in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s), you may extend this exception to your version of the file(s),
+ * but you are not obligated to do so. If you do not wish to do so, delete this
+ * exception statement from your version.
+ */
+
+'use strict';
+
+const LocalPreferencesClass = new Class({
+ get: function(key, defaultValue) {
+ const value = localStorage.getItem(key);
+ return ((value === null) && (defaultValue !== undefined))
+ ? defaultValue
+ : value;
+ },
+
+ set: function(key, value) {
+ try {
+ localStorage.setItem(key, value);
+ }
+ catch (err) {
+ console.error(err);
+ }
+ }
+})
diff --git a/src/webui/www/private/views/filters.html b/src/webui/www/private/views/filters.html
index a438750d7..61b33b933 100644
--- a/src/webui/www/private/views/filters.html
+++ b/src/webui/www/private/views/filters.html
@@ -99,12 +99,12 @@
}
});
- if (localStorage.getItem('filter_status_collapsed') === "true")
+ if (LocalPreferences.get('filter_status_collapsed') === "true")
toggleFilterDisplay('status');
- if (localStorage.getItem('filter_category_collapsed') === "true")
+ if (LocalPreferences.get('filter_category_collapsed') === "true")
toggleFilterDisplay('category');
- if (localStorage.getItem('filter_tag_collapsed') === "true")
+ if (LocalPreferences.get('filter_tag_collapsed') === "true")
toggleFilterDisplay('tag');
diff --git a/src/webui/www/private/views/properties.html b/src/webui/www/private/views/properties.html
index 3e0370800..d1f55cf38 100644
--- a/src/webui/www/private/views/properties.html
+++ b/src/webui/www/private/views/properties.html
@@ -155,7 +155,7 @@
diff --git a/src/webui/www/private/views/search.html b/src/webui/www/private/views/search.html
index 65df12129..20ecc1813 100644
--- a/src/webui/www/private/views/search.html
+++ b/src/webui/www/private/views/search.html
@@ -186,7 +186,7 @@
const initSearchTab = function() {
// load "Search in" preference from local storage
- $('searchInTorrentName').set('value', (localStorage.getItem('search_in_filter') === "names") ? "names" : "everywhere");
+ $('searchInTorrentName').set('value', (LocalPreferences.get('search_in_filter') === "names") ? "names" : "everywhere");
const searchResultsTableContextMenu = new ContextMenu({
targets: '.searchTableRow',
menu: 'searchResultsTableMenu',
@@ -520,9 +520,9 @@
const searchInTorrentName = function() {
if ($('searchInTorrentName').get('value') === "names")
- localStorage.setItem('search_in_filter', "names");
+ LocalPreferences.set('search_in_filter', "names");
else
- localStorage.setItem('search_in_filter', "everywhere");
+ LocalPreferences.set('search_in_filter', "everywhere");
searchFilterChanged();
};
diff --git a/src/webui/www/webui.qrc b/src/webui/www/webui.qrc
index 8b8a241f8..697be476e 100644
--- a/src/webui/www/webui.qrc
+++ b/src/webui/www/webui.qrc
@@ -29,6 +29,7 @@
private/scripts/lib/mootools-1.2-more.js
private/scripts/misc.js
private/scripts/mocha-init.js
+ private/scripts/preferences.js
private/scripts/progressbar.js
private/scripts/prop-files.js
private/scripts/prop-general.js