add instances plugin

This commit is contained in:
Andrew Dolgov 2012-12-23 23:36:07 +04:00
parent 8dcb2b4762
commit 6cbe53c9f5
7 changed files with 216 additions and 178 deletions

View file

@ -9,6 +9,7 @@ class PluginHost {
const HOOK_ARTICLE_FILTER = 2;
const HOOK_PREFS_TAB = 3;
const HOOK_PREFS_SECTION = 4;
const HOOK_PREFS_TABS = 5;
function __construct($link) {
$this->link = $link;
@ -77,7 +78,7 @@ class PluginHost {
}
function add_handler($handler, $method, $sender) {
$handler = strtolower($handler);
$handler = str_replace("-", "_", strtolower($handler));
$method = strtolower($method);
if (!is_array($this->handlers[$handler])) {
@ -88,19 +89,23 @@ class PluginHost {
}
function del_handler($handler, $method) {
$handler = strtolower($handler);
$handler = str_replace("-", "_", strtolower($handler));
$method = strtolower($method);
unset($this->handlers[$handler][$method]);
}
function lookup_handler($handler, $method) {
$handler = strtolower($handler);
$handler = str_replace("-", "_", strtolower($handler));
$method = strtolower($method);
if (is_array($this->handlers[$handler])) {
if (isset($this->handlers[$handler]["*"])) {
return $this->handlers[$handler]["*"];
} else {
return $this->handlers[$handler][$method];
}
}
return false;
}

View file

@ -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) {
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() {
try {
new Ajax.Request("backend.php", {

View file

@ -9,7 +9,8 @@ class Example_Routing extends Plugin implements IHandler {
// Plugin class must implelement IHandler interface and has
// 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 $host;

View file

@ -0,0 +1 @@
Adds support for linking other tt-rss instances

View 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");
}

View file

@ -1,5 +1,8 @@
<?php
class Pref_Instances extends Handler_Protected {
class Instances extends Plugin implements IHandler {
private $link;
private $host;
private $status_codes = array(
0 => "Connection failed",
@ -7,6 +10,26 @@ class Pref_Instances extends Handler_Protected {
2 => "Invalid object received",
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) {
$csrf_ignored = array("index", "edit");
@ -14,7 +37,7 @@ class Pref_Instances extends Handler_Protected {
}
function before($method) {
if (parent::before($method)) {
if ($_SESSION["uid"]) {
if ($_SESSION["access_level"] < 10) {
print __("Your access level is insufficient to open this tab.");
return false;
@ -24,6 +47,10 @@ class Pref_Instances extends Handler_Protected {
return false;
}
function after() {
return true;
}
function remove() {
$ids = db_escape_string($_REQUEST['ids']);
@ -219,5 +246,7 @@ class Pref_Instances extends Handler_Protected {
print "</div>"; #container
}
}
?>

View file

@ -120,12 +120,10 @@
href="backend.php?op=pref-users"
title="<?php echo __('Users') ?>"></div>
<?php } ?>
<?php 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 } ?>
<?php
$pluginhost->run_hooks($pluginhost::HOOK_PREFS_TABS,
"hook_prefs_tabs", false);
?>
</div>
<div id="footer" dojoType="dijit.layout.ContentPane" region="bottom">