feat(agent): browse files

pull/2337/head
Chaim Lev-Ari 2018-09-30 11:16:10 +03:00
parent 5956c4db40
commit 0b8665f148
11 changed files with 133 additions and 53 deletions

View File

@ -1,34 +1,67 @@
angular
.module('portainer.agent')
.controller('HostBrowserController', [function HostBrowserController() {
angular.module('portainer.agent').controller('HostBrowserController', [
'HostBrowserService',
'Notifications',
function HostBrowserController(HostBrowserService, Notifications) {
var ctrl = this;
ctrl.state = {
path: '/'
};
this.isRoot=true
this.files = []
this.goToParent = goToParent;
this.browse = browse;
this.renameFile = renameFile;
this.downloadFile = downloadFile;
this.deleteFile = deleteFile;
ctrl.goToParent = goToParent;
ctrl.browse = browse;
ctrl.renameFile = renameFile;
ctrl.downloadFile = downloadFile;
ctrl.deleteFile = deleteFile;
ctrl.isRoot = isRoot;
ctrl.$onInit = $onInit;
function goToParent() {
getFilesForPath(parentPath(this.state.path));
}
function browse(folderName) {
function isRoot() {
return ctrl.state.path === '/';
}
function renameFile(name, newName) {
function browse(folder) {
getFilesForPath(buildPath(ctrl.state.path, folder));
}
function downloadFile(name) {
function getFilesForPath(path) {
HostBrowserService.ls(path)
.then(function onFilesLoaded(files) {
ctrl.state.path = path;
ctrl.files = files;
})
.catch(function onLoadingFailed(err) {
Notifications.error('Failure', err, 'Unable to browse');
});
}
function deleteFile(name) {
function renameFile(name, newName) {}
function downloadFile(name) {}
function deleteFile(name) {}
function $onInit() {
getFilesForPath('/');
}
}]);
function parentPath(path) {
if (path.lastIndexOf('/') === 0) {
return '/';
}
var split = _.split(path, '/');
return _.join(_.slice(split, 0, split.length - 1), '/');
}
function buildPath(parent, file) {
if (parent === '/') {
return parent + file;
}
return parent + '/' + file;
}
}
]);

View File

@ -2,7 +2,7 @@
title-text="Host browser" title-icon="fa-file"
dataset="$ctrl.files" table-key="host_browser"
order-by="Dir"
is-root="$ctrl.state.isRoot"
is-root="$ctrl.isRoot()"
go-to-parent="$ctrl.goToParent()"
browse="$ctrl.browse(name)"
rename="$ctrl.renameFile(name, newName)"

View File

@ -1,5 +1,5 @@
angular.module('portainer.agent').component('hostBrowser', {
bindings: {},
controller: 'HostBrowserController',
templateUrl: 'app/agent/components/host-browser/host-browser.html'
templateUrl: 'app/agent/components/host-browser/host-browser.html',
bindings: {}
});

View File

@ -0,0 +1,33 @@
angular.module('portainer.agent').factory('HostBrowserService', [
'Browse',
function HostBrowserServiceFactory(Browse) {
var service = {};
service.ls = ls;
service.get = get;
service.delete = deletePath;
service.rename = rename;
function ls(path) {
return Browse.ls({ path: path }).$promise;
}
function get(path) {
return Browse.get({ path: path }).$promise;
}
function deletePath(path) {
return Browse.delete({ path: path }).$promise;
}
function rename(path, newPath) {
var payload = {
CurrentFilePath: path,
NewFilePath: newPath
};
return Browse.rename({}, payload).$promise;
}
return service;
}
]);

View File

@ -243,6 +243,16 @@ angular.module('portainer.docker', ['portainer.app'])
}
};
var nodeBrowser = {
name: 'docker.nodes.node.browse',
url: '/browse',
views: {
'content@': {
component: 'nodeBrowserView'
}
}
};
var secrets = {
name: 'docker.secrets',
url: '/secrets',
@ -414,16 +424,7 @@ angular.module('portainer.docker', ['portainer.app'])
}
};
var host = {
name: 'docker.host',
url: '/host',
views: {
'content@': {
templateUrl: 'app/docker/views/host/host.html',
controller: 'HostController'
}
}
};
$stateRegistryProvider.register(configs);
$stateRegistryProvider.register(config);
@ -448,6 +449,7 @@ angular.module('portainer.docker', ['portainer.app'])
$stateRegistryProvider.register(networkCreation);
$stateRegistryProvider.register(nodes);
$stateRegistryProvider.register(node);
$stateRegistryProvider.register(nodeBrowser);
$stateRegistryProvider.register(secrets);
$stateRegistryProvider.register(secret);
$stateRegistryProvider.register(secretCreation);
@ -464,5 +466,4 @@ angular.module('portainer.docker', ['portainer.app'])
$stateRegistryProvider.register(volume);
$stateRegistryProvider.register(volumeBrowse);
$stateRegistryProvider.register(volumeCreation);
$stateRegistryProvider.register(host);
}]);

View File

@ -34,9 +34,6 @@
<li class="sidebar-list" ng-if="$ctrl.swarmManagement">
<a ui-sref="docker.swarm" ui-sref-active="active">Swarm <span class="menu-icon fa fa-object-group fa-fw"></span></a>
</li>
<li class="sidebar-list" ng-if="$ctrl.isAgent">
<a ui-sref="docker.host" ui-sref-active="active">Host <span class="menu-icon fa fa-object-group fa-fw"></span></a>
</li>
<li class="sidebar-list" ng-if="$ctrl.standaloneManagement">
<a ui-sref="docker.host" ui-sref-active="active">Host <span class="menu-icon fa fa-th fa-fw"></span></a>
</li>

View File

@ -1,8 +1,12 @@
<rd-header>
<rd-header-title title-text="Host overview">
<a data-toggle="tooltip" title="Refresh" ui-sref="{{$ctrl.refreshUrl}}" ui-sref-opts="{reload: true}">
<a data-toggle="tooltip" title="Refresh" ui-sref="{{$ctrl.refreshUrl}}"
ui-sref-opts="{reload: true}">
<i class="fa fa-sync" aria-hidden="true"></i>
</a>
<a title="Browse" ui-sref="docker.nodes.node.browse" ng-if="$ctrl.isAgent">
Browse
</a>
</rd-header-title>
<rd-header-content>Docker</rd-header-content>
</rd-header>

View File

@ -1,10 +0,0 @@
angular.module('portainer.docker').controller('HostController', [
'$transition$',
function HostController() {
initView();
function initView() {
}
}
]);

View File

@ -0,0 +1,18 @@
angular.module('portainer.docker').controller('NodeBrowserController', [
'NodeService',
'HttpRequestHelper',
'$stateParams',
function NodeBrowserController(NodeService, HttpRequestHelper, $stateParams) {
var ctrl = this;
ctrl.$onInit = $onInit;
function $onInit() {
ctrl.nodeId = $stateParams.id;
NodeService.node(ctrl.nodeId).then(function onNodeLoaded(node) {
HttpRequestHelper.setPortainerAgentTargetHeader(node.Hostname);
ctrl.node = node;
});
}
}
]);

View File

@ -1,7 +1,7 @@
<rd-header>
<rd-header-title title-text="Host"></rd-header-title>
<rd-header-title title-text="Node Browser"></rd-header-title>
<rd-header-content>
Host
<a ui-sref="docker.volumes">Nodes</a> &gt; <a ui-sref="docker.nodes.nodes({ id: $ctrl.nodeId })">{{ $ctrl.node.Hostname }}</a> &gt; browse
</rd-header-content>
</rd-header>

View File

@ -0,0 +1,4 @@
angular.module('portainer.docker').component('nodeBrowserView', {
templateUrl: 'app/docker/views/nodes/node-browser/node-browser.html',
controller: 'NodeBrowserController'
});