Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hide target selector if tag exists when creating new release #23171

Merged
merged 10 commits into from
Mar 10, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2288,6 +2288,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
Expand Down
33 changes: 19 additions & 14 deletions templates/repo/release/new.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,27 @@
<b>{{.tag_name}}</b><span class="at">@</span><strong>{{.tag_target}}</strong>
{{else}}
<input id="tag-name" name="tag_name" value="{{.tag_name}}" placeholder="{{.locale.Tr "repo.release.tag_name"}}" autofocus required maxlength="255">
<span class="at">@</span>
<div class="ui selection dropdown">
<input type="hidden" name="tag_target" value="{{.tag_target}}"/>
{{svg "octicon-git-branch"}}
<div class="text">
{{.locale.Tr "repo.release.target"}} :
<strong id="repo-branch-current">{{.Repository.DefaultBranch}}</strong>
</div>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
{{range .Branches}}
<div class="item" data-value="{{.}}">{{.}}</div>
{{end}}
<input id="tag-name-editor" type="hidden" data-existing-tags={{Json .Tags}} data-tag-helper={{.locale.Tr "repo.release.tag_helper"}} data-tag-helper-new={{.locale.Tr "repo.release.tag_helper_new"}} data-tag-helper-existing={{.locale.Tr "repo.release.tag_helper_existing"}} />
<span id="tag-target-selector">
Zettat123 marked this conversation as resolved.
Show resolved Hide resolved
<span class="at">@</span>
<div class="ui selection dropdown">
<input type="hidden" name="tag_target" value="{{.tag_target}}"/>
{{svg "octicon-git-branch"}}
<div class="text">
{{.locale.Tr "repo.release.target"}} :
<strong id="repo-branch-current">{{.Repository.DefaultBranch}}</strong>
</div>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
{{range .Branches}}
<div class="item" data-value="{{.}}">{{.}}</div>
{{end}}
</div>
</div>
</span>
<div>
<span id="tag-helper" class="help">{{.locale.Tr "repo.release.tag_helper"}}</span>
silverwind marked this conversation as resolved.
Show resolved Hide resolved
</div>
<span class="help">{{.locale.Tr "repo.release.tag_helper"}}</span>
{{end}}
</div>
</div>
Expand Down
29 changes: 29 additions & 0 deletions web_src/js/features/tag-name-editor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import {hideElem, showElem} from '../utils/dom.js';

export 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;
}
}
});
}
3 changes: 3 additions & 0 deletions web_src/js/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ import {initFormattingReplacements} from './features/formatting.js';
import {initCopyContent} from './features/copycontent.js';
import {initCaptcha} from './features/captcha.js';
import {initRepositoryActionView} from './components/RepoActionView.vue';
import {initTagNameEditor} from './features/tag-name-editor.js';

// Run time-critical code as soon as possible. This is safe to do because this
// script appears at the end of <body> and rendered HTML is accessible at that point.
Expand Down Expand Up @@ -198,4 +199,6 @@ $(document).ready(() => {
initUserAuthWebAuthnRegister();
initUserSettings();
initViewedCheckboxListenerFor();

initTagNameEditor();
Copy link
Contributor

@wxiaoguang wxiaoguang Mar 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO we do not need to make more global init calls.

The tag-name-editor only appears on the repository new release page.

So the exiting initRepoReleaseEditor could be refactored to something like:

export function initRepoReleaseNew() {
    const $repoReleaseNew = $('.repository.new.release');
    if (!$repoReleaseNew.length) return;

    // init tag name editor
    // init content editor
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea. I refactored the initRepoReleaseEditor according to your comment.

});