chore: various trivial fixes (#38070)

Follow-up to #37987, addressing the unresolved review comments on the
org members search form.

And fix more trivial problems together (see the commit titles)

---------

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
bircni
2026-06-11 19:33:21 +02:00
committed by GitHub
parent fefb6f3219
commit 5a24438698
19 changed files with 59 additions and 62 deletions

View File

@@ -65,17 +65,17 @@ func newParserContext(ctx *markup.RenderContext) parser.Context {
return pc
}
type GlodmarkRender struct {
type GoldmarkRender struct {
ctx *markup.RenderContext
goldmarkMarkdown goldmark.Markdown
}
func (r *GlodmarkRender) Convert(source []byte, writer io.Writer, opts ...parser.ParseOption) error {
func (r *GoldmarkRender) Convert(source []byte, writer io.Writer, opts ...parser.ParseOption) error {
return r.goldmarkMarkdown.Convert(source, writer, opts...)
}
func (r *GlodmarkRender) highlightingRenderer(w util.BufWriter, c highlighting.CodeBlockContext, entering bool) {
func (r *GoldmarkRender) highlightingRenderer(w util.BufWriter, c highlighting.CodeBlockContext, entering bool) {
if entering {
languageBytes, _ := c.Language()
languageStr := giteautil.IfZero(string(languageBytes), "text")
@@ -136,10 +136,10 @@ func goldmarkDefaultParser() parser.Parser {
}
// SpecializedMarkdown sets up the Gitea specific markdown extensions
func SpecializedMarkdown(ctx *markup.RenderContext) *GlodmarkRender {
func SpecializedMarkdown(ctx *markup.RenderContext) *GoldmarkRender {
// TODO: it could use a pool to cache the renderers to reuse them with different contexts
// at the moment it is fast enough (see the benchmarks)
r := &GlodmarkRender{ctx: ctx}
r := &GoldmarkRender{ctx: ctx}
r.goldmarkMarkdown = goldmark.New(
goldmark.WithParser(goldmarkDefaultParser()),
goldmark.WithExtensions(

View File

@@ -4,6 +4,7 @@
package repo
import (
"errors"
"fmt"
"math/big"
"net/http"
@@ -502,7 +503,9 @@ func (prInfo *pullRequestViewInfo) prepareMergeBoxCommitSigning(ctx *context.Con
wontSignReason = string(err.(*asymkey_service.ErrWontSign).Reason)
} else {
wontSignReason = "error"
log.Error("Error whilst checking if could sign pr %d in repo %s. Error: %v", pull.ID, pull.BaseRepo.FullName(), err)
if !errors.Is(err, util.ErrNotExist) {
log.Error("Error whilst checking if could sign pr %d in repo %s. Error: %v", pull.ID, pull.BaseRepo.FullName(), err)
}
}
}
}

View File

@@ -204,7 +204,9 @@ func GetPullDiffStats(ctx *context.Context) {
// do not report 500 server error to end users if error occurs, otherwise a PR missing ref won't be able to view.
headCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(pull.GetGitHeadRefName())
if err != nil {
if errors.Is(err, util.ErrNotExist) {
return
} else if err != nil {
log.Error("Failed to GetRefCommitID: %v, repo: %v", err, ctx.Repo.Repository.FullName())
return
}
@@ -375,7 +377,7 @@ func (prInfo *pullRequestViewInfo) prepareViewFillCompareInfo(ctx *context.Conte
pull := prInfo.issue.PullRequest
prInfo.CompareInfo, err = git_service.GetCompareInfo(ctx, ctx.Repo.Repository, ctx.Repo.Repository, ctx.Repo.GitRepo, baseRef, git.RefName(pull.GetGitHeadRefName()), false, false)
if err != nil {
isKnownErrorForBroken := gitcmd.IsStderr(err, gitcmd.StderrNotValidObjectName) || gitcmd.IsStderr(err, gitcmd.StderrUnknownRevisionOrPath)
isKnownErrorForBroken := errors.Is(err, util.ErrNotExist) || gitcmd.IsStderr(err, gitcmd.StderrNotValidObjectName) || gitcmd.IsStderr(err, gitcmd.StderrUnknownRevisionOrPath)
if !isKnownErrorForBroken {
log.Error("GetCompareInfo: %v", err)
}

View File

@@ -4,6 +4,7 @@
package repo
import (
"errors"
"html/template"
pull_model "gitea.dev/models/pull"
@@ -11,6 +12,7 @@ import (
"gitea.dev/models/unit"
"gitea.dev/modules/svg"
"gitea.dev/modules/templates"
"gitea.dev/modules/util"
"gitea.dev/services/context"
pull_service "gitea.dev/services/pull"
)
@@ -61,12 +63,12 @@ func (prInfo *pullRequestViewInfo) prepareMergeBoxFormProps(ctx *context.Context
}
defaultMergeTitle, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
if err != nil {
if err != nil && !errors.Is(err, util.ErrNotExist) {
ctx.ServerError("GetDefaultMergeMessage", err)
return
}
defaultSquashMergeTitle, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash)
if err != nil {
if err != nil && !errors.Is(err, util.ErrNotExist) {
ctx.ServerError("GetDefaultSquashMergeMessage", err)
return
}

View File

@@ -72,7 +72,7 @@
</div>
<div class="item-trailing">
<a class="muted" href="{{$.Link}}">
<span class="flex-text-inline"><i class="color-icon tw-mr-2 tw-bg-blue"></i>Go</span>
<span class="flex-text-inline"><i class="color-icon tw-bg-blue"></i>Go</span>
</a>
<a class="tw-text-text-light flex-text-inline" href="{{$.Link}}">{{svg "octicon-star" 16}}45000</a>
<a class="tw-text-text-light flex-text-inline" href="{{$.Link}}">{{svg "octicon-git-branch" 16}}1234</a>

View File

@@ -8,6 +8,7 @@
<button class="ui button toast-test-button" data-toast-level="warning" data-toast-message="test warning">Show Warning Toast</button>
<button class="ui button toast-test-button" data-toast-level="error" data-toast-message="test error">Show Error Toast</button>
<button class="ui button toast-test-button" data-toast-level="error" data-toast-message="very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message">Show Error Toast (long)</button>
<button class="ui button toast-test-button-pre">Show Error (with pre)</button>
</div>
</div>
</div>

View File

@@ -3,6 +3,7 @@
{{template "explore/navbar" .}}
<div class="ui container">
{{template "shared/repo/search" .}}
<div class="divider"></div>
{{template "shared/repo/list" .}}
{{template "base/paginate" .}}
</div>

View File

@@ -9,6 +9,7 @@
<div id="readme_profile" class="render-content markup" data-profile-view-as-member="{{.IsViewingOrgAsMember}}">{{.ProfileReadmeContent}}</div>
{{end}}
{{template "shared/repo/search" .}}
<div class="divider"></div>
{{if not .Repos}}
<div class="empty-placeholder">
{{svg "octicon-repo" 48}}

View File

@@ -9,16 +9,13 @@
<div class="tw-flex-1">{{ctx.Locale.Tr "org.teams.manage_team_member_prompt"}}</div>
<a class="ui primary button" href="./teams">{{ctx.Locale.Tr "org.teams.manage_team_member"}}</a>
</div>
<div class="divider"></div>
{{end}}
<div class="ui small secondary filter">
<form id="org-member-search-form" class="ui form ignore-dirty tw-flex-1 tw-flex tw-items-center">
<div class="ui small fluid action input tw-flex-1">
{{template "shared/search/input" dict "Value" .Keyword "Placeholder" (ctx.Locale.Tr "search.user_kind")}}
{{template "shared/search/button"}}
</div>
</form>
</div>
<form class="ui form ignore-dirty tw-my-4">
<div class="ui small fluid action input">
{{template "shared/search/input" dict "Value" .Keyword "Placeholder" (ctx.Locale.Tr "search.user_kind")}}
{{template "shared/search/button"}}
</div>
</form>
<div class="flex-divided-list items-with-main">
{{range .Members}}
{{$isPublic := index $.MembersIsPublicMember .ID}}

View File

@@ -36,8 +36,8 @@
</div>
<div class="item-trailing muted-links">
{{if .PrimaryLanguage}}
<a class="flex-text-inline" href="?q={{$.Keyword}}&sort={{$.SortType}}&language={{.PrimaryLanguage.Language}}{{if $.TabName}}&tab={{$.TabName}}{{end}}">
<i class="color-icon tw-mr-2" style="background-color: {{.PrimaryLanguage.Color}}"></i>
<a class="flex-text-block" href="?q={{$.Keyword}}&sort={{$.SortType}}&language={{.PrimaryLanguage.Language}}{{if $.TabName}}&tab={{$.TabName}}{{end}}">
<i class="color-icon" style="background-color: {{.PrimaryLanguage.Color}}"></i>
{{.PrimaryLanguage.Language}}
</a>
{{end}}

View File

@@ -1,5 +1,5 @@
<div class="ui small secondary filter menu">
<form id="repo-search-form" class="ui form ignore-dirty tw-flex-1 tw-flex tw-items-center tw-gap-x-2">
<form class="ui form ignore-dirty tw-w-full flex-text-block tw-flex-wrap" data-global-init="initRepositorySearch">
{{if .Language}}<input type="hidden" name="language" value="{{.Language}}">{{end}}
{{if .PageIsExploreRepositories}}<input type="hidden" name="only_show_relevant" value="{{.OnlyShowRelevant}}">{{end}}
{{if .TabName}}<input type="hidden" name="tab" value="{{.TabName}}">{{end}}
@@ -9,11 +9,11 @@
{{template "shared/search/button"}}
</div>
<!-- Filter -->
<div class="item ui small dropdown jump">
<span class="text">{{ctx.Locale.Tr "filter_title"}}</span>
<div class="item ui small dropdown">
<span>{{ctx.Locale.Tr "filter_title"}}</span>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu flex-items-menu">
<label class="item"><input type="radio" name="clear-filter"> {{ctx.Locale.Tr "filter.clear"}}</label>
<label class="item repo-search-filter-reset js-aria-clickable">{{ctx.Locale.Tr "filter.clear"}}</label>
<div class="divider"></div>
<label class="item"><input type="radio" name="archived" {{if .IsArchived.Value}}checked{{end}} value="1"> {{ctx.Locale.Tr "filter.is_archived"}}</label>
<label class="item"><input type="radio" name="archived" {{if (not (.IsArchived.ValueOrDefault true))}}checked{{end}} value="0"> {{ctx.Locale.Tr "filter.not_archived"}}</label>
@@ -32,8 +32,8 @@
</div>
</div>
<!-- Sort -->
<div class="item ui small dropdown jump">
<span class="text">{{ctx.Locale.Tr "repo.issues.filter_sort"}}</span>
<div class="item ui small dropdown">
<span>{{ctx.Locale.Tr "repo.issues.filter_sort"}}</span>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
<label class="{{if eq .SortType "newest"}}active {{end}}item"><input hidden type="radio" name="sort" {{if eq .SortType "newest"}}checked{{end}} value="newest"> {{ctx.Locale.Tr "repo.issues.filter_sort.latest"}}</label>
@@ -61,4 +61,3 @@
</span>
</div>
{{end}}
<div class="divider"></div>

View File

@@ -1,10 +1,10 @@
<div class="flex-text-block tw-flex-wrap">
{{range $term := .SearchResultLanguages}}
<a class="ui {{if eq $.Language $term.Language}}primary{{end}} basic label tw-m-0"
<a class="ui {{if eq $.Language $term.Language}}primary{{end}} basic label tw-m-0 tw-gap-2"
href="?q={{$.Keyword}}{{if ne $.Language $term.Language}}&l={{$term.Language}}{{end}}&search_mode={{$.SelectedSearchMode}}">
<i class="color-icon tw-mr-2" style="background-color: {{$term.Color}}"></i>
<i class="color-icon" style="background-color: {{$term.Color}}"></i>
{{$term.Language}}
<div class="detail">{{$term.Count}}</div>
<div class="detail tw-ml-2">{{$term.Count}}</div>
</a>
{{end}}
</div>

View File

@@ -68,6 +68,7 @@
{{end}}
{{else}}
{{template "shared/repo/search" .}}
<div class="divider"></div>
{{template "shared/repo/list" .}}
{{template "base/paginate" .}}
{{end}}

View File

@@ -18,6 +18,7 @@
{{else if eq .TabName "stars"}}
<div class="stars">
{{template "shared/repo/search" .}}
<div class="divider"></div>
{{template "shared/repo/list" .}}
{{template "base/paginate" .}}
</div>
@@ -31,6 +32,7 @@
{{template "repo/user_cards" .}}
{{else}}
{{template "shared/repo/search" .}}
<div class="divider"></div>
{{template "shared/repo/list" .}}
{{template "base/paginate" .}}
{{end}}

View File

@@ -278,6 +278,7 @@ a {
a:hover {
text-decoration-line: underline;
text-underline-position: under; /* necessary for CJK fonts, otherwise, default "auto" makes the underline cross-over the CJK text bottom */
}
/* a = always colored, underlined on hover */

View File

@@ -39,25 +39,16 @@ a.ui.label {
height: 2.1666em;
}
.ui.label > .color-icon {
margin-left: 0;
}
.ui.label > .icon {
width: auto;
margin: 0 0.75em 0 0;
}
.ui.label > .detail {
display: inline-block;
vertical-align: top;
font-weight: var(--font-weight-medium);
margin-left: 1em;
margin-left: 0.5em; /* our .ui.label already provides flex gap, so the margin here shouldn't be too large */
opacity: 0.8;
}
.ui.label > .detail .icon {
margin: 0 0.25em 0 0;
}
.ui.label > .close.icon,
.ui.label > .delete.icon {

View File

@@ -22,6 +22,10 @@
overflow-wrap: anywhere;
}
.toast-body pre {
white-space: pre-wrap; /* online editor, when git hook fails, the rendered message uses "pre" */
}
.toast-close {
border-radius: var(--border-radius);
width: 30px;

View File

@@ -1,23 +1,12 @@
import {registerGlobalInitFunc} from '../modules/observer.ts';
import {addDelegatedEventListener, queryElems} from '../utils/dom.ts';
export function initRepositorySearch() {
const repositorySearchForm = document.querySelector<HTMLFormElement>('#repo-search-form');
if (!repositorySearchForm) return;
repositorySearchForm.addEventListener('change', (e: Event) => {
e.preventDefault();
const params = new URLSearchParams();
for (const [key, value] of new FormData(repositorySearchForm).entries()) {
params.set(key, value as string);
}
if ((e.target as HTMLInputElement).name === 'clear-filter') {
params.delete('archived');
params.delete('fork');
params.delete('mirror');
params.delete('template');
params.delete('private');
}
params.delete('clear-filter');
window.location.search = params.toString();
registerGlobalInitFunc('initRepositorySearch', (form: HTMLFormElement) => {
addDelegatedEventListener(form, 'change', 'input[type="radio"]', () => form.submit());
form.querySelector('.repo-search-filter-reset')!.addEventListener('click', () => {
queryElems(form, 'input[type="radio"]', (el: HTMLInputElement) => el.checked = false);
form.submit();
});
});
}

View File

@@ -19,6 +19,9 @@ function initDevtestPage() {
levelMap[level](message);
});
}
document.querySelector('.toast-test-button-pre')!.addEventListener('click', () => {
showErrorToast(html`<div>message <pre>pre ${'a'.repeat(200)}</pre><details><summary>summary</summary>details</details></div>`, {useHtmlBody: true});
});
}
const modalButtons = document.querySelector('.modal-buttons');