diff --git a/docs-parent/TODO b/docs-parent/TODO
index 26d801f6..cf943063 100644
--- a/docs-parent/TODO
+++ b/docs-parent/TODO
@@ -1,2 +1 @@
-- Share a document with a link (client)
- Advanced search: shared documents (client/server)
\ No newline at end of file
diff --git a/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java b/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java
index 704bd26f..06f82334 100644
--- a/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java
+++ b/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java
@@ -182,11 +182,15 @@ public class FileResource extends BaseResource {
authenticate();
// Check document visibility
- DocumentDao documentDao = new DocumentDao();
- Document document = documentDao.getDocument(documentId);
- ShareDao shareDao = new ShareDao();
- if (!shareDao.checkVisibility(document, principal.getId(), shareId)) {
- throw new ForbiddenClientException();
+ try {
+ DocumentDao documentDao = new DocumentDao();
+ Document document = documentDao.getDocument(documentId);
+ ShareDao shareDao = new ShareDao();
+ if (!shareDao.checkVisibility(document, principal.getId(), shareId)) {
+ throw new ForbiddenClientException();
+ }
+ } catch (NoResultException e) {
+ throw new ClientException("DocumentNotFound", MessageFormat.format("Document not found: {0}", documentId));
}
FileDao fileDao = new FileDao();
diff --git a/docs-web/src/main/webapp/app/docs/controller/FileView.js b/docs-web/src/main/webapp/app/docs/controller/FileView.js
index 0f6ff16e..faef5eac 100644
--- a/docs-web/src/main/webapp/app/docs/controller/FileView.js
+++ b/docs-web/src/main/webapp/app/docs/controller/FileView.js
@@ -8,15 +8,13 @@ App.controller('FileView', function($dialog, $state, $stateParams) {
keyboard: true,
templateUrl: 'partial/docs/file.view.html',
controller: function($scope, $state, $stateParams, Restangular, dialog) {
- $scope.id = $stateParams.fileId;
-
// Load files
Restangular.one('file').getList('list', { id: $stateParams.id }).then(function(data) {
$scope.files = data.files;
// Search current file
- _.each($scope.files, function(value, key, list) {
- if (value.id == $scope.id) {
+ _.each($scope.files, function(value) {
+ if (value.id == $stateParams.fileId) {
$scope.file = value;
}
});
@@ -26,8 +24,8 @@ App.controller('FileView', function($dialog, $state, $stateParams) {
* Navigate to the next file.
*/
$scope.nextFile = function() {
- _.each($scope.files, function(value, key, list) {
- if (value.id == $scope.id) {
+ _.each($scope.files, function(value, key) {
+ if (value.id == $stateParams.fileId) {
var next = $scope.files[key + 1];
if (next) {
dialog.close({});
@@ -41,8 +39,8 @@ App.controller('FileView', function($dialog, $state, $stateParams) {
* Navigate to the previous file.
*/
$scope.previousFile = function() {
- _.each($scope.files, function(value, key, list) {
- if (value.id == $scope.id) {
+ _.each($scope.files, function(value, key) {
+ if (value.id == $stateParams.fileId) {
var previous = $scope.files[key - 1];
if (previous) {
dialog.close({});
@@ -56,7 +54,7 @@ App.controller('FileView', function($dialog, $state, $stateParams) {
* Open the file in a new window.
*/
$scope.openFile = function() {
- window.open('api/file/' + $scope.id + '/data');
+ window.open('api/file/' + $stateParams.fileId + '/data');
};
/**
@@ -65,6 +63,14 @@ App.controller('FileView', function($dialog, $state, $stateParams) {
$scope.closeFile = function () {
dialog.close();
};
+
+ // Close the dialog when the user exits this state
+ var off = $scope.$on('$stateChangeStart', function(event, toState){
+ if (dialog.isOpen()) {
+ dialog.close(toState.name == 'document.view.file' ? {} : null);
+ }
+ off();
+ });
}
});
diff --git a/docs-web/src/main/webapp/app/share/app.js b/docs-web/src/main/webapp/app/share/app.js
index 2347b571..177585a5 100644
--- a/docs-web/src/main/webapp/app/share/app.js
+++ b/docs-web/src/main/webapp/app/share/app.js
@@ -31,6 +31,22 @@ var App = angular.module('share',
controller: 'Share'
}
}
+ })
+ .state('share.file', {
+ url: '/file/:fileId',
+ views: {
+ 'file': {
+ controller: 'FileView'
+ }
+ }
+ })
+ .state('403', {
+ url: '/403',
+ views: {
+ 'page': {
+ templateUrl: 'partial/share/403.html'
+ }
+ }
});
// Configuring Restangular
diff --git a/docs-web/src/main/webapp/app/share/controller/Main.js b/docs-web/src/main/webapp/app/share/controller/Main.js
new file mode 100644
index 00000000..69dbe8a4
--- /dev/null
+++ b/docs-web/src/main/webapp/app/share/controller/Main.js
@@ -0,0 +1,7 @@
+'use strict';
+
+/**
+ * Main controller.
+ */
+App.controller('Main', function() {
+});
\ No newline at end of file
diff --git a/docs-web/src/main/webapp/app/share/controller/Share.js b/docs-web/src/main/webapp/app/share/controller/Share.js
index cda962b6..254e439f 100644
--- a/docs-web/src/main/webapp/app/share/controller/Share.js
+++ b/docs-web/src/main/webapp/app/share/controller/Share.js
@@ -10,7 +10,7 @@ App.controller('Share', function($scope, $state, $stateParams, Restangular) {
$scope.document = data;
}, function (response) {
if (response.data.status == 403) {
- // TODO Sharing no more valid
+ $state.transitionTo('403');
}
});
@@ -19,4 +19,11 @@ App.controller('Share', function($scope, $state, $stateParams, Restangular) {
.then(function (data) {
$scope.files = data.files;
});
+
+ /**
+ * Navigate to the selected file.
+ */
+ $scope.openFile = function (file) {
+ $state.transitionTo('share.file', { documentId: $stateParams.documentId, shareId: $stateParams.shareId, fileId: file.id })
+ };
});
\ No newline at end of file
diff --git a/docs-web/src/main/webapp/partial/docs/file.view.html b/docs-web/src/main/webapp/partial/docs/file.view.html
index 639b8c88..b99973a2 100644
--- a/docs-web/src/main/webapp/partial/docs/file.view.html
+++ b/docs-web/src/main/webapp/partial/docs/file.view.html
@@ -14,8 +14,8 @@
-
+
-
The document you are trying to view is not shared anymore
+Ask a shared document link to access it
+