rin
Public Open-source lightweight git hosting.
release_new.html · 101 lines · 4.0 KB
Raw
1 {{define "content"}}
2 <div class="container">
3 {{template "repo_header" .}}
4
5 <section class="card mb-4">
6 <div class="card-header">
7 <span class="font-semibold text-sm flex items-center gap-2">
8 {{icon "tag" "size-4"}}
9 <span>{{t .Lang "releases.new"}}</span>
10 </span>
11 </div>
12 <form method="post" action="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/releases/new" enctype="multipart/form-data" class="card-body flex flex-col gap-3">
13 <input type="hidden" name="_csrf" value="{{.CSRFToken}}">
14
15 <div class="grid-2">
16 <div>
17 <label class="label" for="tag_name">{{t .Lang "releases.tag_name"}}</label>
18 <input id="tag_name" name="tag_name" type="text" class="input font-mono" list="existing-tags" placeholder="v1.0.0" value="{{.SelectedTag}}" required autofocus>
19 <datalist id="existing-tags">
20 {{range .Tags}}
21 <option value="{{.}}">
22 {{end}}
23 </datalist>
24 <div class="text-xs text-muted mt-1">{{t .Lang "releases.tag_desc"}}</div>
25 </div>
26
27 <div>
28 <label class="label" for="target_ref">{{t .Lang "releases.target"}}</label>
29 <select id="target_ref" name="target_ref" class="select font-mono">
30 {{range .Branches}}
31 <option value="{{.}}" {{if eq . $.Repo.DefaultBranch}}selected{{end}}>{{.}}</option>
32 {{end}}
33 </select>
34 <div class="text-xs text-muted mt-1">{{t .Lang "releases.target_desc"}}</div>
35 </div>
36 </div>
37
38 <div>
39 <label class="label" for="title">{{t .Lang "releases.title"}}</label>
40 <input id="title" name="title" type="text" class="input" placeholder="{{t .Lang "releases.title_ph"}}" maxlength="200">
41 </div>
42
43 <div>
44 <label class="label" for="body">{{t .Lang "releases.body"}}</label>
45 <textarea id="body" name="body" class="textarea" rows="8" placeholder="{{t .Lang "releases.body_ph"}}" maxlength="50000"></textarea>
46 </div>
47
48 <div class="flex flex-col gap-1">
49 <label class="label" for="assets" style="margin-bottom:0;">{{t .Lang "releases.assets_upload"}}</label>
50 <label class="upload-drop" id="assets-drop" for="assets">
51 {{icon "upload" "size-5"}}
52 <span class="text-sm font-medium">{{t .Lang "file.upload_pick"}}</span>
53 <span class="text-xs">{{t .Lang "releases.assets_upload_hint"}}</span>
54 <input id="assets" name="assets" type="file" multiple style="display:none;">
55 </label>
56 <div id="assets-list" class="text-xs font-mono text-muted"></div>
57 </div>
58
59 <div>
60 <label class="flex items-center gap-2 cursor-pointer text-sm">
61 <input type="checkbox" name="is_prerelease" value="true" class="switch">
62 <span>{{t .Lang "releases.is_prerelease"}}</span>
63 </label>
64 </div>
65
66 <div class="flex items-center justify-end">
67 <button type="submit" class="btn btn-primary btn-sm">
68 {{icon "tag" "size-3.5"}}
69 <span>{{t .Lang "releases.publish_btn"}}</span>
70 </button>
71 </div>
72 </form>
73 </section>
74 </div>
75 <script>
76 (function () {
77 var input = document.getElementById('assets');
78 var drop = document.getElementById('assets-drop');
79 var list = document.getElementById('assets-list');
80 if (!input || !drop || !list) return;
81 function render() {
82 var names = [];
83 for (var i = 0; i < input.files.length; i++) names.push(input.files[i].name);
84 list.textContent = names.length ? names.join(' · ') : '';
85 }
86 input.addEventListener('change', render);
87 ['dragover', 'dragenter'].forEach(function (ev) {
88 drop.addEventListener(ev, function (e) { e.preventDefault(); drop.classList.add('drag'); });
89 });
90 ['dragleave', 'drop'].forEach(function (ev) {
91 drop.addEventListener(ev, function (e) { e.preventDefault(); drop.classList.remove('drag'); });
92 });
93 drop.addEventListener('drop', function (e) {
94 if (e.dataTransfer && e.dataTransfer.files.length) {
95 input.files = e.dataTransfer.files;
96 render();
97 }
98 });
99 })();
100 </script>
101 {{end}}