pinokiod 1.3.60 → 1.3.62
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/cloudflare/index.js +2 -0
- package/kernel/api/env/index.js +22 -0
- package/kernel/api/fs/index.js +5 -3
- package/kernel/api/index.js +23 -10
- package/kernel/environment.js +14 -1
- package/kernel/index.js +18 -0
- package/kernel/shell.js +14 -9
- package/kernel/shells.js +0 -3
- package/kernel/util.js +107 -1
- package/package.json +2 -1
- package/server/index.js +88 -10
- package/server/public/style.css +6 -7
- package/server/socket.js +24 -6
- package/server/views/browser-experimental.ejs +31 -4
- package/server/views/env_editor.ejs +184 -0
- package/server/views/fullscreen_editor.ejs +53 -8
- package/server/views/general_editor.ejs +2 -2
- package/server/views/help.ejs +4 -0
- package/server/views/index.ejs +33 -18
- package/server/views/partials/menu.ejs +3 -1
- package/server/views/settings.ejs +5 -1
- package/server/views/share_editor.ejs +196 -0
|
@@ -263,6 +263,14 @@ body.dark .frame-link.selected {
|
|
|
263
263
|
padding: 5px;
|
|
264
264
|
*/
|
|
265
265
|
}
|
|
266
|
+
.loader .btn:hover {
|
|
267
|
+
color: royalblue;
|
|
268
|
+
border-color: royalblue;
|
|
269
|
+
}
|
|
270
|
+
.loader .btn {
|
|
271
|
+
padding: 4px 8px;
|
|
272
|
+
border: 1px solid rgba(255,255,255,0.3);
|
|
273
|
+
}
|
|
266
274
|
.frame-link .tab {
|
|
267
275
|
flex-grow: 1;
|
|
268
276
|
/*
|
|
@@ -342,9 +350,16 @@ body.dark nav {
|
|
|
342
350
|
}
|
|
343
351
|
.container:hover nav {
|
|
344
352
|
display: block;
|
|
353
|
+
max-height: 200px;
|
|
345
354
|
}
|
|
346
355
|
nav {
|
|
356
|
+
overflow: hidden;
|
|
357
|
+
max-height: 0;
|
|
358
|
+
transition: max-height 0.4s ease-out;
|
|
359
|
+
|
|
360
|
+
/*
|
|
347
361
|
display: none;
|
|
362
|
+
*/
|
|
348
363
|
background: white;
|
|
349
364
|
/*
|
|
350
365
|
position: absolute;
|
|
@@ -536,6 +551,9 @@ body.dark .loader-container {
|
|
|
536
551
|
<a target="<%=src%>" href="<%=src%>" class='btn header-item frame-link' data-index="0">
|
|
537
552
|
<div class='tab'><i class="fa-regular fa-folder-open"></i> Files</div>
|
|
538
553
|
</a>
|
|
554
|
+
<a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="1">
|
|
555
|
+
<div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
|
|
556
|
+
</a>
|
|
539
557
|
</div>
|
|
540
558
|
<div class='m h menu' data-type='h'>
|
|
541
559
|
<% if (config.menu) { %>
|
|
@@ -601,7 +619,7 @@ body.dark .loader-container {
|
|
|
601
619
|
<button class='btn2' id='clone-tab'><i class='fa-regular fa-copy'></i> Clone</button>
|
|
602
620
|
<a class='btn2' id='open-browser' target="_blank" href="" features="browser"><i class="fa-solid fa-square-arrow-up-right"></i> Popout</a>
|
|
603
621
|
<button class='btn2' id='reload'><i class="fa-solid fa-rotate-right"></i> Refresh</button>
|
|
604
|
-
<div id='new-tab' class='btn2'><i class="fa-solid fa-plus"></i>
|
|
622
|
+
<div id='new-tab' class='btn2'><i class="fa-solid fa-plus"></i> Tab</div>
|
|
605
623
|
<!--
|
|
606
624
|
<button class='btn2 logo' id='reload'><i class="fa-solid fa-rotate-right"></i></button>
|
|
607
625
|
-->
|
|
@@ -713,7 +731,10 @@ const nav = (type) => {
|
|
|
713
731
|
const renderSelection = (e, force) => {
|
|
714
732
|
console.log("# 1")
|
|
715
733
|
// if the menu has a default item, or if the url specifies a selection
|
|
716
|
-
let selection =
|
|
734
|
+
let selection = null;
|
|
735
|
+
<% if (type === "run" && env.PINOKIO_SCRIPT_DEFAULT && env.PINOKIO_SCRIPT_DEFAULT.toString().toLowerCase() === "true") { %>
|
|
736
|
+
selection = document.querySelector("[data-default]")
|
|
737
|
+
<% } %>
|
|
717
738
|
if (selection || location.hash && location.hash.length > 0) {
|
|
718
739
|
console.log("# 2")
|
|
719
740
|
|
|
@@ -923,6 +944,9 @@ const renderSelection = (e, force) => {
|
|
|
923
944
|
targetFrame.src = target.href
|
|
924
945
|
}
|
|
925
946
|
}
|
|
947
|
+
targetFrame.contentWindow.postMessage({
|
|
948
|
+
action: "foreground"
|
|
949
|
+
}, "*")
|
|
926
950
|
}
|
|
927
951
|
} else {
|
|
928
952
|
console.log("# 12")
|
|
@@ -1248,8 +1272,11 @@ document.querySelector("aside").addEventListener("click", async (e) => {
|
|
|
1248
1272
|
e.stopPropagation()
|
|
1249
1273
|
let link = target.closest("[href]")
|
|
1250
1274
|
let src = new URL(link.href).pathname
|
|
1275
|
+
n.Noty({
|
|
1276
|
+
text: `stopping ${src}`,
|
|
1277
|
+
silent: true
|
|
1278
|
+
})
|
|
1251
1279
|
console.log("src", src)
|
|
1252
|
-
debugger
|
|
1253
1280
|
|
|
1254
1281
|
let socket = new Socket()
|
|
1255
1282
|
socket.run({
|
|
@@ -1262,7 +1289,7 @@ document.querySelector("aside").addEventListener("click", async (e) => {
|
|
|
1262
1289
|
if (packet.type === "result") {
|
|
1263
1290
|
socket.close()
|
|
1264
1291
|
n.Noty({
|
|
1265
|
-
text: `stopped
|
|
1292
|
+
text: `stopped`,
|
|
1266
1293
|
silent: true
|
|
1267
1294
|
})
|
|
1268
1295
|
refresh(true)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<html class='columns'>
|
|
2
|
+
<head>
|
|
3
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
|
4
|
+
<script src="/hotkeys.min.js"></script>
|
|
5
|
+
<script src="/ace/ace.js"></script>
|
|
6
|
+
<script src="/noty.js"></script>
|
|
7
|
+
<script src="/notyq.js"></script>
|
|
8
|
+
<script src="/xterm.js"></script>
|
|
9
|
+
<script src="/xterm-addon-fit.js"></script>
|
|
10
|
+
<script src="/xterm-addon-web-links.js"></script>
|
|
11
|
+
<script src="/xterm-theme.js"></script>
|
|
12
|
+
<script src="/xterm-addon-search.js"></script>
|
|
13
|
+
<script src="/xterm-addon-search-bar.js"></script>
|
|
14
|
+
<script src="/sweetalert2.js"></script>
|
|
15
|
+
<script src="/Socket.js"></script>
|
|
16
|
+
<script src="/common.js"></script>
|
|
17
|
+
<script src="/he.js"></script>
|
|
18
|
+
<script src="/opener.js"></script>
|
|
19
|
+
<script src="/nav.js"></script>
|
|
20
|
+
<script src="/autoexpand.js"></script>
|
|
21
|
+
<script src="/modalinput.js"></script>
|
|
22
|
+
<script src="/simplemodal.js"></script>
|
|
23
|
+
<script src="/waitmodal.js"></script>
|
|
24
|
+
<script src="/notifyinput.js"></script>
|
|
25
|
+
<script src="/report.js"></script>
|
|
26
|
+
<link href="/xterm.min.css" rel="stylesheet" />
|
|
27
|
+
<link href="/css/fontawesome.min.css" rel="stylesheet">
|
|
28
|
+
<link href="/css/solid.min.css" rel="stylesheet">
|
|
29
|
+
<link href="/css/regular.min.css" rel="stylesheet">
|
|
30
|
+
<link href="/css/brands.min.css" rel="stylesheet">
|
|
31
|
+
<link href="/style.css" rel="stylesheet"/>
|
|
32
|
+
<link href="/noty.css" rel="stylesheet"/>
|
|
33
|
+
<% if (agent === "electron") { %>
|
|
34
|
+
<link href="/electron.css" rel="stylesheet"/>
|
|
35
|
+
<% } %>
|
|
36
|
+
<style>
|
|
37
|
+
body.frozen {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-direction: column;
|
|
40
|
+
height: 100%;
|
|
41
|
+
}
|
|
42
|
+
#table > table {
|
|
43
|
+
border-left: 2px solid black;
|
|
44
|
+
padding-left: 5px;
|
|
45
|
+
margin: 10px 0;
|
|
46
|
+
}
|
|
47
|
+
.highlight {
|
|
48
|
+
background: yellow;
|
|
49
|
+
width: 100px;
|
|
50
|
+
}
|
|
51
|
+
th {
|
|
52
|
+
background: rgba(0,0,0,0.1);
|
|
53
|
+
padding: 10px;
|
|
54
|
+
font-size: 12px;
|
|
55
|
+
}
|
|
56
|
+
td {
|
|
57
|
+
font-size: 12px;
|
|
58
|
+
padding: 10px;
|
|
59
|
+
}
|
|
60
|
+
td.val {
|
|
61
|
+
background: rgba(0,0,0,0.06);
|
|
62
|
+
}
|
|
63
|
+
td.key {
|
|
64
|
+
background: rgba(0,0,0,0.1);
|
|
65
|
+
}
|
|
66
|
+
.button {
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
background: rgba(0,0,0,0.8);
|
|
69
|
+
color: white;
|
|
70
|
+
padding: 5px 10px;
|
|
71
|
+
border-radius: 4px;
|
|
72
|
+
}
|
|
73
|
+
.button:hover {
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
#editor {
|
|
77
|
+
box-sizing: border-box;
|
|
78
|
+
max-width: 800px;
|
|
79
|
+
padding: 20px;
|
|
80
|
+
}
|
|
81
|
+
header .runner {
|
|
82
|
+
padding: 10px 0 0;
|
|
83
|
+
}
|
|
84
|
+
.disabled {
|
|
85
|
+
opacity: 0.7;
|
|
86
|
+
}
|
|
87
|
+
body.dark .env-item input[type=text] {
|
|
88
|
+
background: white;
|
|
89
|
+
}
|
|
90
|
+
.env-item input[type=text] {
|
|
91
|
+
width: 100%;
|
|
92
|
+
padding: 10px;
|
|
93
|
+
box-sizing: border-box;
|
|
94
|
+
border: none;
|
|
95
|
+
background: rgba(0,0,100, 0.1);
|
|
96
|
+
}
|
|
97
|
+
body.dark .env-item label {
|
|
98
|
+
color: cornflowerblue;
|
|
99
|
+
}
|
|
100
|
+
.env-item label {
|
|
101
|
+
color: royalblue;
|
|
102
|
+
display: block;
|
|
103
|
+
margin-bottom: 5px;
|
|
104
|
+
font-weight: bold;
|
|
105
|
+
font-size: 18px;
|
|
106
|
+
}
|
|
107
|
+
.env-item {
|
|
108
|
+
padding-top: 10px;
|
|
109
|
+
padding-bottom: 30px;
|
|
110
|
+
}
|
|
111
|
+
body.dark .comment {
|
|
112
|
+
border-left: 2px solid white;
|
|
113
|
+
}
|
|
114
|
+
.comment {
|
|
115
|
+
opacity: 0.8;
|
|
116
|
+
border-left: 2px solid black;
|
|
117
|
+
padding-left: 10px;
|
|
118
|
+
}
|
|
119
|
+
#save {
|
|
120
|
+
background: royalblue;
|
|
121
|
+
}
|
|
122
|
+
</style>
|
|
123
|
+
<script>
|
|
124
|
+
document.addEventListener("DOMContentLoaded", async () => {
|
|
125
|
+
const n = new N()
|
|
126
|
+
document.querySelector("#save").addEventListener("click", async (e) => {
|
|
127
|
+
// save
|
|
128
|
+
const vals = {}
|
|
129
|
+
const els = document.querySelectorAll(".env-item")
|
|
130
|
+
for(let el of els) {
|
|
131
|
+
let input = el.querySelector("input[type=text]")
|
|
132
|
+
vals[input.id] = input.value
|
|
133
|
+
}
|
|
134
|
+
console.log("vals", vals)
|
|
135
|
+
let res = await fetch("/env", {
|
|
136
|
+
method: "POST",
|
|
137
|
+
headers: {
|
|
138
|
+
"Content-Type": "application/json"
|
|
139
|
+
},
|
|
140
|
+
body: JSON.stringify({
|
|
141
|
+
filepath: location.pathname.slice(5),
|
|
142
|
+
vals
|
|
143
|
+
})
|
|
144
|
+
}).then((res) => {
|
|
145
|
+
return res.json()
|
|
146
|
+
})
|
|
147
|
+
console.log("res" ,res)
|
|
148
|
+
n.Noty({
|
|
149
|
+
text: `Updated!`
|
|
150
|
+
})
|
|
151
|
+
})
|
|
152
|
+
})
|
|
153
|
+
</script>
|
|
154
|
+
</head>
|
|
155
|
+
<body class='columns <%=theme%>'>
|
|
156
|
+
<header class='navheader grabbable'>
|
|
157
|
+
<h1>
|
|
158
|
+
<a class='home' href="/"><i class="fa-solid fa-house"></i></a>
|
|
159
|
+
<%=filepath%>
|
|
160
|
+
</h1>
|
|
161
|
+
<div class='runner'>
|
|
162
|
+
<div id='save' class='btn'>
|
|
163
|
+
<span class='save'><i class="fa-solid fa-check"></i> Save</span>
|
|
164
|
+
</div>
|
|
165
|
+
<a class='btn' href="<%=editorpath%>"><i class="fa-solid fa-pen-to-square"></i> Edit file</a>
|
|
166
|
+
<button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> Open in File Explorer</button>
|
|
167
|
+
</div>
|
|
168
|
+
</header>
|
|
169
|
+
<main>
|
|
170
|
+
<div id='editor'>
|
|
171
|
+
<% items.forEach((item) => { %>
|
|
172
|
+
<% if (item.type === "comment") { %>
|
|
173
|
+
<div class='comment'><%=item.val.replaceAll(/^[ #]+/g, "")%></div>
|
|
174
|
+
<% } else { %>
|
|
175
|
+
<div class='env-item'>
|
|
176
|
+
<label for="<%=item.key%>"><%=item.key%></label>
|
|
177
|
+
<input id="<%=item.key%>" type="text" value="<%=item.val%>">
|
|
178
|
+
</div>
|
|
179
|
+
<% } %>
|
|
180
|
+
<% }) %>
|
|
181
|
+
</div>
|
|
182
|
+
</main>
|
|
183
|
+
</body>
|
|
184
|
+
</html>
|
|
@@ -139,6 +139,10 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
139
139
|
constructor() {
|
|
140
140
|
this.socket = new Socket()
|
|
141
141
|
}
|
|
142
|
+
write(text) {
|
|
143
|
+
this.term.write(text)
|
|
144
|
+
this.dirty = true
|
|
145
|
+
}
|
|
142
146
|
finished() {
|
|
143
147
|
/*
|
|
144
148
|
n.Noty({
|
|
@@ -201,7 +205,11 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
201
205
|
rows: this.term.rows,
|
|
202
206
|
}
|
|
203
207
|
}, async (packet) => {
|
|
204
|
-
|
|
208
|
+
|
|
209
|
+
console.log("packet", packet.type, packet)
|
|
210
|
+
if (packet.data) {
|
|
211
|
+
console.log("packet.data.raw", packet.data.raw)
|
|
212
|
+
}
|
|
205
213
|
if (packet.type === 'start') {
|
|
206
214
|
refreshParent(packet)
|
|
207
215
|
reloadMemory()
|
|
@@ -233,14 +241,15 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
233
241
|
// </div>`
|
|
234
242
|
}
|
|
235
243
|
} else if (packet.type === "stream") {
|
|
244
|
+
console.log({ cols: this.term.cols, rows: this.term.rows })
|
|
236
245
|
if (packet.data.raw) {
|
|
237
|
-
this.
|
|
246
|
+
this.write(packet.data.raw)
|
|
238
247
|
} else if (packet.data.json) {
|
|
239
|
-
this.
|
|
240
|
-
this.
|
|
248
|
+
this.write(JSON.stringify(packet.data.json).replace(/\n/g, "\r\n"))
|
|
249
|
+
this.write("\r\n")
|
|
241
250
|
} else if (packet.data.json2) {
|
|
242
|
-
this.
|
|
243
|
-
this.
|
|
251
|
+
this.write(JSON.stringify(packet.data.json2, null, 2).replace(/\n/g, "\r\n"))
|
|
252
|
+
this.write("\r\n")
|
|
244
253
|
}
|
|
245
254
|
document.querySelector(".run .play").classList.add("hidden")
|
|
246
255
|
document.querySelector(".run .starting").classList.add("hidden")
|
|
@@ -248,14 +257,14 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
248
257
|
} else if (packet.type === 'disconnect') {
|
|
249
258
|
refreshParent(packet)
|
|
250
259
|
reloadMemory()
|
|
251
|
-
this.term.write("\r\nDisconnected...\r\n")
|
|
260
|
+
//this.term.write("\r\nDisconnected...\r\n")
|
|
252
261
|
document.querySelector("footer").innerHTML = "<b>Ready</b>"
|
|
253
262
|
this.socket.close()
|
|
254
263
|
document.querySelector(".run .play").classList.remove("hidden")
|
|
255
264
|
document.querySelector(".run .stop").classList.add("hidden")
|
|
256
265
|
} else if (packet.type === 'connect') {
|
|
257
266
|
const message = "..........Connected!\r\n"
|
|
258
|
-
this.
|
|
267
|
+
this.write(message)
|
|
259
268
|
/*
|
|
260
269
|
for(let i=0; i<message.length; i++) {
|
|
261
270
|
await new Promise((r, reject) => {
|
|
@@ -527,6 +536,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
527
536
|
createTerm () {
|
|
528
537
|
if (!this.term) {
|
|
529
538
|
const term = new Terminal({
|
|
539
|
+
scrollback: 9999999,
|
|
530
540
|
//theme: xtermTheme.Piatto_Light,
|
|
531
541
|
//theme: xtermTheme.Spring,
|
|
532
542
|
|
|
@@ -597,6 +607,41 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
597
607
|
<% if (mod && runnable) { %>
|
|
598
608
|
window.addEventListener('message', function(event) {
|
|
599
609
|
console.log("Message received from the parent: ", event.data); // Message received from parent
|
|
610
|
+
// "foreground" message adds a newline to the terminal
|
|
611
|
+
// Needed to fix the issue where the terminal won't write anything when in background
|
|
612
|
+
// so when coming back from background, need to refresh by just adding a newline.
|
|
613
|
+
if (event.data && event.data.action === "foreground") {
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
// if dirty, update
|
|
617
|
+
// if not dirty, don't update
|
|
618
|
+
const delimiter = "\r\n"
|
|
619
|
+
if (rpc.dirty) {
|
|
620
|
+
rpc.term.write(delimiter)
|
|
621
|
+
rpc.dirty = false
|
|
622
|
+
} else {
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
//console.log("buffer", rpc.term.buffer)
|
|
626
|
+
//if (rpc.term.buffer) {
|
|
627
|
+
// const lastRow = rpc.term.buffer.active.baseY;
|
|
628
|
+
// const lastLine = rpc.term.buffer.active.getLine(lastRow);
|
|
629
|
+
// const lastLine2 = rpc.term.buffer.active.getLine(lastRow-1);
|
|
630
|
+
// const cell = lastLine.getCell().getChars()
|
|
631
|
+
// const cell2 = lastLine.getCell().getChars()
|
|
632
|
+
// console.log({ lastLine, lastLine2, cell, cell2 })
|
|
633
|
+
// const lastStr = cell[cell.length - 3];
|
|
634
|
+
// console.log({ lastRow, lastLine, lastStr })
|
|
635
|
+
|
|
636
|
+
// const delimiter = "\r\n█"
|
|
637
|
+
// if (lastStr === delimiter) {
|
|
638
|
+
// console.log("don't update")
|
|
639
|
+
// } else {
|
|
640
|
+
// console.log("update")
|
|
641
|
+
// rpc.term.write(delimiter)
|
|
642
|
+
// }
|
|
643
|
+
//}
|
|
644
|
+
}
|
|
600
645
|
});
|
|
601
646
|
|
|
602
647
|
document.querySelector(".stop").addEventListener("click", async (e) => {
|
|
@@ -146,9 +146,9 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
146
146
|
this.socket.close()
|
|
147
147
|
this.socket.run({
|
|
148
148
|
method: "fs.write",
|
|
149
|
-
cwd: "{{kernel.homedir}}",
|
|
149
|
+
//cwd: "{{kernel.homedir}}",
|
|
150
150
|
params: {
|
|
151
|
-
path: filepath
|
|
151
|
+
path: `{{path.resolve(kernel.homedir, "${filepath}")}}`,
|
|
152
152
|
text: str,
|
|
153
153
|
}
|
|
154
154
|
}, (packet) => {
|
package/server/views/help.ejs
CHANGED
package/server/views/index.ejs
CHANGED
|
@@ -112,13 +112,7 @@ a.badge {
|
|
|
112
112
|
}
|
|
113
113
|
body.dark .btn {
|
|
114
114
|
color: white;
|
|
115
|
-
/*
|
|
116
|
-
color: cornflowerblue;
|
|
117
|
-
*/
|
|
118
115
|
border: 1px solid rgba(255,255,255,0.3);
|
|
119
|
-
/*
|
|
120
|
-
border: 1px solid rgba(100, 149, 237, 0.3);
|
|
121
|
-
*/
|
|
122
116
|
}
|
|
123
117
|
body.dark .badge {
|
|
124
118
|
background: rgba(255,255,255,0.1);
|
|
@@ -288,16 +282,19 @@ body.dark .browser-options-row {
|
|
|
288
282
|
<div class='uri'><i class="fa-regular fa-folder"></i><%=item.url%></div>
|
|
289
283
|
<div class='title'><%=item.name%></div>
|
|
290
284
|
<div class='description'><%=item.description%></div>
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
<
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
285
|
+
<div>
|
|
286
|
+
<button class='btn browse' data-src="<%=item.browser_url%>/browse">
|
|
287
|
+
<i class="fa-regular fa-folder-open"></i>
|
|
288
|
+
</button>
|
|
289
|
+
<% if (item.running_scripts) { %>
|
|
290
|
+
<% item.running_scripts.forEach((s) => { %>
|
|
291
|
+
<button class='btn shutdown' data-src="<%=s.path%>">
|
|
292
|
+
<i class="fa-solid fa-stop"></i> Stop <%=s.name%>
|
|
293
|
+
<i class='fa-solid fa-spin fa-circle-notch'></i>
|
|
294
|
+
</button>
|
|
295
|
+
<% }) %>
|
|
296
|
+
<% } %>
|
|
297
|
+
</div>
|
|
301
298
|
<% if (item.shortcuts && item.shortcuts.length > 0) { %>
|
|
302
299
|
<div class='btns'>
|
|
303
300
|
<% item.shortcuts.forEach((btn) => { %>
|
|
@@ -336,6 +333,9 @@ body.dark .browser-options-row {
|
|
|
336
333
|
<div class='uri'><i class="fa-regular fa-folder"></i><%=item.url%></div>
|
|
337
334
|
<div class='title'><%=item.name%></div>
|
|
338
335
|
<div class='description'><%=item.description%></div>
|
|
336
|
+
<button class='btn browse' data-src="<%=item.browser_url%>/browse">
|
|
337
|
+
<i class="fa-regular fa-folder-open"></i>
|
|
338
|
+
</button>
|
|
339
339
|
<% if (item.shortcuts && item.shortcuts.length > 0) { %>
|
|
340
340
|
<div class='btns'>
|
|
341
341
|
<% item.shortcuts.forEach((btn) => { %>
|
|
@@ -346,6 +346,9 @@ body.dark .browser-options-row {
|
|
|
346
346
|
</div>
|
|
347
347
|
<% } %>
|
|
348
348
|
</div>
|
|
349
|
+
<div class='spinner'>
|
|
350
|
+
<i class="fa-solid fa-chevron-right"></i>
|
|
351
|
+
</div>
|
|
349
352
|
</h3>
|
|
350
353
|
</a>
|
|
351
354
|
<% }) %>
|
|
@@ -729,7 +732,6 @@ document.addEventListener("click", (e) => {
|
|
|
729
732
|
e.stopPropagation()
|
|
730
733
|
let src = target.getAttribute("data-src")
|
|
731
734
|
console.log("src", src)
|
|
732
|
-
debugger
|
|
733
735
|
|
|
734
736
|
socket.run({
|
|
735
737
|
method: "kernel.api.stop",
|
|
@@ -756,6 +758,20 @@ document.addEventListener("click", (e) => {
|
|
|
756
758
|
}
|
|
757
759
|
|
|
758
760
|
|
|
761
|
+
if (e.target.classList.contains("browse")) {
|
|
762
|
+
target = e.target
|
|
763
|
+
} else {
|
|
764
|
+
target = e.target.closest(".browse")
|
|
765
|
+
}
|
|
766
|
+
if (target) {
|
|
767
|
+
e.preventDefault()
|
|
768
|
+
e.stopPropagation()
|
|
769
|
+
let src = target.getAttribute("data-src")
|
|
770
|
+
location.href = src
|
|
771
|
+
return
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
|
|
759
775
|
if (document.querySelector(".container")) {
|
|
760
776
|
document.querySelector(".container").addEventListener("click", async (e) => {
|
|
761
777
|
let el = e.target.closest(".menu-btn")
|
|
@@ -766,7 +782,6 @@ document.addEventListener("click", (e) => {
|
|
|
766
782
|
}
|
|
767
783
|
|
|
768
784
|
console.log("EL", el)
|
|
769
|
-
debugger
|
|
770
785
|
|
|
771
786
|
if (el) {
|
|
772
787
|
e.preventDefault()
|
|
@@ -145,6 +145,10 @@ body.dark .item select {
|
|
|
145
145
|
padding: 10px 20px;
|
|
146
146
|
text-align: center;
|
|
147
147
|
}
|
|
148
|
+
body.dark .btn {
|
|
149
|
+
color: white;
|
|
150
|
+
border: 1px solid rgba(255,255,255,0.3) !important;
|
|
151
|
+
}
|
|
148
152
|
body.light {
|
|
149
153
|
/*
|
|
150
154
|
background: var(--light-nav-bg);
|
|
@@ -298,7 +302,7 @@ hr {
|
|
|
298
302
|
<br>
|
|
299
303
|
<div>Edit the system ENVIRONMENT file to customize pinokio system wide settings, such as where files are stored, terminal behavior, etc.</div>
|
|
300
304
|
<br>
|
|
301
|
-
<a class='btn' href="/
|
|
305
|
+
<a class='btn' href="/env/ENVIRONMENT"><i class="fa-regular fa-pen-to-square"></i> Edit ENVIRONMENT</a>
|
|
302
306
|
</div>
|
|
303
307
|
<hr/>
|
|
304
308
|
<div class='troubleshoot'>
|