pinokiod 3.9.3 → 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 +33 -2
- package/server/socket.js +7 -3
- package/server/views/app.ejs +188 -72
- package/server/views/env_editor.ejs +1 -0
- package/server/views/file_explorer.ejs +1 -1
- package/server/views/index.ejs +35 -16
- 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
- package/:w +0 -1247
|
@@ -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
|
}
|
|
@@ -1132,6 +1142,7 @@ body.dark .line .btn {
|
|
|
1132
1142
|
}
|
|
1133
1143
|
.line .btn {
|
|
1134
1144
|
background: rgba(0,0,0,0.9);
|
|
1145
|
+
text-transform: lowercase;
|
|
1135
1146
|
/*
|
|
1136
1147
|
border: 1px solid rgba(0,0,0,0.1);
|
|
1137
1148
|
color: rgba(0,0,0,0.7);
|
|
@@ -1191,6 +1202,7 @@ body.dark .line.align-top h3 .col .title a {
|
|
|
1191
1202
|
}
|
|
1192
1203
|
.line.align-top h3 .col .btn {
|
|
1193
1204
|
padding: 4px 10px;
|
|
1205
|
+
margin-right: 5px;
|
|
1194
1206
|
}
|
|
1195
1207
|
body.dark .line.align-top h3 .col .btn.label {
|
|
1196
1208
|
background: rgba(255,255,255,0.05);
|
|
@@ -1430,6 +1442,19 @@ body.dark .swal2-modal input {
|
|
|
1430
1442
|
outline: none !important;
|
|
1431
1443
|
-webkit-appearance: none !important;
|
|
1432
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
|
+
}
|
|
1433
1458
|
.swal2-container {
|
|
1434
1459
|
font-size: 14px !important;
|
|
1435
1460
|
z-index: 100000 !important;
|
|
@@ -1788,8 +1813,14 @@ footer.status {
|
|
|
1788
1813
|
background: black;
|
|
1789
1814
|
}
|
|
1790
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
|
+
}
|
|
1791
1820
|
.btn.red {
|
|
1792
|
-
|
|
1821
|
+
color: rgba(210,0,0,0.8) !important;
|
|
1822
|
+
border: 1px solid rgba(210,0,0,0.3);
|
|
1823
|
+
background: none;
|
|
1793
1824
|
}
|
|
1794
1825
|
|
|
1795
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
|
/*
|
|
@@ -249,13 +256,45 @@ body.dark .header-btns {
|
|
|
249
256
|
*/
|
|
250
257
|
}
|
|
251
258
|
.app-info-card {
|
|
259
|
+
/*
|
|
252
260
|
padding: 10px !important;
|
|
261
|
+
*/
|
|
262
|
+
display: flex;
|
|
253
263
|
}
|
|
254
264
|
.app-info .btn {
|
|
255
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;
|
|
256
293
|
}
|
|
257
294
|
.app-info-card > * {
|
|
295
|
+
/*
|
|
258
296
|
padding: 5px;
|
|
297
|
+
*/
|
|
259
298
|
color: var(--light-color);
|
|
260
299
|
text-decoration: none;
|
|
261
300
|
box-sizing: border-box;
|
|
@@ -263,6 +302,9 @@ body.dark .header-btns {
|
|
|
263
302
|
body.dark .app-info-card > * {
|
|
264
303
|
color: var(--dark-color);
|
|
265
304
|
}
|
|
305
|
+
.app-info-title {
|
|
306
|
+
padding: 10px;
|
|
307
|
+
}
|
|
266
308
|
.footer {
|
|
267
309
|
/*
|
|
268
310
|
display: flex;
|
|
@@ -389,6 +431,14 @@ body.dark .grid-btns .btn2 {
|
|
|
389
431
|
}
|
|
390
432
|
.tab i {
|
|
391
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;
|
|
392
442
|
}
|
|
393
443
|
.temp-menu {
|
|
394
444
|
/*
|
|
@@ -544,8 +594,12 @@ body.dark #new-tab {
|
|
|
544
594
|
border-top: 1px solid rgba(255,255,255,0.04);
|
|
545
595
|
*/
|
|
546
596
|
}
|
|
597
|
+
body.dark .submenu {
|
|
598
|
+
border-left: 1px solid rgba(255,255,255,0.3);
|
|
599
|
+
}
|
|
547
600
|
.submenu {
|
|
548
|
-
|
|
601
|
+
border-left: 1px solid black;
|
|
602
|
+
margin-left: 15px;
|
|
549
603
|
box-sizing: border-box;
|
|
550
604
|
}
|
|
551
605
|
.loader-dialog {
|
|
@@ -602,6 +656,7 @@ body.dark .loader-container {
|
|
|
602
656
|
z-index: 5;
|
|
603
657
|
}
|
|
604
658
|
.appcanvas {
|
|
659
|
+
overflow: auto;
|
|
605
660
|
display: flex;
|
|
606
661
|
flex-grow: 1;
|
|
607
662
|
border-top: 1px solid rgba(0, 0,0 ,0.04);
|
|
@@ -663,6 +718,7 @@ body.dark .appcanvas {
|
|
|
663
718
|
<script src="/hotkeys.min.js"></script>
|
|
664
719
|
<script src="/sweetalert2.js"></script>
|
|
665
720
|
<script src="/nav.js"></script>
|
|
721
|
+
<script src="/common.js"></script>
|
|
666
722
|
<script src="/opener.js"></script>
|
|
667
723
|
<script src="/report.js"></script>
|
|
668
724
|
<script src="/normalize.js"></script>
|
|
@@ -689,7 +745,7 @@ body.dark .appcanvas {
|
|
|
689
745
|
<a class='btn2' id='explore' href="/?mode=explore"><div><i class="fa-solid fa-globe"></i></div><div>Discover</div></a>
|
|
690
746
|
<a href="/network" class='btn2'><div><i class="fa-solid fa-wifi"></i></div><div>Network</div></a>
|
|
691
747
|
<a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
|
|
692
|
-
<input type='url' id='location' readonly>
|
|
748
|
+
<input type='url' id='location' readonly value="<%=execUrl%>">
|
|
693
749
|
<div class='nav-btns'>
|
|
694
750
|
<a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
|
|
695
751
|
<button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
|
|
@@ -708,83 +764,98 @@ body.dark .appcanvas {
|
|
|
708
764
|
<aside class='active'>
|
|
709
765
|
<div class='header-top header-item'>
|
|
710
766
|
<div class='app-info'>
|
|
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>
|
|
773
|
+
<% } %>
|
|
711
774
|
<div class='app-info-card'>
|
|
712
775
|
<% if (config.icon) { %>
|
|
713
776
|
<img src="<%=config.icon%>"/>
|
|
714
777
|
<% } else { %>
|
|
715
778
|
<i class="fa-regular fa-circle-dot"></i>
|
|
716
779
|
<% } %>
|
|
717
|
-
<div><%=config.title%></div>
|
|
718
|
-
<div class="folderpath">/api/<%=name%></div>
|
|
780
|
+
<div class='app-info-title'><%=config.title%></div>
|
|
719
781
|
</div>
|
|
720
782
|
<div class='header-btns'>
|
|
721
|
-
<
|
|
722
|
-
<div class='tab'>
|
|
723
|
-
<i class='fa-solid fa-bolt'></i> Setup
|
|
724
|
-
</div>
|
|
725
|
-
</a>
|
|
726
|
-
<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'>
|
|
727
784
|
<div class='tab'>
|
|
728
785
|
<i class='fa-solid fa-pen-to-square'></i> Edit
|
|
729
786
|
</div>
|
|
730
|
-
|
|
731
|
-
</div>
|
|
732
|
-
<div class='editsubmenu submenu hidden'>
|
|
733
|
-
<div class='btn header-item frame-link' id='edit'>
|
|
734
|
-
<div class='tab'><i class="fa-solid fa-pencil"></i> Edit info</div>
|
|
735
|
-
</div>
|
|
736
|
-
<div class='btn header-item frame-link' id='move'>
|
|
737
|
-
<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>
|
|
738
788
|
</div>
|
|
739
|
-
<div class='
|
|
740
|
-
<
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
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>
|
|
744
812
|
</div>
|
|
745
813
|
</div>
|
|
746
814
|
</div>
|
|
747
815
|
</div>
|
|
748
816
|
<div class='m n system' data-type="n">
|
|
749
|
-
<!--<a data-index="0" target="<%=src%>" href="<%=src%>" class='btn header-item frame-link'>-->
|
|
750
|
-
<!--
|
|
751
|
-
<div id='copy' data-name="<%=name%>" class='btn header-item frame-link'>
|
|
752
|
-
<div class='tab'><i class="fa-solid fa-copy"></i> Copy</div>
|
|
753
|
-
</div>
|
|
754
|
-
<div id='delete' data-name="<%=name%>" class='btn header-item frame-link'>
|
|
755
|
-
<div class='tab'><i class="fa-solid fa-trash-can"></i> Delete</div>
|
|
756
|
-
</div>
|
|
757
|
-
-->
|
|
758
817
|
<a target="<%=src%>" href="<%=src%>" class='btn header-item frame-link' data-index="0">
|
|
759
818
|
<div class='tab'><i class="fa-regular fa-folder-open"></i> Files <div class='disk-usage'></div></div>
|
|
760
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
|
+
<% } %>
|
|
761
840
|
<div class='dynamic'>
|
|
762
841
|
<% if (plugin_menu) { %>
|
|
763
842
|
<%- include('./partials/dynamic', { dynamic: plugin_menu, }) %>
|
|
764
843
|
<% } %>
|
|
765
844
|
</div>
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
<
|
|
773
|
-
<
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
<div class='tab'><i class="fa-solid fa-rss"></i> Newsfeed</div>
|
|
781
|
-
</a>
|
|
782
|
-
<a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="2" data-mode="refresh">
|
|
783
|
-
<div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
|
|
784
|
-
</a>
|
|
785
|
-
<a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="3" data-mode="refresh">
|
|
786
|
-
<div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
|
|
787
|
-
</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>
|
|
788
859
|
</div>
|
|
789
860
|
<div class='m h menu' data-type='h'>
|
|
790
861
|
<% if (config.menu) { %>
|
|
@@ -851,15 +922,6 @@ body.dark .appcanvas {
|
|
|
851
922
|
</nav>
|
|
852
923
|
-->
|
|
853
924
|
<main class='browserview'>
|
|
854
|
-
<% if (false) { %>
|
|
855
|
-
<% if (config.menu) { %>
|
|
856
|
-
<% config.menu.forEach((item) => { %>
|
|
857
|
-
<% if (item.btn && item.src) { %>
|
|
858
|
-
<iframe name='<%=item.src%>' class='hidden'></iframe>
|
|
859
|
-
<% } %>
|
|
860
|
-
<% }) %>
|
|
861
|
-
<% } %>
|
|
862
|
-
<% } %>
|
|
863
925
|
</main>
|
|
864
926
|
</div>
|
|
865
927
|
</div>
|
|
@@ -975,6 +1037,11 @@ body.dark .appcanvas {
|
|
|
975
1037
|
// } else {
|
|
976
1038
|
// selection = document.querySelector("[data-default]")
|
|
977
1039
|
// }
|
|
1040
|
+
let init = document.querySelector("[data-init]")
|
|
1041
|
+
if (init) {
|
|
1042
|
+
location.href = init.href
|
|
1043
|
+
return
|
|
1044
|
+
}
|
|
978
1045
|
let selection = document.querySelector("[data-default]")
|
|
979
1046
|
|
|
980
1047
|
// console.log("> 3")
|
|
@@ -1060,9 +1127,20 @@ body.dark .appcanvas {
|
|
|
1060
1127
|
|
|
1061
1128
|
// Instantiate a frame with the selected target's href
|
|
1062
1129
|
let url = target.href
|
|
1130
|
+
|
|
1131
|
+
if (!url) {
|
|
1132
|
+
return
|
|
1133
|
+
}
|
|
1063
1134
|
// document.querySelector("#open-browser").href = url
|
|
1064
1135
|
// document.querySelector("#clone-tab").setAttribute("data-href", url)
|
|
1065
|
-
|
|
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
|
+
}
|
|
1066
1144
|
|
|
1067
1145
|
|
|
1068
1146
|
// select the selected target element (tab)
|
|
@@ -1376,11 +1454,13 @@ body.dark .appcanvas {
|
|
|
1376
1454
|
document.querySelector("#menu").classList.toggle("margin")
|
|
1377
1455
|
})
|
|
1378
1456
|
}
|
|
1457
|
+
/*
|
|
1379
1458
|
document.querySelector("#edit-toggle").addEventListener("click", async (e) => {
|
|
1380
1459
|
e.preventDefault()
|
|
1381
1460
|
e.stopPropagation()
|
|
1382
1461
|
document.querySelector(".editsubmenu").classList.toggle("hidden")
|
|
1383
1462
|
})
|
|
1463
|
+
*/
|
|
1384
1464
|
document.querySelector("#move").addEventListener("click", async (e) => {
|
|
1385
1465
|
e.preventDefault()
|
|
1386
1466
|
e.stopPropagation()
|
|
@@ -1507,6 +1587,24 @@ body.dark .appcanvas {
|
|
|
1507
1587
|
document.querySelector("aside").addEventListener("click", async (e) => {
|
|
1508
1588
|
let target
|
|
1509
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
|
+
|
|
1510
1608
|
|
|
1511
1609
|
// 1. handle delete
|
|
1512
1610
|
if (e.target.classList.contains("del")) {
|
|
@@ -1626,7 +1724,10 @@ body.dark .appcanvas {
|
|
|
1626
1724
|
} else {
|
|
1627
1725
|
if (target.classList.contains("reveal")) {
|
|
1628
1726
|
// nested menu
|
|
1727
|
+
target.closest(".dynamic").classList.toggle("selected")
|
|
1629
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")
|
|
1630
1731
|
e.preventDefault()
|
|
1631
1732
|
e.stopPropagation()
|
|
1632
1733
|
} else {
|
|
@@ -1640,13 +1741,17 @@ body.dark .appcanvas {
|
|
|
1640
1741
|
//location.hash = target.getAttribute("href")
|
|
1641
1742
|
|
|
1642
1743
|
if (target.closest(".h")) {
|
|
1643
|
-
|
|
1744
|
+
if (target.target) {
|
|
1745
|
+
location.hash = target.target
|
|
1746
|
+
}
|
|
1644
1747
|
} else {
|
|
1645
1748
|
let index = target.getAttribute("data-index")
|
|
1646
1749
|
let type = target.closest(".m").getAttribute("data-type")
|
|
1647
1750
|
|
|
1648
1751
|
|
|
1649
|
-
|
|
1752
|
+
if (type) {
|
|
1753
|
+
location.hash = type + index
|
|
1754
|
+
}
|
|
1650
1755
|
}
|
|
1651
1756
|
|
|
1652
1757
|
document.querySelectorAll(".frame-link").forEach((el) => {
|
|
@@ -1722,7 +1827,10 @@ body.dark .appcanvas {
|
|
|
1722
1827
|
// }, 500)
|
|
1723
1828
|
// })
|
|
1724
1829
|
}
|
|
1725
|
-
|
|
1830
|
+
<% if (type === "run" && env.PINOKIO_SCRIPT_DEFAULT && env.PINOKIO_SCRIPT_DEFAULT.toString().toLowerCase() === "true") { %>
|
|
1831
|
+
|
|
1832
|
+
renderSelection()
|
|
1833
|
+
<% } %>
|
|
1726
1834
|
}
|
|
1727
1835
|
}
|
|
1728
1836
|
if (document.querySelector("#genlog")) {
|
|
@@ -1762,9 +1870,14 @@ body.dark .appcanvas {
|
|
|
1762
1870
|
} else if (event.data.action.type === "location") {
|
|
1763
1871
|
let url = event.data.action.url
|
|
1764
1872
|
console.log({ action: event.data.action })
|
|
1765
|
-
|
|
1766
|
-
//document.querySelector("#location").
|
|
1767
|
-
|
|
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
|
+
}
|
|
1768
1881
|
}
|
|
1769
1882
|
} else if (event.data.type) {
|
|
1770
1883
|
let asideHidden = (window.getComputedStyle(document.querySelector("aside")).display === "none")
|
|
@@ -1808,6 +1921,9 @@ body.dark .appcanvas {
|
|
|
1808
1921
|
|
|
1809
1922
|
});
|
|
1810
1923
|
refresh_du()
|
|
1924
|
+
<% if (type !== 'run') { %>
|
|
1925
|
+
document.querySelector(".dynamic .reveal").click()
|
|
1926
|
+
<% } %>
|
|
1811
1927
|
/*
|
|
1812
1928
|
document.addEventListener("keydown", (e) => {
|
|
1813
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)
|