026df6a36f
Permission obtained from @DDynamic. Contributions from other users were removed since we did not obtain permission from them for the re-license. From this point forward all contributors must have a signed Contributor License Agreement on file.
207 lines
9.5 KiB
PHP
207 lines
9.5 KiB
PHP
{{--
|
|
Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
|
|
|
|
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.
|
|
--}}
|
|
@extends('layouts.master')
|
|
|
|
@section('title')
|
|
Add File to: {{ $server->name }}
|
|
@endsection
|
|
|
|
@section('scripts')
|
|
@parent
|
|
<script src="{{ asset('js/binaryjs.js') }}"></script>
|
|
@endsection
|
|
|
|
@section('content')
|
|
<div class="col-md-12">
|
|
<ul class="nav nav-tabs" id="config_tabs">
|
|
<li class="active"><a href="#create" data-toggle="tab">Create File</a></li>
|
|
@can('upload-files', $server)<li><a href="#upload" data-toggle="tab">Upload Files</a></li>@endcan
|
|
</ul>
|
|
<div class="tab-content">
|
|
<div class="tab-pane active" id="create">
|
|
<div id="write_status" style="display:none;width: 100%; margin: 10px 0 5px;"></div>
|
|
<form method="post" id="new_file">
|
|
<h4>/home/container/{{ $directory }} <input type="text" id="file_name" class="filename" value="newfile.txt" /></h4>
|
|
<div class="form-group">
|
|
<div>
|
|
<textarea name="file_contents" id="fileContents" style="border: 1px solid #dddddd;" class="form-control console"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<div>
|
|
<button class="btn btn-primary btn-sm" id="create_file">{{ trans('strings.save') }}</button>
|
|
<button class="btn btn-default btn-sm" onclick="window.location='/server/{{ $server->uuidShort }}/files?dir=/{{ $directory }}';return false;">{{ trans('server.files.back') }}</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
@can('upload-files', $server)
|
|
<div class="tab-pane" id="upload">
|
|
<h4>/home/container/ <input type="text" id="u_file_name" value="{{ $directory }}" style='outline: none;width:450px;background: transparent;margin-left:-5px;padding:0;border: 0px;font-family: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight: 250;line-height: 1.1;color: inherit;font-size: 19px;'/></h4>
|
|
<div class="alert alert-warning">Please edit the path location above <strong>before you upload files</strong>. They will automatically be placed in the directory you specify above. Simply click next to <code>/home/container/</code> and begin typing. You can change this each time you upload a new file without having to press anything else.</div>
|
|
<div class="alert alert-danger" id="upload_error" style="display: none;"></div>
|
|
<input type="file" id="fileinput" name="fileUpload[]" multiple="" style="display:none;"/>
|
|
<div id="uploader_box" class="well well-sm" style="cursor:pointer;">
|
|
<center><h2 style="margin-bottom: 25px;">Connecting...</h2></center>
|
|
</div>
|
|
<span id="file_progress"></span>
|
|
</div>
|
|
@endcan
|
|
</div>
|
|
</div>
|
|
<script>
|
|
$(window).load(function () {
|
|
|
|
$('.server-files').addClass('active');
|
|
|
|
var newFilePath;
|
|
var newFileContents;
|
|
|
|
@can('upload-files', $server)
|
|
var client = new BinaryClient('{{ $node->scheme === 'https' ? 'wss' : 'ws' }}://{{ $node->fqdn }}:{{ $node->daemonListen }}/upload/', {
|
|
chunkSize: 40960
|
|
});
|
|
// Wait for connection to BinaryJS server
|
|
client.on('open', function() {
|
|
|
|
var box = $('#uploader_box');
|
|
box.on('dragenter', doNothing);
|
|
box.on('dragover', doNothing);
|
|
box.html('<center><h2 style="margin-bottom:25px;">Drag or Click to Upload</h2></center>');
|
|
box.on('click', function () {
|
|
$('#fileinput').click();
|
|
});
|
|
box.on('drop', function (e, files) {
|
|
|
|
if (typeof files !== 'undefined') {
|
|
e.originalEvent = {
|
|
dataTransfer: {
|
|
files: files.currentTarget.files
|
|
}
|
|
};
|
|
}
|
|
|
|
e.preventDefault();
|
|
$.each(e.originalEvent.dataTransfer.files, function(index, value) {
|
|
|
|
var file = e.originalEvent.dataTransfer.files[index];
|
|
var identifier = Math.random().toString(36).slice(2);
|
|
|
|
$('#file_progress').append('<div class="well well-sm" id="file-upload-' + identifier +'"> \
|
|
<div class="row"> \
|
|
<div class="col-md-12"> \
|
|
<h6>Uploading ' + file.name + '</h6> \
|
|
<span class="prog-bar-text-' + identifier +'" style="font-size: 10px;position: absolute;margin: 3px 0 0 15px;">Waiting...</span> \
|
|
<div class="progress progress-striped active"> \
|
|
<div class="progress-bar progress-bar-info prog-bar-' + identifier +'" style="width: 0%"></div> \
|
|
</div> \
|
|
</div> \
|
|
</div> \
|
|
</div>');
|
|
|
|
// Add to list of uploaded files
|
|
var stream = client.send(file, {
|
|
token: "{{ $server->daemonSecret }}",
|
|
server: "{{ $server->uuid }}",
|
|
path: $("#u_file_name").val(),
|
|
name: file.name,
|
|
size: file.size
|
|
});
|
|
|
|
var tx = 0;
|
|
stream.on('data', function(data) {
|
|
if(data.error) {
|
|
$("#upload_error").html(data.error).show();
|
|
$("#file-upload-" + identifier).hide();
|
|
} else {
|
|
tx += data.rx;
|
|
|
|
if(tx >= 0.999) {
|
|
$('.prog-bar-text-' + identifier).text('Upload Complete');
|
|
$('.prog-bar-' + identifier).css('width', '100%').parent().removeClass('active').removeClass('progress-striped');
|
|
} else {
|
|
$('.prog-bar-text-' + identifier).text(Math.round(tx * 100) + '%');
|
|
$('.prog-bar-' + identifier).css('width', tx * 100 + '%');
|
|
}
|
|
}
|
|
});
|
|
|
|
stream.on('close', function(data) {
|
|
$("#upload_error").html("The BinaryJS data stream was closed by the server. Please refresh the page and try again.").show();
|
|
$("#file-upload-" + identifier).hide();
|
|
});
|
|
|
|
stream.on('error', function(data) {
|
|
console.error("An error was encountered with the BinaryJS upload stream.");
|
|
});
|
|
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
// listen for a file being chosen
|
|
$('#fileinput').change(function (event) {
|
|
$('#uploader_box').trigger('drop', [event, event.currentTarget]);
|
|
$('#fileinput').val('');
|
|
});
|
|
|
|
// Deal with DOM quirks
|
|
function doNothing (e){
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
@endcan
|
|
|
|
$('textarea').keydown(function (e) {
|
|
if (e.keyCode === 9) {
|
|
var start = this.selectionStart;
|
|
var end = this.selectionEnd;
|
|
var value = $(this).val();
|
|
$(this).val(value.substring(0, start) + '\t' + value.substring(end));
|
|
this.selectionStart = this.selectionEnd = start + 1;
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
|
|
$("#create_file").click(function(e) {
|
|
e.preventDefault();
|
|
$("#create_file").append(' <i class="fa fa-spinner fa fa-spin"></i>').addClass("disabled");
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: '/server/{{ $server->uuidShort }}/ajax/files/save',
|
|
headers: { 'X-CSRF-Token': '{{ csrf_token() }}' },
|
|
data: {
|
|
file: '{{ $directory }}' + $('#file_name').val(),
|
|
contents: $('#fileContents').val()
|
|
}
|
|
}).done(function (data) {
|
|
window.location.replace('/server/{{ $server->uuidShort }}/files/edit/{{ $directory }}' + $('#file_name').val());
|
|
}).fail(function (jqXHR) {
|
|
$('#write_status').html('<div class="alert alert-danger">' + jqXHR.responseText + '</div>').show();
|
|
$('#create_file').html('{{ trans('strings.save') }}').removeClass('disabled');
|
|
});
|
|
});
|
|
|
|
});
|
|
</script>
|
|
@endsection
|