summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-10-02 09:36:32 +0200
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-10-02 09:36:32 +0200
commitf1a5a174ea8731cbfbe8d9d692976765030b5f80 (patch)
tree38af1844daeab2b430bddd02a4b07d9879d27142 /app
parent7be9613fa6bf4718e700d01f58f599c8d50e1501 (diff)
parentbbedca510bb0b88850476bf2e2aa6af8c02ac741 (diff)
Merge branch '646-new-cat-system' into dev
Diffstat (limited to 'app')
-rw-r--r--app/Controllers/categoryController.php187
-rwxr-xr-xapp/Controllers/configureController.php162
-rwxr-xr-xapp/Controllers/feedController.php80
-rw-r--r--app/Controllers/subscriptionController.php119
-rw-r--r--app/Models/Category.php2
-rw-r--r--app/Models/Themes.php1
-rw-r--r--app/layout/aside_feed.phtml75
-rw-r--r--app/layout/aside_flux.phtml6
-rw-r--r--app/layout/aside_subscription.phtml17
-rw-r--r--app/views/configure/categorize.phtml55
-rw-r--r--app/views/helpers/feed/update.phtml (renamed from app/views/configure/feed.phtml)57
-rw-r--r--app/views/helpers/view/global_view.phtml2
-rw-r--r--app/views/helpers/view/normal_view.phtml2
-rw-r--r--app/views/helpers/view/reader_view.phtml2
-rw-r--r--app/views/importExport/index.phtml2
-rw-r--r--app/views/stats/idle.phtml2
-rw-r--r--app/views/stats/repartition.phtml2
-rw-r--r--app/views/subscription/feed.phtml15
-rw-r--r--app/views/subscription/index.phtml145
19 files changed, 547 insertions, 386 deletions
diff --git a/app/Controllers/categoryController.php b/app/Controllers/categoryController.php
new file mode 100644
index 000000000..c79f37fa4
--- /dev/null
+++ b/app/Controllers/categoryController.php
@@ -0,0 +1,187 @@
+<?php
+
+/**
+ * Controller to handle actions relative to categories.
+ * User needs to be connected.
+ */
+class FreshRSS_category_Controller extends Minz_ActionController {
+ /**
+ * This action is called before every other action in that class. It is
+ * the common boiler plate for every action. It is triggered by the
+ * underlying framework.
+ *
+ */
+ public function firstAction() {
+ if (!$this->view->loginOk) {
+ Minz_Error::error(
+ 403,
+ array('error' => array(_t('access_denied')))
+ );
+ }
+
+ $catDAO = new FreshRSS_CategoryDAO();
+ $catDAO->checkDefault();
+ }
+
+ /**
+ * This action creates a new category.
+ *
+ * Request parameter is:
+ * - new-category
+ */
+ public function createAction() {
+ $catDAO = new FreshRSS_CategoryDAO();
+ $url_redirect = array('c' => 'subscription', 'a' => 'index');
+
+ if (Minz_Request::isPost()) {
+ invalidateHttpCache();
+
+ $cat_name = Minz_Request::param('new-category');
+ if (!$cat_name) {
+ Minz_Request::bad(_t('category_no_name'), $url_redirect);
+ }
+
+ $cat = new FreshRSS_Category($cat_name);
+
+ if ($catDAO->searchByName($cat->name()) != null) {
+ Minz_Request::bad(_t('category_name_exists'), $url_redirect);
+ }
+
+ $values = array(
+ 'id' => $cat->id(),
+ 'name' => $cat->name(),
+ );
+
+ if ($catDAO->addCategory($values)) {
+ Minz_Request::good(_t('category_created', $cat->name()), $url_redirect);
+ } else {
+ Minz_Request::bad(_t('error_occurred'), $url_redirect);
+ }
+ }
+
+ Minz_Request::forward($url_redirect, true);
+ }
+
+ /**
+ * This action updates the given category.
+ *
+ * Request parameters are:
+ * - id
+ * - name
+ */
+ public function updateAction() {
+ $catDAO = new FreshRSS_CategoryDAO();
+ $url_redirect = array('c' => 'subscription', 'a' => 'index');
+
+ if (Minz_Request::isPost()) {
+ invalidateHttpCache();
+
+ $id = Minz_Request::param('id');
+ $name = Minz_Request::param('name', '');
+ if (strlen($name) <= 0) {
+ Minz_Request::bad(_t('category_no_name'), $url_redirect);
+ }
+
+ if ($catDAO->searchById($id) == null) {
+ Minz_Request::bad(_t('category_not_exist'), $url_redirect);
+ }
+
+ $cat = new FreshRSS_Category($name);
+ $values = array(
+ 'name' => $cat->name(),
+ );
+
+ if ($catDAO->updateCategory($id, $values)) {
+ Minz_Request::good(_t('category_updated'), $url_redirect);
+ } else {
+ Minz_Request::bad(_t('error_occurred'), $url_redirect);
+ }
+ }
+
+ Minz_Request::forward($url_redirect, true);
+ }
+
+ /**
+ * This action deletes a category.
+ * Feeds in the given category are moved in the default category.
+ * Related user queries are deleted too.
+ *
+ * Request parameter is:
+ * - id (of a category)
+ */
+ public function deleteAction() {
+ $feedDAO = FreshRSS_Factory::createFeedDao();
+ $catDAO = new FreshRSS_CategoryDAO();
+ $default_category = $catDAO->getDefault();
+ $url_redirect = array('c' => 'subscription', 'a' => 'index');
+
+ if (Minz_Request::isPost()) {
+ invalidateHttpCache();
+
+ $id = Minz_Request::param('id');
+ if (!$id) {
+ Minz_Request::bad(_t('category_no_id'), $url_redirect);
+ }
+
+ if ($id === $default_category->id()) {
+ Minz_Request::bad(_t('category_not_delete_default'), $url_redirect);
+ }
+
+ if ($feedDAO->changeCategory($id, $default_category->id()) === false) {
+ Minz_Request::bad(_t('error_occurred'), $url_redirect);
+ }
+
+ if ($catDAO->deleteCategory($id) === false) {
+ Minz_Request::bad(_t('error_occurred'), $url_redirect);
+ }
+
+ // Remove related queries.
+ $this->view->conf->remove_query_by_get('c_' . $id);
+ $this->view->conf->save();
+
+ Minz_Request::good(_t('category_deleted'), $url_redirect);
+ }
+
+ Minz_Request::forward($url_redirect, true);
+ }
+
+ /**
+ * This action deletes all the feeds relative to a given category.
+ * Feed-related queries are deleted.
+ *
+ * Request parameter is:
+ * - id (of a category)
+ */
+ public function emptyAction() {
+ $feedDAO = FreshRSS_Factory::createFeedDao();
+ $url_redirect = array('c' => 'subscription', 'a' => 'index');
+
+ if (Minz_Request::isPost()) {
+ invalidateHttpCache();
+
+ $id = Minz_Request::param('id');
+ if (!$id) {
+ Minz_Request::bad(_t('category_no_id'), $url_redirect);
+ }
+
+ // List feeds to remove then related user queries.
+ $feeds = $feedDAO->listByCategory($id);
+
+ if ($feedDAO->deleteFeedByCategory($id)) {
+ // TODO: Delete old favicons
+
+ // Remove related queries
+ foreach ($feeds as $feed) {
+ $this->view->conf->remove_query_by_get('f_' . $feed->id());
+ }
+ $this->view->conf->save();
+
+ Minz_Request::good(_t('category_emptied'), $url_redirect);
+ } else {
+ Minz_Request::bad(_t('error_occurred'), $url_redirect);
+ }
+ }
+
+ Minz_Request::forward($url_redirect, true);
+ }
+}
diff --git a/app/Controllers/configureController.php b/app/Controllers/configureController.php
index 231865bd7..b7b88b3ba 100755
--- a/app/Controllers/configureController.php
+++ b/app/Controllers/configureController.php
@@ -8,9 +8,6 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
* This action is called before every other action in that class. It is
* the common boiler plate for every action. It is triggered by the
* underlying framework.
- *
- * @todo see if the category default configuration is needed here or if
- * we can move it to the categorize action
*/
public function firstAction() {
if (!$this->view->loginOk) {
@@ -19,165 +16,6 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
array('error' => array(_t('access_denied')))
);
}
-
- $catDAO = new FreshRSS_CategoryDAO();
- $catDAO->checkDefault();
- }
-
- /**
- * This action handles the category configuration page
- *
- * It displays the category configuration page.
- * If this action is reached through a POST request, it loops through
- * every category to check for modification then add a new category if
- * needed then sends a notification to the user.
- * If a category name is emptied, the category is deleted and all
- * related feeds are moved to the default category. Related user queries
- * are deleted too.
- * If a category name is changed, it is updated.
- */
- public function categorizeAction() {
- $feedDAO = FreshRSS_Factory::createFeedDao();
- $catDAO = new FreshRSS_CategoryDAO();
- $defaultCategory = $catDAO->getDefault();
- $defaultId = $defaultCategory->id();
-
- if (Minz_Request::isPost()) {
- $cats = Minz_Request::param('categories', array());
- $ids = Minz_Request::param('ids', array());
- $newCat = trim(Minz_Request::param('new_category', ''));
-
- foreach ($cats as $key => $name) {
- if (strlen($name) > 0) {
- $cat = new FreshRSS_Category($name);
- $values = array(
- 'name' => $cat->name(),
- );
- $catDAO->updateCategory($ids[$key], $values);
- } elseif ($ids[$key] != $defaultId) {
- $feedDAO->changeCategory($ids[$key], $defaultId);
- $catDAO->deleteCategory($ids[$key]);
-
- // Remove related queries.
- $this->view->conf->remove_query_by_get('c_' . $ids[$key]);
- $this->view->conf->save();
- }
- }
-
- if ($newCat != '') {
- $cat = new FreshRSS_Category($newCat);
- $values = array(
- 'id' => $cat->id(),
- 'name' => $cat->name(),
- );
-
- if ($catDAO->searchByName($newCat) == null) {
- $catDAO->addCategory($values);
- }
- }
- invalidateHttpCache();
-
- Minz_Request::good(_t('categories_updated'),
- array('c' => 'configure', 'a' => 'categorize'));
- }
-
- $this->view->categories = $catDAO->listCategories(false);
- $this->view->defaultCategory = $catDAO->getDefault();
- $this->view->feeds = $feedDAO->listFeeds();
-
- Minz_View::prependTitle(_t('categories_management') . ' · ');
- }
-
- /**
- * This action handles the feed configuration page.
- *
- * It displays the feed configuration page.
- * If this action is reached through a POST request, it stores all new
- * configuraiton values then sends a notification to the user.
- *
- * The options available on the page are:
- * - name
- * - description
- * - website URL
- * - feed URL
- * - category id (default: default category id)
- * - CSS path to article on website
- * - display in main stream (default: 0)
- * - HTTP authentication
- * - number of article to retain (default: -2)
- * - refresh frequency (default: -2)
- * Default values are empty strings unless specified.
- */
- public function feedAction() {
- $catDAO = new FreshRSS_CategoryDAO();
- $this->view->categories = $catDAO->listCategories(false);
-
- $feedDAO = FreshRSS_Factory::createFeedDao();
- $this->view->feeds = $feedDAO->listFeeds();
-
- $id = Minz_Request::param('id');
- if ($id == false && !empty($this->view->feeds)) {
- $id = current($this->view->feeds)->id();
- }
-
- $this->view->flux = false;
- if ($id != false) {
- $this->view->flux = $this->view->feeds[$id];
-
- if (!$this->view->flux) {
- Minz_Error::error(
- 404,
- array('error' => array(_t('page_not_found')))
- );
- } else {
- if (Minz_Request::isPost() && $this->view->flux) {
- $user = Minz_Request::param('http_user', '');
- $pass = Minz_Request::param('http_pass', '');
-
- $httpAuth = '';
- if ($user != '' || $pass != '') {
- $httpAuth = $user . ':' . $pass;
- }
-
- $cat = intval(Minz_Request::param('category', 0));
-
- $values = array(
- 'name' => Minz_Request::param('name', ''),
- 'description' => sanitizeHTML(Minz_Request::param('description', '', true)),
- 'website' => Minz_Request::param('website', ''),
- 'url' => Minz_Request::param('url', ''),
- 'category' => $cat,
- 'pathEntries' => Minz_Request::param('path_entries', ''),
- 'priority' => intval(Minz_Request::param('priority', 0)),
- 'httpAuth' => $httpAuth,
- 'keep_history' => intval(Minz_Request::param('keep_history', -2)),
- 'ttl' => intval(Minz_Request::param('ttl', -2)),
- );
-
- if ($feedDAO->updateFeed($id, $values)) {
- $this->view->flux->_category($cat);
- $this->view->flux->faviconPrepare();
- $notif = array(
- 'type' => 'good',
- 'content' => _t('feed_updated')
- );
- } else {
- $notif = array(
- 'type' => 'bad',
- 'content' => _t('error_occurred_update')
- );
- }
- invalidateHttpCache();
-
- Minz_Session::_param('notification', $notif);
- Minz_Request::forward(array('c' => 'configure', 'a' => 'feed', 'params' => array('id' => $id)), true);
- }
-
- Minz_View::prependTitle(_t('rss_feed_management') . ' — ' . $this->view->flux->name() . ' · ');
- }
- } else {
- Minz_View::prependTitle(_t('rss_feed_management') . ' · ');
- }
}
/**
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index c7cc25fbb..e4859b110 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -26,8 +26,8 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
if ($url === false) {
Minz_Request::forward(array(
- 'c' => 'configure',
- 'a' => 'feed'
+ 'c' => 'subscription',
+ 'a' => 'index'
), true);
}
@@ -166,7 +166,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$feedDAO->rollBack ();
}
- Minz_Request::forward (array ('c' => 'configure', 'a' => 'feed', 'params' => $params), true);
+ Minz_Request::forward (array ('c' => 'subscription', 'a' => 'index', 'params' => $params), true);
} else {
// GET request so we must ask confirmation to user
@@ -193,8 +193,8 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
Minz_Session::_param('notification', $notif);
Minz_Request::forward(array(
- 'c' => 'configure',
- 'a' => 'feed',
+ 'c' => 'subscription',
+ 'a' => 'index',
'params' => array(
'id' => $feed->id()
)
@@ -214,7 +214,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
);
Minz_Session::_param ('notification', $notif);
invalidateHttpCache();
- Minz_Request::forward (array ('c' => 'configure', 'a' => 'feed', 'params' => array('id' => $id)), true);
+ Minz_Request::forward (array ('c' => 'subscription',
+ 'a' => 'index',
+ 'params' => array('id' => $id)), true);
}
}
@@ -376,62 +378,36 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
}
- public function deleteAction () {
- if (Minz_Request::isPost ()) {
- $type = Minz_Request::param ('type', 'feed');
- $id = Minz_Request::param ('id');
-
+ public function deleteAction() {
+ if (Minz_Request::isPost()) {
+ $id = Minz_Request::param('id');
$feedDAO = FreshRSS_Factory::createFeedDao();
- if ($type == 'category') {
- // List feeds to remove then related user queries.
- $feeds = $feedDAO->listByCategory($id);
-
- if ($feedDAO->deleteFeedByCategory ($id)) {
- // Remove related queries
- foreach ($feeds as $feed) {
- $this->view->conf->remove_query_by_get('f_' . $feed->id());
- }
- $this->view->conf->save();
- $notif = array (
- 'type' => 'good',
- 'content' => Minz_Translate::t ('category_emptied')
- );
- //TODO: Delete old favicons
- } else {
- $notif = array (
- 'type' => 'bad',
- 'content' => Minz_Translate::t ('error_occured')
- );
- }
- } else {
- if ($feedDAO->deleteFeed ($id)) {
- // Remove related queries
- $this->view->conf->remove_query_by_get('f_' . $id);
- $this->view->conf->save();
+ if ($feedDAO->deleteFeed($id)) {
+ // TODO: Delete old favicon
- $notif = array (
- 'type' => 'good',
- 'content' => Minz_Translate::t ('feed_deleted')
- );
- //TODO: Delete old favicon
- } else {
- $notif = array (
- 'type' => 'bad',
- 'content' => Minz_Translate::t ('error_occured')
- );
- }
+ // Remove related queries
+ $this->view->conf->remove_query_by_get('f_' . $id);
+ $this->view->conf->save();
+
+ $notif = array(
+ 'type' => 'good',
+ 'content' => _t('feed_deleted')
+ );
+ } else {
+ $notif = array(
+ 'type' => 'bad',
+ 'content' => _t('error_occured')
+ );
}
- Minz_Session::_param ('notification', $notif);
+ Minz_Session::_param('notification', $notif);
$redirect_url = Minz_Request::param('r', false, true);
if ($redirect_url) {
Minz_Request::forward($redirect_url);
- } elseif ($type == 'category') {
- Minz_Request::forward(array ('c' => 'configure', 'a' => 'categorize'), true);
} else {
- Minz_Request::forward(array ('c' => 'configure', 'a' => 'feed'), true);
+ Minz_Request::forward(array('c' => 'subscription', 'a' => 'index'), true);
}
}
}
diff --git a/app/Controllers/subscriptionController.php b/app/Controllers/subscriptionController.php
new file mode 100644
index 000000000..aabae7b8f
--- /dev/null
+++ b/app/Controllers/subscriptionController.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * Controller to handle subscription actions.
+ */
+class FreshRSS_subscription_Controller extends Minz_ActionController {
+ /**
+ * This action is called before every other action in that class. It is
+ * the common boiler plate for every action. It is triggered by the
+ * underlying framework.
+ */
+ public function firstAction() {
+ if (!$this->view->loginOk) {
+ Minz_Error::error(
+ 403,
+ array('error' => array(_t('access_denied')))
+ );
+ }
+
+ $catDAO = new FreshRSS_CategoryDAO();
+
+ $catDAO->checkDefault();
+ $this->view->categories = $catDAO->listCategories(false);
+ $this->view->default_category = $catDAO->getDefault();
+ }
+
+ /**
+ * This action handles the main subscription page
+ *
+ * It displays categories and associated feeds.
+ */
+ public function indexAction() {
+ Minz_View::prependTitle(_t('subscription_management') . ' · ');
+
+ $id = Minz_Request::param('id');
+ if ($id !== false) {
+ $feedDAO = FreshRSS_Factory::createFeedDao();
+ $this->view->feed = $feedDAO->searchById($id);
+ }
+ }
+
+ /**
+ * This action handles the feed configuration page.
+ *
+ * It displays the feed configuration page.
+ * If this action is reached through a POST request, it stores all new
+ * configuraiton values then sends a notification to the user.
+ *
+ * The options available on the page are:
+ * - name
+ * - description
+ * - website URL
+ * - feed URL
+ * - category id (default: default category id)
+ * - CSS path to article on website
+ * - display in main stream (default: 0)
+ * - HTTP authentication
+ * - number of article to retain (default: -2)
+ * - refresh frequency (default: -2)
+ * Default values are empty strings unless specified.
+ */
+ public function feedAction() {
+ if (Minz_Request::param('ajax')) {
+ $this->view->_useLayout(false);
+ }
+
+ $feedDAO = FreshRSS_Factory::createFeedDao();
+ $this->view->feeds = $feedDAO->listFeeds();
+
+ $id = Minz_Request::param('id');
+ if ($id === false || !isset($this->view->feeds[$id])) {
+ Minz_Error::error(
+ 404,
+ array('error' => array(_t('page_not_found')))
+ );
+ return;
+ }
+
+ $this->view->feed = $this->view->feeds[$id];
+
+ Minz_View::prependTitle(_t('rss_feed_management') . ' · ' . $this->view->feed->name() . ' · ');
+
+ if (Minz_Request::isPost()) {
+ $user = Minz_Request::param('http_user', '');
+ $pass = Minz_Request::param('http_pass', '');
+
+ $httpAuth = '';
+ if ($user != '' || $pass != '') {
+ $httpAuth = $user . ':' . $pass;
+ }
+
+ $cat = intval(Minz_Request::param('category', 0));
+
+ $values = array(
+ 'name' => Minz_Request::param('name', ''),
+ 'description' => sanitizeHTML(Minz_Request::param('description', '', true)),
+ 'website' => Minz_Request::param('website', ''),
+ 'url' => Minz_Request::param('url', ''),
+ 'category' => $cat,
+ 'pathEntries' => Minz_Request::param('path_entries', ''),
+ 'priority' => intval(Minz_Request::param('priority', 0)),
+ 'httpAuth' => $httpAuth,
+ 'keep_history' => intval(Minz_Request::param('keep_history', -2)),
+ 'ttl' => intval(Minz_Request::param('ttl', -2)),
+ );
+
+ invalidateHttpCache();
+
+ if ($feedDAO->updateFeed($id, $values)) {
+ $this->view->feed->_category($cat);
+ $this->view->feed->faviconPrepare();
+
+ Minz_Request::good(_t('feed_updated'), array('c' => 'subscription', 'params' => array('id' => $id)));
+ } else {
+ Minz_Request::bad(_t('error_occurred_update'), array('c' => 'subscription'));
+ }
+ }
+ }
+}
diff --git a/app/Models/Category.php b/app/Models/Category.php
index 0a0dbd3ca..e5f6c4334 100644
--- a/app/Models/Category.php
+++ b/app/Models/Category.php
@@ -61,7 +61,7 @@ class FreshRSS_Category extends Minz_Model {
$this->id = $value;
}
public function _name ($value) {
- $this->name = $value;
+ $this->name = substr(trim($value), 0, 255);
}
public function _feeds ($values) {
if (!is_array ($values)) {
diff --git a/app/Models/Themes.php b/app/Models/Themes.php
index 68fc17a2b..e3b260261 100644
--- a/app/Models/Themes.php
+++ b/app/Models/Themes.php
@@ -82,6 +82,7 @@ class FreshRSS_Themes extends Minz_Model {
'favorite' => '★',
'help' => 'ⓘ',
'icon' => '⊚',
+ 'import' => '⤓',
'key' => '⚿',
'link' => '↗',
'login' => '🔒',
diff --git a/app/layout/aside_feed.phtml b/app/layout/aside_feed.phtml
deleted file mode 100644
index 5ffb1c791..000000000
--- a/app/layout/aside_feed.phtml
+++ /dev/null
@@ -1,75 +0,0 @@
-<ul class="nav nav-list aside aside_feed">
- <li class="nav-header"><?php echo Minz_Translate::t ('your_rss_feeds'); ?></li>
-
- <li class="nav-form"><form id="add_rss" method="post" action="<?php echo Minz_Url::display (array ('c' => 'feed', 'a' => 'add')); ?>" autocomplete="off">
- <div class="stick">
- <input type="url" name="url_rss" placeholder="<?php echo Minz_Translate::t ('add_rss_feed'); ?>" />
- <div class="dropdown">
- <div id="dropdown-cat" class="dropdown-target"></div>
-
- <a class="dropdown-toggle btn" href="#dropdown-cat"><?php echo FreshRSS_Themes::icon('down'); ?></a>
- <ul class="dropdown-menu">
- <li class="dropdown-close"><a href="#close">❌</a></li>
-
- <li class="dropdown-header"><?php echo Minz_Translate::t ('category'); ?></li>
-
- <li class="input">
- <select name="category" id="category">
- <?php foreach ($this->categories as $cat) { ?>
- <option value="<?php echo $cat->id (); ?>"<?php echo $cat->id () == 1 ? ' selected="selected"' : ''; ?>>
- <?php echo $cat->name (); ?>
- </option>
- <?php } ?>
- <option value="nc"><?php echo Minz_Translate::t ('new_category'); ?></option>
- </select>
- </li>
-
- <li class="input" style="display:none">
- <input type="text" name="new_category[name]" id="new_category_name" autocomplete="off" placeholder="<?php echo Minz_Translate::t ('new_category'); ?>" />
- </li>
-
- <li class="separator"></li>
-
- <li class="dropdown-header"><?php echo Minz_Translate::t ('http_authentication'); ?></li>
- <li class="input">
- <input type="text" name="http_user" id="http_user_add" autocomplete="off" placeholder="<?php echo Minz_Translate::t ('username'); ?>" />
- </li>
- <li class="input">
- <input type="password" name="http_pass" id="http_pass_add" autocomplete="off" placeholder="<?php echo Minz_Translate::t ('password'); ?>" />
- </li>
- </ul>
- </div>
- <button class="btn" type="submit"><?php echo FreshRSS_Themes::icon('add'); ?></button>
- </div>
- </form></li>
-
- <li class="item">
- <a onclick="return false;" href="javascript:(function(){var%20url%20=%20location.href;window.open('<?php echo Minz_Url::display(array('c' => 'feed', 'a' => 'add'), 'html', true); ?>&amp;url_rss='+encodeURIComponent(url), '_blank');})();">
- <?php echo Minz_Translate::t('bookmark'); ?>
- </a>
- </li>
-
- <li class="item<?php echo Minz_Request::controllerName () == 'importExport' ? ' active' : ''; ?>">
- <a href="<?php echo _url ('importExport', 'index'); ?>"><?php echo Minz_Translate::t ('import_export'); ?></a>
- </li>
-
- <li class="item<?php echo Minz_Request::actionName () == 'categorize' ? ' active' : ''; ?>">
- <a href="<?php echo _url ('configure', 'categorize'); ?>"><?php echo Minz_Translate::t ('categories_management'); ?></a>
- </li>
-
- <li class="separator"></li>
-
- <?php if (!empty ($this->feeds)) { ?>
- <?php foreach ($this->feeds as $feed) { ?>
- <?php $nbEntries = $feed->nbEntries (); ?>
- <li class="item<?php echo (isset($this->flux) && $this->flux->id () == $feed->id ()) ? ' active' : ''; ?><?php echo $feed->inError () ? ' error' : ''; ?><?php echo $nbEntries == 0 ? ' empty' : ''; ?>">
- <a href="<?php echo _url ('configure', 'feed', 'id', $feed->id ()); ?>">
- <img class="favicon" src="<?php echo $feed->favicon (); ?>" alt="✇" />
- <?php echo $feed->name (); ?>
- </a>
- </li>
- <?php } ?>
- <?php } else { ?>
- <li class="item disable"><?php echo Minz_Translate::t ('no_rss_feed'); ?></li>
- <?php } ?>
-</ul>
diff --git a/app/layout/aside_flux.phtml b/app/layout/aside_flux.phtml
index aac3c0896..a8ae2f424 100644
--- a/app/layout/aside_flux.phtml
+++ b/app/layout/aside_flux.phtml
@@ -7,8 +7,8 @@
<li>
<div class="stick configure-feeds">
- <a class="btn btn-important" href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('subscription_management'); ?></a>
- <a class="btn btn-important" href="<?php echo _url('configure', 'categorize'); ?>" title="<?php echo _t('categories_management'); ?>"><?php echo _i('category-white'); ?></a>
+ <a class="btn btn-important" href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('subscription_management'); ?></a>
+ <a class="btn btn-important" href="<?php echo _url('importExport', 'index'); ?>"><?php echo _i('import'); ?></a>
</div>
</li>
<?php } elseif (Minz_Configuration::needsLogin()) { ?>
@@ -89,7 +89,7 @@
<li class="item"><a target="_blank" href="http://example.net/"><?php echo _t('see_website'); ?></a></li>
<?php if ($this->loginOk) { ?>
<li class="separator"></li>
- <li class="item"><a href="<?php echo _url('configure', 'feed', 'id', '!!!!!!'); ?>"><?php echo _t('administration'); ?></a></li>
+ <li class="item"><a href="<?php echo _url('subscription', 'index', 'id', '!!!!!!'); ?>"><?php echo _t('administration'); ?></a></li>
<li class="item"><a href="<?php echo _url('feed', 'actualize', 'id', '!!!!!!'); ?>"><?php echo _t('actualize'); ?></a></li>
<li class="item">
<?php $confirm = $this->conf->reading_confirm ? 'confirm' : ''; ?>
diff --git a/app/layout/aside_subscription.phtml b/app/layout/aside_subscription.phtml
new file mode 100644
index 000000000..9a95763c3
--- /dev/null
+++ b/app/layout/aside_subscription.phtml
@@ -0,0 +1,17 @@
+<ul class="nav nav-list aside aside_feed">
+ <li class="nav-header"><?php echo _t('subscription_management'); ?></li>
+
+ <li class="item<?php echo Minz_Request::controllerName() == 'subscription' ? ' active' : ''; ?>">
+ <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('subscription_management'); ?></a>
+ </li>
+
+ <li class="item<?php echo Minz_Request::controllerName() == 'importExport' ? ' active' : ''; ?>">
+ <a href="<?php echo _url('importExport', 'index'); ?>"><?php echo _t('import_export'); ?></a>
+ </li>
+
+ <li class="item">
+ <a onclick="return false;" href="javascript:(function(){var%20url%20=%20location.href;window.open('<?php echo Minz_Url::display(array('c' => 'feed', 'a' => 'add'), 'html', true); ?>&amp;url_rss='+encodeURIComponent(url), '_blank');})();">
+ <?php echo _t('bookmark'); ?>
+ </a>
+ </li>
+</ul>
diff --git a/app/views/configure/categorize.phtml b/app/views/configure/categorize.phtml
deleted file mode 100644
index 23d1c9fa1..000000000
--- a/app/views/configure/categorize.phtml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php $this->partial ('aside_feed'); ?>
-
-<div class="post">
- <a href="<?php echo _url ('index', 'index'); ?>"><?php echo Minz_Translate::t ('back_to_rss_feeds'); ?></a>
-
- <form method="post" action="<?php echo _url ('configure', 'categorize'); ?>">
- <legend><?php echo Minz_Translate::t ('categories_management'); ?></legend>
-
- <p class="alert alert-warn"><?php echo Minz_Translate::t ('feeds_moved_category_deleted', $this->defaultCategory->name ()); ?></p>
-
- <?php $i = 0; foreach ($this->categories as $cat) { $i++; ?>
- <div class="form-group">
- <label class="group-name" for="cat_<?php echo $cat->id (); ?>">
- <?php echo Minz_Translate::t ('category_number', $i); ?>
- </label>
- <div class="group-controls">
- <div class="stick">
- <input type="text" id="cat_<?php echo $cat->id (); ?>" name="categories[]" value="<?php echo $cat->name (); ?>" />
-
- <?php if ($cat->nbFeed () > 0) { ?>
- <a class="btn" href="<?php echo _url('index', 'index', 'get', 'c_' . $cat->id ()); ?>">
- <?php echo _i('link'); ?>
- </a>
- <button formaction="<?php echo _url('feed', 'delete', 'id', $cat->id (), 'type', 'category'); ?>"
- class="btn btn-attention confirm"
- data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>"
- type="submit"><?php echo _t('ask_empty'); ?></button>
- <?php } ?>
- </div>
- (<?php echo Minz_Translate::t ('number_feeds', $cat->nbFeed ()); ?>)
-
- <?php if ($cat->id () === $this->defaultCategory->id ()) { ?>
- <?php echo FreshRSS_Themes::icon('help'); ?> <?php echo Minz_Translate::t ('can_not_be_deleted'); ?>
- <?php } ?>
-
- <input type="hidden" name="ids[]" value="<?php echo $cat->id (); ?>" />
- </div>
- </div>
- <?php } ?>
-
- <div class="form-group">
- <label class="group-name" for="new_category"><?php echo Minz_Translate::t ('add_category'); ?></label>
- <div class="group-controls">
- <input type="text" id="new_category" name="new_category" placeholder="<?php echo Minz_Translate::t ('new_category'); ?>" />
- </div>
- </div>
-
- <div class="form-group form-actions">
- <div class="group-controls">
- <button type="submit" class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
- <button type="reset" class="btn"><?php echo Minz_Translate::t ('cancel'); ?></button>
- </div>
- </div>
- </form>
-</div>
diff --git a/app/views/configure/feed.phtml b/app/views/helpers/feed/update.phtml
index e96a28739..4a6425c45 100644
--- a/app/views/configure/feed.phtml
+++ b/app/views/helpers/feed/update.phtml
@@ -1,40 +1,37 @@
-<?php $this->partial ('aside_feed'); ?>
-
-<?php if ($this->flux) { ?>
<div class="post">
- <a href="<?php echo _url ('index', 'index'); ?>"><?php echo Minz_Translate::t ('back_to_rss_feeds'); ?></a> <?php echo Minz_Translate::t ('or'); ?> <a href="<?php echo _url ('index', 'index', 'get', 'f_' . $this->flux->id ()); ?>"><?php echo Minz_Translate::t ('filter'); ?></a>
+ <!-- <a href="<?php echo _url ('index', 'index'); ?>"><?php echo Minz_Translate::t ('back_to_rss_feeds'); ?></a> <?php echo Minz_Translate::t ('or'); ?> <a href="<?php echo _url ('index', 'index', 'get', 'f_' . $this->feed->id ()); ?>"><?php echo Minz_Translate::t ('filter'); ?></a> -->
- <h1><?php echo $this->flux->name (); ?></h1>
- <?php echo $this->flux->description (); ?>
+ <h1><?php echo $this->feed->name (); ?></h1>
+ <?php echo $this->feed->description (); ?>
- <?php $nbEntries = $this->flux->nbEntries (); ?>
+ <?php $nbEntries = $this->feed->nbEntries (); ?>
- <?php if ($this->flux->inError ()) { ?>
+ <?php if ($this->feed->inError ()) { ?>
<p class="alert alert-error"><span class="alert-head"><?php echo Minz_Translate::t ('damn'); ?></span> <?php echo Minz_Translate::t ('feed_in_error'); ?></p>
<?php } elseif ($nbEntries === 0) { ?>
<p class="alert alert-warn"><?php echo Minz_Translate::t ('feed_empty'); ?></p>
<?php } ?>
- <form method="post" action="<?php echo _url ('configure', 'feed', 'id', $this->flux->id ()); ?>" autocomplete="off">
+ <form method="post" action="<?php echo _url ('subscription', 'feed', 'id', $this->feed->id ()); ?>" autocomplete="off">
<legend><?php echo Minz_Translate::t ('informations'); ?></legend>
<div class="form-group">
<label class="group-name" for="name"><?php echo Minz_Translate::t ('title'); ?></label>
<div class="group-controls">
- <input type="text" name="name" id="name" class="extend" value="<?php echo $this->flux->name () ; ?>" />
+ <input type="text" name="name" id="name" class="extend" value="<?php echo $this->feed->name () ; ?>" />
</div>
</div>
<div class="form-group">
<label class="group-name" for="description"><?php echo Minz_Translate::t ('feed_description'); ?></label>
<div class="group-controls">
- <textarea name="description" id="description"><?php echo htmlspecialchars($this->flux->description(), ENT_NOQUOTES, 'UTF-8'); ?></textarea>
+ <textarea name="description" id="description"><?php echo htmlspecialchars($this->feed->description(), ENT_NOQUOTES, 'UTF-8'); ?></textarea>
</div>
</div>
<div class="form-group">
<label class="group-name" for="website"><?php echo Minz_Translate::t ('website_url'); ?></label>
<div class="group-controls">
<div class="stick">
- <input type="text" name="website" id="website" class="extend" value="<?php echo $this->flux->website (); ?>" />
- <a class="btn" target="_blank" href="<?php echo $this->flux->website (); ?>"><?php echo FreshRSS_Themes::icon('link'); ?></a>
+ <input type="text" name="website" id="website" class="extend" value="<?php echo $this->feed->website (); ?>" />
+ <a class="btn" target="_blank" href="<?php echo $this->feed->website (); ?>"><?php echo FreshRSS_Themes::icon('link'); ?></a>
</div>
</div>
</div>
@@ -42,11 +39,11 @@
<label class="group-name" for="url"><?php echo Minz_Translate::t ('feed_url'); ?></label>
<div class="group-controls">
<div class="stick">
- <input type="text" name="url" id="url" class="extend" value="<?php echo $this->flux->url (); ?>" />
- <a class="btn" target="_blank" href="<?php echo $this->flux->url (); ?>"><?php echo FreshRSS_Themes::icon('link'); ?></a>
+ <input type="text" name="url" id="url" class="extend" value="<?php echo $this->feed->url (); ?>" />
+ <a class="btn" target="_blank" href="<?php echo $this->feed->url (); ?>"><?php echo FreshRSS_Themes::icon('link'); ?></a>
</div>
- <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->flux->url (); ?>"><?php echo Minz_Translate::t ('feed_validator'); ?></a>
+ <a class="btn" target="_blank" href="http://validator.w3.org/feed/check.cgi?url=<?php echo $this->feed->url (); ?>"><?php echo Minz_Translate::t ('feed_validator'); ?></a>
</div>
</div>
<div class="form-group">
@@ -54,7 +51,7 @@
<div class="group-controls">
<select name="category" id="category">
<?php foreach ($this->categories as $cat) { ?>
- <option value="<?php echo $cat->id (); ?>"<?php echo $cat->id ()== $this->flux->category () ? ' selected="selected"' : ''; ?>>
+ <option value="<?php echo $cat->id (); ?>"<?php echo $cat->id ()== $this->feed->category () ? ' selected="selected"' : ''; ?>>
<?php echo $cat->name (); ?>
</option>
<?php } ?>
@@ -65,14 +62,14 @@
<label class="group-name" for="priority"><?php echo Minz_Translate::t ('show_in_all_flux'); ?></label>
<div class="group-controls">
<label class="checkbox" for="priority">
- <input type="checkbox" name="priority" id="priority" value="10"<?php echo $this->flux->priority () > 0 ? ' checked="checked"' : ''; ?> />
+ <input type="checkbox" name="priority" id="priority" value="10"<?php echo $this->feed->priority () > 0 ? ' checked="checked"' : ''; ?> />
<?php echo Minz_Translate::t ('yes'); ?>
</label>
</div>
</div>
<div class="form-group">
<div class="group-controls">
- <a href="<?php echo _url('stats', 'repartition', 'id', $this->flux->id()); ?>">
+ <a href="<?php echo _url('stats', 'repartition', 'id', $this->feed->id()); ?>">
<?php echo _i('stats'); ?> <?php echo _t('stats'); ?>
</a>
</div>
@@ -82,7 +79,7 @@
<button class="btn btn-important"><?php echo _t('save'); ?></button>
<button class="btn btn-attention confirm"
data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>"
- formaction="<?php echo _url('feed', 'delete', 'id', $this->flux->id ()); ?>"
+ formaction="<?php echo _url('feed', 'delete', 'id', $this->feed->id ()); ?>"
formmethod="post"><?php echo _t('delete'); ?></button>
</div>
</div>
@@ -93,7 +90,7 @@
<div class="group-controls">
<div class="stick">
<input type="text" value="<?php echo _t('number_articles', $nbEntries); ?>" disabled="disabled" />
- <a class="btn" href="<?php echo _url('feed', 'actualize', 'id', $this->flux->id ()); ?>">
+ <a class="btn" href="<?php echo _url('feed', 'actualize', 'id', $this->feed->id ()); ?>">
<?php echo _i('refresh'); ?> <?php echo _t('actualize'); ?>
</a>
</div>
@@ -104,7 +101,7 @@
<div class="group-controls">
<select class="number" name="keep_history" id="keep_history" required="required"><?php
foreach (array('' => '', -2 => Minz_Translate::t('by_default'), 0 => '0', 10 => '10', 50 => '50', 100 => '100', 500 => '500', 1000 => '1 000', 5000 => '5 000', 10000 => '10 000', -1 => '∞') as $v => $t) {
- echo '<option value="' . $v . ($this->flux->keepHistory() === $v ? '" selected="selected' : '') . '">' . $t . '</option>';
+ echo '<option value="' . $v . ($this->feed->keepHistory() === $v ? '" selected="selected' : '') . '">' . $t . '</option>';
}
?></select>
</div>
@@ -119,13 +116,13 @@
36000 => '10h', 43200 => '12h', 64800 => '18h',
86400 => '1d', 129600 => '1.5d', 172800 => '2d', 259200 => '3d', 345600 => '4d', 432000 => '5d', 518400 => '6d',
604800 => '1wk', 1209600 => '2wk', 1814400 => '3wk', 2419200 => '4wk', 2629744 => '1mo', -1 => '∞') as $v => $t) {
- echo '<option value="' . $v . ($this->flux->ttl() === $v ? '" selected="selected' : '') . '">' . $t . '</option>';
- if ($this->flux->ttl() == $v) {
+ echo '<option value="' . $v . ($this->feed->ttl() === $v ? '" selected="selected' : '') . '">' . $t . '</option>';
+ if ($this->feed->ttl() == $v) {
$found = true;
}
}
if (!$found) {
- echo '<option value="' . intval($this->flux->ttl()) . '" selected="selected">' . intval($this->flux->ttl()) . 's</option>';
+ echo '<option value="' . intval($this->feed->ttl()) . '" selected="selected">' . intval($this->feed->ttl()) . 's</option>';
}
?></select>
</div>
@@ -133,12 +130,12 @@
<div class="form-group form-actions">
<div class="group-controls">
<button class="btn btn-important"><?php echo Minz_Translate::t ('save'); ?></button>
- <button class="btn btn-attention confirm" formmethod="post" formaction="<?php echo Minz_Url::display (array ('c' => 'feed', 'a' => 'truncate', 'params' => array ('id' => $this->flux->id ()))); ?>"><?php echo Minz_Translate::t ('truncate'); ?></button>
+ <button class="btn btn-attention confirm" formmethod="post" formaction="<?php echo Minz_Url::display (array ('c' => 'feed', 'a' => 'truncate', 'params' => array ('id' => $this->feed->id ()))); ?>"><?php echo Minz_Translate::t ('truncate'); ?></button>
</div>
</div>
<legend><?php echo Minz_Translate::t ('login_configuration'); ?></legend>
- <?php $auth = $this->flux->httpAuth (false); ?>
+ <?php $auth = $this->feed->httpAuth (false); ?>
<div class="form-group">
<label class="group-name" for="http_user"><?php echo Minz_Translate::t ('http_username'); ?></label>
<div class="group-controls">
@@ -163,7 +160,7 @@
<div class="form-group">
<label class="group-name" for="path_entries"><?php echo Minz_Translate::t ('css_path_on_website'); ?></label>
<div class="group-controls">
- <input type="text" name="path_entries" id="path_entries" class="extend" value="<?php echo $this->flux->pathEntries (); ?>" placeholder="<?php echo Minz_Translate::t ('blank_to_disable'); ?>" />
+ <input type="text" name="path_entries" id="path_entries" class="extend" value="<?php echo $this->feed->pathEntries (); ?>" placeholder="<?php echo Minz_Translate::t ('blank_to_disable'); ?>" />
<?php echo FreshRSS_Themes::icon('help'); ?> <?php echo Minz_Translate::t ('retrieve_truncated_feeds'); ?>
</div>
</div>
@@ -176,7 +173,3 @@
</div>
</form>
</div>
-
-<?php } else { ?>
-<div class="alert alert-warn"><span class="alert-head"><?php echo Minz_Translate::t ('no_selected_feed'); ?></span> <?php echo Minz_Translate::t ('think_to_add'); ?></div>
-<?php } ?>
diff --git a/app/views/helpers/view/global_view.phtml b/app/views/helpers/view/global_view.phtml
index 72bcf4c73..5e4cad01a 100644
--- a/app/views/helpers/view/global_view.phtml
+++ b/app/views/helpers/view/global_view.phtml
@@ -48,6 +48,6 @@
<?php } else { ?>
<div id="stream" class="prompt alert alert-warn global">
<h2><?php echo _t('no_feed_to_display'); ?></h2>
- <a href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
+ <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
</div>
<?php } ?>
diff --git a/app/views/helpers/view/normal_view.phtml b/app/views/helpers/view/normal_view.phtml
index 6d9789f8d..e469edf58 100644
--- a/app/views/helpers/view/normal_view.phtml
+++ b/app/views/helpers/view/normal_view.phtml
@@ -186,6 +186,6 @@ if (!empty($this->entries)) {
<?php } else { ?>
<div id="stream" class="prompt alert alert-warn normal">
<h2><?php echo _t('no_feed_to_display'); ?></h2>
- <a href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
+ <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
</div>
<?php } ?>
diff --git a/app/views/helpers/view/reader_view.phtml b/app/views/helpers/view/reader_view.phtml
index c80dca519..413094239 100644
--- a/app/views/helpers/view/reader_view.phtml
+++ b/app/views/helpers/view/reader_view.phtml
@@ -39,6 +39,6 @@ if (!empty($this->entries)) {
<?php } else { ?>
<div id="stream" class="prompt alert alert-warn reader">
<h2><?php echo _t('no_feed_to_display'); ?></h2>
- <a href="<?php echo _url('configure', 'feed'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
+ <a href="<?php echo _url('subscription', 'index'); ?>"><?php echo _t('think_to_add'); ?></a><br /><br />
</div>
<?php } ?>
diff --git a/app/views/importExport/index.phtml b/app/views/importExport/index.phtml
index 35371faca..36c0eab4e 100644
--- a/app/views/importExport/index.phtml
+++ b/app/views/importExport/index.phtml
@@ -1,4 +1,4 @@
-<?php $this->partial('aside_feed'); ?>
+<?php $this->partial('aside_subscription'); ?>
<div class="post ">
<a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
diff --git a/app/views/stats/idle.phtml b/app/views/stats/idle.phtml
index 6f3d4a117..75cba1081 100644
--- a/app/views/stats/idle.phtml
+++ b/app/views/stats/idle.phtml
@@ -25,7 +25,7 @@
<li class="item">
<div class="stick">
<a class="btn" href="<?php echo _url('index', 'index', 'get', 'f_' . $feed['id']); ?>"><?php echo _i('link'); ?> <?php echo _t('filter'); ?></a>
- <a class="btn" href="<?php echo _url('configure', 'feed', 'id', $feed['id']); ?>"><?php echo _i('configure'); ?> <?php echo _t('administration'); ?></a>
+ <a class="btn" href="<?php echo _url('subscription', 'index', 'id', $feed['id']); ?>"><?php echo _i('configure'); ?> <?php echo _t('administration'); ?></a>
<button class="btn btn-attention confirm" form="form-delete" formaction="<?php echo _url('feed', 'delete', 'id', $feed['id'], 'r', $current_url); ?>"><?php echo _t('delete'); ?></button>
</div>
</li>
diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml
index 750a3ffdc..a181ae251 100644
--- a/app/views/stats/repartition.phtml
+++ b/app/views/stats/repartition.phtml
@@ -24,7 +24,7 @@
</select>
<?php if ($this->feed) {?>
- <a class="btn" href="<?php echo _url('configure', 'feed', 'id', $this->feed->id()); ?>">
+ <a class="btn" href="<?php echo _url('subscription', 'index', 'id', $this->feed->id()); ?>">
<?php echo _i('configure'); ?> <?php echo _t('administration'); ?>
</a>
<?php }?>
diff --git a/app/views/subscription/feed.phtml b/app/views/subscription/feed.phtml
new file mode 100644
index 000000000..48a401c4a
--- /dev/null
+++ b/app/views/subscription/feed.phtml
@@ -0,0 +1,15 @@
+<?php
+
+if (!Minz_Request::param('ajax')) {
+ $this->partial('aside_subscription');
+}
+
+if ($this->feed) {
+ $this->renderHelper('feed/update');
+} else {
+?>
+<div class="alert alert-warn">
+ <span class="alert-head"><?php echo _t('no_selected_feed'); ?></span>
+ <?php echo _t('think_to_add'); ?>
+</div>
+<?php } ?>
diff --git a/app/views/subscription/index.phtml b/app/views/subscription/index.phtml
new file mode 100644
index 000000000..577ddd972
--- /dev/null
+++ b/app/views/subscription/index.phtml
@@ -0,0 +1,145 @@
+<?php $this->partial('aside_subscription'); ?>
+
+<div class="post">
+ <a href="<?php echo _url('index', 'index'); ?>"><?php echo _t('back_to_rss_feeds'); ?></a>
+
+ <h2><?php echo _t('subscription_management'); ?></h2>
+
+ <form id="add_rss" method="post" action="<?php echo _url('feed', 'add'); ?>" autocomplete="off">
+ <div class="stick">
+ <input type="url" name="url_rss" class="extend" placeholder="<?php echo _t('add_rss_feed'); ?>" />
+ <div class="dropdown">
+ <div id="dropdown-cat" class="dropdown-target"></div>
+
+ <a class="dropdown-toggle btn" href="#dropdown-cat"><?php echo _i('down'); ?></a>
+ <ul class="dropdown-menu">
+ <li class="dropdown-close"><a href="#close">❌</a></li>
+
+ <li class="dropdown-header"><?php echo _t('category'); ?></li>
+
+ <li class="input">
+ <select name="category" id="category">
+ <?php foreach ($this->categories as $cat) { ?>
+ <option value="<?php echo $cat->id(); ?>"<?php echo $cat->id() == 1 ? ' selected="selected"' : ''; ?>>
+ <?php echo $cat->name(); ?>
+ </option>
+ <?php } ?>
+ <option value="nc"><?php echo _t('new_category'); ?></option>
+ </select>
+ </li>
+
+ <li class="input" style="display:none">
+ <input type="text" name="new_category[name]" id="new_category_name" autocomplete="off" placeholder="<?php echo _t('new_category'); ?>" />
+ </li>
+
+ <li class="separator"></li>
+
+ <li class="dropdown-header"><?php echo _t('http_authentication'); ?></li>
+ <li class="input">
+ <input type="text" name="http_user" id="http_user_add" autocomplete="off" placeholder="<?php echo _t('username'); ?>" />
+ </li>
+ <li class="input">
+ <input type="password" name="http_pass" id="http_pass_add" autocomplete="off" placeholder="<?php echo _t('password'); ?>" />
+ </li>
+ </ul>
+ </div>
+ <button class="btn" type="submit"><?php echo _i('add'); ?></button>
+ </div>
+ </form>
+
+ <p class="alert alert-warn">
+ <?php echo _t('feeds_moved_category_deleted', $this->default_category->name()); ?>
+ </p>
+
+ <div class="box">
+ <div class="box-title"><label for="new-category"><?php echo _t('add_category'); ?></label></div>
+
+ <ul class="box-content box-content-centered">
+ <form action="<?php echo _url('category', 'create'); ?>" method="post">
+ <li class="item"><input type="text" id="new-category" name="new-category" placeholder="<?php echo _t('new_category'); ?>" /></li>
+ <li class="item"><button class="btn btn-important" type="submit"><?php echo _t('submit'); ?></button></li>
+ </form>
+ </ul>
+ </div>
+
+ <form id="controller-category" method="post" style="display: none;"></form>
+
+ <?php
+ foreach ($this->categories as $cat) {
+ $feeds = $cat->feeds();
+ ?>
+ <div class="box">
+ <div class="box-title">
+ <form action="<?php echo _url('category', 'update', 'id', $cat->id()); ?>" method="post">
+ <input type="text" name="name" value="<?php echo $cat->name(); ?>" />
+
+ <div class="dropdown">
+ <div id="dropdown-cat-<?php echo $cat->id(); ?>" class="dropdown-target"></div>
+
+ <a class="dropdown-toggle btn" href="#dropdown-cat-<?php echo $cat->id(); ?>"><?php echo _i('down'); ?></a>
+ <ul class="dropdown-menu">
+ <li class="dropdown-close"><a href="#close">❌</a></li>
+
+ <li class="item"><a href="<?php echo _url('index', 'index', 'get', 'c_' . $cat->id()); ?>"><?php echo _t('filter'); ?></a></li>
+
+ <?php
+ $no_feed = empty($feeds);
+ $is_default = ($cat->id() === $this->default_category->id());
+
+ if (!$no_feed || !$is_default) {
+ ?>
+ <li class="separator"></li>
+ <?php } if (!$no_feed) { ?>
+ <li class="item">
+ <button class="as-link confirm"
+ data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>"
+ type="submit"
+ form="controller-category"
+ formaction="<?php echo _url('category', 'empty', 'id', $cat->id()); ?>">
+ <?php echo _t('ask_empty'); ?></button>
+ </li>
+ <?php } if (!$is_default) { ?>
+ <li class="item">
+ <button class="as-link confirm"
+ data-str-confirm="<?php echo _t('confirm_action_feed_cat'); ?>"
+ type="submit"
+ form="controller-category"
+ formaction="<?php echo _url('category', 'delete', 'id', $cat->id()); ?>">
+ <?php echo _t('delete'); ?></button>
+ </li>
+ <?php } ?>
+ </ul>
+ </div>
+ </form>
+ </div>
+
+ <ul class="box-content">
+ <?php if (!empty($feeds)) { ?>
+ <?php
+ foreach ($feeds as $feed) {
+ $error = $feed->inError() ? ' error' : '';
+ $empty = $feed->nbEntries() == 0 ? ' empty' : '';
+ ?>
+ <li class="item<?php echo $error, $empty; ?>">
+ <a class="configure open-slider" href="<?php echo _url('subscription', 'feed', 'id', $feed->id()); ?>"><?php echo _i('configure'); ?></a>
+ <img class="favicon" src="<?php echo $feed->favicon(); ?>" alt="✇" /> <?php echo $feed->name(); ?>
+ </li>
+ <?php }
+ } else {
+ ?>
+ <li class="item"><?php echo _t('category_empty'); ?></li>
+ <?php } ?>
+ </ul>
+ </div>
+ <?php } ?>
+</div>
+
+<?php $class = isset($this->feed) ? ' class="active"' : ''; ?>
+<a href="#" id="close-slider"<?php echo $class; ?>></a>
+<div id="slider"<?php echo $class; ?>>
+<?php
+ if (isset($this->feed)) {
+ $this->renderHelper('feed/update');
+ }
+?>
+</div>