From ade2d04cb30cd249794f53a2a92e1c601073402c Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 18 Jan 2011 15:58:28 -0800 Subject: [PATCH 1/5] Work in progress on helper wizard for feed mirror discovery/setup --- plugins/SubMirror/actions/mirrorsettings.php | 2 + .../SubMirror/images/providers/facebook.png | Bin 0 -> 958 bytes plugins/SubMirror/images/providers/feed.png | Bin 0 -> 2434 bytes .../SubMirror/images/providers/linkedin.png | Bin 0 -> 2100 bytes .../SubMirror/images/providers/statusnet.png | Bin 0 -> 6168 bytes .../SubMirror/images/providers/twitter.png | Bin 0 -> 1192 bytes .../SubMirror/images/providers/wordpress.png | Bin 0 -> 4861 bytes plugins/SubMirror/lib/addmirrorwizard.php | 155 ++++++++++++++++++ 8 files changed, 157 insertions(+) create mode 100644 plugins/SubMirror/images/providers/facebook.png create mode 100644 plugins/SubMirror/images/providers/feed.png create mode 100644 plugins/SubMirror/images/providers/linkedin.png create mode 100644 plugins/SubMirror/images/providers/statusnet.png create mode 100644 plugins/SubMirror/images/providers/twitter.png create mode 100644 plugins/SubMirror/images/providers/wordpress.png create mode 100644 plugins/SubMirror/lib/addmirrorwizard.php diff --git a/plugins/SubMirror/actions/mirrorsettings.php b/plugins/SubMirror/actions/mirrorsettings.php index 20e1807b3d..195946c884 100644 --- a/plugins/SubMirror/actions/mirrorsettings.php +++ b/plugins/SubMirror/actions/mirrorsettings.php @@ -88,6 +88,8 @@ class MirrorSettingsAction extends AccountSettingsAction function showAddFeedForm() { + $form = new AddMirrorWizard($this); + $form->show(); $form = new AddMirrorForm($this); $form->show(); } diff --git a/plugins/SubMirror/images/providers/facebook.png b/plugins/SubMirror/images/providers/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..13a53aa63cfb8204e93237a364f795717c16f58d GIT binary patch literal 958 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 A82|tP literal 0 HcmV?d00001 diff --git a/plugins/SubMirror/images/providers/linkedin.png b/plugins/SubMirror/images/providers/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..82103d1f3f17839c6fe0bd90222d4f94c351feb5 GIT binary patch literal 2100 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. + * + * @package StatusNet + * @copyright 2010-2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class AddMirrorWizard extends Form +{ + /** + * Name of the form + * + * Sub-classes should overload this with the name of their form. + * + * @return void + */ + function formLegend() + { + } + + /** + * Visible or invisible data elements + * + * Display the form fields that make up the data of the form. + * Sub-classes should overload this to show their data. + * + * @return void + */ + function formData() + { + $this->out->elementStart('fieldset'); + + $providers = $this->providers(); + $this->showProviders($providers); + + $this->out->elementEnd('fieldset'); + } + + function providers() + { + return array( + array( + 'id' => 'statusnet', + 'name' => _m('StatusNet'), + ), + array( + 'id' => 'twitter', + 'name' => _m('Twitter'), + ), + array( + 'id' => 'wordpress', + 'name' => _m('WordPress'), + ), + array( + 'id' => 'linkedin', + 'name' => _m('LinkedIn'), + ), + array( + 'id' => 'feed', + 'name' => _m('RSS or Atom feed'), + ), + ); + } + + function showProviders(array $providers) + { + $out = $this->out; + + $out->elementStart('table', array('width' => '100%')); + foreach ($providers as $provider) { + $icon = common_path('plugins/SubMirror/images/providers/' . $provider['id'] . '.png'); + $out->elementStart('tr'); + + $out->elementStart('td', array('style' => 'text-align: right; vertical-align: middle')); + $out->element('img', array('src' => $icon)); + $out->elementEnd('td'); + + $out->elementStart('td', array('style' => 'text-align: left; vertical-align: middle')); + $out->text($provider['name']); + $out->elementEnd('td'); + + $out->elementEnd('tr'); + } + $out->elementEnd('table'); + } + + /** + * Buttons for form actions + * + * Submit and cancel buttons (or whatever) + * Sub-classes should overload this to show their own buttons. + * + * @return void + */ + function formActions() + { + } + + /** + * ID of the form + * + * Should be unique on the page. Sub-classes should overload this + * to show their own IDs. + * + * @return string ID of the form + */ + function id() + { + return 'add-mirror-wizard'; + } + + /** + * Action of the form. + * + * URL to post to. Should be overloaded by subclasses to give + * somewhere to post to. + * + * @return string URL to post to + */ + function action() + { + return common_local_url('addmirror'); + } + + /** + * Class of the form. + * + * @return string the form's class + */ + function formClass() + { + return 'form_settings'; + } +} From aa901bb61cd7bf3fc38d55f5b041abb0b766bcb6 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 18 Jan 2011 18:01:57 -0800 Subject: [PATCH 2/5] Work in progress: AJAXy interface for grabbing feed subscription helper detail forms. Currently they all show the regular subform. :) --- plugins/SubMirror/SubMirrorPlugin.php | 3 + plugins/SubMirror/actions/mirrorsettings.php | 64 +++++++++++++++++--- plugins/SubMirror/css/mirrorsettings.css | 17 ++++++ plugins/SubMirror/js/mirrorsettings.js | 45 ++++++++++++++ plugins/SubMirror/lib/addmirrorwizard.php | 18 +++--- 5 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 plugins/SubMirror/css/mirrorsettings.css create mode 100644 plugins/SubMirror/js/mirrorsettings.js diff --git a/plugins/SubMirror/SubMirrorPlugin.php b/plugins/SubMirror/SubMirrorPlugin.php index 38a4c40d48..a9cb2315b4 100644 --- a/plugins/SubMirror/SubMirrorPlugin.php +++ b/plugins/SubMirror/SubMirrorPlugin.php @@ -35,6 +35,9 @@ class SubMirrorPlugin extends Plugin { $m->connect('settings/mirror', array('action' => 'mirrorsettings')); + $m->connect('settings/mirror/add/:provider', + array('action' => 'mirrorsettings'), + array('provider' => '[A-Za-z0-9_-]+')); $m->connect('settings/mirror/add', array('action' => 'addmirror')); $m->connect('settings/mirror/edit', diff --git a/plugins/SubMirror/actions/mirrorsettings.php b/plugins/SubMirror/actions/mirrorsettings.php index 195946c884..114b8b40fe 100644 --- a/plugins/SubMirror/actions/mirrorsettings.php +++ b/plugins/SubMirror/actions/mirrorsettings.php @@ -65,18 +65,30 @@ class MirrorSettingsAction extends AccountSettingsAction function showContent() { $user = common_current_user(); + $provider = $this->trimmed('provider'); + if ($provider) { + $this->showAddFeedForm($provider); + } else { + $this->elementStart('div', array('id' => 'add-mirror')); + $this->showAddWizard(); + $this->elementEnd('div'); - $this->showAddFeedForm(); - - $mirror = new SubMirror(); - $mirror->subscriber = $user->id; - if ($mirror->find()) { - while ($mirror->fetch()) { - $this->showFeedForm($mirror); + $mirror = new SubMirror(); + $mirror->subscriber = $user->id; + if ($mirror->find()) { + while ($mirror->fetch()) { + $this->showFeedForm($mirror); + } } } } + function showAddWizard() + { + $form = new AddMirrorWizard($this); + $form->show(); + } + function showFeedForm($mirror) { $profile = Profile::staticGet('id', $mirror->subscribed); @@ -88,12 +100,34 @@ class MirrorSettingsAction extends AccountSettingsAction function showAddFeedForm() { - $form = new AddMirrorWizard($this); - $form->show(); $form = new AddMirrorForm($this); $form->show(); } + /** + * + * @param array $args + * + * @todo move the ajax display handling to common code + */ + function handle($args) + { + if ($this->boolean('ajax')) { + header('Content-Type: text/html;charset=utf-8'); + $this->elementStart('html'); + $this->elementStart('head'); + $this->element('title', null, _('Provider add')); + $this->elementEnd('head'); + $this->elementStart('body'); + + $this->showAddFeedForm(); + + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + return parent::handle($args); + } + } /** * Handle a POST request * @@ -110,4 +144,16 @@ class MirrorSettingsAction extends AccountSettingsAction $nav = new SubGroupNav($this, common_current_user()); $nav->show(); } + + function showScripts() + { + parent::showScripts(); + $this->script('plugins/SubMirror/js/mirrorsettings.js'); + } + + function showStylesheets() + { + parent::showStylesheets(); + $this->cssLink('plugins/SubMirror/css/mirrorsettings.css'); + } } diff --git a/plugins/SubMirror/css/mirrorsettings.css b/plugins/SubMirror/css/mirrorsettings.css new file mode 100644 index 0000000000..d17c794f40 --- /dev/null +++ b/plugins/SubMirror/css/mirrorsettings.css @@ -0,0 +1,17 @@ +/* undo insane stuff from core styles */ +#add-mirror-wizard img { + display: inline; +} + +/* we need #something to override most of the #content crap */ + +#add-mirror-wizard .provider-list table { + width: 100%; +} + +#add-mirror-wizard .provider-heading img { + vertical-align: middle; +} +#add-mirror-wizard .provider-heading { + cursor: pointer; +} diff --git a/plugins/SubMirror/js/mirrorsettings.js b/plugins/SubMirror/js/mirrorsettings.js new file mode 100644 index 0000000000..e772af3dea --- /dev/null +++ b/plugins/SubMirror/js/mirrorsettings.js @@ -0,0 +1,45 @@ +$(function() { + /** + * Append 'ajax=1' parameter onto URL. + */ + function ajaxize(url) { + if (url.indexOf('?') == '-1') { + return url + '?ajax=1'; + } else { + return url + '&ajax=1'; + } + } + + var addMirror = $('#add-mirror'); + var wizard = $('#add-mirror-wizard'); + if (wizard.length > 0) { + var list = wizard.find('.provider-list'); + var providers = list.find('.provider-heading'); + providers.click(function(event) { + console.log(this); + var targetUrl = $(this).find('a').attr('href'); + if (targetUrl) { + // Make sure we don't accidentally follow the direct link + event.preventDefault(); + + var node = this; + function showNew() { + var detail = $('').insertAfter(node); + detail.load(ajaxize(targetUrl), function(responseText, testStatus, xhr) { + detail.slideDown(); + }); + } + + var old = addMirror.find('.provider-detail'); + if (old.length) { + old.slideUp(function() { + old.remove(); + showNew(); + }); + } else { + showNew(); + } + } + }); + } +}); \ No newline at end of file diff --git a/plugins/SubMirror/lib/addmirrorwizard.php b/plugins/SubMirror/lib/addmirrorwizard.php index 1ac8aa1388..0994819b41 100644 --- a/plugins/SubMirror/lib/addmirrorwizard.php +++ b/plugins/SubMirror/lib/addmirrorwizard.php @@ -87,22 +87,26 @@ class AddMirrorWizard extends Form { $out = $this->out; - $out->elementStart('table', array('width' => '100%')); + $out->elementStart('div', 'provider-list'); + $out->element('h2', null, _m('Select a feed provider')); + $out->elementStart('table'); foreach ($providers as $provider) { $icon = common_path('plugins/SubMirror/images/providers/' . $provider['id'] . '.png'); - $out->elementStart('tr'); + $targetUrl = common_local_url('mirrorsettings', array('provider' => $provider['id'])); - $out->elementStart('td', array('style' => 'text-align: right; vertical-align: middle')); + $out->elementStart('tr', array('class' => 'provider')); + $out->elementStart('td'); + + $out->elementStart('div', 'provider-heading'); $out->element('img', array('src' => $icon)); - $out->elementEnd('td'); + $out->element('a', array('href' => $targetUrl), $provider['name']); + $out->elementEnd('div'); - $out->elementStart('td', array('style' => 'text-align: left; vertical-align: middle')); - $out->text($provider['name']); $out->elementEnd('td'); - $out->elementEnd('tr'); } $out->elementEnd('table'); + $out->elementEnd('div'); } /** From b1897e019021af1128540bbde4682538ac0a0dc5 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 18 Jan 2011 18:13:24 -0800 Subject: [PATCH 3/5] viz cleanup on AddMirrorWizard --- plugins/SubMirror/css/mirrorsettings.css | 9 +++++++++ plugins/SubMirror/js/mirrorsettings.js | 6 ++++-- plugins/SubMirror/lib/addmirrorwizard.php | 8 ++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/plugins/SubMirror/css/mirrorsettings.css b/plugins/SubMirror/css/mirrorsettings.css index d17c794f40..c91bb73b6b 100644 --- a/plugins/SubMirror/css/mirrorsettings.css +++ b/plugins/SubMirror/css/mirrorsettings.css @@ -5,6 +5,11 @@ /* we need #something to override most of the #content crap */ +#add-mirror-wizard { + margin-left: 20px; + margin-right: 20px; +} + #add-mirror-wizard .provider-list table { width: 100%; } @@ -15,3 +20,7 @@ #add-mirror-wizard .provider-heading { cursor: pointer; } +#add-mirror-wizard .provider-detail fieldset { + margin-top: 8px; /* hack */ + margin-bottom: 8px; /* hack */ +} \ No newline at end of file diff --git a/plugins/SubMirror/js/mirrorsettings.js b/plugins/SubMirror/js/mirrorsettings.js index e772af3dea..a27abe7ad5 100644 --- a/plugins/SubMirror/js/mirrorsettings.js +++ b/plugins/SubMirror/js/mirrorsettings.js @@ -26,13 +26,15 @@ $(function() { function showNew() { var detail = $('').insertAfter(node); detail.load(ajaxize(targetUrl), function(responseText, testStatus, xhr) { - detail.slideDown(); + detail.slideDown('fast', function() { + detail.find('input[type="text"]').focus(); + }); }); } var old = addMirror.find('.provider-detail'); if (old.length) { - old.slideUp(function() { + old.slideUp('fast', function() { old.remove(); showNew(); }); diff --git a/plugins/SubMirror/lib/addmirrorwizard.php b/plugins/SubMirror/lib/addmirrorwizard.php index 0994819b41..7a63f8366b 100644 --- a/plugins/SubMirror/lib/addmirrorwizard.php +++ b/plugins/SubMirror/lib/addmirrorwizard.php @@ -26,7 +26,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -class AddMirrorWizard extends Form +class AddMirrorWizard extends Widget { /** * Name of the form @@ -47,14 +47,14 @@ class AddMirrorWizard extends Form * * @return void */ - function formData() + function show() { - $this->out->elementStart('fieldset'); + $this->out->elementStart('div', array('id' => 'add-mirror-wizard')); $providers = $this->providers(); $this->showProviders($providers); - $this->out->elementEnd('fieldset'); + $this->out->elementEnd('div'); } function providers() From ce05a78d0843b7d6f1664d128d0cfd3eac5e2801 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 15 Mar 2011 17:15:25 -0700 Subject: [PATCH 4/5] SubMirror wizard work in progress: Twitter option now lets you type in a username and picks the feed. Should in theory work via superfeedr or other compatible hub --- plugins/SubMirror/actions/addmirror.php | 18 +++++- plugins/SubMirror/actions/basemirror.php | 2 +- plugins/SubMirror/actions/mirrorsettings.php | 15 ++++- plugins/SubMirror/lib/addmirrorform.php | 3 +- .../SubMirror/lib/addtwittermirrorform.php | 60 +++++++++++++++++++ 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 plugins/SubMirror/lib/addtwittermirrorform.php diff --git a/plugins/SubMirror/actions/addmirror.php b/plugins/SubMirror/actions/addmirror.php index 8c3a9740f3..31805c1669 100644 --- a/plugins/SubMirror/actions/addmirror.php +++ b/plugins/SubMirror/actions/addmirror.php @@ -59,11 +59,27 @@ class AddMirrorAction extends BaseMirrorAction function prepare($args) { parent::prepare($args); - $this->feedurl = $this->validateFeedUrl($this->trimmed('feedurl')); + $feedurl = $this->getFeedUrl(); + $this->feedurl = $this->validateFeedUrl($feedurl); $this->profile = $this->profileForFeed($this->feedurl); return true; } + function getFeedUrl() + { + $provider = $this->trimmed('provider'); + switch ($provider) { + case 'feed': + return $this->trimmed('feedurl'); + case 'twitter': + $screenie = $this->trimmed('screen_name'); + $base = 'http://api.twitter.com/1/statuses/user_timeline.atom?screen_name='; + return $base . urlencode($screenie); + default: + throw new Exception('Internal form error: unrecognized feed provider.'); + } + } + function saveMirror() { if ($this->oprofile->subscribe()) { diff --git a/plugins/SubMirror/actions/basemirror.php b/plugins/SubMirror/actions/basemirror.php index 3e3431103f..843dfb92e1 100644 --- a/plugins/SubMirror/actions/basemirror.php +++ b/plugins/SubMirror/actions/basemirror.php @@ -68,7 +68,7 @@ abstract class BaseMirrorAction extends Action if (common_valid_http_url($url)) { return $url; } else { - $this->clientError(_m("Invalid feed URL.")); + $this->clientError(sprintf(_m("Invalid feed URL: %s"), $url)); } } diff --git a/plugins/SubMirror/actions/mirrorsettings.php b/plugins/SubMirror/actions/mirrorsettings.php index ae09111ec4..90bbf3dffb 100644 --- a/plugins/SubMirror/actions/mirrorsettings.php +++ b/plugins/SubMirror/actions/mirrorsettings.php @@ -100,7 +100,20 @@ class MirrorSettingsAction extends SettingsAction function showAddFeedForm() { - $form = new AddMirrorForm($this); + switch ($this->arg('provider')) { + case 'statusnet': + break; + case 'twitter': + $form = new AddTwitterMirrorForm($this); + break; + case 'wordpress': + break; + case 'linkedin': + break; + case 'feed': + default: + $form = new AddMirrorForm($this); + } $form->show(); } diff --git a/plugins/SubMirror/lib/addmirrorform.php b/plugins/SubMirror/lib/addmirrorform.php index e1d50c272c..17edbd5e96 100644 --- a/plugins/SubMirror/lib/addmirrorform.php +++ b/plugins/SubMirror/lib/addmirrorform.php @@ -49,6 +49,7 @@ class AddMirrorForm extends Form */ function formData() { + $this->out->hidden('provider', 'feed'); $this->out->elementStart('fieldset'); $this->out->elementStart('ul'); @@ -67,7 +68,7 @@ class AddMirrorForm extends Form $this->out->elementEnd('fieldset'); } - private function doInput($id, $name, $label, $value=null, $instructions=null) + protected function doInput($id, $name, $label, $value=null, $instructions=null) { $this->out->element('label', array('for' => $id), $label); $attrs = array('name' => $name, diff --git a/plugins/SubMirror/lib/addtwittermirrorform.php b/plugins/SubMirror/lib/addtwittermirrorform.php new file mode 100644 index 0000000000..eb28aa038f --- /dev/null +++ b/plugins/SubMirror/lib/addtwittermirrorform.php @@ -0,0 +1,60 @@ +. + * + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class AddTwitterMirrorForm extends AddMirrorForm +{ + + /** + * Visible or invisible data elements + * + * Display the form fields that make up the data of the form. + * Sub-classes should overload this to show their data. + * + * @return void + */ + function formData() + { + $this->out->hidden('provider', 'twitter'); + $this->out->elementStart('fieldset'); + + $this->out->elementStart('ul'); + + $this->li(); + $this->doInput('addmirror-feedurl', + 'screen_name', + _m('Twitter username:'), + $this->out->trimmed('screen_name')); + $this->unli(); + + $this->li(); + $this->out->submit('addmirror-save', _m('BUTTON','Add feed')); + $this->unli(); + $this->out->elementEnd('ul'); + $this->out->elementEnd('fieldset'); + } +} From 73b5821fc33225978e51cb04c9e5ad1434bc018c Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 15 Mar 2011 17:32:09 -0700 Subject: [PATCH 5/5] Submirror wizard updates... commenting out Wordpress (not sure what to do with it), LinkedIn (can't find documentation on any public RSS/Atom feeds from it, it seems that a feed of your updates doesn't currently exist?), and StatusNet (we'd need to know what to do with it; could take webfinger-style addresses or such.) Also added a commented-out Facebook section; it seems that there may not be a current way to get at public updates via RSS/Atom either, or if it is it seems really inconsistent and undocumented. (You can get at your friends updates by jumping through some hoops, but it seems we'd want to mirror a single account's own update feed?) --- plugins/SubMirror/lib/addmirrorwizard.php | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/plugins/SubMirror/lib/addmirrorwizard.php b/plugins/SubMirror/lib/addmirrorwizard.php index 7a63f8366b..920db0bc9c 100644 --- a/plugins/SubMirror/lib/addmirrorwizard.php +++ b/plugins/SubMirror/lib/addmirrorwizard.php @@ -60,22 +60,50 @@ class AddMirrorWizard extends Widget function providers() { return array( + /* + // We could accept hostname & username combos here, or + // webfingery combinations as for remote users. array( 'id' => 'statusnet', 'name' => _m('StatusNet'), ), + */ + // Accepts a Twitter username and pulls their user timeline as a + // public Atom feed. Requires a working alternate hub which, one + // hopes, is getting timely updates. array( 'id' => 'twitter', 'name' => _m('Twitter'), ), + /* + // WordPress was on our list some whiles ago, but not sure + // what we can actually do here. Search on Wordpress.com hosted + // sites, or ? array( 'id' => 'wordpress', 'name' => _m('WordPress'), ), + */ + /* + // In theory, Facebook lets you pull public updates over RSS, + // but the URLs for your own update feed that I can find from + // 2009-era websites no longer seem to work and there's no + // good current documentation. May not still be available... + // Mirroring from an FB account is probably better done with + // the dedicated plugin. (As of March 2011) + array( + 'id' => 'facebook', + 'name' => _m('Facebook'), + ), + */ + /* + // LinkedIn doesn't currently seem to have public feeds + // for users or groups (March 2011) array( 'id' => 'linkedin', 'name' => _m('LinkedIn'), ), + */ array( 'id' => 'feed', 'name' => _m('RSS or Atom feed'),