summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/pref/prefs.php2
-rw-r--r--classes/pref/users.php2
-rw-r--r--js/App.js11
-rw-r--r--js/Article.js7
-rw-r--r--js/CommonDialogs.js33
-rw-r--r--js/CommonFilters.js208
-rw-r--r--js/Feeds.js112
-rw-r--r--js/PrefFeedTree.js134
-rw-r--r--js/PrefHelpers.js33
-rw-r--r--js/PrefLabelTree.js7
-rw-r--r--js/PrefUsers.js42
-rw-r--r--js/SingleUseDialog.js8
-rwxr-xr-xjs/prefs.js1
-rw-r--r--js/tt-rss.js1
-rw-r--r--plugins/mail/mail.js9
-rw-r--r--plugins/mailto/init.js9
-rw-r--r--plugins/note/note.js9
-rw-r--r--plugins/share/share.js12
18 files changed, 282 insertions, 358 deletions
diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php
index 45f9dc71e..d40dc87c0 100644
--- a/classes/pref/prefs.php
+++ b/classes/pref/prefs.php
@@ -8,7 +8,7 @@ class Pref_Prefs extends Handler_Protected {
private $profile_blacklist = [];
function csrf_ignore($method) {
- $csrf_ignored = array("index", "updateself", "editprefprofiles", "otpqrcode");
+ $csrf_ignored = array("index", "updateself", "otpqrcode");
return array_search($method, $csrf_ignored) !== false;
}
diff --git a/classes/pref/users.php b/classes/pref/users.php
index 16c2d3142..5c622a9b1 100644
--- a/classes/pref/users.php
+++ b/classes/pref/users.php
@@ -12,7 +12,7 @@ class Pref_Users extends Handler_Protected {
}
function csrf_ignore($method) {
- $csrf_ignored = array("index", "edit", "userdetails");
+ $csrf_ignored = array("index", "userdetails");
return array_search($method, $csrf_ignored) !== false;
}
diff --git a/js/App.js b/js/App.js
index 07cb45481..cd96dfe2a 100644
--- a/js/App.js
+++ b/js/App.js
@@ -1,6 +1,6 @@
'use strict';
-/* global __, Article, Ajax, Headlines, Filters */
+/* global __, Article, Ajax, Headlines, Filters, fox */
/* global xhrPost, xhrJson, dojo, dijit, PluginHost, Notify, $$, Feeds, Cookie */
/* global CommonDialogs, Plugins, Effect */
@@ -313,7 +313,7 @@ const App = {
},
helpDialog: function(topic) {
xhrPost("backend.php", {op: "backend", method: "help", topic: topic}, (transport) => {
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("Help"),
content: transport.responseText,
});
@@ -333,7 +333,7 @@ const App = {
let dialog = dijit.byId("infoBox");
if (!dialog) {
- dialog = new dijit.Dialog({
+ dialog = new fox.SingleUseDialog({
title: title,
id: 'infoBox',
onCancel: function () {
@@ -577,9 +577,6 @@ const App = {
}
try {
- if (dijit.byId("exceptionDlg"))
- dijit.byId("exceptionDlg").destroyRecursive();
-
let stack_msg = "";
if (error.stack)
@@ -599,7 +596,7 @@ const App = {
</div>
</div>`;
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "exceptionDlg",
title: params.title || __("Unhandled exception"),
content: content
diff --git a/js/Article.js b/js/Article.js
index 538377f45..d6e7bbad9 100644
--- a/js/Article.js
+++ b/js/Article.js
@@ -1,6 +1,6 @@
'use strict'
-/* global __, ngettext, App, Headlines, xhrPost, xhrJson, dojo, dijit, PluginHost, Notify, $$, Ajax */
+/* global __, ngettext, App, Headlines, xhrPost, xhrJson, dojo, dijit, PluginHost, Notify, $$, Ajax, fox */
const Article = {
_scroll_reset_timeout: false,
@@ -250,12 +250,9 @@ const Article = {
return false;
},
editTags: function (id) {
- if (dijit.byId("editTagsDlg"))
- dijit.byId("editTagsDlg").destroyRecursive();
-
xhrPost("backend.php", {op: "article", method: "editarticletags", param: id}, (transport) => {
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "editTagsDlg",
title: __("Edit article Tags"),
content: transport.responseText,
diff --git a/js/CommonDialogs.js b/js/CommonDialogs.js
index b41065c63..700867e73 100644
--- a/js/CommonDialogs.js
+++ b/js/CommonDialogs.js
@@ -1,6 +1,6 @@
'use strict'
-/* global __, ngettext, dojo, dijit, Notify, App, Feeds, $$, xhrPost, xhrJson, Tables, Effect */
+/* global __, ngettext, dojo, dijit, Notify, App, Feeds, $$, xhrPost, xhrJson, Tables, Effect, fox */
/* exported CommonDialogs */
const CommonDialogs = {
@@ -75,16 +75,11 @@ const CommonDialogs = {
return false;
},
quickAddFeed: function() {
-
- // overlapping widgets
- if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
- if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive();
-
xhrPost("backend.php",
{op: "feeds", method: "quickAddFeed"},
(transport) => {
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "feedAddDlg",
title: __("Subscribe to Feed"),
content: transport.responseText,
@@ -192,10 +187,7 @@ const CommonDialogs = {
showFeedsWithErrors: function() {
const query = {op: "pref-feeds", method: "feedsWithErrors"};
- if (dijit.byId("errorFeedsDlg"))
- dijit.byId("errorFeedsDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "errorFeedsDlg",
title: __("Feeds with update errors"),
getSelectedFeeds: function () {
@@ -298,13 +290,7 @@ const CommonDialogs = {
console.log("editFeed", query);
- if (dijit.byId("filterEditDlg"))
- dijit.byId("filterEditDlg").destroyRecursive();
-
- if (dijit.byId("feedEditDlg"))
- dijit.byId("feedEditDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "feedEditDlg",
title: __("Edit Feed"),
execute: function () {
@@ -363,10 +349,7 @@ const CommonDialogs = {
xhrJson("backend.php", {op: "pref-feeds", method: "getOPMLKey"}, (reply) => {
try {
- if (dijit.byId("publicOPMLDlg"))
- dijit.byId("publicOPMLDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("Public OPML URL"),
id: 'publicOPMLDlg',
onCancel: function () {
@@ -411,14 +394,10 @@ const CommonDialogs = {
xhrJson("backend.php", {op: "pref-feeds", method: "getFeedKey", id: feed, is_cat: is_cat}, (reply) => {
try {
- if (dijit.byId("genFeedDlg"))
- dijit.byId("genFeedDlg").destroyRecursive();
-
const feed_title = Feeds.getName(feed, is_cat);
-
const secret_url = rss_url + "&key=" + encodeURIComponent(reply.link);
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("Show as feed"),
id: 'genFeedDlg',
onCancel: function () {
diff --git a/js/CommonFilters.js b/js/CommonFilters.js
index e0e8034ea..1d5b9236b 100644
--- a/js/CommonFilters.js
+++ b/js/CommonFilters.js
@@ -1,6 +1,6 @@
'use strict'
-/* global __, App, Article, Lists, Effect */
+/* global __, App, Article, Lists, Effect, fox */
/* global xhrPost, dojo, dijit, Notify, $$, Feeds */
const Filters = {
@@ -138,10 +138,7 @@ const Filters = {
},
test: function(params) {
- if (dijit.byId("filterTestDlg"))
- dijit.byId("filterTestDlg").destroyRecursive();
-
- const test_dlg = new dijit.Dialog({
+ const test_dlg = new fox.SingleUseDialog({
id: "filterTestDlg",
title: "Test Filter",
results: 0,
@@ -249,128 +246,127 @@ const Filters = {
console.log('Filters.edit', query);
xhrPost("backend.php", query, function (transport) {
- if (dijit.byId("feedEditDlg"))
- dijit.byId("feedEditDlg").destroyRecursive();
-
- if (dijit.byId("filterEditDlg"))
- dijit.byId("filterEditDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
- id: "filterEditDlg",
- title: __("Create Filter"),
- test: function () {
- Filters.test(this.attr('value'));
- },
- selectRules: function (select) {
- Lists.select("filterDlg_Matches", select);
- },
- selectActions: function (select) {
- Lists.select("filterDlg_Actions", select);
- },
- editRule: function (e) {
- const li = e.closest('li');
- const rule = li.querySelector('input[name="rule[]"]').value
-
- Filters.addFilterRule(li, rule);
- },
- editAction: function (e) {
- const li = e.closest('li');
- const action = li.querySelector('input[name="action[]"]').value
-
- Filters.addFilterAction(li, action);
- },
- removeFilter: function () {
- const msg = __("Remove filter?");
-
- if (confirm(msg)) {
- this.hide();
-
- Notify.progress("Removing filter...");
-
- const query = {op: "pref-filters", method: "remove", ids: this.attr('value').id};
-
- xhrPost("backend.php", query, () => {
- const tree = dijit.byId("filterTree");
-
- if (tree) tree.reload();
+ try {
+ const dialog = new fox.SingleUseDialog({
+ id: "filterEditDlg",
+ title: __("Create Filter"),
+ test: function () {
+ Filters.test(this.attr('value'));
+ },
+ selectRules: function (select) {
+ Lists.select("filterDlg_Matches", select);
+ },
+ selectActions: function (select) {
+ Lists.select("filterDlg_Actions", select);
+ },
+ editRule: function (e) {
+ const li = e.closest('li');
+ const rule = li.querySelector('input[name="rule[]"]').value
+
+ Filters.addFilterRule(li, rule);
+ },
+ editAction: function (e) {
+ const li = e.closest('li');
+ const action = li.querySelector('input[name="action[]"]').value
+
+ Filters.addFilterAction(li, action);
+ },
+ removeFilter: function () {
+ const msg = __("Remove filter?");
+
+ if (confirm(msg)) {
+ this.hide();
+
+ Notify.progress("Removing filter...");
+
+ const query = {op: "pref-filters", method: "remove", ids: this.attr('value').id};
+
+ xhrPost("backend.php", query, () => {
+ const tree = dijit.byId("filterTree");
+
+ if (tree) tree.reload();
+ });
+ }
+ },
+ addAction: function () {
+ Filters.addFilterAction();
+ },
+ addRule: function () {
+ Filters.addFilterRule();
+ },
+ deleteAction: function () {
+ $$("#filterDlg_Actions li[class*=Selected]").each(function (e) {
+ e.parentNode.removeChild(e)
});
- }
- },
- addAction: function () {
- Filters.addFilterAction();
- },
- addRule: function () {
- Filters.addFilterRule();
- },
- deleteAction: function () {
- $$("#filterDlg_Actions li[class*=Selected]").each(function (e) {
- e.parentNode.removeChild(e)
- });
- },
- deleteRule: function () {
- $$("#filterDlg_Matches li[class*=Selected]").each(function (e) {
- e.parentNode.removeChild(e)
- });
- },
- execute: function () {
- if (this.validate()) {
+ },
+ deleteRule: function () {
+ $$("#filterDlg_Matches li[class*=Selected]").each(function (e) {
+ e.parentNode.removeChild(e)
+ });
+ },
+ execute: function () {
+ if (this.validate()) {
- Notify.progress("Saving data...", true);
+ Notify.progress("Saving data...", true);
- xhrPost("backend.php", this.attr('value'), () => {
- dialog.hide();
+ xhrPost("backend.php", this.attr('value'), () => {
+ dialog.hide();
- const tree = dijit.byId("filterTree");
- if (tree) tree.reload();
- });
- }
- },
- content: transport.responseText
- });
+ const tree = dijit.byId("filterTree");
+ if (tree) tree.reload();
+ });
+ }
+ },
+ content: transport.responseText
+ });
- if (!App.isPrefs()) {
- /* global getSelectionText */
- const selectedText = getSelectionText();
+ if (!App.isPrefs()) {
+ /* global getSelectionText */
+ const selectedText = getSelectionText();
- const lh = dojo.connect(dialog, "onShow", function () {
- dojo.disconnect(lh);
+ const lh = dojo.connect(dialog, "onShow", function () {
+ dojo.disconnect(lh);
- if (selectedText != "") {
+ if (selectedText != "") {
- const feed_id = Feeds.activeIsCat() ? 'CAT:' + parseInt(Feeds.getActive()) :
- Feeds.getActive();
+ const feed_id = Feeds.activeIsCat() ? 'CAT:' + parseInt(Feeds.getActive()) :
+ Feeds.getActive();
- const rule = {reg_exp: selectedText, feed_id: [feed_id], filter_type: 1};
+ const rule = {reg_exp: selectedText, feed_id: [feed_id], filter_type: 1};
- Filters.addFilterRule(null, dojo.toJson(rule));
+ Filters.addFilterRule(null, dojo.toJson(rule));
- } else {
+ } else {
- const query = {op: "rpc", method: "getlinktitlebyid", id: Article.getActive()};
+ const query = {op: "rpc", method: "getlinktitlebyid", id: Article.getActive()};
- xhrPost("backend.php", query, (transport) => {
- const reply = JSON.parse(transport.responseText);
+ xhrPost("backend.php", query, (transport) => {
+ const reply = JSON.parse(transport.responseText);
- let title = false;
+ let title = false;
- if (reply && reply.title) title = reply.title;
+ if (reply && reply.title) title = reply.title;
- if (title || Feeds.getActive() || Feeds.activeIsCat()) {
+ if (title || Feeds.getActive() || Feeds.activeIsCat()) {
- console.log(title + " " + Feeds.getActive());
+ console.log(title + " " + Feeds.getActive());
- const feed_id = Feeds.activeIsCat() ? 'CAT:' + parseInt(Feeds.getActive()) :
- Feeds.getActive();
+ const feed_id = Feeds.activeIsCat() ? 'CAT:' + parseInt(Feeds.getActive()) :
+ Feeds.getActive();
- const rule = {reg_exp: title, feed_id: [feed_id], filter_type: 1};
+ const rule = {reg_exp: title, feed_id: [feed_id], filter_type: 1};
- Filters.addFilterRule(null, dojo.toJson(rule));
- }
- });
- }
- });
+ Filters.addFilterRule(null, dojo.toJson(rule));
+ }
+ });
+ }
+ });
+ }
+ dialog.show();
+
+ } catch (e) {
+ App.Error.report(e);
}
- dialog.show();
});
},
};
diff --git a/js/Feeds.js b/js/Feeds.js
index 45b8193e4..986936285 100644
--- a/js/Feeds.js
+++ b/js/Feeds.js
@@ -1,6 +1,6 @@
'use strict'
-/* global __, App, Headlines, xhrPost, dojo, dijit, Form, fox, PluginHost, Notify, $$ */
+/* global __, App, Headlines, xhrPost, dojo, dijit, Form, fox, PluginHost, Notify, $$, fox */
const Feeds = {
counters_last_request: 0,
@@ -223,10 +223,7 @@ const Feeds = {
if (App.getInitParam("is_default_pw")) {
console.warn("user password is at default value");
- if (dijit.byId("defaultPasswordDlg"))
- dijit.byId("defaultPasswordDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("Your password is at default value"),
content: `<div class='alert alert-error'>
${__("You are using default tt-rss password. Please change it in the Preferences (Personal data / Authentication).")}
@@ -236,51 +233,26 @@ const Feeds = {
<button dojoType='dijit.form.Button' class='alt-primary' onclick="document.location.href = 'prefs.php'">
${__('Open Preferences')}
</button>
- <button dojoType='dijit.form.Button' onclick="return dijit.byId('defaultPasswordDlg').hide()">
+ <button dojoType='dijit.form.Button' onclick="App.dialogOf(this).hide()">
${__('Close this window')}
</button>
- </footer>`,
- id: 'defaultPasswordDlg',
- onCancel: function () {
- return true;
- },
- onExecute: function () {
- return true;
- },
- onClose: function () {
- return true;
- }
+ </footer>`
});
dialog.show();
}
- if (dijit.byId("safeModeDlg"))
- dijit.byId("safeModeDlg").destroyRecursive();
-
if (App.getInitParam("safe_mode")) {
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("Safe mode"),
- content: `
- <div class='alert alert-info'>
+ content: `<div class='alert alert-info'>
${__('Tiny Tiny RSS is running in safe mode. All themes and plugins are disabled. You will need to log out and back in to disable it.')}
</div>
<footer class='text-center'>
<button dojoType='dijit.form.Button' type='submit' class='alt-primary'>
${__('Close this window')}
</button>
- </footer>
- `,
- id: 'safeModeDlg',
- onCancel: function () {
- return true;
- },
- onExecute: function () {
- return true;
- },
- onClose: function () {
- return true;
- }
+ </footer>`
});
dialog.show();
@@ -598,43 +570,43 @@ const Feeds = {
{op: "feeds", method: "search",
param: Feeds.getActive() + ":" + Feeds.activeIsCat()},
(transport) => {
- if (dijit.byId("searchDlg"))
- dijit.byId("searchDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
- id: "searchDlg",
- content: transport.responseText,
- title: __("Search"),
- execute: function () {
- if (this.validate()) {
- Feeds._search_query = this.attr('value');
-
- // disallow empty queries
- if (!Feeds._search_query.query)
- Feeds._search_query = false;
-
- this.hide();
- Feeds.reloadCurrent();
+ try {
+ const dialog = new fox.SingleUseDialog({
+ id: "searchDlg",
+ content: transport.responseText,
+ title: __("Search"),
+ execute: function () {
+ if (this.validate()) {
+ Feeds._search_query = this.attr('value');
+
+ // disallow empty queries
+ if (!Feeds._search_query.query)
+ Feeds._search_query = false;
+
+ this.hide();
+ Feeds.reloadCurrent();
+ }
+ },
+ });
+
+ const tmph = dojo.connect(dialog, 'onShow', function () {
+ dojo.disconnect(tmph);
+
+ if (Feeds._search_query) {
+ if (Feeds._search_query.query)
+ dijit.byId('search_query')
+ .attr('value', Feeds._search_query.query);
+
+ if (Feeds._search_query.search_language)
+ dijit.byId('search_language')
+ .attr('value', Feeds._search_query.search_language);
}
- },
- });
-
- const tmph = dojo.connect(dialog, 'onShow', function () {
- dojo.disconnect(tmph);
-
- if (Feeds._search_query) {
- if (Feeds._search_query.query)
- dijit.byId('search_query')
- .attr('value', Feeds._search_query.query);
-
- if (Feeds._search_query.search_language)
- dijit.byId('search_language')
- .attr('value', Feeds._search_query.search_language);
- }
-
- });
+ });
- dialog.show();
+ dialog.show();
+ } catch (e) {
+ App.Error.report(e);
+ }
});
},
diff --git a/js/PrefFeedTree.js b/js/PrefFeedTree.js
index 21b8ee272..c8c8118c1 100644
--- a/js/PrefFeedTree.js
+++ b/js/PrefFeedTree.js
@@ -1,4 +1,4 @@
-/* global __, lib, dijit, define, dojo, CommonDialogs, Notify, Tables, xhrPost */
+/* global __, lib, dijit, define, dojo, CommonDialogs, Notify, Tables, xhrPost, fox, App */
define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], function (declare, domConstruct) {
@@ -250,64 +250,65 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], functio
Notify.progress("Loading, please wait...");
- if (dijit.byId("feedEditDlg"))
- dijit.byId("feedEditDlg").destroyRecursive();
-
xhrPost("backend.php", {op: "pref-feeds", method: "editfeeds", ids: rows.toString()}, (transport) => {
Notify.close();
- const dialog = new dijit.Dialog({
- id: "feedEditDlg",
- title: __("Edit Multiple Feeds"),
- getChildByName: function (name) {
- let rv = null;
- this.getChildren().each(
- function (child) {
- if (child.name == name) {
- rv = child;
- return;
- }
- });
- return rv;
- },
- toggleField: function (checkbox, elem, label) {
- this.getChildByName(elem).attr('disabled', !checkbox.checked);
-
- if ($(label))
- if (checkbox.checked)
- $(label).removeClassName('text-muted');
- else
- $(label).addClassName('text-muted');
-
- },
- execute: function () {
- if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
- const query = this.attr('value');
-
- /* normalize unchecked checkboxes because [] is not serialized */
-
- Object.keys(query).each((key) => {
- let val = query[key];
-
- if (typeof val == "object" && val.length == 0)
- query[key] = ["off"];
- });
-
- Notify.progress("Saving data...", true);
-
- xhrPost("backend.php", query, () => {
- dialog.hide();
-
- const tree = dijit.byId("feedTree");
-
- if (tree) tree.reload();
- });
- }
- },
- content: transport.responseText
- });
+ try {
+ const dialog = new fox.SingleUseDialog({
+ id: "feedEditDlg",
+ title: __("Edit Multiple Feeds"),
+ getChildByName: function (name) {
+ let rv = null;
+ this.getChildren().each(
+ function (child) {
+ if (child.name == name) {
+ rv = child;
+ return;
+ }
+ });
+ return rv;
+ },
+ toggleField: function (checkbox, elem, label) {
+ this.getChildByName(elem).attr('disabled', !checkbox.checked);
+
+ if ($(label))
+ if (checkbox.checked)
+ $(label).removeClassName('text-muted');
+ else
+ $(label).addClassName('text-muted');
+
+ },
+ execute: function () {
+ if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
+ const query = this.attr('value');
+
+ /* normalize unchecked checkboxes because [] is not serialized */
+
+ Object.keys(query).each((key) => {
+ let val = query[key];
+
+ if (typeof val == "object" && val.length == 0)
+ query[key] = ["off"];
+ });
+
+ Notify.progress("Saving data...", true);
+
+ xhrPost("backend.php", query, () => {
+ dialog.hide();
+
+ const tree = dijit.byId("feedTree");
+
+ if (tree) tree.reload();
+ });
+ }
+ },
+ content: transport.responseText
+ });
- dialog.show();
+ dialog.show();
+ } catch (e) {
+ App.Error.report(e);
+ }
});
},
editCategory: function(id, item) {
@@ -339,13 +340,7 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], functio
}
},
batchSubscribe: function() {
- const query = "backend.php?op=pref-feeds&method=batchSubscribe";
-
- // overlapping widgets
- if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
- if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "batchSubDlg",
title: __("Batch subscribe"),
execute: function () {
@@ -362,18 +357,13 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], functio
});
}
},
- href: query
+ href: "backend.php?" + dojo.objectToQuery({op: 'pref-feeds', method: 'batchSubscribe'})
});
dialog.show();
},
showInactiveFeeds: function() {
- const query = "backend.php?op=pref-feeds&method=inactiveFeeds";
-
- if (dijit.byId("inactiveFeedsDlg"))
- dijit.byId("inactiveFeedsDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "inactiveFeedsDlg",
title: __("Feeds without recent updates"),
getSelectedFeeds: function () {
@@ -405,11 +395,7 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], functio
alert(__("No feeds selected."));
}
},
- execute: function () {
- if (this.validate()) {
- }
- },
- href: query
+ href: 'backend.php?' + dojo.objectToQuery({op: 'pref-feeds', method: 'inactiveFeeds'})
});
dialog.show();
diff --git a/js/PrefHelpers.js b/js/PrefHelpers.js
index dd8fef5c6..4e0161625 100644
--- a/js/PrefHelpers.js
+++ b/js/PrefHelpers.js
@@ -1,6 +1,6 @@
'use strict';
-/* global __, dijit, dojo, Tables, xhrPost, Notify, xhrJson, App */
+/* global __, dijit, dojo, Tables, xhrPost, Notify, xhrJson, App, fox */
const Helpers = {
AppPasswords: {
@@ -83,14 +83,7 @@ const Helpers = {
},
},
editProfiles: function() {
-
- if (dijit.byId("profileEditDlg"))
- dijit.byId("profileEditDlg").destroyRecursive();
-
- const query = "backend.php?op=pref-prefs&method=editPrefProfiles";
-
- // noinspection JSUnusedGlobalSymbols
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "profileEditDlg",
title: __("Settings Profiles"),
getSelectedProfiles: function () {
@@ -110,7 +103,7 @@ const Helpers = {
xhrPost("backend.php", query, () => {
Notify.close();
- Helpers.editProfiles();
+ dialog.refresh();
});
}
@@ -126,11 +119,16 @@ const Helpers = {
xhrPost("backend.php", query, () => {
Notify.close();
- Helpers.editProfiles();
+ dialog.refresh();
});
}
},
+ refresh: function() {
+ xhrPost("backend.php", {op: 'pref-prefs', method: 'editPrefProfiles'}, (transport) => {
+ dialog.attr('content', transport.responseText);
+ });
+ },
execute: function () {
const sel_rows = this.getSelectedProfiles();
@@ -147,15 +145,16 @@ const Helpers = {
alert(__("Please choose a profile to activate."));
}
},
- href: query
+ content: ""
});
+ dialog.refresh();
dialog.show();
},
customizeCSS: function() {
xhrJson("backend.php", {op: "pref-prefs", method: "customizeCSS"}, (reply) => {
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("Customize stylesheet"),
apply: function() {
xhrPost("backend.php", this.attr('value'), () => {
@@ -245,13 +244,15 @@ const Helpers = {
xhr.onload = function () {
Notify.close();
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
title: __("OPML Import"),
onCancel: function () {
- window.location.reload();
+ this.execute();
},
execute: function () {
- window.location.reload();
+ const tree = dijit.byId('feedTree');
+
+ if (tree) tree.reload();
},
content: `
<div class='alert alert-info'>
diff --git a/js/PrefLabelTree.js b/js/PrefLabelTree.js
index 857adfb24..65dc7ea3b 100644
--- a/js/PrefLabelTree.js
+++ b/js/PrefLabelTree.js
@@ -1,4 +1,4 @@
-/* global __, define, lib, dijit, dojo, xhrPost, Notify */
+/* global __, define, lib, dijit, dojo, xhrPost, Notify, fox */
define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree", "dijit/form/DropDownButton"], function (declare, domConstruct) {
@@ -62,10 +62,7 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree", "dijit/f
const query = "backend.php?op=pref-labels&method=edit&id=" +
encodeURIComponent(id);
- if (dijit.byId("labelEditDlg"))
- dijit.byId("labelEditDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "labelEditDlg",
title: __("Label Editor"),
style: "width: 650px",
diff --git a/js/PrefUsers.js b/js/PrefUsers.js
index a332a9140..0a7e635fe 100644
--- a/js/PrefUsers.js
+++ b/js/PrefUsers.js
@@ -1,7 +1,7 @@
'use strict'
/* global __ */
-/* global xhrPost, dojo, dijit, Notify, Tables */
+/* global xhrPost, dojo, dijit, Notify, Tables, fox */
const Users = {
reload: function(sort) {
@@ -27,29 +27,25 @@ const Users = {
}
},
edit: function(id) {
- const query = "backend.php?op=pref-users&method=edit&id=" +
- encodeURIComponent(id);
-
- if (dijit.byId("userEditDlg"))
- dijit.byId("userEditDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
- id: "userEditDlg",
- title: __("User Editor"),
- execute: function () {
- if (this.validate()) {
- Notify.progress("Saving data...", true);
-
- xhrPost("backend.php", dojo.formToObject("user_edit_form"), (/* transport */) => {
- dialog.hide();
- Users.reload();
- });
- }
- },
- href: query
- });
+ xhrPost('backend.php', {op: 'pref-users', method: 'edit', id: id}, (transport) => {
+ const dialog = new fox.SingleUseDialog({
+ id: "userEditDlg",
+ title: __("User Editor"),
+ execute: function () {
+ if (this.validate()) {
+ Notify.progress("Saving data...", true);
+
+ xhrPost("backend.php", dojo.formToObject("user_edit_form"), (/* transport */) => {
+ dialog.hide();
+ Users.reload();
+ });
+ }
+ },
+ content: transport.responseText
+ });
- dialog.show();
+ dialog.show();
+ });
},
resetSelected: function() {
const rows = this.getSelection();
diff --git a/js/SingleUseDialog.js b/js/SingleUseDialog.js
new file mode 100644
index 000000000..944f24c6f
--- /dev/null
+++ b/js/SingleUseDialog.js
@@ -0,0 +1,8 @@
+/* global dijit, define */
+define(["dojo/_base/declare", "dijit/Dialog"], function (declare) {
+ return declare("fox.SingleUseDialog", dijit.Dialog, {
+ onHide: function() {
+ this.destroyRecursive();
+ }
+ });
+});
diff --git a/js/prefs.js b/js/prefs.js
index a71b4f39e..803a7edf3 100755
--- a/js/prefs.js
+++ b/js/prefs.js
@@ -51,6 +51,7 @@ require(["dojo/_base/kernel",
"fox/PrefFilterTree",
"fox/PrefLabelTree",
"fox/Toolbar",
+ "fox/SingleUseDialog",
"fox/form/ValidationTextArea",
"fox/form/Select",
"fox/form/ComboButton",
diff --git a/js/tt-rss.js b/js/tt-rss.js
index 83c6681cd..7bf166b51 100644
--- a/js/tt-rss.js
+++ b/js/tt-rss.js
@@ -50,6 +50,7 @@ require(["dojo/_base/kernel",
"fox/FeedStoreModel",
"fox/FeedTree",
"fox/Toolbar",
+ "fox/SingleUseDialog",
"fox/form/ValidationTextArea",
"fox/form/Select",
"fox/form/ComboButton",
diff --git a/plugins/mail/mail.js b/plugins/mail/mail.js
index 89e395221..5ddc0dc41 100644
--- a/plugins/mail/mail.js
+++ b/plugins/mail/mail.js
@@ -1,7 +1,9 @@
+/* global Plugins, Headlines, xhrJson, Notify, fox, __ */
+
Plugins.Mail = {
send: function(id) {
if (!id) {
- let ids = Headlines.getSelected();
+ const ids = Headlines.getSelected();
if (ids.length == 0) {
alert(__("No articles selected."));
@@ -11,12 +13,9 @@ Plugins.Mail = {
id = ids.toString();
}
- if (dijit.byId("emailArticleDlg"))
- dijit.byId("emailArticleDlg").destroyRecursive();
-
const query = "backend.php?op=pluginhandler&plugin=mail&method=emailArticle&param=" + encodeURIComponent(id);
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "emailArticleDlg",
title: __("Forward article by email"),
execute: function () {
diff --git a/plugins/mailto/init.js b/plugins/mailto/init.js
index 6a1d2ef19..ae68bf49b 100644
--- a/plugins/mailto/init.js
+++ b/plugins/mailto/init.js
@@ -1,3 +1,5 @@
+/* global Plugins, Headlines, fox, __ */
+
Plugins.Mailto = {
send: function (id) {
if (!id) {
@@ -11,12 +13,9 @@ Plugins.Mailto = {
id = ids.toString();
}
- if (dijit.byId("emailArticleDlg"))
- dijit.byId("emailArticleDlg").destroyRecursive();
-
const query = "backend.php?op=pluginhandler&plugin=mailto&method=emailArticle&param=" + encodeURIComponent(id);
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "emailArticleDlg",
title: __("Forward article by email"),
href: query});
@@ -30,4 +29,4 @@ Plugins.Mail = Plugins.Mail || {};
Plugins.Mail.onHotkey = function(id) {
Plugins.Mailto.send(id);
-}; \ No newline at end of file
+};
diff --git a/plugins/note/note.js b/plugins/note/note.js
index fec7b04be..ab2ed9208 100644
--- a/plugins/note/note.js
+++ b/plugins/note/note.js
@@ -1,11 +1,10 @@
+/* global Plugins, xhrJson, Notify, fox, __ */
+
Plugins.Note = {
edit: function(id) {
const query = "backend.php?op=pluginhandler&plugin=note&method=edit&param=" + encodeURIComponent(id);
- if (dijit.byId("editNoteDlg"))
- dijit.byId("editNoteDlg").destroyRecursive();
-
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "editNoteDlg",
title: __("Edit article note"),
execute: function () {
@@ -36,4 +35,4 @@ Plugins.Note = {
dialog.show();
}
-}; \ No newline at end of file
+};
diff --git a/plugins/share/share.js b/plugins/share/share.js
index 507f27f84..3fc42d654 100644
--- a/plugins/share/share.js
+++ b/plugins/share/share.js
@@ -1,11 +1,10 @@
+/* global Plugins, xhrJson, Notify, fox, xhrPost, __ */
+
Plugins.Share = {
shareArticle: function(id) {
- if (dijit.byId("shareArticleDlg"))
- dijit.byId("shareArticleDlg").destroyRecursive();
-
const query = "backend.php?op=pluginhandler&plugin=share&method=shareArticle&param=" + encodeURIComponent(id);
- const dialog = new dijit.Dialog({
+ const dialog = new fox.SingleUseDialog({
id: "shareArticleDlg",
title: __("Share article by URL"),
newurl: function () {
@@ -73,7 +72,4 @@ Plugins.Share = {
const img = $("SHARE-IMG-" + id);
img.addClassName("shared");
}
-};
-
-
-
+}