434 lines
19 KiB
Handlebars
434 lines
19 KiB
Handlebars
<!DOCTYPE html>
|
|
<html lang="{{ctx.Locale.Lang}}" data-theme="{{UserThemeName .SignedUser}}">
|
|
<head>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{{if .Title}}{{.Title}} - {{end}}{{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}}</title>
|
|
{{if .ManifestData}}<link rel="manifest" href="data:{{.ManifestData}}">{{end}}
|
|
<meta name="author" content="{{if .Repository}}{{.Owner.Name}}{{else}}{{MetaAuthor}}{{end}}">
|
|
<meta name="description" content="{{if .Repository}}{{.Repository.Name}}{{if .Repository.Description}} - {{.Repository.Description}}{{end}}{{else}}{{MetaDescription}}{{end}}">
|
|
<meta name="keywords" content="{{MetaKeywords}}">
|
|
<meta name="referrer" content="no-referrer">
|
|
{{if .GoGetImport}}
|
|
<meta name="go-import" content="{{.GoGetImport}} git {{.RepoCloneLink.HTTPS}}">
|
|
<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
|
|
{{end}}
|
|
{{if and .EnableFeed .FeedURL}}
|
|
<link rel="alternate" type="application/atom+xml" title="" href="{{.FeedURL}}.atom">
|
|
<link rel="alternate" type="application/rss+xml" title="" href="{{.FeedURL}}.rss">
|
|
{{end}}
|
|
<link rel="icon" href="{{AssetUrlPrefix}}/img/favicon.svg" type="image/svg+xml">
|
|
<link rel="alternate icon" href="{{AssetUrlPrefix}}/img/favicon.png" type="image/png">
|
|
<script>
|
|
window.config = {
|
|
appUrl: '{{AppUrl}}',
|
|
appSubUrl: '{{AppSubUrl}}',
|
|
assetVersionEncoded: encodeURIComponent('{{AssetVersion}}'), // will be used in URL construction directly
|
|
assetUrlPrefix: '{{AssetUrlPrefix}}',
|
|
runModeIsProd: {{.RunModeIsProd}},
|
|
customEmojis: {{CustomEmojis}},
|
|
csrfToken: '{{.CsrfToken}}',
|
|
pageData: {{.PageData}},
|
|
{{if or .Participants .Assignees .MentionableTeams}}
|
|
mentionValues: Array.from(new Map([
|
|
{{- range .Participants -}}
|
|
['{{.Name}}', {key: '{{.Name}} {{.FullName}}', value: '{{.Name}}', name: '{{.Name}}', fullname: '{{.FullName}}', avatar: '{{.AvatarLink $.Context}}'}],
|
|
{{- end -}}
|
|
{{- range .Assignees -}}
|
|
['{{.Name}}', {key: '{{.Name}} {{.FullName}}', value: '{{.Name}}', name: '{{.Name}}', fullname: '{{.FullName}}', avatar: '{{.AvatarLink $.Context}}'}],
|
|
{{- end -}}
|
|
{{- range .MentionableTeams -}}
|
|
['{{$.MentionableTeamsOrg}}/{{.Name}}', {key: '{{$.MentionableTeamsOrg}}/{{.Name}}', value: '{{$.MentionableTeamsOrg}}/{{.Name}}', name: '{{$.MentionableTeamsOrg}}/{{.Name}}', avatar: '{{$.MentionableTeamsOrgAvatar}}'}],
|
|
{{- end -}}
|
|
]).values()),
|
|
{{end}}
|
|
mermaidMaxSourceCharacters: {{MermaidMaxSourceCharacters}},
|
|
{{/* this global i18n object should only contain general texts. for specialized texts, it should be provided inside the related modules by: (1) API response (2) HTML data-attribute (3) PageData */}}
|
|
i18n: {
|
|
copy_success: {{ctx.Locale.Tr "copy_success"}},
|
|
copy_error: {{ctx.Locale.Tr "copy_error"}},
|
|
error_occurred: {{ctx.Locale.Tr "error.occurred"}},
|
|
network_error: {{ctx.Locale.Tr "error.network_error"}},
|
|
remove_label_str: {{ctx.Locale.Tr "remove_label_str"}},
|
|
modal_confirm: {{ctx.Locale.Tr "modal.confirm"}},
|
|
modal_cancel: {{ctx.Locale.Tr "modal.cancel"}},
|
|
more_items: {{ctx.Locale.Tr "more_items"}},
|
|
},
|
|
};
|
|
{{/* in case some pages don't render the pageData, we make sure it is an object to prevent null access */}}
|
|
window.config.pageData = window.config.pageData || {};
|
|
</script>
|
|
<script src="{{AssetUrlPrefix}}/js/webcomponents.js?v={{AssetVersion}}"></script>
|
|
<noscript>
|
|
<style>
|
|
.dropdown:hover > .menu { display: block; }
|
|
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
|
|
</style>
|
|
</noscript>
|
|
{{template "base/head_opengraph" .}}
|
|
{{template "base/head_style" .}}
|
|
</head>
|
|
|
|
<body hx-headers='{"x-csrf-token": "{{.CsrfToken}}"}' hx-swap="outerHTML" hx-ext="morph" hx-push-url="false">
|
|
|
|
<div class="full height">
|
|
<noscript>{{ctx.Locale.Tr "enable_javascript"}}</noscript>
|
|
|
|
{{template "custom/body_inner_pre" .}}
|
|
|
|
{{$notificationUnreadCount := 0}}
|
|
{{if and .IsSigned .NotificationUnreadCount}}
|
|
{{$notificationUnreadCount = call .NotificationUnreadCount}}
|
|
{{end}}
|
|
|
|
<nav id="navbar" aria-label="{{ctx.Locale.Tr "aria.navbar"}}">
|
|
<div class="navbar-left">
|
|
<!-- the logo -->
|
|
<a class="item" id="navbar-logo" href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}">
|
|
<img width="auto" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}" aria-hidden="true">
|
|
</a>
|
|
|
|
<!-- mobile right menu, it must be here because in mobile view, each item is a flex column, the first item is a full row column -->
|
|
<div class="ui secondary menu item navbar-mobile-right only-mobile">
|
|
{{if .IsSigned}}
|
|
<a id="mobile-notifications-icon" class="item tw-w-auto tw-p-2" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{ctx.Locale.Tr "notifications"}}" aria-label="{{ctx.Locale.Tr "notifications"}}">
|
|
<div class="tw-relative">
|
|
{{svg "octicon-bell"}}
|
|
<span class="notification_count{{if not $notificationUnreadCount}} tw-hidden{{end}}">{{$notificationUnreadCount}}</span>
|
|
</div>
|
|
</a>
|
|
{{end}}
|
|
<button class="item tw-w-auto ui icon mini button tw-p-2 tw-m-0" id="navbar-expand-toggle" aria-label="{{ctx.Locale.Tr "home.nav_menu"}}">{{svg "octicon-three-bars"}}</button>
|
|
</div>
|
|
|
|
<!-- navbar links non-mobile -->
|
|
{{template "custom/extra_links" .}}
|
|
|
|
</div>
|
|
|
|
<!-- the full dropdown menus -->
|
|
<div class="navbar-right">
|
|
|
|
<!-- TODO: 注册触发外部链接 -->
|
|
|
|
<!-- <a id="signup-link" class="item active" href="{{AppSubUrl}}/user/sign_up">-->
|
|
<!-- {{svg "octicon-person"}} {{ctx.Locale.Tr "register"}}-->
|
|
<!-- </a>-->
|
|
<a id="signin-link" class="item active" rel="nofollow" href="javascript:openLoginModal()">
|
|
{{svg "octicon-sign-in"}} {{ctx.Locale.Tr "sign_in"}}
|
|
</a>
|
|
<a id="logout-link" class="item active" href="javascript:logout()">
|
|
{{svg "octicon-sign-out"}}
|
|
{{ctx.Locale.Tr "sign_out"}}
|
|
</a>
|
|
</div><!-- end full right menu -->
|
|
|
|
</nav>
|
|
|
|
|
|
<div role="main" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}" class="page-content home">
|
|
|
|
<div class="ui middle very relaxed page">
|
|
|
|
<!-- login -->
|
|
<div id="loginModal" class="ui modal" style=" width:50%; left: 25%; top: 20%">
|
|
<div class="content">
|
|
<div class="close right" style="float: right" onclick="closeLoginModal()">X</div>
|
|
<div class="ui container column fluid">
|
|
<h2 class="ui top attached header center i18n" data-key="login_modal"></h2>
|
|
<div class="ui attached segment">
|
|
<form id="loginForm" class="ui form" action="javascript:login()">
|
|
<div class="required field">
|
|
<label for="username" class="i18n" data-key="username"></label>
|
|
<input type="text" id="username" name="username" required>
|
|
</div>
|
|
<div class="required field">
|
|
<label for="password" class="i18n" data-key="password"></label>
|
|
<input type="password" id="password" name="password" required>
|
|
</div>
|
|
<button class="ui button primary center i18n" data-key="login_button"></button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="column">
|
|
<div id="contentBeforeSigned" class="ui container" style="display: none">
|
|
<h3 class="header center i18n" data-key="login_reminder"></h3>
|
|
</div>
|
|
<div id="contentAfterSigned" class="ui container " style="display: none">
|
|
<button class="ui button primary i18n" data-key="createNewRepositoryButton" onclick="openModalForCreateRepository()"></button>
|
|
|
|
<div class="divider"></div>
|
|
|
|
<!-- 仓库列表 -->
|
|
<div id="repo_list" class="flex-list">
|
|
<!-- 动态加载-->
|
|
</div>
|
|
|
|
<!-- ====================== Created Repository ==========================-->
|
|
<div id="modalForCreatingRepo" class="ui modal" style="width:70%; left: 15%; top: 20%">
|
|
<div class="content">
|
|
<div class="close right" style="float: right" onclick="closeModalForCreatingRepo()">X</div>
|
|
<div class="ui container column fluid" style="height: 50%;">
|
|
<h2 class="ui top attached header center i18n" data-key="createNewRepositoryModal"></h2>
|
|
<div class="ui attached segment" >
|
|
<form id="creatingRepoForm" class="ui form" onsubmit="return createRepo()">
|
|
<!-- repo name -->
|
|
<div class="inline required field {{if .Err_RepoName}}error{{end}}">
|
|
<label for="repo_name">{{ctx.Locale.Tr "repo.repo_name"}}</label>
|
|
<input id="repo_name" name="repo_name" value="{{.repo_name}}" autofocus required maxlength="100">
|
|
<span class="help">{{ctx.Locale.Tr "repo.repo_name_helper"}}</span>
|
|
</div>
|
|
|
|
<!-- visibility -->
|
|
<!-- <div class="inline field">-->
|
|
<!-- <label>{{ctx.Locale.Tr "repo.visibility"}}</label>-->
|
|
<!-- <div class="ui checkbox">-->
|
|
<!-- <input id="is_private" name="private" type="checkbox" >-->
|
|
<!-- <label>{{ctx.Locale.Tr "repo.visibility_helper"}}</label>-->
|
|
<!-- </div>-->
|
|
<!-- <span class="help">{{ctx.Locale.Tr "repo.visibility_description"}}</span>-->
|
|
<!-- </div>-->
|
|
|
|
<!-- desc -->
|
|
<div class="inline field {{if .Err_Description}}error{{end}}">
|
|
<label for="description">{{ctx.Locale.Tr "repo.repo_desc"}}</label>
|
|
<textarea id="description" rows="2" name="description" placeholder="{{ctx.Locale.Tr "repo.repo_desc_helper"}}" maxlength="2048">{{.description}}</textarea>
|
|
</div>
|
|
|
|
<!-- template -->
|
|
|
|
<div id="devstar_template_area" class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.devstar_template"}}</label>
|
|
<div id="devstar_template_search" class="ui search selection dropdown">
|
|
<input type="hidden" id="devstar_template" name="devstar_template" value="">
|
|
<div id="devstar_template_name" class="default text">{{.devstar_template_name}}</div>
|
|
<div class="menu">
|
|
</div>
|
|
</div>
|
|
<span class="help">{{ctx.Locale.Tr "repo.devstar_template_desc" "https://DevStar.cn/"}}</span>
|
|
</div>
|
|
|
|
<div id="git_url_template_area" class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.git_url_template"}}</label>
|
|
<input id="git_url_template" name="git_url_template" value="" placeholder="{{ctx.Locale.Tr "repo.git_url_template_helper"}}">
|
|
<span class="help">{{ctx.Locale.Tr "repo.git_url_template_desc"}}</span>
|
|
</div>
|
|
|
|
<div id="repo_template_area">
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.template"}}</label>
|
|
<div id="repo_template_search" class="ui search selection dropdown">
|
|
<input type="hidden" id="repo_template" name="repo_template" value="">
|
|
<div id="repo_template_name" class="default text">{{.devstar_template_name}}</div>
|
|
<div class="menu">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="template_units" {{if not .repo_template}}class="tw-hidden"{{end}}>
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.template.items"}}</label>
|
|
<div class="ui checkbox">
|
|
<input name="git_content" type="checkbox" {{if .git_content}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.template.git_content"}}</label>
|
|
</div>
|
|
<div class="ui checkbox" {{if not .SignedUser.CanEditGitHook}}data-tooltip-content="{{ctx.Locale.Tr "repo.template.git_hooks_tooltip"}}"{{end}}>
|
|
<input name="git_hooks" type="checkbox" {{if .git_hooks}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.template.git_hooks"}}</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="inline field">
|
|
<label></label>
|
|
<div class="ui checkbox">
|
|
<input name="webhooks" type="checkbox" {{if .webhooks}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.template.webhooks"}}</label>
|
|
</div>
|
|
<div class="ui checkbox">
|
|
<input name="topics" type="checkbox" {{if .topics}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.template.topics"}}</label>
|
|
</div>
|
|
</div>
|
|
<div class="inline field">
|
|
<label></label>
|
|
<div class="ui checkbox">
|
|
<input name="avatar" type="checkbox" {{if .avatar}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.template.avatar"}}</label>
|
|
</div>
|
|
<div class="ui checkbox">
|
|
<input name="labels" type="checkbox" {{if .labels}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.template.issue_labels"}}</label>
|
|
</div>
|
|
</div>
|
|
<div class="inline field">
|
|
<label></label>
|
|
<div class="ui checkbox">
|
|
<input name="protected_branch" type="checkbox" {{if .protected_branch}}checked{{end}}>
|
|
<label>{{ctx.Locale.Tr "repo.settings.protected_branch"}}</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="non_template" {{if .repo_template}}class="tw-hidden"{{end}}>
|
|
<!-- issue label -->
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.issue_labels"}}</label>
|
|
<div class="ui search selection dropdown">
|
|
<input id="issue_label" type="hidden" name="issue_labels" value="{{.issueLabels}}">
|
|
<div class="default text">{{ctx.Locale.Tr "repo.issue_labels_helper"}}</div>
|
|
<div id="issue_label_menu" class="menu">
|
|
<div class="item" data-value="">{{ctx.Locale.Tr "repo.issue_labels_helper"}}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="divider"></div>
|
|
|
|
<div class="inline field">
|
|
<label>.gitignore</label>
|
|
<div class="ui multiple search selection dropdown">
|
|
<input id="gitignore" type="hidden" name="gitignores" value="{{.gitignores}}">
|
|
<div class="default text">{{ctx.Locale.Tr "repo.repo_gitignore_helper"}}</div>
|
|
<div id="gitignore_menu" class="menu">
|
|
</div>
|
|
</div>
|
|
<span class="help">{{ctx.Locale.Tr "repo.repo_gitignore_helper_desc"}}</span>
|
|
</div>
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.license"}}</label>
|
|
<div class="ui search selection dropdown">
|
|
<input id="license" type="hidden" name="license" value="{{.license}}">
|
|
<div class="default text">{{ctx.Locale.Tr "repo.license_helper"}}</div>
|
|
<div id="license_menu" class="menu">
|
|
<div class="item" data-value="">{{ctx.Locale.Tr "repo.license_helper"}}</div>
|
|
</div>
|
|
</div>
|
|
<span class="help">{{ctx.Locale.Tr "repo.license_helper_desc" "https://choosealicense.com/"}}</span>
|
|
</div>
|
|
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.readme"}}</label>
|
|
<div class="ui selection dropdown">
|
|
<input id="readme" type="hidden" name="readme" value="{{.readme}}">
|
|
<div class="default text">{{ctx.Locale.Tr "repo.readme_helper"}}</div>
|
|
<div id="readme_menu" class="menu">
|
|
{{range .Readmes}}
|
|
<div class="item" data-value="{{.}}">{{.}}</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<span class="help">{{ctx.Locale.Tr "repo.readme_helper_desc"}}</span>
|
|
</div>
|
|
<div class="inline field">
|
|
<label for="default_branch">{{ctx.Locale.Tr "repo.default_branch"}}</label>
|
|
<input id="default_branch" name="default_branch" value="{{.default_branch}}" placeholder="{{.default_branch}}">
|
|
<span class="help">{{ctx.Locale.Tr "repo.default_branch_helper"}}</span>
|
|
</div>
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.object_format"}}</label>
|
|
<div class="ui selection owner dropdown">
|
|
<input type="hidden" id="object_format_name" name="object_format_name" value="{{.DefaultObjectFormat.Name}}" required>
|
|
<div id="default_object_format_name" class="default text">{{.DefaultObjectFormat.Name}}</div>
|
|
<div id="object_format_menu" class="menu">
|
|
{{range .SupportedObjectFormats}}
|
|
<div class="item" data-value="{{.Name}}">{{.Name}}</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<span class="help">{{ctx.Locale.Tr "repo.object_format_helper"}}</span>
|
|
</div>
|
|
<div class="inline field">
|
|
<label>{{ctx.Locale.Tr "repo.template"}}</label>
|
|
<div class="ui checkbox">
|
|
<input id="is_template" name="template" type="checkbox">
|
|
<label>{{ctx.Locale.Tr "repo.template_helper"}}</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<br>
|
|
|
|
<div class="inline field">
|
|
<label></label>
|
|
<button class="ui primary button" >
|
|
{{ctx.Locale.Tr "repo.create_repo"}}
|
|
</button>
|
|
</div>
|
|
</form>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|
|
|
|
<!-- footer start -->
|
|
{{if false}}
|
|
{{/* to make html structure "likely" complete to prevent IDE warnings */}}
|
|
<html>
|
|
<body>
|
|
<div>
|
|
{{end}}
|
|
|
|
{{template "custom/body_inner_post" .}}
|
|
|
|
</div>
|
|
|
|
{{template "custom/body_outer_post" .}}
|
|
|
|
<!-- content from {{template "base/footer_content" .}} -->
|
|
<footer class="page-footer" role="group" aria-label="{{ctx.Locale.Tr "aria.footer"}}">
|
|
<div class="left-links" role="contentinfo" aria-label="{{ctx.Locale.Tr "aria.footer.software"}}">
|
|
{{if (or .ShowFooterVersion .PageIsAdmin)}}
|
|
{{ctx.Locale.Tr "version"}}:
|
|
{{if .IsAdmin}}
|
|
<a href="{{AppSubUrl}}/admin/config">{{AppVer}}</a>
|
|
{{else}}
|
|
{{AppVer}}
|
|
{{end}}
|
|
{{end}}
|
|
{{if and .TemplateLoadTimes ShowFooterTemplateLoadTime}}
|
|
{{ctx.Locale.Tr "page"}}: <strong>{{LoadTimes .PageStartTime}}</strong>
|
|
{{ctx.Locale.Tr "template"}}{{if .TemplateName}} {{.TemplateName}}{{end}}: <strong>{{call .TemplateLoadTimes}}</strong>
|
|
{{end}}
|
|
<p> © 2025 <a target="_blank" rel="noopener noreferrer" href="https://www.mengning.com.cn">Mengning Software</a>. All rights reserved.</p>
|
|
</div>
|
|
<div class="right-links" role="group" aria-label="{{ctx.Locale.Tr "aria.footer.links"}}">
|
|
<!-- 不支持切换语言 -->
|
|
<div class="ui dropdown upward language">
|
|
<span class="flex-text-inline">{{svg "octicon-globe" 14}} {{ctx.Locale.LangName}}</span>
|
|
<!-- <div class="menu language-menu">
|
|
{{range .AllLangs}}
|
|
<a lang="{{.Lang}}" data-url="{{AppSubUrl}}/?lang={{.Lang}}" class="item {{if eq ctx.Locale.Lang .Lang}}active selected{{end}}">{{.Name}}</a>
|
|
{{end}}
|
|
</div> -->
|
|
</div>
|
|
<a href="{{AssetUrlPrefix}}/licenses.txt">{{ctx.Locale.Tr "licenses"}}</a>
|
|
{{if ShowFooterPoweredBy}}
|
|
<a target="_blank" rel="noopener noreferrer" href="https://github.com/mengning/DevStar">{{ctx.Locale.Tr "powered_by" "DevStar"}}</a>
|
|
{{end}}
|
|
{{if .EnableSwagger}}<a id="apiswagger" href="{{AppSubUrl}}/api/swagger">API</a>{{end}}
|
|
<!-- {{template "custom/extra_links_footer" .}} -->
|
|
<a id="beian" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">苏ICP备2024068144号-3</a>
|
|
</div>
|
|
</footer>
|
|
|
|
<script src="{{AssetUrlPrefix}}/js/index.js?v={{AssetVersion}}" onerror="alert('Failed to load asset files from ' + this.src + '. Please make sure the asset files can be accessed.')"></script>
|
|
|
|
{{template "custom/footer" .}}
|
|
</body>
|
|
</html>
|
|
<!-- footer end -->
|
|
|
|
{{template "devstar-home-vscode-js" .}} |