add instances plugin
This commit is contained in:
parent
8dcb2b4762
commit
6cbe53c9f5
7 changed files with 216 additions and 178 deletions
|
@ -9,6 +9,7 @@ class PluginHost {
|
||||||
const HOOK_ARTICLE_FILTER = 2;
|
const HOOK_ARTICLE_FILTER = 2;
|
||||||
const HOOK_PREFS_TAB = 3;
|
const HOOK_PREFS_TAB = 3;
|
||||||
const HOOK_PREFS_SECTION = 4;
|
const HOOK_PREFS_SECTION = 4;
|
||||||
|
const HOOK_PREFS_TABS = 5;
|
||||||
|
|
||||||
function __construct($link) {
|
function __construct($link) {
|
||||||
$this->link = $link;
|
$this->link = $link;
|
||||||
|
@ -77,7 +78,7 @@ class PluginHost {
|
||||||
}
|
}
|
||||||
|
|
||||||
function add_handler($handler, $method, $sender) {
|
function add_handler($handler, $method, $sender) {
|
||||||
$handler = strtolower($handler);
|
$handler = str_replace("-", "_", strtolower($handler));
|
||||||
$method = strtolower($method);
|
$method = strtolower($method);
|
||||||
|
|
||||||
if (!is_array($this->handlers[$handler])) {
|
if (!is_array($this->handlers[$handler])) {
|
||||||
|
@ -88,18 +89,22 @@ class PluginHost {
|
||||||
}
|
}
|
||||||
|
|
||||||
function del_handler($handler, $method) {
|
function del_handler($handler, $method) {
|
||||||
$handler = strtolower($handler);
|
$handler = str_replace("-", "_", strtolower($handler));
|
||||||
$method = strtolower($method);
|
$method = strtolower($method);
|
||||||
|
|
||||||
unset($this->handlers[$handler][$method]);
|
unset($this->handlers[$handler][$method]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function lookup_handler($handler, $method) {
|
function lookup_handler($handler, $method) {
|
||||||
$handler = strtolower($handler);
|
$handler = str_replace("-", "_", strtolower($handler));
|
||||||
$method = strtolower($method);
|
$method = strtolower($method);
|
||||||
|
|
||||||
if (is_array($this->handlers[$handler])) {
|
if (is_array($this->handlers[$handler])) {
|
||||||
return $this->handlers[$handler][$method];
|
if (isset($this->handlers[$handler]["*"])) {
|
||||||
|
return $this->handlers[$handler]["*"];
|
||||||
|
} else {
|
||||||
|
return $this->handlers[$handler][$method];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
165
js/prefs.js
165
js/prefs.js
|
@ -24,15 +24,6 @@ function updateFeedList(sort_key) {
|
||||||
} });
|
} });
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateInstanceList(sort_key) {
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: "?op=pref-instances&sort=" + param_escape(sort_key),
|
|
||||||
onComplete: function(transport) {
|
|
||||||
dijit.byId('instanceConfigTab').attr('content', transport.responseText);
|
|
||||||
selectTab("instanceConfig", true);
|
|
||||||
notify("");
|
|
||||||
} });
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateUsersList(sort_key) {
|
function updateUsersList(sort_key) {
|
||||||
try {
|
try {
|
||||||
|
@ -1891,162 +1882,6 @@ function insertSSLserial(value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSelectedInstances() {
|
|
||||||
return getSelectedTableRowIds("prefInstanceList");
|
|
||||||
}
|
|
||||||
|
|
||||||
function addInstance() {
|
|
||||||
try {
|
|
||||||
var query = "backend.php?op=dlg&method=addInstance";
|
|
||||||
|
|
||||||
if (dijit.byId("instanceAddDlg"))
|
|
||||||
dijit.byId("instanceAddDlg").destroyRecursive();
|
|
||||||
|
|
||||||
dialog = new dijit.Dialog({
|
|
||||||
id: "instanceAddDlg",
|
|
||||||
title: __("Link Instance"),
|
|
||||||
style: "width: 600px",
|
|
||||||
regenKey: function() {
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: "?op=rpc&method=genHash",
|
|
||||||
onComplete: function(transport) {
|
|
||||||
var reply = JSON.parse(transport.responseText);
|
|
||||||
if (reply)
|
|
||||||
dijit.byId('instance_add_key').attr('value', reply.hash);
|
|
||||||
|
|
||||||
} });
|
|
||||||
},
|
|
||||||
execute: function() {
|
|
||||||
if (this.validate()) {
|
|
||||||
console.warn(dojo.objectToQuery(this.attr('value')));
|
|
||||||
|
|
||||||
notify_progress('Saving data...', true);
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: dojo.objectToQuery(this.attr('value')),
|
|
||||||
onComplete: function(transport) {
|
|
||||||
dialog.hide();
|
|
||||||
notify('');
|
|
||||||
updateInstanceList();
|
|
||||||
} });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
href: query,
|
|
||||||
});
|
|
||||||
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
} catch (e) {
|
|
||||||
exception_error("addInstance", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function editInstance(id, event) {
|
|
||||||
try {
|
|
||||||
if (!event || !event.ctrlKey) {
|
|
||||||
|
|
||||||
selectTableRows('prefInstanceList', 'none');
|
|
||||||
selectTableRowById('LIRR-'+id, 'LICHK-'+id, true);
|
|
||||||
|
|
||||||
var query = "backend.php?op=pref-instances&method=edit&id=" +
|
|
||||||
param_escape(id);
|
|
||||||
|
|
||||||
if (dijit.byId("instanceEditDlg"))
|
|
||||||
dijit.byId("instanceEditDlg").destroyRecursive();
|
|
||||||
|
|
||||||
dialog = new dijit.Dialog({
|
|
||||||
id: "instanceEditDlg",
|
|
||||||
title: __("Edit Instance"),
|
|
||||||
style: "width: 600px",
|
|
||||||
regenKey: function() {
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: "?op=rpc&method=genHash",
|
|
||||||
onComplete: function(transport) {
|
|
||||||
var reply = JSON.parse(transport.responseText);
|
|
||||||
if (reply)
|
|
||||||
dijit.byId('instance_edit_key').attr('value', reply.hash);
|
|
||||||
|
|
||||||
} });
|
|
||||||
},
|
|
||||||
execute: function() {
|
|
||||||
if (this.validate()) {
|
|
||||||
// console.warn(dojo.objectToQuery(this.attr('value')));
|
|
||||||
|
|
||||||
notify_progress('Saving data...', true);
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: dojo.objectToQuery(this.attr('value')),
|
|
||||||
onComplete: function(transport) {
|
|
||||||
dialog.hide();
|
|
||||||
notify('');
|
|
||||||
updateInstanceList();
|
|
||||||
} });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
href: query,
|
|
||||||
});
|
|
||||||
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
} else if (event.ctrlKey) {
|
|
||||||
var cb = $('LICHK-' + id);
|
|
||||||
cb.checked = !cb.checked;
|
|
||||||
toggleSelectRow(cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} catch (e) {
|
|
||||||
exception_error("editInstance", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeSelectedInstances() {
|
|
||||||
try {
|
|
||||||
var sel_rows = getSelectedInstances();
|
|
||||||
|
|
||||||
if (sel_rows.length > 0) {
|
|
||||||
|
|
||||||
var ok = confirm(__("Remove selected instances?"));
|
|
||||||
|
|
||||||
if (ok) {
|
|
||||||
notify_progress("Removing selected instances...");
|
|
||||||
|
|
||||||
var query = "?op=pref-instances&method=remove&ids="+
|
|
||||||
param_escape(sel_rows.toString());
|
|
||||||
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: query,
|
|
||||||
onComplete: function(transport) {
|
|
||||||
notify('');
|
|
||||||
updateInstanceList();
|
|
||||||
} });
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
alert(__("No instances are selected."));
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (e) {
|
|
||||||
exception_error("removeInstance", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function editSelectedInstance() {
|
|
||||||
var rows = getSelectedInstances();
|
|
||||||
|
|
||||||
if (rows.length == 0) {
|
|
||||||
alert(__("No instances are selected."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rows.length > 1) {
|
|
||||||
alert(__("Please select only one instance."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
notify("");
|
|
||||||
|
|
||||||
editInstance(rows[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function showHelp() {
|
function showHelp() {
|
||||||
try {
|
try {
|
||||||
new Ajax.Request("backend.php", {
|
new Ajax.Request("backend.php", {
|
||||||
|
|
|
@ -9,7 +9,8 @@ class Example_Routing extends Plugin implements IHandler {
|
||||||
// Plugin class must implelement IHandler interface and has
|
// Plugin class must implelement IHandler interface and has
|
||||||
// a public method of same name as being registered.
|
// a public method of same name as being registered.
|
||||||
//
|
//
|
||||||
// Any system method may be masked by plugins.
|
// Any system method may be masked by plugins. You can mask
|
||||||
|
// entire handler by supplying "*" instead of a method name.
|
||||||
|
|
||||||
private $link;
|
private $link;
|
||||||
private $host;
|
private $host;
|
||||||
|
|
1
plugins/instances/README.txt
Normal file
1
plugins/instances/README.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Adds support for linking other tt-rss instances
|
169
plugins/instances/instances.js
Normal file
169
plugins/instances/instances.js
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
function addInstance() {
|
||||||
|
try {
|
||||||
|
var query = "backend.php?op=dlg&method=addInstance";
|
||||||
|
|
||||||
|
if (dijit.byId("instanceAddDlg"))
|
||||||
|
dijit.byId("instanceAddDlg").destroyRecursive();
|
||||||
|
|
||||||
|
dialog = new dijit.Dialog({
|
||||||
|
id: "instanceAddDlg",
|
||||||
|
title: __("Link Instance"),
|
||||||
|
style: "width: 600px",
|
||||||
|
regenKey: function() {
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: "?op=rpc&method=genHash",
|
||||||
|
onComplete: function(transport) {
|
||||||
|
var reply = JSON.parse(transport.responseText);
|
||||||
|
if (reply)
|
||||||
|
dijit.byId('instance_add_key').attr('value', reply.hash);
|
||||||
|
|
||||||
|
} });
|
||||||
|
},
|
||||||
|
execute: function() {
|
||||||
|
if (this.validate()) {
|
||||||
|
console.warn(dojo.objectToQuery(this.attr('value')));
|
||||||
|
|
||||||
|
notify_progress('Saving data...', true);
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: dojo.objectToQuery(this.attr('value')),
|
||||||
|
onComplete: function(transport) {
|
||||||
|
dialog.hide();
|
||||||
|
notify('');
|
||||||
|
updateInstanceList();
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
href: query,
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
exception_error("addInstance", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** INS ***
|
||||||
|
|
||||||
|
function updateInstanceList(sort_key) {
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: "?op=pref-instances&sort=" + param_escape(sort_key),
|
||||||
|
onComplete: function(transport) {
|
||||||
|
dijit.byId('instanceConfigTab').attr('content', transport.responseText);
|
||||||
|
selectTab("instanceConfig", true);
|
||||||
|
notify("");
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
|
||||||
|
function editInstance(id, event) {
|
||||||
|
try {
|
||||||
|
if (!event || !event.ctrlKey) {
|
||||||
|
|
||||||
|
selectTableRows('prefInstanceList', 'none');
|
||||||
|
selectTableRowById('LIRR-'+id, 'LICHK-'+id, true);
|
||||||
|
|
||||||
|
var query = "backend.php?op=pref-instances&method=edit&id=" +
|
||||||
|
param_escape(id);
|
||||||
|
|
||||||
|
if (dijit.byId("instanceEditDlg"))
|
||||||
|
dijit.byId("instanceEditDlg").destroyRecursive();
|
||||||
|
|
||||||
|
dialog = new dijit.Dialog({
|
||||||
|
id: "instanceEditDlg",
|
||||||
|
title: __("Edit Instance"),
|
||||||
|
style: "width: 600px",
|
||||||
|
regenKey: function() {
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: "?op=rpc&method=genHash",
|
||||||
|
onComplete: function(transport) {
|
||||||
|
var reply = JSON.parse(transport.responseText);
|
||||||
|
if (reply)
|
||||||
|
dijit.byId('instance_edit_key').attr('value', reply.hash);
|
||||||
|
|
||||||
|
} });
|
||||||
|
},
|
||||||
|
execute: function() {
|
||||||
|
if (this.validate()) {
|
||||||
|
// console.warn(dojo.objectToQuery(this.attr('value')));
|
||||||
|
|
||||||
|
notify_progress('Saving data...', true);
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: dojo.objectToQuery(this.attr('value')),
|
||||||
|
onComplete: function(transport) {
|
||||||
|
dialog.hide();
|
||||||
|
notify('');
|
||||||
|
updateInstanceList();
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
href: query,
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
} else if (event.ctrlKey) {
|
||||||
|
var cb = $('LICHK-' + id);
|
||||||
|
cb.checked = !cb.checked;
|
||||||
|
toggleSelectRow(cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
exception_error("editInstance", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeSelectedInstances() {
|
||||||
|
try {
|
||||||
|
var sel_rows = getSelectedInstances();
|
||||||
|
|
||||||
|
if (sel_rows.length > 0) {
|
||||||
|
|
||||||
|
var ok = confirm(__("Remove selected instances?"));
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
notify_progress("Removing selected instances...");
|
||||||
|
|
||||||
|
var query = "?op=pref-instances&method=remove&ids="+
|
||||||
|
param_escape(sel_rows.toString());
|
||||||
|
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: query,
|
||||||
|
onComplete: function(transport) {
|
||||||
|
notify('');
|
||||||
|
updateInstanceList();
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
alert(__("No instances are selected."));
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
exception_error("removeInstance", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function editSelectedInstance() {
|
||||||
|
var rows = getSelectedInstances();
|
||||||
|
|
||||||
|
if (rows.length == 0) {
|
||||||
|
alert(__("No instances are selected."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rows.length > 1) {
|
||||||
|
alert(__("Please select only one instance."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
notify("");
|
||||||
|
|
||||||
|
editInstance(rows[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSelectedInstances() {
|
||||||
|
return getSelectedTableRowIds("prefInstanceList");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
class Pref_Instances extends Handler_Protected {
|
class Instances extends Plugin implements IHandler {
|
||||||
|
|
||||||
|
private $link;
|
||||||
|
private $host;
|
||||||
|
|
||||||
private $status_codes = array(
|
private $status_codes = array(
|
||||||
0 => "Connection failed",
|
0 => "Connection failed",
|
||||||
|
@ -7,6 +10,26 @@ class Pref_Instances extends Handler_Protected {
|
||||||
2 => "Invalid object received",
|
2 => "Invalid object received",
|
||||||
16 => "Access denied" );
|
16 => "Access denied" );
|
||||||
|
|
||||||
|
function __construct($host) {
|
||||||
|
$this->link = $host->get_link();
|
||||||
|
$this->host = $host;
|
||||||
|
|
||||||
|
$host->add_hook($host::HOOK_PREFS_TABS, $this);
|
||||||
|
$host->add_handler("pref-instances", "*", $this);
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_prefs_js() {
|
||||||
|
return file_get_contents(dirname(__FILE__) . "/instances.js");
|
||||||
|
}
|
||||||
|
|
||||||
|
function hook_prefs_tabs($args) {
|
||||||
|
if ($_SESSION["access_level"] >= 10 || SINGLE_USER_MODE) {
|
||||||
|
?><div id="instanceConfigTab" dojoType="dijit.layout.ContentPane"
|
||||||
|
href="backend.php?op=pref-instances"
|
||||||
|
title="<?php echo __('Linked') ?>"></div><?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function csrf_ignore($method) {
|
function csrf_ignore($method) {
|
||||||
$csrf_ignored = array("index", "edit");
|
$csrf_ignored = array("index", "edit");
|
||||||
|
|
||||||
|
@ -14,7 +37,7 @@ class Pref_Instances extends Handler_Protected {
|
||||||
}
|
}
|
||||||
|
|
||||||
function before($method) {
|
function before($method) {
|
||||||
if (parent::before($method)) {
|
if ($_SESSION["uid"]) {
|
||||||
if ($_SESSION["access_level"] < 10) {
|
if ($_SESSION["access_level"] < 10) {
|
||||||
print __("Your access level is insufficient to open this tab.");
|
print __("Your access level is insufficient to open this tab.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -24,6 +47,10 @@ class Pref_Instances extends Handler_Protected {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function after() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function remove() {
|
function remove() {
|
||||||
$ids = db_escape_string($_REQUEST['ids']);
|
$ids = db_escape_string($_REQUEST['ids']);
|
||||||
|
|
||||||
|
@ -219,5 +246,7 @@ class Pref_Instances extends Handler_Protected {
|
||||||
print "</div>"; #container
|
print "</div>"; #container
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
10
prefs.php
10
prefs.php
|
@ -120,12 +120,10 @@
|
||||||
href="backend.php?op=pref-users"
|
href="backend.php?op=pref-users"
|
||||||
title="<?php echo __('Users') ?>"></div>
|
title="<?php echo __('Users') ?>"></div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<?php if ($_SESSION["access_level"] >= 10 || SINGLE_USER_MODE) { ?>
|
<?php
|
||||||
<div id="instanceConfigTab" dojoType="dijit.layout.ContentPane"
|
$pluginhost->run_hooks($pluginhost::HOOK_PREFS_TABS,
|
||||||
href="backend.php?op=pref-instances"
|
"hook_prefs_tabs", false);
|
||||||
title="<?php echo __('Linked') ?>"></div>
|
?>
|
||||||
<?php } ?>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="footer" dojoType="dijit.layout.ContentPane" region="bottom">
|
<div id="footer" dojoType="dijit.layout.ContentPane" region="bottom">
|
||||||
|
|
Loading…
Reference in a new issue