diff --git a/resources/views/server/files/index.blade.php b/resources/views/server/files/index.blade.php index 08db97803..482b062de 100644 --- a/resources/views/server/files/index.blade.php +++ b/resources/views/server/files/index.blade.php @@ -23,6 +23,12 @@ Managing Files for: {{ $server->name }} @endsection +@section('scripts') + @parent + {!! Theme::js('js/vendor/async/async.min.js') !!} + {!! Theme::js('js/vendor/lodash/lodash.js') !!} +@endsection + @section('content')
@@ -50,128 +56,21 @@
+ + + + @endsection diff --git a/resources/views/server/files/list.blade.php b/resources/views/server/files/list.blade.php index e7d12a16c..7034ac5cc 100644 --- a/resources/views/server/files/list.blade.php +++ b/resources/views/server/files/list.blade.php @@ -18,57 +18,57 @@ {{-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE --}} {{-- SOFTWARE. --}}

/home/container{{ $directory['header'] }}  

- +
- + {{-- --}} @if (isset($directory['first']) && $directory['first'] === true) - - + + {{-- --}} @endif @if (isset($directory['show']) && $directory['show'] === true) - - + + {{-- --}} @endif @foreach ($folders as $folder) - - - - - - + + + + + {{-- + --}} @endforeach @foreach ($files as $file) - + - + --}} @endforeach diff --git a/resources/views/server/js/filemanager/actions.blade.php b/resources/views/server/js/filemanager/actions.blade.php new file mode 100644 index 000000000..d82d4d46f --- /dev/null +++ b/resources/views/server/js/filemanager/actions.blade.php @@ -0,0 +1,69 @@ +"use strict"; + +// Copyright (c) 2015 - 2016 Dane Everitt +// +// 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. +class FileActions { + constructor() { + // + } + + run() { + this.directoryClick(); + this.rightClick(); + } + + rightClick() { + $('#file_listing > tbody').on('contextmenu', event => { + event.preventDefault(); + const parent = $(event.target).parent(); + + $('#fileOptionMenu').appendTo('body'); + $('#fileOptionMenu').data('invokedOn', $(event.target)).show().css({ + position: 'absolute', + left: event.pageX, + top: event.pageY, + }); + + // Handle Events + var Context = new ContextMenuActions(parent); + $('#fileOptionMenu li[data-action="move"]').unbind().on('click', e => { + Context.move(); + }); + + $('#fileOptionMenu li[data-action="rename"]').unbind().on('click', e => { + Context.rename(); + }); + + $(window).click(() => { + $('#fileOptionMenu').hide(); + }); + }); + } + + directoryClick() { + $('a[data-action="directory-view"]').on('click', function (event) { + event.preventDefault(); + window.location.hash = encodeURIComponent($(this).parent().data('hash') || ''); + Files.list(); + }); + } +} + +window.Actions = new FileActions; diff --git a/resources/views/server/js/filemanager/contextmenu.blade.php b/resources/views/server/js/filemanager/contextmenu.blade.php new file mode 100644 index 000000000..71f4a1112 --- /dev/null +++ b/resources/views/server/js/filemanager/contextmenu.blade.php @@ -0,0 +1,90 @@ +"use strict"; + +// Copyright (c) 2015 - 2016 Dane Everitt +// +// 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. +class ContextMenuActions { + constructor(element) { + this.element = element; + } + + destroy() { + this.element = undefined; + } + + move() { + alert($(this.element).data('path')); + } + + rename() { + var desiredElement = $(this.element).find('td[data-identifier="name"]'); + var linkElement = desiredElement.find('a'); + var currentName = linkElement.html(); + var editField = ``; + desiredElement.find('a').remove(); + desiredElement.html(editField); + + const inputField = desiredElement.find('input'); + inputField.focus(); + + inputField.on('blur keypress', e => { + // Save Field + if (e.type === 'blur' || (e.type === 'keypress' && e.which !== 13)) { + // Escape Key Pressed, don't save. + if (e.which === 27 || e.type === 'blur') { + desiredElement.html(linkElement); + inputField.remove(); + } + return; + } + + $.ajax({ + type: 'POST', + headers: { + 'X-Access-Token': '{{ $server->daemonSecret }}', + 'X-Access-Server': '{{ $server->uuid }}' + }, + contentType: 'application/json; charset=utf-8', + url: '{{ $node->scheme }}://{{ $node->fqdn }}:{{ $node->daemonListen }}/server/files/rename', + timeout: 10000, + data: JSON.stringify({ + from: currentName, + to: inputField.val(), + }), + }).done(data => { + this.element.attr('data-path', inputField.val()); + desiredElement.attr('data-hash', inputField.val()); + desiredElement.html(linkElement.html(inputField.val())); + inputField.remove(); + Actions.run(); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + swal({ + type: 'error', + title: '', + text: error, + }); + }); + }); + } +} diff --git a/resources/views/server/js/filemanager/index.blade.php b/resources/views/server/js/filemanager/index.blade.php new file mode 100644 index 000000000..04c3295fa --- /dev/null +++ b/resources/views/server/js/filemanager/index.blade.php @@ -0,0 +1,91 @@ +"use strict"; + +// Copyright (c) 2015 - 2016 Dane Everitt +// +// 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. +class FileManager { + constructor() { + this.list(this.decodeHash()); + } + + reload() { + $('[data-toggle="tooltip"]').tooltip(); + } + + list(path) { + if (_.isUndefined(path)) { + path = this.decodeHash(); + } + + this.loader(true); + $.ajax({ + type: 'POST', + url: '{{ route('server.files.directory-list', $server->uuidShort) }}', + headers: { + 'X-CSRF-Token': '{{ csrf_token() }}', + }, + data: { + directory: path, + }, + }).done(data => { + $('#load_files').slideUp().html(data).slideDown(() => { + Actions.run(); + }); + $('#internal_alert').slideUp(); + }).fail(jqXHR => { + swal({ + type: 'error', + title: 'File Error', + text: 'An error occured while attempting to process this request. Please try again.', + }); + this.list('/'); + console.log(jqXHR); + }).always(() => { + this.loader(false); + }); + } + + loader(show) { + if ($('#load_files').height() < 5) return; + + if (show === true){ + var height = $('#load_files').height(); + var width = $('.ajax_loading_box').width(); + var center_height = (height / 2) - 30; + var center_width = (width / 2) - 30; + + $('#position_me').css({ + 'top': center_height, + 'left': center_width, + 'font-size': '60px' + }); + + $('.ajax_loading_box').css('height', (height + 5)).fadeIn(); + } else { + $('.ajax_loading_box').fadeOut(100); + } + } + + decodeHash() { + return decodeURIComponent(window.location.hash.substring(1)); + } + +} + +window.Files = new FileManager;
File Name Size Last ModifiedOptionsOptions
← {{ $directory['link_show'] }}← {{ $directory['link_show'] }}
{{ $folder['entry'] }}{{ $folder['size'] }}{{ date('m/d/y H:i:s', $folder['date']) }} +
{{ $folder['entry'] }}{{ $folder['size'] }}{{ date('m/d/y H:i:s', $folder['date']) }}
@can('delete-files', $server) - + @endcan
-
@if(in_array($file['extension'], $extensions)) @@ -83,7 +83,7 @@ {{ $file['size'] }} {{ date('m/d/y H:i:s', $file['date']) }} + {{--
@@ -98,7 +98,7 @@ @endcan
-