From d6bc31d8ca74961f8bfbde90b28032d3fe44f053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Th=C3=A9riault?= Date: Wed, 15 Jan 2020 18:17:12 -0500 Subject: [PATCH] Redesign UI --- README.md | 3 +- resources/index.html | 494 +++++++++++++++++++++++++++++++++++++------ resources/script.js | 252 ---------------------- resources/style.css | 171 --------------- screenshot.png | Bin 34092 -> 0 bytes src/routes.rs | 46 +--- 6 files changed, 444 insertions(+), 522 deletions(-) delete mode 100644 resources/script.js delete mode 100644 resources/style.css delete mode 100644 screenshot.png diff --git a/README.md b/README.md index 418fe89..0033370 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,6 @@ A simple, light and standalone pastebin, URL shortener and file-sharing service * A tracking tool. No stats are stored to increase speed and reduce resource usage, if this is what you are looking for this tool is not for you. -![Screenshot of filite UI](screenshot.png) - ## Installation 1. Get the binary either from the [releases page](https://github.com/raftario/filite/releases) or [using Cargo](https://crates.io/crates/filite) @@ -59,6 +57,7 @@ pool_size = 4 files_dir = "files" # Max allowed size for file uploads, in bytes max_filesize = 10000000 + # Highlight.js configuration [highlight] # Theme to use diff --git a/resources/index.html b/resources/index.html index ad85bbb..9c669af 100644 --- a/resources/index.html +++ b/resources/index.html @@ -3,77 +3,449 @@ + + filite - -
-
- - - - -
- + +
+
+
+
+ +
+ /f/ + + +
+

Press space to randomize

+
+
+ + +
+
+ +
+
+ +
+ /t/ + + +
+

Press space to randomize

+
+
+ + +
+
+ +
+
+ diff --git a/resources/script.js b/resources/script.js deleted file mode 100644 index c6c5907..0000000 --- a/resources/script.js +++ /dev/null @@ -1,252 +0,0 @@ -const tabs = { - files: [ - document.querySelector("#files-tab"), - document.querySelector("#files-form"), - ], - links: [ - document.querySelector("#links-tab"), - document.querySelector("#links-form"), - ], - texts: [ - document.querySelector("#texts-tab"), - document.querySelector("#texts-form"), - ], -}; - -const inputs = { - files: [ - document.querySelector("#files-url"), - document.querySelector("#files-file"), - document.querySelector("#files-submit"), - ], - links: [ - document.querySelector("#links-url"), - document.querySelector("#links-forward"), - document.querySelector("#links-submit"), - ], - texts: [ - document.querySelector("#texts-url"), - document.querySelector("#texts-contents"), - document.querySelector("#texts-submit"), - ], -}; - -const used = { - files: [], - links: [], - texts: [], -}; - -let baseUrl = `${location.protocol}//${location.host}${location.pathname}`; -if (!baseUrl.endsWith("/")) { - baseUrl += "/"; -} - -const fetchUsed = () => { - fetch(`${baseUrl}f`) - .then((response) => response.json()) - .then((json) => (used.files = json)); - fetch(`${baseUrl}l`) - .then((response) => response.json()) - .then((json) => (used.links = json)); - fetch(`${baseUrl}t`) - .then((response) => response.json()) - .then((json) => (used.texts = json)); -}; -fetchUsed(); - -const randomUrl = () => { - return Math.floor(Math.random() * 2147483647).toString(36); -}; - -const updateClipboard = (data) => { - navigator.permissions - .query({ name: "clipboard-write" }) - .then((result) => { - if (result.state === "denied") { - throw new Error(); - } - }) - .then(() => navigator.clipboard.writeText(data)) - .then(() => alert("URL copied to clipboard")) - .catch(() => alert(data)); -}; - -for (const group in tabs) { - tabs[group][0].onclick = () => { - const active = document.querySelectorAll(".active"); - for (const el of active) { - el.classList.remove("active"); - } - for (const el of tabs[group]) { - el.classList.add("active"); - } - }; -} - -for (const group in inputs) { - const submitButton = inputs[group][inputs[group].length - 1]; - - const urlInput = inputs[group][0]; - urlInput.addEventListener("input", (e) => { - if (urlInput.value[urlInput.value.length - 1] === " ") { - urlInput.value = randomUrl(); - checkValidity(); - e.preventDefault(); - return; - } - - urlInput.value = urlInput.value - .replace(/[^0-9A-Za-z]/g, "") - .toLowerCase(); - if (parseInt(urlInput.value, 36) > 2147483647) { - urlInput.setCustomValidity( - "Base 36 integer below or equal to zik0zj" - ); - } else { - urlInput.setCustomValidity(""); - } - }); - - const checkValidity = () => { - if (used[group].some((x) => x.id === parseInt(urlInput.value, 36))) { - urlInput.classList.add("conflict"); - } else { - urlInput.classList.remove("conflict"); - } - submitButton.disabled = inputs[group].some( - (input) => input.validity != undefined && !input.validity.valid - ); - }; - - for (const input of inputs[group].filter( - (input) => - input instanceof HTMLInputElement || - input instanceof HTMLTextAreaElement - )) { - input.addEventListener("input", () => checkValidity()); - input.addEventListener("change", () => checkValidity()); - } - - const clearInputs = () => { - for (const input of inputs[group].filter( - (input) => - input instanceof HTMLInputElement || - input instanceof HTMLTextAreaElement - )) { - input.value = ""; - } - submitButton.disabled = true; - }; - - if (group === "files") { - const filesFileInput = inputs.files[1]; - const filesBrowseButton = document.querySelector("#files-browse"); - const filesValueInput = document.querySelector("#files-value"); - filesFileInput.addEventListener("change", () => { - filesValueInput.value = filesFileInput.files[0].name || ""; - }); - filesBrowseButton.onclick = () => { - filesFileInput.click(); - }; - filesValueInput.onfocus = (e) => { - e.preventDefault(); - filesValueInput.blur(); - return false; - }; - - submitButton.addEventListener("click", () => { - const file = filesFileInput.files[0]; - - if (!file) { - alert(new Error("No file selected")); - return; - } - - let fileReader = new FileReader(); - fileReader.onload = () => { - const id = urlInput.value; - const url = `${baseUrl}f/${id}`; - - const base64 = btoa(fileReader.result); - const filename = file.name; - let status; - fetch(url, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ base64, filename }), - }) - .then((response) => { - status = response.status; - return response.text(); - }) - .then((text) => { - if (status !== 201) { - throw new Error(text); - } else { - updateClipboard(url); - clearInputs(); - filesValueInput.value = ""; - fetchUsed(); - } - }) - .catch((error) => alert(error)); - }; - fileReader.readAsBinaryString(file); - }); - } else if (group === "links") { - submitButton.addEventListener("click", () => { - const id = urlInput.value; - const forward = inputs.links[1].value; - - const url = `${baseUrl}l/${id}`; - let status; - fetch(url, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ forward }), - }) - .then((response) => { - status = response.status; - return response.text(); - }) - .then((text) => { - if (status !== 201) { - throw new Error(text); - } else { - updateClipboard(url); - clearInputs(); - fetchUsed(); - } - }) - .catch((error) => alert(error)); - }); - } else if (group === "texts") { - submitButton.addEventListener("click", () => { - const id = urlInput.value; - const contents = inputs.texts[1].value; - - const url = `${baseUrl}t/${id}`; - let status; - fetch(url, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ contents, highlight: true }), - }) - .then((response) => { - status = response.status; - return response.text(); - }) - .then((text) => { - if (status !== 201) { - throw new Error(text); - } else { - updateClipboard(url); - clearInputs(); - fetchUsed(); - } - }) - .catch((error) => alert(error)); - }); - } -} diff --git a/resources/style.css b/resources/style.css deleted file mode 100644 index 6cd8818..0000000 --- a/resources/style.css +++ /dev/null @@ -1,171 +0,0 @@ -html, -body { - margin: 0px; - padding: 0px; - width: 100vw; - height: 100vh; - overflow-x: hidden; -} - -html { - font-family: sans-serif; - font-size: 200%; -} - -body { - display: grid; - grid-template: - [r1s] "nav" 2rem [r1e] - [r2s] "main" auto [r2e] - / auto; - background-color: #002b36; - color: #839496; -} - -::placeholder { - color: #586e75; -} - -nav { - display: flex; - justify-content: space-evenly; - grid-area: nav; - background-color: #073642; -} - -nav div { - display: flex; - justify-content: center; - align-items: center; - flex-grow: 1; - font-size: 1rem; - border-bottom: 0.0625rem solid #586e75; -} - -nav div:hover { - background-color: #002b36; - color: #93a1a1; - cursor: pointer; -} - -nav div.active { - background-color: #002b36; - color: #93a1a1; - border-top: 0.0625rem solid #586e75; - border-right: 0.0625rem solid #586e75; - border-left: 0.0625rem solid #586e75; - border-bottom: none; -} - -main { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - grid-area: main; -} - -main div { - display: none; -} - -main div.active { - display: block; -} - -main div label { - display: block; - margin-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1rem; -} - -main div input[type="text"], -main div input[type="url"] { - display: block; - padding: 0.5rem 1rem; - width: calc(75vw - 2rem); - background-color: #073642; - color: #839496; - font-size: 1rem; - border: none; -} - -main div textarea { - display: block; - padding: 0.5rem 1rem; - width: calc(75vw - 2rem); - height: 25vh; - background-color: #073642; - color: #839496; - font-family: monospace; - font-size: 0.5rem; - border: none; -} - -main div input[type="text"]:invalid, -main div input[type="url"]:invalid, -main div textarea:invalid { - border: 0.0625rem solid #dc322f; -} - -.conflict { - border: 0.0625rem solid #b58900 !important; -} - -main div button { - display: block; - padding: 0.5rem 1rem; - width: 75vw; - background-color: #073642; - color: #839496; - font-size: 1rem; - border: 0.0625rem solid #586e75; -} - -main div button:hover, -main div button:focus { - background-color: #002b36; - color: #93a1a1; - cursor: pointer; -} - -main div button:disabled { - background-color: #073642; - color: #586e75; - border: none; - cursor: default; -} - -main div div { - display: flex; - width: 75vw; -} - -main div div button { - width: auto; -} - -main div div input { - flex: 1; - padding: 0.5rem 1rem; - background-color: #073642; -} - -.mb1 { - margin-bottom: 2rem; -} - -.mb2 { - margin-bottom: 4rem; -} - -@media screen and (max-height: 720px) { - .mb1 { - margin-bottom: 1rem; - } - - .mb2 { - margin-bottom: 2rem; - } -} diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index d5a5a1820376bbb5bf110607c26d6eec18f52252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34092 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 %Bxf&keoE6R50A z^~{*3S8jHsC1QHoOFs_;SR0*#9Y>J4anQcTje7cTnMc_MKhaNNtk{~IgQ}UGO(ky5 zb1fDz=h)4d8}w1F-TMHIhcK4DbJJWSD=p`*N#66m=j}F;el+qf#~;97tC!aU=gFpD z=x5w{DYq~nz;5ef=)}+ri1pQVDNmkE;wUP|F9{CAw*b+5;d3lF>Mz z;p?}6Y7fi!F;emaM-Q&7wQH%HQ~s)bcaEL^0Zga1EPC)$4SD4wXZ9!ua&Mxcq`=k9 zkf;2jx}q7qz=UR3n-6qLwXD(8_nq)uU=_$nH><$$b�(+*`4^$>J(-1!msSR#cK< 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 diff --git a/src/routes.rs b/src/routes.rs index 6acf90b..44a4ffc 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -219,39 +219,17 @@ macro_rules! random_id { #[cfg(feature = "dev")] lazy_static! { - static ref RESOURCES_DIR: PathBuf = { - let mut ressources_dir = PathBuf::new(); - ressources_dir.push(get_env!("CARGO_MANIFEST_DIR")); - ressources_dir.push("resources"); - ressources_dir - }; - static ref HTML_PATH: PathBuf = { - let mut html_path = RESOURCES_DIR.clone(); - html_path.push("index.html"); - html_path - }; - static ref JS_PATH: PathBuf = { - let mut js_path = RESOURCES_DIR.clone(); - js_path.push("script.js"); - js_path - }; - static ref CSS_PATH: PathBuf = { - let mut css_path = RESOURCES_DIR.clone(); - css_path.push("style.css"); - css_path + static ref INDEX_PATH: PathBuf = { + let mut index_path = PathBuf::new(); + index_path.push(get_env!("CARGO_MANIFEST_DIR")); + index_path.push("resources"); + index_path.push("index.html"); + index_path }; } #[cfg(not(feature = "dev"))] -lazy_static! { - static ref INDEX_CONTENTS: String = { - let html = include_str!("../resources/index.html"); - let js = include_str!("../resources/script.js"); - let css = include_str!("../resources/style.css"); - - html.replace("{{ js }}", js).replace("{{ css }}", css) - }; -} +static INDEX_CONTENTS: &str = include_str!("../resources/index.html"); static HIGHLIGHT_CONTENTS: &str = include_str!("../resources/highlight.html"); const HIGHLIGHT_LANGUAGE: &str = r#""#; @@ -269,15 +247,11 @@ pub async fn index( let contents = { #[cfg(feature = "dev")] { - let html = fs::read_to_string(&*HTML_PATH).expect("Can't read index.html"); - let js = fs::read_to_string(&*JS_PATH).expect("Can't read script.js"); - let css = fs::read_to_string(&*CSS_PATH).expect("Can't read style.css"); - - html.replace("{{ js }}", &js).replace("{{ css }}", &css) + fs::read_to_string(&*INDEX_PATH).expect("Can't read index.html") } #[cfg(not(feature = "dev"))] { - (&*INDEX_CONTENTS).clone() + INDEX_CONTENTS.to_owned() } }; @@ -670,7 +644,7 @@ pub mod texts { ) } - /// PUT a new text entry + /// POST a new text entry pub async fn post( request: HttpRequest, body: web::Json,