diff --git a/svelte/src/file_viewer/DetailsWindow.svelte b/svelte/src/file_viewer/DetailsWindow.svelte index f8a8736..23a6b18 100644 --- a/svelte/src/file_viewer/DetailsWindow.svelte +++ b/svelte/src/file_viewer/DetailsWindow.svelte @@ -39,7 +39,7 @@ let chart_timespans = [ ] let update_chart = (timespan, interval) => { - // If the timespan is 0 we calculate the maximum timespan based on the age + // If the timespan is 0 we calculate the maximum timespan based on the age // of the file if (timespan === 0) { let minutes_since_upload = (new Date().getTime() - Date.parse(file.date_upload)) / 1000 / 60 diff --git a/svelte/src/filesystem/DetailsWindow.svelte b/svelte/src/filesystem/DetailsWindow.svelte index 6d663ec..ecb9b9b 100644 --- a/svelte/src/filesystem/DetailsWindow.svelte +++ b/svelte/src/filesystem/DetailsWindow.svelte @@ -1,21 +1,140 @@ - - - + +

Node details

+

Node details

- - - + + {#if state.base.id} @@ -24,27 +143,60 @@ export const toggle = () => {visible = !visible} {/if} {#if state.base.type === "file"} - - - + + + + + + + + + + + + + {/if} + + {#if share_url !== ""} + {/if} - - - - - - - - - - - - - -
Name{state.base.name}
Path{state.base.path}
Type{state.base.type}
Date created{formatDate(state.base.date_created, true, true, true)}
Date modified{formatDate(state.base.date_modified, true, true, true)}
Date created{formatDate(state.base.created, true, true, true)}
Date modified{formatDate(state.base.modified, true, true, true)}
Mode{state.base.mode_string}
File type{state.base.file_type}
File size{formatDataVolume(state.base.file_size)}
SHA256 sum{state.base.sha256_sum}
File type{state.base.file_type}
File size{formatDataVolume(state.base.file_size)}
Unique downloads{formatThousands(total_downloads)}
Free bandwidth used + {formatDataVolume(total_bandwidth_free, 4)} + ( {formatThousands(total_bandwidth_free)} B ), + {(total_bandwidth_free/state.base.file_size).toFixed(1)}x file size +
Premium bandwidth used + {formatDataVolume(total_bandwidth_paid, 4)} + ( {formatThousands(total_bandwidth_paid)} B ), + {(total_bandwidth_paid/state.base.file_size).toFixed(1)}x file size +
SHA256 sum{state.base.sha256_sum}
Direct URL{direct_url}
Share URL{share_url}
Stat - Open stat API -
Direct link - Open direct link -

Bucket details

ID{state.root.id}
Name{state.root.name}
Date created{formatDate(state.root.date_created, true, true, true)}
Date modified{formatDate(state.root.date_modified, true, true, true)}
+ +

Download statistics

+ +
+ {#each chart_timespans as ts} + + {/each} +
+ +
+ + diff --git a/svelte/src/filesystem/FileStats.svelte b/svelte/src/filesystem/FileStats.svelte index 5461a34..9d4897b 100644 --- a/svelte/src/filesystem/FileStats.svelte +++ b/svelte/src/filesystem/FileStats.svelte @@ -50,7 +50,7 @@ const update_base = async base => { window.setTimeout(() => { if (socket === null) { - state_update() + update_base(base) } }, 3000) } diff --git a/svelte/src/filesystem/FilesystemAPI.js b/svelte/src/filesystem/FilesystemAPI.js index 0ee3144..e0b12b0 100644 --- a/svelte/src/filesystem/FilesystemAPI.js +++ b/svelte/src/filesystem/FilesystemAPI.js @@ -94,3 +94,17 @@ export const fs_search = async (bucket, path, term, limit = 10) => { } return resp.json() } + +export const fs_timeseries = async (bucket, path, start, end, interval = 60) => { + const resp = await fetch( + fs_path_url(bucket, path) + + "?timeseries" + + "&start=" + start.toISOString() + + "&end=" + end.toISOString() + + "&interval=" + interval + ) + if (resp.status >= 400) { + throw await resp.text() + } + return resp.json() +} diff --git a/svelte/src/filesystem/FilesystemUtil.js b/svelte/src/filesystem/FilesystemUtil.js index 9f6d676..59fa16f 100644 --- a/svelte/src/filesystem/FilesystemUtil.js +++ b/svelte/src/filesystem/FilesystemUtil.js @@ -4,7 +4,12 @@ export const fs_split_path = (path) => { } export const fs_path_url = (bucket, path) => { - return window.api_endpoint + "/filesystem/" + bucket + encodeURIComponent(path) + // Encode all path elements separately to preserve forward slashes + let split = path.split("/") + for (let i = 0; i < split.length; i++) { + split[i] = encodeURIComponent(split[i]) + } + return api_endpoint + "/filesystem/" + bucket + split.join("/") } export const fs_file_url = (bucket, path) => { diff --git a/svelte/src/filesystem/viewers/Zip.svelte b/svelte/src/filesystem/viewers/Zip.svelte index a8369c2..38ad7eb 100644 --- a/svelte/src/filesystem/viewers/Zip.svelte +++ b/svelte/src/filesystem/viewers/Zip.svelte @@ -64,7 +64,7 @@ const recursive_size = (file) => { Compressed size: {formatDataVolume(state.base.file_size, 3)}
Uncompressed size: {formatDataVolume(uncomp_size, 3)} (Ratio: {comp_ratio.toFixed(2)}x)
- Uploaded on: {formatDate(state.base.date_created, true, true, true)} + Uploaded on: {formatDate(state.base.created, true, true, true)}