F diff --git a/css/style.css b/css/style.css --- a/css/style.css +++ b/css/style.css}.filecontents {- background: white;- }-- .filecontents {padding: 0.8rem;font-size: 1.1rem;}F diff --git a/loggedin.js b/loggedin.js --- a/loggedin.js +++ b/loggedin.js}function opendir() {+update_path_visuals();var data = new FormData();}files.sort((a, b) => {- if (get_path() == "/" && a.filename == "trash")- return 2;- if (a.is_directory && !b.is_directory)- return -1;- if (!a.is_directory && b.is_directory)- return 1;+ if (a.is_directory && !b.is_directory)+ return -1;+ if (!a.is_directory && b.is_directory)+ return 1;return a.filename.localeCompare(b.filename);});}}- function move_to_trash(filename) {- move_file("/trash", filename, path_combine(get_path(), filename));- }-function delete_file(filename) {var file_full_path = path_combine(get_path(), filename);xhr.send(data);}- function move_file(new_folder, filename, new_filename) {- if (!new_filename)- new_filename = filename;-+ function move_file(new_folder, filename) {var data = new FormData();- data.append('old_folder', get_path());- data.append('new_folder', new_folder);- data.append('filename', filename);- data.append('new_filename',new_filename);+ data.append('old_folder', get_path());+ data.append('new_folder', new_folder);+ data.append('filename', filename);var xhr = new XMLHttpRequest();xhr.open('POST', '/php/move.php', true);var elemRect = dragging.getBoundingClientRect();dragging_offset_x = e.clientX - elemRect.left;dragging_offset_y = -e.clientY + elemRect.top;-+if (dragging_placeholder)obj.parentNode.insertBefore(dragging_placeholder, obj);function drop_handler(dst, src) {if (dst.is_directory) {- if (get_path() == "/" && dst.filename == "trash") {- move_to_trash(src.filename);- } else {- move_file(path_combine(get_path(), dst.filename), src.filename);- }+ move_file(path_combine(get_path(), dst.filename), src.filename);} else {alert(`Dropped ${dst.filename} on ${src.filename}`);}}function add_link_functionality(link, length) {- link.onclick = (e) => {+ link.onclick = () => {focus.pwd.length = length,- openfile(true);+ openfile(true);}link.onmouseup = (e) => {var h2 = document.createElement('h2');wnd_html.appendChild(h2);- //h2.onmousedown = (e) => {- //begin_drag(e, wnd_html);- // e.preventDefault();- //};+ h2.onmousedown = (e) => {+ begin_drag(e, wnd_html);+ e.preventDefault();+ };path = document.createElement('div');path.classList.add('path');var filename = document.createElement('div');if (fileview.is_directory) {- if (get_path() == "/" && fileview.filename == "trash")+ if (fileview.filename == "trash")img.src="/mimeicons/user-trash.png";elseimg.src="/mimeicons/directory.png";['Open in New Window', () => {alert('not implemented')}],['Rename', () => { rename_file(fileview.filename); }],['Share', () => {alert('not implemented')}],- ['Delete', () => { move_to_trash(fileview.filename); }],+ ['Delete', () => { delete_file(fileview.filename); }],]);}e.preventDefault();F diff --git a/php/database.php b/php/database.php --- a/php/database.php +++ b/php/database.phpwe remove the node and1. move the file represented by the node to the trash folder2. remove the file+ 3. if node is a directory - delete all children nodesdepends on the conf file*/function delete_node_by_id(int $node_id)}}++ function unlink_nodes(int $dir_id, int $node_id)+ {+ $prep=$this->pdo->prepare("delete from node_links+ where directory_id=:dir_id and node_id=:node_id+ ");+ $prep->bindParam(':dir_id',$dir_id);+ $prep->bindParam(':node_id',$node_id);+ if($prep->execute()==false)+ {+ error_log("there was an error with the first statement in unlink_nodes");+ return;+ }+ $prep=$this->pdo->prepare("select node_id+ from node_links+ where node_id=:id+ ");+ $prep->bindParam(':id',$node_id);+ if($prep->execute()==false)+ {+ error_log("there was an error with the second statement in unlink_nodes");+ return;+ }+ if(count($prep->fetchALL(PDO::FETCH_ASSOC))==0)+ {+ delete_node_by_id($node_id);+ }+++ }+function create_home_directory():int{$ret=$this->create_dangling_directory();F diff --git a/php/move.php b/php/move.php --- a/php/move.php +++ b/php/move.phpexit(1);}- $new_filename = $_POST["filename"];- $old_filename = $_POST["filename"];-- if (isset($_POST['new_filename']))- $new_filename = $_POST['new_filename'];-+ $filename = $_POST["filename"];$old_folder = $_POST["old_folder"];$new_folder = $_POST["new_folder"];$user = $_SESSION['user_object'];// Check if the filename is taken in the new dir$contents_of_new_dir = $database->get_links_of($new_dir);foreach ($contents_of_new_dir as $c) {- if ($c['name'] == $new_filename) {- error_log("filename $new_filename taken in $new_folder");+ if ($c['name'] == $filename) {+ error_log("filename $filename taken in $new_folder");http_response_code(409);exit(0);}$file_node = null;$contents_of_old_dir = $database->get_links_of($old_dir);foreach ($contents_of_old_dir as $c) {- if ($c['name'] == $old_filename) {+ if ($c['name'] == $filename) {$file_node = $c['id'];break;}}if ($file_node == null) {- error_log("/php/move.php failed - file $old_folder/$new_filename doesn't exist");+ error_log("/php/move.php failed - file $old_folder/$filename doesn't exist");http_response_code(409);exit(0);}// Update the node_link$move = $database->pdo->prepare("UPDATE node_links- SET directory_id = :new_dir,- name = :new_filename+ SET directory_id = :new_dirWHERE directory_id = :old_dirAND node_id = :file_node- AND name = :old_filename+ AND name = :filename");- $move->bindParam(':new_dir', $new_dir);- $move->bindParam(':old_dir', $old_dir);- $move->bindParam(':file_node', $file_node);- $move->bindParam(':old_filename', $old_filename);- $move->bindParam(':new_filename', $new_filename);+ $move->bindParam(':new_dir', $new_dir);+ $move->bindParam(':old_dir', $old_dir);+ $move->bindParam(':file_node', $file_node);+ $move->bindParam(':filename', $filename);if(!$move->execute()) {error_log("extremely sad shit");F diff --git a/sql/fileshare.sql b/sql/fileshare.sql --- a/sql/fileshare.sql +++ b/sql/fileshare.sqldrop table if exists node_access;drop table if exists users;drop table if exists node_links;+ drop table if exists trash;+ drop trigger if exists delete_on_zero_links;drop table if exists nodes;node_id int not null,name varchar(100) not null default 'no name',note varchar(200) not null default "",- check (directory_id != node_id),foreign key (directory_id) references nodes(node_id) on delete cascade,foreign key (node_id) references nodes(node_id) on delete cascade);+ create table trash (+ node_id int not null,+ foreign key (node_id) references nodes(node_id) on delete cascade+ );++ create trigger delete_on_zero_links+ after delete+ on node_links+ for each row+ insert into trash+ select nodes.node_id+ from nodes+ where nodes.node_id not in (select node_id from node_links) and nodes.node_id=old.node_id;++ /*+ create trigger delete_links+ after delete+ on nodes+ for each row+ delete from+ */