aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-10-09 16:15:43 +0200
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-10-09 16:15:43 +0200
commit52173d71215733b9b94c7e6ae02dc84151d94d0a (patch)
treeabfa449b0ac4d448a9bb0e91b79b4e23de1b0d54
parent444b1552364b39761c3278c7da5152fd3998f216 (diff)
parentcaf98a6468dcea5ae8c38062e4eb527cb3667db9 (diff)
Merge branch 'hotfixes'
-rw-r--r--CHANGELOG15
-rw-r--r--README.fr.md4
-rw-r--r--README.md4
-rwxr-xr-xapp/Controllers/feedController.php2
-rwxr-xr-xapp/Controllers/indexController.php3
-rw-r--r--app/Controllers/statsController.php1
-rw-r--r--app/Models/Feed.php2
-rw-r--r--app/Models/StatsDAO.php27
-rw-r--r--app/Models/StatsDAOSQLite.php23
-rw-r--r--app/i18n/en.php1
-rw-r--r--app/i18n/fr.php1
-rw-r--r--app/views/helpers/view/normal_view.phtml9
-rw-r--r--app/views/stats/index.phtml18
-rw-r--r--app/views/stats/repartition.phtml6
-rw-r--r--p/scripts/main.js11
15 files changed, 99 insertions, 28 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 44d3452ae..1a4a8879b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,20 @@
# Journal des modifications
+## 2014-10-09 FreshRSS 0.8.1 / 0.9.1 (beta)
+
+* UI
+ * Add a space after tag icon
+* Statistics
+ * Add an average per day on the 30 day period graph
+ * Add percent of total on top 10 feed
+* Bug fixes
+ * Fix "mark as read" in global view
+ * Fix "read all" shortcut
+ * Fix categories not appearing when adding a new feed (GET action)
+ * Fix enclosure problem
+ * Fix getExtension() on PHP < 5.3.7
+
+
## 2014-09-26 FreshRSS 0.8.0 / 0.9.0 (beta)
* UI
diff --git a/README.fr.md b/README.fr.md
index 46f1e7c8f..050f49ec6 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -10,8 +10,8 @@ Il permet de gérer plusieurs utilisateurs, et dispose d’un mode de lecture an
* Site officiel : http://freshrss.org
* Démo : http://demo.freshrss.org/
* Développeur : Marien Fressinaud <dev@marienfressinaud.fr>
-* Version actuelle : 0.8.0
-* Date de publication 2014-09-26
+* Version actuelle : x.y.z
+* Date de publication : YYYY-MM-DD
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
![Logo de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
diff --git a/README.md b/README.md
index 501dca342..7c74e8ada 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,8 @@ It is a multi-user application with an anonymous reading mode.
* Official website: http://freshrss.org
* Demo: http://demo.freshrss.org/
* Developer: Marien Fressinaud <dev@marienfressinaud.fr>
-* Current version: 0.8.0
-* Publication date: 2014-09-26
+* Current version: x.y.z
+* Publication date: YYYY-MM-DD
* License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
![FreshRSS logo](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index c7cc25fbb..f75c969d9 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -171,7 +171,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
// GET request so we must ask confirmation to user
Minz_View::prependTitle(Minz_Translate::t('add_rss_feed') . ' · ');
- $this->view->categories = $this->catDAO->listCategories();
+ $this->view->categories = $this->catDAO->listCategories(false);
$this->view->feed = new FreshRSS_Feed($url);
try {
// We try to get some more information about the feed
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index e8e26b142..d3b299f4e 100755
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -330,7 +330,8 @@ class FreshRSS_index_Controller extends Minz_ActionController {
private static function purgeTokens() {
$oldest = time() - 2629744; //1 month //TODO: Use a configuration instead
foreach (new DirectoryIterator(DATA_PATH . '/tokens/') as $fileInfo) {
- if ($fileInfo->getExtension() === 'txt' && $fileInfo->getMTime() < $oldest) {
+ $extension = pathinfo($fileInfo->getFilename(), PATHINFO_EXTENSION);
+ if ($extension === 'txt' && $fileInfo->getMTime() < $oldest) {
@unlink($fileInfo->getPathname());
}
}
diff --git a/app/Controllers/statsController.php b/app/Controllers/statsController.php
index 256543f37..3069be34d 100644
--- a/app/Controllers/statsController.php
+++ b/app/Controllers/statsController.php
@@ -21,6 +21,7 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js')));
$this->view->repartition = $statsDAO->calculateEntryRepartition();
$this->view->count = $statsDAO->calculateEntryCount();
+ $this->view->average = $statsDAO->calculateEntryAverage();
$this->view->feedByCategory = $statsDAO->calculateFeedByCategory();
$this->view->entryByCategory = $statsDAO->calculateEntryByCategory();
$this->view->topFeed = $statsDAO->calculateTopFeed();
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index 2a5ea45ac..03baf3ad2 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -288,6 +288,8 @@ class FreshRSS_Feed extends Minz_Model {
$content .= '<br /><audio lazyload="" postpone="" preload="none" src="' . $elink . '" controls="controls" />';
} elseif (strpos($mime, 'video/') === 0) {
$content .= '<br /><video lazyload="" postpone="" preload="none" src="' . $elink . '" controls="controls" />';
+ } else {
+ unset($elinks[$elink]);
}
}
}
diff --git a/app/Models/StatsDAO.php b/app/Models/StatsDAO.php
index 40505ab3e..08dd4cd5c 100644
--- a/app/Models/StatsDAO.php
+++ b/app/Models/StatsDAO.php
@@ -80,6 +80,27 @@ SQL;
}
/**
+ * Calculates entry average per day on a 30 days period.
+ *
+ * @return integer
+ */
+ public function calculateEntryAverage() {
+ $period = self::ENTRY_COUNT_PERIOD;
+
+ // Get stats per day for the last 30 days
+ $sql = <<<SQL
+SELECT COUNT(1) / {$period} AS average
+FROM {$this->prefix}entry AS e
+WHERE FROM_UNIXTIME(e.date, '%Y%m%d') BETWEEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -{$period} DAY), '%Y%m%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d')
+SQL;
+ $stm = $this->bd->prepare($sql);
+ $stm->execute();
+ $res = $stm->fetch(PDO::FETCH_NAMED);
+
+ return round($res['average'], 2);
+ }
+
+ /**
* Initialize an array for the entry count.
*
* @return array
@@ -160,7 +181,7 @@ SQL;
public function calculateEntryAveragePerFeedPerHour($feed = null) {
return $this->calculateEntryAveragePerFeedPerPeriod(1/24, $feed);
}
-
+
/**
* Calculates the average number of article per day of week per feed
*
@@ -180,10 +201,10 @@ SQL;
public function calculateEntryAveragePerFeedPerMonth($feed = null) {
return $this->calculateEntryAveragePerFeedPerPeriod(30, $feed);
}
-
+
/**
* Calculates the average number of article per feed
- *
+ *
* @param float $period number used to divide the number of day in the period
* @param integer $feed id
* @return integer
diff --git a/app/Models/StatsDAOSQLite.php b/app/Models/StatsDAOSQLite.php
index 3b1256de1..bb2336532 100644
--- a/app/Models/StatsDAOSQLite.php
+++ b/app/Models/StatsDAOSQLite.php
@@ -34,6 +34,29 @@ SQL;
return $this->convertToSerie($count);
}
+ /**
+ * Calculates entry average per day on a 30 days period.
+ *
+ * @return integer
+ */
+ public function calculateEntryAverage() {
+ $period = self::ENTRY_COUNT_PERIOD;
+
+ // Get stats per day for the last 30 days
+ $sql = <<<SQL
+SELECT COUNT(1) / {$period} AS average
+FROM {$this->prefix}entry AS e
+WHERE strftime('%Y%m%d', e.date, 'unixepoch')
+ BETWEEN strftime('%Y%m%d', 'now', '-{$period} days')
+ AND strftime('%Y%m%d', 'now', '-1 day')
+SQL;
+ $stm = $this->bd->prepare($sql);
+ $stm->execute();
+ $res = $stm->fetch(PDO::FETCH_NAMED);
+
+ return round($res['average'], 2);
+ }
+
protected function calculateEntryRepartitionPerFeedPerPeriod($period, $feed = null) {
if ($feed) {
$restrict = "WHERE e.id_feed = {$feed}";
diff --git a/app/i18n/en.php b/app/i18n/en.php
index beba02c4d..0d3654744 100644
--- a/app/i18n/en.php
+++ b/app/i18n/en.php
@@ -56,6 +56,7 @@ return array (
'stats_entry_per_hour' => 'Per hour',
'stats_entry_per_day_of_week' => 'Per day of week',
'stats_entry_per_month' => 'Per month',
+ 'stats_percent_of_total' => '%% of total',
'last_week' => 'Last week',
'last_month' => 'Last month',
diff --git a/app/i18n/fr.php b/app/i18n/fr.php
index b0fbf15ae..c72fc3e93 100644
--- a/app/i18n/fr.php
+++ b/app/i18n/fr.php
@@ -56,6 +56,7 @@ return array (
'stats_entry_per_hour' => 'Par heure',
'stats_entry_per_day_of_week' => 'Par jour de la semaine',
'stats_entry_per_month' => 'Par mois',
+ 'stats_percent_of_total' => '%% du total',
'last_week' => 'Depuis la semaine dernière',
'last_month' => 'Depuis le mois dernier',
diff --git a/app/views/helpers/view/normal_view.phtml b/app/views/helpers/view/normal_view.phtml
index 1dbf14f4c..6d9789f8d 100644
--- a/app/views/helpers/view/normal_view.phtml
+++ b/app/views/helpers/view/normal_view.phtml
@@ -153,14 +153,15 @@ if (!empty($this->entries)) {
if (!empty($tags)) {
?><li class="item">
<div class="dropdown">
- <div id="dropdown-tags-<?php echo $item->id ();?>" class="dropdown-target"></div>
- <a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id ();?>"><?php
- echo FreshRSS_Themes::icon('tag'), Minz_Translate::t ('related_tags');
+ <div id="dropdown-tags-<?php echo $item->id();?>" class="dropdown-target"></div>
+ <?php echo _i('tag'); ?>
+ <a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id();?>"><?php
+ echo _t('related_tags');
?></a>
<ul class="dropdown-menu">
<li class="dropdown-close"><a href="#close">❌</a></li><?php
foreach($tags as $tag) {
- ?><li class="item"><a href="<?php echo _url ('index', 'index', 'search', urlencode ('#' . $tag)); ?>"><?php echo $tag; ?></a></li><?php
+ ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', urlencode('#' . $tag)); ?>"><?php echo $tag; ?></a></li><?php
} ?>
</ul>
</div>
diff --git a/app/views/stats/index.phtml b/app/views/stats/index.phtml
index 412e77e16..fa57a77c0 100644
--- a/app/views/stats/index.phtml
+++ b/app/views/stats/index.phtml
@@ -48,6 +48,7 @@
<th><?php echo _t ('feed'); ?></th>
<th><?php echo _t ('category'); ?></th>
<th><?php echo _t ('stats_entry_count'); ?></th>
+ <th><?php echo _t ('stats_percent_of_total'); ?></th>
</tr>
</thead>
<tbody>
@@ -56,6 +57,7 @@
<td><a href="<?php echo _url('stats', 'repartition', 'id', $feed['id']); ?>"><?php echo $feed['name']; ?></a></td>
<td><?php echo $feed['category']; ?></td>
<td class="numeric"><?php echo formatNumber($feed['count']); ?></td>
+ <td class="numeric"><?php echo formatNumber($feed['count'] / $this->repartition['all_feeds']['total'] * 100, 1);?></td>
</tr>
<?php endforeach;?>
</tbody>
@@ -91,12 +93,22 @@ function initStats() {
return;
}
// Entry per day
+ var avg = [];
+ for (var i = -31; i <= 0; i++) {
+ avg.push([i, <?php echo $this->average?>]);
+ }
Flotr.draw(document.getElementById('statsEntryPerDay'),
- [<?php echo $this->count ?>],
+ [{
+ data: <?php echo $this->count ?>,
+ bars: {horizontal: false, show: true}
+ },{
+ data: avg,
+ lines: {show: true},
+ label: "<?php echo $this->average?>"
+ }],
{
grid: {verticalLines: false},
- bars: {horizontal: false, show: true},
- xaxis: {noTicks: 6, showLabels: false, tickDecimals: 0},
+ xaxis: {noTicks: 6, showLabels: false, tickDecimals: 0, min: -30.75, max: -0.25},
yaxis: {min: 0},
mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
});
diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml
index b425c1458..750a3ffdc 100644
--- a/app/views/stats/repartition.phtml
+++ b/app/views/stats/repartition.phtml
@@ -67,7 +67,7 @@ function initStats() {
}, {
data: avg_h,
lines: {show: true},
- label: <?php echo $this->averageHour?>,
+ label: "<?php echo $this->averageHour?>",
yaxis: 2
}],
{
@@ -96,7 +96,7 @@ function initStats() {
}, {
data: avg_dow,
lines: {show: true},
- label: <?php echo $this->averageDayOfWeek?>,
+ label: "<?php echo $this->averageDayOfWeek?>",
yaxis: 2
}],
{
@@ -126,7 +126,7 @@ function initStats() {
}, {
data: avg_m,
lines: {show: true},
- label: <?php echo $this->averageMonth?>,
+ label: "<?php echo $this->averageMonth?>",
yaxis: 2
}],
{
diff --git a/p/scripts/main.js b/p/scripts/main.js
index f6d5d2907..00cd96fbe 100644
--- a/p/scripts/main.js
+++ b/p/scripts/main.js
@@ -33,7 +33,7 @@ function needsScroll($elem) {
}
function str2int(str) {
- if (str == '') {
+ if (str == '' || str === undefined) {
return 0;
}
return parseInt(str.replace(/\D/g, ''), 10) || 0;
@@ -538,14 +538,7 @@ function init_shortcuts() {
});
shortcut.add("shift+" + shortcuts.mark_read, function () {
// on marque tout comme lu
- var btn = $(".nav_menu .read_all");
- if (btn.hasClass('confirm')) {
- if (confirm(str_confirmation)) {
- btn.click();
- }
- } else {
- btn.click();
- }
+ $(".nav_menu .read_all").click();
}, {
'disable_in_input': true
});