split several utility objects into separate dojo modules
parent
796368320e
commit
fda3ad39c8
@ -0,0 +1,392 @@
|
||||
define(["dojo/_base/declare"], function (declare) {
|
||||
return declare("fox.CommonDialogs", null, {
|
||||
quickAddFeed: function() {
|
||||
const query = "backend.php?op=feeds&method=quickAddFeed";
|
||||
|
||||
// overlapping widgets
|
||||
if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
|
||||
if (dijit.byId("feedAddDlg")) dijit.byId("feedAddDlg").destroyRecursive();
|
||||
|
||||
const dialog = new dijit.Dialog({
|
||||
id: "feedAddDlg",
|
||||
title: __("Subscribe to Feed"),
|
||||
style: "width: 600px",
|
||||
show_error: function (msg) {
|
||||
const elem = $("fadd_error_message");
|
||||
|
||||
elem.innerHTML = msg;
|
||||
|
||||
if (!Element.visible(elem))
|
||||
new Effect.Appear(elem);
|
||||
|
||||
},
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
console.log(dojo.objectToQuery(this.attr('value')));
|
||||
|
||||
const feed_url = this.attr('value').feed;
|
||||
|
||||
Element.show("feed_add_spinner");
|
||||
Element.hide("fadd_error_message");
|
||||
|
||||
xhrPost("backend.php", this.attr('value'), (transport) => {
|
||||
try {
|
||||
|
||||
try {
|
||||
var reply = JSON.parse(transport.responseText);
|
||||
} catch (e) {
|
||||
Element.hide("feed_add_spinner");
|
||||
alert(__("Failed to parse output. This can indicate server timeout and/or network issues. Backend output was logged to browser console."));
|
||||
console.log('quickAddFeed, backend returned:' + transport.responseText);
|
||||
return;
|
||||
}
|
||||
|
||||
const rc = reply['result'];
|
||||
|
||||
notify('');
|
||||
Element.hide("feed_add_spinner");
|
||||
|
||||
console.log(rc);
|
||||
|
||||
switch (parseInt(rc['code'])) {
|
||||
case 1:
|
||||
dialog.hide();
|
||||
notify_info(__("Subscribed to %s").replace("%s", feed_url));
|
||||
|
||||
Feeds.reload();
|
||||
break;
|
||||
case 2:
|
||||
dialog.show_error(__("Specified URL seems to be invalid."));
|
||||
break;
|
||||
case 3:
|
||||
dialog.show_error(__("Specified URL doesn't seem to contain any feeds."));
|
||||
break;
|
||||
case 4:
|
||||
const feeds = rc['feeds'];
|
||||
|
||||
Element.show("fadd_multiple_notify");
|
||||
|
||||
const select = dijit.byId("feedDlg_feedContainerSelect");
|
||||
|
||||
while (select.getOptions().length > 0)
|
||||
select.removeOption(0);
|
||||
|
||||
select.addOption({value: '', label: __("Expand to select feed")});
|
||||
|
||||
let count = 0;
|
||||
for (const feedUrl in feeds) {
|
||||
if (feeds.hasOwnProperty(feedUrl)) {
|
||||
select.addOption({value: feedUrl, label: feeds[feedUrl]});
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
Effect.Appear('feedDlg_feedsContainer', {duration: 0.5});
|
||||
|
||||
break;
|
||||
case 5:
|
||||
dialog.show_error(__("Couldn't download the specified URL: %s").replace("%s", rc['message']));
|
||||
break;
|
||||
case 6:
|
||||
dialog.show_error(__("XML validation failed: %s").replace("%s", rc['message']));
|
||||
break;
|
||||
case 0:
|
||||
dialog.show_error(__("You are already subscribed to this feed."));
|
||||
break;
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
console.error(transport.responseText);
|
||||
exception_error(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
href: query
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
showFeedsWithErrors: function() {
|
||||
const query = {op: "pref-feeds", method: "feedsWithErrors"};
|
||||
|
||||
if (dijit.byId("errorFeedsDlg"))
|
||||
dijit.byId("errorFeedsDlg").destroyRecursive();
|
||||
|
||||
const dialog = new dijit.Dialog({
|
||||
id: "errorFeedsDlg",
|
||||
title: __("Feeds with update errors"),
|
||||
style: "width: 600px",
|
||||
getSelectedFeeds: function () {
|
||||
return Tables.getSelected("prefErrorFeedList");
|
||||
},
|
||||
removeSelected: function () {
|
||||
const sel_rows = this.getSelectedFeeds();
|
||||
|
||||
if (sel_rows.length > 0) {
|
||||
if (confirm(__("Remove selected feeds?"))) {
|
||||
notify_progress("Removing selected feeds...", true);
|
||||
|
||||
const query = {
|
||||
op: "pref-feeds", method: "remove",
|
||||
ids: sel_rows.toString()
|
||||
};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
notify('');
|
||||
dialog.hide();
|
||||
Feeds.reload();
|
||||
});
|
||||
}
|
||||
|
||||
} else {
|
||||
alert(__("No feeds selected."));
|
||||
}
|
||||
},
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
//
|
||||
}
|
||||
},
|
||||
href: "backend.php?" + dojo.objectToQuery(query)
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
feedBrowser: function() {
|
||||
const query = {op: "feeds", method: "feedBrowser"};
|
||||
|
||||
if (dijit.byId("feedAddDlg"))
|
||||
dijit.byId("feedAddDlg").hide();
|
||||
|
||||
if (dijit.byId("feedBrowserDlg"))
|
||||
dijit.byId("feedBrowserDlg").destroyRecursive();
|
||||
|
||||
// noinspection JSUnusedGlobalSymbols
|
||||
const dialog = new dijit.Dialog({
|
||||
id: "feedBrowserDlg",
|
||||
title: __("More Feeds"),
|
||||
style: "width: 600px",
|
||||
getSelectedFeedIds: function () {
|
||||
const list = $$("#browseFeedList li[id*=FBROW]");
|
||||
const selected = [];
|
||||
|
||||
list.each(function (child) {
|
||||
const id = child.id.replace("FBROW-", "");
|
||||
|
||||
if (child.hasClassName('Selected')) {
|
||||
selected.push(id);
|
||||
}
|
||||
});
|
||||
|
||||
return selected;
|
||||
},
|
||||
getSelectedFeeds: function () {
|
||||
const list = $$("#browseFeedList li.Selected");
|
||||
const selected = [];
|
||||
|
||||
list.each(function (child) {
|
||||
const title = child.getElementsBySelector("span.fb_feedTitle")[0].innerHTML;
|
||||
const url = child.getElementsBySelector("a.fb_feedUrl")[0].href;
|
||||
|
||||
selected.push([title, url]);
|
||||
|
||||
});
|
||||
|
||||
return selected;
|
||||
},
|
||||
|
||||
subscribe: function () {
|
||||
const mode = this.attr('value').mode;
|
||||
let selected = [];
|
||||
|
||||
if (mode == "1")
|
||||
selected = this.getSelectedFeeds();
|
||||
else
|
||||
selected = this.getSelectedFeedIds();
|
||||
|
||||
if (selected.length > 0) {
|
||||
dijit.byId("feedBrowserDlg").hide();
|
||||
|
||||
notify_progress("Loading, please wait...", true);
|
||||
|
||||
const query = {
|
||||
op: "rpc", method: "massSubscribe",
|
||||
payload: JSON.stringify(selected), mode: mode
|
||||
};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
notify('');
|
||||
Feeds.reload();
|
||||
});
|
||||
|
||||
} else {
|
||||
alert(__("No feeds selected."));
|
||||
}
|
||||
|
||||
},
|
||||
update: function () {
|
||||
Element.show('feed_browser_spinner');
|
||||
|
||||
xhrPost("backend.php", dialog.attr("value"), (transport) => {
|
||||
notify('');
|
||||
|
||||
Element.hide('feed_browser_spinner');
|
||||
|
||||
const reply = JSON.parse(transport.responseText);
|
||||
const mode = reply['mode'];
|
||||
|
||||
if ($("browseFeedList") && reply['content']) {
|
||||
$("browseFeedList").innerHTML = reply['content'];
|
||||
}
|
||||
|
||||
dojo.parser.parse("browseFeedList");
|
||||
|
||||
if (mode == 2) {
|
||||
Element.show(dijit.byId('feed_archive_remove').domNode);
|
||||
} else {
|
||||
Element.hide(dijit.byId('feed_archive_remove').domNode);
|
||||
}
|
||||
});
|
||||
},
|
||||
removeFromArchive: function () {
|
||||
const selected = this.getSelectedFeedIds();
|
||||
|
||||
if (selected.length > 0) {
|
||||
if (confirm(__("Remove selected feeds from the archive? Feeds with stored articles will not be removed."))) {
|
||||
Element.show('feed_browser_spinner');
|
||||
|
||||
const query = {op: "rpc", method: "remarchive", ids: selected.toString()};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
dialog.update();
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
this.subscribe();
|
||||
}
|
||||
},
|
||||
href: "backend.php?" + dojo.objectToQuery(query)
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
addLabel: function(select, callback) {
|
||||
const caption = prompt(__("Please enter label caption:"), "");
|
||||
|
||||
if (caption != undefined && caption.trim().length > 0) {
|
||||
|
||||
const query = {op: "pref-labels", method: "add", caption: caption.trim()};
|
||||
|
||||
if (select)
|
||||
Object.extend(query, {output: "select"});
|
||||
|
||||
notify_progress("Loading, please wait...", true);
|
||||
|
||||
xhrPost("backend.php", query, (transport) => {
|
||||
if (callback) {
|
||||
callback(transport);
|
||||
} else if (App.isPrefs()) {
|
||||
dijit.byId("labelTree").reload();
|
||||
} else {
|
||||
Feeds.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
unsubscribeFeed: function(feed_id, title) {
|
||||
|
||||
const msg = __("Unsubscribe from %s?").replace("%s", title);
|
||||
|
||||
if (title == undefined || confirm(msg)) {
|
||||
notify_progress("Removing feed...");
|
||||
|
||||
const query = {op: "pref-feeds", quiet: 1, method: "remove", ids: feed_id};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").hide();
|
||||
|
||||
if (App.isPrefs()) {
|
||||
Feeds.reload();
|
||||
} else {
|
||||
if (feed_id == Feeds.getActive())
|
||||
setTimeout(() => {
|
||||
Feeds.open({feed: -5})
|
||||
},
|
||||
100);
|
||||
|
||||
if (feed_id < 0) Feeds.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
editFeed: function (feed) {
|
||||
if (feed <= 0)
|
||||
return alert(__("You can't edit this kind of feed."));
|
||||
|
||||
const query = {op: "pref-feeds", method: "editfeed", id: feed};
|
||||
|
||||
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({
|
||||
id: "feedEditDlg",
|
||||
title: __("Edit Feed"),
|
||||
style: "width: 600px",
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
notify_progress("Saving data...", true);
|
||||
|
||||
xhrPost("backend.php", dialog.attr('value'), () => {
|
||||
dialog.hide();
|
||||
notify('');
|
||||
Feeds.reload();
|
||||
});
|
||||
}
|
||||
},
|
||||
href: "backend.php?" + dojo.objectToQuery(query)
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
genUrlChangeKey: function(feed, is_cat) {
|
||||
if (confirm(__("Generate new syndication address for this feed?"))) {
|
||||
|
||||
notify_progress("Trying to change address...", true);
|
||||
|
||||
const query = {op: "pref-feeds", method: "regenFeedKey", id: feed, is_cat: is_cat};
|
||||
|
||||
xhrJson("backend.php", query, (reply) => {
|
||||
const new_link = reply.link;
|
||||
const e = $('gen_feed_url');
|
||||
|
||||
if (new_link) {
|
||||
e.innerHTML = e.innerHTML.replace(/&key=.*$/,
|
||||
"&key=" + new_link);
|
||||
|
||||
e.href = e.href.replace(/&key=.*$/,
|
||||
"&key=" + new_link);
|
||||
|
||||
new Effect.Highlight(e);
|
||||
|
||||
notify('');
|
||||
|
||||
} else {
|
||||
notify_error("Could not change feed URL.");
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
@ -0,0 +1,389 @@
|
||||
define(["dojo/_base/declare"], function (declare) {
|
||||
return declare("fox.CommonFilters", null, {
|
||||
filterDlgCheckAction: function(sender) {
|
||||
const action = sender.value;
|
||||
|
||||
const action_param = $("filterDlg_paramBox");
|
||||
|
||||
if (!action_param) {
|
||||
console.log("filterDlgCheckAction: can't find action param box!");
|
||||
return;
|
||||
}
|
||||
|
||||
// if selected action supports parameters, enable params field
|
||||
if (action == 4 || action == 6 || action == 7 || action == 9) {
|
||||
new Effect.Appear(action_param, {duration: 0.5});
|
||||
|
||||
Element.hide(dijit.byId("filterDlg_actionParam").domNode);
|
||||
Element.hide(dijit.byId("filterDlg_actionParamLabel").domNode);
|
||||
Element.hide(dijit.byId("filterDlg_actionParamPlugin").domNode);
|
||||
|
||||
if (action == 7) {
|
||||
Element.show(dijit.byId("filterDlg_actionParamLabel").domNode);
|
||||
} else if (action == 9) {
|
||||
Element.show(dijit.byId("filterDlg_actionParamPlugin").domNode);
|
||||
} else {
|
||||
Element.show(dijit.byId("filterDlg_actionParam").domNode);
|
||||
}
|
||||
|
||||
} else {
|
||||
Element.hide(action_param);
|
||||
}
|
||||
},
|
||||
createNewRuleElement: function(parentNode, replaceNode) {
|
||||
const form = document.forms["filter_new_rule_form"];
|
||||
const query = {op: "pref-filters", method: "printrulename", rule: dojo.formToJson(form)};
|
||||
|
||||
xhrPost("backend.php", query, (transport) => {
|
||||
try {
|
||||
const li = dojo.create("li");
|
||||
|
||||
const cb = dojo.create("input", {type: "checkbox"}, li);
|
||||
|
||||
new dijit.form.CheckBox({
|
||||
onChange: function () {
|
||||
Lists.onRowChecked(this);
|
||||
},
|
||||
}, cb);
|
||||
|
||||
dojo.create("input", {
|
||||
type: "hidden",
|
||||
name: "rule[]",
|
||||
value: dojo.formToJson(form)
|
||||
}, li);
|
||||
|
||||
dojo.create("span", {
|
||||
onclick: function () {
|
||||
dijit.byId('filterEditDlg').editRule(this);
|
||||
},
|
||||
innerHTML: transport.responseText
|
||||
}, li);
|
||||
|
||||
if (replaceNode) {
|
||||
parentNode.replaceChild(li, replaceNode);
|
||||
} else {
|
||||
parentNode.appendChild(li);
|
||||
}
|
||||
} catch (e) {
|
||||
exception_error(e);
|
||||
}
|
||||
});
|
||||
},
|
||||
createNewActionElement: function(parentNode, replaceNode) {
|
||||
const form = document.forms["filter_new_action_form"];
|
||||
|
||||
if (form.action_id.value == 7) {
|
||||
form.action_param.value = form.action_param_label.value;
|
||||
} else if (form.action_id.value == 9) {
|
||||
form.action_param.value = form.action_param_plugin.value;
|
||||
}
|
||||
|
||||
const query = {
|
||||
op: "pref-filters", method: "printactionname",
|
||||
action: dojo.formToJson(form)
|
||||
};
|
||||
|
||||
xhrPost("backend.php", query, (transport) => {
|
||||
try {
|
||||
const li = dojo.create("li");
|
||||
|
||||
const cb = dojo.create("input", {type: "checkbox"}, li);
|
||||
|
||||
new dijit.form.CheckBox({
|
||||
onChange: function () {
|
||||
Lists.onRowChecked(this);
|
||||
},
|
||||
}, cb);
|
||||
|
||||
dojo.create("input", {
|
||||
type: "hidden",
|
||||
name: "action[]",
|
||||
value: dojo.formToJson(form)
|
||||
}, li);
|
||||
|
||||
dojo.create("span", {
|
||||
onclick: function () {
|
||||
dijit.byId('filterEditDlg').editAction(this);
|
||||
},
|
||||
innerHTML: transport.responseText
|
||||
}, li);
|
||||
|
||||
if (replaceNode) {
|
||||
parentNode.replaceChild(li, replaceNode);
|
||||
} else {
|
||||
parentNode.appendChild(li);
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
exception_error(e);
|
||||
}
|
||||
});
|
||||
},
|
||||
addFilterRule: function(replaceNode, ruleStr) {
|
||||
if (dijit.byId("filterNewRuleDlg"))
|
||||
dijit.byId("filterNewRuleDlg").destroyRecursive();
|
||||
|
||||
const query = "backend.php?op=pref-filters&method=newrule&rule=" +
|
||||
param_escape(ruleStr);
|
||||
|
||||
const rule_dlg = new dijit.Dialog({
|
||||
id: "filterNewRuleDlg",
|
||||
title: ruleStr ? __("Edit rule") : __("Add rule"),
|
||||
style: "width: 600px",
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
Filters.createNewRuleElement($("filterDlg_Matches"), replaceNode);
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
href: query
|
||||
});
|
||||
|
||||
rule_dlg.show();
|
||||
},
|
||||
addFilterAction: function(replaceNode, actionStr) {
|
||||
if (dijit.byId("filterNewActionDlg"))
|
||||
dijit.byId("filterNewActionDlg").destroyRecursive();
|
||||
|
||||
const query = "backend.php?op=pref-filters&method=newaction&action=" +
|
||||
param_escape(actionStr);
|
||||
|
||||
const rule_dlg = new dijit.Dialog({
|
||||
id: "filterNewActionDlg",
|
||||
title: actionStr ? __("Edit action") : __("Add action"),
|
||||
style: "width: 600px",
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
Filters.createNewActionElement($("filterDlg_Actions"), replaceNode);
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
href: query
|
||||
});
|
||||
|
||||
rule_dlg.show();
|
||||
},
|
||||
editFilterTest: function(query) {
|
||||
|
||||
if (dijit.byId("filterTestDlg"))
|
||||
dijit.byId("filterTestDlg").destroyRecursive();
|
||||
|
||||
const test_dlg = new dijit.Dialog({
|
||||
id: "filterTestDlg",
|
||||
title: "Test Filter",
|
||||
style: "width: 600px",
|
||||
results: 0,
|
||||
limit: 100,
|
||||
max_offset: 10000,
|
||||
getTestResults: function (query, offset) {
|
||||
const updquery = query + "&offset=" + offset + "&limit=" + test_dlg.limit;
|
||||
|
||||
console.log("getTestResults:" + offset);
|
||||
|
||||
xhrPost("backend.php", updquery, (transport) => {
|
||||
try {
|
||||
const result = JSON.parse(transport.responseText);
|
||||
|
||||
if (result && dijit.byId("filterTestDlg") && dijit.byId("filterTestDlg").open) {
|
||||
test_dlg.results += result.length;
|
||||
|
||||
console.log("got results:" + result.length);
|
||||
|
||||
$("prefFilterProgressMsg").innerHTML = __("Looking for articles (%d processed, %f found)...")
|
||||
.replace("%f", test_dlg.results)
|
||||
.replace("%d", offset);
|
||||
|
||||
console.log(offset + " " + test_dlg.max_offset);
|
||||
|
||||
for (let i = 0; i < result.length; i++) {
|
||||
const tmp = new Element("table");
|
||||
tmp.innerHTML = result[i];
|
||||
dojo.parser.parse(tmp);
|
||||
|
||||
$("prefFilterTestResultList").innerHTML += tmp.innerHTML;
|
||||
}
|
||||
|
||||
if (test_dlg.results < 30 && offset < test_dlg.max_offset) {
|
||||
|
||||
// get the next batch
|
||||
window.setTimeout(function () {
|
||||
test_dlg.getTestResults(query, offset + test_dlg.limit);
|
||||
}, 0);
|
||||
|
||||
} else {
|
||||
// all done
|
||||
|
||||
Element.hide("prefFilterLoadingIndicator");
|
||||
|
||||
if (test_dlg.results == 0) {
|
||||
$("prefFilterTestResultList").innerHTML = "<tr><td align='center'>No recent articles matching this filter have been found.</td></tr>";
|
||||
$("prefFilterProgressMsg").innerHTML = "Articles matching this filter:";
|
||||
} else {
|
||||
$("prefFilterProgressMsg").innerHTML = __("Found %d articles matching this filter:")
|
||||
.replace("%d", test_dlg.results);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else if (!result) {
|
||||
console.log("getTestResults: can't parse results object");
|
||||
|
||||
Element.hide("prefFilterLoadingIndicator");
|
||||
|
||||
notify_error("Error while trying to get filter test results.");
|
||||
|
||||
} else {
|
||||
console.log("getTestResults: dialog closed, bailing out.");
|
||||
}
|
||||
} catch (e) {
|
||||
exception_error(e);
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
href: query
|
||||
});
|
||||
|
||||
dojo.connect(test_dlg, "onLoad", null, function (e) {
|
||||
test_dlg.getTestResults(query, 0);
|
||||
});
|
||||
|
||||
test_dlg.show();
|
||||
},
|
||||
quickAddFilter: function() {
|
||||
let query;
|
||||
|
||||
if (!App.isPrefs()) {
|
||||
query = {
|
||||
op: "pref-filters", method: "newfilter",
|
||||
feed: Feeds.getActive(), is_cat: Feeds.activeIsCat()
|
||||
};
|
||||
} else {
|
||||
query = {op: "pref-filters", method: "newfilter"};
|
||||
}
|
||||
|
||||
console.log('quickAddFilter', query);
|
||||
|
||||
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"),
|
||||
style: "width: 600px",
|
||||
test: function () {
|
||||
const query = "backend.php?" + dojo.formToQuery("filter_new_form") + "&savemode=test";
|
||||
|
||||
Filters.editFilterTest(query);
|
||||
},
|
||||
selectRules: function (select) {
|
||||
$$("#filterDlg_Matches input[type=checkbox]").each(function (e) {
|
||||
e.checked = select;
|
||||
if (select)
|
||||
e.parentNode.addClassName("Selected");
|
||||
else
|
||||
e.parentNode.removeClassName("Selected");
|
||||
});
|
||||
},
|
||||
selectActions: function (select) {
|
||||
$$("#filterDlg_Actions input[type=checkbox]").each(function (e) {
|
||||
e.checked = select;
|
||||
|
||||
if (select)
|
||||
e.parentNode.addClassName("Selected");
|
||||
else
|
||||
e.parentNode.removeClassName("Selected");
|
||||
|
||||
});
|
||||
},
|
||||
editRule: function (e) {
|
||||
const li = e.parentNode;
|
||||
const rule = li.getElementsByTagName("INPUT")[1].value;
|
||||
Filters.addFilterRule(li, rule);
|
||||
},
|
||||
editAction: function (e) {
|
||||
const li = e.parentNode;
|
||||
const action = li.getElementsByTagName("INPUT")[1].value;
|
||||
Filters.addFilterAction(li, action);
|
||||
},
|
||||
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()) {
|
||||
|
||||
const query = dojo.formToQuery("filter_new_form");
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
if (App.isPrefs()) {
|
||||
dijit.byId("filterTree").reload();
|
||||
}
|
||||
|
||||
dialog.hide();
|
||||
});
|
||||
}
|
||||
},
|
||||
href: "backend.php?" + dojo.objectToQuery(query)
|
||||
});
|
||||
|
||||
if (!App.isPrefs()) {
|
||||
const selectedText = getSelectionText();
|
||||
|
||||
const lh = dojo.connect(dialog, "onLoad", 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();
|
||||
},
|
||||
});
|
||||
});
|
@ -0,0 +1,152 @@
|
||||
define(["dojo/_base/declare"], function (declare) {
|
||||
return declare("fox.PrefHelpers", null, {
|
||||
clearFeedAccessKeys: function() {
|
||||
if (confirm(__("This will invalidate all previously generated feed URLs. Continue?"))) {
|
||||
notify_progress("Clearing URLs...");
|
||||
|
||||
xhrPost("backend.php", {op: "pref-feeds", method: "clearKeys"}, () => {
|
||||
notify_info("Generated URLs cleared.");
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
updateEventLog: function() {
|
||||
xhrPost("backend.php", { op: "pref-system" }, (transport) => {
|
||||
dijit.byId('systemConfigTab').attr('content', transport.responseText);
|
||||
notify("");
|
||||
});
|
||||
},
|
||||
clearEventLog: function() {
|
||||
if (confirm(__("Clear event log?"))) {
|
||||
|
||||
notify_progress("Loading, please wait...");
|
||||
|
||||
xhrPost("backend.php", {op: "pref-system", method: "clearLog"}, () => {
|
||||
this.updateEventLog();
|
||||
});
|
||||
}
|
||||
},
|
||||
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({
|
||||
id: "profileEditDlg",
|
||||
title: __("Settings Profiles"),
|
||||
style: "width: 600px",
|
||||
getSelectedProfiles: function () {
|
||||
return Tables.getSelected("prefFeedProfileList");
|
||||
},
|
||||
removeSelected: function () {
|
||||
const sel_rows = this.getSelectedProfiles();
|
||||
|
||||
if (sel_rows.length > 0) {
|
||||
if (confirm(__("Remove selected profiles? Active and default profiles will not be removed."))) {
|
||||
notify_progress("Removing selected profiles...", true);
|
||||
|
||||
const query = {
|
||||
op: "rpc", method: "remprofiles",
|
||||
ids: sel_rows.toString()
|
||||
};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
notify('');
|
||||
Prefs.editProfiles();
|
||||
});
|
||||
}
|
||||
|
||||
} else {
|
||||
alert(__("No profiles selected."));
|
||||
}
|
||||
},
|
||||
activateProfile: function () {
|
||||
const sel_rows = this.getSelectedProfiles();
|
||||
|
||||
if (sel_rows.length == 1) {
|
||||
if (confirm(__("Activate selected profile?"))) {
|
||||
notify_progress("Loading, please wait...");
|
||||
|
||||
xhrPost("backend.php", {op: "rpc", method: "setprofile", id: sel_rows.toString()}, () => {
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
|
||||
} else {
|
||||
alert(__("Please choose a profile to activate."));
|
||||
}
|
||||
},
|
||||
addProfile: function () {
|
||||
if (this.validate()) {
|
||||
notify_progress("Creating profile...", true);
|
||||
|
||||
const query = {op: "rpc", method: "addprofile", title: dialog.attr('value').newprofile};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
notify('');
|
||||
Prefs.editProfiles();
|
||||
});
|
||||
|
||||
}
|
||||
},
|
||||
execute: function () {
|
||||
if (this.validate()) {
|
||||
}
|
||||
},
|
||||
href: query
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
customizeCSS: function() {
|
||||
const query = "backend.php?op=pref-prefs&method=customizeCSS";
|
||||
|
||||
if (dijit.byId("cssEditDlg"))
|
||||
dijit.byId("cssEditDlg").destroyRecursive();
|
||||
|
||||
const dialog = new dijit.Dialog({
|
||||
id: "cssEditDlg",
|
||||
title: __("Customize stylesheet"),
|
||||
style: "width: 600px",
|
||||
execute: function () {
|
||||
notify_progress('Saving data...', true);
|
||||
|
||||
xhrPost("backend.php", this.attr('value'), () => {
|
||||
window.location.reload();
|
||||
});
|
||||
|
||||
},
|
||||
href: query
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
confirmReset: function() {
|
||||
if (confirm(__("Reset to defaults?"))) {
|
||||
xhrPost("backend.php", {op: "pref-prefs", method: "resetconfig"}, (transport) => {
|
||||
Prefs.refresh();
|
||||
notify_info(transport.responseText);
|
||||
});
|
||||
}
|
||||
},
|
||||
clearPluginData: function(name) {
|
||||
if (confirm(__("Clear stored data for this plugin?"))) {
|
||||
notify_progress("Loading, please wait...");
|
||||
|
||||
xhrPost("backend.php", {op: "pref-prefs", method: "clearplugindata", name: name}, () => {
|
||||
Prefs.refresh();
|
||||
});
|
||||
}
|
||||
},
|
||||
refresh: function() {
|
||||
xhrPost("backend.php", { op: "pref-prefs" }, (transport) => {
|
||||
dijit.byId('genConfigTab').attr('content', transport.responseText);
|
||||
notify("");
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
@ -0,0 +1,119 @@
|
||||
define(["dojo/_base/declare"], function (declare) {
|
||||
|
||||
return declare("fox.PrefUsers", null, {
|
||||
reload: function(sort) {
|
||||
const user_search = $("user_search");
|
||||
const search = user_search ? user_search.value : "";
|
||||
|
||||
xhrPost("backend.php", { op: "pref-users", sort: sort, search: search }, (transport) => {
|
||||
dijit.byId('userConfigTab').attr('content', transport.responseText);
|
||||
notify("");
|
||||
});
|
||||
},
|
||||
add: function() {
|
||||
const login = prompt(__("Please enter username:"), "");
|
||||
|
||||
if (login) {
|
||||
notify_progress("Adding user...");
|
||||
|
||||
xhrPost("backend.php", {op: "pref-users", method: "add", login: login}, (transport) => {
|
||||
alert(transport.responseText);
|
||||
Users.reload();
|
||||
});
|
||||
|
||||
}
|
||||
},
|
||||
edit: function(id) {
|
||||
const query = "backend.php?op=pref-users&method=edit&id=" +
|
||||
param_escape(id);
|
||||
|
||||
if (dijit.byId("userEditDlg"))
|
||||
dijit.byId("userEditDlg").destroyRecursive();
|
||||
|
||||
const dialog = new dijit.Dialog({
|
||||
id: "userEditDlg",
|
||||
title: __("User Editor"),
|
||||
style: "width: 600px",
|
||||
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();
|
||||
},
|
||||
resetSelected: function() {
|
||||
const rows = this.getSelection();
|
||||
|
||||
if (rows.length == 0) {
|
||||
alert(__("No users selected."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (rows.length > 1) {
|
||||
alert(__("Please select one user."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (confirm(__("Reset password of selected user?"))) {
|
||||
notify_progress("Resetting password for selected user...");
|
||||
|
||||
const id = rows[0];
|
||||
|
||||
xhrPost("backend.php", {op: "pref-users", method: "resetPass", id: id}, (transport) => {
|
||||
notify('');
|
||||
alert(transport.responseText);
|
||||
});
|
||||
|
||||
}
|
||||
},
|
||||
removeSelected: function() {
|
||||
const sel_rows = this.getSelection();
|
||||
|
||||
if (sel_rows.length > 0) {
|
||||
if (confirm(__("Remove selected users? Neither default admin nor your account will be removed."))) {
|
||||
notify_progress("Removing selected users...");
|
||||
|
||||
const query = {
|
||||
op: "pref-users", method: "remove",
|
||||
ids: sel_rows.toString()
|
||||
};
|
||||
|
||||
xhrPost("backend.php", query, () => {
|
||||
this.reload();
|
||||
});
|
||||
}
|
||||
|
||||
} else {
|
||||
alert(__("No users selected."));
|
||||
}
|
||||
},
|
||||
editSelected: function() {
|
||||
const rows = this.getSelection();
|
||||
|
||||
if (rows.length == 0) {
|
||||
alert(__("No users selected."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (rows.length > 1) {
|
||||
alert(__("Please select one user."));
|
||||
return;
|
||||
}
|
||||
|
||||
this.edit(rows[0]);
|
||||
},
|
||||
getSelection :function() {
|
||||
return Tables.getSelected("prefUserList");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -0,0 +1,338 @@
|
||||
define(["dojo/_base/declare"], function (declare) {
|
||||
return declare("fox.Utils", null, {
|
||||
_rpc_seq: 0,
|
||||
hotkey_prefix: 0,
|
||||
hotkey_prefix_pressed: false,
|
||||
hotkey_prefix_timeout: 0,
|
||||
urlParam: function(param) {
|
||||
return String(window.location.href).parseQuery()[param];
|
||||
},
|
||||
next_seq: function() {
|
||||
this._rpc_seq += 1;
|
||||
return this._rpc_seq;
|
||||
},
|
||||
get_seq: function() {
|
||||
return this._rpc_seq;
|
||||
},
|
||||
setLoadingProgress: function(p) {
|
||||
loading_progress += p;
|
||||
|
||||
if (dijit.byId("loading_bar"))
|
||||
dijit.byId("loading_bar").update({progress: loading_progress});
|
||||
|
||||
if (loading_progress >= 90)
|
||||
Element.hide("overlay");
|
||||
|
||||
},
|
||||
keyeventToAction: function(event) {
|
||||
|
||||
const hotkeys_map = getInitParam("hotkeys");
|
||||
const keycode = event.which;
|
||||
const keychar = String.fromCharCode(keycode).toLowerCase();
|
||||
|
||||
if (keycode == 27) { // escape and drop prefix
|
||||
this.hotkey_prefix = false;
|
||||
}
|
||||
|
||||
if (keycode == 16 || keycode == 17) return; // ignore lone shift / ctrl
|
||||
|
||||
if (!this.hotkey_prefix && hotkeys_map[0].indexOf(keychar) != -1) {
|
||||
|
||||
this.hotkey_prefix = keychar;
|
||||
$("cmdline").innerHTML = keychar;
|
||||
Element.show("cmdline");
|
||||
|
||||
window.clearTimeout(this.hotkey_prefix_timeout);
|
||||
this.hotkey_prefix_timeout = window.setTimeout(() => {
|
||||
this.hotkey_prefix = false;
|
||||
Element.hide("cmdline");
|
||||
}, 3 * 1000);
|
||||
|
||||
event.stopPropagation();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Element.hide("cmdline");
|
||||
|
||||
let hotkey_name = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
|
||||
|
||||
// ensure ^*char notation
|
||||
if (event.shiftKey) hotkey_name = "*" + hotkey_name;
|
||||
if (event.ctrlKey) hotkey_name = "^" + hotkey_name;
|
||||
if (event.altKey) hotkey_name = "+" + hotkey_name;
|
||||
if (event.metaKey) hotkey_name = "%" + hotkey_name;
|
||||
|
||||
const hotkey_full = this.hotkey_prefix ? this.hotkey_prefix + " " + hotkey_name : hotkey_name;
|
||||
this.hotkey_prefix = false;
|
||||
|
||||
let action_name = false;
|
||||
|
||||
for (const sequence in hotkeys_map[1]) {
|
||||
if (hotkeys_map[1].hasOwnProperty(sequence)) {
|
||||
if (sequence == hotkey_full) {
|
||||
action_name = hotkeys_map[1][sequence];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log('keyeventToAction', hotkey_full, '=>', action_name);
|
||||
|
||||
return action_name;
|
||||
},
|
||||
cleanupMemory: function(root) {
|
||||
const dijits = dojo.query("[widgetid]", dijit.byId(root).domNode).map(dijit.byNode);
|
||||
|
||||
dijits.each(function (d) {
|
||||
dojo.destroy(d.domNode);
|
||||
});
|
||||
|
||||
$$("#" + root + " *").each(function (i) {
|
||||
i.parentNode ? i.parentNode.removeChild(i) : true;
|
||||
});
|
||||
},
|
||||
helpDialog: function(topic) {
|
||||
const query = "backend.php?op=backend&method=help&topic=" + param_escape(topic);
|
||||
|
||||
if (dijit.byId("helpDlg"))
|
||||
dijit.byId("helpDlg").destroyRecursive();
|
||||
|
||||
const dialog = new dijit.Dialog({
|
||||
id: "helpDlg",
|
||||
title: __("Help"),
|
||||
style: "width: 600px",
|
||||
href: query,
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
},
|
||||
displayDlg: function(title, id, param, callback) {
|
||||
notify_progress("Loading, please wait...", true);
|
||||
|
||||
const query = {op: "dlg", method: id, param: param};
|
||||
|
||||
xhrPost("backend.php", query, (transport) => {
|
||||
try {
|
||||
const content = transport.responseText;
|
||||
|
||||
let dialog = dijit.byId("infoBox");
|
||||
|
||||
if (!dialog) {
|
||||
dialog = new dijit.Dialog({
|
||||
title: title,
|
||||
id: 'infoBox',
|
||||
style: "width: 600px",
|
||||
onCancel: function () {
|
||||
return true;
|
||||
},
|
||||
onExecute: function () {
|
||||
return true;
|
||||
},
|
||||
onClose: function () {
|
||||
return true;
|
||||
},
|
||||
content: content
|
||||
});
|
||||
} else {
|
||||
dialog.attr('title', title);
|
||||
dialog.attr('content', content);
|
||||
}
|
||||
|
||||
dialog.show();
|
||||
|
||||
notify("");
|
||||
|
||||
if (callback) callback(transport);
|
||||
} catch (e) {
|
||||
exception_error(e);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
},
|
||||
handleRpcJson: function(transport) {
|
||||
|
||||
const netalert_dijit = dijit.byId("net-alert");
|
||||
let netalert = false;
|
||||
|
||||
if (netalert_dijit) netalert = netalert_dijit.domNode;
|
||||
|
||||
try {
|
||||
const reply = JSON.parse(transport.responseText);
|
||||
|
||||
if (reply) {
|
||||
|
||||
const error = reply['error'];
|
||||
|
||||
if (error) {
|
||||
const code = error['code'];
|
||||
const msg = error['msg'];
|
||||
|
||||
console.warn("[handleRpcJson] received fatal error " + code + "/" + msg);
|
||||
|
||||
if (code != 0) {
|
||||
fatalError(code, msg);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const seq = reply['seq'];
|
||||
|
||||
if (seq && this.get_seq() != seq) {
|
||||
console.log("[handleRpcJson] sequence mismatch: " + seq +
|
||||
" (want: " + this.get_seq() + ")");
|
||||
return true;
|
||||
}
|
||||
|
||||
const message = reply['message'];
|
||||
|
||||
if (message == "UPDATE_COUNTERS") {
|
||||
console.log("need to refresh counters...");
|
||||
setInitParam("last_article_id", -1);
|
||||
Feeds.requestCounters(true);
|
||||
}
|
||||
|
||||
const counters = reply['counters'];
|
||||
|
||||
if (counters)
|
||||
Feeds.parseCounters(counters);
|
||||
|
||||
const runtime_info = reply['runtime-info'];
|
||||
|
||||
if (runtime_info)
|
||||
Utils.parseRuntimeInfo(runtime_info);
|
||||
|
||||
if (netalert) netalert.hide();
|
||||
|
||||
return reply;
|
||||
|
||||
} else {
|
||||
if (netalert)
|
||||
netalert.show();
|
||||
else
|
||||
notify_error("Communication problem with server.");
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
if (netalert)
|
||||
netalert.show();
|
||||
else
|
||||
notify_error("Communication problem with server.");
|
||||
|
||||
console.error(e);
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
parseRuntimeInfo: function(data) {
|
||||
|
||||
//console.log("parsing runtime info...");
|
||||
|
||||
for (const k in data) {
|
||||
if (data.hasOwnProperty(k)) {
|
||||
const v = data[k];
|
||||
|
||||
console.log("RI:", k, "=>", v);
|
||||
|
||||
if (k == "dep_ts" && parseInt(getInitParam("dep_ts")) > 0) {
|
||||
if (parseInt(getInitParam("dep_ts")) < parseInt(v) && getInitParam("reload_on_ts_change")) {
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
if (k == "daemon_is_running" && v != 1) {
|
||||
notify_error("<span onclick=\"Utils.explainError(1)\">Update daemon is not running.</span>", true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (k == "update_result") {
|
||||
const updatesIcon = dijit.byId("updatesIcon").domNode;
|
||||
|
||||
if (v) {
|
||||
Element.show(updatesIcon);
|
||||
} else {
|
||||
Element.hide(updatesIcon);
|
||||
}
|
||||
}
|
||||
|
||||
if (k == "daemon_stamp_ok" && v != 1) {
|
||||
notify_error("<span onclick=\"Utils.explainError(3)\">Update daemon is not updating feeds.</span>", true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (k == "max_feed_id" || k == "num_feeds") {
|
||||
if (init_params[k] != v) {
|
||||
console.log("feed count changed, need to reload feedlist.");
|
||||
Feeds.reload();
|
||||
}
|
||||
}
|
||||
|
||||
init_params[k] = v;
|
||||
}
|
||||
}
|
||||
|
||||
PluginHost.run(PluginHost.HOOK_RUNTIME_INFO_LOADED, data);
|
||||
},
|
||||
backendSanityCallback: function (transport) {
|
||||
|
||||
const reply = JSON.parse(transport.responseText);
|
||||
|
||||
if (!reply) {
|
||||
fatalError(3, "Sanity check: invalid RPC reply", transport.responseText);
|
||||
return;
|
||||
}
|
||||
|
||||
const error_code = reply['error']['code'];
|
||||
|
||||
if (error_code && error_code != 0) {
|
||||
return fatalError(error_code, reply['error']['message']);
|
||||
}
|
||||
|
||||
console.log("sanity check ok");
|
||||
|
||||
const params = reply['init-params'];
|
||||
|
||||
if (params) {
|
||||
console.log('reading init-params...');
|
||||
|
||||
for (const k in params) {
|
||||
if (params.hasOwnProperty(k)) {
|
||||
switch (k) {
|
||||
case "label_base_index":
|
||||
_label_base_index = parseInt(params[k]);
|
||||
break;
|
||||
case "hotkeys":
|
||||
// filter mnemonic definitions (used for help panel) from hotkeys map
|
||||
// i.e. *(191)|Ctrl-/ -> *(191)
|
||||
|
||||
const tmp = [];
|
||||
for (const sequence in params[k][1]) {
|
||||
if (params[k][1].hasOwnProperty(sequence)) {
|
||||
const filtered = sequence.replace(/\|.*$/, "");
|
||||
tmp[filtered] = params[k][1][sequence];
|
||||
}
|
||||
}
|
||||
|
||||
params[k][1] = tmp;
|
||||
break;
|
||||
}
|
||||
|
||||
console.log("IP:", k, "=>", params[k]);
|
||||
}
|
||||
}
|
||||
|
||||
init_params = params;
|
||||
|
||||
// PluginHost might not be available on non-index pages
|
||||
window.PluginHost && PluginHost.run(PluginHost.HOOK_PARAMS_LOADED, init_params);
|
||||
}
|
||||
|
||||
App.initSecondStage();
|
||||
},
|
||||
explainError: function(code) {
|
||||
return this.displayDlg(__("Error explained"), "explainError", code);
|
||||
},
|
||||
|
||||
});
|
||||
});
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue