Skip to content

Commit 462eb71

Browse files
authored
Merge pull request #6611 from FoamyGuy/webflow_edit_page
Webflow edit page
2 parents 8b2f061 + 51006f5 commit 462eb71

File tree

6 files changed

+94
-2
lines changed

6 files changed

+94
-2
lines changed

supervisor/shared/web_workflow/static/directory.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<body>
1010
<h1><a href="/"><img src="/favicon.ico"/></a>&nbsp;<span id="path"></span></h1>
1111
<div id="usbwarning" style="display: none;">🛈 USB is using the storage. Only allowing reads. See <a href="https://learn.adafruit.com/circuitpython-essentials/circuitpython-storage">the CircuitPython Essentials: Storage guide</a> for details.</div>
12-
<template id="row"><tr><td></td><td></td><td><a></a></td><td></td><td><button class="delete">🗑️</button></td></tr></template>
12+
<template id="row"><tr><td></td><td></td><td><a></a></td><td></td><td><button class="delete">🗑️</button></td><td><a class="edit_link" href="">Edit</a></td></tr></template>
1313
<table>
1414
<thead><tr><th>Type</th><th>Size</th><th>Path</th><th>Modified</th><th></th></tr></thead>
1515
<tbody></tbody>

supervisor/shared/web_workflow/static/directory.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ async function refresh_list() {
9191
delete_button.disabled = !editable;
9292
delete_button.onclick = del;
9393

94+
let edit_url = new URL("/edit/#" + f.name, url_base);
95+
let edit_link = clone.querySelector(".edit_link");
96+
edit_link.href = edit_url
9497

9598
new_children.push(clone);
9699
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Code Edit</title>
6+
<style>
7+
#code_textarea {
8+
width: 90%;
9+
height: 600px;
10+
}
11+
12+
#output_text {
13+
margin: 0;
14+
font-size: 0.7em;
15+
}
16+
</style>
17+
18+
</head>
19+
<body>
20+
<button id="save_btn">Save</button>
21+
<p id="output_text">Loading</p>
22+
<textarea id="code_textarea"></textarea>
23+
24+
<script src="/edit.js" defer=true></script>
25+
</body>
26+
</html>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
let $editor = document.querySelector("#code_textarea");
2+
let filename = location.hash.substring(1);
3+
let $output_text = document.querySelector("#output_text");
4+
5+
fetch(`/fs/${filename}`)
6+
.then(function (response) {
7+
$output_text.innerText = `Loading Status: ${response.status}`;
8+
return response.status === 200 ? response.text() : "";
9+
})
10+
.then(function (data) {
11+
$editor.value = data;
12+
});
13+
14+
function save() {
15+
$output_text.innerText = "Saving..."
16+
const requestOptions = {
17+
method: 'PUT',
18+
body: $editor.value
19+
};
20+
fetch(`/fs/${filename}`, requestOptions)
21+
.then(function (response) {
22+
$output_text.innerText = `Saving Status: ${response.status}`;
23+
return response.text();
24+
})
25+
.then(function (data) {
26+
console.log("after fetch: " + data);
27+
});
28+
}
29+
30+
document.querySelector("#save_btn").onclick = function () {
31+
console.log("Click Save!");
32+
save();
33+
}
34+
35+
let isCtrl = false;
36+
document.onkeyup=function(e){
37+
if(e.keyCode === 17) isCtrl=false;
38+
}
39+
40+
document.onkeydown=function(e){
41+
if(e.keyCode === 17) isCtrl=true;
42+
if(e.keyCode === 83 && isCtrl === true) {
43+
//ctrl-s pressed
44+
save();
45+
return false;
46+
}
47+
}

supervisor/shared/web_workflow/web_workflow.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,8 @@ STATIC_FILE(directory_html);
916916
STATIC_FILE(directory_js);
917917
STATIC_FILE(welcome_html);
918918
STATIC_FILE(welcome_js);
919+
STATIC_FILE(edit_html);
920+
STATIC_FILE(edit_js);
919921
STATIC_FILE(style_css);
920922
STATIC_FILE(serial_html);
921923
STATIC_FILE(serial_js);
@@ -1087,6 +1089,16 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
10871089
}
10881090
}
10891091
}
1092+
} else if (strcmp(request->path, "/edit/") == 0) {
1093+
if (!request->authenticated) {
1094+
if (_api_password[0] != '\0') {
1095+
_reply_unauthorized(socket, request);
1096+
} else {
1097+
_reply_forbidden(socket, request);
1098+
}
1099+
} else {
1100+
_REPLY_STATIC(socket, request, edit_html);
1101+
}
10901102
} else if (strncmp(request->path, "/cp/", 4) == 0) {
10911103
const char *path = request->path + 3;
10921104
if (strcasecmp(request->method, "OPTIONS") == 0) {
@@ -1126,6 +1138,8 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
11261138
_REPLY_STATIC(socket, request, welcome_js);
11271139
} else if (strcmp(request->path, "/serial.js") == 0) {
11281140
_REPLY_STATIC(socket, request, serial_js);
1141+
} else if (strcmp(request->path, "/edit.js") == 0) {
1142+
_REPLY_STATIC(socket, request, edit_js);
11291143
} else if (strcmp(request->path, "/style.css") == 0) {
11301144
_REPLY_STATIC(socket, request, style_css);
11311145
} else if (strcmp(request->path, "/favicon.ico") == 0) {

tools/gen_web_workflow_static.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
if f.name.endswith(".html"):
3030
uncompressed = minify_html.minify(uncompressed.decode("utf-8")).encode("utf-8")
3131
elif f.name.endswith(".js"):
32-
uncompressed = jsmin.jsmin(uncompressed.decode("utf-8")).encode("utf-8")
32+
uncompressed = jsmin.jsmin(uncompressed.decode("utf-8"), quote_chars="'\"`").encode(
33+
"utf-8"
34+
)
3335
compressed = gzip.compress(uncompressed)
3436
clen = len(compressed)
3537
compressed = ", ".join([hex(x) for x in compressed])

0 commit comments

Comments
 (0)