rin
Публичный Open-source lightweight git hosting.
admin.html · 171 строка · 7.6 KB
Raw
1 {{define "content"}}
2 <div class="container">
3 <div class="flex items-center justify-between mb-4">
4 <h1 class="text-lg font-semibold" style="margin:0;">{{t .Lang "admin.title"}}</h1>
5 </div>
6
7 <!-- Feature Toggles (Modules & Access) -->
8 <section class="card mb-4">
9 <div class="card-header">
10 <span class="font-semibold flex items-center gap-2">{{icon "settings" "size-4"}} {{t .Lang "admin.features"}}</span>
11 </div>
12 <div class="dense-list">
13 <!-- 1. Explore Page -->
14 <div class="dense-row" style="min-height:3.25rem;padding:0.65rem 0.9rem;">
15 <div class="flex flex-col gap-1 min-w-0">
16 <div class="flex items-center gap-2 font-medium text-sm">
17 {{icon "globe" "size-4"}}
18 <span>{{t .Lang "admin.explore"}}</span>
19 {{if .ExploreEnabled}}
20 <span class="badge badge-primary">{{t .Lang "admin.enabled"}}</span>
21 {{else}}
22 <span class="badge badge-outline">{{t .Lang "admin.disabled"}}</span>
23 {{end}}
24 </div>
25 <div class="text-xs text-muted">{{t .Lang "admin.explore.desc"}}</div>
26 </div>
27 <form method="post" action="/admin/settings" style="margin:0;flex-shrink:0;">
28 <input type="hidden" name="_csrf" value="{{.CSRFToken}}">
29 <input type="hidden" name="setting_key" value="explore_enabled">
30 {{if .ExploreEnabled}}
31 <input type="hidden" name="setting_val" value="false">
32 <button type="submit" class="btn btn-outline btn-sm">{{t .Lang "admin.disable_btn"}}</button>
33 {{else}}
34 <input type="hidden" name="setting_val" value="true">
35 <button type="submit" class="btn btn-primary btn-sm">{{t .Lang "admin.enable_btn"}}</button>
36 {{end}}
37 </form>
38 </div>
39
40 <!-- 2. Public Registration -->
41 <div class="dense-row" style="min-height:3.25rem;padding:0.65rem 0.9rem;">
42 <div class="flex flex-col gap-1 min-w-0">
43 <div class="flex items-center gap-2 font-medium text-sm">
44 {{icon "user" "size-4"}}
45 <span>{{t .Lang "admin.registration"}}</span>
46 {{if .RegistrationEnabled}}
47 <span class="badge badge-primary">{{t .Lang "admin.enabled"}}</span>
48 {{else}}
49 <span class="badge badge-outline">{{t .Lang "admin.disabled"}}</span>
50 {{end}}
51 </div>
52 <div class="text-xs text-muted">{{t .Lang "admin.registration.desc"}}</div>
53 </div>
54 <form method="post" action="/admin/settings" style="margin:0;flex-shrink:0;">
55 <input type="hidden" name="_csrf" value="{{.CSRFToken}}">
56 <input type="hidden" name="setting_key" value="registration_enabled">
57 {{if .RegistrationEnabled}}
58 <input type="hidden" name="setting_val" value="false">
59 <button type="submit" class="btn btn-outline btn-sm">{{t .Lang "admin.disable_btn"}}</button>
60 {{else}}
61 <input type="hidden" name="setting_val" value="true">
62 <button type="submit" class="btn btn-primary btn-sm">{{t .Lang "admin.enable_btn"}}</button>
63 {{end}}
64 </form>
65 </div>
66
67
68 <!-- 4. Landing Page -->
69 <div class="dense-row" style="min-height:3.25rem;padding:0.65rem 0.9rem;">
70 <div class="flex flex-col gap-1 min-w-0">
71 <div class="flex items-center gap-2 font-medium text-sm">
72 {{icon "home" "size-4"}}
73 <span>{{t .Lang "admin.landing"}}</span>
74 {{if .LandingEnabled}}
75 <span class="badge badge-primary">{{t .Lang "admin.enabled"}}</span>
76 {{else}}
77 <span class="badge badge-outline">{{t .Lang "admin.disabled"}}</span>
78 {{end}}
79 </div>
80 <div class="text-xs text-muted">{{t .Lang "admin.landing.desc"}}</div>
81 </div>
82 <form method="post" action="/admin/settings" style="margin:0;flex-shrink:0;">
83 <input type="hidden" name="_csrf" value="{{.CSRFToken}}">
84 <input type="hidden" name="setting_key" value="landing_enabled">
85 {{if .LandingEnabled}}
86 <input type="hidden" name="setting_val" value="false">
87 <button type="submit" class="btn btn-outline btn-sm">{{t .Lang "admin.disable_btn"}}</button>
88 {{else}}
89 <input type="hidden" name="setting_val" value="true">
90 <button type="submit" class="btn btn-primary btn-sm">{{t .Lang "admin.enable_btn"}}</button>
91 {{end}}
92 </form>
93 </div>
94
95 <!-- 5. Anonymous Read Access -->
96 <div class="dense-row" style="min-height:3.25rem;padding:0.65rem 0.9rem;">
97 <div class="flex flex-col gap-1 min-w-0">
98 <div class="flex items-center gap-2 font-medium text-sm">
99 {{icon "eye" "size-4"}}
100 <span>{{t .Lang "admin.anon_read"}}</span>
101 {{if .AnonymousReadEnabled}}
102 <span class="badge badge-primary">{{t .Lang "admin.enabled"}}</span>
103 {{else}}
104 <span class="badge badge-outline">{{t .Lang "admin.disabled"}}</span>
105 {{end}}
106 </div>
107 <div class="text-xs text-muted">{{t .Lang "admin.anon_read.desc"}}</div>
108 </div>
109 <form method="post" action="/admin/settings" style="margin:0;flex-shrink:0;">
110 <input type="hidden" name="_csrf" value="{{.CSRFToken}}">
111 <input type="hidden" name="setting_key" value="anonymous_read_enabled">
112 {{if .AnonymousReadEnabled}}
113 <input type="hidden" name="setting_val" value="false">
114 <button type="submit" class="btn btn-outline btn-sm">{{t .Lang "admin.disable_btn"}}</button>
115 {{else}}
116 <input type="hidden" name="setting_val" value="true">
117 <button type="submit" class="btn btn-primary btn-sm">{{t .Lang "admin.enable_btn"}}</button>
118 {{end}}
119 </form>
120 </div>
121 </div>
122 </section>
123
124 <!-- Users Table -->
125 <section class="card">
126 <div class="card-header">
127 <span class="font-semibold flex items-center gap-2">{{icon "users" "size-4"}} {{t .Lang "admin.users"}} ({{len .Users}})</span>
128 </div>
129 <div class="table-wrap" style="border:0;border-radius:0;">
130 <table class="table">
131 <thead>
132 <tr>
133 <th>ID</th>
134 <th>{{t .Lang "admin.col.user"}}</th>
135 <th>{{t .Lang "auth.email"}}</th>
136 <th>{{t .Lang "admin.col.repos"}}</th>
137 <th>{{t .Lang "admin.col.role"}}</th>
138 <th>{{t .Lang "admin.col.joined"}}</th>
139 </tr>
140 </thead>
141 <tbody>
142 {{range .Users}}
143 <tr>
144 <td class="font-mono text-xs text-muted">#{{.ID}}</td>
145 <td>
146 <a href="/{{.Username}}" class="flex items-center gap-2 font-medium">
147 {{avatar .Username .AvatarURL}}
148 <div class="flex flex-col">
149 <span>{{.Username}}</span>
150 {{if .FullName}}<span class="text-xs text-muted">{{.FullName}}</span>{{end}}
151 </div>
152 </a>
153 </td>
154 <td class="text-xs text-muted">{{.Email}}</td>
155 <td class="font-mono text-xs">{{.RepoCount}}</td>
156 <td>
157 {{if .IsAdmin}}
158 <span class="badge badge-primary">{{t $.Lang "admin.role.admin"}}</span>
159 {{else}}
160 <span class="badge badge-outline">{{t $.Lang "admin.role.user"}}</span>
161 {{end}}
162 </td>
163 <td class="text-xs text-muted">{{timeAgo .CreatedAt $.Lang}}</td>
164 </tr>
165 {{end}}
166 </tbody>
167 </table>
168 </div>
169 </section>
170 </div>
171 {{end}}