diff --git a/components/editor/init.js b/components/editor/init.js
index c34643c..a064ffc 100755
--- a/components/editor/init.js
+++ b/components/editor/init.js
@@ -1572,7 +1572,7 @@
codiad.modal.load(
400,
- 'components/editor/dialog.php?action=sort'
+ 'components/editor/dialog.php?action=sort',
{},
function( c ) {
diff --git a/components/filemanager/class.filemanager.php b/components/filemanager/class.filemanager.php
index 5da73ac..2155d9c 100755
--- a/components/filemanager/class.filemanager.php
+++ b/components/filemanager/class.filemanager.php
@@ -736,40 +736,47 @@ class Filemanager extends Common {
// UPLOAD (Handles uploads to the specified directory)
//////////////////////////////////////////////////////////////////
- public function upload( $path ) {
+ public function upload( $path, $blob ) {
// Check that the path is a directory
+ if( ! Permissions::has_write( $path ) ) {
+
+ $response["status"] = "error";
+ $response["message"] = "You do not have access to write to this file.";
+ return $response;
+ }
+
+ if( ! common::isAbsPath( $path ) ) {
+
+ $path = WORKSPACE . "/$path";
+ }
+
$response = array(
"status" => "none",
"message" => "",
- "files" => array(),
);
- if ( is_file( $path ) ) {
+ $dirname = dirname( $path );
+ $name = basename( $path );
+
+ if( ! is_dir( $dirname ) ) {
+
+ mkdir( $dirname, 0755, true );
+ }
+
+ $status = file_put_contents( $path, $blob, FILE_APPEND );
+
+ if( $status === false ) {
$response["status"] = "error";
- $response["message"] = "Path Not A Directory";
+ $response["message"] = "File could not be written to.";
} else {
- foreach( $_FILES['upload']['name'] as $key => $value ) {
-
- if ( ! empty( $value ) ) {
-
- $filename = $value;
- $filepath = $path . "/$filename";
- if ( @move_uploaded_file( $_FILES['upload']['tmp_name'][$key], $filepath ) ) {
-
- $info[] = array(
- "name" => $filename,
- "size" => filesize( $filepath ),
- "url" => $filepath,
- "thumbnail_url" => $filepath,
- "delete_url" => $filepath,
- "delete_type" => 'DELETE'
- );
- }
- }
- }
+ $response["status"] = "success";
+ $response["path"] = $path;
+ $response["bytes"] = $status;
+ $response["message"] = "$status bytes written to file.";
}
+
return $response;
}
}
diff --git a/components/filemanager/controller.php b/components/filemanager/controller.php
index 76c7d62..f00e9c2 100755
--- a/components/filemanager/controller.php
+++ b/components/filemanager/controller.php
@@ -46,7 +46,7 @@ if( ! isset( $_SESSION['project'] ) ) {
require_once('../project/controller.php');
}
-if( isset( $_GET["path"] ) || isset( $_POST["path"] ) ) {
+if( isset( $_GET["path"] ) || isset( $_POST["path"] ) ) {
$path = isset( $_GET["path"] ) ? $_GET["path"] : $_POST["path"];
} else {
@@ -286,8 +286,18 @@ switch( $action ) {
break;
case 'upload':
+
+ if( ! isset( $_POST["blob"] ) ) {
+
+ $response["status"] = "error";
+ $response["data"] = array(
+ "error" => "No blob given"
+ );
+ exit( json_encode( $response ) );
+ }
- $response = $Filemanager->upload( $path );
+ $blob = $_POST["blob"];
+ $response = $Filemanager->upload( $path, $blob );
break;
default:
diff --git a/components/filemanager/init.js b/components/filemanager/init.js
index 74dc55b..15efbe1 100755
--- a/components/filemanager/init.js
+++ b/components/filemanager/init.js
@@ -611,7 +611,6 @@
if( total_saved == 0 ) {
- root = true;
_this.files = result;
files = result;
} else {
@@ -647,13 +646,16 @@
files: files
});
+ root = ( node.attr( 'data-type' ) == 'root' );
let plus = span.hasClass( 'plus' );
let minus = span.hasClass( 'minus' );
let trigger = ( plus || span.hasClass( 'none' ) || root || ( rescan && minus ) );
- _this.toggle_open_close( node.parent(), trigger );
+ console.log( plus, span.hasClass( 'none' ), root, ( rescan && minus ) );
console.log( trigger );
+ _this.toggle_open_close( node.parent(), trigger );
+
if( trigger ) {
_this.create_indexes( files, container );
@@ -1454,26 +1456,30 @@
selector_listeners: function( node, limit ) {
- let _this = this;
+ let _this = codiad.filemanager;
$( node )
.on( 'click', 'a', async function( e ) {
+ let i = $( e.target );
+
// Select or Expand
if( codiad.editor.settings.fileManagerTrigger ) {
- $( this ).addClass( 'loading' );
- let result = await _this.get_indexes( $( this ).attr( 'data-path' ) );
- result = codiad.jsend.parse( result );
- let indexes = result.index
- console.log( indexes );
-
- let ul = $( '
' );
- let children = _this.create_indexes( indexes, ul, {type: 'directories'}, [] );
- $( this ).removeClass( 'loading' );
- _this.toggle_open_close( $( this ).parent(), null );
- $( this ).parent().children( 'ul' ).remove();
- $( this ).parent().append( ul );
+ _this.toggle_open_close( i.parent(), null, async function() {
+
+ let result = await _this.get_indexes( i.attr( 'data-path' ) );
+ result = codiad.jsend.parse( result );
+ let indexes = result.index;
+ let ul = $( '' );
+ let children = _this.create_indexes( indexes, ul, {type: 'directories'}, [] );
+ i.parent().children( 'ul' ).remove();
+ i.parent().append( ul );
+ },
+ async function() {
+
+ i.parent().children( 'ul' ).remove();
+ });
} else {
_this.toggle_select_node( $( e.target ), limit );
@@ -1481,39 +1487,43 @@
})
.on( 'click', 'span', async function( e ) {
- // Select or Expand
- let a = $( this ).parent().children( 'a' );
- a.addClass( 'loading' );
- let result = await _this.get_indexes( a.attr( 'data-path' ) );
- result = codiad.jsend.parse( result );
- let indexes = result.index
- console.log( indexes );
+ let i = $( e.target ).parent().children( 'a' );
- let ul = $( '' );
- let children = _this.create_indexes( indexes, ul, {type: 'directories'}, [] );
- a.removeClass( 'loading' );
- _this.toggle_open_close( $( this ).parent(), null );
- $( this ).parent().children( 'ul' ).remove();
- $( this ).parent().append( ul );
+ _this.toggle_open_close( i.parent(), null, async function() {
+
+ let result = await _this.get_indexes( i.attr( 'data-path' ) );
+ result = codiad.jsend.parse( result );
+ let indexes = result.index;
+ let ul = $( '' );
+ let children = _this.create_indexes( indexes, ul, {type: 'directories'}, [] );
+ i.parent().children( 'ul' ).remove();
+ i.parent().append( ul );
+ },
+ async function() {
+
+ i.parent().children( 'ul' ).remove();
+ });
})
.on( 'dblclick', 'a', async function( e ) {
- let _this = codiad.filemanager
- // Select or Expand
+ let i = $( e.target );
+
if( ! codiad.editor.settings.fileManagerTrigger ) {
- $( this ).addClass( 'loading' );
- let result = await _this.get_indexes( $( this ).attr( 'data-path' ) );
- result = codiad.jsend.parse( result );
- let indexes = result.index
- console.log( indexes );
-
- let ul = $( '' );
- let children = _this.create_indexes( indexes, ul, {type: 'directories'}, [] );
- $( this ).removeClass( 'loading' );
- _this.toggle_open_close( $( this ).parent(), null );
- $( this ).parent().children( 'ul' ).remove();
- $( this ).parent().append( ul );
+ _this.toggle_open_close( i.parent(), null, async function() {
+
+ let result = await _this.get_indexes( i.attr( 'data-path' ) );
+ result = codiad.jsend.parse( result );
+ let indexes = result.index;
+ let ul = $( '' );
+ let children = _this.create_indexes( indexes, ul, {type: 'directories'}, [] );
+ i.parent().children( 'ul' ).remove();
+ i.parent().append( ul );
+ },
+ async function() {
+
+ i.parent().children( 'ul' ).remove();
+ });
} else {
_this.toggle_select_node( $( e.target ), limit );
@@ -1529,8 +1539,6 @@
let path = node.attr( 'data-path' );
let i = 1;
- console.log( node, limit );
-
for( i = _this.selected.length;i--; ) {
if( _this.selected[i] == path ) {
@@ -1548,22 +1556,21 @@
}
_this.selected = [];
_this.selected.push( path );
- node.css( "background", "#fff" );
} else {
if( selected ) {
- node.css( "background", "" );
_this.selected.splice( i, 1 );
} else {
_this.selected.push( path );
- node.css( "background", "#fff" );
}
}
+
+ console.log( path, _this.selected );
},
- toggle_open_close: function( node, open ) {
+ toggle_open_close: function( node, open, open_callback, close_callback ) {
let span = node.children( 'span' );
let a = node.children( 'a' );
@@ -1584,6 +1591,11 @@
span.addClass( 'minus' );
}
a.addClass( 'open' );
+
+ if( typeof open_callback == "function" ) {
+
+ open_callback();
+ }
} else {
span.removeClass( 'minus' );
@@ -1596,6 +1608,11 @@
node.children( 'span' ).removeClass( 'minus' ).addClass( 'plus' );
node.children().find( 'span' ).removeClass( 'minus' ).addClass( 'plus' );
node.children().find( 'a' ).removeClass( 'open' );
+
+ if( typeof close_callback == "function" ) {
+
+ close_callback();
+ }
});
}
},
@@ -1619,25 +1636,66 @@
destination = destination + "/";
}
- //form.append( "action", "upload" );
+ console.log( files );
+ console.log( destination );
for( let i = files.length;i--; ) {
- let entry = files[i].webkitGetAsEntry();
-
- console.log( entry );
+ let entry = files[i];
if( entry.isFile ) {
- console.log( entry );
+ entry.file( function( file ) {
+
+ _this.upload_blobs( file, destination );
+ });
} else if( entry.isDirectory ) {
- _this.upload_read_directory( entry, destination );
+ _this.upload_read_directory( entry, destination, _this.upload_split );
}
}
+ },
+
+ upload_blob: async function( blob, path ) {
- console.log( files );
- console.log( destination );
+
+ },
+
+ upload_blobs: function( file, path ) {
+
+ console.log( file, path );
+ let _this = codiad.filemanager;
+ let blob_size = 1024;
+ let total_size = file.size;
+ let current = 0 + blob_size;
+ let reader = new FileReader();
+ let blob = file.slice( current, current + blob_size );
+ let upload_status = null;
+ let file_path = path;
+
+ if( path.charAt( path.length - 1 ) !== '/' ) {
+
+ file_path = file_path + '/';
+ }
+
+
+ reader.onload = async function( e ) {
+
+ upload_status = await _this.upload_blob( blob, file_path );
+ console.log( upload_status );
+
+ while( current <= total_size && typeof upload_status === "Boolean" ) {
+
+ console.log( ( current / total_size ) * 100 );
+ blob = file.slice( current, current + blob_size );
+ let upload_status = await _this.upload_blob( blob, file_path );
+
+ console.log( upload_status );
+
+ reader.readAsBinaryString( blob );
+ }
+ };
+ reader.readAsBinaryString( blob );
},
upload_data: {
@@ -1648,43 +1706,20 @@
entries: [],
},
- upload_read_directory: function( item, path ) {
-
- let _this = codiad.filemanager;
- let files = [];
-
- if( item.isFile ) {
-
- // Get file
- item.file( function( file ) {
-
- console.log("File:", path + file.name);
- });
- } else if( item.isDirectory ) {
-
- // Get folder contents
- let dirReader = item.createReader();
- dirReader.readEntries( function( entries ) {
-
- let total = entries.length;
- for( let i = 0;i < total; i++ ) {
-
- _this.upload_read_directory( entries[i], path + item.name + "/" );
- }
- });
- }
- },
-
upload_drop: function( e ) {
let _this = codiad.filemanager;
- let data = null;
+ let data = [];
let drop = $( '.drop-overlay' );
let items = e.originalEvent.dataTransfer.items;
- console.log( e );
+ for( let i = items.length;i--; ) {
+
+ data.push( items[i].webkitGetAsEntry() );
+ }
+
_this.upload_overlay_off();
- _this.upload( items )
+ _this.upload( data )
},
upload_overlay_off: function() {
@@ -1709,6 +1744,33 @@
_this.upload_data.timers.off = setTimeout( _this.upload_overlay_off, 1500 );
},
+ upload_read_directory: function( item, path, file_callback ) {
+
+ let _this = codiad.filemanager;
+ let files = [];
+
+ if( item.isFile ) {
+
+ // Get file
+ item.file( function( file ) {
+
+ file_callback( file, path );
+ });
+ } else if( item.isDirectory ) {
+
+ // Get folder contents
+ let dirReader = item.createReader();
+ dirReader.readEntries( function( entries ) {
+
+ let total = entries.length;
+ for( let i = 0;i < total; i++ ) {
+
+ _this.upload_read_directory( entries[i], path + item.name + "/", file_callback );
+ }
+ });
+ }
+ },
+
uploadToNode: function( path ) {
let _this = codiad.filemanager;