diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 095257b365..dccf184335 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2290,6 +2290,8 @@ release.edit_subheader = Releases organize project versions.
release.tag_name = Tag name
release.target = Target
release.tag_helper = Choose an existing tag or create a new tag.
+release.tag_helper_new = New tag. This tag will be created from the target.
+release.tag_helper_existing = Existing tag.
release.title = Title
release.content = Content
release.prerelease_desc = Mark as Pre-Release
diff --git a/templates/repo/release/new.tmpl b/templates/repo/release/new.tmpl
index 37d7ca0321..d7c580fed9 100644
--- a/templates/repo/release/new.tmpl
+++ b/templates/repo/release/new.tmpl
@@ -20,22 +20,27 @@
{{.tag_name}} @ {{.tag_target}}
{{else}}
- @
-
-
- {{svg "octicon-git-branch"}}
-
- {{.locale.Tr "repo.release.target"}} :
- {{.Repository.DefaultBranch}}
-
- {{svg "octicon-triangle-down" 14 "dropdown icon"}}
-
diff --git a/web_src/js/features/repo-release.js b/web_src/js/features/repo-release.js
index a061c6b23f..a230d7765e 100644
--- a/web_src/js/features/repo-release.js
+++ b/web_src/js/features/repo-release.js
@@ -3,7 +3,7 @@ import {attachTribute} from './tribute.js';
import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
import {initEasyMDEImagePaste} from './comp/ImagePaste.js';
import {createCommentEasyMDE} from './comp/EasyMDE.js';
-import {hideElem} from '../utils/dom.js';
+import {hideElem, showElem} from '../utils/dom.js';
export function initRepoRelease() {
$(document).on('click', '.remove-rel-attach', function() {
@@ -14,8 +14,43 @@ export function initRepoRelease() {
});
}
+export function initRepoReleaseNew() {
+ const $repoReleaseNew = $('.repository.new.release');
+ if (!$repoReleaseNew.length) return;
-export function initRepoReleaseEditor() {
+ initTagNameEditor();
+ initRepoReleaseEditor();
+}
+
+function initTagNameEditor() {
+ const el = document.getElementById('tag-name-editor');
+ if (!el) return;
+
+ const existingTags = JSON.parse(el.getAttribute('data-existing-tags'));
+ if (!Array.isArray(existingTags)) return;
+
+ const defaultTagHelperText = el.getAttribute('data-tag-helper');
+ const newTagHelperText = el.getAttribute('data-tag-helper-new');
+ const existingTagHelperText = el.getAttribute('data-tag-helper-existing');
+
+ document.getElementById('tag-name').addEventListener('keyup', (e) => {
+ const value = e.target.value;
+ if (existingTags.includes(value)) {
+ // If the tag already exists, hide the target branch selector.
+ hideElem('#tag-target-selector');
+ document.getElementById('tag-helper').innerText = existingTagHelperText;
+ } else {
+ showElem('#tag-target-selector');
+ if (value) {
+ document.getElementById('tag-helper').innerText = newTagHelperText;
+ } else {
+ document.getElementById('tag-helper').innerText = defaultTagHelperText;
+ }
+ }
+ });
+}
+
+function initRepoReleaseEditor() {
const $editor = $('.repository.new.release .content-editor');
if ($editor.length === 0) {
return;
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 611c09d2b8..6b4f4ef3eb 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -76,7 +76,7 @@ import {
import {initViewedCheckboxListenerFor} from './features/pull-view-file.js';
import {initOrgTeamSearchRepoBox, initOrgTeamSettings} from './features/org-team.js';
import {initUserAuthWebAuthn, initUserAuthWebAuthnRegister} from './features/user-auth-webauthn.js';
-import {initRepoRelease, initRepoReleaseEditor} from './features/repo-release.js';
+import {initRepoRelease, initRepoReleaseNew} from './features/repo-release.js';
import {initRepoEditor} from './features/repo-editor.js';
import {initCompSearchUserBox} from './features/comp/SearchUserBox.js';
import {initInstall} from './features/install.js';
@@ -179,7 +179,7 @@ $(document).ready(() => {
initRepoPullRequestAllowMaintainerEdit();
initRepoPullRequestReview();
initRepoRelease();
- initRepoReleaseEditor();
+ initRepoReleaseNew();
initRepoSettingGitHook();
initRepoSettingSearchTeamBox();
initRepoSettingsCollaboration();