2021-05-31 07:17:07 +00:00
function create _base _view ( ) {
2021-06-04 12:05:05 +00:00
let tmp ;
tmp = document . createElement ( 'div' ) ;
2021-05-31 07:17:07 +00:00
tmp . innerHTML = ` <div id="tree"></div>
< div id = "files" > < / d i v > ` ;
document . getElementById ( "wrapper" ) . innerHTML = tmp . innerHTML ;
2021-06-04 12:05:05 +00:00
tmp = document . createElement ( 'div' ) ;
tmp . innerHTML = ` <div id='context_menu'>
< button id = "download" onclick = "download_file(this.parentElement.getAttribute('data-file-name'), this.parentElement.getAttribute('data-mimetype'));" > Download < / b u t t o n >
< button id = "remove" onclick = "remove_file(this.parentElement.getAttribute('data-file-name'));" > Remove < / b u t t o n >
< / d i v >
< div class = "new" >
< button class = "material-icon new_btn" type = "button" > add < / b u t t o n >
< div class = "new_content" >
< button class = "material-icon" onclick = "add_folder();" type = "button" > folder < / b u t t o n >
< button class = "material-icon" onclick = "add_file();" type = "button" > description < / b u t t o n >
< button class = "material-icon" onclick = "upload_file();" type = "button" > file _upload < / b u t t o n >
< / d i v >
< / d i v > `
document . getElementsByTagName ( 'main' ) [ 0 ] . appendChild ( tmp ) ;
2021-05-31 07:17:07 +00:00
}
2021-05-23 07:54:48 +00:00
function create _login _view ( ) {
let tmp = document . createElement ( 'div' ) ;
tmp . innerHTML = ` <div id="login">
< form >
< h1 > Login < / h 1 >
2021-05-31 07:17:07 +00:00
< span id = "error" > < / s p a n >
2021-05-23 07:54:48 +00:00
< div >
< label for = "username" > < / l a b e l >
< input type = "text" name = "username" id = "username" placeholder = "Username" value = "admin" >
< / d i v >
< div >
< label for = "password" > < / l a b e l >
< input type = "password" name = "password" id = "password" placeholder = "Password" value = "admin" >
< / d i v >
< div >
< button type = "button" value = "Login" onclick = "login();" > Login < / b u t t o n >
< / d i v >
< / f o r m >
< / d i v > ` ;
2021-06-04 12:05:05 +00:00
document . getElementById ( "wrapper" ) . innerHTML = tmp . innerHTML ;
2021-05-23 07:54:48 +00:00
}
2021-05-24 10:23:25 +00:00
function create _logout _view ( ) {
let logout = document . createElement ( 'div' ) ;
2021-06-04 12:05:05 +00:00
logout . id = 'logout' ;
2021-05-24 10:23:25 +00:00
logout . innerText = 'Logout' ;
logout . onclick = function ( ) {
2021-06-04 12:05:05 +00:00
httpGetAsync ( base _url + '/logout' , null , function ( response , code ) {
if ( code === 200 ) {
sessionStorage . removeItem ( 'authorization' ) ;
document . getElementById ( 'logout' ) . remove ( ) ;
document . getElementById ( 'context_menu' ) . parentElement . remove ( ) ;
create _login _view ( ) ;
} else {
2021-06-07 10:10:41 +00:00
try _to _parse _error ( response ) ;
2021-06-04 12:05:05 +00:00
}
} ) ;
2021-05-24 10:23:25 +00:00
}
document . getElementsByClassName ( 'app-header' ) [ 0 ] . appendChild ( logout ) ;
}
2021-06-04 12:05:05 +00:00
function get _icon ( type ) {
switch ( type . split ( '/' ) [ 0 ] ) {
case 'application' :
return 'apps' ;
case 'audio' :
return 'music_note' ;
case 'drawing' :
return 'gesture' ;
case 'image' :
return 'image' ;
case 'message' :
return 'mail' ;
case 'multipart' :
return 'note_add' ;
case 'text' :
return 'description' ;
case 'video' :
return 'movie' ;
default :
return 'article' ;
}
}
2021-05-31 07:17:07 +00:00
function create _main _view ( data ) {
2021-06-04 12:05:05 +00:00
let curr _dir = get _curr _path ( ) ;
2021-05-23 07:54:48 +00:00
2021-05-24 10:23:25 +00:00
let files = document . createElement ( 'div' ) ;
files . innerHTML = ` <div id="path"></div>
< table >
< thead >
< tr >
< th > < / t h >
< th > Name < / t h >
< th > Type < / t h >
< / t r >
< / t h e a d >
< tbody >
2021-05-31 07:17:07 +00:00
2021-05-24 10:23:25 +00:00
< / t b o d y >
< / t a b l e > ` ;
2021-05-23 07:54:48 +00:00
2021-05-31 07:17:07 +00:00
// Previous directory
2021-06-04 12:05:05 +00:00
if ( curr _dir !== '/' ) {
2021-05-31 07:17:07 +00:00
files . getElementsByTagName ( 'tbody' ) [ 0 ] . appendChild ( add _table _row ( "" , ".." , "" , "" , false , function ( ) {
window . history . pushState ( 'index' , 'Filemanager' , 'index.html?path=' + one _dir _back ( ) ) ;
2021-06-04 12:05:05 +00:00
path _changed ( ) ;
2021-05-31 07:17:07 +00:00
} ) ) ;
}
2021-05-23 07:54:48 +00:00
// Folders
for ( let i = 0 ; i < data . length ; i ++ ) {
if ( data [ i ] [ 'Type' ] === 'dir' ) {
2021-05-31 07:17:07 +00:00
files . getElementsByTagName ( 'tbody' ) [ 0 ] . appendChild ( add _table _row ( "folder" , data [ i ] [ 'Name' ] , "directory" , curr _dir , true , function ( ) {
2021-07-06 21:15:18 +00:00
let url = ''
if ( curr _dir === '/' ) {
url = 'index.html?path=' + curr _dir + data [ i ] [ 'Name' ] ;
} else {
url = 'index.html?path=' + curr _dir + '/' + data [ i ] [ 'Name' ] ;
}
window . history . pushState ( 'index' , 'Filemanager' , url ) ;
2021-06-04 12:05:05 +00:00
path _changed ( ) ;
2021-05-31 07:17:07 +00:00
} ) ) ;
2021-05-23 07:54:48 +00:00
}
}
// Files
for ( let i = 0 ; i < data . length ; i ++ ) {
if ( data [ i ] [ 'Type' ] !== 'dir' ) {
2021-06-04 12:05:05 +00:00
files . getElementsByTagName ( 'tbody' ) [ 0 ] . appendChild ( add _table _row ( get _icon ( data [ i ] [ 'Type' ] ) , data [ i ] [ 'Name' ] , data [ i ] [ 'Type' ] , curr _dir , true , function ( ) {
2021-07-06 21:15:18 +00:00
let url = ''
if ( curr _dir === '/' ) {
url = '/' + data [ i ] [ 'Name' ] ;
} else {
url = curr _dir + '/' + data [ i ] [ 'Name' ] ;
}
show _file _view ( url , data [ i ] [ 'Type' ] ) ;
2021-05-31 07:17:07 +00:00
} ) ) ;
2021-05-23 07:54:48 +00:00
}
}
// Path
2021-06-04 12:05:05 +00:00
let s = ` <div onclick="window.history.pushState('index', 'Filemanager', 'index.html?path='); path_changed()" class="arrow-pointer" style="z-index: 1000"><span>/</span></div> ` ;
2021-05-23 07:54:48 +00:00
if ( curr _dir !== null ) {
let folders = curr _dir . split ( '/' ) ;
for ( let i = 1 ; i < folders . length ; i ++ ) {
2021-06-04 12:05:05 +00:00
if ( folders [ i ] !== '' ) s = s . concat ( ` <div onclick="window.history.pushState('index', 'Filemanager', 'index.html?path= ${ folders . slice ( 0 , i + 1 ) . join ( '/' ) } '); path_changed()" class="arrow-pointer" style="z-index: ${ folders . length - i } "><span> ${ folders [ i ] } </span></div> ` ) ;
2021-05-23 07:54:48 +00:00
}
}
2021-05-24 10:23:25 +00:00
files . getElementsByTagName ( 'div' ) [ 0 ] . innerHTML = s ;
document . getElementById ( "files" ) . innerHTML = '' ;
document . getElementById ( "files" ) . appendChild ( files ) ;
2021-05-27 05:38:08 +00:00
// Close contextmenu
document . getElementsByTagName ( 'body' ) [ 0 ] . addEventListener ( 'click' , function ( ) {
2021-05-31 07:17:07 +00:00
document . getElementById ( 'context_menu' ) . style . display = 'none' ;
2021-05-27 05:38:08 +00:00
} ) ;
2021-05-24 10:23:25 +00:00
}
2021-05-31 07:17:07 +00:00
function add _table _row ( icon , name , type , path , context , click _function ) {
let tr = document . createElement ( 'tr' ) ;
tr . style . cursor = 'pointer' ;
tr . onclick = click _function ;
if ( context ) {
tr . addEventListener ( "contextmenu" , function ( e ) {
document . getElementById ( 'context_menu' ) . setAttribute ( 'data-file-name' , path + '/' + name ) ;
document . getElementById ( 'context_menu' ) . setAttribute ( 'data-mimetype' , type ) ;
document . getElementById ( 'context_menu' ) . style . display = 'block' ;
document . getElementById ( 'context_menu' ) . style . left = e . pageX + 'px' ;
document . getElementById ( 'context_menu' ) . style . top = e . pageY + 'px' ;
e . preventDefault ( ) ;
} ) ;
}
tr . innerHTML = ` <tr>
< td > < span class = "material-icon" > $ { icon } < / s p a n > < / t d >
< td > $ { name } < / t d >
< td > $ { type } < / t d >
< / t r > ` ;
return tr ;
2021-05-24 10:23:25 +00:00
}
function show _file _view ( data , type ) {
2021-05-31 07:17:07 +00:00
switch ( type . split ( '/' ) [ 0 ] ) {
case 'audio' :
2021-06-04 12:05:05 +00:00
create _modal ( ` File: <span> ${ data } </span> ` , ` ` ) ;
httpGetAsync ( base _url + data + '?format=base64' , null , function ( response , code ) {
if ( code === 200 ) {
change _modal _content ( ` <audio controls><source src="data:audio;base64, ${ response } ">Your browser does not support the audio element.</audio> ` ) ;
} else {
2021-06-07 10:10:41 +00:00
try _to _parse _error ( response ) ;
2021-06-04 12:05:05 +00:00
}
} ) ;
2021-05-31 07:17:07 +00:00
break ;
case 'image' :
2021-06-04 12:05:05 +00:00
create _modal ( ` File: <span> ${ data } </span> ` , ` ` ) ;
httpGetAsync ( base _url + data + '?format=base64' , null , function ( response , code ) {
if ( code === 200 ) {
2021-07-06 21:15:18 +00:00
change _modal _content ( ` <img style="width: 100%" src="data:image/png;base64, ${ response } " alt="Image"> ` ) ; /* TODO */
2021-06-04 12:05:05 +00:00
} else {
2021-06-07 10:10:41 +00:00
try _to _parse _error ( response ) ;
2021-06-04 12:05:05 +00:00
}
} ) ;
2021-05-31 07:17:07 +00:00
break ;
case 'text' :
2021-07-06 21:15:18 +00:00
create _modal ( ` File: <span> ${ data } </span> ` , ` ` , ` <button onclick="save_file(document.getElementById('modal_title').children[0].innerHTML, document.getElementById('textarea').value.trim())" type="button" value="Save">Save</button><button onclick="remove_modal();" type="button" value="Discard">Discard</button> ` ) ;
2021-06-04 12:05:05 +00:00
httpGetAsync ( base _url + data , null , function ( response , code ) {
if ( code === 200 ) {
2021-07-06 21:15:18 +00:00
change _modal _content ( ` <div style="width: 100%; height: 100%"><textarea id="textarea" style="width: calc(100% - 8px); height: calc(100% - 8px)"> ${ response } </textarea></div> ` ) ;
2021-06-04 12:05:05 +00:00
} else {
2021-06-07 10:10:41 +00:00
try _to _parse _error ( response ) ;
2021-06-04 12:05:05 +00:00
}
} ) ;
2021-05-31 07:17:07 +00:00
break ;
case 'video' :
2021-06-04 12:05:05 +00:00
create _modal ( ` File: <span> ${ data } </span> ` , ` ` ) ;
httpGetAsync ( base _url + data + '?format=base64' , null , function ( response , code ) {
if ( code === 200 ) {
2021-07-06 21:15:18 +00:00
change _modal _content ( ` <video controls style="width: 100%; height: 100%;"><source src="data:video;base64, ${ response } ">Your browser does not support the audio element.</video> ` ) ;
2021-06-04 12:05:05 +00:00
} else {
2021-06-07 10:10:41 +00:00
try _to _parse _error ( response ) ;
2021-06-04 12:05:05 +00:00
}
} ) ;
2021-05-31 07:17:07 +00:00
break ;
default :
2021-06-04 12:05:05 +00:00
create _modal ( ` File: <span> ${ data } </span> ` , ` Cannot open file! ` ) ;
2021-05-31 07:17:07 +00:00
break ;
2021-05-24 10:23:25 +00:00
}
2021-05-23 07:54:48 +00:00
}