Skip to content

Commit 060b9c8

Browse files
committed
version 1.2.0
1 parent 1e16b35 commit 060b9c8

File tree

4 files changed

+156
-15
lines changed

4 files changed

+156
-15
lines changed

main.js

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
function create_li(f) {
2+
var li = document.createElement('li');
3+
li.setAttribute('class', 'i-file entypo');
4+
li.innerHTML = '<a href="' + f + '">' + f + '</a>';
5+
return li;
6+
}
7+
8+
function add_to_ul(f) {
9+
var ul = document.querySelector('ul');
10+
var li = create_li(f);
11+
if (ul.children[0].innerText == '..') {
12+
ul.insertBefore(li, ul.children[1]); // first is the back link if in sub-dir
13+
} else {
14+
ul.insertBefore(li, ul.children[0]);
15+
}
16+
}
17+
18+
function notify(note) {
19+
var nojump = document.querySelector('#nojump');
20+
nojump.innerHTML = note;
21+
}
22+
23+
function post_file(file) {
24+
var formdata = new FormData();
25+
formdata.append("file", file, file.name);
26+
var override = document.querySelector('#override_check');
27+
if (override.checked) {
28+
formdata.append('override', 'yes');
29+
}
30+
// request
31+
var xhr = new XMLHttpRequest();
32+
xhr.open("POST", '', true);
33+
xhr.onreadystatechange = function () {
34+
if (xhr.readyState != 4 || xhr.status != 200) {
35+
notify('Error: ' + xhr.responseText);
36+
} else {
37+
notify('Saved to ' + xhr.responseText);
38+
add_to_ul(xhr.responseText);
39+
}
40+
}
41+
//var boundary = '-------------------' + Date.now().toString(16);
42+
//xhr.setRequestHeader('Content-Type', 'multipart\/form-data; boundary=' + boundary);
43+
xhr.send(formdata);
44+
}
45+
46+
var submit = document.querySelector('label[type="submit"]');
47+
submit.addEventListener('click', function(event) {
48+
event.preventDefault();
49+
50+
var input = document.querySelector('input[type="file"]');
51+
if (input.files.length < 1) {return;}
52+
const file = input.files[0];
53+
54+
post_file(file);
55+
})
56+
57+
// drag to upload
58+
var target = document.querySelector('body');
59+
var changed_color = '#dcf8c6'; //'#BEDDAA'
60+
var original_color = target.getAttribute('background-color');
61+
if (original_color == null) {
62+
original_color = '';
63+
}
64+
65+
target.addEventListener('drop', function(event) {
66+
event.preventDefault();
67+
if (event.type === 'drop') {
68+
var file = event.dataTransfer.files[0];
69+
post_file(file)
70+
}
71+
target.style.backgroundColor = original_color;
72+
})
73+
74+
target.addEventListener('dragenter', function (event) {
75+
event.preventDefault();
76+
target.style.backgroundColor = changed_color;
77+
})
78+
target.addEventListener('dragover', function (event) {
79+
event.preventDefault();
80+
target.style.backgroundColor = changed_color;
81+
})
82+
target.addEventListener('dragleave', function (event) {
83+
event.preventDefault();
84+
target.style.backgroundColor = original_color;
85+
})
86+

style.css

+48
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,54 @@ body {
3535
margin: 0;
3636
}
3737

38+
.button-primary {
39+
color: white;
40+
border-radius: 4px;
41+
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
42+
background-color: rgb(0, 120, 231);
43+
border: none;
44+
padding: 0.2em 0.2em;
45+
font-family: inherit;
46+
line-height: normal;
47+
user-select: none;
48+
display: inline-block;
49+
}
50+
51+
.button-primary-hover,
52+
.button-primary:hover,
53+
.button-primary:focus {
54+
background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10));
55+
}
56+
.button-primary:focus {
57+
outline: 0;
58+
}
59+
.button-primary-active,
60+
.button-primary:active {
61+
box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset;
62+
border-color: #000;
63+
}
64+
65+
.button-success {
66+
background: rgb(28, 184, 65);
67+
font: 20px;
68+
/* line-height: 1.4; */
69+
margin-left: 25%;
70+
}
71+
72+
#upload_button {
73+
display: none;
74+
}
75+
76+
77+
#upload_button2 {
78+
/* background-color: #f2d547;
79+
border-radius: 3px;
80+
display: inline-block;
81+
padding: 1px; */
82+
margin-left: 2em;
83+
margin-right: 25%;
84+
}
85+
3886
#nojump {
3987
display:block;
4088
position:fixed;

template.html

+12-6
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@
99
</head>
1010
<body>
1111
<h1>$1</h1>
12-
<h2>$3</h2>
13-
<iframe id="nojump" name="nojump" frameborder="0" seamless></iframe>
12+
<div id="nojump" name="nojump" frameborder="0"></div>
1413
<form method="post" enctype="multipart/form-data" target="nojump">
15-
<input type="file" name="file" value="file">
16-
Override: <input type="checkbox" name="write" value="yes">
17-
<input type="submit" name="submit" value="Submit">
14+
<input id="upload_button" type="file" name="file" value="file">
15+
<label class="button-primary" for="upload_button" id="upload_button2">Browse</label>
16+
<label for="override_check">
17+
<input type="checkbox" name="override" value="yes" id="override_check">Override
18+
</label>
19+
<label class="button-primary button-success" type="submit">Upload</label>
1820
</form>
21+
<h2>$3</h2>
1922
$4
2023
$5
24+
<script>
25+
$6
26+
</script>
2127
</body>
22-
</html>
28+
</html>

tw5server.nim

+10-9
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,16 @@ import
1313
mimetypes
1414

1515
import tables, strtabs
16-
from jester/private/utils import parseMPFD
17-
18-
type MultiData* = OrderedTable[string, tuple[fields: StringTableRef, body: string]]
19-
2016
from httpcore import HttpMethod, HttpHeaders
2117

18+
from parseBody import parseMPFD
19+
2220
const
2321
name = "TW5 server"
24-
version = "1.0.0"
22+
version = "1.2.0"
2523
style = staticRead("style.css")
2624
temp = staticRead("template.html")
25+
js = staticRead("main.js")
2726

2827
const usage = """
2928
tw5server -a:localhost -p:8000 -d:dir -b:backup
@@ -61,7 +60,7 @@ type
6160
# TODO: update web page after upload
6261
proc h_page(settings:NimHttpSettings, content, title, subtitle: string): string =
6362
var footer = """<div id="footer">$1 v$2</div>""" % [settings.name, settings.version]
64-
result = temp % [title, style, subtitle, content, footer]
63+
result = temp % [title, style, subtitle, content, footer, js]
6564

6665
proc relativePath(path, cwd: string): string =
6766
var path2 = path
@@ -158,7 +157,7 @@ proc savePost(req: Request, path, url_path: string, log: bool): NimHttpResponse
158157
file = body["file"]
159158
filename = file.fields["filename"]
160159
file_body = file.body
161-
override = body.getOrDefault("write").body
160+
override = body.getOrDefault("override").body
162161

163162
var
164163
rsp_content = ""
@@ -173,15 +172,15 @@ proc savePost(req: Request, path, url_path: string, log: bool): NimHttpResponse
173172
let
174173
rsp_msg = "Save file to " & newName
175174
msg = rsp_msg & " in " & path
176-
rsp_content = rsp_msg
175+
rsp_content = newName
177176
code = Http200
178177
logmsg(msg, log)
179178
else:
180179
writeFile(path / filename, file_body)
181180
let
182181
rsp_msg = "Save file to " & filename
183182
msg = rsp_msg & " in " & path
184-
rsp_content = rsp_msg
183+
rsp_content = filename
185184
code = Http200
186185
logmsg(msg, log)
187186
return (code: code, content: rsp_content, headers: {"status": "ok"}.newHttpHeaders())
@@ -311,6 +310,8 @@ echo(" Serving url: ", address, ":", port)
311310
echo("Serving path: ", dir)
312311
echo(" Backup dir: ", backup)
313312

313+
createDir(dir / backup)
314+
314315
proc handleCtrlC() {.noconv.} =
315316
write(stdout, "\rClean backups (y to clean): ")
316317
let clean = readLine(stdin)

0 commit comments

Comments
 (0)