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.
@@ -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
- if (type !== 'file') {
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();
@@ -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) {
@@ -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
- background: brown !important;
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 = this.parent.kernel.api.filePath(req.uri)
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) {
@@ -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: 10px;
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
- padding-left: 15px;
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 (config.icon) { %>
710
- <img src="<%=config.icon%>"/>
711
- <% } else { %>
712
- <i class="fa-regular fa-circle-dot"></i>
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><%=config.title%></div>
715
- <div class="folderpath">/api/<%=name%></div>
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
- <a class='btn header-item frame-link' href="/prototype">
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
- </button>
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='btn header-item frame-link' id='copy'>
736
- <div class='tab'><i class="fa-solid fa-copy"></i> Copy folder</div>
737
- </div>
738
- <div class='btn header-item frame-link' id='delete' data-name="<%=name%>">
739
- <div class='tab'><i class="fa-solid fa-trash-can"></i> Delete folder</div>
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
- <a target="run_frame" href="/run/<%=name%>" class='btn header-item frame-link' data-index="1">
764
- <div class='tab'><i class="fa-solid fa-bolt-lightning"></i> Run...</div>
765
- </a>
766
- -->
767
- <!--
768
- <a target="_blank" href="/terminal/<%=name%>/<%=Date.now()%>" class='btn header-item frame-link' data-index="1">
769
- <div class='tab'><i class="fa-solid fa-terminal"></i> Terminal</div>
770
- </a>
771
- -->
772
- <a target="_blank" href="<%=profile%>" class='btn header-item frame-link'>
773
- <div class='tab'><i class="fa-regular fa-circle-user"></i> Publisher</div>
774
- </a>
775
- <a target="_blank" href="<%=feed%>" class='btn header-item frame-link'>
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
- document.querySelector("#location").value = url
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
- location.hash = target.target
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
- location.hash = type + index
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
- renderSelection()
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
- document.querySelector("#open-browser").href = url
1762
- //document.querySelector("#location").innerHTML = url
1763
- document.querySelector("#location").value = url
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
@@ -215,6 +215,7 @@ footer .btn.go-home {
215
215
  }
216
216
  .env-title {
217
217
  font-weight: bold;
218
+ margin-bottom: 5px;
218
219
  }
219
220
  .env-description {
220
221
  margin-bottom: 10px;
@@ -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)