mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Refactor branch/tag selector dropdown (first step) (#23394)
Follow: * #23345 The branch/tag selector dropdown mixes jQuery/Fomantic UI/Vue together, it's very diffcult to maintain and causes unfixable a11y problems. It also causes problems like #19851 #21314 #21952 This PR is the first step for the refactoring, move `data-` attributes to JS object and use Vue data as much as possible. The old selector `'.choose.reference .dropdown'` was also wrong, it hits `<div class="choose reference"><svg class="dropdown icon">` and would cause undefined behaviors. I have done some quick tests and it works. After this PR gets merged, I will move the code into a Vue SFC in next PR.   --------- Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		| @@ -2,101 +2,111 @@ | |||||||
| {{$defaultBranch := $.root.BranchName}}{{if and .root.IsViewTag (not .noTag)}}{{$defaultBranch = .root.TagName}}{{end}}{{if eq $defaultBranch ""}}{{$defaultBranch = $.root.Repository.DefaultBranch}}{{end}} | {{$defaultBranch := $.root.BranchName}}{{if and .root.IsViewTag (not .noTag)}}{{$defaultBranch = .root.TagName}}{{end}}{{if eq $defaultBranch ""}}{{$defaultBranch = $.root.Repository.DefaultBranch}}{{end}} | ||||||
| {{$type := ""}}{{if and .root.IsViewTag (not .noTag)}}{{$type = "tag"}}{{else if .root.IsViewBranch}}{{$type = "branch"}}{{else}}{{$type = "tree"}}{{end}} | {{$type := ""}}{{if and .root.IsViewTag (not .noTag)}}{{$type = "tag"}}{{else if .root.IsViewBranch}}{{$type = "branch"}}{{else}}{{$type = "tree"}}{{end}} | ||||||
| {{$showBranchesInDropdown := not .root.HideBranchesInDropdown}} | {{$showBranchesInDropdown := not .root.HideBranchesInDropdown}} | ||||||
|  |  | ||||||
|  | <script type="module"> | ||||||
|  | 	const data = { | ||||||
|  | 		'textReleaseCompare': {{.root.locale.Tr "repo.release.compare"}}, | ||||||
|  | 		'textCreateTag': {{.root.locale.Tr "repo.tag.create_tag"}}, | ||||||
|  | 		'textCreateBranch': {{.root.locale.Tr "repo.branch.create_branch"}}, | ||||||
|  | 		'textCreateBranchFrom': {{.root.locale.Tr "repo.branch.create_from"}}, | ||||||
|  | 		'textBranches': {{.root.locale.Tr "repo.branches"}}, | ||||||
|  | 		'textTags': {{.root.locale.Tr "repo.tags"}}, | ||||||
|  |  | ||||||
|  | 		'mode': '{{if or .root.IsViewTag .isTag}}tags{{else}}branches{{end}}', | ||||||
|  | 		'showBranchesInDropdown': {{$showBranchesInDropdown}}, | ||||||
|  | 		'searchFieldPlaceholder': '{{if $.noTag}}{{.root.locale.Tr "repo.pulls.filter_branch"}}{{else if $showBranchesInDropdown}}{{.root.locale.Tr "repo.filter_branch_and_tag"}}{{else}}{{.root.locale.Tr "repo.find_tag"}}{{end}}...', | ||||||
|  | 		'branchForm': {{$.branchForm}}, | ||||||
|  | 		'disableCreateBranch': {{if .disableCreateBranch}}{{.disableCreateBranch}}{{else}}{{not .root.CanCreateBranch}}{{end}}, | ||||||
|  | 		'setAction': {{.setAction}}, | ||||||
|  | 		'submitForm': {{.submitForm}}, | ||||||
|  | 		'viewType': {{$type}}, | ||||||
|  | 		'refName': {{if and .root.IsViewTag (not .noTag)}}{{.root.TagName}}{{else if .root.IsViewBranch}}{{.root.BranchName}}{{else}}{{ShortSha .root.CommitID}}{{end}}, | ||||||
|  | 		'commitIdShort': {{ShortSha .root.CommitID}}, | ||||||
|  | 		'tagName': {{.root.TagName}}, | ||||||
|  | 		'branchName': {{.root.BranchName}}, | ||||||
|  | 		'noTag': {{.noTag}}, | ||||||
|  | 		'branches': {{.root.Branches}}, | ||||||
|  | 		'tags': {{.root.Tags}}, | ||||||
|  | 		'defaultBranch': {{$defaultBranch}}, | ||||||
|  | 		'branchURLPrefix': '{{if .branchURLPrefix}}{{.branchURLPrefix}}{{else}}{{$.root.RepoLink}}/{{if $.root.PageIsCommits}}commits{{else}}src{{end}}/branch/{{end}}', | ||||||
|  | 		'branchURLSuffix': '{{if .branchURLSuffix}}{{.branchURLSuffix}}{{else}}{{if $.root.TreePath}}/{{PathEscapeSegments $.root.TreePath}}{{end}}{{end}}', | ||||||
|  | 		'tagURLPrefix': '{{if .tagURLPrefix}}{{.tagURLPrefix}}{{else if $release}}{{$.root.RepoLink}}/compare/{{else}}{{$.root.RepoLink}}/{{if $.root.PageIsCommits}}commits{{else}}src{{end}}/tag/{{end}}', | ||||||
|  | 		'tagURLSuffix': '{{if .tagURLSuffix}}{{.tagURLSuffix}}{{else if $release}}...{{if $release.IsDraft}}{{PathEscapeSegments $release.Target}}{{else}}{{if $release.TagName}}{{PathEscapeSegments $release.TagName}}{{else}}{{PathEscapeSegments $release.Sha1}}{{end}}{{end}}{{else}}{{if $.root.TreePath}}/{{PathEscapeSegments $.root.TreePath}}{{end}}{{end}}', | ||||||
|  | 		'repoLink': {{.root.RepoLink}}, | ||||||
|  | 		'treePath': {{.root.TreePath}}, | ||||||
|  | 		'branchNameSubURL': {{.root.BranchNameSubURL}}, | ||||||
|  | 		'noResults': {{.root.locale.Tr "repo.pulls.no_results"}}, | ||||||
|  | 	}; | ||||||
|  | 	{{if .release}} | ||||||
|  | 	data.release = { | ||||||
|  | 		'tagName': {{.release.TagName}}, | ||||||
|  | 	}; | ||||||
|  | 	{{end}} | ||||||
|  | 	window.config.pageData.branchDropdownDataList = window.config.pageData.branchDropdownDataList || []; | ||||||
|  | 	window.config.pageData.branchDropdownDataList.push(data); | ||||||
|  | </script> | ||||||
|  |  | ||||||
| <div class="fitted item choose reference"> | <div class="fitted item choose reference"> | ||||||
| 	<div class="ui floating filter dropdown custom" | 	<div class="ui floating filter dropdown custom"> | ||||||
| 		data-branch-form="{{if $.branchForm}}{{$.branchForm}}{{end}}" |  | ||||||
| 		data-can-create-branch="{{if .canCreateBranch}}{{.canCreateBranch}}{{else}}{{.root.CanCreateBranch}}{{end}}" |  | ||||||
| 		data-no-results="{{.root.locale.Tr "repo.pulls.no_results"}}" |  | ||||||
| 		data-set-action="{{.setAction}}" data-submit-form="{{.submitForm}}" |  | ||||||
| 		data-view-type="{{$type}}" |  | ||||||
| 		data-ref-name="{{if and .root.IsViewTag (not .noTag)}}{{.root.TagName}}{{else if .root.IsViewBranch}}{{.root.BranchName}}{{else}}{{ShortSha .root.CommitID}}{{end}}" |  | ||||||
| 		data-branch-url-prefix="{{if .branchURLPrefix}}{{.branchURLPrefix}}{{else}}{{$.root.RepoLink}}/{{if $.root.PageIsCommits}}commits{{else}}src{{end}}/branch/{{end}}" |  | ||||||
| 		data-branch-url-suffix="{{if .branchURLSuffix}}{{.branchURLSuffix}}{{else}}{{if $.root.TreePath}}/{{PathEscapeSegments $.root.TreePath}}{{end}}{{end}}" |  | ||||||
| 		data-tag-url-prefix="{{if .tagURLPrefix}}{{.tagURLPrefix}}{{else if $release}}{{$.root.RepoLink}}/compare/{{else}}{{$.root.RepoLink}}/{{if $.root.PageIsCommits}}commits{{else}}src{{end}}/tag/{{end}}" |  | ||||||
| 		data-tag-url-suffix="{{if .tagURLSuffix}}{{.tagURLSuffix}}{{else if $release}}...{{if $release.IsDraft}}{{PathEscapeSegments $release.Target}}{{else}}{{if $release.TagName}}{{PathEscapeSegments $release.TagName}}{{else}}{{PathEscapeSegments $release.Sha1}}{{end}}{{end}}{{else}}{{if $.root.TreePath}}/{{PathEscapeSegments $.root.TreePath}}{{end}}{{end}}"> |  | ||||||
| 		<button class="branch-dropdown-button gt-ellipsis ui basic small compact button gt-df" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible"> | 		<button class="branch-dropdown-button gt-ellipsis ui basic small compact button gt-df" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible"> | ||||||
| 			<span class="text gt-df gt-ac gt-mr-2"> | 			<span class="text gt-df gt-ac gt-mr-2"> | ||||||
| 				{{if $release}} | 				{{/* v-cloak is used to hide unnecessary elements before Vue componment is mounted */}} | ||||||
| 					{{.root.locale.Tr "repo.release.compare"}} | 				<span v-cloak v-if="release">${ textReleaseCompare }</span> | ||||||
| 				{{else}} |  | ||||||
| 				<span :class="{visible: isViewTag}" v-if="isViewTag" {{if not (eq $type "tag")}}v-cloak{{end}}>{{svg "octicon-tag"}}</span> | 				<span :class="{visible: isViewTag}" v-if="isViewTag" {{if not (eq $type "tag")}}v-cloak{{end}}>{{svg "octicon-tag"}}</span> | ||||||
| 				<span :class="{visible: isViewBranch}" v-if="isViewBranch" {{if not (eq $type "branch")}}v-cloak{{end}}>{{svg "octicon-git-branch"}}</span> | 				<span :class="{visible: isViewBranch}" v-if="isViewBranch" {{if not (eq $type "branch")}}v-cloak{{end}}>{{svg "octicon-git-branch"}}</span> | ||||||
| 				<span :class="{visible: isViewTree}" v-if="isViewTree" {{if not (eq $type "tree")}}v-cloak{{end}}>{{svg "octicon-git-branch"}}</span> | 				<span :class="{visible: isViewTree}" v-if="isViewTree" {{if not (eq $type "tree")}}v-cloak{{end}}>{{svg "octicon-git-branch"}}</span> | ||||||
| 				<strong ref="dropdownRefName" class="gt-ml-3">{{if and .root.IsViewTag (not .noTag)}}{{.root.TagName}}{{else if .root.IsViewBranch}}{{.root.BranchName}}{{else}}{{ShortSha .root.CommitID}}{{end}}</strong> | 				<strong ref="dropdownRefName" class="gt-ml-3">{{if and .root.IsViewTag (not .noTag)}}{{.root.TagName}}{{else if .root.IsViewBranch}}{{.root.BranchName}}{{else}}{{ShortSha .root.CommitID}}{{end}}</strong> | ||||||
| 				{{end}} |  | ||||||
| 			</span> | 			</span> | ||||||
| 			{{svg "octicon-triangle-down" 14 "dropdown icon"}} | 			{{svg "octicon-triangle-down" 14 "dropdown icon"}} | ||||||
| 		</button> | 		</button> | ||||||
| 		<div class="data gt-hidden" data-mode="{{if or .root.IsViewTag .isTag}}tags{{else}}branches{{end}}"> |  | ||||||
| 			{{if $showBranchesInDropdown}} |  | ||||||
| 				{{range .root.Branches}} |  | ||||||
| 					<div class="item branch {{if eq $defaultBranch .}}selected{{end}}" data-url="{{PathEscapeSegments .}}">{{.}}</div> |  | ||||||
| 				{{end}} |  | ||||||
| 			{{end}} |  | ||||||
| 			{{if (not .noTag)}} |  | ||||||
| 				{{range .root.Tags}} |  | ||||||
| 					{{if $release}} |  | ||||||
| 						<div class="item tag {{if eq $release.TagName .}}selected{{end}}" data-url="{{PathEscapeSegments .}}">{{.}}</div> |  | ||||||
| 					{{else}} |  | ||||||
| 						<div class="item tag {{if eq $defaultBranch .}}selected{{end}}" data-url="{{PathEscapeSegments .}}">{{.}}</div> |  | ||||||
| 					{{end}} |  | ||||||
| 				{{end}} |  | ||||||
| 			{{end}} |  | ||||||
| 		</div> |  | ||||||
| 		<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak> | 		<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak> | ||||||
| 			<div class="ui icon search input"> | 			<div class="ui icon search input"> | ||||||
| 				<i class="icon gt-df gt-ac gt-jc gt-m-0">{{svg "octicon-filter" 16}}</i> | 				<i class="icon gt-df gt-ac gt-jc gt-m-0">{{svg "octicon-filter" 16}}</i> | ||||||
| 				<input name="search" ref="searchField" autocomplete="off" v-model="searchTerm" @keydown="keydown($event)" placeholder="{{if $.noTag}}{{.root.locale.Tr "repo.pulls.filter_branch"}}{{else if $showBranchesInDropdown}}{{.root.locale.Tr "repo.filter_branch_and_tag"}}{{else}}{{.root.locale.Tr "repo.find_tag"}}{{end}}..."> | 				<input name="search" ref="searchField" autocomplete="off" v-model="searchTerm" @keydown="keydown($event)" :placeholder="searchFieldPlaceholder"> | ||||||
| 			</div> | 			</div> | ||||||
| 			{{if $showBranchesInDropdown}} | 			<template v-if="showBranchesInDropdown"> | ||||||
| 				<div class="header branch-tag-choice"> | 				<div class="header branch-tag-choice"> | ||||||
| 					<div class="ui grid"> | 					<div class="ui grid"> | ||||||
| 						<div class="two column row"> | 						<div class="two column row"> | ||||||
| 							<a class="reference column" href="#" @click="createTag = false; mode = 'branches'; focusSearchField()"> | 							<a class="reference column" href="#" @click="createTag = false; mode = 'branches'; focusSearchField()"> | ||||||
| 								<span class="text" :class="{black: mode == 'branches'}"> | 								<span class="text" :class="{black: mode === 'branches'}"> | ||||||
| 									{{svg "octicon-git-branch" 16 "gt-mr-2"}}{{.root.locale.Tr "repo.branches"}} | 									{{svg "octicon-git-branch" 16 "gt-mr-2"}}${ textBranches } | ||||||
| 								</span> | 								</span> | ||||||
| 							</a> | 							</a> | ||||||
| 							{{if not .noTag}} | 							<template v-if="!noTag"> | ||||||
| 								<a class="reference column" href="#" @click="createTag = true; mode = 'tags'; focusSearchField()"> | 								<a class="reference column" href="#" @click="createTag = true; mode = 'tags'; focusSearchField()"> | ||||||
| 									<span class="text" :class="{black: mode == 'tags'}"> | 									<span class="text" :class="{black: mode === 'tags'}"> | ||||||
| 										{{svg "octicon-tag" 16 "gt-mr-2"}}{{.root.locale.Tr "repo.tags"}} | 										{{svg "octicon-tag" 16 "gt-mr-2"}}${ textTags } | ||||||
| 									</span> | 									</span> | ||||||
| 								</a> | 								</a> | ||||||
| 							{{end}} | 							</template> | ||||||
| 						</div> | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			{{end}} | 			</template> | ||||||
| 			<div class="scrolling menu" ref="scrollContainer"> | 			<div class="scrolling menu" ref="scrollContainer"> | ||||||
| 				<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active == index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div> | 				<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active === index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div> | ||||||
| 				<div class="item" v-if="showCreateNewBranch" :class="{active: active == filteredItems.length}" :ref="'listItem' + filteredItems.length"> | 				<div class="item" v-if="showCreateNewBranch" :class="{active: active === filteredItems.length}" :ref="'listItem' + filteredItems.length"> | ||||||
| 					<a href="#" @click="createNewBranch()"> | 					<a href="#" @click="createNewBranch()"> | ||||||
| 						<div v-show="createTag"> | 						<div v-show="createTag"> | ||||||
| 							<i class="reference tags icon"></i> | 							<i class="reference tags icon"></i> | ||||||
| 							{{.root.locale.Tr "repo.tag.create_tag" `${ searchTerm }` | Safe}} | 							<span v-html="textCreateTag.replace('%s', searchTerm)"></span> | ||||||
| 						</div> | 						</div> | ||||||
| 						<div v-show="!createTag"> | 						<div v-show="!createTag"> | ||||||
| 							{{svg "octicon-git-branch"}} | 							{{svg "octicon-git-branch"}} | ||||||
| 							{{.root.locale.Tr "repo.branch.create_branch" `${ searchTerm }` | Safe}} | 							<span v-html="textCreateBranch.replace('%s', searchTerm)"></span> | ||||||
| 						</div> | 						</div> | ||||||
| 						<div class="text small"> | 						<div class="text small"> | ||||||
| 							{{if or .root.IsViewBranch $release}} | 							<span v-if="isViewBranch || release">${ textCreateBranchFrom.replace('%s', branchName) }</span> | ||||||
| 								{{.root.locale.Tr "repo.branch.create_from" .root.BranchName}} | 							<span v-else-if="isViewTag">${ textCreateBranchFrom.replace('%s', tagName) }</span> | ||||||
| 							{{else if .root.IsViewTag}} | 							<span v-else>${ textCreateBranchFrom.replace('%s', commitIdShort) }</span> | ||||||
| 								{{.root.locale.Tr "repo.branch.create_from" .root.TagName}} |  | ||||||
| 							{{else}} |  | ||||||
| 								{{.root.locale.Tr "repo.branch.create_from" (ShortSha .root.CommitID)}} |  | ||||||
| 							{{end}} |  | ||||||
| 						</div> | 						</div> | ||||||
| 					</a> | 					</a> | ||||||
| 					<form ref="newBranchForm" action="{{.root.RepoLink}}/branches/_new/{{.root.BranchNameSubURL}}" method="post"> | 					<form ref="newBranchForm" action="{{.root.RepoLink}}/branches/_new/{{.root.BranchNameSubURL}}" method="post"> | ||||||
| 						{{.root.CsrfTokenHtml}} | 						<input type="hidden" name="_csrf" :value="csrfToken"> | ||||||
| 						<input type="hidden" name="new_branch_name" v-model="searchTerm"> | 						<input type="hidden" name="new_branch_name" v-model="searchTerm"> | ||||||
| 						<input type="hidden" name="create_tag" v-model="createTag"> | 						<input type="hidden" name="create_tag" v-model="createTag"> | ||||||
| 						{{if $.root.TreePath}} | 						<input type="hidden" name="current_path" v-model="treePath" v-if="treePath"> | ||||||
| 							<input type="hidden" name="current_path" value="{{.root.TreePath}}"> |  | ||||||
| 						{{end}} |  | ||||||
| 					</form> | 					</form> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
|   | |||||||
| @@ -52,13 +52,13 @@ | |||||||
| 										data-modal-cherry-pick-type="revert" | 										data-modal-cherry-pick-type="revert" | ||||||
| 										data-modal-cherry-pick-header="{{$.locale.Tr "repo.commit.revert-header" (ShortSha .CommitID)}}" | 										data-modal-cherry-pick-header="{{$.locale.Tr "repo.commit.revert-header" (ShortSha .CommitID)}}" | ||||||
| 										data-modal-cherry-pick-content="{{$.locale.Tr "repo.commit.revert-content"}}" | 										data-modal-cherry-pick-content="{{$.locale.Tr "repo.commit.revert-content"}}" | ||||||
| 										data-modal-cherry-pick-submit="{{.locale.Tr "repo.commit.revert"}}">{{.locale.Tr "repo.commit.revert"}}</a></div> | 										data-modal-cherry-pick-submit="{{.locale.Tr "repo.commit.revert"}}">{{.locale.Tr "repo.commit.revert"}}</div> | ||||||
| 									<div class="item cherry-pick-button show-modal" | 									<div class="item cherry-pick-button show-modal" | ||||||
| 										data-modal="#cherry-pick-modal" | 										data-modal="#cherry-pick-modal" | ||||||
| 										data-modal-cherry-pick-type="cherry-pick" | 										data-modal-cherry-pick-type="cherry-pick" | ||||||
| 										data-modal-cherry-pick-header="{{$.locale.Tr "repo.commit.cherry-pick-header" (ShortSha .CommitID)}}" | 										data-modal-cherry-pick-header="{{$.locale.Tr "repo.commit.cherry-pick-header" (ShortSha .CommitID)}}" | ||||||
| 										data-modal-cherry-pick-content="{{$.locale.Tr "repo.commit.cherry-pick-content"}}" | 										data-modal-cherry-pick-content="{{$.locale.Tr "repo.commit.cherry-pick-content"}}" | ||||||
| 										data-modal-cherry-pick-submit="{{.locale.Tr "repo.commit.cherry-pick"}}">{{.locale.Tr "repo.commit.cherry-pick"}}</a></div> | 										data-modal-cherry-pick-submit="{{.locale.Tr "repo.commit.cherry-pick"}}">{{.locale.Tr "repo.commit.cherry-pick"}}</div> | ||||||
| 									<div class="ui basic modal" id="cherry-pick-modal"> | 									<div class="ui basic modal" id="cherry-pick-modal"> | ||||||
| 										<div class="ui icon header"> | 										<div class="ui icon header"> | ||||||
| 											<span id="cherry-pick-header"></span> | 											<span id="cherry-pick-header"></span> | ||||||
| @@ -66,10 +66,10 @@ | |||||||
| 										<div class="content center"> | 										<div class="content center"> | ||||||
| 											<p id="cherry-pick-content" class="branch-dropdown"></p> | 											<p id="cherry-pick-content" class="branch-dropdown"></p> | ||||||
| 											{{template "repo/branch_dropdown" dict "root" . | 											{{template "repo/branch_dropdown" dict "root" . | ||||||
| 												"noTag" "true" "canCreateBranch" "false" | 												"noTag" true "disableCreateBranch" true | ||||||
| 												"branchForm" "branch-dropdown-form" | 												"branchForm" "branch-dropdown-form" | ||||||
| 												"branchURLPrefix" (printf "%s/_cherrypick/%s/" $.RepoLink .CommitID) "branchURLSuffix" "" | 												"branchURLPrefix" (printf "%s/_cherrypick/%s/" $.RepoLink .CommitID) "branchURLSuffix" "" | ||||||
| 												"setAction" "true" "submitForm" "true"}} | 												"setAction" true "submitForm" true}} | ||||||
| 											<form method="GET" action="{{$.RepoLink}}/_cherrypick/{{.CommitID}}/{{if $.BranchName}}{{PathEscapeSegments $.BranchName}}{{else}}{{PathEscapeSegments $.Repository.DefaultBranch}}{{end}}" id="branch-dropdown-form"> | 											<form method="GET" action="{{$.RepoLink}}/_cherrypick/{{.CommitID}}/{{if $.BranchName}}{{PathEscapeSegments $.BranchName}}{{else}}{{PathEscapeSegments $.Repository.DefaultBranch}}{{end}}" id="branch-dropdown-form"> | ||||||
| 												<input type="hidden" name="ref" value="{{if $.BranchName}}{{$.BranchName}}{{else}}{{$.Repository.DefaultBranch}}{{end}}"> | 												<input type="hidden" name="ref" value="{{if $.BranchName}}{{$.BranchName}}{{else}}{{$.Repository.DefaultBranch}}{{end}}"> | ||||||
| 												<input type="hidden" name="refType" value="branch"> | 												<input type="hidden" name="refType" value="branch"> | ||||||
|   | |||||||
| @@ -3,43 +3,41 @@ import $ from 'jquery'; | |||||||
| import {vueDelimiters} from './VueComponentLoader.js'; | import {vueDelimiters} from './VueComponentLoader.js'; | ||||||
|  |  | ||||||
| export function initRepoBranchTagDropdown(selector) { | export function initRepoBranchTagDropdown(selector) { | ||||||
|   $(selector).each(function () { |   $(selector).each(function (dropdownIndex, elRoot) { | ||||||
|     const $dropdown = $(this); |  | ||||||
|     const $data = $dropdown.find('.data'); |  | ||||||
|     const data = { |     const data = { | ||||||
|  |       csrfToken: window.config.csrfToken, | ||||||
|       items: [], |       items: [], | ||||||
|       mode: $data.data('mode'), |  | ||||||
|       searchTerm: '', |       searchTerm: '', | ||||||
|       refName: '', |  | ||||||
|       noResults: '', |  | ||||||
|       canCreateBranch: false, |  | ||||||
|       menuVisible: false, |       menuVisible: false, | ||||||
|       createTag: false, |       createTag: false, | ||||||
|  |       release: null, | ||||||
|  |  | ||||||
|       isViewTag: false, |       isViewTag: false, | ||||||
|       isViewBranch: false, |       isViewBranch: false, | ||||||
|       isViewTree: false, |       isViewTree: false, | ||||||
|       active: 0, |  | ||||||
|       branchForm: '', |  | ||||||
|       branchURLPrefix: '', |  | ||||||
|       branchURLSuffix: '', |  | ||||||
|       tagURLPrefix: '', |  | ||||||
|       tagURLSuffix: '', |  | ||||||
|       setAction: false, |  | ||||||
|       submitForm: false, |  | ||||||
|     }; |  | ||||||
|     $data.find('.item').each(function () { |  | ||||||
|       data.items.push({ |  | ||||||
|         name: $(this).text(), |  | ||||||
|         url: $(this).data('url'), |  | ||||||
|         branch: $(this).hasClass('branch'), |  | ||||||
|         tag: $(this).hasClass('tag'), |  | ||||||
|         selected: $(this).hasClass('selected') |  | ||||||
|       }); |  | ||||||
|     }); |  | ||||||
|     $data.remove(); |  | ||||||
|  |  | ||||||
|     // eslint-disable-next-line unicorn/no-this-assignment |       active: 0, | ||||||
|     const elRoot = this; |  | ||||||
|  |       ...window.config.pageData.branchDropdownDataList[dropdownIndex], | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     // the "data.defaultBranch" is ambiguous, it could be "branch name" or "tag name" | ||||||
|  |  | ||||||
|  |     if (data.showBranchesInDropdown && data.branches) { | ||||||
|  |       for (const branch of data.branches) { | ||||||
|  |         data.items.push({name: branch, url: branch, branch: true, tag: false, selected: branch === data.defaultBranch}); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (!data.noTag && data.tags) { | ||||||
|  |       for (const tag of data.tags) { | ||||||
|  |         if (data.release) { | ||||||
|  |           data.items.push({name: tag, url: tag, branch: false, tag: true, selected: tag === data.release.tagName}); | ||||||
|  |         } else { | ||||||
|  |           data.items.push({name: tag, url: tag, branch: false, tag: true, selected: tag === data.defaultBranch}); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const view = createApp({ |     const view = createApp({ | ||||||
|       delimiters: vueDelimiters, |       delimiters: vueDelimiters, | ||||||
|       data() { |       data() { | ||||||
| @@ -60,7 +58,7 @@ export function initRepoBranchTagDropdown(selector) { | |||||||
|           return this.filteredItems.length === 0 && !this.showCreateNewBranch; |           return this.filteredItems.length === 0 && !this.showCreateNewBranch; | ||||||
|         }, |         }, | ||||||
|         showCreateNewBranch() { |         showCreateNewBranch() { | ||||||
|           if (!this.canCreateBranch || !this.searchTerm) { |           if (this.disableCreateBranch || !this.searchTerm) { | ||||||
|             return false; |             return false; | ||||||
|           } |           } | ||||||
|  |  | ||||||
| @@ -77,10 +75,7 @@ export function initRepoBranchTagDropdown(selector) { | |||||||
|       }, |       }, | ||||||
|  |  | ||||||
|       beforeMount() { |       beforeMount() { | ||||||
|         this.noResults = elRoot.getAttribute('data-no-results'); |         switch (data.viewType) { | ||||||
|         this.canCreateBranch = elRoot.getAttribute('data-can-create-branch') === 'true'; |  | ||||||
|         this.branchForm = elRoot.getAttribute('data-branch-form'); |  | ||||||
|         switch (elRoot.getAttribute('data-view-type')) { |  | ||||||
|           case 'tree': |           case 'tree': | ||||||
|             this.isViewTree = true; |             this.isViewTree = true; | ||||||
|             break; |             break; | ||||||
| @@ -91,14 +86,6 @@ export function initRepoBranchTagDropdown(selector) { | |||||||
|             this.isViewBranch = true; |             this.isViewBranch = true; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         this.refName = elRoot.getAttribute('data-ref-name'); |  | ||||||
|         this.branchURLPrefix = elRoot.getAttribute('data-branch-url-prefix'); |  | ||||||
|         this.branchURLSuffix = elRoot.getAttribute('data-branch-url-suffix'); |  | ||||||
|         this.tagURLPrefix = elRoot.getAttribute('data-tag-url-prefix'); |  | ||||||
|         this.tagURLSuffix = elRoot.getAttribute('data-tag-url-suffix'); |  | ||||||
|         this.setAction = elRoot.getAttribute('data-set-action') === 'true'; |  | ||||||
|         this.submitForm = elRoot.getAttribute('data-submit-form') === 'true'; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         document.body.addEventListener('click', (event) => { |         document.body.addEventListener('click', (event) => { | ||||||
|           if (elRoot.contains(event.target)) return; |           if (elRoot.contains(event.target)) return; | ||||||
| @@ -116,7 +103,7 @@ export function initRepoBranchTagDropdown(selector) { | |||||||
|           } |           } | ||||||
|           item.selected = true; |           item.selected = true; | ||||||
|           const url = (item.tag) ? this.tagURLPrefix + item.url + this.tagURLSuffix : this.branchURLPrefix + item.url + this.branchURLSuffix; |           const url = (item.tag) ? this.tagURLPrefix + item.url + this.tagURLSuffix : this.branchURLPrefix + item.url + this.branchURLSuffix; | ||||||
|           if (this.branchForm === '') { |           if (!this.branchForm) { | ||||||
|             window.location.href = url; |             window.location.href = url; | ||||||
|           } else { |           } else { | ||||||
|             this.isViewTree = false; |             this.isViewTree = false; | ||||||
|   | |||||||
| @@ -485,7 +485,7 @@ export function initRepository() { | |||||||
|   // File list and commits |   // File list and commits | ||||||
|   if ($('.repository.file.list').length > 0 || $('.branch-dropdown').length > 0 || |   if ($('.repository.file.list').length > 0 || $('.branch-dropdown').length > 0 || | ||||||
|     $('.repository.commits').length > 0 || $('.repository.release').length > 0) { |     $('.repository.commits').length > 0 || $('.repository.release').length > 0) { | ||||||
|     initRepoBranchTagDropdown('.choose.reference .dropdown'); |     initRepoBranchTagDropdown('.choose.reference .ui.dropdown'); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Wiki |   // Wiki | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 wxiaoguang
					wxiaoguang