NewRelease.tsx
Raw
1import config from "../../config.ts";
2import type { RepositoryRow } from "../../db/index.ts";
3import type { SessionUser } from "../../middleware/session.ts";
4import { Layout } from "../layout.tsx";
5import { RepoHeader } from "../repos/RepoHeader.tsx";
6import { RepoNav } from "../repos/RepoNav.tsx";
7
8interface NewReleaseProps {
9 user: SessionUser;
10 repo: RepositoryRow;
11 error?: string;
12 values?: {
13 create_tag?: boolean;
14 tag_name?: string;
15 revision?: string;
16 name?: string;
17 notes?: string;
18 include_source_code?: boolean;
19 };
20}
21
22export function NewRelease({ user, repo, error, values }: NewReleaseProps) {
23 const showTagFields = values?.create_tag ?? false;
24 const defaultRevision =
25 values?.revision !== undefined ? values.revision : repo.default_branch;
26 return (
27 <Layout user={user} title={`New Release — ${repo.name}`}>
28 <div class="container">
29 <RepoHeader repo={repo} />
30 <RepoNav repo={repo} active="releases" user={user} />
31 <div class="form-page">
32 <h2 class="page-title">New Release</h2>
33 {error && <div class="form-error">{error}</div>}
34 <form
35 method="post"
36 action={`/${repo.name}/releases`}
37 enctype="multipart/form-data"
38 class="form"
39 >
40 <div class="form-group">
41 <label class="form-label" for="name">
42 Release title{" "}
43 <span class="form-required">*</span>
44 </label>
45 <input
46 type="text"
47 id="name"
48 name="name"
49 class="form-input"
50 required
51 maxlength={config.MAX_TITLE_BYTES}
52 value={values?.name ?? ""}
53 placeholder="e.g. Version 1.0 — Initial Release"
54 />
55 </div>
56 <div class="form-group">
57 <label class="checkbox-label">
58 <input
59 type="checkbox"
60 id="create_tag"
61 name="create_tag"
62 value="on"
63 checked={showTagFields}
64 data-toggle-target="tag-fields-group"
65 />
66 <span>Create a git tag for this release</span>
67 </label>
68 </div>
69 <div
70 id="tag-fields-group"
71 style={showTagFields ? "" : "display:none"}
72 >
73 <div class="form-group">
74 <label class="form-label" for="tag_name">
75 Tag name{" "}
76 <span class="form-required">*</span>
77 </label>
78 <input
79 type="text"
80 id="tag_name"
81 name="tag_name"
82 class="form-input"
83 maxlength={config.MAX_TITLE_BYTES}
84 pattern="[a-zA-Z0-9._\-+]+"
85 title="Letters, digits, dots, hyphens, underscores, and plus signs only"
86 value={values?.tag_name ?? ""}
87 placeholder="v1.0.0"
88 />
89 </div>
90 <div class="form-group">
91 <label class="form-label" for="revision">
92 Revision{" "}
93 <span class="form-required">*</span>
94 </label>
95 <input
96 type="text"
97 id="revision"
98 name="revision"
99 class="form-input monospace"
100 value={defaultRevision}
101 placeholder="branch, tag, or commit"
102 />
103 <p class="form-hint">
104 Branch, tag, or commit to tag.
105 </p>
106 </div>
107 </div>
108 <div class="form-group">
109 <label class="form-label" for="notes">
110 Release notes
111 </label>
112 <textarea
113 id="notes"
114 name="notes"
115 class="form-input form-textarea"
116 rows="8"
117 maxlength={config.MAX_TEXT_BODY_BYTES}
118 >
119 {values?.notes ?? ""}
120 </textarea>
121 </div>
122 <div class="form-group">
123 <label class="checkbox-label">
124 <input
125 type="checkbox"
126 name="include_source_code"
127 value="on"
128 checked={
129 values?.include_source_code ?? false
130 }
131 />
132 <span>
133 Include source code archives (zip, tar.gz,
134 tar.zst)
135 </span>
136 </label>
137 </div>
138 <div class="form-group">
139 <label class="form-label" for="files">
140 Attach files
141 </label>
142 <input
143 type="file"
144 id="files"
145 name="files"
146 class="form-input"
147 multiple
148 />
149 <p class="form-hint">
150 You can attach multiple files to this release.
151 </p>
152 </div>
153 <div class="form-actions">
154 <button type="submit" class="btn btn-primary">
155 Create release
156 </button>
157 <a
158 href={`/${repo.name}/releases`}
159 class="btn btn-secondary"
160 >
161 Cancel
162 </a>
163 </div>
164 </form>
165 </div>
166 </div>
167 </Layout>
168 );
169}
170