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_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;

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) { 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", {

View file

@ -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;

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 <?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
} }
} }
?> ?>

View file

@ -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">