Skip to content

Commit

Permalink
feat(filebrowser): allow viewing images from browser
Browse files Browse the repository at this point in the history
  • Loading branch information
ravenclaw900 committed Oct 31, 2021
1 parent 59bd15e commit 921913d
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 35 deletions.
15 changes: 9 additions & 6 deletions src/backend/src/sockets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,6 @@ async fn browser_refresh(
.send(Message::text(SerJson::serialize_json(
&types::BrowserList {
contents: systemdata::browser_dir(std::path::Path::new(dir_path)),
currentpath: dir_path.to_string(),
},
)))
.await;
Expand All @@ -216,7 +215,6 @@ async fn browser_handler(
contents: systemdata::browser_dir(std::path::Path::new(
&std::env::var_os("HOME").unwrap(),
)),
currentpath: std::env::var("HOME").unwrap(),
},
)))
.await;
Expand All @@ -233,7 +231,6 @@ async fn browser_handler(
contents: systemdata::browser_dir(std::path::Path::new(
&data.args[0],
)),
currentpath: data.args[0].clone(),
},
)))
.await;
Expand All @@ -242,13 +239,19 @@ async fn browser_handler(
let _send = (*socket_send)
.send(Message::text(SerJson::serialize_json(
&types::BrowserFileData {
data: std::fs::read_to_string(std::path::Path::new(&data.args[0]))
.unwrap(),
currentpath: data.args[0].clone(),
textdata: std::fs::read_to_string(std::path::Path::new(
&data.args[0],
))
.unwrap(),
},
)))
.await;
}
"img" => {
let _send = (*socket_send)
.send(Message::binary(std::fs::read(&data.args[0]).unwrap()))
.await;
}
"save" => {
std::fs::write(std::path::Path::new(&data.args[0]), &data.args[1]).unwrap();
}
Expand Down
4 changes: 1 addition & 3 deletions src/backend/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,10 @@ pub struct BrowserDirData {

#[derive(SerJson)]
pub struct BrowserFileData {
pub data: String,
pub currentpath: String,
pub textdata: String,
}

#[derive(SerJson)]
pub struct BrowserList {
pub contents: Vec<BrowserDirData>,
pub currentpath: String,
}
Binary file modified src/frontend/.yarn/install-state.gz
Binary file not shown.
13 changes: 10 additions & 3 deletions src/frontend/src/App.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
services?: services[];
// File browser page
contents?: browser[];
currentpath?: string;
textdata?: string;
// Global
update?: string;
}
Expand Down Expand Up @@ -76,12 +76,19 @@
let socket;
let socketData: socketData = {};
let binData = "";
let shown = false;
let menu = window.innerWidth > 768;
let update = "";
const socketMessageListener = (e) => {
socketData = JSON.parse(e.data);
if (typeof e.data === "string") {
socketData = JSON.parse(e.data);
binData = "";
} else {
socketData = {};
binData = URL.createObjectURL(e.data);
}
if (socketData.update != undefined) {
update = socketData.update;
}
Expand Down Expand Up @@ -189,7 +196,7 @@
><Management {socket} {socketData} /></Route
>
<Route path="browser"
><FileBrowser {socket} {socketData} /></Route
><FileBrowser {socket} {socketData} {binData} /></Route
>
<Route path="service"
><Service {socket} {socketData} /></Route
Expand Down
49 changes: 26 additions & 23 deletions src/frontend/src/pages/FileBrowser.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,15 @@
export let socket;
export let socketData: broserList;
export let binData;
let fileDataSet = false;
let pathArray;
let fileData;
let fileText;
let fileDiv;
// TODO: better solution than just assuming dashboard is being run by root
let currentPath = "/root";
let selPath: browser = {
name: "",
Expand All @@ -38,14 +41,13 @@
size: 0,
};
$: console.log(socketData);
$: autosize(fileText), autosize.update();
$: console.log(binData.length, binData.byteLength);
// Skip first array element (empty string)
$: socketData.currentpath != undefined &&
(pathArray = socketData.currentpath.split("/").slice(1));
$: socketData.data != undefined &&
$: pathArray = currentPath.split("/").slice(1);
$: socketData.textdata != undefined &&
!fileDataSet &&
((fileData = socketData.data), (fileDataSet = true));
((fileData = socketData.textdata), (fileDataSet = true));
// Set innerText manually to avoid issues with highlighting
$: fileDiv != undefined &&
((fileDiv.innerHTML = fileData
Expand All @@ -55,8 +57,8 @@
interface broserList {
contents?: browser[];
data?: string;
currentpath: string;
textdata?: string;
currentpath?: string;
}
interface browser {
Expand Down Expand Up @@ -159,14 +161,15 @@
</script>

<main class="min-h-full">
{#if socketData.contents != undefined || socketData.data != undefined}
{#if socketData.contents != undefined || socketData.textdata != undefined || binData != ""}
<div class="flex">
<div class="w-11/12">
<div class="mb-2 p bg-white dark:bg-black">
<button
class="btn px-2 focus:outline-none"
on:click={() => {
sendCmd("/", "cd");
currentPath = "/";
}}>/</button
>
{#each pathArray as path}
Expand All @@ -187,6 +190,7 @@
}
}
sendCmd(fullPath, "cd");
currentPath = fullPath;
}}>{path}</button
>
{/if}
Expand All @@ -213,11 +217,15 @@
case "text":
sendCmd(contents.path, "open");
break;
case "image":
sendCmd(contents.path, "img");
break;
default:
alert(
"ERROR: can't view that type of file"
);
}
currentPath = contents.path;
}}
on:click={() => (selPath = contents)}
>
Expand All @@ -239,7 +247,7 @@
</tr>
{/each}
</table>
{:else if socketData.data != undefined}
{:else if socketData.textdata != undefined}
<div class="flex">
<textarea
bind:value={fileData}
Expand All @@ -254,6 +262,10 @@
class="w-full microlight -ml-[100%] font-mono whitespace-pre bg-white dark:bg-black text-sm z-10 tab-4 !overflow-x-scroll p-px"
/>
</div>
{:else if binData != ""}
<div>
<img src={binData} alt="Unknown" />
</div>
{/if}
</div>
<div
Expand All @@ -267,10 +279,7 @@
let name = prompt(
"Please enter the name of the new directory"
);
sendCmd(
socketData.currentpath + "/" + name,
"mkdir"
);
sendCmd(currentPath + "/" + name, "mkdir");
}}><Fa icon={faFolderPlus} size="lg" /></span
>
<span
Expand All @@ -280,10 +289,7 @@
let name = prompt(
"Please enter the name of the new file"
);
sendCmd(
socketData.currentpath + "/" + name,
"mkfile"
);
sendCmd(currentPath + "/" + name, "mkfile");
}}><Fa icon={faFileMedical} size="lg" /></span
>
{#if selPath.path != ""}
Expand All @@ -294,10 +300,7 @@
let name = prompt(
"Please enter the new name of the file"
);
rename(
selPath.path,
socketData.currentpath + "/" + name
);
rename(selPath.path, currentPath + "/" + name);
}}><Fa icon={faICursor} size="lg" /></span
>
{#if selPath.maintype == "dir"}
Expand All @@ -322,10 +325,10 @@
>
{/if}
{/if}
{:else if socketData.data != undefined}
{:else if socketData.textdata != undefined}
<span
class="cursor-pointer"
on:click={() => sendFile(socketData.currentpath)}
on:click={() => sendFile(currentPath)}
><Fa icon={faSave} size="lg" /></span
>{/if}
</div>
Expand Down

0 comments on commit 921913d

Please sign in to comment.