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 5037e99e146471fb904007cef7808ab5e7671df2..69d76ea7fe4663f4c81b8ed1681b6aed83e7672c 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 @@ -15,6 +15,7 @@ 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; @@ -104,7 +105,7 @@ 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) { + @QueryParam("fields") final String fields, @Context UriInfo uriInfo) { final ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>(); try { final Topic topic = new Topic(MongoUtils.objectId(id)); diff --git a/vipra-ui/app/html/directives/article-link.html b/vipra-ui/app/html/directives/article-link.html new file mode 100644 index 0000000000000000000000000000000000000000..96d2a1853b6f957de2162f2ec0efc96c2a6c8cdf --- /dev/null +++ b/vipra-ui/app/html/directives/article-link.html @@ -0,0 +1,6 @@ +<span> + <a class="article-link" ui-sref="articles.show({id:article.id})"> + <span ng-bind="article.title"></span> +<ng-transclude/> +</a> +</span> diff --git a/vipra-ui/app/html/directives/topic-link.html b/vipra-ui/app/html/directives/topic-link.html new file mode 100644 index 0000000000000000000000000000000000000000..3423ff2bc20b5dde54324f3b2990914a202e29de --- /dev/null +++ b/vipra-ui/app/html/directives/topic-link.html @@ -0,0 +1,7 @@ +<span> + <a class="topic-link" ui-sref="topics.show({id:topic.id})"> + <span ng-bind="topic.name"></span> +<ng-transclude/> +</a> +<topic-menu topic="topic" /> +</span> diff --git a/vipra-ui/app/html/directives/topic-menu.html b/vipra-ui/app/html/directives/topic-menu.html new file mode 100644 index 0000000000000000000000000000000000000000..8d3b33b220ada75728b5c6148f85f33ae72d1d63 --- /dev/null +++ b/vipra-ui/app/html/directives/topic-menu.html @@ -0,0 +1,12 @@ +<div class="dropdown inline-block"> + <a data-toggle="dropdown"> + <i class="fa fa-caret-down"></i> + </a> + <ul class="dropdown-menu dropdown-menu-right"> + <li><a ui-sref="topics.show({id:topic.id})">Show</a></li> + <li><a ui-sref="network({type:'topics',id:topic.id})">Network</a></li> + <li><a ui-sref="topics.show.articles({id:topic.id})">Articles</a></li> + <li role="separator" class="divider"></li> + <li><a ng-click="renameTopic()">Rename...</a></li> + </ul> +</div> diff --git a/vipra-ui/app/html/explorer.html b/vipra-ui/app/html/explorer.html index a75e5115437f55bfe6c9b2c157fb92db519c0204..a0ea30eca7e9a3c47417785e58d1c2c8473c4574 100644 --- a/vipra-ui/app/html/explorer.html +++ b/vipra-ui/app/html/explorer.html @@ -57,26 +57,6 @@ </div> <div class="chart" highcharts="topicSeq"></div> <div class="message text-muted" ng-show="!topicsSelected">No topic selected</div> - <div class="topics"> - <div class="row"> - <div class="col-md-6 col-sm-12" ng-repeat="topic in topics | filter:{selected:true}"> - <div class="panel panel-default panel-condensed"> - <div class="panel-heading"> - <span ng-bind="topic.name"></span> - <a ui-sref="topics.show({id:topic.id})"> - <i class="fa fa-link"></i> - </a> - <a ui-sref="network({type:'topics', id:topic.id})"> - <i class="fa fa-sitemap"></i> - </a> - <span class="colorbox shown" style="background:{{::topic.color}}"></span> - </div> - <div class="panel-body"> - </div> - </div> - </div> - </div> - </div> </div> </div> </div> diff --git a/vipra-ui/app/html/index.html b/vipra-ui/app/html/index.html index 778502353cc8ab0b1236de6dc110dc6ee504c067..ec0dbe4df35470fbf89d6185ffe7cb0d414e73fe 100644 --- a/vipra-ui/app/html/index.html +++ b/vipra-ui/app/html/index.html @@ -2,10 +2,10 @@ <div class="row" ng-hide="search"> <div class="col-md-12 text-center"> <svg class="logo hover heading" viewBox="0 0 200 120"> - <polyline style="animation-delay:0s" class="logo-shape" points="0,0 100,45 100,75 0,0" fill="#006591"/> - <polyline style="animation-delay:.5s" class="logo-shape" points="100,45 200,0 100,75 100,45" fill="#0079a2"/> - <polyline style="animation-delay:1s" class="logo-shape" points="100,75 200,0 100,120 100,75" fill="#006591"/> - <polyline style="animation-delay:1.5s" class="logo-shape" points="0,0 100,75 100,120 0,0" fill="#0079a2"/> + <polyline style="animation-delay:0s" class="logo-shape" points="0,0 100,45 100,75 0,0" fill="#006591" /> + <polyline style="animation-delay:.5s" class="logo-shape" points="100,45 200,0 100,75 100,45" fill="#0079a2" /> + <polyline style="animation-delay:1s" class="logo-shape" points="100,75 200,0 100,120 100,75" fill="#006591" /> + <polyline style="animation-delay:1.5s" class="logo-shape" points="0,0 100,75 100,120 0,0" fill="#0079a2" /> </svg> </div> </div> @@ -54,4 +54,4 @@ </div> </div> </div> -<div ng-cloak ui-view></div> \ No newline at end of file +<div ng-cloak ui-view></div> diff --git a/vipra-ui/app/html/sequences/index.html b/vipra-ui/app/html/sequences/index.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vipra-ui/app/html/sequences/show.html b/vipra-ui/app/html/sequences/show.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/vipra-ui/app/html/topics/index.html b/vipra-ui/app/html/topics/index.html index 50d6d7a4290b26e086a1f8fe2d5b6695c12911c0..413d3d26e797e25071bd08c2984119ffe353af87 100644 --- a/vipra-ui/app/html/topics/index.html +++ b/vipra-ui/app/html/topics/index.html @@ -27,7 +27,7 @@ <tbody> <tr ng-repeat="topic in topics"> <td> - <a ui-sref="topics.show({id: topic.id})" ng-bind="::topic.name"></a> + <topic-link topic="topic" /> </td> </tr> </tbody> diff --git a/vipra-ui/app/html/topics/show.html b/vipra-ui/app/html/topics/show.html index cf69e48b409e1ff3b9e09f1038269e9bd2e0b972..e04ddc66714301e6b531db7a3c9a55d8fc89b1eb 100644 --- a/vipra-ui/app/html/topics/show.html +++ b/vipra-ui/app/html/topics/show.html @@ -22,7 +22,7 @@ <div class="dropdown"> <button class="btn btn-default dropdown-toggle" type="button" id="actionsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> Actions - <span class="caret"></span> + <i class="fa fa-caret-down"></i> </button> <ul class="dropdown-menu" aria-labelledby="actionsDropdown"> <li><a ng-click="startRename()">Rename</a></li> @@ -56,8 +56,8 @@ <div class="row"> <div class="col-md-12"> <h3>Relevance</h3> - <div class="wrapper"> - <div class="topbar"> + <div class="panel panel-default"> + <div class="panel-heading"> <small>Values:</small> <div class="btn-group"> <a class="btn btn-sm btn-default" ng-model="opts.seqstyle" bs-radio="'absolute'">Absolute</a> @@ -70,31 +70,38 @@ <a class="btn btn-sm btn-default" ng-model="opts.chartstyle" bs-radio="'spline'">Line</a> </div> </div> - <div class="area-chart" id="topic-seq" highcharts="topicSeq"></div> + <div class="panel-body"> + <div class="area-chart" id="topic-seq" highcharts="topicSeq"></div> + </div> </div> </div> </div> <div class="row"> <div class="col-md-12"> <h3>Words</h3> - <div class="topbar"> - <small>Sequence:</small> - <sequence-dropdown ng-model="sequenceId" sequences="topic.sequences"></sequence-dropdown> + <div class="panel panel-default"> + <div class="panel-heading"> + <small>Sequence:</small> + <sequence-dropdown ng-model="sequenceId" sequences="topic.sequences"></sequence-dropdown> + </div> + <table class="table table-condensed table-bordered table-hover" ng-show="sequence"> + <thead> + <tr> + <th ng-model="opts.sortwords" sort-by="id">Word</th> + <th ng-model="opts.sortwords" sort-by="likeliness">Likeliness</th> + </tr> + </thead> + <tbody> + <tr ng-repeat="word in sequence.words | orderBy:opts.sortwords"> + <td ng-bind="word.id"></td> + <td ng-bind="word.likeliness.toFixed(4)"></td> + </tr> + </tbody> + </table> + <div class="panel-footer" ng-show="sequence"> + <ng-pluralize count="sequence.words.length||0" when="{0:'No words',1:'Top word',other:'Top {} words'}"></ng-pluralize> + </div> </div> - <table class="table table-condensed table-bordered table-hover" ng-show="sequence"> - <thead> - <tr> - <th ng-model="opts.sortwords" sort-by="id">Word</th> - <th ng-model="opts.sortwords" sort-by="likeliness">Likeliness</th> - </tr> - </thead> - <tbody> - <tr ng-repeat="word in sequence.words | orderBy:opts.sortwords"> - <td ng-bind="word.id"></td> - <td ng-bind="word.likeliness.toFixed(4)"></td> - </tr> - </tbody> - </table> </div> </div> </div> diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html index ccdc2a362191c54096fbbe81b566f6e277b9bad7..6de3032a94501cacb0dae2b45e9448ad91a6f5ed 100644 --- a/vipra-ui/app/index.html +++ b/vipra-ui/app/index.html @@ -69,6 +69,9 @@ <li ui-sref-active="active"> <a ui-sref="topics">Topics</a> </li> + <li ui-sref-active="active"> + <a ui-sref="sequences">Sequences</a> + </li> </ul> <ul class="nav navbar-nav navbar-right"> <li ui-sref-active="active"> diff --git a/vipra-ui/app/js/app.js b/vipra-ui/app/js/app.js index 9b0ad989a68b0419c619ac412378a22b7fc56960..aa9d621acba83a58a94ab468a0133cd36b512947 100644 --- a/vipra-ui/app/js/app.js +++ b/vipra-ui/app/js/app.js @@ -82,6 +82,20 @@ controller: 'TopicsArticlesController' }); + // states: sequences + + $stateProvider.state('sequences', { + url: '/sequences', + templateUrl: 'html/sequences/index.html', + controller: 'SequencesIndexController' + }); + + $stateProvider.state('sequences.show', { + url: '/:id', + templateUrl: 'html/sequences/show.html', + controller: 'SequencesShowController' + }); + }]); app.config(['$httpProvider', function($httpProvider) { diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js index 0bca36a518f5a86527873e1d717b4716ed0c254d..3e8c67c7fdb580d79c217cf825bc2a061f35c5bc 100644 --- a/vipra-ui/app/js/directives.js +++ b/vipra-ui/app/js/directives.js @@ -2,7 +2,7 @@ * Vipra Application * Directives ******************************************************************************/ -/* globals angular, console, Vipra */ +/* globals angular, console, Vipra, bootbox */ (function() { "use strict"; @@ -19,7 +19,7 @@ restrict: 'E', replace: true, transclude: true, - template: '<a class="topic-link" ui-sref="topics.show({id:topic.id})"><span ng-bind="topic.name"></span><ng-transclude/></a>' + templateUrl: 'html/directives/topic-link.html' }; }); @@ -31,7 +31,7 @@ restrict: 'E', replace: true, transclude: true, - template: '<a class="article-link" ui-sref="articles.show({id:article.id})"><span ng-bind="article.title"></span><ng-transclude/></a>' + templateUrl: 'html/directives/article-link.html' }; }); @@ -196,7 +196,31 @@ $scope.check(); }, transclude: true, - template: '<span ng-transclude></span> <span class="caret" ng-class="{\'caret-up\':reverse}" ng-show="showCaret()"></span>' + template: '<span ng-transclude></span> <i class="fa" ng-class="{\'fa-caret-down\':!reverse, \'fa-caret-up\':reverse}" ng-show="showCaret()"></i>' + }; + }); + + app.directive('topicMenu', function() { + return { + scope: { + topic: '=' + }, + restrict: 'E', + replace: true, + templateUrl: 'html/directives/topic-menu.html', + link: function($scope) { + $scope.renameTopic = function() { + bootbox.prompt({ + title: 'Rename topic', + value: $scope.topic.name, + callback: function(name) { + if (name && name.length && name !== $scope.topic.name) { + + } + } + }); + }; + } }; }); diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less index b819dc5a22a8fe46e7642a83051bf467f9c597fd..7d81389997ea62e4ffc6ea90db9bee4aaee5fba8 100644 --- a/vipra-ui/app/less/app.less +++ b/vipra-ui/app/less/app.less @@ -8,6 +8,10 @@ body { padding-bottom: 20px; } +.pointer, +input[type=checkbox], +.checkbox label::before, +[sort-by], a:hover { cursor: pointer; } @@ -250,13 +254,9 @@ a:hover { right: 0; bottom: 0; } - .topics, .chart { padding: 15px; } - .topics .panel-heading { - position: relative; - } .sequence { flex: 1 0 0; } @@ -289,11 +289,6 @@ a:hover { } } -input[type=checkbox], -.checkbox label::before { - cursor: pointer; -} - .radio-inline { vertical-align: bottom; } @@ -310,6 +305,7 @@ input[type=checkbox], } .searchclear { + .pointer; position: absolute; right: 5px; top: 0; @@ -317,7 +313,6 @@ input[type=checkbox], height: 14px; margin: auto; font-size: 14px; - cursor: pointer; color: #ccc; } @@ -346,15 +341,6 @@ input[type=checkbox], overflow-y: auto; } -[sort-by] { - cursor: pointer; -} - -.caret.caret-up { - border-top-width: 0; - border-bottom: 4px solid #000000; -} - .panel.panel-condensed { .panel-heading { padding: 5px 10px; @@ -364,6 +350,10 @@ input[type=checkbox], } } +.inline-block { + display: inline-block; +} + @-moz-keyframes spin { 100% { -moz-transform: rotateY(360deg); diff --git a/vipra-ui/bower.json b/vipra-ui/bower.json index 7e8613c217b10bc8794b907822b9de8905de2cf4..f46a67d2bdca67f7e0251ab95151465d9f33a0d4 100644 --- a/vipra-ui/bower.json +++ b/vipra-ui/bower.json @@ -29,6 +29,7 @@ "nya-bootstrap-select": "^2.x", "font-awesome": "^4.x", "awesome-bootstrap-checkbox": "^0.x", - "randomcolor": "randomColor#^0.x" + "randomcolor": "randomColor#^0.x", + "bootbox.js": "bootbox#^4.4.0" } } diff --git a/vipra-ui/gulpfile.js b/vipra-ui/gulpfile.js index bc5fed521378568cee5cd595a4ad74f3a3b07a8c..c8ba416b009df91a187ad69fba4cea06671dcdb8 100644 --- a/vipra-ui/gulpfile.js +++ b/vipra-ui/gulpfile.js @@ -6,7 +6,6 @@ var gulp = require('gulp'), uglify = require('gulp-uglify'), cleancss = require('gulp-clean-css'), webserver = require('gulp-webserver'), - sourcemaps = require('gulp-sourcemaps'), ngannotate = require('gulp-ng-annotate'), templatecache = require('gulp-angular-templatecache'); @@ -22,7 +21,8 @@ var assets = { 'bower_components/vis/dist/vis.min.js', 'bower_components/moment/min/moment.min.js', 'bower_components/nya-bootstrap-select/dist/js/nya-bs-select.min.js', - 'bower_components/randomcolor/randomColor.js' + 'bower_components/randomcolor/randomColor.js', + 'bower_components/bootbox.js/bootbox.js' ], css: [ 'bower_components/bootstrap/dist/css/bootstrap.min.css', @@ -40,21 +40,17 @@ var assets = { gulp.task('less', function() { gulp.src('app/less/**/*.less') - //.pipe(sourcemaps.init()) .pipe(concat('app.css')) .pipe(less()) .pipe(cleancss()) - //.pipe(sourcemaps.write('.')) .pipe(gulp.dest('public/css')); }); gulp.task('js', function() { gulp.src('app/js/**/*.js') - //.pipe(sourcemaps.init()) .pipe(concat('app.js')) .pipe(ngannotate()) //.pipe(uglify()) - //.pipe(sourcemaps.write('.')) .pipe(gulp.dest('public/js')); }); diff --git a/vipra-ui/package.json b/vipra-ui/package.json index 5256a0e0dd8a9a4cb40189ce9ab7a4455b9bc315..87e1b48fb71a60a14f22100337443935cee55579 100644 --- a/vipra-ui/package.json +++ b/vipra-ui/package.json @@ -14,7 +14,6 @@ "gulp-include": "^2.1.0", "gulp-less": "^3.0.5", "gulp-ng-annotate": "^2.0.0", - "gulp-sourcemaps": "^1.6.0", "gulp-uglify": "^1.5.1", "gulp-webserver": "^0.9.1" } diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java b/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java index b0d26d8c437cc82aec81695fbfd2a92e32c85fca..7577b3e6a0b7f65bda2112e2dd22b163763e0a9b 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java @@ -4,7 +4,6 @@ import java.io.Serializable; import org.mongodb.morphia.annotations.Embedded; import org.mongodb.morphia.annotations.Reference; -import org.mongodb.morphia.annotations.Transient; @SuppressWarnings("serial") @Embedded @@ -15,9 +14,6 @@ public class TopicRef implements Comparable<TopicRef>, Serializable { private Double share; - @Transient - private Integer count; - public Topic getTopic() { return topic; } @@ -26,14 +22,6 @@ public class TopicRef implements Comparable<TopicRef>, Serializable { this.topic = topic; } - public Integer getCount() { - return count; - } - - public void setCount(final Integer count) { - this.count = count; - } - public Double getShare() { return share; } @@ -49,7 +37,7 @@ public class TopicRef implements Comparable<TopicRef>, Serializable { @Override public String toString() { - return "TopicRef [topic=" + topic + ", share=" + share + ", count=" + count + "]"; + return "TopicRef [topic=" + topic + ", share=" + share + "]"; } }