pinokiod 3.9.2 → 3.9.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/kernel/api/index.js +150 -67
- package/kernel/api/rm/index.js +3 -2
- package/kernel/api/set/index.js +4 -2
- package/kernel/bin/caddy.js +0 -2
- package/kernel/bin/index.js +13 -0
- package/kernel/index.js +10 -8
- package/kernel/info.js +3 -0
- package/kernel/plugin.js +34 -0
- package/kernel/router/index.js +1 -1
- package/kernel/router/localhost_variable_router.js +1 -1
- package/kernel/router/peer_variable_router.js +1 -1
- package/kernel/shell.js +14 -0
- package/kernel/util.js +19 -1
- package/package.json +1 -1
- package/server/index.js +296 -98
- package/server/public/modalinput.js +7 -2
- package/server/public/opener.js +32 -0
- package/server/public/style.css +37 -2
- package/server/socket.js +7 -3
- package/server/views/app.ejs +199 -79
- package/server/views/env_editor.ejs +1 -0
- package/server/views/file_explorer.ejs +1 -1
- package/server/views/index.ejs +66 -43
- package/server/views/partials/dynamic.ejs +54 -6
- package/server/views/partials/menu.ejs +11 -6
- package/server/views/prototype/index.ejs +366 -31
- package/server/views/prototype/show.ejs +386 -30
- package/server/views/required_env_editor.ejs +1 -0
- package/server/views/settings.ejs +58 -43
- package/server/views/terminal.ejs +6 -0
|
@@ -36,6 +36,8 @@ const ModalInput = async (params, uri) => {
|
|
|
36
36
|
}).join("")
|
|
37
37
|
input = `<select data-id="${field.key}">${items}</select>`
|
|
38
38
|
}
|
|
39
|
+
} else if (type === 'checkbox') {
|
|
40
|
+
input = `<div class='checkbox-row'><input data-type="checkbox" type="checkbox" data-id="${field.key}" value="${field.key}" />${field.text}</div>`
|
|
39
41
|
} else if (type === 'file') {
|
|
40
42
|
input = `<div class='dropzone' data-type='file' data-id='${field.key}'></div>`
|
|
41
43
|
//input = `<input type='file' data-id="${field.key}" />`
|
|
@@ -84,11 +86,14 @@ const ModalInput = async (params, uri) => {
|
|
|
84
86
|
for(let field of form) {
|
|
85
87
|
let input = Swal.getPopup().querySelector("[data-id='" + field.key + "']")
|
|
86
88
|
let type = input.getAttribute("data-type")
|
|
87
|
-
|
|
89
|
+
debugger
|
|
90
|
+
if (type !== 'file' && type !== 'checkbox') {
|
|
88
91
|
response[field.key] = input.value
|
|
89
92
|
}
|
|
93
|
+
if (type === 'checkbox') {
|
|
94
|
+
response[field.key] = input.checked
|
|
95
|
+
}
|
|
90
96
|
|
|
91
|
-
// let type = input.getAttribute("type")
|
|
92
97
|
// if (type === 'file') {
|
|
93
98
|
// const file = input.files[0];
|
|
94
99
|
// const reader = new FileReader();
|
package/server/public/opener.js
CHANGED
|
@@ -8,6 +8,8 @@ document.addEventListener("click", async (e) => {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
if (el) {
|
|
11
|
+
e.preventDefault()
|
|
12
|
+
e.stopPropagation()
|
|
11
13
|
let filepath = el.getAttribute("data-filepath")
|
|
12
14
|
let command = el.getAttribute("data-command")
|
|
13
15
|
await fetch("/openfs", {
|
|
@@ -26,6 +28,36 @@ document.addEventListener("click", async (e) => {
|
|
|
26
28
|
return
|
|
27
29
|
}
|
|
28
30
|
|
|
31
|
+
// [data-run] runs commands kernel.exec (without a shell UI)
|
|
32
|
+
el = e.target.closest("[data-run]")
|
|
33
|
+
if (!el) {
|
|
34
|
+
let run = e.target.getAttribute("[data-run]")
|
|
35
|
+
if (run) {
|
|
36
|
+
el = e.target
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (el) {
|
|
40
|
+
debugger
|
|
41
|
+
e.preventDefault()
|
|
42
|
+
e.stopPropagation()
|
|
43
|
+
let run = el.getAttribute("data-run")
|
|
44
|
+
let cwd = el.getAttribute("data-cwd")
|
|
45
|
+
await fetch("/runcmd", {
|
|
46
|
+
method: "post",
|
|
47
|
+
headers: {
|
|
48
|
+
"Content-Type": "application/json"
|
|
49
|
+
},
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
run,
|
|
52
|
+
cwd
|
|
53
|
+
})
|
|
54
|
+
}).then((res) => {
|
|
55
|
+
return res.json()
|
|
56
|
+
})
|
|
57
|
+
// window.open("about:blank", "_blank", "file://" + filepath)
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
|
|
29
61
|
// target=_blank should open in new window
|
|
30
62
|
el = e.target.closest("[target=_blank]")
|
|
31
63
|
if (!el) {
|
package/server/public/style.css
CHANGED
|
@@ -80,7 +80,11 @@
|
|
|
80
80
|
.drawer.vertical-collapsed {
|
|
81
81
|
max-height: 0;
|
|
82
82
|
}
|
|
83
|
-
.dynamic {
|
|
83
|
+
.dynamic.selected {
|
|
84
|
+
background: rgba(0,0,0,0.05);
|
|
85
|
+
}
|
|
86
|
+
body.dark .dynamic.selected {
|
|
87
|
+
background: rgba(0,150,250,0.05);
|
|
84
88
|
}
|
|
85
89
|
.dynamic-item img {
|
|
86
90
|
width: 20px !important;
|
|
@@ -149,7 +153,13 @@ body.dark .type-tabs {
|
|
|
149
153
|
.navheader {
|
|
150
154
|
backdrop-filter: blur(16px);
|
|
151
155
|
|
|
156
|
+
/*
|
|
152
157
|
padding: 15px 10px 5px;
|
|
158
|
+
*/
|
|
159
|
+
padding: 15px;
|
|
160
|
+
}
|
|
161
|
+
.navheader .btn2 {
|
|
162
|
+
text-transform: lowercase;
|
|
153
163
|
}
|
|
154
164
|
body.columns footer {
|
|
155
165
|
}
|
|
@@ -677,6 +687,10 @@ body.columns .containers {
|
|
|
677
687
|
.containers .terminal-container #terminal {
|
|
678
688
|
height: 100%;
|
|
679
689
|
}
|
|
690
|
+
.menu-btns {
|
|
691
|
+
display: flex;
|
|
692
|
+
align-items: flex-start;
|
|
693
|
+
}
|
|
680
694
|
.terminal-container {
|
|
681
695
|
/*
|
|
682
696
|
padding: 10px 0;
|
|
@@ -1128,6 +1142,7 @@ body.dark .line .btn {
|
|
|
1128
1142
|
}
|
|
1129
1143
|
.line .btn {
|
|
1130
1144
|
background: rgba(0,0,0,0.9);
|
|
1145
|
+
text-transform: lowercase;
|
|
1131
1146
|
/*
|
|
1132
1147
|
border: 1px solid rgba(0,0,0,0.1);
|
|
1133
1148
|
color: rgba(0,0,0,0.7);
|
|
@@ -1187,6 +1202,7 @@ body.dark .line.align-top h3 .col .title a {
|
|
|
1187
1202
|
}
|
|
1188
1203
|
.line.align-top h3 .col .btn {
|
|
1189
1204
|
padding: 4px 10px;
|
|
1205
|
+
margin-right: 5px;
|
|
1190
1206
|
}
|
|
1191
1207
|
body.dark .line.align-top h3 .col .btn.label {
|
|
1192
1208
|
background: rgba(255,255,255,0.05);
|
|
@@ -1426,6 +1442,19 @@ body.dark .swal2-modal input {
|
|
|
1426
1442
|
outline: none !important;
|
|
1427
1443
|
-webkit-appearance: none !important;
|
|
1428
1444
|
}
|
|
1445
|
+
.swal2-modal input[type=checkbox] {
|
|
1446
|
+
width: 14px;
|
|
1447
|
+
height: 14px;
|
|
1448
|
+
background: white;
|
|
1449
|
+
margin-right: 5px;
|
|
1450
|
+
}
|
|
1451
|
+
.swal2-modal input[type=checkbox]:checked {
|
|
1452
|
+
background: royalblue;
|
|
1453
|
+
}
|
|
1454
|
+
.swal2-modal .checkbox-row {
|
|
1455
|
+
display: flex;
|
|
1456
|
+
align-items: center;
|
|
1457
|
+
}
|
|
1429
1458
|
.swal2-container {
|
|
1430
1459
|
font-size: 14px !important;
|
|
1431
1460
|
z-index: 100000 !important;
|
|
@@ -1784,8 +1813,14 @@ footer.status {
|
|
|
1784
1813
|
background: black;
|
|
1785
1814
|
}
|
|
1786
1815
|
*/
|
|
1816
|
+
body.dark .btn.red {
|
|
1817
|
+
color: rgba(230,0,0,1) !important;
|
|
1818
|
+
border: 1px solid rgba(210,0,0,0.7) !important;
|
|
1819
|
+
}
|
|
1787
1820
|
.btn.red {
|
|
1788
|
-
|
|
1821
|
+
color: rgba(210,0,0,0.8) !important;
|
|
1822
|
+
border: 1px solid rgba(210,0,0,0.3);
|
|
1823
|
+
background: none;
|
|
1789
1824
|
}
|
|
1790
1825
|
|
|
1791
1826
|
#error-screen {
|
package/server/socket.js
CHANGED
|
@@ -83,7 +83,12 @@ class Socket {
|
|
|
83
83
|
******************************************************************/
|
|
84
84
|
|
|
85
85
|
// req.uri is always http or absolute path
|
|
86
|
-
let id
|
|
86
|
+
let id
|
|
87
|
+
if (req.id) {
|
|
88
|
+
id = req.id
|
|
89
|
+
} else {
|
|
90
|
+
id = this.parent.kernel.api.filePath(req.uri)
|
|
91
|
+
}
|
|
87
92
|
|
|
88
93
|
if (req.status) {
|
|
89
94
|
ws.send(JSON.stringify({
|
|
@@ -121,8 +126,8 @@ class Socket {
|
|
|
121
126
|
// if the shell is running, don't do anything
|
|
122
127
|
// if the shell is not running, run the request
|
|
123
128
|
let shell = this.parent.kernel.shell.get(sh)
|
|
124
|
-
console.log("get shell for", sh, shell)
|
|
125
129
|
if (!shell) {
|
|
130
|
+
await this.parent.kernel.clearLog(req.id)
|
|
126
131
|
this.parent.kernel.api.process(req)
|
|
127
132
|
}
|
|
128
133
|
// if it's not killed, don't do anything
|
|
@@ -171,7 +176,6 @@ class Socket {
|
|
|
171
176
|
this.subscriptions.get(id).add(ws);
|
|
172
177
|
}
|
|
173
178
|
trigger(e) {
|
|
174
|
-
|
|
175
179
|
// send to id session
|
|
176
180
|
let id
|
|
177
181
|
if (e.kernel) {
|
package/server/views/app.ejs
CHANGED
|
@@ -106,6 +106,11 @@ main iframe {
|
|
|
106
106
|
height: 100%;
|
|
107
107
|
border: none;
|
|
108
108
|
}
|
|
109
|
+
/*
|
|
110
|
+
.header-item.indent {
|
|
111
|
+
padding-left: 23px !important;
|
|
112
|
+
}
|
|
113
|
+
*/
|
|
109
114
|
.header-item {
|
|
110
115
|
/*
|
|
111
116
|
display: block;
|
|
@@ -122,7 +127,6 @@ main iframe {
|
|
|
122
127
|
.header-item .btn2 {
|
|
123
128
|
margin: 0;
|
|
124
129
|
border: none;
|
|
125
|
-
padding: 5px;
|
|
126
130
|
/*
|
|
127
131
|
color: var(--light-color);
|
|
128
132
|
*/
|
|
@@ -161,7 +165,7 @@ body.dark .header-item.btn {
|
|
|
161
165
|
color: var(--dark-color);
|
|
162
166
|
}
|
|
163
167
|
.header-item.btn {
|
|
164
|
-
padding:
|
|
168
|
+
padding: 8px;
|
|
165
169
|
background: none !important;
|
|
166
170
|
color: var(--light-color);
|
|
167
171
|
}
|
|
@@ -192,6 +196,9 @@ body.dark #new-window {
|
|
|
192
196
|
background: rgba(255,255,255,0.04);
|
|
193
197
|
}
|
|
194
198
|
*/
|
|
199
|
+
.app-info-card img {
|
|
200
|
+
padding: 10px;
|
|
201
|
+
}
|
|
195
202
|
.app-info {
|
|
196
203
|
|
|
197
204
|
/*
|
|
@@ -201,7 +208,6 @@ body.dark #new-window {
|
|
|
201
208
|
text-align: center;;
|
|
202
209
|
font-weight: bold;
|
|
203
210
|
align-items: center;
|
|
204
|
-
padding: 20px 0px 0px;
|
|
205
211
|
/*
|
|
206
212
|
background: rgba(0,0,0,0.04);
|
|
207
213
|
*/
|
|
@@ -249,18 +255,56 @@ body.dark .header-btns {
|
|
|
249
255
|
margin: 10px 20px 0;
|
|
250
256
|
*/
|
|
251
257
|
}
|
|
258
|
+
.app-info-card {
|
|
259
|
+
/*
|
|
260
|
+
padding: 10px !important;
|
|
261
|
+
*/
|
|
262
|
+
display: flex;
|
|
263
|
+
}
|
|
252
264
|
.app-info .btn {
|
|
253
265
|
width: 100%;
|
|
266
|
+
box-sizing: border-box;
|
|
267
|
+
}
|
|
268
|
+
body.dark .app-info .mode-section {
|
|
269
|
+
background: rgba(0,0,0,0.4);
|
|
270
|
+
}
|
|
271
|
+
.app-info .mode-section {
|
|
272
|
+
background: rgba(0,0,0,0.06);
|
|
273
|
+
padding: 20px;
|
|
274
|
+
box-sizing: border-box;
|
|
275
|
+
width: 100%;
|
|
276
|
+
text-align: left;
|
|
277
|
+
}
|
|
278
|
+
.app-info .mode-section .desc {
|
|
279
|
+
font-weight: normal;
|
|
280
|
+
opacity: 0.7;
|
|
281
|
+
}
|
|
282
|
+
.app-info .mode-section h3 {
|
|
283
|
+
font-size: 18px;
|
|
284
|
+
line-height: 26px;
|
|
285
|
+
margin: 0;
|
|
286
|
+
}
|
|
287
|
+
body.dark .app-info .mode-section .btn {
|
|
288
|
+
border: 1px solid rgba(255,255,255,0.1);
|
|
289
|
+
}
|
|
290
|
+
.app-info .mode-section .btn {
|
|
291
|
+
margin-top: 10px;
|
|
292
|
+
text-align: center;
|
|
254
293
|
}
|
|
255
|
-
.app-info > * {
|
|
294
|
+
.app-info-card > * {
|
|
295
|
+
/*
|
|
256
296
|
padding: 5px;
|
|
297
|
+
*/
|
|
257
298
|
color: var(--light-color);
|
|
258
299
|
text-decoration: none;
|
|
259
300
|
box-sizing: border-box;
|
|
260
301
|
}
|
|
261
|
-
body.dark .app-info > * {
|
|
302
|
+
body.dark .app-info-card > * {
|
|
262
303
|
color: var(--dark-color);
|
|
263
304
|
}
|
|
305
|
+
.app-info-title {
|
|
306
|
+
padding: 10px;
|
|
307
|
+
}
|
|
264
308
|
.footer {
|
|
265
309
|
/*
|
|
266
310
|
display: flex;
|
|
@@ -387,6 +431,14 @@ body.dark .grid-btns .btn2 {
|
|
|
387
431
|
}
|
|
388
432
|
.tab i {
|
|
389
433
|
margin-right: 10px;
|
|
434
|
+
font-size: 12px;
|
|
435
|
+
width: 12px;
|
|
436
|
+
}
|
|
437
|
+
.menu-item-image {
|
|
438
|
+
width: 16px !important;
|
|
439
|
+
height: 16px !important;
|
|
440
|
+
margin-right: 10px;
|
|
441
|
+
background: white;
|
|
390
442
|
}
|
|
391
443
|
.temp-menu {
|
|
392
444
|
/*
|
|
@@ -542,8 +594,12 @@ body.dark #new-tab {
|
|
|
542
594
|
border-top: 1px solid rgba(255,255,255,0.04);
|
|
543
595
|
*/
|
|
544
596
|
}
|
|
597
|
+
body.dark .submenu {
|
|
598
|
+
border-left: 1px solid rgba(255,255,255,0.3);
|
|
599
|
+
}
|
|
545
600
|
.submenu {
|
|
546
|
-
|
|
601
|
+
border-left: 1px solid black;
|
|
602
|
+
margin-left: 15px;
|
|
547
603
|
box-sizing: border-box;
|
|
548
604
|
}
|
|
549
605
|
.loader-dialog {
|
|
@@ -600,6 +656,7 @@ body.dark .loader-container {
|
|
|
600
656
|
z-index: 5;
|
|
601
657
|
}
|
|
602
658
|
.appcanvas {
|
|
659
|
+
overflow: auto;
|
|
603
660
|
display: flex;
|
|
604
661
|
flex-grow: 1;
|
|
605
662
|
border-top: 1px solid rgba(0, 0,0 ,0.04);
|
|
@@ -661,6 +718,7 @@ body.dark .appcanvas {
|
|
|
661
718
|
<script src="/hotkeys.min.js"></script>
|
|
662
719
|
<script src="/sweetalert2.js"></script>
|
|
663
720
|
<script src="/nav.js"></script>
|
|
721
|
+
<script src="/common.js"></script>
|
|
664
722
|
<script src="/opener.js"></script>
|
|
665
723
|
<script src="/report.js"></script>
|
|
666
724
|
<script src="/normalize.js"></script>
|
|
@@ -687,7 +745,7 @@ body.dark .appcanvas {
|
|
|
687
745
|
<a class='btn2' id='explore' href="/?mode=explore"><div><i class="fa-solid fa-globe"></i></div><div>Discover</div></a>
|
|
688
746
|
<a href="/network" class='btn2'><div><i class="fa-solid fa-wifi"></i></div><div>Network</div></a>
|
|
689
747
|
<a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
|
|
690
|
-
<input type='url' id='location' readonly>
|
|
748
|
+
<input type='url' id='location' readonly value="<%=execUrl%>">
|
|
691
749
|
<div class='nav-btns'>
|
|
692
750
|
<a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
|
|
693
751
|
<button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
|
|
@@ -706,81 +764,98 @@ body.dark .appcanvas {
|
|
|
706
764
|
<aside class='active'>
|
|
707
765
|
<div class='header-top header-item'>
|
|
708
766
|
<div class='app-info'>
|
|
709
|
-
<% if (
|
|
710
|
-
<
|
|
711
|
-
|
|
712
|
-
|
|
767
|
+
<% if (type !== 'run') { %>
|
|
768
|
+
<div class='mode-section'>
|
|
769
|
+
<h3><i class='fa-solid fa-code'></i> Dev mode</h3>
|
|
770
|
+
<div class='desc'>In dev mode, 'default' scripts do not automatically start</div>
|
|
771
|
+
<a class='btn' href="."><i class="fa-solid fa-circle-play"></i> Switch to Run mode</a>
|
|
772
|
+
</div>
|
|
713
773
|
<% } %>
|
|
714
|
-
<div
|
|
715
|
-
|
|
774
|
+
<div class='app-info-card'>
|
|
775
|
+
<% if (config.icon) { %>
|
|
776
|
+
<img src="<%=config.icon%>"/>
|
|
777
|
+
<% } else { %>
|
|
778
|
+
<i class="fa-regular fa-circle-dot"></i>
|
|
779
|
+
<% } %>
|
|
780
|
+
<div class='app-info-title'><%=config.title%></div>
|
|
781
|
+
</div>
|
|
716
782
|
<div class='header-btns'>
|
|
717
|
-
<
|
|
718
|
-
<div class='tab'>
|
|
719
|
-
<i class='fa-solid fa-bolt'></i> Setup
|
|
720
|
-
</div>
|
|
721
|
-
</a>
|
|
722
|
-
<button class='btn header-item frame-link' id='edit-toggle'>
|
|
783
|
+
<div class='btn header-item frame-link revealer' id='edit-toggle' data-group='.edit-group'>
|
|
723
784
|
<div class='tab'>
|
|
724
785
|
<i class='fa-solid fa-pen-to-square'></i> Edit
|
|
725
786
|
</div>
|
|
726
|
-
|
|
727
|
-
</div>
|
|
728
|
-
<div class='editsubmenu submenu hidden'>
|
|
729
|
-
<div class='btn header-item frame-link' id='edit'>
|
|
730
|
-
<div class='tab'><i class="fa-solid fa-pencil"></i> Edit info</div>
|
|
731
|
-
</div>
|
|
732
|
-
<div class='btn header-item frame-link' id='move'>
|
|
733
|
-
<div class='tab'><i class="fa-solid fa-right-to-bracket"></i> Move folder</div>
|
|
787
|
+
<div class='loader'><i class="fa-solid fa-caret-down"></i><i class="fa-solid fa-caret-up hidden"></i></div>
|
|
734
788
|
</div>
|
|
735
|
-
<div class='
|
|
736
|
-
<
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
789
|
+
<div class='edit-group editsubmenu submenu hidden'>
|
|
790
|
+
<a <%=config.init_required ? 'data-init' : ''%> class='btn header-item frame-link' href="/prototype?type=init&path=<%=path%>">
|
|
791
|
+
<div class='tab'>
|
|
792
|
+
<i class='fa-solid fa-bolt'></i> Initialize
|
|
793
|
+
</div>
|
|
794
|
+
</a>
|
|
795
|
+
<a class='btn header-item frame-link' href="/prototype?type=extension&path=<%=path%>">
|
|
796
|
+
<div class='tab'>
|
|
797
|
+
<i class='fa-solid fa-puzzle-piece'></i> Extensions
|
|
798
|
+
</div>
|
|
799
|
+
</a>
|
|
800
|
+
<div class='btn header-item frame-link' id='edit'>
|
|
801
|
+
<div class='tab'><i class="fa-solid fa-pencil"></i> Edit info</div>
|
|
802
|
+
</div>
|
|
803
|
+
<div class='btn header-item frame-link' id='move'>
|
|
804
|
+
<div class='tab'><i class="fa-solid fa-right-to-bracket"></i> Move folder</div>
|
|
805
|
+
</div>
|
|
806
|
+
<div class='btn header-item frame-link' id='copy'>
|
|
807
|
+
<div class='tab'><i class="fa-solid fa-copy"></i> Copy folder</div>
|
|
808
|
+
</div>
|
|
809
|
+
<div class='btn header-item frame-link' id='delete' data-name="<%=name%>">
|
|
810
|
+
<div class='tab'><i class="fa-solid fa-trash-can"></i> Delete folder</div>
|
|
811
|
+
</div>
|
|
740
812
|
</div>
|
|
741
813
|
</div>
|
|
742
814
|
</div>
|
|
743
815
|
</div>
|
|
744
816
|
<div class='m n system' data-type="n">
|
|
745
|
-
<!--<a data-index="0" target="<%=src%>" href="<%=src%>" class='btn header-item frame-link'>-->
|
|
746
|
-
<!--
|
|
747
|
-
<div id='copy' data-name="<%=name%>" class='btn header-item frame-link'>
|
|
748
|
-
<div class='tab'><i class="fa-solid fa-copy"></i> Copy</div>
|
|
749
|
-
</div>
|
|
750
|
-
<div id='delete' data-name="<%=name%>" class='btn header-item frame-link'>
|
|
751
|
-
<div class='tab'><i class="fa-solid fa-trash-can"></i> Delete</div>
|
|
752
|
-
</div>
|
|
753
|
-
-->
|
|
754
817
|
<a target="<%=src%>" href="<%=src%>" class='btn header-item frame-link' data-index="0">
|
|
755
818
|
<div class='tab'><i class="fa-regular fa-folder-open"></i> Files <div class='disk-usage'></div></div>
|
|
756
819
|
</a>
|
|
820
|
+
<% if (profile || feed) { %>
|
|
821
|
+
<div class='btn header-item frame-link revealer' data-group='.info-group'>
|
|
822
|
+
<div class='tab'>
|
|
823
|
+
<i class='fa-solid fa-circle-info'></i> Info
|
|
824
|
+
</div>
|
|
825
|
+
<div class='loader'><i class="fa-solid fa-caret-down"></i><i class="fa-solid fa-caret-up hidden"></i></div>
|
|
826
|
+
</div>
|
|
827
|
+
<div class='info-group submenu hidden'>
|
|
828
|
+
<% if (profile) { %>
|
|
829
|
+
<a target="_blank" href="<%=profile%>" class='btn header-item frame-link'>
|
|
830
|
+
<div class='tab'><i class="fa-regular fa-circle-user"></i> Publisher</div>
|
|
831
|
+
</a>
|
|
832
|
+
<% } %>
|
|
833
|
+
<% if (feed) { %>
|
|
834
|
+
<a target="_blank" href="<%=feed%>" class='btn header-item frame-link'>
|
|
835
|
+
<div class='tab'><i class="fa-solid fa-rss"></i> Newsfeed</div>
|
|
836
|
+
</a>
|
|
837
|
+
<% } %>
|
|
838
|
+
</div>
|
|
839
|
+
<% } %>
|
|
757
840
|
<div class='dynamic'>
|
|
758
841
|
<% if (plugin_menu) { %>
|
|
759
842
|
<%- include('./partials/dynamic', { dynamic: plugin_menu, }) %>
|
|
760
843
|
<% } %>
|
|
761
844
|
</div>
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
<
|
|
769
|
-
<
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
<div class='tab'><i class="fa-solid fa-rss"></i> Newsfeed</div>
|
|
777
|
-
</a>
|
|
778
|
-
<a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="2" data-mode="refresh">
|
|
779
|
-
<div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
|
|
780
|
-
</a>
|
|
781
|
-
<a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="3" data-mode="refresh">
|
|
782
|
-
<div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
|
|
783
|
-
</a>
|
|
845
|
+
<div class='btn header-item frame-link revealer' data-group='.config-group'>
|
|
846
|
+
<div class='tab'>
|
|
847
|
+
<i class='fa-solid fa-gear'></i> Settings
|
|
848
|
+
</div>
|
|
849
|
+
<div class='loader'><i class="fa-solid fa-caret-down"></i><i class="fa-solid fa-caret-up hidden"></i></div>
|
|
850
|
+
</div>
|
|
851
|
+
<div class='config-group submenu hidden'>
|
|
852
|
+
<a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="2" data-mode="refresh">
|
|
853
|
+
<div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
|
|
854
|
+
</a>
|
|
855
|
+
<a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="3" data-mode="refresh">
|
|
856
|
+
<div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
|
|
857
|
+
</a>
|
|
858
|
+
</div>
|
|
784
859
|
</div>
|
|
785
860
|
<div class='m h menu' data-type='h'>
|
|
786
861
|
<% if (config.menu) { %>
|
|
@@ -847,15 +922,6 @@ body.dark .appcanvas {
|
|
|
847
922
|
</nav>
|
|
848
923
|
-->
|
|
849
924
|
<main class='browserview'>
|
|
850
|
-
<% if (false) { %>
|
|
851
|
-
<% if (config.menu) { %>
|
|
852
|
-
<% config.menu.forEach((item) => { %>
|
|
853
|
-
<% if (item.btn && item.src) { %>
|
|
854
|
-
<iframe name='<%=item.src%>' class='hidden'></iframe>
|
|
855
|
-
<% } %>
|
|
856
|
-
<% }) %>
|
|
857
|
-
<% } %>
|
|
858
|
-
<% } %>
|
|
859
925
|
</main>
|
|
860
926
|
</div>
|
|
861
927
|
</div>
|
|
@@ -971,6 +1037,11 @@ body.dark .appcanvas {
|
|
|
971
1037
|
// } else {
|
|
972
1038
|
// selection = document.querySelector("[data-default]")
|
|
973
1039
|
// }
|
|
1040
|
+
let init = document.querySelector("[data-init]")
|
|
1041
|
+
if (init) {
|
|
1042
|
+
location.href = init.href
|
|
1043
|
+
return
|
|
1044
|
+
}
|
|
974
1045
|
let selection = document.querySelector("[data-default]")
|
|
975
1046
|
|
|
976
1047
|
// console.log("> 3")
|
|
@@ -1056,9 +1127,20 @@ body.dark .appcanvas {
|
|
|
1056
1127
|
|
|
1057
1128
|
// Instantiate a frame with the selected target's href
|
|
1058
1129
|
let url = target.href
|
|
1130
|
+
|
|
1131
|
+
if (!url) {
|
|
1132
|
+
return
|
|
1133
|
+
}
|
|
1059
1134
|
// document.querySelector("#open-browser").href = url
|
|
1060
1135
|
// document.querySelector("#clone-tab").setAttribute("data-href", url)
|
|
1061
|
-
|
|
1136
|
+
|
|
1137
|
+
//document.querySelector("#location").value = url
|
|
1138
|
+
|
|
1139
|
+
if (target.pathname.startsWith("/run")) {
|
|
1140
|
+
document.querySelector("#location").value = target.pathname.slice(4)
|
|
1141
|
+
} else {
|
|
1142
|
+
document.querySelector("#location").value = target.pathname
|
|
1143
|
+
}
|
|
1062
1144
|
|
|
1063
1145
|
|
|
1064
1146
|
// select the selected target element (tab)
|
|
@@ -1372,11 +1454,13 @@ body.dark .appcanvas {
|
|
|
1372
1454
|
document.querySelector("#menu").classList.toggle("margin")
|
|
1373
1455
|
})
|
|
1374
1456
|
}
|
|
1457
|
+
/*
|
|
1375
1458
|
document.querySelector("#edit-toggle").addEventListener("click", async (e) => {
|
|
1376
1459
|
e.preventDefault()
|
|
1377
1460
|
e.stopPropagation()
|
|
1378
1461
|
document.querySelector(".editsubmenu").classList.toggle("hidden")
|
|
1379
1462
|
})
|
|
1463
|
+
*/
|
|
1380
1464
|
document.querySelector("#move").addEventListener("click", async (e) => {
|
|
1381
1465
|
e.preventDefault()
|
|
1382
1466
|
e.stopPropagation()
|
|
@@ -1503,6 +1587,24 @@ body.dark .appcanvas {
|
|
|
1503
1587
|
document.querySelector("aside").addEventListener("click", async (e) => {
|
|
1504
1588
|
let target
|
|
1505
1589
|
|
|
1590
|
+
// 0. handle dropdowns
|
|
1591
|
+
if (e.target.classList.contains("revealer")) {
|
|
1592
|
+
target = e.target
|
|
1593
|
+
} else {
|
|
1594
|
+
target = e.target.closest(".revealer")
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
if (target) {
|
|
1598
|
+
e.preventDefault()
|
|
1599
|
+
e.stopPropagation()
|
|
1600
|
+
let group = target.getAttribute("data-group")
|
|
1601
|
+
document.querySelector(group).classList.toggle("hidden")
|
|
1602
|
+
target.querySelector(".loader .fa-caret-down").classList.toggle("hidden")
|
|
1603
|
+
target.querySelector(".loader .fa-caret-up").classList.toggle("hidden")
|
|
1604
|
+
return
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
|
|
1506
1608
|
|
|
1507
1609
|
// 1. handle delete
|
|
1508
1610
|
if (e.target.classList.contains("del")) {
|
|
@@ -1622,7 +1724,10 @@ body.dark .appcanvas {
|
|
|
1622
1724
|
} else {
|
|
1623
1725
|
if (target.classList.contains("reveal")) {
|
|
1624
1726
|
// nested menu
|
|
1727
|
+
target.closest(".dynamic").classList.toggle("selected")
|
|
1625
1728
|
target.closest(".nested-menu").querySelector(".submenu").classList.toggle("hidden")
|
|
1729
|
+
target.querySelector(".loader .fa-caret-down").classList.toggle("hidden")
|
|
1730
|
+
target.querySelector(".loader .fa-caret-up").classList.toggle("hidden")
|
|
1626
1731
|
e.preventDefault()
|
|
1627
1732
|
e.stopPropagation()
|
|
1628
1733
|
} else {
|
|
@@ -1636,13 +1741,17 @@ body.dark .appcanvas {
|
|
|
1636
1741
|
//location.hash = target.getAttribute("href")
|
|
1637
1742
|
|
|
1638
1743
|
if (target.closest(".h")) {
|
|
1639
|
-
|
|
1744
|
+
if (target.target) {
|
|
1745
|
+
location.hash = target.target
|
|
1746
|
+
}
|
|
1640
1747
|
} else {
|
|
1641
1748
|
let index = target.getAttribute("data-index")
|
|
1642
1749
|
let type = target.closest(".m").getAttribute("data-type")
|
|
1643
1750
|
|
|
1644
1751
|
|
|
1645
|
-
|
|
1752
|
+
if (type) {
|
|
1753
|
+
location.hash = type + index
|
|
1754
|
+
}
|
|
1646
1755
|
}
|
|
1647
1756
|
|
|
1648
1757
|
document.querySelectorAll(".frame-link").forEach((el) => {
|
|
@@ -1718,7 +1827,10 @@ body.dark .appcanvas {
|
|
|
1718
1827
|
// }, 500)
|
|
1719
1828
|
// })
|
|
1720
1829
|
}
|
|
1721
|
-
|
|
1830
|
+
<% if (type === "run" && env.PINOKIO_SCRIPT_DEFAULT && env.PINOKIO_SCRIPT_DEFAULT.toString().toLowerCase() === "true") { %>
|
|
1831
|
+
|
|
1832
|
+
renderSelection()
|
|
1833
|
+
<% } %>
|
|
1722
1834
|
}
|
|
1723
1835
|
}
|
|
1724
1836
|
if (document.querySelector("#genlog")) {
|
|
@@ -1758,9 +1870,14 @@ body.dark .appcanvas {
|
|
|
1758
1870
|
} else if (event.data.action.type === "location") {
|
|
1759
1871
|
let url = event.data.action.url
|
|
1760
1872
|
console.log({ action: event.data.action })
|
|
1761
|
-
|
|
1762
|
-
//document.querySelector("#location").
|
|
1763
|
-
|
|
1873
|
+
|
|
1874
|
+
//document.querySelector("#location").value = url
|
|
1875
|
+
let pathname = new URL(url).pathname
|
|
1876
|
+
if (pathname.startsWith("/run")) {
|
|
1877
|
+
document.querySelector("#location").value = pathname.slice(4)
|
|
1878
|
+
} else {
|
|
1879
|
+
document.querySelector("#location").value = pathname
|
|
1880
|
+
}
|
|
1764
1881
|
}
|
|
1765
1882
|
} else if (event.data.type) {
|
|
1766
1883
|
let asideHidden = (window.getComputedStyle(document.querySelector("aside")).display === "none")
|
|
@@ -1804,6 +1921,9 @@ body.dark .appcanvas {
|
|
|
1804
1921
|
|
|
1805
1922
|
});
|
|
1806
1923
|
refresh_du()
|
|
1924
|
+
<% if (type !== 'run') { %>
|
|
1925
|
+
document.querySelector(".dynamic .reveal").click()
|
|
1926
|
+
<% } %>
|
|
1807
1927
|
/*
|
|
1808
1928
|
document.addEventListener("keydown", (e) => {
|
|
1809
1929
|
let size = document.querySelectorAll(".selectable").length
|
|
@@ -456,7 +456,7 @@ const n = new N()
|
|
|
456
456
|
let socket = new Socket()
|
|
457
457
|
const pull = async () => {
|
|
458
458
|
socket.close()
|
|
459
|
-
await new Promise((resolve, reject) => {
|
|
459
|
+
await new Promise(async (resolve, reject) => {
|
|
460
460
|
if (!term) {
|
|
461
461
|
<% if (theme === "dark") { %>
|
|
462
462
|
await createTerm(xtermTheme.FrontEndDelight)
|