From fb32aa4ef1253573115766bc48068ea1a7db4082 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Sun, 17 Mar 2013 02:47:54 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20affichage=20notifications?= =?UTF-8?q?=20+=20am=C3=A9liorations=20divers=20niveau=20affichage=20+=20a?= =?UTF-8?q?jout=20options=20pour=20auto-marquage=20des=20articles=20comme?= =?UTF-8?q?=20lus=20(=C3=A0=20l'ouverture=20de=20l'article=20/=20du=20site?= =?UTF-8?q?=20/=20de=20la=20page)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/configureController.php | 9 +++++ app/layout/aside_configure.phtml | 5 +-- app/layout/aside_flux.phtml | 2 ++ app/layout/header.phtml | 4 +-- app/models/RSSConfiguration.php | 27 ++++++++++++++ app/views/configure/display.phtml | 20 ++++++++++- app/views/configure/importExport.phtml | 4 +-- app/views/index/about.phtml | 6 ++++ app/views/javascript/main.phtml | 45 ++++++++++++++++++++---- public/data/Configuration.array.php | 5 +++ public/theme/base.css | 26 +++++++++----- public/theme/fonts/openSans.woff | Bin 0 -> 21956 bytes 12 files changed, 129 insertions(+), 24 deletions(-) create mode 100644 public/theme/fonts/openSans.woff diff --git a/app/controllers/configureController.php b/app/controllers/configureController.php index 9a42599a8..e807fb06d 100755 --- a/app/controllers/configureController.php +++ b/app/controllers/configureController.php @@ -112,6 +112,9 @@ class configureController extends ActionController { $sort = Request::param ('sort_order', 'low_to_high'); $old = Request::param ('old_entries', 3); $mail = Request::param ('mail_login', false); + $openArticle = Request::param ('mark_open_article', 'no'); + $openSite = Request::param ('mark_open_site', 'no'); + $openPage = Request::param ('mark_open_page', 'no'); $this->view->conf->_postsPerPage (intval ($nb)); $this->view->conf->_defaultView ($view); @@ -119,6 +122,11 @@ class configureController extends ActionController { $this->view->conf->_sortOrder ($sort); $this->view->conf->_oldEntries ($old); $this->view->conf->_mailLogin ($mail); + $this->view->conf->_markWhen (array ( + 'article' => $openArticle, + 'site' => $openSite, + 'page' => $openPage, + )); $values = array ( 'posts_per_page' => $this->view->conf->postsPerPage (), @@ -127,6 +135,7 @@ class configureController extends ActionController { 'sort_order' => $this->view->conf->sortOrder (), 'old_entries' => $this->view->conf->oldEntries (), 'mail_login' => $this->view->conf->mailLogin (), + 'mark_when' => $this->view->conf->markWhen (), ); $confDAO = new RSSConfigurationDAO (); diff --git a/app/layout/aside_configure.phtml b/app/layout/aside_configure.phtml index 3f62ed9e7..ee527d75e 100644 --- a/app/layout/aside_configure.phtml +++ b/app/layout/aside_configure.phtml @@ -2,7 +2,7 @@
  • - Général et affichage + Général et lecture
  • Catégories @@ -10,7 +10,4 @@
  • Raccourcis
  • -
  • - Import / Export OPML -
  • diff --git a/app/layout/aside_flux.phtml b/app/layout/aside_flux.phtml index 0a68a335a..5bf8c8160 100644 --- a/app/layout/aside_flux.phtml +++ b/app/layout/aside_flux.phtml @@ -51,7 +51,9 @@
  • Filtrer
  • + conf) || is_logged ()) { ?>
  • Gestion
  • +
  • Voir le site
  • diff --git a/app/layout/header.phtml b/app/layout/header.phtml index 351984aa7..852170b64 100644 --- a/app/layout/header.phtml +++ b/app/layout/header.phtml @@ -32,11 +32,11 @@ diff --git a/app/models/RSSConfiguration.php b/app/models/RSSConfiguration.php index f32a67a3a..270ec2ce1 100755 --- a/app/models/RSSConfiguration.php +++ b/app/models/RSSConfiguration.php @@ -8,6 +8,7 @@ class RSSConfiguration extends Model { private $old_entries; private $shortcuts = array (); private $mail_login = ''; + private $mark_when = array (); public function __construct () { $confDAO = new RSSConfigurationDAO (); @@ -18,6 +19,7 @@ class RSSConfiguration extends Model { $this->_oldEntries ($confDAO->old_entries); $this->_shortcuts ($confDAO->shortcuts); $this->_mailLogin ($confDAO->mail_login); + $this->_markWhen ($confDAO->mark_when); } public function postsPerPage () { @@ -41,6 +43,18 @@ class RSSConfiguration extends Model { public function mailLogin () { return $this->mail_login; } + public function markWhen () { + return $this->mark_when; + } + public function markWhenArticle () { + return $this->mark_when['article']; + } + public function markWhenSite () { + return $this->mark_when['site']; + } + public function markWhenPage () { + return $this->mark_when['page']; + } public function _postsPerPage ($value) { if (is_int (intval ($value))) { @@ -89,6 +103,11 @@ class RSSConfiguration extends Model { $this->mail_login = false; } } + public function _markWhen ($values) { + $this->mark_when['article'] = $values['article']; + $this->mark_when['site'] = $values['site']; + $this->mark_when['page'] = $values['page']; + } } class RSSConfigurationDAO extends Model_array { @@ -107,6 +126,11 @@ class RSSConfigurationDAO extends Model_array { 'prev_page' => 'left', ); public $mail_login = ''; + public $mark_when = array ( + 'article' => 'yes', + 'site' => 'yes', + 'page' => 'no' + ); public function __construct () { parent::__construct (PUBLIC_PATH . '/data/Configuration.array.php'); @@ -132,6 +156,9 @@ class RSSConfigurationDAO extends Model_array { if (isset ($this->array['mail_login'])) { $this->mail_login = $this->array['mail_login']; } + if (isset ($this->array['mark_when'])) { + $this->mark_when = $this->array['mark_when']; + } } public function update ($values) { diff --git a/app/views/configure/display.phtml b/app/views/configure/display.phtml index bf488dbe0..12292c137 100644 --- a/app/views/configure/display.phtml +++ b/app/views/configure/display.phtml @@ -20,7 +20,7 @@ - Configuration de l'affichage + Configuration de lecture
    @@ -67,6 +67,24 @@
    +
    + +
    + + + +
    +
    +
    diff --git a/app/views/configure/importExport.phtml b/app/views/configure/importExport.phtml index e660274d6..fd274b5b2 100644 --- a/app/views/configure/importExport.phtml +++ b/app/views/configure/importExport.phtml @@ -11,9 +11,7 @@ -partial ('aside_configure'); ?> - -
    +
    Import / export au format OPML
    diff --git a/app/views/index/about.phtml b/app/views/index/about.phtml index ab19fe18a..e958807d2 100644 --- a/app/views/index/about.phtml +++ b/app/views/index/about.phtml @@ -10,7 +10,13 @@
    Pour les rapports de bugs
    sur Github ou par mail
    + +
    Licence
    +
    AGPL 3

    FreshRSS est un agrégateur de flux RSS à auto-héberger à l'image de RSSLounge, TinyTinyRSS ou Leed. Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable. L'objectif étant d'offrir une alternative sérieuse au futur feu-Google Reader.

    + +

    Crédits

    + Les icônes sont issus du projet GNOME. La police Open Sans utilisée a été créée par Steve Matteson. FreshRSS repose sur Minz, un framework PHP.
    diff --git a/app/views/javascript/main.phtml b/app/views/javascript/main.phtml index a4e3229bf..d2bde2a42 100644 --- a/app/views/javascript/main.phtml +++ b/app/views/javascript/main.phtml @@ -4,7 +4,10 @@ var hide_posts = true; var hide_posts = false; -conf->shortcuts (); ?> +conf->shortcuts (); + $mark = $this->conf->markWhen (); +?> function redirect (url, new_tab) { if (url) { @@ -32,13 +35,22 @@ function slide (new_active, old_active) { offset: new_active.position ().top }); } + + + mark_read(new_active, true); + } -function mark_read (active) { - if (active[0] === undefined) { +var load = false; +function mark_read (active, only_not_read) { + if (active[0] === undefined || ( + only_not_read === true && !active.hasClass("not_read")) || + load === true) { return false; } + load = true; + url = active.find ("a.read").attr ("href"); if (url === undefined) { return false; @@ -57,6 +69,8 @@ function mark_read (active) { } else { active.addClass ("not_read"); } + + load = false; }); } @@ -95,6 +109,13 @@ function init_img () { } function init_posts () { + + if ($(".flux.not_read")[0] != undefined) { + url = $(".nav_menu a.read_all").attr ("href"); + redirect (url, false); + } + + init_img (); if (hide_posts) { @@ -112,7 +133,7 @@ function init_posts () { $(".flux a.read").click (function () { active = $(this).parents (".flux"); - mark_read (active); + mark_read (active, false); return false; }); @@ -127,6 +148,12 @@ function init_posts () { $(".flux .content a").click (function () { $(this).attr ('target', '_blank'); }); + + + $(".flux .link a").click (function () { + mark_read($(this).parent().parent().parent(), true); + }); + } function init_column_categories () { @@ -152,13 +179,13 @@ $(document).ready (function () { shortcut.add("", function () { // on marque comme lu ou non lu active = $(".flux.active"); - mark_read (active); + mark_read (active, false); }, { 'disable_in_input':true }); shortcut.add("shift+", function () { // on marque tout comme lu - url = $("#top a.read_all").attr ("href"); + url = $(".nav_menu a.read_all").attr ("href"); redirect (url, false); }, { 'disable_in_input':true @@ -233,6 +260,12 @@ $(document).ready (function () { shortcut.add("", function () { url = $(".flux.active .link a").attr ("href"); + + $(".flux.active").each (function () { + mark_read($(this), true); + }); + + redirect (url, true); }, { 'disable_in_input':true diff --git a/public/data/Configuration.array.php b/public/data/Configuration.array.php index 2ab67f731..ce5a1a8ee 100644 --- a/public/data/Configuration.array.php +++ b/public/data/Configuration.array.php @@ -15,4 +15,9 @@ return array ( 'next_page' => 'right', 'prev_page' => 'left', ), + 'mark_when' => array ( + 'article' => 'yes', + 'site' => 'yes', + 'page' => 'no', + ), ); diff --git a/public/theme/base.css b/public/theme/base.css index b3295cdd4..1cae71243 100644 --- a/public/theme/base.css +++ b/public/theme/base.css @@ -1,3 +1,10 @@ +/* FONTS */ +@font-face { + font-family: 'OpenSans'; + src: local('fonts/openSans.woff') format('woff'); +} + + * { margin: 0; padding: 0; @@ -682,6 +689,7 @@ input { margin: 0 auto; padding: 10px; line-height: 170%; + font-family: 'OpenSans'; } .content h1, .content h2, .content h3 { margin: 20px 0 5px; @@ -708,12 +716,15 @@ input { } .content q, .content blockquote { display: block; - margin: 0; - padding: 10px 20px; + margin: 5px 0; + padding: 5px 20px; font-style: italic; border-left: 4px solid #ccc; color: #666; } + .content blockquote p { + margin: 0; + } /*** PAGINATION ***/ .pagination { @@ -747,11 +758,10 @@ input { .notification { position: fixed; bottom: 0; - left: 25%; - width: 50%; - height: 50px; - padding: 0 50px; - line-height: 50px; + left: 5%; right: 5%; + min-height: 30px; + padding: 10px; + line-height: 30px; text-align: center; border-radius: 5px 5px 0 0; box-shadow: 0 0 5px #666; @@ -770,7 +780,7 @@ input { width: 16px; height: 16px; float: right; - margin: -10px -60px 0 0; + margin: -20px -20px 0 0; padding: 5px; background: #fff; border-radius: 50px; diff --git a/public/theme/fonts/openSans.woff b/public/theme/fonts/openSans.woff new file mode 100644 index 0000000000000000000000000000000000000000..55b25f867099eb26c436b1c9fecff14a51290d46 GIT binary patch literal 21956 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 V`l^D1+v7dzXWE*Ozus}S{{vS5Z1n&D literal 0 HcmV?d00001