From ec801b24fe1fb8e78871f42241fd96fd7ee0de4a Mon Sep 17 00:00:00 2001
From: Eike Cochu <eike@cochu.com>
Date: Tue, 26 Apr 2016 23:56:38 +0200
Subject: [PATCH] added info directive, updated article show table margins

---
 vipra-ui/app/html/articles/show.html          | 15 ++++++----
 vipra-ui/app/html/words/show.html             | 30 +++++++++++++++++++
 vipra-ui/app/js/directives.js                 | 10 +++++++
 vipra-ui/app/less/app.less                    |  7 +++++
 .../java/de/vipra/util/model/BugReport.java   |  9 ++++--
 .../de/vipra/util/model/SequenceFull.java     | 13 ++++++++
 .../de/vipra/util/model/TextEntityFull.java   | 13 ++++++++
 .../de/vipra/util/model/TopicModelFull.java   | 14 ++++++++-
 .../java/de/vipra/util/model/WordFull.java    | 29 ++++++++++++++++++
 9 files changed, 131 insertions(+), 9 deletions(-)

diff --git a/vipra-ui/app/html/articles/show.html b/vipra-ui/app/html/articles/show.html
index 75332857..3cb8fd1f 100644
--- a/vipra-ui/app/html/articles/show.html
+++ b/vipra-ui/app/html/articles/show.html
@@ -25,7 +25,7 @@
         <div class="row">
           <div class="col-md-8">
             <h3>Info</h3>
-            <table class="table table-bordered table-condensed table-fixed">
+            <table class="table table-bordered table-condensed table-fixed nomargin">
               <tbody>
                 <tr>
                   <th class="infocol">ID</th>
@@ -46,12 +46,15 @@
                 </tr>
                 <tr>
                   <th>Word count</th>
-                  <td ng-bind-template="{{::article.stats.wordCount}} ({{::article.stats.processedWordCount}} &darr; {{::Vipra.toPercent(article.stats.reductionRatio)}}%)" ng-attr-title="{{::article.stats.wordCount}} words in this article, {{::article.stats.processedWordCount}} after cleaning ({{::Vipra.toPercent(article.stats.reductionRatio)}}% reduction)"></td>
+                  <td>
+                    <span ng-bind-template="{{::article.stats.wordCount}} ({{::article.stats.processedWordCount}} &darr; {{::Vipra.toPercent(article.stats.reductionRatio)}}%)" ng-attr-title="{{::article.stats.wordCount}} words in this article, {{::article.stats.processedWordCount}} after cleaning ({{::Vipra.toPercent(article.stats.reductionRatio)}}% reduction)"></span>
+                    <info text="Total word count, processed word count (words after reduction) and reduction ratio (processed text share to original text)"/>
+                  </td>
                 </tr>
               </tbody>
             </table>
             <h3>Topics</h3>
-            <table class="table table-bordered table-condensed table-fixed" ng-show="article.topics.length" ng-cloak>
+            <table class="table table-bordered table-condensed table-fixed nomargin" ng-show="article.topics.length" ng-cloak>
               <thead>
                 <tr>
                   <th class="infocol" ng-model="articlesShowModels.topicsSort" sort-by="share">Share</th>
@@ -75,10 +78,10 @@
           </div>
           <div class="col-md-4">
             <h3>Share</h3>
-            <div class="pie-chart" id="topic-share" highcharts="topicShare" ng-class="{'pie-small':!article.topics.length}"></div>
+            <div class="pie-chart" id="topic-share" highcharts="topicShare" ng-class="{'pie-small':!article.topics.length}" style="width:360px;height:220px"></div>
           </div>
         </div>
-        <h3>Similar articles</h3>
+        <h3>Similar articles <info text="Similar articles are determined based on topic share. Higher topic share results in higher share ratio."/></h3>
         <table class="table table-bordered table-condensed" ng-show="article.similarArticles.length" ng-cloak>
           <thead>
             <tr>
@@ -147,7 +150,7 @@
                     <th ng-model="articlesShowModels.wordsSort" sort-by="id">Word</th>
                     <th ng-model="articlesShowModels.wordsSort" sort-by="count">Count</th>
                     <th>Share</th>
-                    <th>Reduced share</th>
+                    <th>Reduced share <info text="Word share applied on the processed text"/></th>
                   </tr>
                 </thead>
                 <tbody>
diff --git a/vipra-ui/app/html/words/show.html b/vipra-ui/app/html/words/show.html
index 3742e349..32c26744 100644
--- a/vipra-ui/app/html/words/show.html
+++ b/vipra-ui/app/html/words/show.html
@@ -3,5 +3,35 @@
     <span class="label label-default">Word</span>
     <h1 ng-bind="::word.id"></h1>
   </div>
+  <div>
+    <ul class="nav nav-tabs" role="tablist">
+      <li class="active">
+        <a data-target=".tab-info" data-toggle="tab" bs-tab><i class="fa fa-file-text-o"></i></a>
+      </li>
+      <li>
+        <a ui-sref="words.show.topics({id:word.id})">
+          Topics
+        </a>
+      </li>
+      <li>
+        <a ui-sref="words.show.articles({id:word.id})">
+          Articles
+        </a>
+      </li>
+    </ul>
+    <div class="tab-content">
+      <div role="tabpanel" class="tab-pane active tab-info">
+        <h3>Info</h3>
+        <table class="table table-bordered table-condensed table-fixed">
+          <tbody>
+            <tr>
+              <th class="infocol">ID</th>
+              <td ng-bind="::word.id"></td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </div>
 </div>
 <div ng-cloak ui-view></div>
\ No newline at end of file
diff --git a/vipra-ui/app/js/directives.js b/vipra-ui/app/js/directives.js
index f0509848..10007e5e 100644
--- a/vipra-ui/app/js/directives.js
+++ b/vipra-ui/app/js/directives.js
@@ -454,4 +454,14 @@
     };
   }]);
 
+  app.directive('info', [function() {
+    return {
+      scope: {
+        text: '@'
+      },
+      replace: true,
+      template: '<i class="fa fa-info info" ng-attr-title="{{::text}}"></i>'
+    };
+  }]);
+
 })();
\ No newline at end of file
diff --git a/vipra-ui/app/less/app.less b/vipra-ui/app/less/app.less
index bb1ff9da..6cedd5f1 100644
--- a/vipra-ui/app/less/app.less
+++ b/vipra-ui/app/less/app.less
@@ -11,6 +11,7 @@ body {
   padding-bottom: 20px;
 }
 
+.info,
 .pointer,
 input[type=checkbox],
 .checkbox label::before,
@@ -564,6 +565,12 @@ entity-menu {
   color: #555;
 }
 
+.info {
+  color: #777;
+  padding: 0 5px;
+  font-size: 14px;
+}
+
 @-moz-keyframes spin {
   100% {
     -moz-transform: rotateY(360deg);
diff --git a/vipra-util/src/main/java/de/vipra/util/model/BugReport.java b/vipra-util/src/main/java/de/vipra/util/model/BugReport.java
index d8d138e1..bd3ba267 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/BugReport.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/BugReport.java
@@ -32,6 +32,9 @@ public class BugReport implements Model<ObjectId>, Serializable {
 	@QueryIgnore(multi = true)
 	private Date created;
 
+	@QueryIgnore(multi = true)
+	private Date modified;
+
 	@QueryIgnore(multi = true)
 	private String screenshot;
 
@@ -94,8 +97,10 @@ public class BugReport implements Model<ObjectId>, Serializable {
 	}
 
 	@PrePersist
-	private void prePersist() {
-		created = new Date();
+	public void prePersist() {
+		modified = new Date();
+		if (created == null)
+			created = modified;
 	}
 
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/SequenceFull.java b/vipra-util/src/main/java/de/vipra/util/model/SequenceFull.java
index 44222799..dbdfd71a 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/SequenceFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/SequenceFull.java
@@ -1,12 +1,14 @@
 package de.vipra.util.model;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 import org.bson.types.ObjectId;
 import org.mongodb.morphia.annotations.Embedded;
 import org.mongodb.morphia.annotations.Entity;
 import org.mongodb.morphia.annotations.Id;
+import org.mongodb.morphia.annotations.PrePersist;
 import org.mongodb.morphia.annotations.Reference;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@@ -40,6 +42,10 @@ public class SequenceFull implements Model<ObjectId>, Comparable<SequenceFull>,
 	@QueryIgnore(multi = true)
 	private List<SequenceWord> words;
 
+	private Date created;
+
+	private Date modified;
+
 	@Override
 	public ObjectId getId() {
 		return id;
@@ -109,4 +115,11 @@ public class SequenceFull implements Model<ObjectId>, Comparable<SequenceFull>,
 				+ topic + ", words=" + words + "]";
 	}
 
+	@PrePersist
+	public void prePersist() {
+		modified = new Date();
+		if (created == null)
+			created = modified;
+	}
+
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TextEntityFull.java b/vipra-util/src/main/java/de/vipra/util/model/TextEntityFull.java
index 257b3651..2058565e 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TextEntityFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TextEntityFull.java
@@ -1,10 +1,12 @@
 package de.vipra.util.model;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 import org.mongodb.morphia.annotations.Entity;
 import org.mongodb.morphia.annotations.Id;
+import org.mongodb.morphia.annotations.PrePersist;
 import org.mongodb.morphia.annotations.Reference;
 
 import de.vipra.util.an.QueryIgnore;
@@ -25,6 +27,10 @@ public class TextEntityFull implements Model<String>, Serializable {
 	@QueryIgnore(multi = true)
 	private List<String> types;
 
+	private Date created;
+
+	private Date modified;
+
 	public TextEntityFull() {}
 
 	public TextEntityFull(final TextEntity textEntity) {
@@ -96,4 +102,11 @@ public class TextEntityFull implements Model<String>, Serializable {
 		return true;
 	}
 
+	@PrePersist
+	public void prePersist() {
+		modified = new Date();
+		if (created == null)
+			created = modified;
+	}
+
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java b/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java
index f527d0ac..7bd55e67 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicModelFull.java
@@ -7,6 +7,7 @@ import java.util.List;
 import org.mongodb.morphia.annotations.Embedded;
 import org.mongodb.morphia.annotations.Entity;
 import org.mongodb.morphia.annotations.Id;
+import org.mongodb.morphia.annotations.PrePersist;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
@@ -39,6 +40,10 @@ public class TopicModelFull implements Model<String>, Comparable<TopicModelFull>
 	@QueryIgnore(multi = true)
 	private TopicModelConfig modelConfig;
 
+	private Date created;
+
+	private Date modified;
+
 	public TopicModelFull() {}
 
 	public TopicModelFull(final String id) {
@@ -128,6 +133,13 @@ public class TopicModelFull implements Model<String>, Comparable<TopicModelFull>
 	@Override
 	public int compareTo(final TopicModelFull o) {
 		return id.compareTo(o.getId());
-	};
+	}
+
+	@PrePersist
+	public void prePersist() {
+		modified = new Date();
+		if (created == null)
+			created = modified;
+	}
 
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/WordFull.java b/vipra-util/src/main/java/de/vipra/util/model/WordFull.java
index 504deeef..071156f0 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/WordFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/WordFull.java
@@ -1,9 +1,11 @@
 package de.vipra.util.model;
 
 import java.io.Serializable;
+import java.util.Date;
 
 import org.mongodb.morphia.annotations.Entity;
 import org.mongodb.morphia.annotations.Id;
+import org.mongodb.morphia.annotations.PrePersist;
 import org.mongodb.morphia.annotations.Reference;
 
 import de.vipra.util.an.QueryIgnore;
@@ -19,6 +21,10 @@ public class WordFull implements Model<String>, Comparable<WordFull>, Serializab
 	@QueryIgnore(multi = true)
 	private TopicModel topicModel;
 
+	private Date created;
+
+	private Date modified;
+
 	public WordFull() {}
 
 	public WordFull(final String word) {
@@ -43,9 +49,32 @@ public class WordFull implements Model<String>, Comparable<WordFull>, Serializab
 		this.topicModel = topicModel;
 	}
 
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+
+	public Date getModified() {
+		return modified;
+	}
+
+	public void setModified(Date modified) {
+		this.modified = modified;
+	}
+
 	@Override
 	public int compareTo(final WordFull o) {
 		return id.compareTo(o.getId());
 	}
 
+	@PrePersist
+	public void prePersist() {
+		modified = new Date();
+		if (created == null)
+			created = modified;
+	}
+
 }
-- 
GitLab