2020-07-08 17:30:37 +02:00
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html ng-app="Application" ng-controller="FileManagerController">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="utf-8" />
|
|
|
|
|
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height" />
|
|
|
|
|
|
|
|
|
|
<title> FileManager </title>
|
|
|
|
|
|
|
|
|
|
<link id="favicon" href="/api/v1/cloudron/avatar" rel="icon" type="image/png">
|
|
|
|
|
<link rel="apple-touch-icon" href="/api/v1/cloudron/avatar">
|
|
|
|
|
<link rel="icon" href="/api/v1/cloudron/avatar">
|
|
|
|
|
|
|
|
|
|
<!-- CSS -->
|
|
|
|
|
<link type="text/css" rel="stylesheet" href="/3rdparty/angular-ui-notification.css"/>
|
|
|
|
|
<link type="text/css" rel="stylesheet" href="/theme.css">
|
|
|
|
|
|
|
|
|
|
<!-- Custom Fonts -->
|
|
|
|
|
<link type="text/css" rel="stylesheet" href="/3rdparty/fontawesome/css/all.min.css">
|
|
|
|
|
|
|
|
|
|
<!-- jQuery-->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/jquery.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- async -->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/async-3.2.0.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- Bootstrap Core JavaScript -->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/bootstrap.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- Angularjs scripts -->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular.min.js"></script>
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular-loader.min.js"></script>
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular-animate.min.js"></script>
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular-base64.min.js"></script>
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular-md5.min.js"></script>
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular-sanitize.min.js"></script>
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/angular-ui-notification.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- Angular directives for bootstrap https://angular-ui.github.io/bootstrap/ -->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/ui-bootstrap-tpls-1.3.3.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- colors -->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/colors.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- moment -->
|
|
|
|
|
<script type="text/javascript" src="/3rdparty/js/moment.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<!-- Main Application -->
|
|
|
|
|
<script type="text/javascript" src="/js/filemanager.js"></script>
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body class="filemanager">
|
|
|
|
|
|
|
|
|
|
<a class="offline-banner animateMe" ng-show="client.offline" ng-cloak href="https://cloudron.io/documentation/troubleshooting/" target="_blank"><i class="fa fa-circle-notch fa-spin"></i> Cloudron is offline. Reconnecting...</a>
|
|
|
|
|
|
2020-07-09 11:00:11 +02:00
|
|
|
<!-- Modal remove entry -->
|
|
|
|
|
<div class="modal fade" id="entryRemoveModal" tabindex="-1" role="dialog">
|
|
|
|
|
<div class="modal-dialog">
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
<h4 class="modal-title">Delete {{ entryRemove.entry.fileName }}</h4>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-body">
|
|
|
|
|
<p class="text-bold text-danger" ng-show="entryRemove.error">{{ entryRemove.error }}</p>
|
2020-07-09 12:05:14 +02:00
|
|
|
<p ng-hide="entryRemove.error">Really delete {{ entryRemove.entry.fileName }}</p>
|
2020-07-09 11:00:11 +02:00
|
|
|
</div>
|
|
|
|
|
<div class="modal-footer">
|
|
|
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
|
|
|
<button type="button" class="btn btn-danger" ng-click="entryRemove.submit()" ng-hide="entryRemove.error" ng-disabled="entryRemove.busy"><i class="fa fa-circle-notch fa-spin" ng-show="entryRemove.busy"></i> Delete</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2020-07-09 12:05:14 +02:00
|
|
|
<!-- Modal new directory -->
|
|
|
|
|
<div class="modal fade" id="newDirectoryModal" tabindex="-1" role="dialog">
|
|
|
|
|
<div class="modal-dialog">
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
<h4 class="modal-title">New Directory</h4>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-body">
|
|
|
|
|
<form role="form" name="newDirectoryForm" ng-submit="newDirectory.submit()" autocomplete="off">
|
|
|
|
|
<fieldset>
|
|
|
|
|
<div class="form-group" ng-class="{ 'has-error': (newDirectoryForm.directoryName.$dirty && newDirectoryForm.directoryName.$invalid) }">
|
|
|
|
|
<label class="control-label">Directory Name</label>
|
|
|
|
|
<div class="control-label" ng-show="newDirectory.error">{{ newDirectory.error }}</div>
|
|
|
|
|
<input type="text" class="form-control" id="inputDirectoryName" name="directoryName" ng-model="newDirectory.name" required>
|
|
|
|
|
</div>
|
|
|
|
|
<input class="ng-hide" type="submit" ng-disabled="newDirectoryForm.$invalid || newDirectory.busy"/>
|
|
|
|
|
</fieldset>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-footer">
|
|
|
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
|
|
|
<button type="button" class="btn btn-danger" ng-click="newDirectory.submit()" ng-hide="newDirectory.error" ng-disabled="newDirectory.busy"><i class="fa fa-circle-notch fa-spin" ng-show="newDirectory.busy"></i> Create</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2020-07-09 12:59:29 +02:00
|
|
|
<!-- Modal rename entry -->
|
|
|
|
|
<div class="modal fade" id="renameEntryModal" tabindex="-1" role="dialog">
|
|
|
|
|
<div class="modal-dialog">
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
<h4 class="modal-title">Rename {{ renameEntry.entry.filePath }}</h4>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-body">
|
|
|
|
|
<form role="form" name="renameEntryForm" ng-submit="renameEntry.submit()" autocomplete="off">
|
|
|
|
|
<fieldset>
|
|
|
|
|
<div class="form-group" ng-class="{ 'has-error': (renameEntryForm.newName.$dirty && renameEntryForm.newName.$invalid) }">
|
|
|
|
|
<label class="control-label">New Name</label>
|
|
|
|
|
<div class="control-label" ng-show="renameEntry.error">{{ renameEntry.error }}</div>
|
|
|
|
|
<input type="text" class="form-control" id="inputNewName" name="newName" ng-model="renameEntry.newName" required>
|
|
|
|
|
</div>
|
|
|
|
|
<input class="ng-hide" type="submit" ng-disabled="renameEntryForm.$invalid || renameEntry.busy"/>
|
|
|
|
|
</fieldset>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-footer">
|
|
|
|
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
|
|
|
<button type="button" class="btn btn-danger" ng-click="renameEntry.submit()" ng-hide="renameEntry.error" ng-disabled="renameEntry.busy"><i class="fa fa-circle-notch fa-spin" ng-show="renameEntry.busy"></i> Rename</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2020-07-08 17:30:37 +02:00
|
|
|
<div class="main-container animateMe ng-hide " ng-show="initialized">
|
|
|
|
|
<br/>
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="col-md-6 col-md-offset-3">
|
|
|
|
|
<div class="card">
|
|
|
|
|
<h3>FileManager for {{ app.fqdn }}</h3>
|
|
|
|
|
|
|
|
|
|
<br/>
|
|
|
|
|
<br/>
|
|
|
|
|
|
2020-07-09 15:59:06 +02:00
|
|
|
<input type="file" id="uploadFileInput" style="display: none" multiple/>
|
|
|
|
|
<input type="file" id="uploadFolderInput" style="display: none" multiple webkitdirectory directory/>
|
|
|
|
|
|
2020-07-08 17:30:37 +02:00
|
|
|
<div>
|
|
|
|
|
<button class="btn btn-primary" ng-click="refresh()"><i class="fas fa-sync-alt"></i></button>
|
|
|
|
|
<span>Path: <b>{{ cwd }}</b></span>
|
2020-07-09 12:05:14 +02:00
|
|
|
<button class="btn btn-primary pull-right" ng-click="newDirectory.show()">New Directory</button>
|
2020-07-08 17:30:37 +02:00
|
|
|
<button class="btn btn-primary pull-right" ng-click="uploadFile()">Upload File</button>
|
|
|
|
|
<button class="btn btn-primary pull-right" ng-click="uploadFolder()">Upload Folder</button>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<br/>
|
|
|
|
|
|
|
|
|
|
<table class="table table-hover" style="margin: 0;">
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>
|
|
|
|
|
<th style="width: 5%;">Type</th>
|
|
|
|
|
<th style="width:65%">Name</th>
|
|
|
|
|
<th style="width:10%">Size</th>
|
|
|
|
|
<th style="width:10%">Owner</th>
|
|
|
|
|
<th style="width: 10%" class="text-right">Actions</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
2020-07-09 11:00:11 +02:00
|
|
|
<tr ng-hide="cwd === '/'">
|
2020-07-08 17:30:37 +02:00
|
|
|
<td><i class="fas fa-level-up-alt"></i></td>
|
|
|
|
|
<td class="hand elide-table-cell" ng-click="goDirectoryUp()">Up</td>
|
|
|
|
|
<td class="text-right no-wrap" style="vertical-align: bottom"></td>
|
|
|
|
|
<td class="text-right no-wrap" style="vertical-align: bottom"></td>
|
|
|
|
|
<td class="text-right no-wrap" style="vertical-align: bottom"></td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr ng-repeat="entry in entries">
|
|
|
|
|
<td>
|
|
|
|
|
<i class="fas fa-folder" ng-show="entry.isDirectory"></i>
|
|
|
|
|
<i class="far fa-file" ng-show="entry.isFile"></i>
|
|
|
|
|
</td>
|
|
|
|
|
<td class="hand elide-table-cell" ng-click="open(entry)">{{ entry.filePath }}</td>
|
|
|
|
|
<td class="hand elide-table-cell" ng-click="open(entry)">{{ entry.size | prettyDiskSize }}</td>
|
|
|
|
|
<td class="hand elide-table-cell" ng-click="open(entry)">{{ entry.uid | prettyOwner }}</td>
|
|
|
|
|
<td class="text-right no-wrap" style="vertical-align: bottom">
|
2020-07-09 12:59:29 +02:00
|
|
|
<button class="btn btn-xs btn-default" ng-click="renameEntry.show(entry)"><i class="far fa-edit"></i></button>
|
2020-07-09 11:00:11 +02:00
|
|
|
<button class="btn btn-xs btn-danger" ng-click="entryRemove.show(entry)"><i class="far fa-trash-alt"></i></button>
|
2020-07-08 17:30:37 +02:00
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|