From 060b9c863b105f5b829a7931d96dcf198ea0e714 Mon Sep 17 00:00:00 2001 From: hffqyd Date: Thu, 20 Jul 2023 14:26:42 +0800 Subject: [PATCH] version 1.2.0 --- main.js | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++ style.css | 48 ++++++++++++++++++++++++++++ template.html | 18 +++++++---- tw5server.nim | 19 ++++++------ 4 files changed, 156 insertions(+), 15 deletions(-) create mode 100644 main.js diff --git a/main.js b/main.js new file mode 100644 index 0000000..ba3d7bc --- /dev/null +++ b/main.js @@ -0,0 +1,86 @@ +function create_li(f) { + var li = document.createElement('li'); + li.setAttribute('class', 'i-file entypo'); + li.innerHTML = '' + f + ''; + return li; +} + +function add_to_ul(f) { + var ul = document.querySelector('ul'); + var li = create_li(f); + if (ul.children[0].innerText == '..') { + ul.insertBefore(li, ul.children[1]); // first is the back link if in sub-dir + } else { + ul.insertBefore(li, ul.children[0]); + } +} + +function notify(note) { + var nojump = document.querySelector('#nojump'); + nojump.innerHTML = note; +} + +function post_file(file) { + var formdata = new FormData(); + formdata.append("file", file, file.name); + var override = document.querySelector('#override_check'); + if (override.checked) { + formdata.append('override', 'yes'); + } + // request + var xhr = new XMLHttpRequest(); + xhr.open("POST", '', true); + xhr.onreadystatechange = function () { + if (xhr.readyState != 4 || xhr.status != 200) { + notify('Error: ' + xhr.responseText); + } else { + notify('Saved to ' + xhr.responseText); + add_to_ul(xhr.responseText); + } +} + //var boundary = '-------------------' + Date.now().toString(16); + //xhr.setRequestHeader('Content-Type', 'multipart\/form-data; boundary=' + boundary); + xhr.send(formdata); +} + +var submit = document.querySelector('label[type="submit"]'); +submit.addEventListener('click', function(event) { + event.preventDefault(); + + var input = document.querySelector('input[type="file"]'); + if (input.files.length < 1) {return;} + const file = input.files[0]; + + post_file(file); +}) + +// drag to upload +var target = document.querySelector('body'); +var changed_color = '#dcf8c6'; //'#BEDDAA' +var original_color = target.getAttribute('background-color'); +if (original_color == null) { + original_color = ''; +} + +target.addEventListener('drop', function(event) { + event.preventDefault(); + if (event.type === 'drop') { + var file = event.dataTransfer.files[0]; + post_file(file) + } + target.style.backgroundColor = original_color; +}) + +target.addEventListener('dragenter', function (event) { + event.preventDefault(); + target.style.backgroundColor = changed_color; +}) +target.addEventListener('dragover', function (event) { + event.preventDefault(); + target.style.backgroundColor = changed_color; +}) +target.addEventListener('dragleave', function (event) { + event.preventDefault(); + target.style.backgroundColor = original_color; +}) + diff --git a/style.css b/style.css index 2e9decb..631b208 100644 --- a/style.css +++ b/style.css @@ -35,6 +35,54 @@ body { margin: 0; } +.button-primary { + color: white; + border-radius: 4px; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + background-color: rgb(0, 120, 231); + border: none; + padding: 0.2em 0.2em; + font-family: inherit; + line-height: normal; + user-select: none; + display: inline-block; +} + +.button-primary-hover, +.button-primary:hover, +.button-primary:focus { + background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10)); +} +.button-primary:focus { + outline: 0; +} +.button-primary-active, +.button-primary:active { + box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset; + border-color: #000; +} + +.button-success { +background: rgb(28, 184, 65); +font: 20px; +/* line-height: 1.4; */ +margin-left: 25%; +} + +#upload_button { +display: none; +} + + +#upload_button2 { +/* background-color: #f2d547; +border-radius: 3px; +display: inline-block; +padding: 1px; */ +margin-left: 2em; +margin-right: 25%; +} + #nojump { display:block; position:fixed; diff --git a/template.html b/template.html index 288d32a..101014b 100644 --- a/template.html +++ b/template.html @@ -9,14 +9,20 @@

$1

-

$3

- +
- - Override: - + + + +
+

$3

$4 $5 + - \ No newline at end of file + diff --git a/tw5server.nim b/tw5server.nim index d5b59c6..fa57cb2 100644 --- a/tw5server.nim +++ b/tw5server.nim @@ -13,17 +13,16 @@ import mimetypes import tables, strtabs -from jester/private/utils import parseMPFD - -type MultiData* = OrderedTable[string, tuple[fields: StringTableRef, body: string]] - from httpcore import HttpMethod, HttpHeaders +from parseBody import parseMPFD + const name = "TW5 server" - version = "1.0.0" + version = "1.2.0" style = staticRead("style.css") temp = staticRead("template.html") + js = staticRead("main.js") const usage = """ tw5server -a:localhost -p:8000 -d:dir -b:backup @@ -61,7 +60,7 @@ type # TODO: update web page after upload proc h_page(settings:NimHttpSettings, content, title, subtitle: string): string = var footer = """""" % [settings.name, settings.version] - result = temp % [title, style, subtitle, content, footer] + result = temp % [title, style, subtitle, content, footer, js] proc relativePath(path, cwd: string): string = var path2 = path @@ -158,7 +157,7 @@ proc savePost(req: Request, path, url_path: string, log: bool): NimHttpResponse file = body["file"] filename = file.fields["filename"] file_body = file.body - override = body.getOrDefault("write").body + override = body.getOrDefault("override").body var rsp_content = "" @@ -173,7 +172,7 @@ proc savePost(req: Request, path, url_path: string, log: bool): NimHttpResponse let rsp_msg = "Save file to " & newName msg = rsp_msg & " in " & path - rsp_content = rsp_msg + rsp_content = newName code = Http200 logmsg(msg, log) else: @@ -181,7 +180,7 @@ proc savePost(req: Request, path, url_path: string, log: bool): NimHttpResponse let rsp_msg = "Save file to " & filename msg = rsp_msg & " in " & path - rsp_content = rsp_msg + rsp_content = filename code = Http200 logmsg(msg, log) return (code: code, content: rsp_content, headers: {"status": "ok"}.newHttpHeaders()) @@ -311,6 +310,8 @@ echo(" Serving url: ", address, ":", port) echo("Serving path: ", dir) echo(" Backup dir: ", backup) +createDir(dir / backup) + proc handleCtrlC() {.noconv.} = write(stdout, "\rClean backups (y to clean): ") let clean = readLine(stdin)