a4b242ae7a
After many refactoring PRs for the "locale" and "template context function", now the ".locale" is not needed for web templates any more. This PR does a clean up for: 1. Remove `ctx.Data["locale"]` for web context. 2. Use `ctx.Locale` in `500.tmpl`, for consistency. 3. Add a test check for `500 page` locale usage. 4. Remove the `Str2html` and `DotEscape` from mail template context data, they are copy&paste errors introduced by #19169 and #16200 . These functions are template functions (provided by the common renderer), but not template data variables. 5. Make email `SendAsync` function mockable (I was planning to add more tests but it would make this PR much too complex, so the tests could be done in another PR)
67 lines
2.9 KiB
Go HTML Template
67 lines
2.9 KiB
Go HTML Template
{{/* This page should only depend the minimal template functions/variables, to avoid triggering new panics.
|
|
* base template functions: AppName, AssetUrlPrefix, AssetVersion, AppSubUrl, ThemeName, Str2html
|
|
* ctx.Locale
|
|
* .Flash
|
|
* .ErrorMsg
|
|
* .SignedUser (optional)
|
|
*/}}
|
|
<!DOCTYPE html>
|
|
<html lang="{{ctx.Locale.Lang}}" data-theme="{{ThemeName .SignedUser}}">
|
|
<head>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Internal Server Error - {{AppName}}</title>
|
|
<link rel="icon" href="{{AssetUrlPrefix}}/img/favicon.svg" type="image/svg+xml">
|
|
<link rel="alternate icon" href="{{AssetUrlPrefix}}/img/favicon.png" type="image/png">
|
|
{{template "base/head_style" .}}
|
|
</head>
|
|
<body>
|
|
<div class="full height">
|
|
<nav class="ui secondary menu gt-border-secondary-bottom">
|
|
<div class="ui container gt-df">
|
|
<div class="item gt-f1">
|
|
<a href="{{AppSubUrl}}/" aria-label="{{ctx.Locale.Tr "home"}}">
|
|
<img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}" aria-hidden="true">
|
|
</a>
|
|
</div>
|
|
<div class="item">
|
|
<button class="ui icon button disabled">{{svg "octicon-three-bars"}}</button>{{/* a fake button to make the UI looks better*/}}
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<div role="main" class="page-content status-page-500">
|
|
<div class="ui container" >
|
|
<style> .ui.message.flash-message { text-align: left; } </style>
|
|
{{template "base/alert" .}}
|
|
</div>
|
|
<p class="gt-mt-5 center"><img src="{{AssetUrlPrefix}}/img/500.png" alt="Internal Server Error"></p>
|
|
<div class="divider"></div>
|
|
<div class="ui container gt-my-5">
|
|
{{if .ErrorMsg}}
|
|
<p>{{ctx.Locale.Tr "error.occurred"}}:</p>
|
|
<pre class="gt-whitespace-pre-wrap gt-break-all">{{.ErrorMsg}}</pre>
|
|
{{end}}
|
|
<div class="center gt-mt-5">
|
|
{{if or .SignedUser.IsAdmin .ShowFooterVersion}}<p>{{ctx.Locale.Tr "admin.config.app_ver"}}: {{AppVer}}</p>{{end}}
|
|
{{if .SignedUser.IsAdmin}}<p>{{ctx.Locale.Tr "error.report_message" | Str2html}}</p>{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{/* When a sub-template triggers an 500 error, its parent template has been partially rendered, then the 500 page
|
|
will be rendered after that partially rendered page, the HTML/JS are totally broken. Use this inline script to try to move it to main viewport.
|
|
And this page shouldn't include any other JS file, avoid duplicate JS execution (still due to the partial rendering).*/}}
|
|
<script type="module">
|
|
const embedded = document.querySelector('.page-content .page-content.status-page-500');
|
|
if (embedded) {
|
|
// move the 500 error page content to main view
|
|
const embeddedParent = embedded.parentNode;
|
|
let main = document.querySelector('.page-content');
|
|
main = main ?? document.querySelector('body');
|
|
main.prepend(document.createElement('hr'));
|
|
main.prepend(embedded);
|
|
embeddedParent.remove(); // remove the unrelated 500-page elements (eg: the duplicate nav bar)
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|