mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	code optimization (#31315)
Simplifying complex if-else to existing Iif operations
This commit is contained in:
		| @@ -9,6 +9,7 @@ import ( | |||||||
| 	"html" | 	"html" | ||||||
| 	"html/template" | 	"html/template" | ||||||
| 	"net/url" | 	"net/url" | ||||||
|  | 	"reflect" | ||||||
| 	"slices" | 	"slices" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| @@ -237,8 +238,8 @@ func DotEscape(raw string) string { | |||||||
|  |  | ||||||
| // Iif is an "inline-if", similar util.Iif[T] but templates need the non-generic version, | // Iif is an "inline-if", similar util.Iif[T] but templates need the non-generic version, | ||||||
| // and it could be simply used as "{{Iif expr trueVal}}" (omit the falseVal). | // and it could be simply used as "{{Iif expr trueVal}}" (omit the falseVal). | ||||||
| func Iif(condition bool, vals ...any) any { | func Iif(condition any, vals ...any) any { | ||||||
| 	if condition { | 	if IsTruthy(condition) { | ||||||
| 		return vals[0] | 		return vals[0] | ||||||
| 	} else if len(vals) > 1 { | 	} else if len(vals) > 1 { | ||||||
| 		return vals[1] | 		return vals[1] | ||||||
| @@ -246,6 +247,32 @@ func Iif(condition bool, vals ...any) any { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func IsTruthy(v any) bool { | ||||||
|  | 	if v == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	switch rv.Kind() { | ||||||
|  | 	case reflect.Bool: | ||||||
|  | 		return rv.Bool() | ||||||
|  | 	case reflect.String: | ||||||
|  | 		return rv.String() != "" | ||||||
|  | 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||||
|  | 		return rv.Int() != 0 | ||||||
|  | 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: | ||||||
|  | 		return rv.Uint() != 0 | ||||||
|  | 	case reflect.Float32, reflect.Float64: | ||||||
|  | 		return rv.Float() != 0 | ||||||
|  | 	case reflect.Slice, reflect.Array, reflect.Map: | ||||||
|  | 		return rv.Len() > 0 | ||||||
|  | 	case reflect.Ptr: | ||||||
|  | 		return !rv.IsNil() && IsTruthy(reflect.Indirect(rv).Interface()) | ||||||
|  | 	default: | ||||||
|  | 		return rv.Kind() == reflect.Struct && !rv.IsNil() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // Eval the expression and return the result, see the comment of eval.Expr for details. | // Eval the expression and return the result, see the comment of eval.Expr for details. | ||||||
| // To use this helper function in templates, pass each token as a separate parameter. | // To use this helper function in templates, pass each token as a separate parameter. | ||||||
| // | // | ||||||
|   | |||||||
| @@ -65,3 +65,18 @@ func TestHTMLFormat(t *testing.T) { | |||||||
| func TestSanitizeHTML(t *testing.T) { | func TestSanitizeHTML(t *testing.T) { | ||||||
| 	assert.Equal(t, template.HTML(`<a href="/" rel="nofollow">link</a> xss <div>inline</div>`), SanitizeHTML(`<a href="/">link</a> <a href="javascript:">xss</a> <div style="dangerous">inline</div>`)) | 	assert.Equal(t, template.HTML(`<a href="/" rel="nofollow">link</a> xss <div>inline</div>`), SanitizeHTML(`<a href="/">link</a> <a href="javascript:">xss</a> <div style="dangerous">inline</div>`)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestIsTruthy(t *testing.T) { | ||||||
|  | 	var test any | ||||||
|  | 	assert.Equal(t, false, IsTruthy(test)) | ||||||
|  | 	assert.Equal(t, false, IsTruthy(nil)) | ||||||
|  | 	assert.Equal(t, false, IsTruthy("")) | ||||||
|  | 	assert.Equal(t, true, IsTruthy("non-empty")) | ||||||
|  | 	assert.Equal(t, true, IsTruthy(-1)) | ||||||
|  | 	assert.Equal(t, false, IsTruthy(0)) | ||||||
|  | 	assert.Equal(t, true, IsTruthy(42)) | ||||||
|  | 	assert.Equal(t, false, IsTruthy(0.0)) | ||||||
|  | 	assert.Equal(t, true, IsTruthy(3.14)) | ||||||
|  | 	assert.Equal(t, false, IsTruthy([]int{})) | ||||||
|  | 	assert.Equal(t, true, IsTruthy([]int{1})) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ | |||||||
| 							<td>{{.ID}}</td> | 							<td>{{.ID}}</td> | ||||||
| 							<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{.Name}}</a></td> | 							<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{.Name}}</a></td> | ||||||
| 							<td>{{.TypeName}}</td> | 							<td>{{.TypeName}}</td> | ||||||
| 							<td>{{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .IsActive "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td>{{DateTime "short" .UpdatedUnix}}</td> | 							<td>{{DateTime "short" .UpdatedUnix}}</td> | ||||||
| 							<td>{{DateTime "short" .CreatedUnix}}</td> | 							<td>{{DateTime "short" .CreatedUnix}}</td> | ||||||
| 							<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{svg "octicon-pencil"}}</a></td> | 							<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{svg "octicon-pencil"}}</a></td> | ||||||
|   | |||||||
| @@ -16,9 +16,9 @@ | |||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.domain"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.domain"}}</dt> | ||||||
| 				<dd>{{.Domain}}</dd> | 				<dd>{{.Domain}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.offline_mode"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.offline_mode"}}</dt> | ||||||
| 				<dd>{{if .OfflineMode}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .OfflineMode "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.disable_router_log"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.disable_router_log"}}</dt> | ||||||
| 				<dd>{{if .DisableRouterLog}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .DisableRouterLog "octicon-check" "octicon-x")}}</dd> | ||||||
|  |  | ||||||
| 				<div class="divider"></div> | 				<div class="divider"></div> | ||||||
|  |  | ||||||
| @@ -55,10 +55,10 @@ | |||||||
| 		<div class="ui attached table segment"> | 		<div class="ui attached table segment"> | ||||||
| 			<dl class="admin-dl-horizontal"> | 			<dl class="admin-dl-horizontal"> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.ssh_enabled"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.ssh_enabled"}}</dt> | ||||||
| 				<dd>{{if not .SSH.Disabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif (not .SSH.Disabled) "octicon-check" "octicon-x")}}</dd> | ||||||
| 				{{if not .SSH.Disabled}} | 				{{if not .SSH.Disabled}} | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.ssh_start_builtin_server"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.ssh_start_builtin_server"}}</dt> | ||||||
| 					<dd>{{if .SSH.StartBuiltinServer}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 					<dd>{{svg (Iif .SSH.StartBuiltinServer "octicon-check" "octicon-x")}}</dd> | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.ssh_domain"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.ssh_domain"}}</dt> | ||||||
| 					<dd>{{.SSH.Domain}}</dd> | 					<dd>{{.SSH.Domain}}</dd> | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.ssh_port"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.ssh_port"}}</dt> | ||||||
| @@ -74,7 +74,7 @@ | |||||||
| 						<dt>{{ctx.Locale.Tr "admin.config.ssh_keygen_path"}}</dt> | 						<dt>{{ctx.Locale.Tr "admin.config.ssh_keygen_path"}}</dt> | ||||||
| 						<dd>{{.SSH.KeygenPath}}</dd> | 						<dd>{{.SSH.KeygenPath}}</dd> | ||||||
| 						<dt>{{ctx.Locale.Tr "admin.config.ssh_minimum_key_size_check"}}</dt> | 						<dt>{{ctx.Locale.Tr "admin.config.ssh_minimum_key_size_check"}}</dt> | ||||||
| 						<dd>{{if .SSH.MinimumKeySizeCheck}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 						<dd>{{svg (Iif .SSH.MinimumKeySizeCheck "octicon-check" "octicon-x")}}</dd> | ||||||
| 						{{if .SSH.MinimumKeySizeCheck}} | 						{{if .SSH.MinimumKeySizeCheck}} | ||||||
| 							<dt>{{ctx.Locale.Tr "admin.config.ssh_minimum_key_sizes"}}</dt> | 							<dt>{{ctx.Locale.Tr "admin.config.ssh_minimum_key_sizes"}}</dt> | ||||||
| 							<dd>{{.SSH.MinimumKeySizes}}</dd> | 							<dd>{{.SSH.MinimumKeySizes}}</dd> | ||||||
| @@ -90,7 +90,7 @@ | |||||||
| 		<div class="ui attached table segment"> | 		<div class="ui attached table segment"> | ||||||
| 			<dl class="admin-dl-horizontal"> | 			<dl class="admin-dl-horizontal"> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.lfs_enabled"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.lfs_enabled"}}</dt> | ||||||
| 				<dd>{{if .LFS.StartServer}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .LFS.StartServer "octicon-check" "octicon-x")}}</dd> | ||||||
| 				{{if .LFS.StartServer}} | 				{{if .LFS.StartServer}} | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.lfs_content_path"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.lfs_content_path"}}</dt> | ||||||
| 					<dd>{{JsonUtils.EncodeToString .LFS.Storage.ToShadowCopy}}</dd> | 					<dd>{{JsonUtils.EncodeToString .LFS.Storage.ToShadowCopy}}</dd> | ||||||
| @@ -134,36 +134,36 @@ | |||||||
| 		<div class="ui attached table segment"> | 		<div class="ui attached table segment"> | ||||||
| 			<dl class="admin-dl-horizontal"> | 			<dl class="admin-dl-horizontal"> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.register_email_confirm"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.register_email_confirm"}}</dt> | ||||||
| 				<dd>{{if .Service.RegisterEmailConfirm}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.RegisterEmailConfirm "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.disable_register"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.disable_register"}}</dt> | ||||||
| 				<dd>{{if .Service.DisableRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.DisableRegistration "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.allow_only_internal_registration"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.allow_only_internal_registration"}}</dt> | ||||||
| 				<dd>{{if .Service.AllowOnlyInternalRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.AllowOnlyInternalRegistration "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.allow_only_external_registration"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.allow_only_external_registration"}}</dt> | ||||||
| 				<dd>{{if .Service.AllowOnlyExternalRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.AllowOnlyExternalRegistration "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.show_registration_button"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.show_registration_button"}}</dt> | ||||||
| 				<dd>{{if .Service.ShowRegistrationButton}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.ShowRegistrationButton "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.enable_openid_signup"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.enable_openid_signup"}}</dt> | ||||||
| 				<dd>{{if .Service.EnableOpenIDSignUp}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.EnableOpenIDSignUp "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.enable_openid_signin"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.enable_openid_signin"}}</dt> | ||||||
| 				<dd>{{if .Service.EnableOpenIDSignIn}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.EnableOpenIDSignIn "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.require_sign_in_view"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.require_sign_in_view"}}</dt> | ||||||
| 				<dd>{{if .Service.RequireSignInView}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.RequireSignInView "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.mail_notify"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.mail_notify"}}</dt> | ||||||
| 				<dd>{{if .Service.EnableNotifyMail}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.EnableNotifyMail "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.enable_captcha"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.enable_captcha"}}</dt> | ||||||
| 				<dd>{{if .Service.EnableCaptcha}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.EnableCaptcha "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.default_keep_email_private"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.default_keep_email_private"}}</dt> | ||||||
| 				<dd>{{if .Service.DefaultKeepEmailPrivate}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.DefaultKeepEmailPrivate "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.default_allow_create_organization"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.default_allow_create_organization"}}</dt> | ||||||
| 				<dd>{{if .Service.DefaultAllowCreateOrganization}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.DefaultAllowCreateOrganization "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.enable_timetracking"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.enable_timetracking"}}</dt> | ||||||
| 				<dd>{{if .Service.EnableTimetracking}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.EnableTimetracking "octicon-check" "octicon-x")}}</dd> | ||||||
| 				{{if .Service.EnableTimetracking}} | 				{{if .Service.EnableTimetracking}} | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.default_enable_timetracking"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.default_enable_timetracking"}}</dt> | ||||||
| 					<dd>{{if .Service.DefaultEnableTimetracking}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 					<dd>{{svg (Iif .Service.DefaultEnableTimetracking "octicon-check" "octicon-x")}}</dd> | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.default_allow_only_contributors_to_track_time"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.default_allow_only_contributors_to_track_time"}}</dt> | ||||||
| 					<dd>{{if .Service.DefaultAllowOnlyContributorsToTrackTime}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 					<dd>{{svg (Iif .Service.DefaultAllowOnlyContributorsToTrackTime "octicon-check" "octicon-x")}}</dd> | ||||||
| 				{{end}} | 				{{end}} | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.default_visibility_organization"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.default_visibility_organization"}}</dt> | ||||||
| 				<dd>{{.Service.DefaultOrgVisibility}}</dd> | 				<dd>{{.Service.DefaultOrgVisibility}}</dd> | ||||||
| @@ -171,7 +171,7 @@ | |||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.no_reply_address"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.no_reply_address"}}</dt> | ||||||
| 				<dd>{{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}</dd> | 				<dd>{{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.default_enable_dependencies"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.default_enable_dependencies"}}</dt> | ||||||
| 				<dd>{{if .Service.DefaultEnableDependencies}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Service.DefaultEnableDependencies "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<div class="divider"></div> | 				<div class="divider"></div> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.active_code_lives"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.active_code_lives"}}</dt> | ||||||
| 				<dd>{{.Service.ActiveCodeLives}} {{ctx.Locale.Tr "tool.raw_minutes"}}</dd> | 				<dd>{{.Service.ActiveCodeLives}} {{ctx.Locale.Tr "tool.raw_minutes"}}</dd> | ||||||
| @@ -190,7 +190,7 @@ | |||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.deliver_timeout"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.deliver_timeout"}}</dt> | ||||||
| 				<dd>{{.Webhook.DeliverTimeout}} {{ctx.Locale.Tr "tool.raw_seconds"}}</dd> | 				<dd>{{.Webhook.DeliverTimeout}} {{ctx.Locale.Tr "tool.raw_seconds"}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.skip_tls_verify"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.skip_tls_verify"}}</dt> | ||||||
| 				<dd>{{if .Webhook.SkipTLSVerify}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Webhook.SkipTLSVerify "octicon-check" "octicon-x")}}</dd> | ||||||
| 			</dl> | 			</dl> | ||||||
| 		</div> | 		</div> | ||||||
|  |  | ||||||
| @@ -200,7 +200,7 @@ | |||||||
| 		<div class="ui attached table segment"> | 		<div class="ui attached table segment"> | ||||||
| 			<dl class="admin-dl-horizontal"> | 			<dl class="admin-dl-horizontal"> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.mailer_enabled"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.mailer_enabled"}}</dt> | ||||||
| 				<dd>{{if .MailerEnabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .MailerEnabled "octicon-check" "octicon-x")}}</dd> | ||||||
| 				{{if .MailerEnabled}} | 				{{if .MailerEnabled}} | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.mailer_name"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.mailer_name"}}</dt> | ||||||
| 					<dd>{{.Mailer.Name}}</dd> | 					<dd>{{.Mailer.Name}}</dd> | ||||||
| @@ -220,7 +220,7 @@ | |||||||
| 						<dt>{{ctx.Locale.Tr "admin.config.mailer_protocol"}}</dt> | 						<dt>{{ctx.Locale.Tr "admin.config.mailer_protocol"}}</dt> | ||||||
| 						<dd>{{.Mailer.Protocol}}</dd> | 						<dd>{{.Mailer.Protocol}}</dd> | ||||||
| 						<dt>{{ctx.Locale.Tr "admin.config.mailer_enable_helo"}}</dt> | 						<dt>{{ctx.Locale.Tr "admin.config.mailer_enable_helo"}}</dt> | ||||||
| 						<dd>{{if .Mailer.EnableHelo}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 						<dd>{{svg (Iif .Mailer.EnableHelo "octicon-check" "octicon-x")}}</dd> | ||||||
| 						<dt>{{ctx.Locale.Tr "admin.config.mailer_smtp_addr"}}</dt> | 						<dt>{{ctx.Locale.Tr "admin.config.mailer_smtp_addr"}}</dt> | ||||||
| 						<dd>{{.Mailer.SMTPAddr}}</dd> | 						<dd>{{.Mailer.SMTPAddr}}</dd> | ||||||
| 						<dt>{{ctx.Locale.Tr "admin.config.mailer_smtp_port"}}</dt> | 						<dt>{{ctx.Locale.Tr "admin.config.mailer_smtp_port"}}</dt> | ||||||
| @@ -279,7 +279,7 @@ | |||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.session_life_time"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.session_life_time"}}</dt> | ||||||
| 				<dd>{{.SessionConfig.Maxlifetime}} {{ctx.Locale.Tr "tool.raw_seconds"}}</dd> | 				<dd>{{.SessionConfig.Maxlifetime}} {{ctx.Locale.Tr "tool.raw_seconds"}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.https_only"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.https_only"}}</dt> | ||||||
| 				<dd>{{if .SessionConfig.Secure}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .SessionConfig.Secure "octicon-check" "octicon-x")}}</dd> | ||||||
| 			</dl> | 			</dl> | ||||||
| 		</div> | 		</div> | ||||||
|  |  | ||||||
| @@ -289,7 +289,7 @@ | |||||||
| 		<div class="ui attached table segment"> | 		<div class="ui attached table segment"> | ||||||
| 			<dl class="admin-dl-horizontal"> | 			<dl class="admin-dl-horizontal"> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.git_disable_diff_highlight"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.git_disable_diff_highlight"}}</dt> | ||||||
| 				<dd>{{if .Git.DisableDiffHighlight}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 				<dd>{{svg (Iif .Git.DisableDiffHighlight "octicon-check" "octicon-x")}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.git_max_diff_lines"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.git_max_diff_lines"}}</dt> | ||||||
| 				<dd>{{.Git.MaxGitDiffLines}}</dd> | 				<dd>{{.Git.MaxGitDiffLines}}</dd> | ||||||
| 				<dt>{{ctx.Locale.Tr "admin.config.git_max_diff_line_characters"}}</dt> | 				<dt>{{ctx.Locale.Tr "admin.config.git_max_diff_line_characters"}}</dt> | ||||||
| @@ -321,7 +321,7 @@ | |||||||
| 			<dl class="admin-dl-horizontal"> | 			<dl class="admin-dl-horizontal"> | ||||||
| 				{{if .Loggers.xorm.IsEnabled}} | 				{{if .Loggers.xorm.IsEnabled}} | ||||||
| 					<dt>{{ctx.Locale.Tr "admin.config.xorm_log_sql"}}</dt> | 					<dt>{{ctx.Locale.Tr "admin.config.xorm_log_sql"}}</dt> | ||||||
| 					<dd>{{if $.LogSQL}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd> | 					<dd>{{svg (Iif $.LogSQL "octicon-check" "octicon-x")}}</dd> | ||||||
| 				{{end}} | 				{{end}} | ||||||
|  |  | ||||||
| 				{{if .Loggers.access.IsEnabled}} | 				{{if .Loggers.access.IsEnabled}} | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| 							<td>{{DateTime "full" .Next}}</td> | 							<td>{{DateTime "full" .Next}}</td> | ||||||
| 							<td>{{if gt .Prev.Year 1}}{{DateTime "full" .Prev}}{{else}}-{{end}}</td> | 							<td>{{if gt .Prev.Year 1}}{{DateTime "full" .Prev}}{{else}}-{{end}}</td> | ||||||
| 							<td>{{.ExecTimes}}</td> | 							<td>{{.ExecTimes}}</td> | ||||||
| 							<td {{if ne .Status ""}}data-tooltip-content="{{.FormatLastMessage ctx.Locale}}"{{end}} >{{if eq .Status ""}}—{{else if eq .Status "finished"}}{{svg "octicon-check" 16}}{{else}}{{svg "octicon-x" 16}}{{end}}</td> | 							<td {{if ne .Status ""}}data-tooltip-content="{{.FormatLastMessage ctx.Locale}}"{{end}} >{{if eq .Status ""}}—{{else}}{{svg (Iif (eq .Status "finished") "octicon-check" "octicon-x") 16}}{{end}}</td> | ||||||
| 						</tr> | 						</tr> | ||||||
| 					{{end}} | 					{{end}} | ||||||
| 				</tbody> | 				</tbody> | ||||||
|   | |||||||
| @@ -46,17 +46,17 @@ | |||||||
| 							<td><a href="{{AppSubUrl}}/{{.Name | PathEscape}}">{{.Name}}</a></td> | 							<td><a href="{{AppSubUrl}}/{{.Name | PathEscape}}">{{.Name}}</a></td> | ||||||
| 							<td class="gt-ellipsis tw-max-w-48">{{.FullName}}</td> | 							<td class="gt-ellipsis tw-max-w-48">{{.FullName}}</td> | ||||||
| 							<td class="gt-ellipsis tw-max-w-48">{{.Email}}</td> | 							<td class="gt-ellipsis tw-max-w-48">{{.Email}}</td> | ||||||
| 							<td>{{if .IsPrimary}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .IsPrimary "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td> | 							<td> | ||||||
| 								{{if .CanChange}} | 								{{if .CanChange}} | ||||||
| 									<a class="link-email-action" href data-uid="{{.UID}}" | 									<a class="link-email-action" href data-uid="{{.UID}}" | ||||||
| 										data-email="{{.Email}}" | 										data-email="{{.Email}}" | ||||||
| 										data-primary="{{if .IsPrimary}}1{{else}}0{{end}}" | 										data-primary="{{if .IsPrimary}}1{{else}}0{{end}}" | ||||||
| 										data-activate="{{if .IsActivated}}0{{else}}1{{end}}"> | 										data-activate="{{if .IsActivated}}0{{else}}1{{end}}"> | ||||||
| 										{{if .IsActivated}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} | 										{{svg (Iif .IsActivated "octicon-check" "octicon-x")}} | ||||||
| 									</a> | 									</a> | ||||||
| 								{{else}} | 								{{else}} | ||||||
| 									{{if .IsActivated}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} | 									{{svg (Iif .IsActivated "octicon-check" "octicon-x")}} | ||||||
| 								{{end}} | 								{{end}} | ||||||
| 							</td> | 							</td> | ||||||
| 						</tr> | 						</tr> | ||||||
|   | |||||||
| @@ -93,9 +93,9 @@ | |||||||
| 								{{end}} | 								{{end}} | ||||||
| 							</td> | 							</td> | ||||||
| 							<td class="gt-ellipsis tw-max-w-48">{{.Email}}</td> | 							<td class="gt-ellipsis tw-max-w-48">{{.Email}}</td> | ||||||
| 							<td>{{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .IsActive "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td>{{if .IsRestricted}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .IsRestricted "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td>{{if index $.UsersTwoFaStatus .ID}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif (index $.UsersTwoFaStatus .ID) "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td>{{DateTime "short" .CreatedUnix}}</td> | 							<td>{{DateTime "short" .CreatedUnix}}</td> | ||||||
| 							{{if .LastLoginUnix}} | 							{{if .LastLoginUnix}} | ||||||
| 								<td>{{DateTime "short" .LastLoginUnix}}</td> | 								<td>{{DateTime "short" .LastLoginUnix}}</td> | ||||||
|   | |||||||
| @@ -27,4 +27,4 @@ | |||||||
| 		</a> | 		</a> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| <a class="ui tiny basic button" href="?style={{if .IsSplitStyle}}unified{{else}}split{{end}}&whitespace={{$.WhitespaceBehavior}}&show-outdated={{$.ShowOutdatedComments}}" data-tooltip-content="{{if .IsSplitStyle}}{{ctx.Locale.Tr "repo.diff.show_unified_view"}}{{else}}{{ctx.Locale.Tr "repo.diff.show_split_view"}}{{end}}">{{if .IsSplitStyle}}{{svg "gitea-join"}}{{else}}{{svg "gitea-split"}}{{end}}</a> | <a class="ui tiny basic button" href="?style={{if .IsSplitStyle}}unified{{else}}split{{end}}&whitespace={{$.WhitespaceBehavior}}&show-outdated={{$.ShowOutdatedComments}}" data-tooltip-content="{{if .IsSplitStyle}}{{ctx.Locale.Tr "repo.diff.show_unified_view"}}{{else}}{{ctx.Locale.Tr "repo.diff.show_split_view"}}{{end}}">{{svg (Iif .IsSplitStyle "gitea-join" "gitea-split")}}</a> | ||||||
|   | |||||||
| @@ -30,7 +30,7 @@ | |||||||
| 					{{end}} | 					{{end}} | ||||||
| 					{{$previousExclusiveScope = $exclusiveScope}} | 					{{$previousExclusiveScope = $exclusiveScope}} | ||||||
| 					<div class="item issue-action tw-flex tw-justify-between" data-action="toggle" data-element-id="{{.ID}}" data-url="{{$.RepoLink}}/issues/labels"> | 					<div class="item issue-action tw-flex tw-justify-between" data-action="toggle" data-element-id="{{.ID}}" data-url="{{$.RepoLink}}/issues/labels"> | ||||||
| 						{{if SliceUtils.Contains $.SelLabelIDs .ID}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel $.Context ctx.Locale .}} | 						{{if SliceUtils.Contains $.SelLabelIDs .ID}}{{svg (Iif $exclusiveScope "octicon-dot-fill" "octicon-check")}}{{end}} {{RenderLabel $.Context ctx.Locale .}} | ||||||
| 						{{template "repo/issue/labels/label_archived" .}} | 						{{template "repo/issue/labels/label_archived" .}} | ||||||
| 					</div> | 					</div> | ||||||
| 				{{end}} | 				{{end}} | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
| 					<div class="divider"></div> | 					<div class="divider"></div> | ||||||
| 				{{end}} | 				{{end}} | ||||||
| 				{{$previousExclusiveScope = $exclusiveScope}} | 				{{$previousExclusiveScope = $exclusiveScope}} | ||||||
| 				<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" {{if .IsArchived}}data-is-archived{{end}} data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}tw-invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span>  {{RenderLabel $.Context ctx.Locale .}} | 				<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" {{if .IsArchived}}data-is-archived{{end}} data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}tw-invisible{{end}}">{{svg (Iif $exclusiveScope "octicon-dot-fill" "octicon-check")}}</span>  {{RenderLabel $.Context ctx.Locale .}} | ||||||
| 					{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}} | 					{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}} | ||||||
| 					<p class="archived-label-hint">{{template "repo/issue/labels/label_archived" .}}</p> | 					<p class="archived-label-hint">{{template "repo/issue/labels/label_archived" .}}</p> | ||||||
| 				</a> | 				</a> | ||||||
| @@ -34,7 +34,7 @@ | |||||||
| 					<div class="divider"></div> | 					<div class="divider"></div> | ||||||
| 				{{end}} | 				{{end}} | ||||||
| 				{{$previousExclusiveScope = $exclusiveScope}} | 				{{$previousExclusiveScope = $exclusiveScope}} | ||||||
| 				<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" {{if .IsArchived}}data-is-archived{{end}} data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}tw-invisible{{end}}">{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}</span>  {{RenderLabel $.Context ctx.Locale .}} | 				<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" {{if .IsArchived}}data-is-archived{{end}} data-id-selector="#label_{{.ID}}" data-scope="{{$exclusiveScope}}"><span class="octicon-check {{if not .IsChecked}}tw-invisible{{end}}">{{svg (Iif $exclusiveScope "octicon-dot-fill" "octicon-check")}}</span>  {{RenderLabel $.Context ctx.Locale .}} | ||||||
| 					{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}} | 					{{if .Description}}<br><small class="desc">{{.Description | RenderEmoji $.Context}}</small>{{end}} | ||||||
| 					<p class="archived-label-hint">{{template "repo/issue/labels/label_archived" .}}</p> | 					<p class="archived-label-hint">{{template "repo/issue/labels/label_archived" .}}</p> | ||||||
| 				</a> | 				</a> | ||||||
|   | |||||||
| @@ -92,7 +92,7 @@ | |||||||
| 								</span> | 								</span> | ||||||
| 							{{end}} | 							{{end}} | ||||||
| 							{{if and .CanChange (or .Checked (and (not $.Issue.IsClosed) (not $.Issue.PullRequest.HasMerged)))}} | 							{{if and .CanChange (or .Checked (and (not $.Issue.IsClosed) (not $.Issue.PullRequest.HasMerged)))}} | ||||||
| 								<a href="#" class="ui muted icon re-request-review{{if .Checked}} checked{{end}}" data-tooltip-content="{{if .Checked}}{{ctx.Locale.Tr "repo.issues.remove_request_review"}}{{else}}{{ctx.Locale.Tr "repo.issues.re_request_review"}}{{end}}" data-issue-id="{{$.Issue.ID}}" data-id="{{.ItemID}}" data-update-url="{{$.RepoLink}}/issues/request_review">{{if .Checked}}{{svg "octicon-trash"}}{{else}}{{svg "octicon-sync"}}{{end}}</a> | 								<a href="#" class="ui muted icon re-request-review{{if .Checked}} checked{{end}}" data-tooltip-content="{{if .Checked}}{{ctx.Locale.Tr "repo.issues.remove_request_review"}}{{else}}{{ctx.Locale.Tr "repo.issues.re_request_review"}}{{end}}" data-issue-id="{{$.Issue.ID}}" data-id="{{.ItemID}}" data-update-url="{{$.RepoLink}}/issues/request_review">{{svg (Iif .Checked "octicon-trash" "octicon-sync")}}</a> | ||||||
| 							{{end}} | 							{{end}} | ||||||
| 							{{svg (printf "octicon-%s" .Review.Type.Icon) 16 (printf "text %s" (.Review.HTMLTypeColorName))}} | 							{{svg (printf "octicon-%s" .Review.Type.Icon) 16 (printf "text %s" (.Review.HTMLTypeColorName))}} | ||||||
| 						</div> | 						</div> | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ | |||||||
| 		{{if .HasMerged}} | 		{{if .HasMerged}} | ||||||
| 			<div class="ui purple label issue-state-label">{{svg "octicon-git-merge" 16 "tw-mr-1"}} {{if eq .Issue.PullRequest.Status 3}}{{ctx.Locale.Tr "repo.pulls.manually_merged"}}{{else}}{{ctx.Locale.Tr "repo.pulls.merged"}}{{end}}</div> | 			<div class="ui purple label issue-state-label">{{svg "octicon-git-merge" 16 "tw-mr-1"}} {{if eq .Issue.PullRequest.Status 3}}{{ctx.Locale.Tr "repo.pulls.manually_merged"}}{{else}}{{ctx.Locale.Tr "repo.pulls.merged"}}{{end}}</div> | ||||||
| 		{{else if .Issue.IsClosed}} | 		{{else if .Issue.IsClosed}} | ||||||
| 			<div class="ui red label issue-state-label">{{if .Issue.IsPull}}{{svg "octicon-git-pull-request"}}{{else}}{{svg "octicon-issue-closed"}}{{end}} {{ctx.Locale.Tr "repo.issues.closed_title"}}</div> | 			<div class="ui red label issue-state-label">{{svg (Iif .Issue.IsPull "octicon-git-pull-request" "octicon-issue-closed")}} {{ctx.Locale.Tr "repo.issues.closed_title"}}</div> | ||||||
| 		{{else if .Issue.IsPull}} | 		{{else if .Issue.IsPull}} | ||||||
| 			{{if .IsPullWorkInProgress}} | 			{{if .IsPullWorkInProgress}} | ||||||
| 				<div class="ui grey label issue-state-label">{{svg "octicon-git-pull-request-draft"}} {{ctx.Locale.Tr "repo.issues.draft_title"}}</div> | 				<div class="ui grey label issue-state-label">{{svg "octicon-git-pull-request-draft"}} {{ctx.Locale.Tr "repo.issues.draft_title"}}</div> | ||||||
|   | |||||||
| @@ -41,9 +41,9 @@ | |||||||
| 									{{ShortSha .Oid}} | 									{{ShortSha .Oid}} | ||||||
| 								</a> | 								</a> | ||||||
| 							</td> | 							</td> | ||||||
| 							<td>{{if .InRepo}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .InRepo "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td>{{if .Exists}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .Exists "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td>{{if .Accessible}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td> | 							<td>{{svg (Iif .Accessible "octicon-check" "octicon-x")}}</td> | ||||||
| 							<td class="tw-text-right"> | 							<td class="tw-text-right"> | ||||||
| 								<a class="ui primary button" href="{{$.LFSFilesLink}}/find?oid={{.Oid}}&size={{.Size}}&sha={{.SHA}}">{{ctx.Locale.Tr "repo.settings.lfs_findcommits"}}</a> | 								<a class="ui primary button" href="{{$.LFSFilesLink}}/find?oid={{.Oid}}&size={{.Size}}&sha={{.SHA}}">{{ctx.Locale.Tr "repo.settings.lfs_findcommits"}}</a> | ||||||
| 							</td> | 							</td> | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| 		{{$buttonText := ctx.Locale.Tr "repo.star"}} | 		{{$buttonText := ctx.Locale.Tr "repo.star"}} | ||||||
| 		{{if $.IsStaringRepo}}{{$buttonText = ctx.Locale.Tr "repo.unstar"}}{{end}} | 		{{if $.IsStaringRepo}}{{$buttonText = ctx.Locale.Tr "repo.unstar"}}{{end}} | ||||||
| 		<button type="submit" class="ui compact small basic button"{{if not $.IsSigned}} disabled{{end}} aria-label="{{$buttonText}}"> | 		<button type="submit" class="ui compact small basic button"{{if not $.IsSigned}} disabled{{end}} aria-label="{{$buttonText}}"> | ||||||
| 			{{if $.IsStaringRepo}}{{svg "octicon-star-fill"}}{{else}}{{svg "octicon-star"}}{{end}} | 			{{svg (Iif $.IsStaringRepo "octicon-star-fill" "octicon-star")}} | ||||||
| 			<span aria-hidden="true">{{$buttonText}}</span> | 			<span aria-hidden="true">{{$buttonText}}</span> | ||||||
| 		</button> | 		</button> | ||||||
| 		<a hx-boost="false" class="ui basic label" href="{{$.RepoLink}}/stars"> | 		<a hx-boost="false" class="ui basic label" href="{{$.RepoLink}}/stars"> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user