mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
GUAC-1172: Implement navigation via breadcrumbs - no more tree.
This commit is contained in:
@@ -28,6 +28,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
|
|
||||||
// Required types
|
// Required types
|
||||||
var ManagedClientState = $injector.get('ManagedClientState');
|
var ManagedClientState = $injector.get('ManagedClientState');
|
||||||
|
var ManagedFilesystem = $injector.get('ManagedFilesystem');
|
||||||
var ScrollState = $injector.get('ScrollState');
|
var ScrollState = $injector.get('ScrollState');
|
||||||
|
|
||||||
// Required services
|
// Required services
|
||||||
@@ -595,6 +596,45 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
return !!$scope.filesystemMenuContents && $scope.menu.shown;
|
return !!$scope.filesystemMenuContents && $scope.menu.shown;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the full path to the given file as an ordered array of parent
|
||||||
|
* directories.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem.File} file
|
||||||
|
* The file whose full path should be retrieved.
|
||||||
|
*
|
||||||
|
* @returns {ManagedFilesystem.File[]}
|
||||||
|
* An array of directories which make up the hierarchy containing the
|
||||||
|
* given file, in order of increasing depth.
|
||||||
|
*/
|
||||||
|
$scope.getPath = function getPath(file) {
|
||||||
|
|
||||||
|
var path = [];
|
||||||
|
|
||||||
|
// Add all files to path in ascending order of depth
|
||||||
|
while (file && file.parent) {
|
||||||
|
path.unshift(file);
|
||||||
|
file = file.parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the current directory of the given filesystem to the given
|
||||||
|
* directory.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem} filesystem
|
||||||
|
* The filesystem whose current directory should be changed.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem.File} file
|
||||||
|
* The directory to change to.
|
||||||
|
*/
|
||||||
|
$scope.changeDirectory = function changeDirectory(filesystem, file) {
|
||||||
|
ManagedFilesystem.changeDirectory(filesystem, file);
|
||||||
|
};
|
||||||
|
|
||||||
// Clean up when view destroyed
|
// Clean up when view destroyed
|
||||||
$scope.$on('$destroy', function clientViewDestroyed() {
|
$scope.$on('$destroy', function clientViewDestroyed() {
|
||||||
|
|
||||||
|
@@ -79,22 +79,14 @@ angular.module('client').directive('guacFileBrowser', [function guacFileBrowser(
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggles the expanded state of the given file between expanded
|
* Changes the currently-displayed directory to the given
|
||||||
* and collapsed, showing or hiding the file's children. This is
|
* directory.
|
||||||
* only applicable to directories.
|
|
||||||
*
|
*
|
||||||
* @param {ManagedFilesystem.File} file
|
* @param {ManagedFilesystem.File} file
|
||||||
* The file to expand or collapse.
|
* The directory to change to.
|
||||||
*/
|
*/
|
||||||
$scope.toggleExpanded = function toggleExpanded(file) {
|
$scope.changeDirectory = function changeDirectory(file) {
|
||||||
|
ManagedFilesystem.changeDirectory($scope.filesystem, file);
|
||||||
// Toggle expanded state
|
|
||||||
file.expanded = !file.expanded;
|
|
||||||
|
|
||||||
// If now expanded, refresh contents
|
|
||||||
if (file.expanded)
|
|
||||||
ManagedFilesystem.refresh($scope.filesystem, file);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -27,10 +27,8 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show directory contents if expanded */
|
.file-browser .list-item .caption {
|
||||||
|
white-space: nowrap;
|
||||||
.file-browser .directory.expanded > .children {
|
|
||||||
display: block;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Directory / file icons */
|
/* Directory / file icons */
|
||||||
@@ -43,6 +41,6 @@
|
|||||||
background-image: url('images/folder-closed.png');
|
background-image: url('images/folder-closed.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
.file-browser .directory.expanded > .caption .icon {
|
.file-browser .directory.previous > .caption .icon {
|
||||||
background-image: url('images/folder-open.png');
|
background-image: url('images/folder-up.png');
|
||||||
}
|
}
|
||||||
|
@@ -46,3 +46,26 @@
|
|||||||
-webkit-align-items: center;
|
-webkit-align-items: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#filesystem-menu .menu-body {
|
||||||
|
padding: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#filesystem-menu .header.breadcrumbs {
|
||||||
|
background: rgba(0,0,0,0.0125);
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,0.05);
|
||||||
|
box-shadow: none;
|
||||||
|
margin-top: 0;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#filesystem-menu .header.breadcrumbs .breadcrumb {
|
||||||
|
padding: 0.5em;
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#filesystem-menu .header.breadcrumbs .breadcrumb:hover {
|
||||||
|
background-color: #CDA;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
@@ -174,6 +174,12 @@
|
|||||||
<button class="back" ng-click="hideFilesystemMenu()">Back</button>
|
<button class="back" ng-click="hideFilesystemMenu()">Back</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Breadcrumbs -->
|
||||||
|
<div class="header breadcrumbs" ng-show="getPath(filesystemMenuContents.currentDirectory).length">
|
||||||
|
<div class="breadcrumb" ng-repeat="file in getPath(filesystemMenuContents.currentDirectory)"
|
||||||
|
ng-click="changeDirectory(filesystemMenuContents, file)">{{file.name}}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Scrollable body -->
|
<!-- Scrollable body -->
|
||||||
<div class="menu-body">
|
<div class="menu-body">
|
||||||
<guac-file-browser client="client" filesystem="filesystemMenuContents"></guac-file-browser>
|
<guac-file-browser client="client" filesystem="filesystemMenuContents"></guac-file-browser>
|
||||||
|
@@ -32,27 +32,32 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Directory -->
|
<!-- Directory -->
|
||||||
<div class="directory" ng-show="isDirectory(file)" ng-class="{expanded: file.expanded}">
|
<div class="directory" ng-show="isDirectory(file)">
|
||||||
<div class="caption" ng-click="toggleExpanded(file)">
|
<div class="caption" ng-click="changeDirectory(file)">
|
||||||
<div class="icon"></div>
|
<div class="icon"></div>
|
||||||
{{file.name}}
|
{{file.name}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Children of this directory -->
|
|
||||||
<div class="children">
|
|
||||||
<div class="list-item"
|
|
||||||
ng-repeat="file in file.files | orderBy : 'name'"
|
|
||||||
ng-include="'file.html'">
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- Root directory contents -->
|
<!-- Current directory contents -->
|
||||||
<div class="filesystem-root">
|
<div class="filesystem-root">
|
||||||
|
|
||||||
|
<!-- Parent directory -->
|
||||||
|
<div class="list-item" ng-show="filesystem.currentDirectory.parent">
|
||||||
|
<div class="directory previous">
|
||||||
|
<div class="caption" ng-click="changeDirectory(filesystem.currentDirectory.parent)">
|
||||||
|
<div class="icon"></div> ..
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- All other files -->
|
||||||
<div class="list-item"
|
<div class="list-item"
|
||||||
ng-repeat="file in filesystem.root.files | orderBy : 'name'"
|
ng-repeat="file in filesystem.currentDirectory.files | orderBy : 'name'"
|
||||||
ng-include="'file.html'"></div>
|
ng-include="'file.html'"></div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@@ -68,6 +68,14 @@ angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector'
|
|||||||
*/
|
*/
|
||||||
this.root = template.root;
|
this.root = template.root;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current directory being viewed or manipulated within the
|
||||||
|
* filesystem.
|
||||||
|
*
|
||||||
|
* @type ManagedFilesystem.File
|
||||||
|
*/
|
||||||
|
this.currentDirectory = template.currentDirectory || template.root;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -140,6 +148,7 @@ angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector'
|
|||||||
mimetype : mimetypes[name],
|
mimetype : mimetypes[name],
|
||||||
streamName : name,
|
streamName : name,
|
||||||
type : type,
|
type : type,
|
||||||
|
parent : file,
|
||||||
name : filename
|
name : filename
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -216,6 +225,26 @@ angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector'
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the current directory of the given filesystem, automatically
|
||||||
|
* refreshing the contents of that directory.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem} filesystem
|
||||||
|
* The filesystem whose current directory should be changed.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem.File} file
|
||||||
|
* The directory to change to.
|
||||||
|
*/
|
||||||
|
ManagedFilesystem.changeDirectory = function changeDirectory(filesystem, file) {
|
||||||
|
|
||||||
|
// Refresh contents
|
||||||
|
ManagedFilesystem.refresh(filesystem, file);
|
||||||
|
|
||||||
|
// Set current directory
|
||||||
|
filesystem.currentDirectory = file;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A file within a ManagedFilesystem. Each ManagedFilesystem.File provides
|
* A file within a ManagedFilesystem. Each ManagedFilesystem.File provides
|
||||||
* sufficient information for retrieval or replacement of the file's
|
* sufficient information for retrieval or replacement of the file's
|
||||||
@@ -257,6 +286,14 @@ angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector'
|
|||||||
*/
|
*/
|
||||||
this.name = template.name;
|
this.name = template.name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The parent directory of this file. In the case of the root
|
||||||
|
* directory, this will be null.
|
||||||
|
*
|
||||||
|
* @type ManagedFilesystem.File
|
||||||
|
*/
|
||||||
|
this.parent = template.parent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map of all known files containined within this file by name. This is
|
* Map of all known files containined within this file by name. This is
|
||||||
* only applicable to directories.
|
* only applicable to directories.
|
||||||
@@ -265,14 +302,6 @@ angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector'
|
|||||||
*/
|
*/
|
||||||
this.files = template.files || {};
|
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;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
BIN
guacamole/src/main/webapp/images/folder-up.png
Normal file
BIN
guacamole/src/main/webapp/images/folder-up.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 819 B |
Reference in New Issue
Block a user