public/app.js - git - Webernet Explorer _X
git 🏠 Home 👤 Sign up Self hosted git, retro shell
★ otgit, code hosting from the year 2000 ★
📄 octuna / public / app.js
198 lines · 7.4 KB · Raw
1(function () {
2 'use strict';
3 
4 var bar = document.getElementById('addrBar');
5 if (bar) bar.value = window.location.pathname + window.location.search;
6 
7 var pathParts = window.location.pathname.split('/').filter(Boolean);
8 
9 // Sidebar login form
10 var loginForm = document.getElementById('loginForm');
11 if (loginForm) {
12 loginForm.addEventListener('submit', function (e) {
13 e.preventDefault();
14 var msg = document.getElementById('loginMsg');
15 var btn = loginForm.querySelector('button[type="submit"]');
16 btn.disabled = true;
17 fetch('/api/login', {
18 method: 'POST',
19 headers: { 'Content-Type': 'application/json' },
20 body: JSON.stringify({ username: loginForm.username.value.trim(), password: loginForm.password.value })
21 })
22 .then(function (r) { return r.json(); })
23 .then(function (d) {
24 if (d.ok) { window.location.reload(); }
25 else { msg.textContent = d.error || 'Login failed'; btn.disabled = false; }
26 })
27 .catch(function () { msg.textContent = 'Network error'; btn.disabled = false; });
28 });
29 }
30 
31 var logoutBtn = document.getElementById('logoutBtn');
32 if (logoutBtn) {
33 logoutBtn.addEventListener('click', function () {
34 fetch('/api/logout', { method: 'POST' })
35 .then(function () { window.location.href = '/'; });
36 });
37 }
38 
39 // Signup page
40 var authForm = document.getElementById('authForm');
41 if (authForm) {
42 authForm.addEventListener('submit', function (e) {
43 e.preventDefault();
44 var msg = document.getElementById('formMsg');
45 var btn = authForm.querySelector('button[type="submit"]');
46 btn.disabled = true;
47 var body = { username: authForm.username.value.trim(), password: authForm.password.value };
48 if (authForm.displayName) body.displayName = authForm.displayName.value.trim();
49 fetch('/api/signup', {
50 method: 'POST',
51 headers: { 'Content-Type': 'application/json' },
52 body: JSON.stringify(body)
53 })
54 .then(function (r) { return r.json(); })
55 .then(function (d) {
56 if (d.ok) { window.location.href = '/' + d.username; }
57 else { msg.textContent = d.error || 'Signup failed'; btn.disabled = false; }
58 })
59 .catch(function () { msg.textContent = 'Network error'; btn.disabled = false; });
60 });
61 }
62 
63 // New repo form (/settings/new)
64 var newRepoForm = document.getElementById('newRepoForm');
65 if (newRepoForm) {
66 newRepoForm.addEventListener('submit', function (e) {
67 e.preventDefault();
68 var msg = document.getElementById('formMsg');
69 var btn = newRepoForm.querySelector('button[type="submit"]');
70 btn.disabled = true;
71 fetch('/api/repo/create', {
72 method: 'POST',
73 headers: { 'Content-Type': 'application/json' },
74 body: JSON.stringify({
75 name: newRepoForm.name.value.trim(),
76 description: newRepoForm.description.value.trim(),
77 visibility: newRepoForm.private.checked ? 'private' : 'public'
78 })
79 })
80 .then(function (r) { return r.json(); })
81 .then(function (d) {
82 if (d.ok) { window.location.href = '/' + d.owner + '/' + d.name; }
83 else { msg.textContent = d.error || 'Failed'; btn.disabled = false; }
84 })
85 .catch(function () { msg.textContent = 'Network error'; btn.disabled = false; });
86 });
87 }
88 
89 // Repo settings page (/:owner/:repo/settings)
90 if (pathParts.length === 3 && pathParts[2] === 'settings') {
91 var settingsOwner = pathParts[0];
92 var settingsRepo = pathParts[1];
93 
94 function apiPost(url, body, msgEl) {
95 return fetch(url, {
96 method: 'POST',
97 headers: { 'Content-Type': 'application/json' },
98 body: JSON.stringify(body)
99 })
100 .then(function (r) { return r.json(); })
101 .then(function (d) {
102 if (msgEl) {
103 msgEl.textContent = d.ok ? 'Saved.' : (d.error || 'Failed');
104 msgEl.style.color = d.ok ? '#060' : '#c00';
105 }
106 return d;
107 });
108 }
109 
110 var descForm = document.getElementById('descForm');
111 if (descForm) {
112 descForm.addEventListener('submit', function (e) {
113 e.preventDefault();
114 apiPost('/api/repo/' + settingsOwner + '/' + settingsRepo + '/settings',
115 { description: descForm.description.value.trim() },
116 document.getElementById('descMsg'));
117 });
118 }
119 
120 var visForm = document.getElementById('visForm');
121 if (visForm) {
122 visForm.addEventListener('submit', function (e) {
123 e.preventDefault();
124 var vis = visForm.querySelector('input[name="visibility"]:checked');
125 apiPost('/api/repo/' + settingsOwner + '/' + settingsRepo + '/settings',
126 { visibility: vis ? vis.value : 'public' },
127 document.getElementById('visMsg'));
128 });
129 }
130 
131 var renameForm = document.getElementById('renameForm');
132 if (renameForm) {
133 renameForm.addEventListener('submit', function (e) {
134 e.preventDefault();
135 var msg = document.getElementById('renameMsg');
136 apiPost('/api/repo/' + settingsOwner + '/' + settingsRepo + '/rename',
137 { name: renameForm.name.value.trim() }, null)
138 .then(function (d) {
139 if (d.ok) window.location.href = '/' + d.owner + '/' + d.name + '/settings';
140 else { msg.textContent = d.error || 'Failed'; msg.style.color = '#c00'; }
141 })
142 .catch(function () { if (msg) { msg.textContent = 'Network error'; msg.style.color = '#c00'; } });
143 });
144 }
145 
146 var deleteBtn = document.getElementById('deleteBtn');
147 if (deleteBtn) {
148 deleteBtn.addEventListener('click', function () {
149 var msg = document.getElementById('deleteMsg');
150 if (!confirm('Delete ' + settingsRepo + '? This cannot be undone.')) return;
151 deleteBtn.disabled = true;
152 fetch('/api/repo/' + settingsOwner + '/' + settingsRepo + '/delete', {
153 method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}'
154 })
155 .then(function (r) { return r.json(); })
156 .then(function (d) {
157 if (d.ok) window.location.href = '/' + settingsOwner;
158 else { msg.textContent = d.error || 'Failed'; msg.style.color = '#c00'; deleteBtn.disabled = false; }
159 })
160 .catch(function () { msg.textContent = 'Network error'; deleteBtn.disabled = false; });
161 });
162 }
163 }
164 
165 // Admin settings page (/admin/settings)
166 var adminForm = document.getElementById('adminSettingsForm');
167 if (adminForm) {
168 adminForm.addEventListener('submit', function (e) {
169 e.preventDefault();
170 var msg = document.getElementById('adminMsg');
171 var btn = adminForm.querySelector('button[type="submit"]');
172 btn.disabled = true;
173 var settings = {};
174 adminForm.querySelectorAll('[data-key]').forEach(function (el) {
175 var key = el.getAttribute('data-key');
176 var type = el.getAttribute('data-type');
177 var raw = el.value;
178 if (type === 'number') settings[key] = Number(raw);
179 else if (type === 'boolean') settings[key] = (raw === 'true');
180 else settings[key] = raw;
181 });
182 fetch('/admin/settings/save', {
183 method: 'POST',
184 headers: { 'Content-Type': 'application/json' },
185 body: JSON.stringify(settings)
186 })
187 .then(function (r) { return r.json(); })
188 .then(function (d) {
189 msg.textContent = d.ok ? 'Saved.' : (d.error || 'Failed');
190 msg.style.color = d.ok ? '#060' : '#c00';
191 btn.disabled = false;
192 })
193 .catch(function () { msg.textContent = 'Network error'; btn.disabled = false; });
194 });
195 }
196 
197})();
198 
Done 🔒 Internet