1
0
mirror of https://github.com/sismics/docs.git synced 2026-01-04 04:19:35 +00:00

Closes #193: last updated date (db + search + ui)

This commit is contained in:
Benjamin Gamard
2018-03-12 14:15:00 +01:00
parent 9d8034e010
commit 5426be9fa0
16 changed files with 202 additions and 31 deletions

View File

@@ -76,6 +76,7 @@ public class DocumentResource extends BaseResource {
* @apiSuccess {String} title Title
* @apiSuccess {String} description Description
* @apiSuccess {Number} create_date Create date (timestamp)
* @apiSuccess {Number} update_date Update date (timestamp)
* @apiSuccess {String} language Language
* @apiSuccess {Boolean} shared True if the document is shared
* @apiSuccess {Number} file_count Number of files in this document
@@ -142,6 +143,7 @@ public class DocumentResource extends BaseResource {
.add("title", documentDto.getTitle())
.add("description", JsonUtil.nullable(documentDto.getDescription()))
.add("create_date", documentDto.getCreateTimestamp())
.add("update_date", documentDto.getUpdateTimestamp())
.add("language", documentDto.getLanguage())
.add("shared", documentDto.getShared())
.add("file_count", documentDto.getFileCount());
@@ -328,6 +330,7 @@ public class DocumentResource extends BaseResource {
* @apiSuccess {String} documents.title Title
* @apiSuccess {String} documents.description Description
* @apiSuccess {Number} documents.create_date Create date (timestamp)
* @apiSuccess {Number} documents.update_date Update date (timestamp)
* @apiSuccess {String} documents.language Language
* @apiSuccess {Boolean} documents.shared True if the document is shared
* @apiSuccess {Boolean} documents.active_route True if a route is active on this document
@@ -394,6 +397,7 @@ public class DocumentResource extends BaseResource {
.add("title", documentDto.getTitle())
.add("description", JsonUtil.nullable(documentDto.getDescription()))
.add("create_date", documentDto.getCreateTimestamp())
.add("update_date", documentDto.getUpdateTimestamp())
.add("language", documentDto.getLanguage())
.add("shared", documentDto.getShared())
.add("active_route", documentDto.isActiveRoute())
@@ -464,32 +468,57 @@ public class DocumentResource extends BaseResource {
break;
case "after":
case "before":
case "uafter":
case "ubefore":
// New date span criteria
try {
boolean isUpdated = params[0].startsWith("u");
DateTime date = formatter.parseDateTime(params[1]);
if (params[0].equals("before")) documentCriteria.setCreateDateMax(date.toDate());
else documentCriteria.setCreateDateMin(date.toDate());
if (params[0].endsWith("before")) {
if (isUpdated) documentCriteria.setUpdateDateMax(date.toDate());
else documentCriteria.setCreateDateMax(date.toDate());
} else {
if (isUpdated) documentCriteria.setUpdateDateMin(date.toDate());
else documentCriteria.setCreateDateMin(date.toDate());
}
} catch (IllegalArgumentException e) {
// Invalid date, returns no documents
if (params[0].equals("before")) documentCriteria.setCreateDateMax(new Date(0));
else documentCriteria.setCreateDateMin(new Date(Long.MAX_VALUE / 2));
documentCriteria.setCreateDateMin(new Date(0));
documentCriteria.setCreateDateMax(new Date(0));
}
break;
case "uat":
case "at":
// New specific date criteria
try {
boolean isUpdated = params[0].startsWith("u");
if (params[1].length() == 10) {
DateTime date = dayFormatter.parseDateTime(params[1]);
documentCriteria.setCreateDateMin(date.toDate());
documentCriteria.setCreateDateMax(date.plusDays(1).minusSeconds(1).toDate());
if (isUpdated) {
documentCriteria.setUpdateDateMin(date.toDate());
documentCriteria.setUpdateDateMax(date.plusDays(1).minusSeconds(1).toDate());
} else {
documentCriteria.setCreateDateMin(date.toDate());
documentCriteria.setCreateDateMax(date.plusDays(1).minusSeconds(1).toDate());
}
} else if (params[1].length() == 7) {
DateTime date = monthFormatter.parseDateTime(params[1]);
documentCriteria.setCreateDateMin(date.toDate());
documentCriteria.setCreateDateMax(date.plusMonths(1).minusSeconds(1).toDate());
if (isUpdated) {
documentCriteria.setUpdateDateMin(date.toDate());
documentCriteria.setUpdateDateMax(date.plusMonths(1).minusSeconds(1).toDate());
} else {
documentCriteria.setCreateDateMin(date.toDate());
documentCriteria.setCreateDateMax(date.plusMonths(1).minusSeconds(1).toDate());
}
} else if (params[1].length() == 4) {
DateTime date = yearFormatter.parseDateTime(params[1]);
documentCriteria.setCreateDateMin(date.toDate());
documentCriteria.setCreateDateMax(date.plusYears(1).minusSeconds(1).toDate());
if (isUpdated) {
documentCriteria.setUpdateDateMin(date.toDate());
documentCriteria.setUpdateDateMax(date.plusYears(1).minusSeconds(1).toDate());
} else {
documentCriteria.setCreateDateMin(date.toDate());
documentCriteria.setCreateDateMax(date.plusYears(1).minusSeconds(1).toDate());
}
}
} catch (IllegalArgumentException e) {
// Invalid date, returns no documents

View File

@@ -181,6 +181,12 @@ angular.module('docs').controller('Document', function ($scope, $rootScope, $tim
if (!_.isUndefined($scope.advsearch.before_date)) {
search += 'before:' + $filter('date')($scope.advsearch.before_date, 'yyyy-MM-dd') + ' ';
}
if (!_.isUndefined($scope.advsearch.after_update_date)) {
search += 'uafter:' + $filter('date')($scope.advsearch.after_update_date, 'yyyy-MM-dd') + ' ';
}
if (!_.isUndefined($scope.advsearch.before_update_date)) {
search += 'ubefore:' + $filter('date')($scope.advsearch.before_update_date, 'yyyy-MM-dd') + ' ';
}
if (!_.isEmpty($scope.advsearch.tags)) {
search += _.reduce($scope.advsearch.tags, function(s, t) {
return s + 'tag:' + t.name + ' ';

View File

@@ -45,8 +45,10 @@
"search_fulltext": "Fulltext search",
"search_creator": "Creator",
"search_language": "Language",
"search_before_date": "Before this date",
"search_after_date": "After this date",
"search_before_date": "Created before this date",
"search_after_date": "Created after this date",
"search_before_update_date": "Updated before this date",
"search_after_update_date": "Update after this date",
"search_tags": "Tags",
"search_shared": "Only shared documents",
"search_workflow": "Workflow assigned to me",
@@ -82,6 +84,7 @@
"upgrade_quota": "To upgrade your quota, ask your administrator",
"quota": "{{ current | number: 0 }}MB ({{ percent | number: 1 }}%) used on {{ total | number: 0 }}MB",
"count": "{{ count }} document{{ count > 1 ? 's' : '' }} found",
"last_updated": "Last updated {{ date | timeAgo: dateFormat }}",
"view": {
"delete_comment_title": "Delete comment",
"delete_comment_message": "Do you really want to delete this comment?",

View File

@@ -93,6 +93,36 @@
</div>
</div>
<div class="form-group">
<label class="control-label sr-only" for="inputSearchAfterUpdateDate">{{ 'document.search_after_update_date' | translate }}</label>
<div class="col-sm-12">
<input type="text" id="inputSearchAfterUpdateDate"
ng-attr-placeholder="{{ 'document.search_after_update_date' | translate }}"
current-text="{{ 'directive.datepicker.current' | translate }}"
clear-text="{{ 'directive.datepicker.clear' | translate }}"
close-text="{{ 'directive.datepicker.close' | translate }}"
datepicker-append-to-body="true"
ng-readonly="true" uib-datepicker-popup="{{ dateFormat }}" class="form-control"
ng-model="advsearch.after_update_date" datepicker-options="{ startingDay:1, showWeeks: false }"
ng-click="datepickerAfterUpdateOpened = !datepickerAfterUpdateOpened" is-open="datepickerAfterUpdateOpened" />
</div>
</div>
<div class="form-group">
<label class="control-label sr-only" for="inputSearchBeforeUpdateDate">{{ 'document.search_before_update_date' | translate }}</label>
<div class="col-sm-12">
<input type="text" id="inputSearchBeforeUpdateDate"
ng-attr-placeholder="{{ 'document.search_before_update_date' | translate }}"
current-text="{{ 'directive.datepicker.current' | translate }}"
clear-text="{{ 'directive.datepicker.clear' | translate }}"
close-text="{{ 'directive.datepicker.close' | translate }}"
datepicker-append-to-body="true"
ng-readonly="true" uib-datepicker-popup="{{ dateFormat }}" class="form-control"
ng-model="advsearch.before_update_date" datepicker-options="{ startingDay:1, showWeeks: false }"
ng-click="datepickerBeforeUpdateOpened = !datepickerBeforeUpdateOpened" is-open="datepickerBeforeUpdateOpened" />
</div>
</div>
<div class="form-group">
<label class="control-label sr-only" for="inputSearchTags">{{ 'document.search_tags' | translate }}</label>
<div class="col-sm-12">
@@ -194,7 +224,9 @@
<span class="fas fa-random" ng-if="document.active_route" uib-tooltip="{{ document.current_step_name }}"></span>
<a href="#/document/view/{{ document.id }}" target="_blank" ng-click="$event.stopPropagation()"><span class="fas fa-link"></span></a>
<div class="pull-right text-muted small">{{ document.create_date | timeAgo: dateFormat }}</div>
<div class="pull-right text-muted small" uib-tooltip="{{ 'document.last_updated' | translate: { date: document.update_date } }}">
{{ document.create_date | timeAgo: dateFormat }}
</div>
<div class="tags small">
<span class="label label-info" ng-repeat="tag in document.tags" ng-style="{ 'background': tag.color }">

View File

@@ -45,7 +45,7 @@
<div class="page-header">
<h1>
{{ document.title }}
<small>{{ document.create_date | date: dateFormat }}
<small uib-tooltip="{{ 'document.last_updated' | translate: { date: document.update_date } }}">{{ document.create_date | date: dateFormat }}
{{ 'document.view.by_creator' | translate }} <a href="#/user/{{ document.creator }}">{{ document.creator }}</a></small>
</h1>