pinokiod 7.3.9 → 7.3.11
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/bin/brew.js +12 -2
- package/kernel/bin/caddy.js +24 -20
- package/kernel/bin/huggingface.js +2 -2
- package/kernel/bin/setup.js +2 -3
- package/kernel/bin/uv.js +13 -6
- package/kernel/connect/index.js +5 -1
- package/kernel/connect/providers/huggingface/index.js +213 -75
- package/kernel/environment.js +16 -1
- package/kernel/router/localhost_home_router.js +7 -0
- package/kernel/shell.js +1 -5
- package/kernel/util.js +1 -0
- package/package.json +1 -1
- package/server/index.js +75 -33
- package/server/public/common.js +52 -88
- package/server/public/install.js +20 -2
- package/server/public/layout.js +1 -1
- package/server/public/nav.js +3 -1
- package/server/public/style.css +1455 -521
- package/server/public/tab-link-popover.css +162 -18
- package/server/public/tab-link-popover.js +230 -21
- package/server/public/task-launcher.css +182 -91
- package/server/public/terminal-settings.js +227 -50
- package/server/public/universal-launcher.css +42 -33
- package/server/public/urldropdown.css +284 -0
- package/server/views/app.ejs +1718 -352
- package/server/views/autolaunch.ejs +4 -5
- package/server/views/checkpoints.ejs +223 -50
- package/server/views/connect/huggingface.ejs +406 -325
- package/server/views/connect.ejs +0 -1
- package/server/views/github.ejs +277 -324
- package/server/views/index.ejs +65 -8
- package/server/views/install.ejs +134 -65
- package/server/views/logs.ejs +9 -8
- package/server/views/net.ejs +341 -64
- package/server/views/network.ejs +85 -63
- package/server/views/partials/main_sidebar.ejs +249 -24
- package/server/views/plugins.ejs +141 -3
- package/server/views/settings.ejs +103 -7
- package/server/views/setup.ejs +0 -5
- package/server/views/skills.ejs +0 -1
- package/server/views/task_list.ejs +0 -1
- package/server/views/terminal.ejs +285 -60
- package/server/views/terminals.ejs +346 -6
- package/server/views/tools.ejs +828 -1691
- package/test/caddy-install.test.js +53 -0
- package/test/connect-setup.test.js +16 -0
- package/test/github-connection.test.js +1 -1
- package/test/huggingface-bin.test.js +4 -4
- package/test/huggingface-connect.test.js +73 -0
- package/test/main-sidebar.test.js +31 -0
- package/test/shell-run-template.test.js +5 -1
- package/test/uv-bin.test.js +29 -0
package/server/views/connect.ejs
CHANGED
|
@@ -805,7 +805,6 @@ body.dark .profile td {
|
|
|
805
805
|
<section class='task-shell connect-shell'>
|
|
806
806
|
<header class='task-shell-header'>
|
|
807
807
|
<div class='task-shell-header-main'>
|
|
808
|
-
<p class='task-eyebrow'>Login</p>
|
|
809
808
|
<h1 class='task-title'>Connected services</h1>
|
|
810
809
|
<p class='task-description'>Log into localhost apps with third-party services.</p>
|
|
811
810
|
</div>
|
package/server/views/github.ejs
CHANGED
|
@@ -1,333 +1,286 @@
|
|
|
1
|
-
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
2
3
|
<head>
|
|
3
|
-
<meta charset="
|
|
4
|
-
<meta name="viewport" content="width=device-width, initial-scale=1"
|
|
5
|
-
<
|
|
6
|
-
<link href="/css/fontawesome.min.css" rel="stylesheet">
|
|
7
|
-
<link href="/css/solid.min.css" rel="stylesheet">
|
|
8
|
-
<link href="/css/regular.min.css" rel="stylesheet">
|
|
9
|
-
<link href="/css/brands.min.css" rel="stylesheet">
|
|
10
|
-
<link href="/markdown.css" rel="stylesheet"
|
|
11
|
-
<link href="/noty.css" rel="stylesheet"
|
|
12
|
-
<link href="/style.css" rel="stylesheet"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
.
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
.
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
.head {
|
|
151
|
-
padding: 30px;
|
|
152
|
-
text-align: center;
|
|
153
|
-
}
|
|
154
|
-
.head .desc {
|
|
155
|
-
opacity: 0.7;
|
|
156
|
-
padding: 10px;
|
|
157
|
-
}
|
|
158
|
-
.head h3 {
|
|
159
|
-
font-size: 20px;
|
|
160
|
-
text-transform: uppercase;
|
|
161
|
-
margin: 0;
|
|
162
|
-
}
|
|
163
|
-
.head h3 i {
|
|
164
|
-
font-size: 80px;
|
|
165
|
-
}
|
|
166
|
-
body.dark .card {
|
|
167
|
-
color: white;
|
|
168
|
-
}
|
|
169
|
-
.card {
|
|
170
|
-
text-decoration: none;
|
|
171
|
-
width: 200px;
|
|
172
|
-
color: rgba(0,0,0,0.9);
|
|
173
|
-
text-align: center;
|
|
174
|
-
margin: 20px;
|
|
175
|
-
}
|
|
176
|
-
.card:hover {
|
|
177
|
-
color: royalblue !important;
|
|
178
|
-
}
|
|
179
|
-
.card .desc {
|
|
180
|
-
opacity: 0.7;
|
|
181
|
-
}
|
|
182
|
-
.card h3 {
|
|
183
|
-
font-size: 30px;
|
|
184
|
-
letter-spacing: -1px;
|
|
185
|
-
}
|
|
186
|
-
.card i {
|
|
187
|
-
font-size: 50px;
|
|
188
|
-
}
|
|
189
|
-
a {
|
|
190
|
-
color: royalblue;
|
|
191
|
-
}
|
|
192
|
-
body.dark hr {
|
|
193
|
-
background: rgba(255,255,255,0.05);
|
|
194
|
-
}
|
|
195
|
-
hr {
|
|
196
|
-
background: rgba(0,0,0,0.05);
|
|
197
|
-
height: 4px;
|
|
198
|
-
border: none;
|
|
199
|
-
margin: 40px 0;
|
|
200
|
-
}
|
|
201
|
-
#readme {
|
|
202
|
-
flex-grow: 1;
|
|
203
|
-
}
|
|
204
|
-
.cols {
|
|
205
|
-
max-width: 1000px;
|
|
206
|
-
margin: 0 auto;
|
|
207
|
-
display: flex;
|
|
208
|
-
}
|
|
209
|
-
body.dark .column {
|
|
210
|
-
background: rgba(0,0,0,0.1);
|
|
211
|
-
}
|
|
212
|
-
.column {
|
|
213
|
-
background: rgba(0,0,0,0.04);
|
|
214
|
-
margin: 10px;
|
|
215
|
-
width: 50%;
|
|
216
|
-
padding: 20px;
|
|
217
|
-
box-sizing: border-box;
|
|
218
|
-
}
|
|
219
|
-
.column h1 {
|
|
220
|
-
padding: 5px;
|
|
221
|
-
letter-spacing: -1px;
|
|
222
|
-
}
|
|
223
|
-
ol {
|
|
224
|
-
padding-inline-start: 20px;
|
|
225
|
-
}
|
|
226
|
-
</style>
|
|
227
|
-
<script src="/popper.min.js"></script>
|
|
228
|
-
<script src="/tippy-bundle.umd.min.js"></script>
|
|
229
|
-
<script src="/hotkeys.min.js"></script>
|
|
230
|
-
<script src="/sweetalert2.js"></script>
|
|
231
|
-
<script src="/common.js"></script>
|
|
232
|
-
<script src="/opener.js"></script>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Configure Git</title>
|
|
7
|
+
<link href="/css/fontawesome.min.css" rel="stylesheet">
|
|
8
|
+
<link href="/css/solid.min.css" rel="stylesheet">
|
|
9
|
+
<link href="/css/regular.min.css" rel="stylesheet">
|
|
10
|
+
<link href="/css/brands.min.css" rel="stylesheet">
|
|
11
|
+
<link href="/markdown.css" rel="stylesheet">
|
|
12
|
+
<link href="/noty.css" rel="stylesheet">
|
|
13
|
+
<link href="/style.css" rel="stylesheet">
|
|
14
|
+
<link href="/task-launcher.css" rel="stylesheet">
|
|
15
|
+
<% if (agent === "electron") { %>
|
|
16
|
+
<link href="/electron.css" rel="stylesheet"/>
|
|
17
|
+
<% } %>
|
|
18
|
+
<style>
|
|
19
|
+
.github-login-shell {
|
|
20
|
+
max-width: 980px;
|
|
21
|
+
}
|
|
22
|
+
.github-section-grid {
|
|
23
|
+
display: grid;
|
|
24
|
+
grid-template-columns: minmax(0, 1fr) minmax(280px, 0.72fr);
|
|
25
|
+
gap: 24px;
|
|
26
|
+
align-items: start;
|
|
27
|
+
}
|
|
28
|
+
.github-state-panel {
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: flex-start;
|
|
31
|
+
gap: 14px;
|
|
32
|
+
min-width: 0;
|
|
33
|
+
}
|
|
34
|
+
.github-state-icon {
|
|
35
|
+
width: 36px;
|
|
36
|
+
height: 36px;
|
|
37
|
+
border-radius: 8px;
|
|
38
|
+
display: inline-flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
justify-content: center;
|
|
41
|
+
flex: 0 0 auto;
|
|
42
|
+
background: var(--task-chip-bg, var(--task-soft));
|
|
43
|
+
border: 1px solid var(--task-border);
|
|
44
|
+
color: var(--task-text);
|
|
45
|
+
}
|
|
46
|
+
.github-state-copy {
|
|
47
|
+
min-width: 0;
|
|
48
|
+
display: grid;
|
|
49
|
+
gap: 10px;
|
|
50
|
+
}
|
|
51
|
+
.github-state-title {
|
|
52
|
+
margin: 0;
|
|
53
|
+
color: var(--task-text);
|
|
54
|
+
font-size: 18px;
|
|
55
|
+
font-weight: 800;
|
|
56
|
+
line-height: 1.25;
|
|
57
|
+
letter-spacing: 0;
|
|
58
|
+
}
|
|
59
|
+
.github-state-detail {
|
|
60
|
+
margin: 0;
|
|
61
|
+
color: var(--task-muted);
|
|
62
|
+
font-size: 14px;
|
|
63
|
+
line-height: 1.55;
|
|
64
|
+
}
|
|
65
|
+
.github-action-row {
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-wrap: wrap;
|
|
68
|
+
gap: 10px;
|
|
69
|
+
margin-top: 2px;
|
|
70
|
+
}
|
|
71
|
+
.github-account-box {
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
max-width: 520px;
|
|
74
|
+
width: 100%;
|
|
75
|
+
margin: 2px 0 0;
|
|
76
|
+
padding: 12px 14px;
|
|
77
|
+
border: 1px solid var(--task-border);
|
|
78
|
+
border-radius: 8px;
|
|
79
|
+
background: var(--task-panel);
|
|
80
|
+
color: var(--task-text);
|
|
81
|
+
font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
82
|
+
white-space: pre-wrap;
|
|
83
|
+
overflow-wrap: anywhere;
|
|
84
|
+
}
|
|
85
|
+
.github-readme {
|
|
86
|
+
display: grid;
|
|
87
|
+
gap: 10px;
|
|
88
|
+
color: var(--task-muted);
|
|
89
|
+
font-size: 13px;
|
|
90
|
+
line-height: 1.5;
|
|
91
|
+
}
|
|
92
|
+
.github-readme :first-child {
|
|
93
|
+
margin-top: 0;
|
|
94
|
+
}
|
|
95
|
+
.github-readme :last-child {
|
|
96
|
+
margin-bottom: 0;
|
|
97
|
+
}
|
|
98
|
+
.github-readme p {
|
|
99
|
+
margin: 0;
|
|
100
|
+
}
|
|
101
|
+
.github-readme ol {
|
|
102
|
+
margin: 0;
|
|
103
|
+
padding-left: 20px;
|
|
104
|
+
}
|
|
105
|
+
.github-readme code {
|
|
106
|
+
color: var(--task-text);
|
|
107
|
+
}
|
|
108
|
+
.github-config-form {
|
|
109
|
+
display: grid;
|
|
110
|
+
gap: 14px;
|
|
111
|
+
margin: 0;
|
|
112
|
+
}
|
|
113
|
+
.github-config-fields {
|
|
114
|
+
display: grid;
|
|
115
|
+
gap: 13px;
|
|
116
|
+
max-width: 520px;
|
|
117
|
+
}
|
|
118
|
+
.github-config-actions {
|
|
119
|
+
display: flex;
|
|
120
|
+
flex-wrap: wrap;
|
|
121
|
+
gap: 10px;
|
|
122
|
+
align-items: center;
|
|
123
|
+
}
|
|
124
|
+
.github-config-submit {
|
|
125
|
+
min-width: 112px;
|
|
126
|
+
}
|
|
127
|
+
.github-config-path {
|
|
128
|
+
color: var(--task-muted);
|
|
129
|
+
font-size: 12px;
|
|
130
|
+
line-height: 1.45;
|
|
131
|
+
}
|
|
132
|
+
.github-config-feedback {
|
|
133
|
+
margin: 0;
|
|
134
|
+
}
|
|
135
|
+
.github-config-feedback.success {
|
|
136
|
+
border-color: color-mix(in srgb, #16a34a 22%, transparent);
|
|
137
|
+
background: color-mix(in srgb, #16a34a 10%, var(--task-panel));
|
|
138
|
+
color: #166534;
|
|
139
|
+
}
|
|
140
|
+
body.dark .github-config-feedback.success {
|
|
141
|
+
border-color: color-mix(in srgb, #86efac 28%, transparent);
|
|
142
|
+
background: rgba(34, 197, 94, 0.12);
|
|
143
|
+
color: #86efac;
|
|
144
|
+
}
|
|
145
|
+
@media (max-width: 820px) {
|
|
146
|
+
.github-section-grid {
|
|
147
|
+
grid-template-columns: 1fr;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
233
151
|
</head>
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
<
|
|
244
|
-
|
|
245
|
-
<
|
|
246
|
-
<div class=
|
|
247
|
-
<
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
<
|
|
251
|
-
|
|
252
|
-
</a>
|
|
253
|
-
<button class='btn2' id='new-window' data-tippy-content="open a new window" title='open a new window' data-agent="<%=agent%>">
|
|
254
|
-
<div><i class="fa-solid fa-plus"></i></div>
|
|
255
|
-
</button>
|
|
256
|
-
<button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
|
|
257
|
-
<div><i class="fa-solid fa-xmark"></i></div>
|
|
258
|
-
</button>
|
|
259
|
-
</h1>
|
|
260
|
-
</header>
|
|
261
|
-
<main>
|
|
262
|
-
<div class='head'>
|
|
263
|
-
<h3><i class="fa-brands fa-git-alt"></i><br><br>Configure Git</h3>
|
|
264
|
-
</div>
|
|
265
|
-
<div class='cols'>
|
|
266
|
-
<div class='column'>
|
|
267
|
-
<h1><i class="fa-brands fa-github"></i> GitHub</h1>
|
|
268
|
-
<div>Connect with GitHub to publish projects to GitHub.</div>
|
|
269
|
-
<div class='setup-items'>
|
|
270
|
-
<% if (hosts.length > 0) { %>
|
|
271
|
-
<pre><%=hosts%></pre>
|
|
272
|
-
<% } else { %>
|
|
273
|
-
<pre>not logged in</pre>
|
|
274
|
-
<% } %>
|
|
275
|
-
</div>
|
|
276
|
-
<div class='setup-items'>
|
|
277
|
-
<% items.forEach((item) => { %>
|
|
278
|
-
<a class='btn' href="<%=item.url%>">
|
|
279
|
-
<i class="<%=item.icon%>"></i> <%=item.title%>
|
|
280
|
-
</a>
|
|
281
|
-
<% }) %>
|
|
282
|
-
</div>
|
|
283
|
-
<div class='setup-items'>
|
|
284
|
-
<div id='readme'><%-readme%></div>
|
|
285
|
-
</div>
|
|
286
|
-
</div>
|
|
287
|
-
<div class='column'>
|
|
288
|
-
<h1><i class="fa-brands fa-square-git"></i> Git Config</h1>
|
|
289
|
-
<div>These credentials will show up on every commit.</div>
|
|
290
|
-
<div class='setup-items'>
|
|
291
|
-
<form class='gitconfig'>
|
|
292
|
-
<div class='pre'>
|
|
293
|
-
<div class='field'>
|
|
294
|
-
<label>username</label>
|
|
295
|
-
<input id='username' type='text' value="<%=gitconfig.user && gitconfig.user.name ? gitconfig.user.name : ''%>">
|
|
152
|
+
<%
|
|
153
|
+
const selected = "connect";
|
|
154
|
+
const isGithubConnected = typeof hosts === "string" && hosts.trim().length > 0;
|
|
155
|
+
const connectionLabel = isGithubConnected ? "Connected" : "Not connected";
|
|
156
|
+
const connectionIcon = isGithubConnected ? "fa-solid fa-circle-check" : "fa-regular fa-circle";
|
|
157
|
+
const connectionDetail = isGithubConnected
|
|
158
|
+
? "Git Credential Manager is ready for GitHub operations inside Pinokio."
|
|
159
|
+
: "Connect GitHub to clone private repositories and publish from Pinokio.";
|
|
160
|
+
%>
|
|
161
|
+
<body class="<%= theme %> main-sidebar-page task-launcher-page task-page setup-page github-page" data-agent="<%= agent %>" data-page="github-config">
|
|
162
|
+
<%- include('partials/app_navheader', { agent }) %>
|
|
163
|
+
<main>
|
|
164
|
+
<div class="task-container">
|
|
165
|
+
<section class="task-shell github-login-shell">
|
|
166
|
+
<header class="task-shell-header">
|
|
167
|
+
<div class="task-shell-header-main">
|
|
168
|
+
<div class="task-shell-topline">
|
|
169
|
+
<p class="task-eyebrow">Login / GitHub</p>
|
|
296
170
|
</div>
|
|
297
|
-
<
|
|
298
|
-
|
|
299
|
-
|
|
171
|
+
<h1 class="task-title">Configure Git</h1>
|
|
172
|
+
<p class="task-description">Connect GitHub for private repositories and publishing, then set the identity Git writes on commits.</p>
|
|
173
|
+
<div class="task-badge-row task-header-badges">
|
|
174
|
+
<span class="task-badge <%= isGithubConnected ? 'task-badge-accent' : 'task-badge-neutral' %>"><%= connectionLabel %></span>
|
|
175
|
+
<span class="task-badge task-badge-neutral">Git Credential Manager</span>
|
|
176
|
+
<span class="task-badge task-badge-neutral">~/pinokio/gitconfig</span>
|
|
300
177
|
</div>
|
|
301
178
|
</div>
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
179
|
+
</header>
|
|
180
|
+
|
|
181
|
+
<div class="task-shell-body">
|
|
182
|
+
<section class="task-section task-section-subtle">
|
|
183
|
+
<div class="github-section-grid">
|
|
184
|
+
<div class="github-state-panel">
|
|
185
|
+
<div class="github-state-icon" aria-hidden="true">
|
|
186
|
+
<i class="<%= connectionIcon %>"></i>
|
|
187
|
+
</div>
|
|
188
|
+
<div class="github-state-copy">
|
|
189
|
+
<h2 class="github-state-title">GitHub <%= connectionLabel.toLowerCase() %></h2>
|
|
190
|
+
<p class="github-state-detail"><%= connectionDetail %></p>
|
|
191
|
+
<pre class="github-account-box"><%= isGithubConnected ? hosts : 'not logged in' %></pre>
|
|
192
|
+
<div class="github-action-row">
|
|
193
|
+
<% items.forEach((item) => { %>
|
|
194
|
+
<a class="task-button <%= item.title === 'Login' ? 'primary' : 'danger' %>" href="<%= item.url %>">
|
|
195
|
+
<i class="<%= item.icon %>" aria-hidden="true"></i>
|
|
196
|
+
<span><%= item.title %></span>
|
|
197
|
+
</a>
|
|
198
|
+
<% }) %>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="github-readme">
|
|
203
|
+
<%- readme %>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
</section>
|
|
207
|
+
|
|
208
|
+
<section class="task-section">
|
|
209
|
+
<div class="task-section-head">
|
|
210
|
+
<div>
|
|
211
|
+
<h2 class="task-section-title">Git identity</h2>
|
|
212
|
+
<p class="task-section-subcopy">These values appear as the author on commits created from Pinokio shells.</p>
|
|
213
|
+
</div>
|
|
214
|
+
<div class="task-section-note">gitconfig</div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<form class="github-config-form" data-github-config-form>
|
|
218
|
+
<div class="github-config-fields">
|
|
219
|
+
<label class="task-field">
|
|
220
|
+
<span class="task-label">Username</span>
|
|
221
|
+
<input class="task-input" id="username" type="text" autocomplete="name" value="<%= gitconfig.user && gitconfig.user.name ? gitconfig.user.name : '' %>">
|
|
222
|
+
</label>
|
|
223
|
+
<label class="task-field">
|
|
224
|
+
<span class="task-label">Email</span>
|
|
225
|
+
<input class="task-input" id="email" type="email" autocomplete="email" value="<%= gitconfig.user && gitconfig.user.email ? gitconfig.user.email : '' %>">
|
|
226
|
+
</label>
|
|
227
|
+
</div>
|
|
228
|
+
<div class="github-config-actions">
|
|
229
|
+
<button class="task-button primary task-run-button github-config-submit" type="submit">
|
|
230
|
+
<i class="fa-solid fa-check" aria-hidden="true"></i>
|
|
231
|
+
<span>Update</span>
|
|
232
|
+
</button>
|
|
233
|
+
<span class="github-config-path">Stored in ~/pinokio/gitconfig.</span>
|
|
234
|
+
</div>
|
|
235
|
+
<div class="task-status github-config-feedback hidden" data-github-config-feedback></div>
|
|
236
|
+
</form>
|
|
237
|
+
</section>
|
|
238
|
+
</div>
|
|
239
|
+
</section>
|
|
308
240
|
</div>
|
|
309
|
-
|
|
310
|
-
</main>
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
241
|
+
<%- include('partials/main_sidebar', { selected }) %>
|
|
242
|
+
</main>
|
|
243
|
+
|
|
244
|
+
<script>
|
|
245
|
+
const configForm = document.querySelector("[data-github-config-form]")
|
|
246
|
+
const feedback = document.querySelector("[data-github-config-feedback]")
|
|
247
|
+
const submitButton = configForm.querySelector(".github-config-submit")
|
|
248
|
+
|
|
249
|
+
function showFeedback(message, type) {
|
|
250
|
+
feedback.textContent = message
|
|
251
|
+
feedback.classList.remove("hidden", "success", "error")
|
|
252
|
+
feedback.classList.add(type)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
configForm.addEventListener("submit", async (event) => {
|
|
256
|
+
event.preventDefault()
|
|
257
|
+
event.stopPropagation()
|
|
258
|
+
submitButton.disabled = true
|
|
259
|
+
submitButton.classList.add("is-busy")
|
|
260
|
+
try {
|
|
261
|
+
const res = await fetch("/github/config", {
|
|
262
|
+
method: "POST",
|
|
263
|
+
headers: {
|
|
264
|
+
"Content-Type": "application/json"
|
|
265
|
+
},
|
|
266
|
+
body: JSON.stringify({
|
|
267
|
+
"user.name": document.querySelector("#username").value,
|
|
268
|
+
"user.email": document.querySelector("#email").value
|
|
269
|
+
})
|
|
270
|
+
})
|
|
271
|
+
const json = await res.json()
|
|
272
|
+
if (json.error) {
|
|
273
|
+
throw new Error(json.error)
|
|
274
|
+
}
|
|
275
|
+
showFeedback("Git identity updated.", "success")
|
|
276
|
+
} catch (error) {
|
|
277
|
+
showFeedback(error.message || "Git identity could not be updated.", "error")
|
|
278
|
+
} finally {
|
|
279
|
+
submitButton.disabled = false
|
|
280
|
+
submitButton.classList.remove("is-busy")
|
|
281
|
+
}
|
|
323
282
|
})
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
}).then((res) => {
|
|
327
|
-
alert("Updated")
|
|
328
|
-
location.href = location.href
|
|
329
|
-
})
|
|
330
|
-
})
|
|
331
|
-
</script>
|
|
283
|
+
</script>
|
|
284
|
+
<%- include('partials/app_common_scripts') %>
|
|
332
285
|
</body>
|
|
333
286
|
</html>
|