diff --git a/guacamole/src/main/webapp/app/client/directives/guacFileBrowser.js b/guacamole/src/main/webapp/app/client/directives/guacFileBrowser.js new file mode 100644 index 000000000..98147f1dd --- /dev/null +++ b/guacamole/src/main/webapp/app/client/directives/guacFileBrowser.js @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2015 Glyptodon LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * A directive which displays the contents of a filesystem received through the + * Guacamole client. + */ +angular.module('client').directive('guacFileBrowser', [function guacFileBrowser() { + + return { + restrict: 'E', + replace: true, + scope: { + + /** + * The client whose file transfers should be managed by this + * directive. + * + * @type ManagedClient + */ + client : '=', + + /** + * @type ManagedFilesystem + */ + filesystem : '=' + + }, + + templateUrl: 'app/client/templates/guacFileBrowser.html', + controller: ['$scope', '$injector', function guacFileBrowserController($scope, $injector) { + + // Required types + var ManagedFilesystem = $injector.get('ManagedFilesystem'); + + /** + * Returns whether the given file is a normal file. + * + * @param {ManagedFilesystem.File} file + * The file to test. + * + * @returns {Boolean} + * true if the given file is a normal file, false otherwise. + */ + $scope.isNormalFile = function isNormalFile(file) { + return file.type === ManagedFilesystem.File.Type.NORMAL; + }; + + /** + * Returns whether the given file is a directory. + * + * @param {ManagedFilesystem.File} file + * The file to test. + * + * @returns {Boolean} + * true if the given file is a directory, false otherwise. + */ + $scope.isDirectory = function isDirectory(file) { + return file.type === ManagedFilesystem.File.Type.DIRECTORY; + }; + + /** + * Toggles the expanded state of the given file between expanded + * and collapsed, showing or hiding the file's children. This is + * only applicable to directories. + * + * @param {ManagedFilesystem.File} file + * The file to expand or collapse. + */ + $scope.toggleExpanded = function toggleExpanded(file) { + + // Toggle expanded state + file.expanded = !file.expanded; + + // If now expanded, refresh contents + if (file.expanded) + ManagedFilesystem.refresh($scope.filesystem, file); + + }; + + }] + + }; +}]); diff --git a/guacamole/src/main/webapp/app/client/styles/file-browser.css b/guacamole/src/main/webapp/app/client/styles/file-browser.css new file mode 100644 index 000000000..2c6c923fb --- /dev/null +++ b/guacamole/src/main/webapp/app/client/styles/file-browser.css @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2015 Glyptodon LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Hide directory contents by default */ + +.file-browser .directory > .children { + padding-left: 1em; + display: none; +} + +/* Show directory contents if expanded */ + +.file-browser .directory.expanded > .children { + display: block; +} + +/* Directory / file icons */ + +.file-browser .normal-file > .caption .icon { + background-image: url('images/file.png'); +} + +.file-browser .directory > .caption .icon { + background-image: url('images/folder-closed.png'); +} + +.file-browser .directory.expanded > .caption .icon { + background-image: url('images/folder-open.png'); +} diff --git a/guacamole/src/main/webapp/app/client/templates/guacFileBrowser.html b/guacamole/src/main/webapp/app/client/templates/guacFileBrowser.html new file mode 100644 index 000000000..dc5bdf18c --- /dev/null +++ b/guacamole/src/main/webapp/app/client/templates/guacFileBrowser.html @@ -0,0 +1,58 @@ +
+ + + + + +
+
+
+ +
diff --git a/guacamole/src/main/webapp/app/client/types/ManagedFilesystem.js b/guacamole/src/main/webapp/app/client/types/ManagedFilesystem.js index 2c58d5d74..08be2c4d1 100644 --- a/guacamole/src/main/webapp/app/client/types/ManagedFilesystem.js +++ b/guacamole/src/main/webapp/app/client/types/ManagedFilesystem.js @@ -231,6 +231,14 @@ angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector' */ this.files = template.files || {}; + /** + * Whether this file is currently expanded, exposing any children + * within. This is only applicable to directories. + * + * @type Boolean + */ + this.expanded = template.expanded || false; + }; /** diff --git a/guacamole/src/main/webapp/images/file.png b/guacamole/src/main/webapp/images/file.png new file mode 100644 index 000000000..d45e227d3 Binary files /dev/null and b/guacamole/src/main/webapp/images/file.png differ diff --git a/guacamole/src/main/webapp/images/folder-closed.png b/guacamole/src/main/webapp/images/folder-closed.png new file mode 100644 index 000000000..46a918ad5 Binary files /dev/null and b/guacamole/src/main/webapp/images/folder-closed.png differ diff --git a/guacamole/src/main/webapp/images/folder-open.png b/guacamole/src/main/webapp/images/folder-open.png new file mode 100644 index 000000000..f04b0be73 Binary files /dev/null and b/guacamole/src/main/webapp/images/folder-open.png differ