]>
git.wh0rd.org - tt-rss.git/blob - js/prefs.js
5 function notify_callback2(transport
, sticky
) {
6 notify_info(transport
.responseText
, sticky
);
9 function updateFeedList() {
11 const user_search
= $("feed_search");
13 if (user_search
) { search
= user_search
.value
; }
15 xhrPost("backend.php", { op
: "pref-feeds", search
: search
}, (transport
) => {
16 dijit
.byId('feedConfigTab').attr('content', transport
.responseText
);
17 selectTab("feedConfig", true);
22 function checkInactiveFeeds() {
23 xhrPost("backend.php", { op
: "pref-feeds", method
: "getinactivefeeds" }, (transport
) => {
24 if (parseInt(transport
.responseText
) > 0) {
25 Element
.show(dijit
.byId("pref_feeds_inactive_btn").domNode
);
30 function updateUsersList(sort_key
) {
31 const user_search
= $("user_search");
32 const search
= user_search
? user_search
.value
: "";
34 const query
= { op
: "pref-users", sort
: sort_key
, search
: search
};
36 xhrPost("backend.php", query
, (transport
) => {
37 dijit
.byId('userConfigTab').attr('content', transport
.responseText
);
38 selectTab("userConfig", true)
44 const login
= prompt(__("Please enter login:"), "");
51 alert(__("Can't create user: no login specified."));
55 notify_progress("Adding user...");
57 xhrPost("backend.php", { op
: "pref-users", method
: "add", login
: login
}, (transport
) => {
58 notify_callback2(transport
);
64 function editUser(id
) {
66 const query
= "backend.php?op=pref-users&method=edit&id=" +
69 if (dijit
.byId("userEditDlg"))
70 dijit
.byId("userEditDlg").destroyRecursive();
72 const dialog
= new dijit
.Dialog({
74 title
: __("User Editor"),
75 style
: "width: 600px",
76 execute: function () {
77 if (this.validate()) {
78 notify_progress("Saving data...", true);
80 xhrPost("backend.php", dojo
.formToObject("user_edit_form"), (transport
) => {
92 function editFilter(id
) {
94 const query
= "backend.php?op=pref-filters&method=edit&id=" + param_escape(id
);
96 if (dijit
.byId("feedEditDlg"))
97 dijit
.byId("feedEditDlg").destroyRecursive();
99 if (dijit
.byId("filterEditDlg"))
100 dijit
.byId("filterEditDlg").destroyRecursive();
102 const dialog
= new dijit
.Dialog({
104 title
: __("Edit Filter"),
105 style
: "width: 600px",
108 const query
= "backend.php?" + dojo
.formToQuery("filter_edit_form") + "&savemode=test";
110 editFilterTest(query
);
112 selectRules: function (select
) {
113 $$("#filterDlg_Matches input[type=checkbox]").each(function (e
) {
116 e
.parentNode
.addClassName("Selected");
118 e
.parentNode
.removeClassName("Selected");
121 selectActions: function (select
) {
122 $$("#filterDlg_Actions input[type=checkbox]").each(function (e
) {
126 e
.parentNode
.addClassName("Selected");
128 e
.parentNode
.removeClassName("Selected");
132 editRule: function (e
) {
133 const li
= e
.parentNode
;
134 const rule
= li
.getElementsByTagName("INPUT")[1].value
;
135 addFilterRule(li
, rule
);
137 editAction: function (e
) {
138 const li
= e
.parentNode
;
139 const action
= li
.getElementsByTagName("INPUT")[1].value
;
140 addFilterAction(li
, action
);
142 removeFilter: function () {
143 const msg
= __("Remove filter?");
148 notify_progress("Removing filter...");
150 const query
= { op
: "pref-filters", method
: "remove", ids
: this.attr('value').id
};
152 xhrPost("backend.php", query
, () => {
157 addAction: function () {
160 addRule: function () {
163 deleteAction: function () {
164 $$("#filterDlg_Actions li[class*=Selected]").each(function (e
) {
165 e
.parentNode
.removeChild(e
)
168 deleteRule: function () {
169 $$("#filterDlg_Matches li[class*=Selected]").each(function (e
) {
170 e
.parentNode
.removeChild(e
)
173 execute: function () {
174 if (this.validate()) {
176 notify_progress("Saving data...", true);
178 xhrPost("backend.php", dojo
.formToObject("filter_edit_form"), () => {
191 function getSelectedLabels() {
192 const tree
= dijit
.byId("labelTree");
193 const items
= tree
.model
.getCheckedItems();
196 items
.each(function(item
) {
197 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
203 function getSelectedUsers() {
204 return getSelectedTableRowIds("prefUserList");
207 function getSelectedFeeds() {
208 const tree
= dijit
.byId("feedTree");
209 const items
= tree
.model
.getCheckedItems();
212 items
.each(function(item
) {
213 if (item
.id
[0].match("FEED:"))
214 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
220 function getSelectedCategories() {
221 const tree
= dijit
.byId("feedTree");
222 const items
= tree
.model
.getCheckedItems();
225 items
.each(function(item
) {
226 if (item
.id
[0].match("CAT:"))
227 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
233 function getSelectedFilters() {
234 const tree
= dijit
.byId("filterTree");
235 const items
= tree
.model
.getCheckedItems();
238 items
.each(function(item
) {
239 rv
.push(tree
.model
.store
.getValue(item
, 'bare_id'));
246 function removeSelectedLabels() {
248 const sel_rows
= getSelectedLabels();
250 if (sel_rows
.length
> 0) {
251 if (confirm(__("Remove selected labels?"))) {
252 notify_progress("Removing selected labels...");
254 const query
= { op
: "pref-labels", method
: "remove",
255 ids
: sel_rows
.toString() };
257 xhrPost("backend.php", query
, () => {
262 alert(__("No labels are selected."));
268 function removeSelectedUsers() {
270 const sel_rows
= getSelectedUsers();
272 if (sel_rows
.length
> 0) {
274 if (confirm(__("Remove selected users? Neither default admin nor your account will be removed."))) {
275 notify_progress("Removing selected users...");
277 const query
= { op
: "pref-users", method
: "remove",
278 ids
: sel_rows
.toString() };
280 xhrPost("backend.php", query
, () => {
286 alert(__("No users are selected."));
292 function removeSelectedFilters() {
294 const sel_rows
= getSelectedFilters();
296 if (sel_rows
.length
> 0) {
297 if (confirm(__("Remove selected filters?"))) {
298 notify_progress("Removing selected filters...");
300 const query
= { op
: "pref-filters", method
: "remove",
301 ids
: sel_rows
.toString() };
303 xhrPost("backend.php", query
, () => {
308 alert(__("No filters are selected."));
314 function removeSelectedFeeds() {
316 const sel_rows
= getSelectedFeeds();
318 if (sel_rows
.length
> 0) {
319 if (confirm(__("Unsubscribe from selected feeds?"))) {
321 notify_progress("Unsubscribing from selected feeds...", true);
323 const query
= { op
: "pref-feeds", method
: "remove",
324 ids
: sel_rows
.toString() };
326 xhrPost("backend.php", query
, () => {
332 alert(__("No feeds are selected."));
338 function editSelectedUser() {
339 const rows
= getSelectedUsers();
341 if (rows
.length
== 0) {
342 alert(__("No users are selected."));
346 if (rows
.length
> 1) {
347 alert(__("Please select only one user."));
356 function resetSelectedUserPass() {
358 const rows
= getSelectedUsers();
360 if (rows
.length
== 0) {
361 alert(__("No users are selected."));
365 if (rows
.length
> 1) {
366 alert(__("Please select only one user."));
370 if (confirm(__("Reset password of selected user?"))) {
371 notify_progress("Resetting password for selected user...");
375 xhrPost("backend.php", { op
: "pref-users", method
: "resetPass", id
: id
}, (transport
) => {
376 notify_info(transport
.responseText
, true);
382 function selectedUserDetails() {
384 const rows
= getSelectedUsers();
386 if (rows
.length
== 0) {
387 alert(__("No users are selected."));
391 if (rows
.length
> 1) {
392 alert(__("Please select only one user."));
396 const query
= "backend.php?op=pref-users&method=userdetails&id=" + param_escape(rows
[0]);
398 if (dijit
.byId("userDetailsDlg"))
399 dijit
.byId("userDetailsDlg").destroyRecursive();
401 const dialog
= new dijit
.Dialog({
402 id
: "userDetailsDlg",
403 title
: __("User details"),
404 style
: "width: 600px",
405 execute: function () {
415 function editSelectedFilter() {
416 const rows
= getSelectedFilters();
418 if (rows
.length
== 0) {
419 alert(__("No filters are selected."));
423 if (rows
.length
> 1) {
424 alert(__("Please select only one filter."));
434 function joinSelectedFilters() {
435 const rows
= getSelectedFilters();
437 if (rows
.length
== 0) {
438 alert(__("No filters are selected."));
442 if (confirm(__("Combine selected filters?"))) {
443 notify_progress("Joining filters...");
445 xhrPost("backend.php", { op
: "pref-filters", method
: "join", ids
: rows
.toString() }, () => {
451 function editSelectedFeed() {
452 const rows
= getSelectedFeeds();
454 if (rows
.length
== 0) {
455 alert(__("No feeds are selected."));
459 if (rows
.length
> 1) {
460 return editSelectedFeeds();
465 editFeed(rows
[0], {});
469 function editSelectedFeeds() {
470 const rows
= getSelectedFeeds();
472 if (rows
.length
== 0) {
473 alert(__("No feeds are selected."));
477 notify_progress("Loading, please wait...");
479 if (dijit
.byId("feedEditDlg"))
480 dijit
.byId("feedEditDlg").destroyRecursive();
482 xhrPost("backend.php", { op
: "pref-feeds", method
: "editfeeds", ids
: rows
.toString() }, (transport
) => {
485 const dialog
= new dijit
.Dialog({
487 title
: __("Edit Multiple Feeds"),
488 style
: "width: 600px",
489 getChildByName: function (name
) {
491 this.getChildren().each(
493 if (child
.name
== name
) {
500 toggleField: function (checkbox
, elem
, label
) {
501 this.getChildByName(elem
).attr('disabled', !checkbox
.checked
);
504 if (checkbox
.checked
)
505 $(label
).removeClassName('insensitive');
507 $(label
).addClassName('insensitive');
510 execute: function () {
511 if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
512 const query
= this.attr('value');
514 /* normalize unchecked checkboxes because [] is not serialized */
516 Object
.keys(query
).each((key
) => {
517 let val
= query
[key
];
519 if (typeof val
== "object" && val
.length
== 0)
520 query
[key
] = ["off"];
523 notify_progress("Saving data...", true);
525 xhrPost("backend.php", query
, () => {
531 content
: transport
.responseText
538 function opmlImportComplete(iframe
) {
539 if (!iframe
.contentDocument
.body
.innerHTML
) return false;
541 Element
.show(iframe
);
545 if (dijit
.byId('opmlImportDlg'))
546 dijit
.byId('opmlImportDlg').destroyRecursive();
548 const content
= iframe
.contentDocument
.body
.innerHTML
;
550 const dialog
= new dijit
.Dialog({
552 title
: __("OPML Import"),
553 style
: "width: 600px",
554 onCancel: function () {
555 window
.location
.reload();
557 execute: function () {
558 window
.location
.reload();
566 function opmlImport() {
568 const opml_file
= $("opml_file");
570 if (opml_file
.value
.length
== 0) {
571 alert(__("Please choose an OPML file first."));
574 notify_progress("Importing, please wait...", true);
576 Element
.show("upload_iframe");
583 function updateFilterList() {
584 const user_search
= $("filter_search");
586 if (user_search
) { search
= user_search
.value
; }
588 xhrPost("backend.php", { op
: "pref-filters", search
: search
}, (transport
) => {
589 dijit
.byId('filterConfigTab').attr('content', transport
.responseText
);
594 function updateLabelList() {
595 xhrPost("backend.php", { op
: "pref-labels" }, (transport
) => {
596 dijit
.byId('labelConfigTab').attr('content', transport
.responseText
);
601 function updatePrefsList() {
602 xhrPost("backend.php", { op
: "pref-prefs" }, (transport
) => {
603 dijit
.byId('genConfigTab').attr('content', transport
.responseText
);
608 function updateSystemList() {
609 xhrPost("backend.php", { op
: "pref-system" }, (transport
) => {
610 dijit
.byId('systemConfigTab').attr('content', transport
.responseText
);
615 function selectTab(id
, noupdate
) {
617 notify_progress("Loading, please wait...");
639 console
.warn("unknown tab", id
);
642 const tab
= dijit
.byId(id
+ "Tab");
643 dijit
.byId("pref-tabs").selectChild(tab
);
648 function init_second_stage() {
649 document
.onkeydown
= pref_hotkey_handler
;
650 loading_set_progress(50);
653 let tab
= getURLParam('tab');
656 tab
= dijit
.byId(tab
+ "Tab");
657 if (tab
) dijit
.byId("pref-tabs").selectChild(tab
);
660 const method
= getURLParam('method');
662 if (method
== 'editFeed') {
663 const param
= getURLParam('methodparam');
665 window
.setTimeout(function() { editFeed(param
) }, 100);
668 setInterval(hotkey_prefix_timeout
, 5*1000);
672 window
.onerror = function (message
, filename
, lineno
, colno
, error
) {
673 report_error(message
, filename
, lineno
, colno
, error
);
676 require(["dojo/_base/kernel",
681 "dijit/ColorPalette",
684 "dijit/form/CheckBox",
685 "dijit/form/DropDownButton",
686 "dijit/form/FilteringSelect",
687 "dijit/form/MultiSelect",
689 "dijit/form/RadioButton",
690 "dijit/form/ComboButton",
692 "dijit/form/SimpleTextarea",
693 "dijit/form/TextBox",
694 "dijit/form/ValidationTextBox",
695 "dijit/InlineEditBox",
696 "dijit/layout/AccordionContainer",
697 "dijit/layout/AccordionPane",
698 "dijit/layout/BorderContainer",
699 "dijit/layout/ContentPane",
700 "dijit/layout/TabContainer",
705 "dijit/tree/dndSource",
706 "dojo/data/ItemFileWriteStore",
707 "lib/CheckBoxStoreModel",
710 "fox/PrefFilterStore",
712 "fox/PrefFilterTree",
713 "fox/PrefLabelTree"], function (dojo
, ready
, parser
) {
719 loading_set_progress(50);
721 const clientTzOffset
= new Date().getTimezoneOffset() * 60;
722 const params
= { op
: "rpc", method
: "sanityCheck", clientTzOffset
: clientTzOffset
};
724 xhrPost("backend.php", params
, (transport
) => {
725 backend_sanity_check_callback(transport
);
736 function validatePrefsReset() {
737 if (confirm(__("Reset to defaults?"))) {
739 const query
= "?op=pref-prefs&method=resetconfig";
741 xhrPost("backend.php", { op
: "pref-prefs", method
: "resetconfig" }, (transport
) => {
743 notify_info(transport
.responseText
);
750 function pref_hotkey_handler(e
) {
751 if (e
.target
.nodeName
== "INPUT" || e
.target
.nodeName
== "TEXTAREA") return;
753 const action_name
= keyevent_to_action(e
);
756 switch (action_name
) {
757 case "feed_subscribe":
763 case "create_filter":
770 console
.log("unhandled action: " + action_name
+ "; keycode: " + e
.which
);
775 function removeCategory(id
, item
) {
777 if (confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item
.name
))) {
778 notify_progress("Removing category...");
780 const query
= { op
: "pref-feeds", method
: "removeCat",
783 xhrPost("backend.php", query
, () => {
790 function removeSelectedCategories() {
791 const sel_rows
= getSelectedCategories();
793 if (sel_rows
.length
> 0) {
794 if (confirm(__("Remove selected categories?"))) {
795 notify_progress("Removing selected categories...");
797 const query
= { op
: "pref-feeds", method
: "removeCat",
798 ids
: sel_rows
.toString() };
800 xhrPost("backend.php", query
, () => {
805 alert(__("No categories are selected."));
811 function createCategory() {
812 const title
= prompt(__("Category title:"));
815 notify_progress("Creating category...");
817 xhrPost("backend.php", { op
: "pref-feeds", method
: "addCat", cat
: title
}, () => {
824 function showInactiveFeeds() {
825 const query
= "backend.php?op=pref-feeds&method=inactiveFeeds";
827 if (dijit
.byId("inactiveFeedsDlg"))
828 dijit
.byId("inactiveFeedsDlg").destroyRecursive();
830 const dialog
= new dijit
.Dialog({
831 id
: "inactiveFeedsDlg",
832 title
: __("Feeds without recent updates"),
833 style
: "width: 600px",
834 getSelectedFeeds: function () {
835 return getSelectedTableRowIds("prefInactiveFeedList");
837 removeSelected: function () {
838 const sel_rows
= this.getSelectedFeeds();
840 if (sel_rows
.length
> 0) {
841 if (confirm(__("Remove selected feeds?"))) {
842 notify_progress("Removing selected feeds...", true);
844 const query
= { op
: "pref-feeds", method
: "remove",
845 ids
: sel_rows
.toString() };
847 xhrPost("backend.php", query
, () => {
855 alert(__("No feeds are selected."));
858 execute: function () {
859 if (this.validate()) {
868 function opmlRegenKey() {
869 if (confirm(__("Replace current OPML publishing address with a new one?"))) {
870 notify_progress("Trying to change address...", true);
872 xhrJson("backend.php", { op
: "pref-feeds", method
: "regenOPMLKey" }, (reply
) => {
874 const new_link
= reply
.link
;
875 const e
= $('pub_opml_url');
879 e
.innerHTML
= new_link
;
881 new Effect
.Highlight(e
);
886 notify_error("Could not change feed URL.");
894 function labelColorReset() {
895 const labels
= getSelectedLabels();
897 if (labels
.length
> 0) {
898 if (confirm(__("Reset selected labels to default colors?"))) {
900 const query
= { op
: "pref-labels", method
: "colorreset",
901 ids
: labels
.toString() };
903 xhrPost("backend.php", query
, () => {
909 alert(__("No labels are selected."));
913 function inPreferences() {
917 function editProfiles() {
919 if (dijit
.byId("profileEditDlg"))
920 dijit
.byId("profileEditDlg").destroyRecursive();
922 const query
= "backend.php?op=pref-prefs&method=editPrefProfiles";
924 const dialog
= new dijit
.Dialog({
925 id
: "profileEditDlg",
926 title
: __("Settings Profiles"),
927 style
: "width: 600px",
928 getSelectedProfiles: function () {
929 return getSelectedTableRowIds("prefFeedProfileList");
931 removeSelected: function () {
932 const sel_rows
= this.getSelectedProfiles();
934 if (sel_rows
.length
> 0) {
935 if (confirm(__("Remove selected profiles? Active and default profiles will not be removed."))) {
936 notify_progress("Removing selected profiles...", true);
938 const query
= { op
: "rpc", method
: "remprofiles",
939 ids
: sel_rows
.toString() };
941 xhrPost("backend.php", query
, () => {
948 alert(__("No profiles are selected."));
951 activateProfile: function () {
952 const sel_rows
= this.getSelectedProfiles();
954 if (sel_rows
.length
== 1) {
955 if (confirm(__("Activate selected profile?"))) {
956 notify_progress("Loading, please wait...");
958 xhrPost("backend.php", { op
: "rpc", method
: "setprofile", id
: sel_rows
.toString() }, () => {
959 window
.location
.reload();
964 alert(__("Please choose a profile to activate."));
967 addProfile: function () {
968 if (this.validate()) {
969 notify_progress("Creating profile...", true);
971 const query
= { op
: "rpc", method
: "addprofile", title
: dialog
.attr('value').newprofile
};
973 xhrPost("backend.php", query
, () => {
980 execute: function () {
981 if (this.validate()) {
991 function activatePrefProfile() {
993 const sel_rows = getSelectedFeedCats();
995 if (sel_rows.length == 1) {
997 const ok = confirm(__("Activate selected profile?"));
1000 notify_progress("Loading, please wait...");
1002 xhrPost("backend.php", { op: "rpc", method: "setprofile", id: sel_rows.toString() }, () => {
1003 window.location.reload();
1008 alert(__("Please choose a profile to activate."));
1014 function clearFeedAccessKeys() {
1016 if (confirm(__("This will invalidate all previously generated feed URLs. Continue?"))) {
1017 notify_progress("Clearing URLs...");
1019 xhrPost("backend.php", { op
: "pref-feeds", method
: "clearKeys" }, () => {
1020 notify_info("Generated URLs cleared.");
1027 function resetFilterOrder() {
1028 notify_progress("Loading, please wait...");
1030 xhrPost("backend.php", { op
: "pref-filters", method
: "filtersortreset" }, () => {
1036 function resetFeedOrder() {
1037 notify_progress("Loading, please wait...");
1039 xhrPost("backend.php", { op
: "pref-feeds", method
: "feedsortreset" }, () => {
1044 function resetCatOrder() {
1045 notify_progress("Loading, please wait...");
1047 xhrPost("backend.php", { op
: "pref-feeds", method
: "catsortreset" }, () => {
1052 function editCat(id
, item
) {
1053 const new_name
= prompt(__('Rename category to:'), item
.name
);
1055 if (new_name
&& new_name
!= item
.name
) {
1057 notify_progress("Loading, please wait...");
1059 xhrPost("backend.php", { op
: 'pref-feeds', method
: 'renamecat', id
: id
, title
: new_name
}, () => {
1065 function editLabel(id
) {
1066 const query
= "backend.php?op=pref-labels&method=edit&id=" +
1069 if (dijit
.byId("labelEditDlg"))
1070 dijit
.byId("labelEditDlg").destroyRecursive();
1072 const dialog
= new dijit
.Dialog({
1074 title
: __("Label Editor"),
1075 style
: "width: 600px",
1076 setLabelColor: function (id
, fg
, bg
) {
1091 const e
= $("LICID-" + id
);
1094 if (fg
) e
.style
.color
= fg
;
1095 if (bg
) e
.style
.backgroundColor
= bg
;
1098 const query
= { op
: "pref-labels", method
: "colorset", kind
: kind
,
1099 ids
: id
, fg
: fg
, bg
: bg
, color
: color
};
1101 xhrPost("backend.php", query
, () => {
1102 updateFilterList(); // maybe there's labels in there
1106 execute: function () {
1107 if (this.validate()) {
1108 const caption
= this.attr('value').caption
;
1109 const fg_color
= this.attr('value').fg_color
;
1110 const bg_color
= this.attr('value').bg_color
;
1112 dijit
.byId('labelTree').setNameById(id
, caption
);
1113 this.setLabelColor(id
, fg_color
, bg_color
);
1116 xhrPost("backend.php", this.attr('value'), () => {
1117 updateFilterList(); // maybe there's labels in there
1128 function customizeCSS() {
1129 const query
= "backend.php?op=pref-prefs&method=customizeCSS";
1131 if (dijit
.byId("cssEditDlg"))
1132 dijit
.byId("cssEditDlg").destroyRecursive();
1134 const dialog
= new dijit
.Dialog({
1136 title
: __("Customize stylesheet"),
1137 style
: "width: 600px",
1138 execute: function () {
1139 notify_progress('Saving data...', true);
1141 xhrPost("backend.php", this.attr('value'), () => {
1142 window
.location
.reload();
1152 function insertSSLserial(value
) {
1153 dijit
.byId("SSL_CERT_SERIAL").attr('value', value
);
1156 function gotoExportOpml(filename
, settings
) {
1157 const tmp
= settings
? 1 : 0;
1158 document
.location
.href
= "backend.php?op=opml&method=export&filename=" + filename
+ "&settings=" + tmp
;
1162 function batchSubscribe() {
1163 const query
= "backend.php?op=pref-feeds&method=batchSubscribe";
1165 // overlapping widgets
1166 if (dijit
.byId("batchSubDlg")) dijit
.byId("batchSubDlg").destroyRecursive();
1167 if (dijit
.byId("feedAddDlg")) dijit
.byId("feedAddDlg").destroyRecursive();
1169 const dialog
= new dijit
.Dialog({
1171 title
: __("Batch subscribe"),
1172 style
: "width: 600px",
1173 execute: function () {
1174 if (this.validate()) {
1175 notify_progress(__("Subscribing to feeds..."), true);
1177 xhrPost("backend.php", this.attr('value'), () => {
1190 function clearPluginData(name
) {
1191 if (confirm(__("Clear stored data for this plugin?"))) {
1192 notify_progress("Loading, please wait...");
1194 xhrPost("backend.php", { op
: "pref-prefs", method
: "clearplugindata", name
: name
}, () => {
1201 function clearSqlLog() {
1203 if (confirm(__("Clear all messages in the error log?"))) {
1205 notify_progress("Loading, please wait...");
1207 xhrPost("backend.php", { op
: "pref-system", method
: "clearLog" }, () => {
1214 function updateSelectedPrompt() {
1215 // no-op shim for toggleSelectedRow()