mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 00:58:55 +00:00 
			
		
		
		
	Backport #34308 by wxiaoguang Also fix #34300 Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -6,8 +6,8 @@ | |||||||
| 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/assignee?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/assignee?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | ||||||
| > | > | ||||||
| 	<input class="combo-value" name="assignee_ids" type="hidden" value="{{$data.SelectedAssigneeIDs}}"> | 	<input class="combo-value" name="assignee_ids" type="hidden" value="{{$data.SelectedAssigneeIDs}}"> | ||||||
| 	<div class="ui dropdown text-flex-grow {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | 	<div class="ui dropdown full-width {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | ||||||
| 		<a class="text muted"> | 		<a class="fixed-text muted"> | ||||||
| 			<strong>{{ctx.Locale.Tr "repo.issues.new.assignees"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | 			<strong>{{ctx.Locale.Tr "repo.issues.new.assignees"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | ||||||
| 		</a> | 		</a> | ||||||
| 		<div class="menu"> | 		<div class="menu"> | ||||||
| @@ -16,7 +16,7 @@ | |||||||
| 				<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_assignees"}}"> | 				<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_assignees"}}"> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="scrolling menu flex-items-block"> | 			<div class="scrolling menu flex-items-block"> | ||||||
| 				<div class="item clear-selection">{{ctx.Locale.Tr "repo.issues.new.clear_assignees"}}</div> | 				<div class="item clear-selection" data-text="">{{ctx.Locale.Tr "repo.issues.new.clear_assignees"}}</div> | ||||||
| 				<div class="divider"></div> | 				<div class="divider"></div> | ||||||
| 				{{range $data.CandidateAssignees}} | 				{{range $data.CandidateAssignees}} | ||||||
| 					<a class="item" href="#" data-value="{{.ID}}"> | 					<a class="item" href="#" data-value="{{.ID}}"> | ||||||
|   | |||||||
| @@ -4,8 +4,8 @@ | |||||||
| 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/labels?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/labels?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | ||||||
| > | > | ||||||
| 	<input class="combo-value" name="label_ids" type="hidden" value="{{$data.SelectedLabelIDs}}"> | 	<input class="combo-value" name="label_ids" type="hidden" value="{{$data.SelectedLabelIDs}}"> | ||||||
| 	<div class="ui dropdown text-flex-grow {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | 	<div class="ui dropdown full-width {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | ||||||
| 		<a class="text muted"> | 		<a class="fixed-text muted"> | ||||||
| 			<strong>{{ctx.Locale.Tr "repo.issues.new.labels"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | 			<strong>{{ctx.Locale.Tr "repo.issues.new.labels"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | ||||||
| 		</a> | 		</a> | ||||||
| 		<div class="menu"> | 		<div class="menu"> | ||||||
| @@ -17,7 +17,7 @@ | |||||||
| 					<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_labels"}}"> | 					<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_labels"}}"> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="scrolling menu"> | 				<div class="scrolling menu"> | ||||||
| 					<a class="item clear-selection" href="#">{{ctx.Locale.Tr "repo.issues.new.clear_labels"}}</a> | 					<a class="item clear-selection" data-text="" href="#">{{ctx.Locale.Tr "repo.issues.new.clear_labels"}}</a> | ||||||
| 					<div class="divider"></div> | 					<div class="divider"></div> | ||||||
| 					{{$previousExclusiveScope := "_no_scope"}} | 					{{$previousExclusiveScope := "_no_scope"}} | ||||||
| 					{{range $data.RepoLabels}} | 					{{range $data.RepoLabels}} | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ | |||||||
| 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/milestone?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/milestone?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | ||||||
| > | > | ||||||
| 	<input class="combo-value" name="milestone_id" type="hidden" value="{{$data.SelectedMilestoneID}}"> | 	<input class="combo-value" name="milestone_id" type="hidden" value="{{$data.SelectedMilestoneID}}"> | ||||||
| 	<div class="ui dropdown text-flex-grow {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | 	<div class="ui dropdown full-width {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | ||||||
| 		<a class="text muted"> | 		<a class="fixed-text muted"> | ||||||
| 			<strong>{{ctx.Locale.Tr "repo.issues.new.milestone"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | 			<strong>{{ctx.Locale.Tr "repo.issues.new.milestone"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | ||||||
| 		</a> | 		</a> | ||||||
| 		<div class="menu"> | 		<div class="menu"> | ||||||
| @@ -19,7 +19,7 @@ | |||||||
| 					<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_milestones"}}"> | 					<input type="text" placeholder="{{ctx.Locale.Tr "repo.issues.filter_milestones"}}"> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="scrolling menu"> | 				<div class="scrolling menu"> | ||||||
| 					<div class="item clear-selection">{{ctx.Locale.Tr "repo.issues.new.clear_milestone"}}</div> | 					<div class="item clear-selection" data-text="">{{ctx.Locale.Tr "repo.issues.new.clear_milestone"}}</div> | ||||||
| 					<div class="divider"></div> | 					<div class="divider"></div> | ||||||
| 					{{if $data.OpenMilestones}} | 					{{if $data.OpenMilestones}} | ||||||
| 						<div class="header">{{ctx.Locale.Tr "repo.issues.filter_milestone_open"}}</div> | 						<div class="header">{{ctx.Locale.Tr "repo.issues.filter_milestone_open"}}</div> | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ | |||||||
| 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/projects?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/projects?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | ||||||
| > | > | ||||||
| 	<input class="combo-value" name="project_id" type="hidden" value="{{$data.SelectedProjectID}}"> | 	<input class="combo-value" name="project_id" type="hidden" value="{{$data.SelectedProjectID}}"> | ||||||
| 	<div class="ui dropdown text-flex-grow {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | 	<div class="ui dropdown full-width {{if not $pageMeta.CanModifyIssueOrPull}}disabled{{end}}"> | ||||||
| 		<a class="text muted"> | 		<a class="fixed-text muted"> | ||||||
| 			<strong>{{ctx.Locale.Tr "repo.issues.new.projects"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | 			<strong>{{ctx.Locale.Tr "repo.issues.new.projects"}}</strong> {{if $pageMeta.CanModifyIssueOrPull}}{{svg "octicon-gear"}}{{end}} | ||||||
| 		</a> | 		</a> | ||||||
| 		<div class="menu"> | 		<div class="menu"> | ||||||
| @@ -18,7 +18,7 @@ | |||||||
| 			</div> | 			</div> | ||||||
| 			{{end}} | 			{{end}} | ||||||
| 			<div class="scrolling menu"> | 			<div class="scrolling menu"> | ||||||
| 				<div class="item clear-selection">{{ctx.Locale.Tr "repo.issues.new.clear_projects"}}</div> | 				<div class="item clear-selection" data-text="">{{ctx.Locale.Tr "repo.issues.new.clear_projects"}}</div> | ||||||
| 				<div class="divider"></div> | 				<div class="divider"></div> | ||||||
| 				{{if $data.OpenProjects}} | 				{{if $data.OpenProjects}} | ||||||
| 					<div class="header">{{ctx.Locale.Tr "repo.issues.new.open_projects"}}</div> | 					<div class="header">{{ctx.Locale.Tr "repo.issues.new.open_projects"}}</div> | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ | |||||||
| 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/request_review?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | 		{{if $pageMeta.Issue}}data-update-url="{{$pageMeta.RepoLink}}/issues/request_review?issue_ids={{$pageMeta.Issue.ID}}"{{end}} | ||||||
| > | > | ||||||
| 	<input type="hidden" class="combo-value" name="reviewer_ids">{{/* match CreateIssueForm */}} | 	<input type="hidden" class="combo-value" name="reviewer_ids">{{/* match CreateIssueForm */}} | ||||||
| 	<div class="ui dropdown text-flex-grow {{if or (not $hasCandidates) (not $data.CanChooseReviewer)}}disabled{{end}}"> | 	<div class="ui dropdown full-width {{if or (not $hasCandidates) (not $data.CanChooseReviewer)}}disabled{{end}}"> | ||||||
| 		<a class="text muted"> | 		<a class="fixed-text muted"> | ||||||
| 			<strong>{{ctx.Locale.Tr "repo.issues.review.reviewers"}}</strong> {{if $data.CanChooseReviewer}}{{svg "octicon-gear"}}{{end}} | 			<strong>{{ctx.Locale.Tr "repo.issues.review.reviewers"}}</strong> {{if $data.CanChooseReviewer}}{{svg "octicon-gear"}}{{end}} | ||||||
| 		</a> | 		</a> | ||||||
| 		<div class="menu flex-items-menu"> | 		<div class="menu flex-items-menu"> | ||||||
|   | |||||||
| @@ -2,10 +2,11 @@ | |||||||
| 	{{if and .CanUseTimetracker (not .Repository.IsArchived)}} | 	{{if and .CanUseTimetracker (not .Repository.IsArchived)}} | ||||||
| 		<div class="divider"></div> | 		<div class="divider"></div> | ||||||
| 		<div> | 		<div> | ||||||
| 			<div class="ui dropdown text-flex-grow jump"> | 			<div class="ui dropdown full-width jump"> | ||||||
| 				<a class="text muted"> | 				<a class="fixed-text muted"> | ||||||
| 					<div> | 					<div> | ||||||
| 						<strong>{{ctx.Locale.Tr "repo.issues.tracker"}}</strong> {{if $.IsStopwatchRunning}}{{svg "octicon-stopwatch"}}{{end}} | 						<strong>{{ctx.Locale.Tr "repo.issues.tracker"}}</strong> | ||||||
|  | 						{{if $.IsStopwatchRunning}}{{svg "octicon-stopwatch"}}{{end}} | ||||||
| 					</div> | 					</div> | ||||||
| 					{{svg "octicon-gear"}} | 					{{svg "octicon-gear"}} | ||||||
| 				</a> | 				</a> | ||||||
|   | |||||||
| @@ -1188,16 +1188,6 @@ the "!important" is necessary to override Fomantic UI menu item styles, meanwhil | |||||||
|   text-overflow: ellipsis !important; |   text-overflow: ellipsis !important; | ||||||
| } | } | ||||||
|  |  | ||||||
| .ui.dropdown.text-flex-grow { |  | ||||||
|   display: flex; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .ui.dropdown.text-flex-grow > .text { |  | ||||||
|   display: flex; |  | ||||||
|   flex-grow: 1; |  | ||||||
|   justify-content: space-between; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .svg.octicon-file-directory-fill, | .svg.octicon-file-directory-fill, | ||||||
| .svg.octicon-file-directory-open-fill, | .svg.octicon-file-directory-open-fill, | ||||||
| .svg.octicon-file-submodule { | .svg.octicon-file-submodule { | ||||||
|   | |||||||
| @@ -50,23 +50,33 @@ | |||||||
|   width: 300px; |   width: 300px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .issue-sidebar-combo .ui.dropdown .item:not(.checked) .item-check-mark { | .issue-content-right .ui.dropdown.full-width { | ||||||
|   visibility: hidden; |   width: 100%; | ||||||
| } | } | ||||||
|  |  | ||||||
| .issue-content-right .dropdown > .menu { | .issue-content-right .ui.dropdown.full-width > .fixed-text { | ||||||
|  |   display: flex; | ||||||
|  |   flex-grow: 1; | ||||||
|  |   justify-content: space-between; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .issue-content-right .ui.dropdown > .menu { | ||||||
|   max-width: 270px; |   max-width: 270px; | ||||||
|   min-width: 0; |   min-width: 0; | ||||||
|   max-height: 500px; |   max-height: 500px; | ||||||
|   overflow-x: auto; |   overflow-x: auto; | ||||||
| } | } | ||||||
|  |  | ||||||
| .issue-content-right .dropdown > .menu .item-secondary-info small { | .issue-content-right .ui.dropdown > .menu .item-secondary-info small { | ||||||
|   display: block; |   display: block; | ||||||
|   text-overflow: ellipsis; |   text-overflow: ellipsis; | ||||||
|   overflow: hidden; |   overflow: hidden; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .issue-sidebar-combo > .ui.dropdown .item:not(.checked) .item-check-mark { | ||||||
|  |   visibility: hidden; | ||||||
|  | } | ||||||
|  |  | ||||||
| @media (max-width: 767.98px) { | @media (max-width: 767.98px) { | ||||||
|   .issue-content-left, |   .issue-content-left, | ||||||
|   .issue-content-right { |   .issue-content-right { | ||||||
|   | |||||||
| @@ -4080,7 +4080,7 @@ $.fn.dropdown.settings = { | |||||||
|     search       : 'input.search, .menu > .search > input, .menu input.search', |     search       : 'input.search, .menu > .search > input, .menu input.search', | ||||||
|     sizer        : '> span.sizer', |     sizer        : '> span.sizer', | ||||||
|     text         : '> .text:not(.icon)', |     text         : '> .text:not(.icon)', | ||||||
|     unselectable : '.disabled, .filtered', |     unselectable : '.disabled, .filtered, .tw-hidden', // GITEA-PATCH: tw-hidden hides the item so it is also unselectable | ||||||
|     clearIcon    : '> .remove.icon' |     clearIcon    : '> .remove.icon' | ||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import {fomanticQuery} from '../modules/fomantic/base.ts'; | import {fomanticQuery} from '../modules/fomantic/base.ts'; | ||||||
| import {POST} from '../modules/fetch.ts'; | import {POST} from '../modules/fetch.ts'; | ||||||
| import {queryElemChildren, queryElems, toggleElem} from '../utils/dom.ts'; | import {addDelegatedEventListener, queryElemChildren, queryElems, toggleElem} from '../utils/dom.ts'; | ||||||
|  |  | ||||||
| // if there are draft comments, confirm before reloading, to avoid losing comments | // if there are draft comments, confirm before reloading, to avoid losing comments | ||||||
| function issueSidebarReloadConfirmDraftComment() { | function issueSidebarReloadConfirmDraftComment() { | ||||||
| @@ -22,7 +22,7 @@ function issueSidebarReloadConfirmDraftComment() { | |||||||
|   window.location.reload(); |   window.location.reload(); | ||||||
| } | } | ||||||
|  |  | ||||||
| class IssueSidebarComboList { | export class IssueSidebarComboList { | ||||||
|   updateUrl: string; |   updateUrl: string; | ||||||
|   updateAlgo: string; |   updateAlgo: string; | ||||||
|   selectionMode: string; |   selectionMode: string; | ||||||
| @@ -95,9 +95,7 @@ class IssueSidebarComboList { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   async onItemClick(e: Event) { |   async onItemClick(elItem: HTMLElement, e: Event) { | ||||||
|     const elItem = (e.target as HTMLElement).closest('.item'); |  | ||||||
|     if (!elItem) return; |  | ||||||
|     e.preventDefault(); |     e.preventDefault(); | ||||||
|     if (elItem.hasAttribute('data-can-change') && elItem.getAttribute('data-can-change') !== 'true') return; |     if (elItem.hasAttribute('data-can-change') && elItem.getAttribute('data-can-change') !== 'true') return; | ||||||
|  |  | ||||||
| @@ -146,16 +144,13 @@ class IssueSidebarComboList { | |||||||
|     } |     } | ||||||
|     this.initialValues = this.collectCheckedValues(); |     this.initialValues = this.collectCheckedValues(); | ||||||
|  |  | ||||||
|     this.elDropdown.addEventListener('click', (e) => this.onItemClick(e)); |     addDelegatedEventListener(this.elDropdown, 'click', '.item', (el, e) => this.onItemClick(el, e)); | ||||||
|  |  | ||||||
|     fomanticQuery(this.elDropdown).dropdown('setting', { |     fomanticQuery(this.elDropdown).dropdown('setting', { | ||||||
|       action: 'nothing', // do not hide the menu if user presses Enter |       action: 'nothing', // do not hide the menu if user presses Enter | ||||||
|       fullTextSearch: 'exact', |       fullTextSearch: 'exact', | ||||||
|  |       hideDividers: 'empty', | ||||||
|       onHide: () => this.onHide(), |       onHide: () => this.onHide(), | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| export function initIssueSidebarComboList(container: HTMLElement) { |  | ||||||
|   new IssueSidebarComboList(container).init(); |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import {POST} from '../modules/fetch.ts'; | import {POST} from '../modules/fetch.ts'; | ||||||
| import {queryElems, toggleElem} from '../utils/dom.ts'; | import {queryElems, toggleElem} from '../utils/dom.ts'; | ||||||
| import {initIssueSidebarComboList} from './repo-issue-sidebar-combolist.ts'; | import {IssueSidebarComboList} from './repo-issue-sidebar-combolist.ts'; | ||||||
|  |  | ||||||
| function initBranchSelector() { | function initBranchSelector() { | ||||||
|   // TODO: RemoveIssueRef: see "repo/issue/branch_selector_field.tmpl" |   // TODO: RemoveIssueRef: see "repo/issue/branch_selector_field.tmpl" | ||||||
| @@ -48,5 +48,5 @@ export function initRepoIssueSidebar() { | |||||||
|   initRepoIssueDue(); |   initRepoIssueDue(); | ||||||
|  |  | ||||||
|   // init the combo list: a dropdown for selecting items, and a list for showing selected items and related actions |   // init the combo list: a dropdown for selecting items, and a list for showing selected items and related actions | ||||||
|   queryElems<HTMLElement>(document, '.issue-sidebar-combo', (el) => initIssueSidebarComboList(el)); |   queryElems<HTMLElement>(document, '.issue-sidebar-combo', (el) => new IssueSidebarComboList(el).init()); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -228,12 +228,13 @@ function attachDomEvents(dropdown: HTMLElement, focusable: HTMLElement, menu: HT | |||||||
|   dropdown.addEventListener('keydown', (e: KeyboardEvent) => { |   dropdown.addEventListener('keydown', (e: KeyboardEvent) => { | ||||||
|     // here it must use keydown event before dropdown's keyup handler, otherwise there is no Enter event in our keyup handler |     // here it must use keydown event before dropdown's keyup handler, otherwise there is no Enter event in our keyup handler | ||||||
|     if (e.key === 'Enter') { |     if (e.key === 'Enter') { | ||||||
|       const dropdownCall = fomanticDropdownFn.bind($(dropdown)); |       const elItem = menu.querySelector<HTMLElement>(':scope > .item.selected, .menu > .item.selected'); | ||||||
|       let $item = dropdownCall('get item', dropdownCall('get value')); |  | ||||||
|       if (!$item) $item = $(menu).find('> .item.selected'); // when dropdown filters items by input, there is no "value", so query the "selected" item |  | ||||||
|       // if the selected item is clickable, then trigger the click event. |       // if the selected item is clickable, then trigger the click event. | ||||||
|       // we can not click any item without check, because Fomantic code might also handle the Enter event. that would result in double click. |       // we can not click any item without check, because Fomantic code might also handle the Enter event. that would result in double click. | ||||||
|       if ($item?.[0]?.matches('a, .js-aria-clickable')) $item[0].click(); |       if (elItem?.matches('a, .js-aria-clickable') && !elItem.matches('.tw-hidden, .filtered')) { | ||||||
|  |         e.preventDefault(); | ||||||
|  |         elItem.click(); | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user