#201: file processing indicator

This commit is contained in:
Benjamin Gamard 2018-03-13 23:32:05 +01:00
parent b330d54ca2
commit f44b4bb0e0
7 changed files with 60 additions and 4 deletions

View File

@ -1,11 +1,10 @@
package com.sismics.docs.core.event;
import java.io.InputStream;
import java.nio.file.Path;
import com.google.common.base.MoreObjects;
import com.sismics.docs.core.model.jpa.File;
import java.nio.file.Path;
/**
* New file created event.
*

View File

@ -59,5 +59,7 @@ public class FileCreatedAsyncListener {
// Update Lucene index
LuceneDao luceneDao = new LuceneDao();
luceneDao.createFile(fileCreatedAsyncEvent.getFile());
FileUtil.endProcessingFile(file.getId());
}
}

View File

@ -29,6 +29,9 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* File entity utilities.
@ -40,6 +43,11 @@ public class FileUtil {
* Logger.
*/
private static final Logger log = LoggerFactory.getLogger(FileUtil.class);
/**
* File ID of files currently being processed.
*/
private static Set<String> processingFileSet = Collections.synchronizedSet(new HashSet<String>());
/**
* Extract content from a file.
@ -269,6 +277,7 @@ public class FileUtil {
// Raise a new file created event and document updated event if we have a document
if (documentId != null) {
startProcessingFile(fileId);
FileCreatedAsyncEvent fileCreatedAsyncEvent = new FileCreatedAsyncEvent();
fileCreatedAsyncEvent.setUserId(userId);
fileCreatedAsyncEvent.setLanguage(language);
@ -285,4 +294,32 @@ public class FileUtil {
return fileId;
}
/**
* Start processing a file.
*
* @param fileId File ID
*/
public static void startProcessingFile(String fileId) {
processingFileSet.add(fileId);
}
/**
* End processing a file.
*
* @param fileId File ID
*/
public static void endProcessingFile(String fileId) {
processingFileSet.remove(fileId);
}
/**
* Return true if a file is currently processing.
*
* @param fileId File ID
* @return True if the file is processing
*/
public static boolean isProcessingFile(String fileId) {
return processingFileSet.contains(fileId);
}
}

View File

@ -196,6 +196,7 @@ public class FileResource extends BaseResource {
try {
java.nio.file.Path storedFile = DirectoryUtil.getStorageDirectory().resolve(id);
java.nio.file.Path unencryptedFile = EncryptionUtil.decryptFile(storedFile, user.getPrivateKey());
FileUtil.startProcessingFile(id);
FileCreatedAsyncEvent fileCreatedAsyncEvent = new FileCreatedAsyncEvent();
fileCreatedAsyncEvent.setUserId(principal.getId());
fileCreatedAsyncEvent.setLanguage(documentDto.getLanguage());
@ -283,6 +284,7 @@ public class FileResource extends BaseResource {
* @apiSuccess {String} files.id ID
* @apiSuccess {String} files.mimetype MIME type
* @apiSuccess {String} files.name File name
* @apiSuccess {String} files.processing True if the file is currently processing
* @apiSuccess {String} files.document_id Document ID
* @apiSuccess {String} files.create_date Create date (timestamp)
* @apiSuccess {String} files.size File size (in bytes)
@ -321,6 +323,7 @@ public class FileResource extends BaseResource {
try {
files.add(Json.createObjectBuilder()
.add("id", fileDb.getId())
.add("processing", FileUtil.isProcessingFile(fileDb.getId()))
.add("name", JsonUtil.nullable(fileDb.getName()))
.add("mimetype", fileDb.getMimeType())
.add("document_id", JsonUtil.nullable(fileDb.getDocumentId()))

View File

@ -114,7 +114,8 @@
"upload_error": "Upload error",
"upload_error_quota": "Quota reached",
"drop_zone": "Drag & drop files here to upload",
"add_files": "Add files"
"add_files": "Add files",
"file_processing_indicator": "This file is being processed. Searching will not be available before it is complete."
},
"workflow": {
"workflow": "Workflow",

View File

@ -45,6 +45,11 @@
<div ui-sortable="fileSortableOptions" ng-model="files">
<div class="col-xs-6 col-sm-4 col-md-4 col-lg-3 text-center" ng-repeat="file in files">
<div class="thumbnail handle" ng-if="file.id">
<div class="file-processing-indicator" ng-show="file.processing"
uib-tooltip="{{ 'document.view.content.file_processing_indicator' | translate }}">
<span class="fas fa-spin fa-circle-notch"></span>
</div>
<a ng-click="openFile(file)">
<img ng-src="../api/file/{{ file.id }}/data?size=thumb" uib-tooltip="{{ file.mimetype }} | {{ file.size | filesize }}" tooltip-placement="top" />
</a>

View File

@ -214,6 +214,15 @@
}
}
// File processing indicator
.file-processing-indicator {
position: absolute;
z-index: 2;
margin-left: 8px;
margin-top: 8px;
color: #2ab2dc;
}
// File name
.file-name {
word-wrap: break-word;