From 3d11c61f326ef133427f6f37de4429e879c725f2 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 12 Feb 2021 15:22:10 +0300 Subject: [PATCH] * OPML import: don't reload everything, just feed tree * dialogs: use auto-destroying dialog for almost all dialogs instead of destroying them manually * some general dialog-related cleanup --- classes/pref/prefs.php | 2 +- classes/pref/users.php | 2 +- js/App.js | 11 +- js/Article.js | 7 +- js/CommonDialogs.js | 33 ++---- js/CommonFilters.js | 222 ++++++++++++++++++++--------------------- js/Feeds.js | 106 ++++++++------------ js/PrefFeedTree.js | 116 ++++++++++----------- js/PrefHelpers.js | 33 +++--- js/PrefLabelTree.js | 7 +- js/PrefUsers.js | 38 ++++--- js/SingleUseDialog.js | 8 ++ js/prefs.js | 1 + js/tt-rss.js | 1 + plugins/mail/mail.js | 9 +- plugins/mailto/init.js | 9 +- plugins/note/note.js | 9 +- plugins/share/share.js | 12 +-- 18 files changed, 275 insertions(+), 351 deletions(-) create mode 100644 js/SingleUseDialog.js 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 = { `; - 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(); + 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 - if (dijit.byId("filterEditDlg")) - dijit.byId("filterEditDlg").destroyRecursive(); + Filters.addFilterRule(li, rule); + }, + editAction: function (e) { + const li = e.closest('li'); + const action = li.querySelector('input[name="action[]"]').value - 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.addFilterAction(li, action); + }, + removeFilter: function () { + const msg = __("Remove filter?"); - Filters.addFilterRule(li, rule); - }, - editAction: function (e) { - const li = e.closest('li'); - const action = li.querySelector('input[name="action[]"]').value + if (confirm(msg)) { + this.hide(); - Filters.addFilterAction(li, action); - }, - removeFilter: function () { - const msg = __("Remove filter?"); + Notify.progress("Removing filter..."); - if (confirm(msg)) { - this.hide(); + const query = {op: "pref-filters", method: "remove", ids: this.attr('value').id}; - Notify.progress("Removing filter..."); + xhrPost("backend.php", query, () => { + const tree = dijit.byId("filterTree"); - 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(); + 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()) { - - Notify.progress("Saving data...", true); - - xhrPost("backend.php", this.attr('value'), () => { - dialog.hide(); - - const tree = dijit.byId("filterTree"); - if (tree) tree.reload(); + }, + deleteRule: function () { + $$("#filterDlg_Matches li[class*=Selected]").each(function (e) { + e.parentNode.removeChild(e) }); - } - }, - content: transport.responseText - }); + }, + execute: function () { + if (this.validate()) { - if (!App.isPrefs()) { - /* global getSelectionText */ - const selectedText = getSelectionText(); + Notify.progress("Saving data...", true); - const lh = dojo.connect(dialog, "onShow", function () { - dojo.disconnect(lh); + xhrPost("backend.php", this.attr('value'), () => { + dialog.hide(); - if (selectedText != "") { - - const feed_id = Feeds.activeIsCat() ? 'CAT:' + parseInt(Feeds.getActive()) : - Feeds.getActive(); - - const rule = {reg_exp: selectedText, feed_id: [feed_id], filter_type: 1}; - - Filters.addFilterRule(null, dojo.toJson(rule)); - - } else { - - const query = {op: "rpc", method: "getlinktitlebyid", id: Article.getActive()}; - - xhrPost("backend.php", query, (transport) => { - const reply = JSON.parse(transport.responseText); - - let title = false; - - if (reply && reply.title) title = reply.title; - - if (title || Feeds.getActive() || Feeds.activeIsCat()) { - - console.log(title + " " + 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}; - - Filters.addFilterRule(null, dojo.toJson(rule)); - } - }); - } + const tree = dijit.byId("filterTree"); + if (tree) tree.reload(); + }); + } + }, + content: transport.responseText }); + + if (!App.isPrefs()) { + /* global getSelectionText */ + const selectedText = getSelectionText(); + + const lh = dojo.connect(dialog, "onShow", function () { + dojo.disconnect(lh); + + if (selectedText != "") { + + const feed_id = Feeds.activeIsCat() ? 'CAT:' + parseInt(Feeds.getActive()) : + Feeds.getActive(); + + const rule = {reg_exp: selectedText, feed_id: [feed_id], filter_type: 1}; + + Filters.addFilterRule(null, dojo.toJson(rule)); + + } else { + + const query = {op: "rpc", method: "getlinktitlebyid", id: Article.getActive()}; + + xhrPost("backend.php", query, (transport) => { + const reply = JSON.parse(transport.responseText); + + let title = false; + + if (reply && reply.title) title = reply.title; + + if (title || Feeds.getActive() || Feeds.activeIsCat()) { + + console.log(title + " " + 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}; + + 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: `
${__("You are using default tt-rss password. Please change it in the Preferences (Personal data / Authentication).")} @@ -236,51 +233,26 @@ const Feeds = { - - `, - id: 'defaultPasswordDlg', - onCancel: function () { - return true; - }, - onExecute: function () { - return true; - }, - onClose: function () { - return true; - } + ` }); 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: ` -
+ content: `
${__('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.')}
-
- `, - id: 'safeModeDlg', - onCancel: function () { - return true; - }, - onExecute: function () { - return true; - }, - onClose: function () { - return true; - } + ` }); 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(); + try { + const dialog = new fox.SingleUseDialog({ + id: "searchDlg", + content: transport.responseText, + title: __("Search"), + execute: function () { + if (this.validate()) { + Feeds._search_query = this.attr('value'); - 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; - // disallow empty queries - if (!Feeds._search_query.query) - Feeds._search_query = false; + this.hide(); + Feeds.reloadCurrent(); + } + }, + }); - 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); + 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'); + 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'); + }, + execute: function () { + if (this.validate() && confirm(__("Save changes to selected feeds?"))) { + const query = this.attr('value'); - /* normalize unchecked checkboxes because [] is not serialized */ + /* normalize unchecked checkboxes because [] is not serialized */ - Object.keys(query).each((key) => { - let val = query[key]; + Object.keys(query).each((key) => { + let val = query[key]; - if (typeof val == "object" && val.length == 0) - query[key] = ["off"]; - }); + if (typeof val == "object" && val.length == 0) + query[key] = ["off"]; + }); - Notify.progress("Saving data...", true); + Notify.progress("Saving data...", true); - xhrPost("backend.php", query, () => { - dialog.hide(); + xhrPost("backend.php", query, () => { + dialog.hide(); - const tree = dijit.byId("feedTree"); + const tree = dijit.byId("feedTree"); - if (tree) tree.reload(); - }); - } - }, - content: transport.responseText - }); + 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: `
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); + 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); - if (dijit.byId("userEditDlg")) - dijit.byId("userEditDlg").destroyRecursive(); + xhrPost("backend.php", dojo.formToObject("user_edit_form"), (/* transport */) => { + dialog.hide(); + Users.reload(); + }); + } + }, + content: transport.responseText + }); - 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 + 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¶m=" + 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¶m=" + 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¶m=" + 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¶m=" + 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"); } -}; - - - +}