diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/SequenceResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/SequenceResource.java index 1f491b92782b79c6d99739ba0bc376db379f8f26..7fe6e1155020e95d1efee8901d853296f1de6fa2 100644 --- a/vipra-backend/src/main/java/de/vipra/rest/resource/SequenceResource.java +++ b/vipra-backend/src/main/java/de/vipra/rest/resource/SequenceResource.java @@ -59,7 +59,7 @@ public class SequenceResource { final List<SequenceFull> sequences = dbSequences.getMultiple(query); if ((skip != null && skip > 0) || (limit != null && limit > 0)) - res.addHeader("total", dbSequences.count(null)); + res.addHeader("total", dbSequences.count(query)); else res.addHeader("total", sequences.size()); diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/TopicModelResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/TopicModelResource.java index c28eafebbaf9613fd900804a47be0659f041017f..f5f8c5d110df7182c0e1a459f3c229f92925ad3f 100644 --- a/vipra-backend/src/main/java/de/vipra/rest/resource/TopicModelResource.java +++ b/vipra-backend/src/main/java/de/vipra/rest/resource/TopicModelResource.java @@ -51,7 +51,7 @@ public class TopicModelResource { final List<TopicModelFull> topicModels = dbTopicModels.getMultiple(query); if ((skip != null && skip > 0) || (limit != null && limit > 0)) - res.addHeader("total", dbTopicModels.count(null)); + res.addHeader("total", dbTopicModels.count(query)); else res.addHeader("total", topicModels.size()); diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java index bf0eafe7403364c2ace741b657ccf9c772e02bed..1d2b03bfd85d25f5fdbe76f00af3aeab1237dea7 100644 --- a/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java +++ b/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java @@ -143,7 +143,7 @@ public class TopicResource { final List<ArticleFull> articles = dbArticles.getMultiple(query); if ((skip != null && skip > 0) || (limit != null && limit > 0)) - res.addHeader("total", dbArticles.count(QueryBuilder.builder().eq("topics.topic", topic))); + res.addHeader("total", dbArticles.count(query)); else res.addHeader("total", articles.size()); diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/WindowResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/WindowResource.java index 0b697ccb3982122c12091501bb89183c5ba3a52b..e99aa00be9054a888dc45d7cf1ab19548164db1c 100644 --- a/vipra-backend/src/main/java/de/vipra/rest/resource/WindowResource.java +++ b/vipra-backend/src/main/java/de/vipra/rest/resource/WindowResource.java @@ -57,7 +57,7 @@ public class WindowResource { final List<WindowFull> windows = dbWindows.getMultiple(query); if ((skip != null && skip > 0) || (limit != null && limit > 0)) - res.addHeader("total", dbWindows.count(null)); + res.addHeader("total", dbWindows.count(query)); else res.addHeader("total", windows.size()); diff --git a/vipra-ui/app/html/explorer.html b/vipra-ui/app/html/explorer.html index 8058d7f5c6cca5471721bc1011abb788cfb14134..f7b6bad7658a8967c8a969a9af6ece9e42625a06 100644 --- a/vipra-ui/app/html/explorer.html +++ b/vipra-ui/app/html/explorer.html @@ -138,8 +138,8 @@ </table> <div class="panel-footer"> <ng-pluralize count="articles.length" when="{0:'No articles',1:'First entity',other:'First {} articles'}"></ng-pluralize> - <button class="btn btn-default btn-sm" ng-click="showMoreArticles()" ng-show="articles.length<allArticles.length" ng-cloak>Show more</button> - <button class="btn btn-default btn-sm" ng-click="showAllArticles()" ng-show="articles.length<allArticles.length" ng-cloak>Show all</button> + <button class="btn btn-default btn-sm" ng-click="showMoreArticles()" ng-show="articles.length<articlesTotal" ng-cloak>Show more</button> + <button class="btn btn-default btn-sm" ng-click="showAllArticles()" ng-show="articles.length<articlesTotal" ng-cloak>Show all</button> </div> </div> </div> diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html index 9d6feb29b48e673c174c8d2f33769580ce583c56..e6a81833a06b7327e7d85b093e6e091c6070ee2e 100644 --- a/vipra-ui/app/html/index.html +++ b/vipra-ui/app/html/index.html @@ -62,15 +62,22 @@ <div class="container-fluid" ng-show="!searching && !search"> <div class="container"> <div class="row"> - <div class="col-md-offset-1 col-md-10 col-sm-12"> - <div class="embed-responsive embed-responsive-16by9 screencast"> - <video controls muted poster="img/vipra-logo-big.png"> + <div class="col-xs-offset-1 col-xs-5"> + <div class="embed-responsive embed-responsive-16by9 media-box"> + <video controls muted poster="img/vipra-screencast.png"> <source src="//ftp.cochu.io/vipra/screencast.mp4" type="video/mp4"> <source src="//ftp.cochu.io/vipra/screencast.webm" type="video/webm"> Your browser does not support the video tag. </video> </div> </div> + <div class="col-xs-5"> + <div class="embed-responsive embed-responsive-16by9 media-box"> + <a ui-sref="slides"> + <img src="img/vipra-slides.png" class="slides-thumb"> + </a> + </div> + </div> </div> </div> </div> @@ -90,7 +97,7 @@ <p> <span class="text" ng-bind="article.text"></span> <br> - <small class="text-muted" ng-bind-template="{{::Vipra.toPercent(article.meta.score)}}% – {{::Vipra.formatDate(article.date)}}"></small> + <small class="text-muted" ng-bind-template="{{::article.meta.score.toFixed(3)}} – {{::Vipra.formatDate(article.date)}}" ng-attr-title="Relevance: {{::article.meta.score.toFixed(3)}}, Date: {{::Vipra.formatDate(article.date)}}"></small> </p> </li> </ul> diff --git a/vipra-ui/app/html/slides.html b/vipra-ui/app/html/slides.html new file mode 100644 index 0000000000000000000000000000000000000000..e995f57e5b326013a06ac4ae31b466e919d7edf6 --- /dev/null +++ b/vipra-ui/app/html/slides.html @@ -0,0 +1,4 @@ +<div class="fullsize navpadding slides"> + <div class="go left" ng-show="current>1" ng-click="go(current-1)"></div> + <div class="go right" ng-click="go(current+1)"></div> +</div> \ No newline at end of file diff --git a/vipra-ui/app/img/vipra-screencast.png b/vipra-ui/app/img/vipra-screencast.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6b07859bd049f865d18a05481b9ef80d589000 Binary files /dev/null and b/vipra-ui/app/img/vipra-screencast.png differ diff --git a/vipra-ui/app/img/vipra-slides.png b/vipra-ui/app/img/vipra-slides.png new file mode 100644 index 0000000000000000000000000000000000000000..f7393f4b5b8b0d5a0e75edda40c46e8e356dac34 Binary files /dev/null and b/vipra-ui/app/img/vipra-slides.png differ diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js index 55301b93cbe6c9a77f5cc91fdd68a7e5e9151583..3efc9c10636782aaf52d49e229c4f873e8801859 100644 --- a/vipra-ui/app/js/app.js +++ b/vipra-ui/app/js/app.js @@ -137,6 +137,14 @@ controller: 'EntitiesArticlesController' }); + // states: slides + + $stateProvider.state('slides', { + url: '/slides', + templateUrl: 'html/slides.html', + controller: 'SlidesController' + }); + // states: errors $stateProvider.state('error', { diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js index e2910e8bfcc97765de7338ea19a0f749462f918b..590242e0699cccbfca6f0b215679d43c7551280e 100644 --- a/vipra-ui/app/js/controllers.js +++ b/vipra-ui/app/js/controllers.js @@ -849,19 +849,31 @@ $scope.sequenceChanged = function() { if(!$scope.explorerModels.activeTopic || !$scope.explorerModels.activeSequence) return; + $scope.articles = []; + $scope.showMoreArticles(); + }; + + $scope.showMoreArticles = function(limit) { $scope.loadingArticles = true; TopicFactory.articles({ + skip: $scope.articles ? $scope.articles.length : 0, + limit: typeof limit === 'undefined' ? 20 : limit, id: $scope.explorerModels.activeTopic.id, from: new Date($scope.explorerModels.activeSequence.window.startDate).getTime(), to: new Date($scope.explorerModels.activeSequence.window.endDate).getTime() - }, function(data) { - $scope.articles = data; + }, function(data, headers) { + $scope.articles.push.apply($scope.articles, data); + $scope.articlesTotal = headers("V-Total"); $scope.loadingArticles = false; }, function() { $scope.loadingArticles = false; }); }; + $scope.showAllArticles = function() { + $scope.showMoreArticles(0); + }; + $scope.$watchGroup(['explorerModels.seqstyle', 'explorerModels.chartstyle', 'explorerModels.chartstack'], $scope.redrawGraph); $scope.$watch('explorerModels.sorttopics', function() { @@ -1572,6 +1584,32 @@ } ]); + /**************************************************************************** + * Slides Controllers + ****************************************************************************/ + + app.controller('SlidesController', ['$scope', function($scope) { + + $scope.current = 1; + + var folder = '//ftp.cochu.io/vipra/slides/'; + var prefix = 'Folie'; + var suffix = '.PNG'; + var slides = $('.slides'); + + slides.css('background-image', 'url(' + folder + prefix + $scope.current + suffix + ')'); + + $scope.go = function(next) { + $('<img/>').attr('src', folder + prefix + next + suffix).load(function() { + $scope.$apply(function() { + $scope.current = next; + slides.css('background-image', 'url(' + folder + prefix + $scope.current + suffix + ')'); + }); + }); + }; + } + ]); + /**************************************************************************** * Error Controllers ****************************************************************************/ diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less index 484ba463c91c2e6c906f5a6604805a868a26ccf9..a08f5295fa2ff765c9e56d981f7c9ddf2ae8df00 100644 --- a/vipra-ui/app/less/app.less +++ b/vipra-ui/app/less/app.less @@ -141,10 +141,6 @@ a:hover { } } -.graph-popover { - -} - .initial { float: left; font-size: 70px; @@ -695,7 +691,7 @@ entity-menu { position: relative; & + & { - border-top: 1px solid #ddd; + border-top: 1px solid #888; } } @@ -776,9 +772,13 @@ entity-menu { .title-band { background: linear-gradient(141deg, #0fb8ad 0%, #1fc8db 51%, #2cb5e8 75%); - padding: 80px 0 50px 0; + padding: 70px 0 45px 0; &.slim { padding: 80px 0 30px 0; + .form-group, + .row-spaced { + margin: 0; + } } .text-logo { font-size: 60px; @@ -862,11 +862,15 @@ entity-menu { width: 40px; } -.screencast { +.media-box { border: 8px solid #eee; margin: 10px auto; } +.slides-thumb { + width: 100%; +} + #feedbackModal { .modal-dialog { height: 100%; @@ -901,6 +905,28 @@ entity-menu { padding: 10px; } +.slides { + background-repeat: no-repeat; + background-size: contain; + background-position: 50% 50%; + + .go { + position: absolute; + top: 0; + bottom: 0; + width: 50%; + cursor: pointer; + + &.left { + left: 0; + } + + &.right { + right: 0; + } + } +} + @keyframes spin { 100% { -webkit-transform: rotateY(360deg);