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 794a86310c074edc3967bd2091935a6637191598..ccc261bdeb95ed6c1c4edd31707136e112eae3e2 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 @@ -1,6 +1,7 @@ package de.vipra.rest.resource; import java.io.IOException; +import java.util.Date; import java.util.List; import javax.servlet.ServletContext; @@ -15,7 +16,6 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; import org.bson.types.ObjectId; @@ -114,14 +114,25 @@ public class TopicResource { @Path("{id}/articles") public Response getArticles(@PathParam("id") final String id, @QueryParam("skip") final Integer skip, @QueryParam("limit") final Integer limit, @QueryParam("sort") @DefaultValue("title") final String sortBy, @QueryParam("fields") final String fields, - @Context final UriInfo uriInfo) { + @QueryParam("from") final Long fromDate, @QueryParam("to") final Long toDate) { final ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>(); try { final Topic topic = new Topic(MongoUtils.objectId(id)); final QueryBuilder query = QueryBuilder.builder().eq("topics.topic", topic).skip(skip).limit(limit).sortBy(sortBy); + if (fields != null && !fields.isEmpty()) query.fields(true, StringUtils.getFields(fields)); + if (fromDate != null) { + final Date d = new Date(fromDate * 1000); + query.gte("date", d); + } + + if (toDate != null) { + final Date d = new Date(toDate * 1000); + query.lte("date", d); + } + final List<ArticleFull> articles = dbArticles.getMultiple(query); if ((skip != null && skip > 0) || (limit != null && limit > 0)) diff --git a/vipra-ui/app/html/directives/article-link.html b/vipra-ui/app/html/directives/article-link.html index 3f1c87c3affe6374ae7cc014b649a1f72d47ea4b..6573ef9fe67d929dd4b276ff98e338875d26fb4a 100644 --- a/vipra-ui/app/html/directives/article-link.html +++ b/vipra-ui/app/html/directives/article-link.html @@ -7,5 +7,5 @@ <i class="fa text-muted pointer" ng-class="{'fa-chevron-down':!excerptShown, 'fa-chevron-up':excerptShown}" ng-click="toggleExcerpt()" ng-if="::showExcerpt"></i> <span class="badge" ng-bind="::article.topicsCount" ng-attr-title="{{::article.topicsCount}} topic(s)" ng-if="::showBadge"></span> </div> - <div ng-bind="excerpt" ng-if="excerptShown"></div> + <div ng-bind="excerpt" ng-if="excerptShown" class="excerpt"></div> </span> diff --git a/vipra-ui/app/html/directives/sequence-dropdown.html b/vipra-ui/app/html/directives/sequence-dropdown.html index 09cddc2dec4652c955b50bc9f833ff0f9cb226b4..a786621254b7d1cc46df10a392a88777f232873a 100644 --- a/vipra-ui/app/html/directives/sequence-dropdown.html +++ b/vipra-ui/app/html/directives/sequence-dropdown.html @@ -1,5 +1,5 @@ -<ol class="nya-bs-select nya-bs-condensed" ng-model="ngModel" ng-class="{dropup:showDropup}"> - <li value="{{sequence.id}}" class="nya-bs-option" ng-repeat="sequence in sequences"> +<ol class="nya-bs-select nya-bs-condensed" ng-model="ngModel" ng-class="{dropup:showDropup}" disabled="!sequences"> + <li class="nya-bs-option" nya-bs-option="sequence in sequences"> <a ng-bind="sequence.label"></a> </li> </ol> diff --git a/vipra-ui/app/html/explorer.html b/vipra-ui/app/html/explorer.html index 9f467b8f09ba0472f0090bd6875b011c2bb26624..6e5dd6286effe22d866d7bba9351e0a98ad2c7e6 100644 --- a/vipra-ui/app/html/explorer.html +++ b/vipra-ui/app/html/explorer.html @@ -94,7 +94,8 @@ <div class="wrapper"> <div class="topbar"> <small>Sequence:</small> - <sequence-dropdown ng-model="explorerModels.sequenceId" sequences="explorerModels.activeTopic.sequences" clear="true"></sequence-dropdown> + <sequence-dropdown ng-model="explorerModels.activeSequence" sequences="explorerModels.activeTopic.sequences"></sequence-dropdown> + <button class="btn btn-sm btn-default" ng-click="clearSequence()" ng-disabled="!explorerModels.activeSequence">Clear</button> </div> </div> </div> diff --git a/vipra-ui/app/html/topics/show.html b/vipra-ui/app/html/topics/show.html index c7c29ca170c7e532baea4cb3eabc10507abc3557..9b10d2f1f83e15015e6f9bec73727a88ba6ea2ce 100644 --- a/vipra-ui/app/html/topics/show.html +++ b/vipra-ui/app/html/topics/show.html @@ -113,10 +113,10 @@ <div class="panel panel-default"> <div class="panel-heading seq-head-foot"> <small>Sequence:</small> - <sequence-dropdown ng-model="topicsShowModels.sequenceId" sequences="topic.sequences"></sequence-dropdown> + <sequence-dropdown ng-model="topicsShowModels.sequence" sequences="topic.sequences"></sequence-dropdown> <div class="pull-right" ng-if="!sequenceCompare"> <small>Compare to:</small> - <sequence-dropdown ng-model="topicsShowModels.sequenceIdCompare" sequences="topic.sequences"></sequence-dropdown> + <sequence-dropdown ng-model="topicsShowModels.sequenceCompare" sequences="topic.sequences"></sequence-dropdown> </div> </div> <table class="table table-condensed table-bordered table-hover table-fixed table-compare" ng-show="sequence" ng-cloak> @@ -164,7 +164,7 @@ <div class="panel panel-default"> <div class="panel-heading seq-head-foot"> <small>Sequence:</small> - <sequence-dropdown ng-model="topicsShowModels.sequenceIdCompare" sequences="topic.sequences"></sequence-dropdown> + <sequence-dropdown ng-model="topicsShowModels.sequenceCompare" sequences="topic.sequences"></sequence-dropdown> <button type="button" class="close" ng-click="closeCompare()"><span aria-hidden="true">×</span></button> </div> <table class="table table-condensed table-bordered table-hover table-fixed table-compare"> diff --git a/vipra-ui/app/js/controllers.js b/vipra-ui/app/js/controllers.js index 396553cf118bcdd38cb77fd215cbb7b00c99d1ff..c6643beaac9cbf682df48323b5fe8236485bf08c 100644 --- a/vipra-ui/app/js/controllers.js +++ b/vipra-ui/app/js/controllers.js @@ -572,7 +572,7 @@ $scope.changeSelectedTopics = function() { if($scope.explorerModels.activeTopic && !$scope.explorerModels.activeTopic.selected) { delete $scope.explorerModels.activeTopic; - delete $scope.explorerModels.sequenceId; + delete $scope.explorerModels.activeSequence; } $scope.redrawGraph(); @@ -670,15 +670,16 @@ $scope.pointSelected = function(e) { $scope.$apply(function() { $scope.activateTopic(e.point.topic); + $scope.activateSequence(e.point.sequence); }); }; $scope.activateTopic = function(topic) { - var active = topic.active; - for(var i = 0; i < $scope.topics.length; i++) { - $scope.topics[i].active = false; - } - topic.active = !active; + $scope.explorerModels.activeTopic = topic; + }; + + $scope.activateSequence = function(seq) { + $scope.explorerModels.activeSequence = seq; }; $scope.$watchGroup(['explorerModels.seqstyle', 'explorerModels.chartstyle', 'explorerModels.chartstack'], $scope.redrawGraph); @@ -698,11 +699,15 @@ }, 0); }); - $scope.$watch('explorerModels.activeTopic', function() { - if(!$scope.activeTopic) return; + $scope.clearSequence = function() { + if(!$scope.explorerModels.activeSequence) return; - // TODO implement - }); + delete $scope.explorerModels.activeSequence; + var selectedPoints = topicRelChartElement.highcharts().getSelectedPoints(); + for(var i = 0; i < selectedPoints.length; i++) { + selectedPoints[i].select(false); + } + }; } ]); @@ -949,7 +954,7 @@ // preselect first sequence if ($scope.topic.sequences && $scope.topic.sequences.length) - $scope.topicsShowModels.sequenceId = $scope.topic.sequences[0].id; + $scope.topicsShowModels.sequence = $scope.topic.sequences[0]; $timeout(function() { $scope.redrawRelevanceGraph(); @@ -1074,7 +1079,7 @@ $scope.closeCompare = function() { delete $scope.sequenceCompare; - delete $scope.topicsShowModels.sequenceIdCompare; + delete $scope.topicsShowModels.sequenceCompare; }; $scope.$watch('topicsShowModels.relSeqstyle', $scope.redrawRelevanceGraph); @@ -1083,22 +1088,22 @@ $scope.$watch('topicsShowModels.wordSeqstyle', $scope.redrawWordEvolutionChart); $scope.$watch('topicsShowModels.wordChartstyle', $scope.redrawWordEvolutionChart); - $scope.$watch('topicsShowModels.sequenceId', function() { - if (!$scope.topicsShowModels.sequenceId) return; + $scope.$watch('topicsShowModels.sequence', function() { + if (!$scope.topicsShowModels.sequence) return; SequenceFactory.get({ - id: $scope.topicsShowModels.sequenceId + id: $scope.topicsShowModels.sequence.id }, function(data) { $scope.sequence = data; $scope.recalcSeqChange(); }); }); - $scope.$watch('topicsShowModels.sequenceIdCompare', function() { - if (!$scope.topicsShowModels.sequenceIdCompare) return; + $scope.$watch('topicsShowModels.sequenceCompare', function() { + if (!$scope.topicsShowModels.sequenceCompare) return; SequenceFactory.get({ - id: $scope.topicsShowModels.sequenceIdCompare + id: $scope.topicsShowModels.sequenceCompare.id }, function(data) { $scope.sequenceCompare = data; $scope.recalcSeqChange(); diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js index cc2fada9dec44cb4c16bfb7ade2eda152e03e438..f0509848c60fdb955cb796b6fc45d3d19b7a4ce9 100644 --- a/vipra-ui/app/js/directives.js +++ b/vipra-ui/app/js/directives.js @@ -257,12 +257,10 @@ scope: { ngModel: '=', sequences: '=', - dropup: '@', - clear: '@' + dropup: '@' }, link: function($scope) { $scope.showDropup = $scope.dropup === 'true'; - $scope.showClear = $scope.clear === 'true'; $scope.$watch('sequences', function(newValue) { if (newValue) { diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less index d1a4c835f9b70d7d6c55aecd8ab04dbd85a30787..e3d94c6826c5c14406b545fa022a1bd438b55c57 100644 --- a/vipra-ui/app/less/app.less +++ b/vipra-ui/app/less/app.less @@ -553,6 +553,11 @@ entity-menu { } } +.excerpt { + padding-top: 10px; + color: #555; +} + @-moz-keyframes spin { 100% { -moz-transform: rotateY(360deg); diff --git a/vipra-util/src/main/java/de/vipra/util/Constants.java b/vipra-util/src/main/java/de/vipra/util/Constants.java index ed5c39e9923a7f2f23f1b39632c8403817ffb1a7..936f6b4e432ed6977afc9e5f2a979215d59f2ddb 100644 --- a/vipra-util/src/main/java/de/vipra/util/Constants.java +++ b/vipra-util/src/main/java/de/vipra/util/Constants.java @@ -273,7 +273,7 @@ public class Constants { * The length of the text excerpt used for indexing and displaying text in * search results. */ - public static final int EXCERPT_LENGTH = 250; + public static final int EXCERPT_LENGTH = 500; /* * OTHER