🥂 Initial commit
commit
65a7943588
File diff suppressed because one or more lines are too long
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"node": true,
|
||||||
|
"es2021": true
|
||||||
|
},
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
name: Release
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
- run: npm ci
|
||||||
|
- run: npm run build
|
||||||
|
- name: Create tarball
|
||||||
|
run: tar czf catppuccin-gitea.tar.gz --directory=./dist .
|
||||||
|
- name: Add zips to release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
files: ./lugit-theme.tar.gz
|
@ -0,0 +1,164 @@
|
|||||||
|
### Node ###
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Snowpack dependency directory (https://snowpack.dev/)
|
||||||
|
web_modules/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional stylelint cache
|
||||||
|
.stylelintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variable files
|
||||||
|
.env
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# vuepress v2.x temp and cache directory
|
||||||
|
.temp
|
||||||
|
|
||||||
|
# Docusaurus cache and generated files
|
||||||
|
.docusaurus
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
|
.vscode-test
|
||||||
|
|
||||||
|
# yarn v2
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.*
|
||||||
|
|
||||||
|
### Node Patch ###
|
||||||
|
# Serverless Webpack directories
|
||||||
|
.webpack/
|
||||||
|
|
||||||
|
# Optional stylelint cache
|
||||||
|
|
||||||
|
# SvelteKit build / generate output
|
||||||
|
.svelte-kit
|
||||||
|
|
||||||
|
### VisualStudioCode ###
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/*.code-snippets
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# Built Visual Studio Code Extensions
|
||||||
|
*.vsix
|
||||||
|
|
||||||
|
### VisualStudioCode Patch ###
|
||||||
|
# Ignore all local history of files
|
||||||
|
.history
|
||||||
|
.ionide
|
||||||
|
|
||||||
|
# Support for Project snippet scope
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/node,visualstudiocode
|
||||||
|
# Support for Project snippet scope
|
||||||
|
|
@ -0,0 +1,6 @@
|
|||||||
|
# Add files here to ignore them from prettier formatting
|
||||||
|
|
||||||
|
dist/
|
||||||
|
bin/
|
||||||
|
lib/
|
||||||
|
node_modules/
|
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"singleQuote": true,
|
||||||
|
"useTabs": false,
|
||||||
|
"tabWidth": 4,
|
||||||
|
"printWidth": 90,
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["*.yml", "*.yaml"],
|
||||||
|
"options": {
|
||||||
|
"tabWidth": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["*.scss"],
|
||||||
|
"options": {
|
||||||
|
"printWidth": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 lucas-labs
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
@ -0,0 +1,255 @@
|
|||||||
|
<p align="center"><img src="https://raw.githubusercontent.com/lucas-labs/lui-micro/HEAD/logo.svg" height="80"></p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<strong>
|
||||||
|
🎨 <code>lucas-labs/lui-micro</code> > A lightweight scss library for building themed UIs 🤏.
|
||||||
|
</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
## 📄 Documentation
|
||||||
|
|
||||||
|
### 📦 Install
|
||||||
|
|
||||||
|
Download with NPM/PNPM/YARN:
|
||||||
|
|
||||||
|
* `pnpm i @lucas-labs/lui-micro`
|
||||||
|
* `npm i @lucas-labs/lui-micro`
|
||||||
|
* `yarn add @lucas-labs/lui-micro`
|
||||||
|
|
||||||
|
Then import it in your `.scss` file:
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '~@lucas-labs/lui-micro' as lui;
|
||||||
|
@include lui.init();
|
||||||
|
```
|
||||||
|
|
||||||
|
### ⚙️ Options
|
||||||
|
The `lui.init` mixin can receive several params:
|
||||||
|
|
||||||
|
* `$theme`: default theme configuration map
|
||||||
|
* `$breakpoints `: media-breakpoints for breakpoint utilities.
|
||||||
|
* `$options`: map with options for the library. It can have the following keys:
|
||||||
|
* `reboot`: boolean. If `true`, the reboot will be applied. Default: `true`.
|
||||||
|
* `basic`: boolean. If `true`, the basic styles will be applied. Default: `true`.
|
||||||
|
* `theme`: boolean. If `true`, the theme will be applied. Default: `true`.
|
||||||
|
* `merge-theme-with-prebuilt`: boolean. If `true`, the theme will be merged with the default theme. If you choose not to merge it, you will need to provide all the necesary variables. Default: `true`.
|
||||||
|
* `color-utilities`: boolean. If `true`, color utilities will be created. Default: `false`.
|
||||||
|
* `typography-utilities`: boolean. If `true`, typography utilities will be created. Default: `false`.
|
||||||
|
* `fg-var-name`: string. Indicates the name of the variable that will be used in the theme config to set the foreground color. Default: `text`
|
||||||
|
* `bg-var-name`: string. Indicates the name of the variable that will be used in the theme config to set the background color. Default: `background`
|
||||||
|
|
||||||
|
> 💡 All parameters are optional! (defaults will be used)
|
||||||
|
|
||||||
|
### 🎨 Theme / Customization
|
||||||
|
|
||||||
|
You can create any number of themes, but one of them needs to be the default theme. Normally, the default theame is created when calling `lui.init`.
|
||||||
|
|
||||||
|
#### Breakpoints
|
||||||
|
To set the breakpoints, you need to pass a map to the $breakpoints parameter in the `lui.init` mixin:
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '~@lucas-labs/lui-micro' as lui;
|
||||||
|
@include lui.init(
|
||||||
|
// this is also the default breakpoint map,
|
||||||
|
// so if you don't pass anything, this will be used
|
||||||
|
$breakpoints: (
|
||||||
|
xs: 0px,
|
||||||
|
sm: 576px,
|
||||||
|
md: 768px,
|
||||||
|
lg: 992px,
|
||||||
|
xl: 1200px,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Setting default theme
|
||||||
|
You can set a default theme by passing a map object as a parameter to the `lui.init` mixin or by using the theme creation utility.
|
||||||
|
|
||||||
|
- Using `init` mixin example:
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '~@lucas-labs/lui-micro' as lui;
|
||||||
|
@include lui.init(
|
||||||
|
$theme: (
|
||||||
|
colors: (
|
||||||
|
...
|
||||||
|
),
|
||||||
|
variables: (
|
||||||
|
...
|
||||||
|
),
|
||||||
|
typography: (
|
||||||
|
...
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
> 💡 You can see an example of a more complete theme config [here](./demo/style.scss).
|
||||||
|
|
||||||
|
- Using theme-creation utility:
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '~@lucas-labs/lui-micro' as lui;
|
||||||
|
@use '~@lucas-labs/lui-micro/theme' as theme;
|
||||||
|
|
||||||
|
@include lui.init();
|
||||||
|
@include theme.create-theme(
|
||||||
|
$theme: (
|
||||||
|
...
|
||||||
|
colors: (
|
||||||
|
background: ...,
|
||||||
|
text: ...,
|
||||||
|
primary: ...,
|
||||||
|
|
||||||
|
// nested maps are allowed (also allowed for variables)
|
||||||
|
grouped: (
|
||||||
|
a-nested-color: #fff,
|
||||||
|
even-more-nested: (
|
||||||
|
...
|
||||||
|
),
|
||||||
|
)
|
||||||
|
...
|
||||||
|
),
|
||||||
|
...
|
||||||
|
)
|
||||||
|
$as-default: true // set as-default as true, so lui defaults to this theme
|
||||||
|
// this theme will be also used as a base for when you
|
||||||
|
// create a new theme
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Setting default theme
|
||||||
|
By using the create-theme utility you can also create themes as non-default themes. This means you'll be able to change between themes at runtime. This is possible because themes are made only of css variables.
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '~@lucas-labs/lui-micro' as lui;
|
||||||
|
@use '~@lucas-labs/lui-micro/core' as core;
|
||||||
|
|
||||||
|
// setting a deault theme called "light"
|
||||||
|
@include lui.init(
|
||||||
|
$theme: (
|
||||||
|
name: "light",
|
||||||
|
...
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// creating another theme called "dark" that will not be default
|
||||||
|
@include core.create-theme(
|
||||||
|
$theme: (
|
||||||
|
name: "dark"
|
||||||
|
...
|
||||||
|
)
|
||||||
|
// don't pass $as-default here, or pass it as "false"
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
Now to change themes at runtime, you'll need to set an argument in your <html> tag:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html theme="dark">
|
||||||
|
...
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
To change it back to de default, either you set the `theme` attribute to its name, or remove the theme attribute from the html tag (it will default to the default theme):
|
||||||
|
|
||||||
|
```html
|
||||||
|
<html theme="light">
|
||||||
|
...
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Mixins
|
||||||
|
|
||||||
|
#### Vars and colors
|
||||||
|
The library includes some mixins that can be used to access the theme variables and colors
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '@lucas-labs/lui-micro/color';
|
||||||
|
@use '@lucas-labs/lui-micro/var';
|
||||||
|
|
||||||
|
.my-div {
|
||||||
|
background-color: color.get('primary'); // background-color: var(--c-primary);
|
||||||
|
color: color.get('primary', 'rgb'); // color: var(--c-primary-rgb);
|
||||||
|
|
||||||
|
// it works with nested colors too
|
||||||
|
// provided you defined your nested theme-color as
|
||||||
|
// colors: (
|
||||||
|
// my: (
|
||||||
|
// nested: (
|
||||||
|
// color: #000,
|
||||||
|
// )
|
||||||
|
// )
|
||||||
|
// )
|
||||||
|
border-color: color.get('my/nested/color'); // border-color: var(--c-my_nested_color);
|
||||||
|
// dots instead of slashes can be used too
|
||||||
|
border-color: color.get('my.nested.color'); // border-color: var(--c-my_nested_color);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// get a theme variable
|
||||||
|
border-radius: var.get('font-family'); // border-radius: var(--v-font-family);
|
||||||
|
|
||||||
|
// as with colors, it works with nested variables too
|
||||||
|
// provided you defined your nested variable as
|
||||||
|
// variables: (
|
||||||
|
// my: (
|
||||||
|
// nested: (
|
||||||
|
// variable: 10px,
|
||||||
|
// )
|
||||||
|
// )
|
||||||
|
// )
|
||||||
|
border-radius: var.get('my/nested/variable'); // border-radius: var(--v-my_nested_variable);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Breakpoints
|
||||||
|
|
||||||
|
The library includes several mixins to help you create responsive layouts and styles.
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '@lucas-labs/lui-micro/bp';
|
||||||
|
|
||||||
|
// @use '@lucas-labs/lui-micro/bp' with (
|
||||||
|
// $breakpoints: ( sm: 576px, ... )
|
||||||
|
// );
|
||||||
|
|
||||||
|
.my-div {
|
||||||
|
// create a breakpoint
|
||||||
|
@include bp.up('sm') {
|
||||||
|
// styles for sm and up
|
||||||
|
}
|
||||||
|
|
||||||
|
@include bp.down('sm') {
|
||||||
|
// styles for sm and down
|
||||||
|
}
|
||||||
|
|
||||||
|
@include bp.only('sm') {
|
||||||
|
// styles for sm only
|
||||||
|
}
|
||||||
|
|
||||||
|
@include bp.between('sm', 'md') {
|
||||||
|
// styles for sm and md
|
||||||
|
}
|
||||||
|
|
||||||
|
@include bp.not('sm') {
|
||||||
|
// styles for everything but sm
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
#### Typographies
|
||||||
|
|
||||||
|
The library includes a mixin to get typography styles from the theme.
|
||||||
|
|
||||||
|
```scss
|
||||||
|
@use '@lucas-labs/lui-micro/typo';
|
||||||
|
|
||||||
|
.my-div {
|
||||||
|
@include typo.typography('heading/h7');
|
||||||
|
}
|
||||||
|
```
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "@lucas-labs/lugit-theme",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"type": "module",
|
||||||
|
"description": "Custom theme for lucaslabs' internal git server",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "node tools/build.js",
|
||||||
|
"serve": "node tools/serve.js",
|
||||||
|
"deploy": "node tools/deploy.js",
|
||||||
|
"restart": "node tools/restart.js",
|
||||||
|
"style:check": "npx prettier -c ."
|
||||||
|
},
|
||||||
|
"author": "lucas-labs",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"chokidar": "^3.5.3",
|
||||||
|
"eslint": "^8.43.0",
|
||||||
|
"fabric": "5.3",
|
||||||
|
"imagemin-zopfli": "^7.0.0",
|
||||||
|
"prettier": "^2.8.8",
|
||||||
|
"sass": "^1.63.6",
|
||||||
|
"svgo": "^3.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@lucas-labs/lui-micro": "^3.1.4"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{if .IsSigned}}{{.locale.Tr "dashboard"}}{{else}}{{.locale.Tr "home"}}{{end}}" class="page-content home">
|
||||||
|
<div class="gt-mb-5 gt-px-5">
|
||||||
|
<div class="center">
|
||||||
|
<img class="logo" width="220" height="220" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{.locale.Tr "logo"}}">
|
||||||
|
<div class="hero">
|
||||||
|
<h1 class="ui icon header title">
|
||||||
|
{{AppName}}
|
||||||
|
</h1>
|
||||||
|
<h2>{{.locale.Tr "startpage.app_desc"}}</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
|
<div class="eight wide center column">
|
||||||
|
<h1 class="hero ui icon header">
|
||||||
|
{{svg "octicon-flame"}} {{.locale.Tr "startpage.install"}}
|
||||||
|
</h1>
|
||||||
|
<p class="large">
|
||||||
|
{{.locale.Tr "startpage.install_desc" | Str2html}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="eight wide center column">
|
||||||
|
<h1 class="hero ui icon header">
|
||||||
|
{{svg "octicon-device-desktop"}} {{.locale.Tr "startpage.platform"}}
|
||||||
|
</h1>
|
||||||
|
<p class="large">
|
||||||
|
{{.locale.Tr "startpage.platform_desc" | Str2html}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
|
<div class="eight wide center column">
|
||||||
|
<h1 class="hero ui icon header">
|
||||||
|
{{svg "octicon-rocket"}} {{.locale.Tr "startpage.lightweight"}}
|
||||||
|
</h1>
|
||||||
|
<p class="large">
|
||||||
|
{{.locale.Tr "startpage.lightweight_desc" | Str2html}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="eight wide center column">
|
||||||
|
<h1 class="hero ui icon header">
|
||||||
|
{{svg "octicon-code"}} {{.locale.Tr "startpage.license"}}
|
||||||
|
</h1>
|
||||||
|
<p class="large">
|
||||||
|
{{.locale.Tr "startpage.license_desc" | Str2html}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,7 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin actions")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
{{if eq .PageType "runners"}}
|
||||||
|
{{template "shared/actions/runner_list" .}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,8 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "settings.applications"}}
|
||||||
|
</h4>
|
||||||
|
{{template "user/settings/applications_oauth2_list" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,6 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
|
||||||
|
{{template "user/settings/applications_oauth2_edit_form" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,461 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin edit authentication")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.auths.edit"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{template "base/disable_form_autofill"}}
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<input type="hidden" name="id" value="{{.Source.ID}}">
|
||||||
|
<div class="inline field">
|
||||||
|
<label>{{$.locale.Tr "admin.auths.auth_type"}}</label>
|
||||||
|
<input type="hidden" id="auth_type" name="type" value="{{.Source.Type.Int}}">
|
||||||
|
<span>{{.Source.TypeName}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="required inline field {{if .Err_Name}}error{{end}}">
|
||||||
|
<label for="auth_name">{{.locale.Tr "admin.auths.auth_name"}}</label>
|
||||||
|
<input id="auth_name" name="name" value="{{.Source.Name}}" autofocus required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- LDAP and DLDAP -->
|
||||||
|
{{if or .Source.IsLDAP .Source.IsDLDAP}}
|
||||||
|
{{$cfg:=.Source.Cfg}}
|
||||||
|
<div class="inline required field {{if .Err_SecurityProtocol}}error{{end}}">
|
||||||
|
<label>{{.locale.Tr "admin.auths.security_protocol"}}</label>
|
||||||
|
<div class="ui selection security-protocol dropdown">
|
||||||
|
<input type="hidden" id="security_protocol" name="security_protocol" value="{{$cfg.SecurityProtocol.Int}}">
|
||||||
|
<div class="text">{{$cfg.SecurityProtocolName}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .SecurityProtocols}}
|
||||||
|
<div class="item" data-value="{{.Type.Int}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="host">{{.locale.Tr "admin.auths.host"}}</label>
|
||||||
|
<input id="host" name="host" value="{{$cfg.Host}}" placeholder="e.g. mydomain.com" required>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="port">{{.locale.Tr "admin.auths.port"}}</label>
|
||||||
|
<input id="port" name="port" value="{{$cfg.Port}}" placeholder="e.g. 636" required>
|
||||||
|
</div>
|
||||||
|
<div class="has-tls inline field {{if not .HasTLS}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.skip_tls_verify"}}</strong></label>
|
||||||
|
<input name="skip_verify" type="checkbox" {{if .Source.SkipVerify}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{if .Source.IsLDAP}}
|
||||||
|
<div class="field">
|
||||||
|
<label for="bind_dn">{{.locale.Tr "admin.auths.bind_dn"}}</label>
|
||||||
|
<input id="bind_dn" name="bind_dn" value="{{$cfg.BindDN}}" placeholder="e.g. cn=Search,dc=mydomain,dc=com">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="bind_password">{{.locale.Tr "admin.auths.bind_password"}}</label>
|
||||||
|
<input id="bind_password" name="bind_password" type="password" value="{{$cfg.BindPassword}}">
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<div class="{{if .Source.IsLDAP}}required{{end}} field">
|
||||||
|
<label for="user_base">{{.locale.Tr "admin.auths.user_base"}}</label>
|
||||||
|
<input id="user_base" name="user_base" value="{{$cfg.UserBase}}" placeholder="e.g. ou=Users,dc=mydomain,dc=com" {{if .Source.IsLDAP}}required{{end}}>
|
||||||
|
</div>
|
||||||
|
{{if .Source.IsDLDAP}}
|
||||||
|
<div class="required field">
|
||||||
|
<label for="user_dn">{{.locale.Tr "admin.auths.user_dn"}}</label>
|
||||||
|
<input id="user_dn" name="user_dn" value="{{$cfg.UserDN}}" placeholder="e.g. uid=%s,ou=Users,dc=mydomain,dc=com" required>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<div class="required field">
|
||||||
|
<label for="filter">{{.locale.Tr "admin.auths.filter"}}</label>
|
||||||
|
<input id="filter" name="filter" value="{{$cfg.Filter}}" placeholder="e.g. (&(objectClass=posixAccount)(|(uid=%[1]s)(mail=%[1]s)))" required>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="admin_filter">{{.locale.Tr "admin.auths.admin_filter"}}</label>
|
||||||
|
<input id="admin_filter" name="admin_filter" value="{{$cfg.AdminFilter}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="restricted_filter">{{.locale.Tr "admin.auths.restricted_filter"}}</label>
|
||||||
|
<input id="restricted_filter" name="restricted_filter" value="{{$cfg.RestrictedFilter}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.restricted_filter_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_username">{{.locale.Tr "admin.auths.attribute_username"}}</label>
|
||||||
|
<input id="attribute_username" name="attribute_username" value="{{$cfg.AttributeUsername}}" placeholder="{{.locale.Tr "admin.auths.attribute_username_placeholder"}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_name">{{.locale.Tr "admin.auths.attribute_name"}}</label>
|
||||||
|
<input id="attribute_name" name="attribute_name" value="{{$cfg.AttributeName}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_surname">{{.locale.Tr "admin.auths.attribute_surname"}}</label>
|
||||||
|
<input id="attribute_surname" name="attribute_surname" value="{{$cfg.AttributeSurname}}">
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="attribute_mail">{{.locale.Tr "admin.auths.attribute_mail"}}</label>
|
||||||
|
<input id="attribute_mail" name="attribute_mail" value="{{$cfg.AttributeMail}}" placeholder="e.g. mail" required>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_ssh_public_key">{{.locale.Tr "admin.auths.attribute_ssh_public_key"}}</label>
|
||||||
|
<input id="attribute_ssh_public_key" name="attribute_ssh_public_key" value="{{$cfg.AttributeSSHPublicKey}}" placeholder="e.g. SshPublicKey">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_avatar">{{.locale.Tr "admin.auths.attribute_avatar"}}</label>
|
||||||
|
<input id="attribute_avatar" name="attribute_avatar" value="{{$cfg.AttributeAvatar}}" placeholder="e.g. jpegPhoto">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ldap group begin -->
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.enable_ldap_groups"}}</strong></label>
|
||||||
|
<input type="checkbox" name="groups_enabled" class="js-ldap-group-toggle" {{if $cfg.GroupsEnabled}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="ldap-group-options" class="ui segment secondary {{if not $cfg.GroupsEnabled}}gt-hidden{{end}}">
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.group_search_base"}}</label>
|
||||||
|
<input name="group_dn" value="{{$cfg.GroupDN}}" placeholder="e.g. ou=group,dc=mydomain,dc=com">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.group_attribute_list_users"}}</label>
|
||||||
|
<input name="group_member_uid" value="{{$cfg.GroupMemberUID}}" placeholder="e.g. memberUid">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.user_attribute_in_group"}}</label>
|
||||||
|
<input name="user_uid" value="{{$cfg.UserUID}}" placeholder="e.g. uid">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.verify_group_membership"}}</label>
|
||||||
|
<input name="group_filter" value="{{$cfg.GroupFilter}}" placeholder="e.g. (|(cn=gitea_users)(cn=admins))">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.map_group_to_team"}}</label>
|
||||||
|
<textarea name="group_team_map" rows="5" placeholder='e.g. {"cn=my-group,cn=groups,dc=example,dc=org": {"MyGiteaOrganization": ["MyGiteaTeam1", "MyGiteaTeam2"]}}'>{{$cfg.GroupTeamMap}}</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "admin.auths.map_group_to_team_removal"}}</label>
|
||||||
|
<input name="group_team_map_removal" type="checkbox" {{if $cfg.GroupTeamMapRemoval}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ldap group end -->
|
||||||
|
|
||||||
|
{{if .Source.IsLDAP}}
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="use_paged_search"><strong>{{.locale.Tr "admin.auths.use_paged_search"}}</strong></label>
|
||||||
|
<input id="use_paged_search" name="use_paged_search" type="checkbox" {{if $cfg.UsePagedSearch}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field required search-page-size{{if not $cfg.UsePagedSearch}} gt-hidden{{end}}">
|
||||||
|
<label for="search_page_size">{{.locale.Tr "admin.auths.search_page_size"}}</label>
|
||||||
|
<input id="search_page_size" name="search_page_size" value="{{if $cfg.UsePagedSearch}}{{$cfg.SearchPageSize}}{{end}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.attributes_in_bind"}}</strong></label>
|
||||||
|
<input name="attributes_in_bind" type="checkbox" {{if $cfg.AttributesInBind}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if $cfg.SkipLocalTwoFA}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="allow_deactivate_all"><strong>{{.locale.Tr "admin.auths.allow_deactivate_all"}}</strong></label>
|
||||||
|
<input id="allow_deactivate_all" name="allow_deactivate_all" type="checkbox" {{if $cfg.AllowDeactivateAll}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<!-- SMTP -->
|
||||||
|
{{if .Source.IsSMTP}}
|
||||||
|
{{$cfg:=.Source.Cfg}}
|
||||||
|
<div class="inline required field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.smtp_auth"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="smtp_auth" name="smtp_auth" value="{{$cfg.Auth}}" required>
|
||||||
|
<div class="text">{{$cfg.Auth}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .SMTPAuths}}
|
||||||
|
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="smtp_host">{{.locale.Tr "admin.auths.smtphost"}}</label>
|
||||||
|
<input id="smtp_host" name="smtp_host" value="{{$cfg.Host}}" required>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="smtp_port">{{.locale.Tr "admin.auths.smtpport"}}</label>
|
||||||
|
<input id="smtp_port" name="smtp_port" value="{{$cfg.Port}}" required>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="force_smtps"><strong>{{.locale.Tr "admin.auths.force_smtps"}}</strong></label>
|
||||||
|
<input id="force_smtps" name="force_smtps" type="checkbox" {{if $cfg.ForceSMTPS}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.force_smtps_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="has-tls inline field {{if not .HasTLS}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.skip_tls_verify"}}</strong></label>
|
||||||
|
<input name="skip_verify" type="checkbox" {{if $cfg.SkipVerify}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="helo_hostname">{{.locale.Tr "admin.auths.helo_hostname"}}</label>
|
||||||
|
<input id="helo_hostname" name="helo_hostname" value="{{$cfg.HeloHostname}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.helo_hostname_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="disable_helo"><strong>{{.locale.Tr "admin.auths.disable_helo"}}</strong></label>
|
||||||
|
<input id="disable_helo" name="disable_helo" type="checkbox" {{if $cfg.DisableHelo}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="allowed_domains">{{.locale.Tr "admin.auths.allowed_domains"}}</label>
|
||||||
|
<input id="allowed_domains" name="allowed_domains" value="{{$cfg.AllowedDomains}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.allowed_domains_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if $cfg.SkipLocalTwoFA}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<!-- PAM -->
|
||||||
|
{{if .Source.IsPAM}}
|
||||||
|
{{$cfg:=.Source.Cfg}}
|
||||||
|
<div class="required field">
|
||||||
|
<label for="pam_service_name">{{.locale.Tr "admin.auths.pam_service_name"}}</label>
|
||||||
|
<input id="pam_service_name" name="pam_service_name" value="{{$cfg.ServiceName}}" required>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="pam_email_domain">{{.locale.Tr "admin.auths.pam_email_domain"}}</label>
|
||||||
|
<input id="pam_email_domain" name="pam_email_domain" value="{{$cfg.EmailDomain}}">
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if $cfg.SkipLocalTwoFA}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<!-- OAuth2 -->
|
||||||
|
{{if .Source.IsOAuth2}}
|
||||||
|
{{$cfg:=.Source.Cfg}}
|
||||||
|
<div class="inline required field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.oauth2_provider"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="oauth2_provider" name="oauth2_provider" value="{{$cfg.Provider}}" required>
|
||||||
|
<div class="text">{{.CurrentOAuth2Provider.DisplayName}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .OAuth2Providers}}
|
||||||
|
<div class="item" data-value="{{.Name}}">{{.DisplayName}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="oauth2_key">{{.locale.Tr "admin.auths.oauth2_clientID"}}</label>
|
||||||
|
<input id="oauth2_key" name="oauth2_key" value="{{$cfg.ClientID}}" required>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="oauth2_secret">{{.locale.Tr "admin.auths.oauth2_clientSecret"}}</label>
|
||||||
|
<input id="oauth2_secret" name="oauth2_secret" value="{{$cfg.ClientSecret}}" required>
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<label for="oauth2_icon_url">{{.locale.Tr "admin.auths.oauth2_icon_url"}}</label>
|
||||||
|
<input id="oauth2_icon_url" name="oauth2_icon_url" value="{{$cfg.IconURL}}">
|
||||||
|
</div>
|
||||||
|
<div class="open_id_connect_auto_discovery_url required field">
|
||||||
|
<label for="open_id_connect_auto_discovery_url">{{.locale.Tr "admin.auths.openIdConnectAutoDiscoveryURL"}}</label>
|
||||||
|
<input id="open_id_connect_auto_discovery_url" name="open_id_connect_auto_discovery_url" value="{{$cfg.OpenIDConnectAutoDiscoveryURL}}">
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if $cfg.SkipLocalTwoFA}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.oauth2_use_custom_url"}}</strong></label>
|
||||||
|
<input id="oauth2_use_custom_url" name="oauth2_use_custom_url" type="checkbox" {{if $cfg.CustomURLMapping}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_auth_url required field">
|
||||||
|
<label for="oauth2_auth_url">{{.locale.Tr "admin.auths.oauth2_authURL"}}</label>
|
||||||
|
<input id="oauth2_auth_url" name="oauth2_auth_url" value="{{if $cfg.CustomURLMapping}}{{$cfg.CustomURLMapping.AuthURL}}{{end}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_token_url required field">
|
||||||
|
<label for="oauth2_token_url">{{.locale.Tr "admin.auths.oauth2_tokenURL"}}</label>
|
||||||
|
<input id="oauth2_token_url" name="oauth2_token_url" value="{{if $cfg.CustomURLMapping}}{{$cfg.CustomURLMapping.TokenURL}}{{end}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_profile_url required field">
|
||||||
|
<label for="oauth2_profile_url">{{.locale.Tr "admin.auths.oauth2_profileURL"}}</label>
|
||||||
|
<input id="oauth2_profile_url" name="oauth2_profile_url" value="{{if $cfg.CustomURLMapping}}{{$cfg.CustomURLMapping.ProfileURL}}{{end}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_email_url required field">
|
||||||
|
<label for="oauth2_email_url">{{.locale.Tr "admin.auths.oauth2_emailURL"}}</label>
|
||||||
|
<input id="oauth2_email_url" name="oauth2_email_url" value="{{if $cfg.CustomURLMapping}}{{$cfg.CustomURLMapping.EmailURL}}{{end}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_tenant required field">
|
||||||
|
<label for="oauth2_tenant">{{.locale.Tr "admin.auths.oauth2_tenant"}}</label>
|
||||||
|
<input id="oauth2_tenant" name="oauth2_tenant" value="{{if $cfg.CustomURLMapping}}{{$cfg.CustomURLMapping.Tenant}}{{end}}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{range .OAuth2Providers}}{{if .CustomURLSettings}}
|
||||||
|
<input id="{{.Name}}_customURLSettings" type="hidden" data-required="{{.CustomURLSettings.Required}}" data-available="true">
|
||||||
|
<input id="{{.Name}}_token_url" value="{{.CustomURLSettings.TokenURL.Value}}" data-available="{{.CustomURLSettings.TokenURL.Available}}" data-required="{{.CustomURLSettings.TokenURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_auth_url" value="{{.CustomURLSettings.AuthURL.Value}}" data-available="{{.CustomURLSettings.AuthURL.Available}}" data-required="{{.CustomURLSettings.AuthURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_profile_url" value="{{.CustomURLSettings.ProfileURL.Value}}" data-available="{{.CustomURLSettings.ProfileURL.Available}}" data-required="{{.CustomURLSettings.ProfileURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_email_url" value="{{.CustomURLSettings.EmailURL.Value}}" data-available="{{.CustomURLSettings.EmailURL.Available}}" data-required="{{.CustomURLSettings.EmailURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_tenant" value="{{.CustomURLSettings.Tenant.Value}}" data-available="{{.CustomURLSettings.Tenant.Available}}" data-required="{{.CustomURLSettings.Tenant.Required}}" type="hidden">
|
||||||
|
{{end}}{{end}}
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_scopes">{{.locale.Tr "admin.auths.oauth2_scopes"}}</label>
|
||||||
|
<input id="oauth2_scopes" name="oauth2_scopes" value="{{if $cfg.Scopes}}{{StringUtils.Join $cfg.Scopes ","}}{{end}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_required_claim_name">{{.locale.Tr "admin.auths.oauth2_required_claim_name"}}</label>
|
||||||
|
<input id="oauth2_required_claim_name" name="oauth2_required_claim_name" value="{{$cfg.RequiredClaimName}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.oauth2_required_claim_name_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_required_claim_value">{{.locale.Tr "admin.auths.oauth2_required_claim_value"}}</label>
|
||||||
|
<input id="oauth2_required_claim_value" name="oauth2_required_claim_value" value="{{$cfg.RequiredClaimValue}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.oauth2_required_claim_value_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_group_claim_name">{{.locale.Tr "admin.auths.oauth2_group_claim_name"}}</label>
|
||||||
|
<input id="oauth2_group_claim_name" name="oauth2_group_claim_name" value="{{$cfg.GroupClaimName}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_admin_group">{{.locale.Tr "admin.auths.oauth2_admin_group"}}</label>
|
||||||
|
<input id="oauth2_admin_group" name="oauth2_admin_group" value="{{$cfg.AdminGroup}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_restricted_group">{{.locale.Tr "admin.auths.oauth2_restricted_group"}}</label>
|
||||||
|
<input id="oauth2_restricted_group" name="oauth2_restricted_group" value="{{$cfg.RestrictedGroup}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.oauth2_map_group_to_team"}}</label>
|
||||||
|
<textarea name="oauth2_group_team_map" rows="5" placeholder='e.g. {"Developer": {"MyGiteaOrganization": ["MyGiteaTeam1", "MyGiteaTeam2"]}}'>{{$cfg.GroupTeamMap}}</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "admin.auths.oauth2_map_group_to_team_removal"}}</label>
|
||||||
|
<input name="oauth2_group_team_map_removal" type="checkbox" {{if $cfg.GroupTeamMapRemoval}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<!-- SSPI -->
|
||||||
|
{{if .Source.IsSSPI}}
|
||||||
|
{{$cfg:=.Source.Cfg}}
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="sspi_auto_create_users"><strong>{{.locale.Tr "admin.auths.sspi_auto_create_users"}}</strong></label>
|
||||||
|
<input id="sspi_auto_create_users" name="sspi_auto_create_users" class="sspi-auto-create-users" type="checkbox" {{if $cfg.AutoCreateUsers}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_auto_create_users_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="sspi_auto_activate_users"><strong>{{.locale.Tr "admin.auths.sspi_auto_activate_users"}}</strong></label>
|
||||||
|
<input id="sspi_auto_activate_users" name="sspi_auto_activate_users" class="sspi-auto-activate-users" type="checkbox" {{if $cfg.AutoActivateUsers}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_auto_activate_users_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="sspi_strip_domain_names"><strong>{{.locale.Tr "admin.auths.sspi_strip_domain_names"}}</strong></label>
|
||||||
|
<input id="sspi_strip_domain_names" name="sspi_strip_domain_names" class="sspi-strip-domain-names" type="checkbox" {{if $cfg.StripDomainNames}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_strip_domain_names_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="sspi_separator_replacement">{{.locale.Tr "admin.auths.sspi_separator_replacement"}}</label>
|
||||||
|
<input id="sspi_separator_replacement" name="sspi_separator_replacement" value="{{$cfg.SeparatorReplacement}}" required>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_separator_replacement_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="sspi_default_language">{{.locale.Tr "admin.auths.sspi_default_language"}}</label>
|
||||||
|
<div class="ui language selection dropdown" id="sspi_default_language">
|
||||||
|
<input name="sspi_default_language" type="hidden" value="{{$cfg.DefaultLanguage}}">
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="text">{{range .AllLangs}}{{if eq $cfg.DefaultLanguage .Lang}}{{.Name}}{{end}}{{end}}</div>
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item{{if not $.SSPIDefaultLanguage}} active selected{{end}}" data-value="">-</div>
|
||||||
|
{{range .AllLangs}}
|
||||||
|
<div class="item{{if eq $cfg.DefaultLanguage .Lang}} active selected{{end}}" data-value="{{.Lang}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_default_language_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{if .Source.IsLDAP}}
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.syncenabled"}}</strong></label>
|
||||||
|
<input name="is_sync_enabled" type="checkbox" {{if .Source.IsSyncEnabled}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.activated"}}</strong></label>
|
||||||
|
<input name="is_active" type="checkbox" {{if .Source.IsActive}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<button class="ui green button">{{.locale.Tr "admin.auths.update"}}</button>
|
||||||
|
<button class="ui red button delete-button" data-url="{{$.Link}}/delete" data-id="{{.Source.ID}}">{{.locale.Tr "admin.auths.delete"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.auths.tips"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<h5>GMail Settings:</h5>
|
||||||
|
<p>Host: smtp.gmail.com, Port: 587, Enable TLS Encryption: true</p>
|
||||||
|
|
||||||
|
<h5 class="oauth2">{{.locale.Tr "admin.auths.tips.oauth2.general"}}:</h5>
|
||||||
|
<p class="oauth2">{{.locale.Tr "admin.auths.tips.oauth2.general.tip"}} <b id="oauth2-callback-url"></b></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm delete modal">
|
||||||
|
<div class="header">
|
||||||
|
{{svg "octicon-trash"}}
|
||||||
|
{{.locale.Tr "admin.auths.delete_auth_title"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{.locale.Tr "admin.auths.delete_auth_desc"}}</p>
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,38 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin authentication")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.auths.auth_manage_panel"}} ({{.locale.Tr "admin.total" .Total}})
|
||||||
|
<div class="ui right">
|
||||||
|
<a class="ui primary tiny button" href="{{AppSubUrl}}/admin/auths/new">{{.locale.Tr "admin.auths.new"}}</a>
|
||||||
|
</div>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>{{.locale.Tr "admin.auths.name"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.auths.type"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.auths.enabled"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.auths.updated"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.created"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.edit"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Sources}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.ID}}</td>
|
||||||
|
<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{.Name}}</a></td>
|
||||||
|
<td>{{.TypeName}}</td>
|
||||||
|
<td>{{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td>
|
||||||
|
<td>{{DateTime "short" .UpdatedUnix}}</td>
|
||||||
|
<td>{{DateTime "short" .CreatedUnix}}</td>
|
||||||
|
<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{svg "octicon-pencil"}}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,122 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin new authentication")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.auths.new"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{template "base/disable_form_autofill"}}
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<!-- Types and name -->
|
||||||
|
<div class="inline required field {{if .Err_Type}}error{{end}}">
|
||||||
|
<label>{{.locale.Tr "admin.auths.auth_type"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="auth_type" name="type" value="{{.type}}">
|
||||||
|
<div class="text">{{.CurrentTypeName}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .AuthSources}}
|
||||||
|
<div class="item" data-value="{{.Type.Int}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required inline field {{if .Err_Name}}error{{end}}">
|
||||||
|
<label for="auth_name">{{.locale.Tr "admin.auths.auth_name"}}</label>
|
||||||
|
<input id="auth_name" name="name" value="{{.name}}" autofocus required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- LDAP and DLDAP -->
|
||||||
|
{{template "admin/auth/source/ldap" .}}
|
||||||
|
|
||||||
|
<!-- SMTP -->
|
||||||
|
{{template "admin/auth/source/smtp" .}}
|
||||||
|
|
||||||
|
<!-- PAM -->
|
||||||
|
<div class="pam required field {{if not (eq .type 4)}}gt-hidden{{end}}">
|
||||||
|
<label for="pam_service_name">{{.locale.Tr "admin.auths.pam_service_name"}}</label>
|
||||||
|
<input id="pam_service_name" name="pam_service_name" value="{{.pam_service_name}}">
|
||||||
|
<label for="pam_email_domain">{{.locale.Tr "admin.auths.pam_email_domain"}}</label>
|
||||||
|
<input id="pam_email_domain" name="pam_email_domain" value="{{.pam_email_domain}}">
|
||||||
|
</div>
|
||||||
|
<div class="pam optional field {{if not (eq .type 4)}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if .skip_local_two_fa}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- OAuth2 -->
|
||||||
|
{{template "admin/auth/source/oauth" .}}
|
||||||
|
|
||||||
|
<!-- SSPI -->
|
||||||
|
{{template "admin/auth/source/sspi" .}}
|
||||||
|
|
||||||
|
<div class="ldap field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.attributes_in_bind"}}</strong></label>
|
||||||
|
<input name="attributes_in_bind" type="checkbox" {{if .attributes_in_bind}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ldap inline field {{if not (eq .type 2)}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.syncenabled"}}</strong></label>
|
||||||
|
<input name="is_sync_enabled" type="checkbox" {{if .is_sync_enabled}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.activated"}}</strong></label>
|
||||||
|
<input name="is_active" type="checkbox" {{if .is_active}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<button class="ui green button">{{.locale.Tr "admin.auths.new"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.auths.tips"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<h5>GMail Settings:</h5>
|
||||||
|
<p>Host: smtp.gmail.com, Port: 587, Enable TLS Encryption: true</p>
|
||||||
|
|
||||||
|
<h5 class="oauth2">{{.locale.Tr "admin.auths.tips.oauth2.general"}}:</h5>
|
||||||
|
<p class="oauth2">{{.locale.Tr "admin.auths.tips.oauth2.general.tip"}} <b id="oauth2-callback-url"></b></p>
|
||||||
|
|
||||||
|
<h5 class="ui top attached header">{{.locale.Tr "admin.auths.tip.oauth2_provider"}}</h5>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<li>Bitbucket</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.bitbucket"}}</span>
|
||||||
|
<li>Dropbox</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.dropbox"}}</span>
|
||||||
|
<li>Facebook</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.facebook"}}</span>
|
||||||
|
<li>GitHub</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.github"}}</span>
|
||||||
|
<li>GitLab</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.gitlab"}}</span>
|
||||||
|
<li>Google</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.google_plus"}}</span>
|
||||||
|
<li>OpenID Connect</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.openid_connect"}}</span>
|
||||||
|
<li>Twitter</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.twitter"}}</span>
|
||||||
|
<li>Discord</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.discord"}}</span>
|
||||||
|
<li>Gitea</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.gitea"}}</span>
|
||||||
|
<li>Nextcloud</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.nextcloud"}}</span>
|
||||||
|
<li>Yandex</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.yandex"}}</span>
|
||||||
|
<li>Mastodon</li>
|
||||||
|
<span>{{.locale.Tr "admin.auths.tip.mastodon"}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,141 @@
|
|||||||
|
<div class="ldap dldap field {{if not (or (eq .type 2) (eq .type 5))}}gt-hidden{{end}}">
|
||||||
|
<div class="inline required field {{if .Err_SecurityProtocol}}error{{end}}">
|
||||||
|
<label>{{.locale.Tr "admin.auths.security_protocol"}}</label>
|
||||||
|
<div class="ui selection security-protocol dropdown">
|
||||||
|
<input type="hidden" id="security_protocol" name="security_protocol" value="{{.security_protocol}}">
|
||||||
|
<div class="text">{{.CurrentSecurityProtocol}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .SecurityProtocols}}
|
||||||
|
<div class="item" data-value="{{.Type.Int}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="host">{{.locale.Tr "admin.auths.host"}}</label>
|
||||||
|
<input id="host" name="host" value="{{.host}}" placeholder="e.g. mydomain.com">
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="port">{{.locale.Tr "admin.auths.port"}}</label>
|
||||||
|
<input id="port" name="port" value="{{.port}}" placeholder="e.g. 636">
|
||||||
|
</div>
|
||||||
|
<div class="has-tls inline field {{if not .HasTLS}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.skip_tls_verify"}}</strong></label>
|
||||||
|
<input name="skip_verify" type="checkbox" {{if .skip_verify}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ldap field {{if not (eq .type 2)}}gt-hidden{{end}}">
|
||||||
|
<label for="bind_dn">{{.locale.Tr "admin.auths.bind_dn"}}</label>
|
||||||
|
<input id="bind_dn" name="bind_dn" value="{{.bind_dn}}" placeholder="e.g. cn=Search,dc=mydomain,dc=com">
|
||||||
|
</div>
|
||||||
|
<div class="ldap field {{if not (eq .type 2)}}gt-hidden{{end}}">
|
||||||
|
<label for="bind_password">{{.locale.Tr "admin.auths.bind_password"}}</label>
|
||||||
|
<input id="bind_password" name="bind_password" type="password" autocomplete="off" value="{{.bind_password}}">
|
||||||
|
</div>
|
||||||
|
<div class="binddnrequired {{if (eq .type 2)}}required{{end}} field">
|
||||||
|
<label for="user_base">{{.locale.Tr "admin.auths.user_base"}}</label>
|
||||||
|
<input id="user_base" name="user_base" value="{{.user_base}}" placeholder="e.g. ou=Users,dc=mydomain,dc=com">
|
||||||
|
</div>
|
||||||
|
<div class="dldap required field {{if not (eq .type 5)}}gt-hidden{{end}}">
|
||||||
|
<label for="user_dn">{{.locale.Tr "admin.auths.user_dn"}}</label>
|
||||||
|
<input id="user_dn" name="user_dn" value="{{.user_dn}}" placeholder="e.g. uid=%s,ou=Users,dc=mydomain,dc=com">
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="filter">{{.locale.Tr "admin.auths.filter"}}</label>
|
||||||
|
<input id="filter" name="filter" value="{{.filter}}" placeholder="e.g. (&(objectClass=posixAccount)(|(uid=%[1]s)(mail=%[1]s)))">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="admin_filter">{{.locale.Tr "admin.auths.admin_filter"}}</label>
|
||||||
|
<input id="admin_filter" name="admin_filter" value="{{.admin_filter}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="restricted_filter">{{.locale.Tr "admin.auths.restricted_filter"}}</label>
|
||||||
|
<input id="restricted_filter" name="restricted_filter" value="{{.restricted_filter}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.restricted_filter_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_username">{{.locale.Tr "admin.auths.attribute_username"}}</label>
|
||||||
|
<input id="attribute_username" name="attribute_username" value="{{.attribute_username}}" placeholder="{{.locale.Tr "admin.auths.attribute_username_placeholder"}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_name">{{.locale.Tr "admin.auths.attribute_name"}}</label>
|
||||||
|
<input id="attribute_name" name="attribute_name" value="{{.attribute_name}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_surname">{{.locale.Tr "admin.auths.attribute_surname"}}</label>
|
||||||
|
<input id="attribute_surname" name="attribute_surname" value="{{.attribute_surname}}">
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="attribute_mail">{{.locale.Tr "admin.auths.attribute_mail"}}</label>
|
||||||
|
<input id="attribute_mail" name="attribute_mail" value="{{.attribute_mail}}" placeholder="e.g. mail">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_ssh_public_key">{{.locale.Tr "admin.auths.attribute_ssh_public_key"}}</label>
|
||||||
|
<input id="attribute_ssh_public_key" name="attribute_ssh_public_key" value="{{.attribute_ssh_public_key}}" placeholder="e.g. SshPublicKey">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="attribute_avatar">{{.locale.Tr "admin.auths.attribute_avatar"}}</label>
|
||||||
|
<input id="attribute_avatar" name="attribute_avatar" value="{{.attribute_avatar}}" placeholder="e.g. jpegPhoto">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ldap group begin -->
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.enable_ldap_groups"}}</strong></label>
|
||||||
|
<input type="checkbox" name="groups_enabled" class="js-ldap-group-toggle" {{if .groups_enabled}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="ldap-group-options" class="ui segment secondary">
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.group_search_base"}}</label>
|
||||||
|
<input name="group_dn" value="{{.group_dn}}" placeholder="e.g. ou=group,dc=mydomain,dc=com">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.group_attribute_list_users"}}</label>
|
||||||
|
<input name="group_member_uid" value="{{.group_member_uid}}" placeholder="e.g. memberUid">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.user_attribute_in_group"}}</label>
|
||||||
|
<input name="user_uid" value="{{.user_uid}}" placeholder="e.g. uid">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.verify_group_membership"}}</label>
|
||||||
|
<input name="group_filter" value="{{.group_filter}}" placeholder="e.g. (|(cn=gitea_users)(cn=admins))">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.map_group_to_team"}}</label>
|
||||||
|
<textarea name="group_team_map" rows="5" placeholder='e.g. {"cn=my-group,cn=groups,dc=example,dc=org": {"MyGiteaOrganization": ["MyGiteaTeam1", "MyGiteaTeam2"]}}'>{{.group_team_map}}</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "admin.auths.map_group_to_team_removal"}}</label>
|
||||||
|
<input name="group_team_map_removal" type="checkbox" {{if .group_team_map_removal}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ldap group end -->
|
||||||
|
|
||||||
|
<div class="ldap inline field {{if not (eq .type 2)}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="use_paged_search"><strong>{{.locale.Tr "admin.auths.use_paged_search"}}</strong></label>
|
||||||
|
<input id="use_paged_search" name="use_paged_search" class="use-paged-search" type="checkbox" {{if .use_paged_search}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ldap field search-page-size required {{if or (not (eq .type 2)) (not .use_paged_search)}}gt-hidden{{end}}">
|
||||||
|
<label for="search_page_size">{{.locale.Tr "admin.auths.search_page_size"}}</label>
|
||||||
|
<input id="search_page_size" name="search_page_size" value="{{.search_page_size}}">
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if .skip_local_two_fa}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="allow_deactivate_all"><strong>{{.locale.Tr "admin.auths.allow_deactivate_all"}}</strong></label>
|
||||||
|
<input id="allow_deactivate_all" name="allow_deactivate_all" type="checkbox" {{if .allow_deactivate_all}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,109 @@
|
|||||||
|
<div class="oauth2 field {{if not (eq .type 6)}}gt-hidden{{end}}">
|
||||||
|
<div class="inline required field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.oauth2_provider"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="oauth2_provider" name="oauth2_provider" value="{{.oauth2_provider}}">
|
||||||
|
<div class="text">{{.oauth2_provider}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .OAuth2Providers}}
|
||||||
|
<div class="item" data-value="{{.Name}}">{{.DisplayName}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="oauth2_key">{{.locale.Tr "admin.auths.oauth2_clientID"}}</label>
|
||||||
|
<input id="oauth2_key" name="oauth2_key" value="{{.oauth2_key}}">
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="oauth2_secret">{{.locale.Tr "admin.auths.oauth2_clientSecret"}}</label>
|
||||||
|
<input id="oauth2_secret" name="oauth2_secret" value="{{.oauth2_secret}}">
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<label for="oauth2_icon_url">{{.locale.Tr "admin.auths.oauth2_icon_url"}}</label>
|
||||||
|
<input id="oauth2_icon_url" name="oauth2_icon_url" value="{{.oauth2_icon_url}}">
|
||||||
|
</div>
|
||||||
|
<div class="open_id_connect_auto_discovery_url required field{{if .Err_DiscoveryURL}} error{{end}}">
|
||||||
|
<label for="open_id_connect_auto_discovery_url">{{.locale.Tr "admin.auths.openIdConnectAutoDiscoveryURL"}}</label>
|
||||||
|
<input id="open_id_connect_auto_discovery_url" name="open_id_connect_auto_discovery_url" value="{{.open_id_connect_auto_discovery_url}}">
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if .skip_local_two_fa}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="oauth2_use_custom_url inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.oauth2_use_custom_url"}}</strong></label>
|
||||||
|
<input id="oauth2_use_custom_url" name="oauth2_use_custom_url" type="checkbox">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_auth_url required field">
|
||||||
|
<label for="oauth2_auth_url">{{.locale.Tr "admin.auths.oauth2_authURL"}}</label>
|
||||||
|
<input id="oauth2_auth_url" name="oauth2_auth_url" value="{{.oauth2_auth_url}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_token_url required field">
|
||||||
|
<label for="oauth2_token_url">{{.locale.Tr "admin.auths.oauth2_tokenURL"}}</label>
|
||||||
|
<input id="oauth2_token_url" name="oauth2_token_url" value="{{.oauth2_token_url}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_profile_url required field">
|
||||||
|
<label for="oauth2_profile_url">{{.locale.Tr "admin.auths.oauth2_profileURL"}}</label>
|
||||||
|
<input id="oauth2_profile_url" name="oauth2_profile_url" value="{{.oauth2_profile_url}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_email_url required field">
|
||||||
|
<label for="oauth2_email_url">{{.locale.Tr "admin.auths.oauth2_emailURL"}}</label>
|
||||||
|
<input id="oauth2_email_url" name="oauth2_email_url" value="{{.oauth2_email_url}}">
|
||||||
|
</div>
|
||||||
|
<div class="oauth2_use_custom_url_field oauth2_tenant required field">
|
||||||
|
<label for="oauth2_tenant">{{.locale.Tr "admin.auths.oauth2_tenant"}}</label>
|
||||||
|
<input id="oauth2_tenant" name="oauth2_tenant" value="{{.oauth2_tenant}}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{range .OAuth2Providers}}{{if .CustomURLSettings}}
|
||||||
|
<input id="{{.Name}}_customURLSettings" type="hidden" data-required="{{.CustomURLSettings.Required}}" data-available="true">
|
||||||
|
<input id="{{.Name}}_token_url" value="{{.CustomURLSettings.TokenURL.Value}}" data-available="{{.CustomURLSettings.TokenURL.Available}}" data-required="{{.CustomURLSettings.TokenURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_auth_url" value="{{.CustomURLSettings.AuthURL.Value}}" data-available="{{.CustomURLSettings.AuthURL.Available}}" data-required="{{.CustomURLSettings.AuthURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_profile_url" value="{{.CustomURLSettings.ProfileURL.Value}}" data-available="{{.CustomURLSettings.ProfileURL.Available}}" data-required="{{.CustomURLSettings.ProfileURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_email_url" value="{{.CustomURLSettings.EmailURL.Value}}" data-available="{{.CustomURLSettings.EmailURL.Available}}" data-required="{{.CustomURLSettings.EmailURL.Required}}" type="hidden">
|
||||||
|
<input id="{{.Name}}_tenant" value="{{.CustomURLSettings.Tenant.Value}}" data-available="{{.CustomURLSettings.Tenant.Available}}" data-required="{{.CustomURLSettings.Tenant.Required}}" type="hidden">
|
||||||
|
{{end}}{{end}}
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_scopes">{{.locale.Tr "admin.auths.oauth2_scopes"}}</label>
|
||||||
|
<input id="oauth2_scopes" name="oauth2_scopes" value="{{.oauth2_scopes}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_required_claim_name">{{.locale.Tr "admin.auths.oauth2_required_claim_name"}}</label>
|
||||||
|
<input id="oauth2_required_claim_name" name="oauth2_required_claim_name" value="{{.oauth2_required_claim_name}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.oauth2_required_claim_name_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_required_claim_value">{{.locale.Tr "admin.auths.oauth2_required_claim_value"}}</label>
|
||||||
|
<input id="oauth2_required_claim_value" name="oauth2_required_claim_value" value="{{.oauth2_required_claim_value}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.oauth2_required_claim_value_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_group_claim_name">{{.locale.Tr "admin.auths.oauth2_group_claim_name"}}</label>
|
||||||
|
<input id="oauth2_group_claim_name" name="oauth2_group_claim_name" value="{{.oauth2_group_claim_name}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_admin_group">{{.locale.Tr "admin.auths.oauth2_admin_group"}}</label>
|
||||||
|
<input id="oauth2_admin_group" name="oauth2_admin_group" value="{{.oauth2_admin_group}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="oauth2_restricted_group">{{.locale.Tr "admin.auths.oauth2_restricted_group"}}</label>
|
||||||
|
<input id="oauth2_restricted_group" name="oauth2_restricted_group" value="{{.oauth2_restricted_group}}">
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.oauth2_map_group_to_team"}}</label>
|
||||||
|
<textarea name="oauth2_group_team_map" rows="5" placeholder='e.g. {"Developer": {"MyGiteaOrganization": ["MyGiteaTeam1", "MyGiteaTeam2"]}}'>{{.oauth2_group_team_map}}</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "admin.auths.oauth2_map_group_to_team_removal"}}</label>
|
||||||
|
<input name="oauth2_group_team_map_removal" type="checkbox" {{if .oauth2_group_team_map_removal}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,59 @@
|
|||||||
|
<div class="smtp field {{if not (eq .type 3)}}gt-hidden{{end}}">
|
||||||
|
<div class="inline required field">
|
||||||
|
<label>{{.locale.Tr "admin.auths.smtp_auth"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="smtp_auth" name="smtp_auth" value="{{.smtp_auth}}">
|
||||||
|
<div class="text">{{.smtp_auth}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .SMTPAuths}}
|
||||||
|
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="smtp_host">{{.locale.Tr "admin.auths.smtphost"}}</label>
|
||||||
|
<input id="smtp_host" name="smtp_host" value="{{.smtp_host}}">
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="smtp_port">{{.locale.Tr "admin.auths.smtpport"}}</label>
|
||||||
|
<input id="smtp_port" name="smtp_port" value="{{.smtp_port}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="force_smtps"><strong>{{.locale.Tr "admin.auths.force_smtps"}}</strong></label>
|
||||||
|
<input id="force_smtps" name="force_smtps" type="checkbox" {{if .force_smtps}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.force_smtps_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.auths.skip_tls_verify"}}</strong></label>
|
||||||
|
<input name="skip_verify" type="checkbox" {{if .skip_verify}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="helo_hostname">{{.locale.Tr "admin.auths.helo_hostname"}}</label>
|
||||||
|
<input id="helo_hostname" name="helo_hostname" value="{{.helo_hostname}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.helo_hostname_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="disable_helo"><strong>{{.locale.Tr "admin.auths.disable_helo"}}</strong></label>
|
||||||
|
<input id="disable_helo" name="disable_helo" type="checkbox" {{if .disable_helo}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="allowed_domains">{{.locale.Tr "admin.auths.allowed_domains"}}</label>
|
||||||
|
<input id="allowed_domains" name="allowed_domains" value="{{.allowed_domains}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.allowed_domains_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="optional field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="skip_local_two_fa"><strong>{{.locale.Tr "admin.auths.skip_local_two_fa"}}</strong></label>
|
||||||
|
<input id="skip_local_two_fa" name="skip_local_two_fa" type="checkbox" {{if .skip_local_two_fa}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,43 @@
|
|||||||
|
<div class="sspi field {{if not (eq .type 7)}}gt-hidden{{end}}">
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="sspi_auto_create_users"><strong>{{.locale.Tr "admin.auths.sspi_auto_create_users"}}</strong></label>
|
||||||
|
<input id="sspi_auto_create_users" name="sspi_auto_create_users" class="sspi-auto-create-users" type="checkbox" {{if .SSPIAutoCreateUsers}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_auto_create_users_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="sspi_auto_activate_users"><strong>{{.locale.Tr "admin.auths.sspi_auto_activate_users"}}</strong></label>
|
||||||
|
<input id="sspi_auto_activate_users" name="sspi_auto_activate_users" class="sspi-auto-activate-users" type="checkbox" {{if .SSPIAutoActivateUsers}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_auto_activate_users_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="sspi_strip_domain_names"><strong>{{.locale.Tr "admin.auths.sspi_strip_domain_names"}}</strong></label>
|
||||||
|
<input id="sspi_strip_domain_names" name="sspi_strip_domain_names" class="sspi-strip-domain-names" type="checkbox" {{if .SSPIStripDomainNames}}checked{{end}}>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_strip_domain_names_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="sspi_separator_replacement">{{.locale.Tr "admin.auths.sspi_separator_replacement"}}</label>
|
||||||
|
<input id="sspi_separator_replacement" name="sspi_separator_replacement" value="{{.SSPISeparatorReplacement}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_separator_replacement_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="sspi_default_language">{{.locale.Tr "admin.auths.sspi_default_language"}}</label>
|
||||||
|
<div class="ui language selection dropdown" id="sspi_default_language">
|
||||||
|
<input name="sspi_default_language" type="hidden" value="{{.SSPIDefaultLanguage}}">
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="text">{{range .AllLangs}}{{if eq $.SSPIDefaultLanguage .Lang}}{{.Name}}{{end}}{{end}}</div>
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item{{if not $.SSPIDefaultLanguage}} active selected{{end}}" data-value="">-</div>
|
||||||
|
{{range .AllLangs}}
|
||||||
|
<div class="item{{if eq $.SSPIDefaultLanguage .Lang}} active selected{{end}}" data-value="{{.Lang}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help">{{.locale.Tr "admin.auths.sspi_default_language_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,23 @@
|
|||||||
|
<div class="ui right floated secondary filter menu">
|
||||||
|
<!-- Sort -->
|
||||||
|
<div class="ui dropdown type jump item">
|
||||||
|
<span class="text">
|
||||||
|
{{.locale.Tr "repo.issues.filter_sort"}}
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if or (eq .SortType "oldest") (not .SortType)}}active {{end}}item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.oldest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "newest"}}active {{end}}item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.latest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "alphabetically"}}active {{end}}item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reversealphabetically"}}active {{end}}item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
|
||||||
|
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form class="ui form ignore-dirty" style="max-width: 90%;">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
@ -0,0 +1,366 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.server_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.app_name"}}</dt>
|
||||||
|
<dd>{{AppName}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.app_ver"}}</dt>
|
||||||
|
<dd>{{AppVer}}{{.AppBuiltWith}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.custom_conf"}}</dt>
|
||||||
|
<dd>{{.CustomConf}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.app_url"}}</dt>
|
||||||
|
<dd>{{.AppUrl}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.domain"}}</dt>
|
||||||
|
<dd>{{.Domain}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.offline_mode"}}</dt>
|
||||||
|
<dd>{{if .OfflineMode}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.disable_router_log"}}</dt>
|
||||||
|
<dd>{{if .DisableRouterLog}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<dt>{{.locale.Tr "admin.config.run_user"}}</dt>
|
||||||
|
<dd>{{.RunUser}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.run_mode"}}</dt>
|
||||||
|
<dd>{{.RunMode}}</dd>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_version"}}</dt>
|
||||||
|
<dd>{{.GitVersion}}</dd>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<dt>{{.locale.Tr "admin.config.repo_root_path"}}</dt>
|
||||||
|
<dd>{{.RepoRootPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.static_file_root_path"}}</dt>
|
||||||
|
<dd>{{.StaticRootPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.custom_file_root_path"}}</dt>
|
||||||
|
<dd>{{.CustomRootPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.log_file_root_path"}}</dt>
|
||||||
|
<dd>{{.LogRootPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.script_type"}}</dt>
|
||||||
|
<dd>{{.ScriptType}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.reverse_auth_user"}}</dt>
|
||||||
|
<dd>{{.ReverseProxyAuthUser}}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.ssh_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_enabled"}}</dt>
|
||||||
|
<dd>{{if not .SSH.Disabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
{{if not .SSH.Disabled}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_start_builtin_server"}}</dt>
|
||||||
|
<dd>{{if .SSH.StartBuiltinServer}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_domain"}}</dt>
|
||||||
|
<dd>{{.SSH.Domain}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_port"}}</dt>
|
||||||
|
<dd>{{.SSH.Port}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_listen_port"}}</dt>
|
||||||
|
<dd>{{.SSH.ListenPort}}</dd>
|
||||||
|
|
||||||
|
{{if not .SSH.StartBuiltinServer}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_root_path"}}</dt>
|
||||||
|
<dd>{{.SSH.RootPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_key_test_path"}}</dt>
|
||||||
|
<dd>{{.SSH.KeyTestPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_keygen_path"}}</dt>
|
||||||
|
<dd>{{.SSH.KeygenPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_minimum_key_size_check"}}</dt>
|
||||||
|
<dd>{{if .SSH.MinimumKeySizeCheck}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
{{if .SSH.MinimumKeySizeCheck}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.ssh_minimum_key_sizes"}}</dt>
|
||||||
|
<dd>{{.SSH.MinimumKeySizes}}</dd>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.lfs_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.lfs_enabled"}}</dt>
|
||||||
|
<dd>{{if .LFS.StartServer}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
{{if .LFS.StartServer}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.lfs_content_path"}}</dt>
|
||||||
|
<dd>{{JsonUtils.EncodeToString .LFS.Storage.ToShadowCopy}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.lfs_http_auth_expiry"}}</dt>
|
||||||
|
<dd>{{.LFS.HTTPAuthExpiry}}</dd>
|
||||||
|
{{end}}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.db_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_type"}}</dt>
|
||||||
|
<dd>{{.DbCfg.Type}}</dd>
|
||||||
|
{{if not (eq .DbCfg.Type "sqlite3")}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_host"}}</dt>
|
||||||
|
<dd>{{if .DbCfg.Host}}{{.DbCfg.Host}}{{else}}-{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_name"}}</dt>
|
||||||
|
<dd>{{if .DbCfg.Name}}{{.DbCfg.Name}}{{else}}-{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_user"}}</dt>
|
||||||
|
<dd>{{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}</dd>
|
||||||
|
{{end}}
|
||||||
|
{{if eq .DbCfg.Type "postgres"}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_schema"}}</dt>
|
||||||
|
<dd>{{if .DbCfg.Schema}}{{.DbCfg.Schema}}{{else}}-{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_ssl_mode"}}</dt>
|
||||||
|
<dd>{{if .DbCfg.SSLMode}}{{.DbCfg.SSLMode}}{{else}}-{{end}}</dd>
|
||||||
|
{{end}}
|
||||||
|
{{if eq .DbCfg.Type "sqlite3"}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.db_path"}}</dt>
|
||||||
|
<dd>{{if .DbCfg.Path}}{{.DbCfg.Path}}{{else}}-{{end}}</dd>
|
||||||
|
{{end}}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.service_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.register_email_confirm"}}</dt>
|
||||||
|
<dd>{{if .Service.RegisterEmailConfirm}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.disable_register"}}</dt>
|
||||||
|
<dd>{{if .Service.DisableRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.allow_only_internal_registration"}}</dt>
|
||||||
|
<dd>{{if .Service.AllowOnlyInternalRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.allow_only_external_registration"}}</dt>
|
||||||
|
<dd>{{if .Service.AllowOnlyExternalRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.show_registration_button"}}</dt>
|
||||||
|
<dd>{{if .Service.ShowRegistrationButton}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.enable_openid_signup"}}</dt>
|
||||||
|
<dd>{{if .Service.EnableOpenIDSignUp}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.enable_openid_signin"}}</dt>
|
||||||
|
<dd>{{if .Service.EnableOpenIDSignIn}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.require_sign_in_view"}}</dt>
|
||||||
|
<dd>{{if .Service.RequireSignInView}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mail_notify"}}</dt>
|
||||||
|
<dd>{{if .Service.EnableNotifyMail}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.disable_key_size_check"}}</dt>
|
||||||
|
<dd>{{if .SSH.MinimumKeySizeCheck}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.enable_captcha"}}</dt>
|
||||||
|
<dd>{{if .Service.EnableCaptcha}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.default_keep_email_private"}}</dt>
|
||||||
|
<dd>{{if .Service.DefaultKeepEmailPrivate}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.default_allow_create_organization"}}</dt>
|
||||||
|
<dd>{{if .Service.DefaultAllowCreateOrganization}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.enable_timetracking"}}</dt>
|
||||||
|
<dd>{{if .Service.EnableTimetracking}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
{{if .Service.EnableTimetracking}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.default_enable_timetracking"}}</dt>
|
||||||
|
<dd>{{if .Service.DefaultEnableTimetracking}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.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>
|
||||||
|
{{end}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.default_visibility_organization"}}</dt>
|
||||||
|
<dd>{{.Service.DefaultOrgVisibility}}</dd>
|
||||||
|
|
||||||
|
<dt>{{.locale.Tr "admin.config.no_reply_address"}}</dt>
|
||||||
|
<dd>{{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.default_enable_dependencies"}}</dt>
|
||||||
|
<dd>{{if .Service.DefaultEnableDependencies}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt>{{.locale.Tr "admin.config.active_code_lives"}}</dt>
|
||||||
|
<dd>{{.Service.ActiveCodeLives}} {{.locale.Tr "tool.raw_minutes"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.reset_password_code_lives"}}</dt>
|
||||||
|
<dd>{{.Service.ResetPwdCodeLives}} {{.locale.Tr "tool.raw_minutes"}}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.webhook_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.queue_length"}}</dt>
|
||||||
|
<dd>{{.Webhook.QueueLength}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.deliver_timeout"}}</dt>
|
||||||
|
<dd>{{.Webhook.DeliverTimeout}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.skip_tls_verify"}}</dt>
|
||||||
|
<dd>{{if .Webhook.SkipTLSVerify}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.mailer_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_enabled"}}</dt>
|
||||||
|
<dd>{{if .MailerEnabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
{{if .MailerEnabled}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_name"}}</dt>
|
||||||
|
<dd>{{.Mailer.Name}}</dd>
|
||||||
|
{{if eq .Mailer.Protocol "sendmail"}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_use_sendmail"}}</dt>
|
||||||
|
<dd>{{svg "octicon-check"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_sendmail_path"}}</dt>
|
||||||
|
<dd>{{.Mailer.SendmailPath}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_sendmail_args"}}</dt>
|
||||||
|
<dd>{{.Mailer.SendmailArgs}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_sendmail_timeout"}}</dt>
|
||||||
|
<dd>{{.Mailer.SendmailTimeout}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
{{else if eq .Mailer.Protocol "dummy"}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_use_dummy"}}</dt>
|
||||||
|
<dd>{{svg "octicon-check"}}</dd>
|
||||||
|
{{else}}{{/* SMTP family */}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_protocol"}}</dt>
|
||||||
|
<dd>{{.Mailer.Protocol}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_enable_helo"}}</dt>
|
||||||
|
<dd>{{if .Mailer.EnableHelo}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_smtp_addr"}}</dt>
|
||||||
|
<dd>{{.Mailer.SMTPAddr}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_smtp_port"}}</dt>
|
||||||
|
<dd>{{.Mailer.SMTPPort}}</dd>
|
||||||
|
{{end}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.mailer_user"}}</dt>
|
||||||
|
<dd>{{if .Mailer.User}}{{.Mailer.User}}{{else}}(empty){{end}}</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt class="gt-py-2">{{.locale.Tr "admin.config.send_test_mail"}}</dt>
|
||||||
|
<dd>
|
||||||
|
<form class="ui form ignore-dirty" action="{{AppSubUrl}}/admin/config/test_mail" method="post">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<div class="ui tiny input">
|
||||||
|
<input type="email" name="email" placeholder="{{.locale.Tr "admin.config.test_email_placeholder"}}" size="29" required>
|
||||||
|
</div>
|
||||||
|
<button class="ui tiny green button">{{.locale.Tr "admin.config.send_test_mail_submit"}}</button>
|
||||||
|
</form>
|
||||||
|
</dd>
|
||||||
|
{{end}}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.cache_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.cache_adapter"}}</dt>
|
||||||
|
<dd>{{.CacheAdapter}}</dd>
|
||||||
|
{{if eq .CacheAdapter "memory"}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.cache_interval"}}</dt>
|
||||||
|
<dd>{{.CacheInterval}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
{{end}}
|
||||||
|
{{if .CacheConn}}
|
||||||
|
<dt>{{.locale.Tr "admin.config.cache_conn"}}</dt>
|
||||||
|
<dd><code>{{.CacheConn}}</code></dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.cache_item_ttl"}}</dt>
|
||||||
|
<dd><code>{{.CacheItemTTL}}</code></dd>
|
||||||
|
{{end}}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.session_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.session_provider"}}</dt>
|
||||||
|
<dd>{{.SessionConfig.Provider}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.provider_config"}}</dt>
|
||||||
|
<dd><code>{{if .SessionConfig.ProviderConfig}}{{.SessionConfig.ProviderConfig}}{{else}}-{{end}}</code></dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.cookie_name"}}</dt>
|
||||||
|
<dd>{{.SessionConfig.CookieName}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.gc_interval_time"}}</dt>
|
||||||
|
<dd>{{.SessionConfig.Gclifetime}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.session_life_time"}}</dt>
|
||||||
|
<dd>{{.SessionConfig.Maxlifetime}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.https_only"}}</dt>
|
||||||
|
<dd>{{if .SessionConfig.Secure}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.picture_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.disable_gravatar"}}</dt>
|
||||||
|
<dd>
|
||||||
|
<div class="ui toggle checkbox">
|
||||||
|
<input type="checkbox" name="picture.disable_gravatar" version="{{.SystemSettings.GetVersion "picture.disable_gravatar"}}"{{if .SystemSettings.GetBool "picture.disable_gravatar"}} checked{{end}} title="{{.locale.Tr "admin.config.disable_gravatar"}}">
|
||||||
|
</div>
|
||||||
|
</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt>{{.locale.Tr "admin.config.enable_federated_avatar"}}</dt>
|
||||||
|
<dd>
|
||||||
|
<div class="ui toggle checkbox">
|
||||||
|
<input type="checkbox" name="picture.enable_federated_avatar" version="{{.SystemSettings.GetVersion "picture.enable_federated_avatar"}}"{{if .SystemSettings.GetBool "picture.enable_federated_avatar"}} checked{{end}} title="{{.locale.Tr "admin.config.enable_federated_avatar"}}">
|
||||||
|
</div>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.git_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_disable_diff_highlight"}}</dt>
|
||||||
|
<dd>{{if .Git.DisableDiffHighlight}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_max_diff_lines"}}</dt>
|
||||||
|
<dd>{{.Git.MaxGitDiffLines}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_max_diff_line_characters"}}</dt>
|
||||||
|
<dd>{{.Git.MaxGitDiffLineCharacters}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_max_diff_files"}}</dt>
|
||||||
|
<dd>{{.Git.MaxGitDiffFiles}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_gc_args"}}</dt>
|
||||||
|
<dd><code>{{.Git.GCArgs}}</code></dd>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_migrate_timeout"}}</dt>
|
||||||
|
<dd>{{.Git.Timeout.Migrate}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_mirror_timeout"}}</dt>
|
||||||
|
<dd>{{.Git.Timeout.Mirror}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_clone_timeout"}}</dt>
|
||||||
|
<dd>{{.Git.Timeout.Clone}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_pull_timeout"}}</dt>
|
||||||
|
<dd>{{.Git.Timeout.Pull}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.config.git_gc_timeout"}}</dt>
|
||||||
|
<dd>{{.Git.Timeout.GC}} {{.locale.Tr "tool.raw_seconds"}}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.config.log_config"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
{{if .Loggers.xorm.IsEnabled}}
|
||||||
|
<dt>{{$.locale.Tr "admin.config.xorm_log_sql"}}</dt>
|
||||||
|
<dd>{{if $.LogSQL}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{if .Loggers.access.IsEnabled}}
|
||||||
|
<dt>{{$.locale.Tr "admin.config.access_log_template"}}</dt>
|
||||||
|
<dd><code>{{$.AccessLogTemplate}}</code></dd>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{range $loggerName, $loggerDetail := .Loggers}}
|
||||||
|
<dt>{{$.locale.Tr "admin.config.logger_name_fmt" $loggerName}}</dt>
|
||||||
|
{{if $loggerDetail.IsEnabled}}
|
||||||
|
<dd><pre class="gt-m-0">{{$loggerDetail.EventWriters | JsonUtils.EncodeToString | JsonUtils.PrettyIndent}}</pre></dd>
|
||||||
|
{{else}}
|
||||||
|
<dd>{{$.locale.Tr "admin.config.disabled_logger"}}</dd>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,39 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.monitor.cron"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<form method="post" action="{{AppSubUrl}}/admin">
|
||||||
|
<table class="ui very basic striped table unstackable gt-mb-0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.name"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.schedule"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.next"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.previous"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.execute_times"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.last_execution_result"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Entries}}
|
||||||
|
<tr>
|
||||||
|
<td><button type="submit" class="ui green button" name="op" value="{{.Name}}" title="{{$.locale.Tr "admin.dashboard.operation_run"}}">{{svg "octicon-triangle-right"}}</button></td>
|
||||||
|
<td>{{$.locale.Tr (printf "admin.dashboard.%s" .Name)}}</td>
|
||||||
|
<td>{{.Spec}}</td>
|
||||||
|
<td>{{DateTime "full" .Next}}</td>
|
||||||
|
<td>{{if gt .Prev.Year 1}}{{DateTime "full" .Prev}}{{else}}-{{end}}</td>
|
||||||
|
<td>{{.ExecTimes}}</td>
|
||||||
|
<td {{if ne .Status ""}}data-tooltip-content="{{.FormatLastMessage $.locale}}"{{end}} >{{if eq .Status ""}}—{{else if eq .Status "finished"}}{{svg "octicon-check" 16}}{{else}}{{svg "octicon-x" 16}}{{end}}</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<input type="hidden" name="from" value="monitor">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,137 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin dashboard")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
{{if .NeedUpdate}}
|
||||||
|
<div class="ui negative message flash-error">
|
||||||
|
<p>{{(.locale.Tr "admin.dashboard.new_version_hint" .RemoteVersion AppVer) | Str2html}}</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.dashboard.operations"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<form method="post" action="{{AppSubUrl}}/admin">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<table class="ui very basic table gt-mt-0 gt-px-4">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.delete_inactive_accounts"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="delete_inactive_accounts">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.delete_repo_archives"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="delete_repo_archives">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.delete_missing_repos"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="delete_missing_repos">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.git_gc_repos"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="git_gc_repos">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
{{if and (not .SSH.Disabled) (not .SSH.StartBuiltinServer)}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.resync_all_sshkeys"}}<br>
|
||||||
|
{{.locale.Tr "admin.dashboard.resync_all_sshkeys.desc"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="resync_all_sshkeys">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.resync_all_sshprincipals"}}<br>
|
||||||
|
{{.locale.Tr "admin.dashboard.resync_all_sshprincipals.desc"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="resync_all_sshprincipals">{{svg "octicon-play" 16}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.resync_all_hooks"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="resync_all_hooks">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.reinit_missing_repos"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="reinit_missing_repos">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.sync_external_users"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="sync_external_users">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.repo_health_check"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="repo_health_check">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{.locale.Tr "admin.dashboard.delete_generated_repository_avatars"}}</td>
|
||||||
|
<td class="text right"><button type="submit" class="ui green button" name="op" value="delete_generated_repository_avatars">{{svg "octicon-play"}} {{.locale.Tr "admin.dashboard.operation_run"}}</button></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.dashboard.system_status"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<dl class="admin-dl-horizontal">
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.server_uptime"}}</dt>
|
||||||
|
<dd><relative-time format="duration" datetime="{{.SysStatus.StartTime}}">{{.SysStatus.StartTime}}</relative-time></dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.current_goroutine"}}</dt>
|
||||||
|
<dd>{{.SysStatus.NumGoroutine}}</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.current_memory_usage"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MemAllocated}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.total_memory_allocated"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MemTotal}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.memory_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MemSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.pointer_lookup_times"}}</dt>
|
||||||
|
<dd>{{.SysStatus.Lookups}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.memory_allocate_times"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MemMallocs}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.memory_free_times"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MemFrees}}</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.current_heap_usage"}}</dt>
|
||||||
|
<dd>{{.SysStatus.HeapAlloc}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.heap_memory_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.HeapSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.heap_memory_idle"}}</dt>
|
||||||
|
<dd>{{.SysStatus.HeapIdle}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.heap_memory_in_use"}}</dt>
|
||||||
|
<dd>{{.SysStatus.HeapInuse}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.heap_memory_released"}}</dt>
|
||||||
|
<dd>{{.SysStatus.HeapReleased}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.heap_objects"}}</dt>
|
||||||
|
<dd>{{.SysStatus.HeapObjects}}</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.bootstrap_stack_usage"}}</dt>
|
||||||
|
<dd>{{.SysStatus.StackInuse}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.stack_memory_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.StackSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.mspan_structures_usage"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MSpanInuse}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.mspan_structures_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MSpanSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.mcache_structures_usage"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MCacheInuse}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.mcache_structures_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.MCacheSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.profiling_bucket_hash_table_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.BuckHashSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.gc_metadata_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.GCSys}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.other_system_allocation_obtained"}}</dt>
|
||||||
|
<dd>{{.SysStatus.OtherSys}}</dd>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.next_gc_recycle"}}</dt>
|
||||||
|
<dd>{{.SysStatus.NextGC}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.last_gc_time"}}</dt>
|
||||||
|
<dd>{{.SysStatus.LastGC}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.total_gc_pause"}}</dt>
|
||||||
|
<dd>{{.SysStatus.PauseTotalNs}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.last_gc_pause"}}</dt>
|
||||||
|
<dd>{{.SysStatus.PauseNs}}</dd>
|
||||||
|
<dt>{{.locale.Tr "admin.dashboard.gc_times"}}</dt>
|
||||||
|
<dd>{{.SysStatus.NumGC}}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,101 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.emails.email_manage_panel"}} ({{.locale.Tr "admin.total" .Total}})
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<div class="ui right floated secondary filter menu">
|
||||||
|
<!-- Sort -->
|
||||||
|
<div class="ui dropdown type jump item">
|
||||||
|
<span class="text">
|
||||||
|
{{.locale.Tr "repo.issues.filter_sort"}}
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if or (eq .SortType "email") (not .SortType)}}active {{end}}item" href="{{$.Link}}?sort=email&q={{$.Keyword}}">{{.locale.Tr "admin.emails.filter_sort.email"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reverseemail"}}active {{end}}item" href="{{$.Link}}?sort=reverseemail&q={{$.Keyword}}">{{.locale.Tr "admin.emails.filter_sort.email_reverse"}}</a>
|
||||||
|
<a class="{{if eq .SortType "username"}}active {{end}}item" href="{{$.Link}}?sort=username&q={{$.Keyword}}">{{.locale.Tr "admin.emails.filter_sort.name"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reverseusername"}}active {{end}}item" href="{{$.Link}}?sort=reverseusername&q={{$.Keyword}}">{{.locale.Tr "admin.emails.filter_sort.name_reverse"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form class="ui form ignore-dirty" style="max-width: 90%">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th data-sortt-asc="username" data-sortt-desc="reverseusername">
|
||||||
|
{{.locale.Tr "admin.users.name"}}
|
||||||
|
{{SortArrow "username" "reverseusername" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.full_name"}}</th>
|
||||||
|
<th data-sortt-asc="email" data-sortt-desc="reverseemail" data-sortt-default="true">
|
||||||
|
{{.locale.Tr "email"}}
|
||||||
|
{{SortArrow "email" "reverseemail" $.SortType true}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.emails.primary"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.emails.activated"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Emails}}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{{AppSubUrl}}/{{.Name | PathEscape}}">{{.Name}}</a></td>
|
||||||
|
<td><span class="text truncate">{{.FullName}}</span></td>
|
||||||
|
<td><span class="text email">{{.Email}}</span></td>
|
||||||
|
<td>{{if .IsPrimary}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td>
|
||||||
|
<td>
|
||||||
|
{{if .CanChange}}
|
||||||
|
<a class="link-email-action" href data-uid="{{.UID}}"
|
||||||
|
data-email="{{.Email}}"
|
||||||
|
data-primary="{{if .IsPrimary}}1{{else}}0{{end}}"
|
||||||
|
data-activate="{{if .IsActivated}}0{{else}}1{{end}}">
|
||||||
|
{{if .IsActivated}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
{{if .IsActivated}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm modal" id="change-email-modal">
|
||||||
|
<div class="header">
|
||||||
|
{{.locale.Tr "admin.emails.change_email_header"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p class="center">{{.locale.Tr "admin.emails.change_email_text"}}</p>
|
||||||
|
|
||||||
|
<form class="ui form" id="email-action-form" action="{{AppSubUrl}}/admin/emails/activate" method="post">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
|
||||||
|
<input type="hidden" id="query-sort" name="sort" value="{{.SortType}}">
|
||||||
|
<input type="hidden" id="query-keyword" name="q" value="{{.Keyword}}">
|
||||||
|
<input type="hidden" id="query-primary" name="is_primary" value="{{.IsPrimary}}" required>
|
||||||
|
<input type="hidden" id="query-activated" name="is_activated" value="{{.IsActivated}}" required>
|
||||||
|
|
||||||
|
<input type="hidden" id="form-uid" name="uid" value="" required>
|
||||||
|
<input type="hidden" id="form-email" name="email" value="" required>
|
||||||
|
<input type="hidden" id="form-primary" name="primary" value="" required>
|
||||||
|
<input type="hidden" id="form-activate" name="activate" value="" required>
|
||||||
|
|
||||||
|
<div class="center">
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,55 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin settings new webhook")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{if .PageIsAdminDefaultHooksNew}}
|
||||||
|
{{.locale.Tr "admin.defaulthooks.add_webhook"}}
|
||||||
|
{{else if .PageIsAdminSystemHooksNew}}
|
||||||
|
{{.locale.Tr "admin.systemhooks.add_webhook"}}
|
||||||
|
{{else if .Webhook.IsSystemWebhook}}
|
||||||
|
{{.locale.Tr "admin.systemhooks.update_webhook"}}
|
||||||
|
{{else}}
|
||||||
|
{{.locale.Tr "admin.defaulthooks.update_webhook"}}
|
||||||
|
{{end}}
|
||||||
|
<div class="ui right">
|
||||||
|
{{if eq .HookType "gitea"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
|
||||||
|
{{else if eq .HookType "gogs"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
||||||
|
{{else if eq .HookType "slack"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/slack.png">
|
||||||
|
{{else if eq .HookType "discord"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/discord.png">
|
||||||
|
{{else if eq .HookType "dingtalk"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/dingtalk.ico">
|
||||||
|
{{else if eq .HookType "telegram"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/telegram.png">
|
||||||
|
{{else if eq .HookType "msteams"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/msteams.png">
|
||||||
|
{{else if eq .HookType "feishu"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/feishu.png">
|
||||||
|
{{else if eq .HookType "matrix"}}
|
||||||
|
{{svg "gitea-matrix" 26}}
|
||||||
|
{{else if eq .HookType "wechatwork"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/wechatwork.png">
|
||||||
|
{{else if eq .HookType "packagist"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/packagist.png">
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
{{template "repo/settings/webhook/gitea" .}}
|
||||||
|
{{template "repo/settings/webhook/gogs" .}}
|
||||||
|
{{template "repo/settings/webhook/slack" .}}
|
||||||
|
{{template "repo/settings/webhook/discord" .}}
|
||||||
|
{{template "repo/settings/webhook/dingtalk" .}}
|
||||||
|
{{template "repo/settings/webhook/telegram" .}}
|
||||||
|
{{template "repo/settings/webhook/msteams" .}}
|
||||||
|
{{template "repo/settings/webhook/feishu" .}}
|
||||||
|
{{template "repo/settings/webhook/matrix" .}}
|
||||||
|
{{template "repo/settings/webhook/wechatwork" .}}
|
||||||
|
{{template "repo/settings/webhook/packagist" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "repo/settings/webhook/history" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,9 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin hooks")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
|
||||||
|
{{template "repo/settings/webhook/base_list" .SystemWebhooks}}
|
||||||
|
{{template "repo/settings/webhook/base_list" .DefaultWebhooks}}
|
||||||
|
|
||||||
|
{{template "repo/settings/webhook/delete_modal" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,11 @@
|
|||||||
|
{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}}
|
||||||
|
<div class="page-content">
|
||||||
|
<div class="admin-layout-right">
|
||||||
|
<div>
|
||||||
|
{{/* block: admin-setting-content */}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,13 @@
|
|||||||
|
{{template "base/head" .ctxData}}
|
||||||
|
<div role="main" aria-label="{{.ctxData.Title}}" class="page-content {{.pageClass}}">
|
||||||
|
<div class="ui container stackable grid">
|
||||||
|
{{template "admin/navbar" .ctxData}}
|
||||||
|
<div class="twelve wide column">
|
||||||
|
{{template "base/alert" .ctxData}}
|
||||||
|
{{/* block: admin-setting-content */}}
|
||||||
|
|
||||||
|
{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
@ -0,0 +1,71 @@
|
|||||||
|
<div class="four wide column">
|
||||||
|
<div class="ui fluid vertical menu">
|
||||||
|
<div class="header item">{{.locale.Tr "settings"}}</div>
|
||||||
|
<a class="{{if .PageIsAdminDashboard}}active {{end}}item" href="{{AppSubUrl}}/admin">
|
||||||
|
{{.locale.Tr "admin.dashboard"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminUsers}}active {{end}}item" href="{{AppSubUrl}}/admin/users">
|
||||||
|
{{.locale.Tr "admin.users"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminOrganizations}}active {{end}}item" href="{{AppSubUrl}}/admin/orgs">
|
||||||
|
{{.locale.Tr "admin.organizations"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminRepositories}}active {{end}}item" href="{{AppSubUrl}}/admin/repos">
|
||||||
|
{{.locale.Tr "admin.repositories"}}
|
||||||
|
</a>
|
||||||
|
{{if .EnablePackages}}
|
||||||
|
<a class="{{if .PageIsAdminPackages}}active {{end}}item" href="{{AppSubUrl}}/admin/packages">
|
||||||
|
{{.locale.Tr "packages.title"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
{{if not DisableWebhooks}}
|
||||||
|
<a class="{{if or .PageIsAdminDefaultHooks .PageIsAdminSystemHooks}}active {{end}}item" href="{{AppSubUrl}}/admin/hooks">
|
||||||
|
{{.locale.Tr "admin.hooks"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
<a class="{{if .PageIsAdminAuthentications}}active {{end}}item" href="{{AppSubUrl}}/admin/auths">
|
||||||
|
{{.locale.Tr "admin.authentication"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminEmails}}active {{end}}item" href="{{AppSubUrl}}/admin/emails">
|
||||||
|
{{.locale.Tr "admin.emails"}}
|
||||||
|
</a>
|
||||||
|
{{if .EnableOAuth2}}
|
||||||
|
<a class="{{if .PageIsAdminApplications}}active {{end}}item" href="{{AppSubUrl}}/admin/applications">
|
||||||
|
{{.locale.Tr "settings.applications"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
{{if .EnableActions}}
|
||||||
|
<details class="item toggleable-item" {{if .PageIsSharedSettingsRunners}}open{{end}}>
|
||||||
|
<summary>{{.locale.Tr "actions.actions"}}</summary>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if .PageIsSharedSettingsRunners}}active {{end}}item" href="{{AppSubUrl}}/admin/actions/runners">
|
||||||
|
{{.locale.Tr "actions.runners"}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
{{end}}
|
||||||
|
<a class="{{if .PageIsAdminConfig}}active {{end}}item" href="{{AppSubUrl}}/admin/config">
|
||||||
|
{{.locale.Tr "admin.config"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminNotices}}active {{end}}item" href="{{AppSubUrl}}/admin/notices">
|
||||||
|
{{.locale.Tr "admin.notices"}}
|
||||||
|
</a>
|
||||||
|
<details class="item toggleable-item" {{if or .PageIsAdminMonitorStats .PageIsAdminMonitorCron .PageIsAdminMonitorQueue .PageIsAdminMonitorStacktrace}}open{{end}}>
|
||||||
|
<summary>{{.locale.Tr "admin.monitor"}}</summary>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if .PageIsAdminMonitorStats}}active {{end}}item" href="{{AppSubUrl}}/admin/monitor/stats">
|
||||||
|
{{.locale.Tr "admin.monitor.stats"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminMonitorCron}}active {{end}}item" href="{{AppSubUrl}}/admin/monitor/cron">
|
||||||
|
{{.locale.Tr "admin.monitor.cron"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminMonitorQueue}}active {{end}}item" href="{{AppSubUrl}}/admin/monitor/queue">
|
||||||
|
{{.locale.Tr "admin.monitor.queues"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsAdminMonitorStacktrace}}active {{end}}item" href="{{AppSubUrl}}/admin/monitor/stacktrace">
|
||||||
|
{{.locale.Tr "admin.monitor.stacktrace"}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,71 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin notice")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.notices.system_notice_list"}} ({{.locale.Tr "admin.total" .Total}})
|
||||||
|
</h4>
|
||||||
|
<table class="ui attached segment select selectable striped table unstackable g-table-auto-ellipsis">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>{{.locale.Tr "admin.notices.type"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.notices.desc"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.created"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.notices.op"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Notices}}
|
||||||
|
<tr>
|
||||||
|
<td><div class="ui checkbox gt-db" data-id="{{.ID}}"><input type="checkbox"></div></td>
|
||||||
|
<td>{{.ID}}</td>
|
||||||
|
<td>{{$.locale.Tr .TrStr}}</td>
|
||||||
|
<td class="view-detail auto-ellipsis" style="width: 80%;"><span class="notice-description">{{.Description}}</span></td>
|
||||||
|
<td nowrap>{{DateTime "short" .CreatedUnix}}</td>
|
||||||
|
<td class="view-detail"><a href="#">{{svg "octicon-note" 16}}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
{{if .Notices}}
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th colspan="5">
|
||||||
|
<form class="ui right" method="post" action="{{AppSubUrl}}/admin/notices/empty">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<button type="submit" class="ui red small button">{{.locale.Tr "admin.notices.delete_all"}}</button>
|
||||||
|
</form>
|
||||||
|
<div class="ui floating upward dropdown small button">{{/* TODO: Make this dropdown accessible */}}
|
||||||
|
<span class="text">{{.locale.Tr "admin.notices.operations"}}</span>
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item select action" data-action="select-all">
|
||||||
|
{{.locale.Tr "admin.notices.select_all"}}
|
||||||
|
</div>
|
||||||
|
<div class="item select action" data-action="deselect-all">
|
||||||
|
{{.locale.Tr "admin.notices.deselect_all"}}
|
||||||
|
</div>
|
||||||
|
<div class="item select action" data-action="inverse">
|
||||||
|
{{.locale.Tr "admin.notices.inverse_selection"}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="ui small teal button" id="delete-selection" data-link="{{.Link}}/delete" data-redirect="{{.Link}}?page={{.Page.Paginater.Current}}">
|
||||||
|
{{.locale.Tr "admin.notices.delete_selected"}}
|
||||||
|
</button>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui modal admin" id="detail-modal">
|
||||||
|
<div class="header">{{$.locale.Tr "admin.notices.view_detail_header"}}</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="sub header"></div>
|
||||||
|
<pre></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,54 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.orgs.org_manage_panel"}} ({{.locale.Tr "admin.total" .Total}})
|
||||||
|
<div class="ui right">
|
||||||
|
<a class="ui primary tiny button" href="{{AppSubUrl}}/org/create">{{.locale.Tr "admin.orgs.new_orga"}}</a>
|
||||||
|
</div>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
{{template "admin/base/search" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th data-sortt-asc="oldest" data-sortt-desc="newest">ID{{SortArrow "oldest" "newest" $.SortType false}}</th>
|
||||||
|
<th data-sortt-asc="alphabetically" data-sortt-desc="reversealphabetically" data-sortt-default="true">
|
||||||
|
{{.locale.Tr "admin.orgs.name"}}
|
||||||
|
{{SortArrow "alphabetically" "reversealphabetically" $.SortType true}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.orgs.teams"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.orgs.members"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.repos"}}</th>
|
||||||
|
<th data-sortt-asc="recentupdate" data-sortt-desc="leastupdate">
|
||||||
|
{{.locale.Tr "admin.users.created"}}
|
||||||
|
{{SortArrow "recentupdate" "leastupdate" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.edit"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Users}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.ID}}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{.HomeLink}}">{{.Name}}</a>
|
||||||
|
{{if .Visibility.IsPrivate}}
|
||||||
|
<span class="text gold">{{svg "octicon-lock"}}</span>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>{{.NumTeams}}</td>
|
||||||
|
<td>{{.NumMembers}}</td>
|
||||||
|
<td>{{.NumRepos}}</td>
|
||||||
|
<td>{{DateTime "short" .CreatedUnix}}</td>
|
||||||
|
<td><a href="{{.OrganisationLink}}/settings">{{svg "octicon-pencil"}}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,90 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.packages.package_manage_panel"}} ({{.locale.Tr "admin.total" .TotalCount}},
|
||||||
|
{{.locale.Tr "admin.packages.total_size" (FileSize .TotalBlobSize)}},
|
||||||
|
{{.locale.Tr "admin.packages.unreferenced_size" (FileSize .TotalUnreferencedBlobSize)}})
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form ignore-dirty">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Query}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus>
|
||||||
|
<select class="ui dropdown" name="type">
|
||||||
|
<option value="">{{.locale.Tr "packages.filter.type"}}</option>
|
||||||
|
<option value="all">{{.locale.Tr "packages.filter.type.all"}}</option>
|
||||||
|
{{range $type := .AvailableTypes}}
|
||||||
|
<option{{if eq $.PackageType $type}} selected="selected"{{end}} value="{{$type}}">{{$type.Name}}</option>
|
||||||
|
{{end}}
|
||||||
|
</select>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>{{.locale.Tr "admin.packages.owner"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.packages.type"}}</th>
|
||||||
|
<th data-sortt-asc="name_asc" data-sortt-desc="name_desc">
|
||||||
|
{{.locale.Tr "admin.packages.name"}}
|
||||||
|
{{SortArrow "name_asc" "name_desc" .SortType false}}
|
||||||
|
</th>
|
||||||
|
<th data-sortt-asc="version_desc" data-sortt-desc="version_asc">
|
||||||
|
{{.locale.Tr "admin.packages.version"}}
|
||||||
|
{{SortArrow "version_desc" "version_asc" .SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.packages.creator"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.packages.repository"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.packages.size"}}</th>
|
||||||
|
<th data-sortt-asc="created_asc" data-sortt-desc="created_desc">
|
||||||
|
{{.locale.Tr "admin.packages.published"}}
|
||||||
|
{{SortArrow "created_asc" "created_desc" .SortType true}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.notices.op"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .PackageDescriptors}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.Version.ID}}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{.Owner.HomeLink}}">{{.Owner.Name}}</a>
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="text gold">{{svg "octicon-lock"}}</span>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>{{.Package.Type.Name}}</td>
|
||||||
|
<td class="text truncate email">{{.Package.Name}}</td>
|
||||||
|
<td><a href="{{.FullWebLink}}" class="text truncate email">{{.Version.Version}}</a></td>
|
||||||
|
<td><a href="{{.Creator.HomeLink}}">{{.Creator.Name}}</a></td>
|
||||||
|
<td>
|
||||||
|
{{if .Repository}}
|
||||||
|
<a href="{{.Repository.Link}}">{{.Repository.Name}}</a>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>{{FileSize .CalculateBlobSize}}</td>
|
||||||
|
<td>{{DateTime "short" .Version.CreatedUnix}}</td>
|
||||||
|
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.Version.ID}}" data-name="{{.Package.Name}}" data-data-version="{{.Version.Version}}">{{svg "octicon-trash"}}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm delete modal">
|
||||||
|
<div class="header">
|
||||||
|
{{svg "octicon-trash"}}
|
||||||
|
{{.locale.Tr "packages.settings.delete"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
{{.locale.Tr "packages.settings.delete.notice" `<span class="name"></span>` `<span class="dataVersion"></span>` | Safe}}
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,34 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.monitor.queues"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.name"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.type"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.exemplar"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.numberworkers"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.numberinqueue"}}</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range $qid, $q := .Queues}}
|
||||||
|
<tr>
|
||||||
|
<td>{{$q.GetName}}</td>
|
||||||
|
<td>{{$q.GetType}}</td>
|
||||||
|
<td>{{$q.GetItemTypeName}}</td>
|
||||||
|
<td>{{$sum := $q.GetWorkerNumber}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
|
||||||
|
<td>{{$sum = $q.GetQueueItemNumber}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
|
||||||
|
<td><a href="{{$.Link}}/{{$qid}}" class="button">{{if lt $sum 0}}{{$.locale.Tr "admin.monitor.queue.review"}}{{else}}{{$.locale.Tr "admin.monitor.queue.review_add"}}{{end}}</a>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
||||||
|
|
@ -0,0 +1,59 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.monitor.queue" .Queue.GetName}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.name"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.type"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.exemplar"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.numberworkers"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.maxnumberworkers"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.monitor.queue.numberinqueue"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{.Queue.GetName}}</td>
|
||||||
|
<td>{{.Queue.GetType}}</td>
|
||||||
|
<td>{{.Queue.GetItemTypeName}}</td>
|
||||||
|
<td>{{$sum := .Queue.GetWorkerNumber}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}</td>
|
||||||
|
<td>{{if lt $sum 0}}-{{else}}{{.Queue.GetWorkerMaxNumber}}{{end}}</td>
|
||||||
|
<td>
|
||||||
|
{{$sum = .Queue.GetQueueItemNumber}}
|
||||||
|
{{if lt $sum 0}}
|
||||||
|
-
|
||||||
|
{{else}}
|
||||||
|
{{$sum}}
|
||||||
|
<form action="{{$.Link}}/remove-all-items" method="post" class="gt-dib gt-ml-4">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<button class="ui tiny basic red button">{{.locale.Tr "admin.monitor.queue.settings.remove_all_items"}}</button>
|
||||||
|
</form>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.monitor.queue.settings.title"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<p>{{.locale.Tr "admin.monitor.queue.settings.desc"}}</p>
|
||||||
|
<form method="POST" action="{{.Link}}/set">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<div class="ui form">
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="max-number">{{.locale.Tr "admin.monitor.queue.settings.maxnumberworkers"}}</label>
|
||||||
|
<input name="max-number" type="text" placeholder="{{.locale.Tr "admin.monitor.queue.settings.maxnumberworkers.placeholder" .Queue.GetWorkerMaxNumber}}">
|
||||||
|
</div>
|
||||||
|
<button class="ui submit button">{{.locale.Tr "admin.monitor.queue.settings.submit"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,109 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.repos.repo_manage_panel"}} ({{.locale.Tr "admin.total" .Total}})
|
||||||
|
<div class="ui right">
|
||||||
|
<a class="ui primary tiny button" href="{{AppSubUrl}}/admin/repos/unadopted">{{.locale.Tr "admin.repos.unadopted"}}</a>
|
||||||
|
</div>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
{{template "admin/repo/search" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th data-sortt-asc="oldest" data-sortt-desc="newest">ID{{SortArrow "oldest" "newest" $.SortType false}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.repos.owner"}}</th>
|
||||||
|
<th data-sortt-asc="alphabetically" data-sortt-desc="reversealphabetically">
|
||||||
|
{{.locale.Tr "admin.repos.name"}}
|
||||||
|
{{SortArrow "alphabetically" "reversealphabetically" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.repos.watches"}}</th>
|
||||||
|
<th data-sortt-asc="moststars" data-sortt-desc="feweststars">
|
||||||
|
{{.locale.Tr "admin.repos.stars"}}
|
||||||
|
{{SortArrow "moststars" "feweststars" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th data-sortt-asc="mostforks" data-sortt-desc="fewestforks">
|
||||||
|
{{.locale.Tr "admin.repos.forks"}}
|
||||||
|
{{SortArrow "mostforks" "fewestforks" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.repos.issues"}}</th>
|
||||||
|
<th data-sortt-asc="size" data-sortt-desc="reversesize">
|
||||||
|
{{.locale.Tr "admin.repos.size"}}
|
||||||
|
{{SortArrow "size" "reversesize" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.auths.updated"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.created"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.notices.op"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Repos}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.ID}}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{.Owner.HomeLink}}">{{.Owner.Name}}</a>
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="text gold">{{svg "octicon-lock"}}</span>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{.Link}}">{{.Name}}</a>
|
||||||
|
{{if .IsArchived}}
|
||||||
|
<span class="ui basic mini label">{{$.locale.Tr "repo.desc.archived"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{if .IsTemplate}}
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic mini label">{{$.locale.Tr "repo.desc.private_template"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic mini label">{{$.locale.Tr "repo.desc.internal_template"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic mini label">{{$.locale.Tr "repo.desc.private"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic mini label">{{$.locale.Tr "repo.desc.internal"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{if .IsFork}}
|
||||||
|
{{svg "octicon-repo-forked"}}
|
||||||
|
{{else if .IsMirror}}
|
||||||
|
{{svg "octicon-mirror"}}
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>{{.NumWatches}}</td>
|
||||||
|
<td>{{.NumStars}}</td>
|
||||||
|
<td>{{.NumForks}}</td>
|
||||||
|
<td>{{.NumIssues}}</td>
|
||||||
|
<td>{{FileSize .Size}}</td>
|
||||||
|
<td>{{DateTime "short" .UpdatedUnix}}</td>
|
||||||
|
<td>{{DateTime "short" .CreatedUnix}}</td>
|
||||||
|
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.ID}}" data-name="{{.Name}}">{{svg "octicon-trash"}}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm delete modal">
|
||||||
|
<div class="header">
|
||||||
|
{{svg "octicon-trash"}}
|
||||||
|
{{.locale.Tr "repo.settings.delete"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{.locale.Tr "repo.settings.delete_desc"}}</p>
|
||||||
|
{{.locale.Tr "repo.settings.delete_notices_2" `<span class="name"></span>` | Safe}}<br>
|
||||||
|
{{.locale.Tr "repo.settings.delete_notices_fork_1"}}<br>
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,29 @@
|
|||||||
|
<div class="ui right floated secondary filter menu">
|
||||||
|
<!-- Sort -->
|
||||||
|
<div class="ui dropdown type jump item">
|
||||||
|
<span class="text">
|
||||||
|
{{.locale.Tr "repo.issues.filter_sort"}}
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if or (eq .SortType "oldest") (not .SortType)}}active {{end}}item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.oldest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "newest"}}active {{end}}item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.latest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "alphabetically"}}active {{end}}item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reversealphabetically"}}active {{end}}item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
|
||||||
|
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
|
||||||
|
<a class="{{if eq .SortType "moststars"}}active {{end}}item" href="{{$.Link}}?sort=moststars&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.moststars"}}</a>
|
||||||
|
<a class="{{if eq .SortType "feweststars"}}active {{end}}item" href="{{$.Link}}?sort=feweststars&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.feweststars"}}</a>
|
||||||
|
<a class="{{if eq .SortType "mostforks"}}active {{end}}item" href="{{$.Link}}?sort=mostforks&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.mostforks"}}</a>
|
||||||
|
<a class="{{if eq .SortType "fewestforks"}}active {{end}}item" href="{{$.Link}}?sort=fewestforks&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.fewestforks"}}</a>
|
||||||
|
<a class="{{if eq .SortType "size"}}active {{end}}item" href="{{$.Link}}?sort=size&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.by_size"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reversesize"}}active {{end}}item" href="{{$.Link}}?sort=reversesize&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.reverse_by_size"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form class="ui form ignore-dirty" style="max-width: 90%">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
@ -0,0 +1,75 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.repos.unadopted"}}
|
||||||
|
<div class="ui right">
|
||||||
|
<a class="ui primary tiny button" href="{{AppSubUrl}}/admin/repos">{{.locale.Tr "admin.repos.repo_manage_panel"}}</a>
|
||||||
|
</div>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form ignore-dirty">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="search" value="true" type="hidden">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "repo.adopt_search"}}" autofocus>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{{if .search}}
|
||||||
|
<div class="ui attached segment settings">
|
||||||
|
{{if .Dirs}}
|
||||||
|
<div class="ui aligned divided list">
|
||||||
|
{{range $dirI, $dir := .Dirs}}
|
||||||
|
<div class="item gt-df gt-ac">
|
||||||
|
<span class="gt-f1"> {{svg "octicon-file-directory-fill"}} {{$dir}}</span>
|
||||||
|
<div>
|
||||||
|
<button class="ui button green show-modal gt-p-3" data-modal="#adopt-unadopted-modal-{{$dirI}}">{{svg "octicon-plus"}} {{$.locale.Tr "repo.adopt_preexisting_label"}}</button>
|
||||||
|
<div class="ui g-modal-confirm modal" id="adopt-unadopted-modal-{{$dirI}}">
|
||||||
|
<div class="header">
|
||||||
|
<span class="label">{{$.locale.Tr "repo.adopt_preexisting"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{$.locale.Tr "repo.adopt_preexisting_content" $dir}}</p>
|
||||||
|
</div>
|
||||||
|
<form class="ui form" method="POST" action="{{AppSubUrl}}/admin/repos/unadopted">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<input type="hidden" name="id" value="{{$dir}}">
|
||||||
|
<input type="hidden" name="action" value="adopt">
|
||||||
|
<input type="hidden" name="q" value="{{$.Keyword}}">
|
||||||
|
<input type="hidden" name="page" value="{{$.CurrentPage}}">
|
||||||
|
{{template "base/modal_actions_confirm" (dict "locale" $.locale)}}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<button class="ui button red show-modal gt-p-3" data-modal="#delete-unadopted-modal-{{$dirI}}">{{svg "octicon-x"}} {{$.locale.Tr "repo.delete_preexisting_label"}}</button>
|
||||||
|
<div class="ui g-modal-confirm modal" id="delete-unadopted-modal-{{$dirI}}">
|
||||||
|
<div class="header">
|
||||||
|
<span class="label">{{$.locale.Tr "repo.delete_preexisting"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{$.locale.Tr "repo.delete_preexisting_content" $dir}}</p>
|
||||||
|
</div>
|
||||||
|
<form class="ui form" method="POST" action="{{AppSubUrl}}/admin/repos/unadopted">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<input type="hidden" name="id" value="{{$dir}}">
|
||||||
|
<input type="hidden" name="action" value="delete">
|
||||||
|
<input type="hidden" name="q" value="{{$.Keyword}}">
|
||||||
|
<input type="hidden" name="page" value="{{$.CurrentPage}}">
|
||||||
|
{{template "base/modal_actions_confirm" (dict "locale" $.locale "ModalButtonColors" "yellow")}}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
{{else}}
|
||||||
|
<div class="item">
|
||||||
|
{{.locale.Tr "admin.repos.unadopted.no_more"}}
|
||||||
|
</div>
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,5 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin runners")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
{{template "shared/actions/runner_edit" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,66 @@
|
|||||||
|
<div class="item">
|
||||||
|
<div class="gt-df gt-ac">
|
||||||
|
<div class="icon gt-ml-3 gt-mr-3">
|
||||||
|
{{if eq .Process.Type "request"}}
|
||||||
|
{{svg "octicon-globe" 16}}
|
||||||
|
{{else if eq .Process.Type "system"}}
|
||||||
|
{{svg "octicon-cpu" 16}}
|
||||||
|
{{else if eq .Process.Type "normal"}}
|
||||||
|
{{svg "octicon-terminal" 16}}
|
||||||
|
{{else}}
|
||||||
|
{{svg "octicon-code" 16}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="content gt-f1">
|
||||||
|
<div class="header">{{.Process.Description}}</div>
|
||||||
|
<div class="description">{{if ne .Process.Type "none"}}{{TimeSince .Process.Start .root.locale}}{{end}}</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{if or (eq .Process.Type "request") (eq .Process.Type "normal")}}
|
||||||
|
<a class="delete-button icon" href="" data-url="{{.root.Link}}/cancel/{{.Process.PID}}" data-id="{{.Process.PID}}" data-name="{{.Process.Description}}">{{svg "octicon-trash" 16 "text-red"}}</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{if .Process.Stacks}}
|
||||||
|
<div class="divided list gt-ml-3">
|
||||||
|
{{range .Process.Stacks}}
|
||||||
|
<div class="item">
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<div class="gt-dif content">
|
||||||
|
<div class="header gt-ml-3">
|
||||||
|
<span class="icon gt-mr-3">{{svg "octicon-code" 16}}</span>{{.Description}}{{if gt .Count 1}} * {{.Count}}{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
{{range .Labels}}
|
||||||
|
<div class="ui label">{{.Name}}<div class="detail">{{.Value}}</div></div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</summary>
|
||||||
|
<div class="list">
|
||||||
|
{{range .Entry}}
|
||||||
|
<div class="item gt-df gt-ac">
|
||||||
|
<span class="icon gt-mr-4">{{svg "octicon-dot-fill" 16}}</span>
|
||||||
|
<div class="content gt-f1">
|
||||||
|
<div class="header"><code>{{.Function}}</code></div>
|
||||||
|
<div class="description"><code>{{.File}}:{{.Line}}</code></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{if .Process.Children}}
|
||||||
|
<div class="divided list">
|
||||||
|
{{range .Process.Children}}
|
||||||
|
{{template "admin/stacktrace-row" dict "Process" . "root" $.root}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
</div>
|
@ -0,0 +1,48 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
|
||||||
|
<div class="gt-df gt-ac">
|
||||||
|
<div class="gt-f1">
|
||||||
|
<div class="ui compact small menu">
|
||||||
|
<a class="{{if eq .ShowGoroutineList "process"}}active {{end}}item" href="{{.Link}}?show=process">{{.locale.Tr "admin.monitor.process"}}</a>
|
||||||
|
<a class="{{if eq .ShowGoroutineList "stacktrace"}}active {{end}}item" href="{{.Link}}?show=stacktrace">{{.locale.Tr "admin.monitor.stacktrace"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form target="_blank" action="{{AppSubUrl}}/admin/monitor/diagnosis" class="ui form">
|
||||||
|
<div class="ui inline field">
|
||||||
|
<button class="ui primary small button">{{.locale.Tr "admin.monitor.download_diagnosis_report"}}</button>
|
||||||
|
<input name="seconds" size="3" maxlength="3" value="10"> {{.locale.Tr "tool.raw_seconds"}}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{printf "%d Goroutines" .GoroutineCount}}{{/* Goroutine is non-translatable*/}}
|
||||||
|
{{- if .ProcessCount -}}, {{.locale.Tr "admin.monitor.processes_count" .ProcessCount}}{{- end -}}
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
{{if .ProcessStacks}}
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<div class="ui relaxed divided list">
|
||||||
|
{{range .ProcessStacks}}
|
||||||
|
{{template "admin/stacktrace-row" dict "Process" . "root" $}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm delete modal">
|
||||||
|
<div class="header">
|
||||||
|
{{.locale.Tr "admin.monitor.process.cancel"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{$.locale.Tr "admin.monitor.process.cancel_notices" `<span class="name"></span>` | Safe}}</p>
|
||||||
|
<p>{{$.locale.Tr "admin.monitor.process.cancel_desc"}}</p>
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,17 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.dashboard.statistic"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
{{range $statsKey := .StatsKeys}}
|
||||||
|
<tr>
|
||||||
|
<td width="200">{{$statsKey}}</td>
|
||||||
|
<td>{{index $.StatsCounter $statsKey}}</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,216 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin edit user")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.users.edit_account"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{template "base/disable_form_autofill"}}
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<div class="field {{if .Err_UserName}}error{{end}}">
|
||||||
|
<label for="user_name">{{.locale.Tr "username"}}</label>
|
||||||
|
<input id="user_name" name="user_name" value="{{.User.Name}}" autofocus {{if not .User.IsLocal}}disabled{{end}} maxlength="40">
|
||||||
|
</div>
|
||||||
|
<!-- Types and name -->
|
||||||
|
<div class="inline required field {{if .Err_LoginType}}error{{end}}">
|
||||||
|
<label>{{.locale.Tr "admin.users.auth_source"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="login_type" name="login_type" value="{{.LoginSource.Type.Int}}-{{.LoginSource.ID}}" required>
|
||||||
|
<div class="text">{{.locale.Tr "admin.users.local"}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="0-0">{{.locale.Tr "admin.users.local"}}</div>
|
||||||
|
{{range .Sources}}
|
||||||
|
<div class="item" data-value="{{.Type.Int}}-{{.ID}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field {{if .Err_Visibility}}error{{end}}">
|
||||||
|
<span class="inline required field"><label for="visibility">{{.locale.Tr "settings.visibility"}}</label></span>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
{{if .User.Visibility.IsPublic}}<input type="hidden" id="visibility" name="visibility" value="0">{{end}}
|
||||||
|
{{if .User.Visibility.IsLimited}}<input type="hidden" id="visibility" name="visibility" value="1">{{end}}
|
||||||
|
{{if .User.Visibility.IsPrivate}}<input type="hidden" id="visibility" name="visibility" value="2">{{end}}
|
||||||
|
<div class="text">
|
||||||
|
{{if .User.Visibility.IsPublic}}{{.locale.Tr "settings.visibility.public"}}{{end}}
|
||||||
|
{{if .User.Visibility.IsLimited}}{{.locale.Tr "settings.visibility.limited"}}{{end}}
|
||||||
|
{{if .User.Visibility.IsPrivate}}{{.locale.Tr "settings.visibility.private"}}{{end}}
|
||||||
|
</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range $mode := .AllowedUserVisibilityModes}}
|
||||||
|
{{if $mode.IsPublic}}
|
||||||
|
<div class="item" data-tooltip-content="{{$.locale.Tr "settings.visibility.public_tooltip"}}" data-value="0">{{$.locale.Tr "settings.visibility.public"}}</div>
|
||||||
|
{{else if $mode.IsLimited}}
|
||||||
|
<div class="item" data-tooltip-content="{{$.locale.Tr "settings.visibility.limited_tooltip"}}" data-value="1">{{$.locale.Tr "settings.visibility.limited"}}</div>
|
||||||
|
{{else if $mode.IsPrivate}}
|
||||||
|
<div class="item" data-tooltip-content="{{$.locale.Tr "settings.visibility.private_tooltip"}}" data-value="2">{{$.locale.Tr "settings.visibility.private"}}</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="required non-local field {{if .Err_LoginName}}error{{end}} {{if eq .User.LoginSource 0}}gt-hidden{{end}}">
|
||||||
|
<label for="login_name">{{.locale.Tr "admin.users.auth_login_name"}}</label>
|
||||||
|
<input id="login_name" name="login_name" value="{{.User.LoginName}}" autofocus>
|
||||||
|
</div>
|
||||||
|
<div class="field {{if .Err_FullName}}error{{end}}">
|
||||||
|
<label for="full_name">{{.locale.Tr "settings.full_name"}}</label>
|
||||||
|
<input id="full_name" name="full_name" value="{{.User.FullName}}" maxlength="100">
|
||||||
|
</div>
|
||||||
|
<div class="required field {{if .Err_Email}}error{{end}}">
|
||||||
|
<label for="email">{{.locale.Tr "email"}}</label>
|
||||||
|
<input id="email" name="email" type="email" value="{{.User.Email}}" autofocus required>
|
||||||
|
</div>
|
||||||
|
<div class="local field {{if .Err_Password}}error{{end}} {{if not (or (.User.IsLocal) (.User.IsOAuth2))}}gt-hidden{{end}}">
|
||||||
|
<label for="password">{{.locale.Tr "password"}}</label>
|
||||||
|
<input id="password" name="password" type="password" autocomplete="new-password">
|
||||||
|
<p class="help">{{.locale.Tr "admin.users.password_helper"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="field {{if .Err_Website}}error{{end}}">
|
||||||
|
<label for="website">{{.locale.Tr "settings.website"}}</label>
|
||||||
|
<input id="website" name="website" type="url" value="{{.User.Website}}" placeholder="e.g. http://mydomain.com or https://mydomain.com" maxlength="255">
|
||||||
|
</div>
|
||||||
|
<div class="field {{if .Err_Location}}error{{end}}">
|
||||||
|
<label for="location">{{.locale.Tr "settings.location"}}</label>
|
||||||
|
<input id="location" name="location" value="{{.User.Location}}" maxlength="50">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<div class="inline field {{if .Err_MaxRepoCreation}}error{{end}}">
|
||||||
|
<label for="max_repo_creation">{{.locale.Tr "admin.users.max_repo_creation"}}</label>
|
||||||
|
<input id="max_repo_creation" name="max_repo_creation" type="number" min="-1" value="{{.User.MaxRepoCreation}}">
|
||||||
|
<p class="help">{{.locale.Tr "admin.users.max_repo_creation_desc"}}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.is_activated"}}</strong></label>
|
||||||
|
<input name="active" type="checkbox" {{if .User.IsActive}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.prohibit_login"}}</strong></label>
|
||||||
|
<input name="prohibit_login" type="checkbox" {{if .User.ProhibitLogin}}checked{{end}} {{if (eq .User.ID .SignedUserID)}}disabled{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.is_admin"}}</strong></label>
|
||||||
|
<input name="admin" type="checkbox" {{if .User.IsAdmin}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.is_restricted"}}</strong></label>
|
||||||
|
<input name="restricted" type="checkbox" {{if .User.IsRestricted}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if DisableGitHooks}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox" data-tooltip-content="{{.locale.Tr "admin.users.allow_git_hook_tooltip"}}">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.allow_git_hook"}}</strong></label>
|
||||||
|
<input name="allow_git_hook" type="checkbox" {{if .User.CanEditGitHook}}checked{{end}} {{if DisableGitHooks}}disabled{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if or (DisableImportLocal) (.DisableMigrations)}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.allow_import_local"}}</strong></label>
|
||||||
|
<input name="allow_import_local" type="checkbox" {{if .User.CanImportLocal}}checked{{end}} {{if DisableImportLocal}}disabled{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{if not .DisableRegularOrgCreation}}
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.allow_create_organization"}}</strong></label>
|
||||||
|
<input name="allow_create_organization" type="checkbox" {{if .User.CanCreateOrganization}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{if .TwoFactorEnabled}}
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.reset_2fa"}}</strong></label>
|
||||||
|
<input name="reset_2fa" type="checkbox">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<button class="ui green button">{{.locale.Tr "admin.users.update_profile"}}</button>
|
||||||
|
<button class="ui red button show-modal" data-modal="#delete-user-modal">{{.locale.Tr "admin.users.delete_account"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "settings.avatar"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form" action="{{.Link}}/avatar" method="post" enctype="multipart/form-data">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
{{if not (DisableGravatar $.Context)}}
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input name="source" value="lookup" type="radio" {{if not .User.UseCustomAvatar}}checked{{end}}>
|
||||||
|
<label>{{.locale.Tr "settings.lookup_avatar_by_mail"}}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field gt-pl-4 {{if .Err_Gravatar}}error{{end}}">
|
||||||
|
<label for="gravatar">Avatar {{.locale.Tr "email"}}</label>
|
||||||
|
<input id="gravatar" name="gravatar" value="{{.User.AvatarEmail}}">
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input name="source" value="local" type="radio" {{if .User.UseCustomAvatar}}checked{{end}}>
|
||||||
|
<label>{{.locale.Tr "settings.enable_custom_avatar"}}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field gt-pl-4">
|
||||||
|
<label for="avatar">{{.locale.Tr "settings.choose_new_avatar"}}</label>
|
||||||
|
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<button class="ui green button">{{$.locale.Tr "settings.update_avatar"}}</button>
|
||||||
|
<a class="ui red button delete-post" data-request-url="{{.Link}}/avatar/delete" data-done-url="{{.Link}}">{{$.locale.Tr "settings.delete_current_avatar"}}</a>{{/* TODO: Convert links without href to buttons for a11y */}}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm delete modal" id="delete-user-modal">
|
||||||
|
<div class="header">
|
||||||
|
{{svg "octicon-trash"}}
|
||||||
|
{{.locale.Tr "settings.delete_account_title"}}
|
||||||
|
</div>
|
||||||
|
<form class="ui form" method="POST" action="{{.Link}}/delete">
|
||||||
|
<div class="content">
|
||||||
|
<p>{{.locale.Tr "settings.delete_account_desc"}}</p>
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="purge">{{.locale.Tr "admin.users.purge"}}</label>
|
||||||
|
<input name="purge" type="checkbox">
|
||||||
|
</div>
|
||||||
|
<p class="help">{{.locale.Tr "admin.users.purge_help"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,109 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.users.user_manage_panel"}} ({{.locale.Tr "admin.total" .Total}})
|
||||||
|
<div class="ui right">
|
||||||
|
<a class="ui primary tiny button" href="{{AppSubUrl}}/admin/users/new">{{.locale.Tr "admin.users.new_account"}}</a>
|
||||||
|
</div>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form ignore-dirty" id="user-list-search-form">
|
||||||
|
|
||||||
|
<!-- Right Menu -->
|
||||||
|
<div class="ui right floated secondary filter menu">
|
||||||
|
<!-- Status Filter Menu Item -->
|
||||||
|
<div class="ui dropdown type jump item">
|
||||||
|
<span class="text">{{.locale.Tr "admin.users.list_status_filter.menu_text"}} {{svg "octicon-triangle-down" 14 "dropdown icon"}}</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="item j-reset-status-filter">{{.locale.Tr "admin.users.list_status_filter.reset"}}</a>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_admin]" value="1"> {{.locale.Tr "admin.users.list_status_filter.is_admin"}}</label>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_admin]" value="0"> {{.locale.Tr "admin.users.list_status_filter.not_admin"}}</label>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_active]" value="1"> {{.locale.Tr "admin.users.list_status_filter.is_active"}}</label>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_active]" value="0"> {{.locale.Tr "admin.users.list_status_filter.not_active"}}</label>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_restricted]" value="0"> {{.locale.Tr "admin.users.list_status_filter.not_restricted"}}</label>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_restricted]" value="1"> {{.locale.Tr "admin.users.list_status_filter.is_restricted"}}</label>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_prohibit_login]" value="0"> {{.locale.Tr "admin.users.list_status_filter.not_prohibit_login"}}</label>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_prohibit_login]" value="1"> {{.locale.Tr "admin.users.list_status_filter.is_prohibit_login"}}</label>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_2fa_enabled]" value="1"> {{.locale.Tr "admin.users.list_status_filter.is_2fa_enabled"}}</label>
|
||||||
|
<label class="item"><input type="radio" name="status_filter[is_2fa_enabled]" value="0"> {{.locale.Tr "admin.users.list_status_filter.not_2fa_enabled"}}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Sort Menu Item -->
|
||||||
|
<div class="ui dropdown type jump item">
|
||||||
|
<span class="text">
|
||||||
|
{{.locale.Tr "repo.issues.filter_sort"}} {{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<button class="item" name="sort" value="oldest">{{.locale.Tr "repo.issues.filter_sort.oldest"}}</button>
|
||||||
|
<button class="item" name="sort" value="newest">{{.locale.Tr "repo.issues.filter_sort.latest"}}</button>
|
||||||
|
<button class="item" name="sort" value="alphabetically">{{.locale.Tr "repo.issues.label.filter_sort.alphabetically"}}</button>
|
||||||
|
<button class="item" name="sort" value="reversealphabetically">{{.locale.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</button>
|
||||||
|
<button class="item" name="sort" value="recentupdate">{{.locale.Tr "repo.issues.filter_sort.recentupdate"}}</button>
|
||||||
|
<button class="item" name="sort" value="leastupdate">{{.locale.Tr "repo.issues.filter_sort.leastupdate"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Search Text -->
|
||||||
|
<div class="ui fluid action input" style="max-width: 70%;">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<table class="ui very basic striped table unstackable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th data-sortt-asc="oldest" data-sortt-desc="newest">ID{{SortArrow "oldest" "newest" .SortType false}}</th>
|
||||||
|
<th data-sortt-asc="alphabetically" data-sortt-desc="reversealphabetically" data-sortt-default="true">
|
||||||
|
{{.locale.Tr "admin.users.name"}}
|
||||||
|
{{SortArrow "alphabetically" "reversealphabetically" $.SortType true}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "email"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.activated"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.admin"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.restricted"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.2fa"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.repos"}}</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.created"}}</th>
|
||||||
|
<th data-sortt-asc="lastlogin" data-sortt-desc="reverselastlogin">
|
||||||
|
{{.locale.Tr "admin.users.last_login"}}
|
||||||
|
{{SortArrow "lastlogin" "reverselastlogin" $.SortType false}}
|
||||||
|
</th>
|
||||||
|
<th>{{.locale.Tr "admin.users.edit"}}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range .Users}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.ID}}</td>
|
||||||
|
<td><a href="{{.HomeLink}}">{{.Name}}</a></td>
|
||||||
|
<td><span class="text truncate email">{{.Email}}</span></td>
|
||||||
|
<td>{{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td>
|
||||||
|
<td>{{if .IsAdmin}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td>
|
||||||
|
<td>{{if .IsRestricted}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td>
|
||||||
|
<td>{{if index $.UsersTwoFaStatus .ID}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</td>
|
||||||
|
<td>{{.NumRepos}}</td>
|
||||||
|
<td>{{DateTime "short" .CreatedUnix}}</td>
|
||||||
|
{{if .LastLoginUnix}}
|
||||||
|
<td>{{DateTime "short" .LastLoginUnix}}</td>
|
||||||
|
{{else}}
|
||||||
|
<td><span>{{$.locale.Tr "admin.users.never_login"}}</span></td>
|
||||||
|
{{end}}
|
||||||
|
<td><a href="{{$.Link}}/{{.ID}}">{{svg "octicon-pencil"}}</a></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,90 @@
|
|||||||
|
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin new user")}}
|
||||||
|
<div class="admin-setting-content">
|
||||||
|
<h4 class="ui top attached header">
|
||||||
|
{{.locale.Tr "admin.users.new_account"}}
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{template "base/disable_form_autofill"}}
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<!-- Types and name -->
|
||||||
|
<div class="inline required field {{if .Err_LoginType}}error{{end}}">
|
||||||
|
<label>{{.locale.Tr "admin.users.auth_source"}}</label>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="login_type" name="login_type" value="{{.login_type}}" data-password="required" required>
|
||||||
|
<div class="text">{{.locale.Tr "admin.users.local"}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="0-0">{{.locale.Tr "admin.users.local"}}</div>
|
||||||
|
{{range .Sources}}
|
||||||
|
<div class="item" data-value="{{.Type.Int}}-{{.ID}}">{{.Name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field {{if .Err_Visibility}}error{{end}}">
|
||||||
|
<span class="inline required field"><label for="visibility">{{.locale.Tr "settings.visibility"}}</label></span>
|
||||||
|
<div class="ui selection type dropdown">
|
||||||
|
<input type="hidden" id="visibility" name="visibility" value="{{if .visibility}}{{.visibility}}{{else}}{{printf "%d" .DefaultUserVisibilityMode}}{{end}}">
|
||||||
|
<div class="text">
|
||||||
|
{{if .DefaultUserVisibilityMode.IsPublic}}{{.locale.Tr "settings.visibility.public"}}{{end}}
|
||||||
|
{{if .DefaultUserVisibilityMode.IsLimited}}{{.locale.Tr "settings.visibility.limited"}}{{end}}
|
||||||
|
{{if .DefaultUserVisibilityMode.IsPrivate}}{{.locale.Tr "settings.visibility.private"}}{{end}}
|
||||||
|
</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range $mode := .AllowedUserVisibilityModes}}
|
||||||
|
{{if $mode.IsPublic}}
|
||||||
|
<div class="item" data-tooltip-content="{{$.locale.Tr "settings.visibility.public_tooltip"}}" data-value="0">{{$.locale.Tr "settings.visibility.public"}}</div>
|
||||||
|
{{else if $mode.IsLimited}}
|
||||||
|
<div class="item" data-tooltip-content="{{$.locale.Tr "settings.visibility.limited_tooltip"}}" data-value="1">{{$.locale.Tr "settings.visibility.limited"}}</div>
|
||||||
|
{{else if $mode.IsPrivate}}
|
||||||
|
<div class="item" data-tooltip-content="{{$.locale.Tr "settings.visibility.private_tooltip"}}" data-value="2">{{$.locale.Tr "settings.visibility.private"}}</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="required non-local field {{if .Err_LoginName}}error{{end}} {{if eq .login_type "0-0"}}gt-hidden{{end}}">
|
||||||
|
<label for="login_name">{{.locale.Tr "admin.users.auth_login_name"}}</label>
|
||||||
|
<input id="login_name" name="login_name" value="{{.login_name}}">
|
||||||
|
</div>
|
||||||
|
<div class="required field {{if .Err_UserName}}error{{end}}">
|
||||||
|
<label for="user_name">{{.locale.Tr "username"}}</label>
|
||||||
|
<input id="user_name" type="text" name="user_name" value="{{.user_name}}" autofocus required maxlength="40">
|
||||||
|
</div>
|
||||||
|
<div class="required field {{if .Err_Email}}error{{end}}">
|
||||||
|
<label for="email">{{.locale.Tr "email"}}</label>
|
||||||
|
<input id="email" name="email" type="email" value="{{.email}}" required>
|
||||||
|
</div>
|
||||||
|
<div class="required local field {{if .Err_Password}}error{{end}} {{if not (eq .login_type "0-0")}}gt-hidden{{end}}">
|
||||||
|
<label for="password">{{.locale.Tr "password"}}</label>
|
||||||
|
<input id="password" name="password" type="password" autocomplete="new-password" value="{{.password}}" {{if eq .login_type "0-0"}}required{{end}}>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field local {{if ne .login_type "0-0"}}gt-hidden{{end}}">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "auth.allow_password_change"}}</strong></label>
|
||||||
|
<input name="must_change_password" type="checkbox" checked>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Send register notify e-mail -->
|
||||||
|
{{if .CanSendEmail}}
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label><strong>{{.locale.Tr "admin.users.send_register_notify"}}</strong></label>
|
||||||
|
<input name="send_notify" type="checkbox" {{if .send_notify}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<button class="ui green button">{{.locale.Tr "admin.users.new_account"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "admin/layout_footer" .}}
|
@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Links for {{.PackageDescriptor.Package.Name}}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Links for {{.PackageDescriptor.Package.Name}}</h1>
|
||||||
|
{{range .PackageDescriptors}}
|
||||||
|
{{$p := .}}
|
||||||
|
{{range .Files}}
|
||||||
|
<a href="{{$.RegistryURL}}/files/{{$p.Package.LowerName}}/{{$p.Version.Version}}/{{.File.Name}}#sha256-{{.Blob.HashSHA256}}"{{if $p.Metadata.RequiresPython}} data-requires-python="{{$p.Metadata.RequiresPython}}"{{end}}>{{.File.Name}}</a><br>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,20 @@
|
|||||||
|
{{if .Flash.ErrorMsg}}
|
||||||
|
<div class="ui negative message flash-message flash-error">
|
||||||
|
<p>{{.Flash.ErrorMsg | Str2html}}</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{if .Flash.SuccessMsg}}
|
||||||
|
<div class="ui positive message flash-message flash-success">
|
||||||
|
<p>{{.Flash.SuccessMsg | Str2html}}</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{if .Flash.InfoMsg}}
|
||||||
|
<div class="ui info message flash-message flash-info">
|
||||||
|
<p>{{.Flash.InfoMsg | Str2html}}</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{if .Flash.WarningMsg}}
|
||||||
|
<div class="ui warning message flash-message flash-warning">
|
||||||
|
<p>{{.Flash.WarningMsg | Str2html}}</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
@ -0,0 +1,7 @@
|
|||||||
|
{{.Message}}
|
||||||
|
<details>
|
||||||
|
<summary>{{.Summary}}</summary>
|
||||||
|
<code>
|
||||||
|
{{.Details | Str2html}}
|
||||||
|
</code>
|
||||||
|
</details>
|
@ -0,0 +1,31 @@
|
|||||||
|
{{/*
|
||||||
|
Why we need to disable form autofill:
|
||||||
|
1. Many pages contain different password inputs for different usages, eg: repo setting, autofill will make a mess.
|
||||||
|
2. We have `areYouSure` confirm dialog if a user leaves a pages without submit.
|
||||||
|
Autofill will make the form changed even if the user didn't input anything. Then the user keeps seeing annoying confirm dialog.
|
||||||
|
|
||||||
|
In history, Gitea put `<input class="fake" type="password">` in forms to bypass the autofill,
|
||||||
|
but there were still many forms suffered the autofill problem.
|
||||||
|
|
||||||
|
Now we improve it.
|
||||||
|
|
||||||
|
Solutions which do NOT work:
|
||||||
|
1. Adding `autocomplete=off` doesn't help. New Chrome completely ignores it.
|
||||||
|
2. Use a JavaScript to run in a few seconds later after the page is loaded to process the autofilled inputs, it doesn't work.
|
||||||
|
Because for security reason, the inputs won't be filled before the user makes an interaction in the page.
|
||||||
|
So we can not predict the correct time to run the JavaScript code.
|
||||||
|
|
||||||
|
Solutions which work:
|
||||||
|
1. Some hacky methods like: https://github.com/matteobad/detect-autofill
|
||||||
|
2. This solution: use invisible inputs. Be aware of:
|
||||||
|
(a) The inputs must be at the beginning of the form, and can not be hidden.
|
||||||
|
(b) The input for username must have a valid name.
|
||||||
|
(c) There should be no negative word (eg: fake) in the `name` attribute.
|
||||||
|
(d) Chrome seems to use a weighted algorithm to choose an input to fill text, so the using "username" as input name is better than using "user".
|
||||||
|
We make the names of these dummy inputs begin with an underline to indicate it is for special usage,
|
||||||
|
and these dummy form values won't be used by backend code.
|
||||||
|
*/}}
|
||||||
|
<div class="autofill-dummy" aria-hidden="true">
|
||||||
|
<input type="text" name="_autofill_dummy_username" class="ays-ignore" tabindex="-1">
|
||||||
|
<input type="password" name="_autofill_dummy_password" class="ays-ignore" tabindex="-1">
|
||||||
|
</div>
|
@ -0,0 +1,31 @@
|
|||||||
|
{{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" .}}
|
||||||
|
|
||||||
|
{{template "base/footer_content" .}}
|
||||||
|
|
||||||
|
<!-- Third-party libraries -->
|
||||||
|
{{if .EnableCaptcha}}
|
||||||
|
{{if eq .CaptchaType "recaptcha"}}
|
||||||
|
<script src='{{URLJoin .RecaptchaURL "api.js"}}'></script>
|
||||||
|
{{end}}
|
||||||
|
{{if eq .CaptchaType "hcaptcha"}}
|
||||||
|
<script src='https://hcaptcha.com/1/api.js'></script>
|
||||||
|
{{end}}
|
||||||
|
{{if eq .CaptchaType "cfturnstile"}}
|
||||||
|
<script src='https://challenges.cloudflare.com/turnstile/v0/api.js'></script>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
<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>
|
@ -0,0 +1,30 @@
|
|||||||
|
<footer class="page-footer" role="group" aria-label="{{.locale.Tr "aria.footer"}}">
|
||||||
|
<div class="left-links" role="contentinfo" aria-label="{{.locale.Tr "aria.footer.software"}}">
|
||||||
|
<a target="_blank" rel="noopener noreferrer" href="https://gitea.io">{{.locale.Tr "powered_by" "Gitea"}}</a>
|
||||||
|
{{if (or .ShowFooterVersion .PageIsAdmin)}}
|
||||||
|
{{.locale.Tr "version"}}:
|
||||||
|
{{if .IsAdmin}}
|
||||||
|
<a href="{{AppSubUrl}}/admin/config">{{AppVer}}</a>
|
||||||
|
{{else}}
|
||||||
|
{{AppVer}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{if and .TemplateLoadTimes ShowFooterTemplateLoadTime}}
|
||||||
|
{{.locale.Tr "page"}}: <strong>{{LoadTimes .PageStartTime}}</strong>
|
||||||
|
{{.locale.Tr "template"}}{{if .TemplateName}} {{.TemplateName}}{{end}}: <strong>{{call .TemplateLoadTimes}}</strong>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="right-links" role="group" aria-label="{{.locale.Tr "aria.footer.links"}}">
|
||||||
|
<div class="ui dropdown upward language">
|
||||||
|
<span class="flex-text-inline">{{svg "octicon-globe" 14}} {{.locale.LangName}}</span>
|
||||||
|
<div class="menu language-menu">
|
||||||
|
{{range .AllLangs}}
|
||||||
|
<a lang="{{.Lang}}" data-url="{{AppSubUrl}}/?lang={{.Lang}}" class="item {{if eq $.locale.Lang .Lang}}active selected{{end}}">{{.Name}}</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="{{AssetUrlPrefix}}/js/licenses.txt">{{.locale.Tr "licenses"}}</a>
|
||||||
|
{{if .EnableSwagger}}<a href="{{AppSubUrl}}/api/swagger">API</a>{{end}}
|
||||||
|
{{template "custom/extra_links_footer" .}}
|
||||||
|
</div>
|
||||||
|
</footer>
|
@ -0,0 +1,84 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="{{.locale.Lang}}" class="theme-{{if .SignedUser.Theme}}{{.SignedUser.Theme}}{{else}}{{DefaultTheme}}{{end}}">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>{{if .Title}}{{.Title | RenderEmojiPlain}} - {{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">
|
||||||
|
{{template "base/head_script" .}}
|
||||||
|
<noscript>
|
||||||
|
<style>
|
||||||
|
.dropdown:hover > .menu { display: block; }
|
||||||
|
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
|
||||||
|
</style>
|
||||||
|
</noscript>
|
||||||
|
{{if .PageIsUserProfile}}
|
||||||
|
<meta property="og:title" content="{{.ContextUser.DisplayName}}">
|
||||||
|
<meta property="og:type" content="profile">
|
||||||
|
<meta property="og:image" content="{{.ContextUser.AvatarLink $.Context}}">
|
||||||
|
<meta property="og:url" content="{{.ContextUser.HTMLURL}}">
|
||||||
|
{{if .ContextUser.Description}}
|
||||||
|
<meta property="og:description" content="{{.ContextUser.Description}}">
|
||||||
|
{{end}}
|
||||||
|
{{else if .Repository}}
|
||||||
|
{{if .Issue}}
|
||||||
|
<meta property="og:title" content="{{.Issue.Title}}">
|
||||||
|
<meta property="og:url" content="{{.Issue.HTMLURL}}">
|
||||||
|
{{if .Issue.Content}}
|
||||||
|
<meta property="og:description" content="{{.Issue.Content}}">
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
<meta property="og:title" content="{{.Repository.Name}}">
|
||||||
|
<meta property="og:url" content="{{.Repository.HTMLURL}}">
|
||||||
|
{{if .Repository.Description}}
|
||||||
|
<meta property="og:description" content="{{.Repository.Description}}">
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
<meta property="og:type" content="object">
|
||||||
|
{{if (.Repository.AvatarLink $.Context)}}
|
||||||
|
<meta property="og:image" content="{{.Repository.AvatarLink $.Context}}">
|
||||||
|
{{else}}
|
||||||
|
<meta property="og:image" content="{{.Repository.Owner.AvatarLink $.Context}}">
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
<meta property="og:title" content="{{AppName}}">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:image" content="{{AssetUrlPrefix}}/img/logo.png">
|
||||||
|
<meta property="og:url" content="{{AppUrl}}">
|
||||||
|
<meta property="og:description" content="{{MetaDescription}}">
|
||||||
|
{{end}}
|
||||||
|
<meta property="og:site_name" content="{{AppName}}">
|
||||||
|
{{template "base/head_style" .}}
|
||||||
|
{{template "custom/header" .}}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{template "custom/body_outer_pre" .}}
|
||||||
|
|
||||||
|
<div class="full height">
|
||||||
|
<noscript>{{.locale.Tr "enable_javascript"}}</noscript>
|
||||||
|
|
||||||
|
{{template "custom/body_inner_pre" .}}
|
||||||
|
|
||||||
|
{{if not .PageIsInstall}}
|
||||||
|
{{template "base/head_navbar" .}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{if false}}
|
||||||
|
{{/* to make html structure "likely" complete to prevent IDE warnings */}}
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{{end}}
|
@ -0,0 +1,205 @@
|
|||||||
|
{{$notificationUnreadCount := 0}}
|
||||||
|
{{if and .IsSigned .NotificationUnreadCount}}
|
||||||
|
{{$notificationUnreadCount = call .NotificationUnreadCount}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<nav id="navbar" class="ui secondary stackable menu" aria-label="{{.locale.Tr "aria.navbar"}}">
|
||||||
|
<div class="item">
|
||||||
|
<!-- the logo -->
|
||||||
|
<a href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{.locale.Tr "dashboard"}}{{else}}{{.locale.Tr "home"}}{{end}}">
|
||||||
|
<img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{.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 navbar-mobile-right gt-gap-2">
|
||||||
|
{{if .IsSigned}}
|
||||||
|
<a class="item gt-mx-0 gt-p-3" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{.locale.Tr "notifications"}}" aria-label="{{.locale.Tr "notifications"}}">
|
||||||
|
<div class="gt-relative">
|
||||||
|
{{svg "octicon-bell"}}
|
||||||
|
<span class="notification_count{{if not $notificationUnreadCount}} gt-hidden{{end}}">{{$notificationUnreadCount}}</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
<button class="item ui icon mini button gt-p-3 gt-m-0" id="navbar-expand-toggle">{{svg "octicon-three-bars"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- navbar links -->
|
||||||
|
{{if and .IsSigned .MustChangePassword}}
|
||||||
|
{{/* No links */}}
|
||||||
|
{{else if .IsSigned}}
|
||||||
|
{{if not .UnitIssuesGlobalDisabled}}
|
||||||
|
<a class="item{{if .PageIsIssues}} active{{end}}" href="{{AppSubUrl}}/issues">{{.locale.Tr "issues"}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{if not .UnitPullsGlobalDisabled}}
|
||||||
|
<a class="item{{if .PageIsPulls}} active{{end}}" href="{{AppSubUrl}}/pulls">{{.locale.Tr "pull_requests"}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{if not (and .UnitIssuesGlobalDisabled .UnitPullsGlobalDisabled)}}
|
||||||
|
{{if .ShowMilestonesDashboardPage}}
|
||||||
|
<a class="item{{if .PageIsMilestonesDashboard}} active{{end}}" href="{{AppSubUrl}}/milestones">{{.locale.Tr "milestones"}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{.locale.Tr "explore"}}</a>
|
||||||
|
{{else if .IsLandingPageOrganizations}}
|
||||||
|
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/organizations">{{.locale.Tr "explore"}}</a>
|
||||||
|
{{else}}
|
||||||
|
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{.locale.Tr "explore"}}</a>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{template "custom/extra_links" .}}
|
||||||
|
|
||||||
|
{{if not .IsSigned}}
|
||||||
|
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">{{.locale.Tr "help"}}</a>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<!-- the full dropdown menus -->
|
||||||
|
<div class="right menu">
|
||||||
|
{{if and .IsSigned .MustChangePassword}}
|
||||||
|
<div class="ui dropdown jump item" data-tooltip-content="{{.locale.Tr "user_profile_and_more"}}">
|
||||||
|
<span class="text gt-df gt-ac">
|
||||||
|
{{avatar $.Context .SignedUser 24 "gt-mr-2"}}
|
||||||
|
<span class="mobile-only gt-ml-2">{{.SignedUser.Name}}</span>
|
||||||
|
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
|
||||||
|
</span>
|
||||||
|
<div class="menu user-menu">
|
||||||
|
<div class="ui header">
|
||||||
|
{{.locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="divider"></div>
|
||||||
|
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout" data-redirect="{{AppSubUrl}}/">
|
||||||
|
{{svg "octicon-sign-out"}}
|
||||||
|
{{.locale.Tr "sign_out"}}
|
||||||
|
</a>
|
||||||
|
</div><!-- end content avatar menu -->
|
||||||
|
</div><!-- end dropdown avatar menu -->
|
||||||
|
{{else if .IsSigned}}
|
||||||
|
{{if EnableTimetracking}}
|
||||||
|
<a class="active-stopwatch-trigger item ui gt-mx-0{{if not .ActiveStopwatch}} gt-hidden{{end}}" href="{{.ActiveStopwatch.IssueLink}}" title="{{.locale.Tr "active_stopwatch"}}">
|
||||||
|
<div class="gt-relative">
|
||||||
|
{{svg "octicon-stopwatch"}}
|
||||||
|
<span class="header-stopwatch-dot"></span>
|
||||||
|
</div>
|
||||||
|
<span class="mobile-only gt-ml-2">{{.locale.Tr "active_stopwatch"}}</span>
|
||||||
|
</a>
|
||||||
|
<div class="active-stopwatch-popup tippy-target gt-p-3">
|
||||||
|
<div class="gt-df gt-ac">
|
||||||
|
<a class="stopwatch-link gt-df gt-ac" href="{{.ActiveStopwatch.IssueLink}}">
|
||||||
|
{{svg "octicon-issue-opened" 16 "gt-mr-3"}}
|
||||||
|
<span class="stopwatch-issue">{{.ActiveStopwatch.RepoSlug}}#{{.ActiveStopwatch.IssueIndex}}</span>
|
||||||
|
<span class="ui primary label stopwatch-time gt-my-0 gt-mx-4" data-seconds="{{.ActiveStopwatch.Seconds}}">
|
||||||
|
{{if .ActiveStopwatch}}{{Sec2Time .ActiveStopwatch.Seconds}}{{end}}
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
<form class="stopwatch-commit" method="POST" action="{{.ActiveStopwatch.IssueLink}}/times/stopwatch/toggle">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="ui button mini compact basic icon"
|
||||||
|
data-tooltip-content="{{.locale.Tr "repo.issues.stop_tracking"}}"
|
||||||
|
>{{svg "octicon-square-fill"}}</button>
|
||||||
|
</form>
|
||||||
|
<form class="stopwatch-cancel" method="POST" action="{{.ActiveStopwatch.IssueLink}}/times/stopwatch/cancel">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="ui button mini compact basic icon"
|
||||||
|
data-tooltip-content="{{.locale.Tr "repo.issues.cancel_tracking"}}"
|
||||||
|
>{{svg "octicon-trash"}}</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<a href="{{AppSubUrl}}/notifications" class="item not-mobile gt-mx-0" data-tooltip-content="{{.locale.Tr "notifications"}}" aria-label="{{.locale.Tr "notifications"}}">
|
||||||
|
<div class="gt-relative">
|
||||||
|
{{svg "octicon-bell"}}
|
||||||
|
<span class="notification_count{{if not $notificationUnreadCount}} gt-hidden{{end}}">{{$notificationUnreadCount}}</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="ui dropdown jump item gt-mx-0 gt-pr-3" data-tooltip-content="{{.locale.Tr "create_new"}}">
|
||||||
|
<span class="text">
|
||||||
|
{{svg "octicon-plus"}}
|
||||||
|
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
|
||||||
|
<span class="mobile-only">{{.locale.Tr "create_new"}}</span>
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="item" href="{{AppSubUrl}}/repo/create">
|
||||||
|
{{svg "octicon-plus"}} {{.locale.Tr "new_repo"}}
|
||||||
|
</a>
|
||||||
|
{{if not .DisableMigrations}}
|
||||||
|
<a class="item" href="{{AppSubUrl}}/repo/migrate">
|
||||||
|
{{svg "octicon-repo-push"}} {{.locale.Tr "new_migrate"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
{{if .SignedUser.CanCreateOrganization}}
|
||||||
|
<a class="item" href="{{AppSubUrl}}/org/create">
|
||||||
|
{{svg "octicon-organization"}} {{.locale.Tr "new_org"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
</div><!-- end content create new menu -->
|
||||||
|
</div><!-- end dropdown menu create new -->
|
||||||
|
|
||||||
|
<div class="ui dropdown jump item gt-mx-0 gt-pr-3" data-tooltip-content="{{.locale.Tr "user_profile_and_more"}}">
|
||||||
|
<span class="text gt-df gt-ac">
|
||||||
|
{{avatar $.Context .SignedUser 24 "gt-mr-2"}}
|
||||||
|
<span class="mobile-only gt-ml-2">{{.SignedUser.Name}}</span>
|
||||||
|
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
|
||||||
|
</span>
|
||||||
|
<div class="menu user-menu">
|
||||||
|
<div class="ui header">
|
||||||
|
{{.locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="divider"></div>
|
||||||
|
<a class="item" href="{{.SignedUser.HomeLink}}">
|
||||||
|
{{svg "octicon-person"}}
|
||||||
|
{{.locale.Tr "your_profile"}}
|
||||||
|
</a>
|
||||||
|
{{if not .DisableStars}}
|
||||||
|
<a class="item" href="{{.SignedUser.HomeLink}}?tab=stars">
|
||||||
|
{{svg "octicon-star"}}
|
||||||
|
{{.locale.Tr "your_starred"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
<a class="item" href="{{AppSubUrl}}/notifications/subscriptions">
|
||||||
|
{{svg "octicon-bell"}}
|
||||||
|
{{.locale.Tr "notification.subscriptions"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .PageIsUserSettings}}active {{end}}item" href="{{AppSubUrl}}/user/settings">
|
||||||
|
{{svg "octicon-tools"}}
|
||||||
|
{{.locale.Tr "your_settings"}}
|
||||||
|
</a>
|
||||||
|
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">
|
||||||
|
{{svg "octicon-question"}}
|
||||||
|
{{.locale.Tr "help"}}
|
||||||
|
</a>
|
||||||
|
{{if .IsAdmin}}
|
||||||
|
<div class="divider"></div>
|
||||||
|
|
||||||
|
<a class="{{if .PageIsAdmin}}active {{end}}item" href="{{AppSubUrl}}/admin">
|
||||||
|
{{svg "octicon-server"}}
|
||||||
|
{{.locale.Tr "admin_panel"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<div class="divider"></div>
|
||||||
|
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout" data-redirect="{{AppSubUrl}}/">
|
||||||
|
{{svg "octicon-sign-out"}}
|
||||||
|
{{.locale.Tr "sign_out"}}
|
||||||
|
</a>
|
||||||
|
</div><!-- end content avatar menu -->
|
||||||
|
</div><!-- end dropdown avatar menu -->
|
||||||
|
{{else}}
|
||||||
|
{{if .ShowRegistrationButton}}
|
||||||
|
<a class="item{{if .PageIsSignUp}} active{{end}}" href="{{AppSubUrl}}/user/sign_up">
|
||||||
|
{{svg "octicon-person"}} {{.locale.Tr "register"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
<a class="item{{if .PageIsSignIn}} active{{end}}" rel="nofollow" href="{{AppSubUrl}}/user/login{{if not .PageIsSignIn}}?redirect_to={{.CurrentURL}}{{end}}">
|
||||||
|
{{svg "octicon-sign-in"}} {{.locale.Tr "sign_in"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
</div><!-- end full right menu -->
|
||||||
|
</nav>
|
@ -0,0 +1,45 @@
|
|||||||
|
{{/*
|
||||||
|
==== DO NOT EDIT ====
|
||||||
|
If you are customizing Gitea, please do not change this file.
|
||||||
|
If you introduce mistakes in it, Gitea JavaScript code wouldn't run correctly.
|
||||||
|
*/}}
|
||||||
|
<script>
|
||||||
|
window.addEventListener('error', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);});
|
||||||
|
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}},
|
||||||
|
notificationSettings: {{NotificationSettings}}, {{/*a map provided by NewFuncMap in helper.go*/}}
|
||||||
|
enableTimeTracking: {{EnableTimetracking}},
|
||||||
|
{{if or .Participants .Assignees .MentionableTeams}}
|
||||||
|
tributeValues: 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: '{{.locale.Tr "copy_success"}}',
|
||||||
|
copy_error: '{{.locale.Tr "copy_error"}}',
|
||||||
|
error_occurred: '{{.locale.Tr "error.occurred"}}',
|
||||||
|
network_error: '{{.locale.Tr "error.network_error"}}',
|
||||||
|
remove_label_str: '{{.locale.Tr "remove_label_str"}}',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
{{/* 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>
|
@ -0,0 +1,8 @@
|
|||||||
|
<link rel="stylesheet" href="{{AssetUrlPrefix}}/css/index.css?v={{AssetVersion}}">
|
||||||
|
{{if .IsSigned}}
|
||||||
|
{{if ne .SignedUser.Theme "gitea"}}
|
||||||
|
<link rel="stylesheet" href="{{AssetUrlPrefix}}/css/theme-{{.SignedUser.Theme | PathEscape}}.css?v={{AssetVersion}}">
|
||||||
|
{{end}}
|
||||||
|
{{else if ne DefaultTheme "gitea"}}
|
||||||
|
<link rel="stylesheet" href="{{AssetUrlPrefix}}/css/theme-{{DefaultTheme | PathEscape}}.css?v={{AssetVersion}}">
|
||||||
|
{{end}}
|
@ -0,0 +1,38 @@
|
|||||||
|
{{/*
|
||||||
|
Template Attributes:
|
||||||
|
* locale
|
||||||
|
|
||||||
|
Two buttons (negative, positive):
|
||||||
|
* ModalButtonTypes: "yes" (default) or "confirm"
|
||||||
|
* ModalButtonColors: "green" (default) / "blue" / "yellow"
|
||||||
|
* ModalButtonCancelText
|
||||||
|
* ModalButtonOkText
|
||||||
|
|
||||||
|
Single danger button (GitHub-like):
|
||||||
|
* ModalButtonDangerText "This action will destroy your data"
|
||||||
|
|
||||||
|
The ".ok.button" and ".cancel.button" selectors are also used by Fomantic Modal internally
|
||||||
|
*/}}
|
||||||
|
<div class="actions">
|
||||||
|
{{if .ModalButtonDangerText}}
|
||||||
|
<button class="ui danger red ok button">{{.ModalButtonDangerText}}</button>
|
||||||
|
{{else}}
|
||||||
|
{{$textNegitive := .locale.Tr "modal.no"}}
|
||||||
|
{{$textPositive := .locale.Tr "modal.yes"}}
|
||||||
|
{{if eq .ModalButtonTypes "confirm"}}
|
||||||
|
{{$textNegitive = .locale.Tr "modal.cancel"}}
|
||||||
|
{{$textPositive = .locale.Tr "modal.confirm"}}
|
||||||
|
{{end}}
|
||||||
|
{{if .ModalButtonCancelText}}{{$textNegitive = .ModalButtonCancelText}}{{end}}
|
||||||
|
{{if .ModalButtonOkText}}{{$textPositive = .ModalButtonOkText}}{{end}}
|
||||||
|
|
||||||
|
{{$stylePositive := "green"}}
|
||||||
|
{{if eq .ModalButtonColors "blue"}}
|
||||||
|
{{$stylePositive = "blue"}}
|
||||||
|
{{else if eq .ModalButtonColors "yellow"}}
|
||||||
|
{{$stylePositive = "yellow"}}
|
||||||
|
{{end}}
|
||||||
|
<button class="ui basic cancel button">{{svg "octicon-x"}} {{$textNegitive}}</button>
|
||||||
|
<button class="ui {{$stylePositive}} ok button">{{svg "octicon-check"}} {{$textPositive}}</button>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
@ -0,0 +1,32 @@
|
|||||||
|
{{$paginationLink := .Page.GetParams}}
|
||||||
|
{{with .Page.Paginater}}
|
||||||
|
{{if gt .TotalPages 1}}
|
||||||
|
<div class="center page buttons">
|
||||||
|
<div class="ui borderless pagination menu">
|
||||||
|
<a class="{{if .IsFirst}}disabled{{end}} item navigation" {{if not .IsFirst}}href="{{$.Link}}{{if $paginationLink}}?{{$paginationLink}}{{end}}"{{end}}>
|
||||||
|
{{svg "gitea-double-chevron-left" 16 "gt-mr-2"}}
|
||||||
|
<span class="navigation_label">{{$.locale.Tr "admin.first_page"}}</span>
|
||||||
|
</a>
|
||||||
|
<a class="{{if not .HasPrevious}}disabled{{end}} item navigation" {{if .HasPrevious}}href="{{$.Link}}?page={{.Previous}}{{if $paginationLink}}&{{$paginationLink}}{{end}}"{{end}}>
|
||||||
|
{{svg "octicon-chevron-left" 16 "gt-mr-2"}}
|
||||||
|
<span class="navigation_label">{{$.locale.Tr "repo.issues.previous"}}</span>
|
||||||
|
</a>
|
||||||
|
{{range .Pages}}
|
||||||
|
{{if eq .Num -1}}
|
||||||
|
<a class="disabled item">...</a>
|
||||||
|
{{else}}
|
||||||
|
<a class="{{if .IsCurrent}}active {{end}}item gt-content-center" {{if not .IsCurrent}}href="{{$.Link}}?page={{.Num}}{{if $paginationLink}}&{{$paginationLink}}{{end}}"{{end}}>{{.Num}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
<a class="{{if not .HasNext}}disabled{{end}} item navigation" {{if .HasNext}}href="{{$.Link}}?page={{.Next}}{{if $paginationLink}}&{{$paginationLink}}{{end}}"{{end}}>
|
||||||
|
<span class="navigation_label">{{$.locale.Tr "repo.issues.next"}}</span>
|
||||||
|
{{svg "octicon-chevron-right" 16 "gt-ml-2"}}
|
||||||
|
</a>
|
||||||
|
<a class="{{if .IsLast}}disabled{{end}} item navigation" {{if not .IsLast}}href="{{$.Link}}?page={{.TotalPages}}{{if $paginationLink}}&{{$paginationLink}}{{end}}"{{end}}>
|
||||||
|
<span class="navigation_label">{{$.locale.Tr "admin.last_page"}}</span>
|
||||||
|
{{svg "gitea-double-chevron-right" 16 "gt-ml-2"}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
@ -0,0 +1,14 @@
|
|||||||
|
<form class="ui form ignore-dirty" style="max-width: 100%">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Keyword}}"{{if .CodeIndexerUnavailable}} disabled{{end}} placeholder="{{.locale.Tr "explore.search"}}…" autofocus>
|
||||||
|
<div class="ui dropdown selection {{if .CodeIndexerUnavailable}} disabled{{end}}" data-tooltip-content="{{.locale.Tr "explore.search.type.tooltip"}}">
|
||||||
|
<input name="t" type="hidden" value="{{.queryType}}"{{if .CodeIndexerUnavailable}} disabled{{end}}>{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="text">{{.locale.Tr (printf "explore.search.%s" (or .queryType "fuzzy"))}}</div>
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="" data-tooltip-content="{{.locale.Tr "explore.search.fuzzy.tooltip"}}">{{.locale.Tr "explore.search.fuzzy"}}</div>
|
||||||
|
<div class="item" data-value="match" data-tooltip-content="{{.locale.Tr "explore.search.match.tooltip"}}">{{.locale.Tr "explore.search.match"}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="ui primary button"{{if .CodeIndexerUnavailable}} disabled{{end}}>{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
@ -0,0 +1,43 @@
|
|||||||
|
<div class="gt-df gt-ac gt-fw">
|
||||||
|
{{range $term := .SearchResultLanguages}}
|
||||||
|
<a class="ui text-label gt-df gt-ac gt-mr-1 gt-my-1 {{if eq $.Language $term.Language}}primary {{end}}basic label" href="{{AppSubUrl}}{{if $.ContextUser}}/{{$.ContextUser.Name}}/-/code{{else}}/explore/code{{end}}?q={{$.Keyword}}{{if ne $.Language $term.Language}}&l={{$term.Language}}{{end}}{{if ne $.queryType ""}}&t={{$.queryType}}{{end}}">
|
||||||
|
<i class="color-icon gt-mr-3" style="background-color: {{$term.Color}}"></i>
|
||||||
|
{{$term.Language}}
|
||||||
|
<div class="detail">{{$term.Count}}</div>
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="repository search">
|
||||||
|
{{range $result := .SearchResults}}
|
||||||
|
{{$repo := (index $.RepoMaps .RepoID)}}
|
||||||
|
<div class="diff-file-box diff-box file-content non-diff-file-content repo-search-result">
|
||||||
|
<h4 class="ui top attached normal header gt-df gt-fw">
|
||||||
|
<span class="file gt-f1">
|
||||||
|
<a rel="nofollow" href="{{$repo.Link}}">{{$repo.FullName}}</a>
|
||||||
|
{{if $repo.IsArchived}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.archived"}}</span>
|
||||||
|
{{end}}
|
||||||
|
- {{.Filename}}
|
||||||
|
</span>
|
||||||
|
<a role="button" class="ui basic tiny button" rel="nofollow" href="{{$repo.Link}}/src/commit/{{$result.CommitID | PathEscape}}/{{.Filename | PathEscapeSegments}}">{{$.locale.Tr "repo.diff.view_file"}}</a>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached table segment">
|
||||||
|
<div class="file-body file-code code-view">
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="lines-num">
|
||||||
|
{{range .LineNumbers}}
|
||||||
|
<a href="{{$repo.Link}}/src/commit/{{$result.CommitID | PathEscape}}/{{$result.Filename | PathEscapeSegments}}#L{{.}}"><span>{{.}}</span></a>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td class="lines-code chroma"><code class="code-inner">{{.FormattedLines | Safe}}</code></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "shared/searchbottom" dict "root" $ "result" .}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
@ -0,0 +1,49 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div class="page-content devtest ui container">
|
||||||
|
<div class="ui g-modal-confirm modal" id="test-modal-default">
|
||||||
|
<div class="header">{{svg "octicon-file"}} Default dialog <span>title</span></div>
|
||||||
|
<div class="content">
|
||||||
|
very long aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" (dict "locale" $.locale)}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm modal" id="test-modal-confirm">
|
||||||
|
<div class="header">Confirm dialog</div>
|
||||||
|
<div class="content">hello, this is the modal dialog content</div>
|
||||||
|
{{template "base/modal_actions_confirm" (dict "locale" $.locale "ModalButtonTypes" "confirm")}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm modal" id="test-modal-blue">
|
||||||
|
<div class="header">Blue dialog</div>
|
||||||
|
<div class="content">hello, this is the modal dialog content</div>
|
||||||
|
{{template "base/modal_actions_confirm" (dict "locale" $.locale "ModalButtonColors" "blue")}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm modal" id="test-modal-yellow">
|
||||||
|
<div class="header">yellow dialog</div>
|
||||||
|
<div class="content">hello, this is the modal dialog content</div>
|
||||||
|
{{template "base/modal_actions_confirm" (dict "locale" $.locale "ModalButtonColors" "yellow")}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui g-modal-confirm modal" id="test-modal-danger">
|
||||||
|
{{svg "octicon-x" 16 "inside close"}}
|
||||||
|
<div class="header">dangerous action dialog</div>
|
||||||
|
<div class="content">hello, this is the modal dialog content, this is a dangerous operation</div>
|
||||||
|
{{template "base/modal_actions_confirm" (dict "ModalButtonDangerText" "I know and must do this is dangerous operation")}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-buttons"></div>
|
||||||
|
<script type="module">
|
||||||
|
for (const el of $('.ui.modal')) {
|
||||||
|
const $btn = $('<button>').text(`Show ${el.id}`).on('click', () => {
|
||||||
|
$(el).modal({onApprove() {alert('confirmed')}}).modal('show');
|
||||||
|
});
|
||||||
|
$('.modal-buttons').append($btn);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.modal-buttons button { margin: 5px; }
|
||||||
|
</style>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,247 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div class="page-content devtest ui container">
|
||||||
|
<div>
|
||||||
|
<h1>Button</h1>
|
||||||
|
<div>
|
||||||
|
Style:
|
||||||
|
<label><input type="checkbox" name="button-style-compact" value="compact">compact</label>
|
||||||
|
<label><input type="radio" name="button-style-size" value="">(normal)</label>
|
||||||
|
<label><input type="radio" name="button-style-size" value="tiny">tiny</label>
|
||||||
|
<label><input type="radio" name="button-style-size" value="mini">mini</label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
State:
|
||||||
|
<label><input type="checkbox" name="button-state-disabled" value="disabled">disabled</label>
|
||||||
|
</div>
|
||||||
|
<div id="devtest-button-samples">
|
||||||
|
<style>
|
||||||
|
.button-sample-groups { margin: 0; padding: 0; }
|
||||||
|
.button-sample-groups .sample-group { list-style: none; margin: 0; padding: 0; }
|
||||||
|
.button-sample-groups .sample-group .ui.button { margin-bottom: 5px; }
|
||||||
|
</style>
|
||||||
|
<ul class="button-sample-groups">
|
||||||
|
<li class="sample-group">
|
||||||
|
<h2>General purpose:</h2>
|
||||||
|
<button class="ui button">Unclassed</button>
|
||||||
|
<button class="ui basic button">Basic Unclassed</button>
|
||||||
|
<button class="ui primary button">Primary</button>
|
||||||
|
<button class="ui basic primary button">Basic Primary</button>
|
||||||
|
<button class="ui negative button">Negative</button>
|
||||||
|
<button class="ui basic negative button">Basic Negative</button>
|
||||||
|
<button class="ui positive button">Positive</button>
|
||||||
|
<button class="ui basic positive button">Basic Positive</button>
|
||||||
|
</li>
|
||||||
|
<li class="sample-group">
|
||||||
|
<h2>Recommended colors:</h2>
|
||||||
|
<button class="ui red button">Red</button>
|
||||||
|
<button class="ui basic red button">Basic Red</button>
|
||||||
|
<button class="ui green button">Green</button>
|
||||||
|
<button class="ui basic green button">Basic Green</button>
|
||||||
|
<button class="ui blue button">Blue</button>
|
||||||
|
<button class="ui basic blue button">Basic Blue</button>
|
||||||
|
<button class="ui orange button">Orange</button>
|
||||||
|
<button class="ui basic orange button">Basic Orange</button>
|
||||||
|
<button class="ui yellow button">Yellow</button>
|
||||||
|
<button class="ui basic yellow button">Basic Yellow</button>
|
||||||
|
</li>
|
||||||
|
<li class="sample-group">
|
||||||
|
<h2>Supported but not recommended:</h2>
|
||||||
|
<p>Do not use if there is no strong requirement. Do not use grey/black buttons, they don't work well with dark theme.</p>
|
||||||
|
<button class="ui secondary button">Secondary</button>
|
||||||
|
<button class="ui basic secondary button">Basic Secondary</button>
|
||||||
|
<button class="ui olive button">Olive</button>
|
||||||
|
<button class="ui basic olive button">Basic Olive</button>
|
||||||
|
<button class="ui teal button">Teal</button>
|
||||||
|
<button class="ui basic teal button">Basic Teal</button>
|
||||||
|
<button class="ui violet button">Violet</button>
|
||||||
|
<button class="ui basic violet button">Basic Violet</button>
|
||||||
|
<button class="ui purple button">Purple</button>
|
||||||
|
<button class="ui basic purple button">Basic Purple</button>
|
||||||
|
<button class="ui pink button">Pink</button>
|
||||||
|
<button class="ui basic pink button">Basic Pink</button>
|
||||||
|
<button class="ui brown button">Brown</button>
|
||||||
|
<button class="ui basic brown button">Basic Brown</button>
|
||||||
|
</li>
|
||||||
|
<li class="sample-group">
|
||||||
|
<h2>Inline / Plain:</h2>
|
||||||
|
<div class="gt-my-2">
|
||||||
|
<button class="btn gt-p-3">Plain button</button>
|
||||||
|
<button class="btn interact-fg gt-p-3">Plain button with interact fg</button>
|
||||||
|
<button class="btn interact-bg gt-p-3">Plain button with interact bg</button>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<script type="module">
|
||||||
|
const $buttons = $('#devtest-button-samples').find('button.ui');
|
||||||
|
|
||||||
|
const $buttonStyles = $('input[name*="button-style"]');
|
||||||
|
$buttonStyles.on('click', () => $buttonStyles.map((_ ,el) => $buttons.toggleClass(el.value, el.checked)));
|
||||||
|
|
||||||
|
const $buttonStates = $('input[name*="button-state"]');
|
||||||
|
$buttonStates.on('click', () => $buttonStates.map((_ ,el) => $buttons.prop(el.value, el.checked)));
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1>Tooltip</h1>
|
||||||
|
<div><span data-tooltip-content="test tooltip">text with tooltip</span></div>
|
||||||
|
<div><span data-tooltip-content="test tooltip" data-tooltip-interactive="true">text with interactive tooltip</span></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1>GiteaOriginUrl</h1>
|
||||||
|
<div><gitea-origin-url data-url="test/url"></gitea-origin-url></div>
|
||||||
|
<div><gitea-origin-url data-url="/test/url"></gitea-origin-url></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1>LocaleNumber</h1>
|
||||||
|
<div>{{.locale.PrettyNumber 1}}</div>
|
||||||
|
<div>{{.locale.PrettyNumber 12}}</div>
|
||||||
|
<div>{{.locale.PrettyNumber 123}}</div>
|
||||||
|
<div>{{.locale.PrettyNumber 1234}}</div>
|
||||||
|
<div>{{.locale.PrettyNumber 12345}}</div>
|
||||||
|
<div>{{.locale.PrettyNumber 123456}}</div>
|
||||||
|
<div>{{.locale.PrettyNumber 1234567}}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1>TimeSince</h1>
|
||||||
|
<div>Now: {{TimeSince .TimeNow $.locale}}</div>
|
||||||
|
<div>5s past: {{TimeSince .TimePast5s $.locale}}</div>
|
||||||
|
<div>5s future: {{TimeSince .TimeFuture5s $.locale}}</div>
|
||||||
|
<div>2m past: {{TimeSince .TimePast2m $.locale}}</div>
|
||||||
|
<div>2m future: {{TimeSince .TimeFuture2m $.locale}}</div>
|
||||||
|
<div>1y past: {{TimeSince .TimePast1y $.locale}}</div>
|
||||||
|
<div>1y future: {{TimeSince .TimeFuture1y $.locale}}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1>SVG alignment</h1>
|
||||||
|
|
||||||
|
<h2>Text with SVG</h2>
|
||||||
|
<div class="flex-text-block">{{svg "octicon-alert"}} {{svg "octicon-x"}} text (block)</div>
|
||||||
|
<div><div class="flex-text-inline">{{svg "octicon-alert"}} {{svg "octicon-x"}} text</div> (inline)</div>
|
||||||
|
<div class="flex-items-block">
|
||||||
|
<div class="item">{{svg "octicon-alert"}} flex every line</div>
|
||||||
|
<div class="item">{{svg "octicon-alert"}} flex every item</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Button with SVG</h2>
|
||||||
|
<div>
|
||||||
|
<button class="ui red button">{{svg "octicon-alert" 24}} {{svg "octicon-x" 24}} text</button>
|
||||||
|
<div class="ui labeled button">
|
||||||
|
<button class="ui basic button">labeled button</button>
|
||||||
|
<a class="ui basic label">123</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Input with SVG</h2>
|
||||||
|
<div>
|
||||||
|
<div class="ui icon search input">
|
||||||
|
<i class="icon">{{svg "octicon-search"}}</i>
|
||||||
|
<input type="text" placeholder="place holder">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Dropdown with SVG</h2>
|
||||||
|
<div>
|
||||||
|
<div class="ui dropdown" style="border: 1px red dashed" data-tooltip-content="border for demo purpose only">
|
||||||
|
<span class="text">simple</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item">item</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui search selection dropdown">
|
||||||
|
<span class="text">search ...</span>
|
||||||
|
<input name="value" class="search">
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
{{svg "octicon-x" 14 "remove icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item">item</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui multiple selection dropdown">
|
||||||
|
<input class="hidden" value="1">
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
{{svg "octicon-x" 14 "remove icon"}}
|
||||||
|
<div class="default text">empty multiple dropdown</div>
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item">item</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui multiple clearable search selection dropdown">
|
||||||
|
<input type="hidden" value="1">
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
{{svg "octicon-x" 14 "remove icon"}}
|
||||||
|
<div class="default text">clearable search dropdown</div>
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="1">item</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui buttons">
|
||||||
|
<button class="ui button">Button with Dropdown</button>
|
||||||
|
<div class="ui dropdown button icon">
|
||||||
|
{{svg "octicon-triangle-down"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item">item</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="ui dropdown mini button">
|
||||||
|
<span class="text">mini dropdown</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
<div class="ui dropdown tiny button">
|
||||||
|
<span class="text">tiny dropdown</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
<div class="ui button dropdown">
|
||||||
|
<span class="text">button dropdown</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
<div class="ui dropdown large button">
|
||||||
|
<span class="text">large dropdown</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="ui dropdown mini compact button">
|
||||||
|
<span class="text">mini compact</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
<div class="ui dropdown tiny compact button">
|
||||||
|
<span class="text">tiny compact</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
<div class="ui button compact dropdown">
|
||||||
|
<span class="text">button compact</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
<div class="ui dropdown large compact button">
|
||||||
|
<span class="text">large compact</span>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h1>ComboMarkdownEditor</h1>
|
||||||
|
<div>ps: no JS code attached, so just a layout</div>
|
||||||
|
{{template "shared/combomarkdowneditor" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h1, h2 {
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,12 @@
|
|||||||
|
<style>
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<ul>
|
||||||
|
{{range .SubNames}}
|
||||||
|
<li><a href="{{AppSubUrl}}/devtest/{{.}}">{{.}}</a></li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
@ -0,0 +1,3 @@
|
|||||||
|
sub template triggers an executing error
|
||||||
|
|
||||||
|
{{.locale.NoSuch "asdf"}}
|
@ -0,0 +1,12 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div class="page-content devtest">
|
||||||
|
<div class="gt-df">
|
||||||
|
<div style="width: 80%; ">
|
||||||
|
hello hello hello hello hello hello hello hello hello hello
|
||||||
|
</div>
|
||||||
|
<div style="width: 20%;">
|
||||||
|
{{template "devtest/tmplerr-sub" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,25 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content explore users">
|
||||||
|
{{template "explore/navbar" .}}
|
||||||
|
<div class="ui container">
|
||||||
|
{{template "code/searchform" .}}
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<div class="ui user list">
|
||||||
|
{{if .CodeIndexerUnavailable}}
|
||||||
|
<div class="ui error message">
|
||||||
|
<p>{{$.locale.Tr "explore.code_search_unavailable"}}</p>
|
||||||
|
</div>
|
||||||
|
{{else if .SearchResults}}
|
||||||
|
<h3>
|
||||||
|
{{.locale.Tr "explore.code_search_results" (.Keyword|Escape) | Str2html}}
|
||||||
|
</h3>
|
||||||
|
{{template "code/searchresults" .}}
|
||||||
|
{{else if .Keyword}}
|
||||||
|
<div>{{$.locale.Tr "explore.code_no_results"}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,18 @@
|
|||||||
|
<div class="ui secondary pointing tabular top attached borderless menu new-menu navbar">
|
||||||
|
<a class="{{if .PageIsExploreRepositories}}active {{end}}item" href="{{AppSubUrl}}/explore/repos">
|
||||||
|
{{svg "octicon-repo"}} {{.locale.Tr "explore.repos"}}
|
||||||
|
</a>
|
||||||
|
{{if not .UsersIsDisabled}}
|
||||||
|
<a class="{{if .PageIsExploreUsers}}active {{end}}item" href="{{AppSubUrl}}/explore/users">
|
||||||
|
{{svg "octicon-person"}} {{.locale.Tr "explore.users"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
<a class="{{if .PageIsExploreOrganizations}}active {{end}}item" href="{{AppSubUrl}}/explore/organizations">
|
||||||
|
{{svg "octicon-organization"}} {{.locale.Tr "explore.organizations"}}
|
||||||
|
</a>
|
||||||
|
{{if and (not $.UnitTypeCode.UnitGlobalDisabled) .IsRepoIndexerEnabled}}
|
||||||
|
<a class="{{if .PageIsExploreCode}}active {{end}}item" href="{{AppSubUrl}}/explore/code">
|
||||||
|
{{svg "octicon-code"}} {{.locale.Tr "explore.code"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
@ -0,0 +1,38 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content explore users">
|
||||||
|
{{template "explore/navbar" .}}
|
||||||
|
<div class="ui container">
|
||||||
|
{{template "explore/search" .}}
|
||||||
|
|
||||||
|
<div class="ui user list">
|
||||||
|
{{range .Users}}
|
||||||
|
<div class="item">
|
||||||
|
{{avatar $.Context .}}
|
||||||
|
<div class="content">
|
||||||
|
<span class="header">
|
||||||
|
<a href="{{.HomeLink}}">{{.Name}}</a> {{.FullName}}
|
||||||
|
{{if .Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.private"}}</span>
|
||||||
|
{{end}}
|
||||||
|
</span>
|
||||||
|
<div class="description">
|
||||||
|
{{if .Location}}
|
||||||
|
{{svg "octicon-location"}} {{.Location}}
|
||||||
|
{{end}}
|
||||||
|
{{if and .Website}}
|
||||||
|
{{svg "octicon-link"}}
|
||||||
|
<a href="{{.Website}}" rel="nofollow">{{.Website}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{svg "octicon-clock"}} {{$.locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix) | Safe}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div>{{$.locale.Tr "explore.org_no_results"}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,71 @@
|
|||||||
|
<div class="ui repository list">
|
||||||
|
{{range .Repos}}
|
||||||
|
<div class="item">
|
||||||
|
<div class="ui header gt-df gt-ac">
|
||||||
|
<div class="repo-title">
|
||||||
|
{{$avatar := (repoAvatar . 32 "gt-mr-3")}}
|
||||||
|
{{if $avatar}}
|
||||||
|
{{$avatar}}
|
||||||
|
{{end}}
|
||||||
|
<a class="name" href="{{.Link}}">
|
||||||
|
{{if or $.PageIsExplore $.PageIsProfileStarList}}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}
|
||||||
|
</a>
|
||||||
|
<div class="labels gt-df gt-ac gt-fw gt-mr-3">
|
||||||
|
{{if .IsArchived}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.archived"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{if .IsTemplate}}
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.private_template"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.internal_template"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
{{if .IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.private"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{if .Owner.Visibility.IsPrivate}}
|
||||||
|
<span class="ui basic label">{{$.locale.Tr "repo.desc.internal"}}</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{if .IsFork}}
|
||||||
|
<span class="gt-df" data-tooltip-content="{{$.locale.Tr "repo.fork"}}">{{svg "octicon-repo-forked"}}</span>
|
||||||
|
{{else if .IsMirror}}
|
||||||
|
<span class="gt-df" data-tooltip-content="{{$.locale.Tr "mirror"}}">{{svg "octicon-mirror"}}</span>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="gt-font-13 gt-df gt-ac text grey">
|
||||||
|
{{if .PrimaryLanguage}}
|
||||||
|
<a class="muted" href="{{$.Link}}?q={{$.Keyword}}&sort={{$.SortType}}&language={{.PrimaryLanguage.Language}}">
|
||||||
|
<span class="gt-df gt-ac gt-mr-3"><i class="color-icon gt-mr-3" style="background-color: {{.PrimaryLanguage.Color}}"></i>{{.PrimaryLanguage.Language}}</span>
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
{{if not $.DisableStars}}
|
||||||
|
<a class="text grey gt-df gt-ac gt-mr-3" href="{{.Link}}/stars">{{svg "octicon-star" 16 "gt-mr-3"}}{{.NumStars}}</a>
|
||||||
|
{{end}}
|
||||||
|
<a class="text grey gt-df gt-ac gt-mr-3" href="{{.Link}}/forks">{{svg "octicon-git-branch" 16 "gt-mr-3"}}{{.NumForks}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
{{$description := .DescriptionHTML $.Context}}
|
||||||
|
{{if $description}}<p>{{$description}}</p>{{end}}
|
||||||
|
{{if .Topics}}
|
||||||
|
<div class="ui tags">
|
||||||
|
{{range .Topics}}
|
||||||
|
{{if ne . ""}}<a href="{{AppSubUrl}}/explore/repos?q={{.}}&topic=1"><div class="ui small label topic">{{.}}</div></a>{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<p class="time">{{$.locale.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.locale}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div>
|
||||||
|
{{$.locale.Tr "explore.repo_no_results"}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
@ -0,0 +1,42 @@
|
|||||||
|
<div class="ui right floated secondary filter menu">
|
||||||
|
<!-- Sort -->
|
||||||
|
<div class="ui right dropdown type jump item">
|
||||||
|
<span class="text">
|
||||||
|
{{.locale.Tr "repo.issues.filter_sort"}}
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if eq .SortType "newest"}}active {{end}}item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.latest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "oldest"}}active {{end}}item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.oldest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "alphabetically"}}active {{end}}item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reversealphabetically"}}active {{end}}item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
|
||||||
|
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
|
||||||
|
{{if not .DisableStars}}
|
||||||
|
<a class="{{if eq .SortType "moststars"}}active {{end}}item" href="{{$.Link}}?sort=moststars&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.moststars"}}</a>
|
||||||
|
<a class="{{if eq .SortType "feweststars"}}active {{end}}item" href="{{$.Link}}?sort=feweststars&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.feweststars"}}</a>
|
||||||
|
{{end}}
|
||||||
|
<a class="{{if eq .SortType "mostforks"}}active {{end}}item" href="{{$.Link}}?sort=mostforks&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.mostforks"}}</a>
|
||||||
|
<a class="{{if eq .SortType "fewestforks"}}active {{end}}item" href="{{$.Link}}?sort=fewestforks&q={{$.Keyword}}&language={{$.Language}}">{{.locale.Tr "repo.issues.filter_sort.fewestforks"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form class="ui form ignore-dirty" style="max-width: 90%">
|
||||||
|
<input type="hidden" name="sort" value="{{$.SortType}}">
|
||||||
|
<input type="hidden" name="language" value="{{$.Language}}">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "explore.search"}}…" autofocus>
|
||||||
|
{{if .PageIsExploreRepositories}}
|
||||||
|
<input type="hidden" name="only_show_relevant" value="{{.OnlyShowRelevant}}">
|
||||||
|
{{else}}
|
||||||
|
<input type="hidden" name="tab" value="repositories">
|
||||||
|
{{end}}
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{if and .PageIsExploreRepositories .OnlyShowRelevant}}
|
||||||
|
<div class="ui message explore-relevancy-note">
|
||||||
|
<span data-tooltip-content="{{.locale.Tr "explore.relevant_repositories_tooltip"}}">{{.locale.Tr "explore.relevant_repositories" ((printf "%s%s" $.Link "?only_show_relevant=0")|Escape) | Safe}}</span>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<div class="ui divider"></div>
|
@ -0,0 +1,10 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content explore repositories">
|
||||||
|
{{template "explore/navbar" .}}
|
||||||
|
<div class="ui container">
|
||||||
|
{{template "explore/repo_search" .}}
|
||||||
|
{{template "explore/repo_list" .}}
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,24 @@
|
|||||||
|
<div class="ui right floated secondary filter menu">
|
||||||
|
<!-- Sort -->
|
||||||
|
<div class="ui right dropdown type jump item">
|
||||||
|
<span class="text">
|
||||||
|
{{.locale.Tr "repo.issues.filter_sort"}}
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
</span>
|
||||||
|
<div class="menu">
|
||||||
|
<a class="{{if eq .SortType "newest"}}active {{end}}item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.latest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "oldest"}}active {{end}}item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.oldest"}}</a>
|
||||||
|
<a class="{{if eq .SortType "alphabetically"}}active {{end}}item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "reversealphabetically"}}active {{end}}item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}">{{.locale.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
|
||||||
|
<a class="{{if eq .SortType "recentupdate"}}active {{end}}item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.recentupdate"}}</a>
|
||||||
|
<a class="{{if eq .SortType "leastupdate"}}active {{end}}item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}">{{.locale.Tr "repo.issues.filter_sort.leastupdate"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form class="ui form ignore-dirty" style="max-width: 90%">
|
||||||
|
<div class="ui fluid action input">
|
||||||
|
<input name="q" value="{{.Keyword}}" placeholder="{{.locale.Tr "explore.search"}}…" autofocus>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="ui divider"></div>
|
@ -0,0 +1,33 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content explore users">
|
||||||
|
{{template "explore/navbar" .}}
|
||||||
|
<div class="ui container">
|
||||||
|
{{template "explore/search" .}}
|
||||||
|
|
||||||
|
<div class="ui user list">
|
||||||
|
{{range .Users}}
|
||||||
|
<div class="item">
|
||||||
|
{{avatar $.Context .}}
|
||||||
|
<div class="content">
|
||||||
|
<span class="header"><a href="{{.HomeLink}}">{{.Name}}</a> {{.FullName}}</span>
|
||||||
|
<div class="description">
|
||||||
|
{{if .Location}}
|
||||||
|
{{svg "octicon-location"}} {{.Location}}
|
||||||
|
{{end}}
|
||||||
|
{{if and $.ShowUserEmail .Email $.IsSigned (not .KeepEmailPrivate)}}
|
||||||
|
{{svg "octicon-mail"}}
|
||||||
|
<a href="mailto:{{.Email}}" rel="nofollow">{{.Email}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{svg "octicon-clock"}} {{$.locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix) | Safe}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div>{{$.locale.Tr "explore.user_no_results"}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,9 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{if .IsSigned}}{{.locale.Tr "dashboard"}}{{else}}{{.locale.Tr "home"}}{{end}}" class="page-content home">
|
||||||
|
<div class="gt-mb-5 gt-px-5">
|
||||||
|
<div class="center">
|
||||||
|
<img class="logo" width="220" height="220" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{.locale.Tr "logo"}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,335 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content install">
|
||||||
|
<div class="ui middle very relaxed page grid">
|
||||||
|
<div class="sixteen wide center aligned centered column">
|
||||||
|
<h3 class="ui top attached header">
|
||||||
|
{{.locale.Tr "install.title"}}
|
||||||
|
</h3>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
{{template "base/alert" .}}
|
||||||
|
|
||||||
|
<p>{{.locale.Tr "install.docker_helper" "https://docs.gitea.io/en-us/install-with-docker/" | Safe}}</p>
|
||||||
|
|
||||||
|
<form class="ui form" action="{{AppSubUrl}}/" method="post">
|
||||||
|
<!-- Database Settings -->
|
||||||
|
<h4 class="ui dividing header">{{.locale.Tr "install.db_title"}}</h4>
|
||||||
|
<p>{{.locale.Tr "install.require_db_desc"}}</p>
|
||||||
|
<div class="inline required field {{if .Err_DbType}}error{{end}}">
|
||||||
|
<label>{{.locale.Tr "install.db_type"}}</label>
|
||||||
|
<div class="ui selection database type dropdown">
|
||||||
|
<input type="hidden" id="db_type" name="db_type" value="{{.CurDbType}}">
|
||||||
|
<div class="text">{{.CurDbType}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .DbTypeNames}}
|
||||||
|
<div class="item" data-value="{{.type}}">{{.name}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="gt-hidden" data-db-setting-for="common-host">
|
||||||
|
<div class="inline required field {{if .Err_DbSetting}}error{{end}}">
|
||||||
|
<label for="db_host">{{.locale.Tr "install.host"}}</label>
|
||||||
|
<input id="db_host" name="db_host" value="{{.db_host}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline required field {{if .Err_DbSetting}}error{{end}}">
|
||||||
|
<label for="db_user">{{.locale.Tr "install.user"}}</label>
|
||||||
|
<input id="db_user" name="db_user" value="{{.db_user}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline required field {{if .Err_DbSetting}}error{{end}}">
|
||||||
|
<label for="db_passwd">{{.locale.Tr "install.password"}}</label>
|
||||||
|
<input id="db_passwd" name="db_passwd" type="password" value="{{.db_passwd}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline required field {{if .Err_DbSetting}}error{{end}}">
|
||||||
|
<label for="db_name">{{.locale.Tr "install.db_name"}}</label>
|
||||||
|
<input id="db_name" name="db_name" value="{{.db_name}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="gt-hidden" data-db-setting-for="postgres">
|
||||||
|
<div class="inline required field">
|
||||||
|
<label>{{.locale.Tr "install.ssl_mode"}}</label>
|
||||||
|
<div class="ui selection database type dropdown">
|
||||||
|
<input type="hidden" name="ssl_mode" value="{{if .ssl_mode}}{{.ssl_mode}}{{else}}disable{{end}}">
|
||||||
|
<div class="default text">disable</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="disable">Disable</div>
|
||||||
|
<div class="item" data-value="require">Require</div>
|
||||||
|
<div class="item" data-value="verify-full">Verify Full</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_DbSetting}}error{{end}}">
|
||||||
|
<label for="db_schema">{{.locale.Tr "install.db_schema"}}</label>
|
||||||
|
<input id="db_schema" name="db_schema" value="{{.db_schema}}">
|
||||||
|
<span class="help">{{.locale.Tr "install.db_schema_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="gt-hidden" data-db-setting-for="sqlite3">
|
||||||
|
<div class="inline required field {{if or .Err_DbPath .Err_DbSetting}}error{{end}}">
|
||||||
|
<label for="db_path">{{.locale.Tr "install.path"}}</label>
|
||||||
|
<input id="db_path" name="db_path" value="{{.db_path}}">
|
||||||
|
<span class="help">{{.locale.Tr "install.sqlite_helper" | Safe}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{if .Err_DbInstalledBefore}}
|
||||||
|
<div>
|
||||||
|
<p class="reinstall-message">{{.locale.Tr "install.reinstall_confirm_message"}}</p>
|
||||||
|
<div class="reinstall-confirm">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "install.reinstall_confirm_check_1"}}</label>
|
||||||
|
<input name="reinstall_confirm_first" type="checkbox">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="reinstall-confirm">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "install.reinstall_confirm_check_2"}}</label>
|
||||||
|
<input name="reinstall_confirm_second" type="checkbox">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="reinstall-confirm">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "install.reinstall_confirm_check_3"}}</label>
|
||||||
|
<input name="reinstall_confirm_third" type="checkbox">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<!-- General Settings -->
|
||||||
|
<h4 class="ui dividing header">{{.locale.Tr "install.general_title"}}</h4>
|
||||||
|
<div class="inline required field {{if .Err_AppName}}error{{end}}">
|
||||||
|
<label for="app_name">{{.locale.Tr "install.app_name"}}</label>
|
||||||
|
<input id="app_name" name="app_name" value="{{.app_name}}" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.app_name_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline required field {{if .Err_RepoRootPath}}error{{end}}">
|
||||||
|
<label for="repo_root_path">{{.locale.Tr "install.repo_path"}}</label>
|
||||||
|
<input id="repo_root_path" name="repo_root_path" value="{{.repo_root_path}}" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.repo_path_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_LFSRootPath}}error{{end}}">
|
||||||
|
<label for="lfs_root_path">{{.locale.Tr "install.lfs_path"}}</label>
|
||||||
|
<input id="lfs_root_path" name="lfs_root_path" value="{{.lfs_root_path}}">
|
||||||
|
<span class="help">{{.locale.Tr "install.lfs_path_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline required field {{if .Err_RunUser}}error{{end}}">
|
||||||
|
<label for="run_user">{{.locale.Tr "install.run_user"}}</label>
|
||||||
|
<input id="run_user" name="run_user" value="{{.run_user}}" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.run_user_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline required field">
|
||||||
|
<label for="domain">{{.locale.Tr "install.domain"}}</label>
|
||||||
|
<input id="domain" name="domain" value="{{.domain}}" placeholder="e.g. try.gitea.io" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.domain_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="ssh_port">{{.locale.Tr "install.ssh_port"}}</label>
|
||||||
|
<input id="ssh_port" name="ssh_port" value="{{.ssh_port}}">
|
||||||
|
<span class="help">{{.locale.Tr "install.ssh_port_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline required field">
|
||||||
|
<label for="http_port">{{.locale.Tr "install.http_port"}}</label>
|
||||||
|
<input id="http_port" name="http_port" value="{{.http_port}}" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.http_port_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline required field">
|
||||||
|
<label for="app_url">{{.locale.Tr "install.app_url"}}</label>
|
||||||
|
<input id="app_url" name="app_url" value="{{.app_url}}" placeholder="e.g. https://try.gitea.io" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.app_url_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline required field">
|
||||||
|
<label for="log_root_path">{{.locale.Tr "install.log_root_path"}}</label>
|
||||||
|
<input id="log_root_path" name="log_root_path" value="{{.log_root_path}}" placeholder="log" required>
|
||||||
|
<span class="help">{{.locale.Tr "install.log_root_path_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label for="enable_update_checker">{{.locale.Tr "install.enable_update_checker"}}</label>
|
||||||
|
<input name="enable_update_checker" type="checkbox">
|
||||||
|
</div>
|
||||||
|
<span class="help">{{.locale.Tr "install.enable_update_checker_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Optional Settings -->
|
||||||
|
<h4 class="ui dividing header">{{.locale.Tr "install.optional_title"}}</h4>
|
||||||
|
|
||||||
|
<!-- Email -->
|
||||||
|
<details class="optional field">
|
||||||
|
<summary class="title gt-py-3{{if .Err_SMTP}} text red{{end}}">
|
||||||
|
{{.locale.Tr "install.email_title"}}
|
||||||
|
</summary>
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="smtp_addr">{{.locale.Tr "install.smtp_addr"}}</label>
|
||||||
|
<input id="smtp_addr" name="smtp_addr" value="{{.smtp_addr}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="smtp_port">{{.locale.Tr "install.smtp_port"}}</label>
|
||||||
|
<input id="smtp_port" name="smtp_port" value="{{.smtp_port}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_SMTPFrom}}error{{end}}">
|
||||||
|
<label for="smtp_from">{{.locale.Tr "install.smtp_from"}}</label>
|
||||||
|
<input id="smtp_from" name="smtp_from" value="{{.smtp_from}}">
|
||||||
|
<span class="help">{{.locale.Tr "install.smtp_from_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_SMTPUser}}error{{end}}">
|
||||||
|
<label for="smtp_user">{{.locale.Tr "install.mailer_user"}}</label>
|
||||||
|
<input id="smtp_user" name="smtp_user" value="{{.smtp_user}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="smtp_passwd">{{.locale.Tr "install.mailer_password"}}</label>
|
||||||
|
<input id="smtp_passwd" name="smtp_passwd" type="password" value="{{.smtp_passwd}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "install.register_confirm"}}</label>
|
||||||
|
<input name="register_confirm" type="checkbox" {{if .register_confirm}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label>{{.locale.Tr "install.mail_notify"}}</label>
|
||||||
|
<input name="mail_notify" type="checkbox" {{if .mail_notify}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<!-- Server and other services -->
|
||||||
|
<details class="optional field">
|
||||||
|
<summary class="title gt-py-3{{if .Err_Services}} text red{{end}}">
|
||||||
|
{{.locale.Tr "install.server_service_title"}}
|
||||||
|
</summary>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="offline-mode">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.offline_mode_popup"}}">{{.locale.Tr "install.offline_mode"}}</label>
|
||||||
|
<input name="offline_mode" type="checkbox" {{if .offline_mode}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="disable-gravatar">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.disable_gravatar_popup"}}">{{.locale.Tr "install.disable_gravatar"}}</label>
|
||||||
|
<input name="disable_gravatar" type="checkbox" {{if .disable_gravatar}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="federated-avatar-lookup">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.federated_avatar_lookup_popup"}}">{{.locale.Tr "install.federated_avatar_lookup"}}</label>
|
||||||
|
<input name="enable_federated_avatar" type="checkbox" {{if .enable_federated_avatar}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="enable-openid-signin">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.openid_signin_popup"}}">{{.locale.Tr "install.openid_signin"}}</label>
|
||||||
|
<input name="enable_open_id_sign_in" type="checkbox" {{if .enable_open_id_sign_in}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="disable-registration">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.disable_registration_popup"}}">{{.locale.Tr "install.disable_registration"}}</label>
|
||||||
|
<input name="disable_registration" type="checkbox" {{if .disable_registration}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="allow-only-external-registration">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.allow_only_external_registration_popup"}}">{{.locale.Tr "install.allow_only_external_registration_popup"}}</label>
|
||||||
|
<input name="allow_only_external_registration" type="checkbox" {{if .allow_only_external_registration}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="enable-openid-signup">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.openid_signup_popup"}}">{{.locale.Tr "install.openid_signup"}}</label>
|
||||||
|
<input name="enable_open_id_sign_up" type="checkbox" {{if .enable_open_id_sign_up}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox" id="enable-captcha">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.enable_captcha_popup"}}">{{.locale.Tr "install.enable_captcha"}}</label>
|
||||||
|
<input name="enable_captcha" type="checkbox" {{if .enable_captcha}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.require_sign_in_view_popup"}}">{{.locale.Tr "install.require_sign_in_view"}}</label>
|
||||||
|
<input name="require_sign_in_view" type="checkbox" {{if .require_sign_in_view}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.default_keep_email_private_popup"}}">{{.locale.Tr "install.default_keep_email_private"}}</label>
|
||||||
|
<input name="default_keep_email_private" type="checkbox" {{if .default_keep_email_private}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.default_allow_create_organization_popup"}}">{{.locale.Tr "install.default_allow_create_organization"}}</label>
|
||||||
|
<input name="default_allow_create_organization" type="checkbox" {{if .default_allow_create_organization}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<label data-tooltip-content="{{.locale.Tr "install.default_enable_timetracking_popup"}}">{{.locale.Tr "install.default_enable_timetracking"}}</label>
|
||||||
|
<input name="default_enable_timetracking" type="checkbox" {{if .default_enable_timetracking}}checked{{end}}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="no_reply_address">{{.locale.Tr "install.no_reply_address"}}</label>
|
||||||
|
<input id="_no_reply_address" name="no_reply_address" value="{{.no_reply_address}}">
|
||||||
|
<span class="help">{{.locale.Tr "install.no_reply_address_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="inline field">
|
||||||
|
<label for="password_algorithm">{{.locale.Tr "install.password_algorithm"}}</label>
|
||||||
|
<div class="ui selection dropdown">
|
||||||
|
<input id="password_algorithm" type="hidden" name="password_algorithm" value="{{.password_algorithm}}">
|
||||||
|
<div class="text">{{.password_algorithm}}</div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
{{range .PasswordHashAlgorithms}}
|
||||||
|
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="help">{{.locale.Tr "install.password_algorithm_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<!-- Admin -->
|
||||||
|
<details class="optional field">
|
||||||
|
<summary class="title gt-py-3{{if .Err_Admin}} text red{{end}}">
|
||||||
|
{{.locale.Tr "install.admin_title"}}
|
||||||
|
</summary>
|
||||||
|
<p class="center">{{.locale.Tr "install.admin_setting_desc"}}</p>
|
||||||
|
<div class="inline field {{if .Err_AdminName}}error{{end}}">
|
||||||
|
<label for="admin_name">{{.locale.Tr "install.admin_name"}}</label>
|
||||||
|
<input id="admin_name" name="admin_name" value="{{.admin_name}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_AdminEmail}}error{{end}}">
|
||||||
|
<label for="admin_email">{{.locale.Tr "install.admin_email"}}</label>
|
||||||
|
<input id="admin_email" name="admin_email" type="email" value="{{.admin_email}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_AdminPasswd}}error{{end}}">
|
||||||
|
<label for="admin_passwd">{{.locale.Tr "install.admin_password"}}</label>
|
||||||
|
<input id="admin_passwd" name="admin_passwd" type="password" autocomplete="new-password" value="{{.admin_passwd}}">
|
||||||
|
</div>
|
||||||
|
<div class="inline field {{if .Err_AdminPasswd}}error{{end}}">
|
||||||
|
<label for="admin_confirm_passwd">{{.locale.Tr "install.confirm_password"}}</label>
|
||||||
|
<input id="admin_confirm_passwd" name="admin_confirm_passwd" autocomplete="new-password" type="password" value="{{.admin_confirm_passwd}}">
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
<div class="inline field">
|
||||||
|
<label></label>
|
||||||
|
<button class="ui primary button">{{.locale.Tr "install.install_btn_confirm"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img class="gt-hidden" src="{{AssetUrlPrefix}}/img/loading.png">
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no">
|
||||||
|
<title>{{.locale.Tr "mail.activate_account.title" (.DisplayName|DotEscape)}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$activate_url := printf "%suser/activate?code=%s" AppUrl (QueryEscape .Code)}}
|
||||||
|
<body>
|
||||||
|
<p>{{.locale.Tr "mail.activate_account.text_1" (.DisplayName|DotEscape) AppName | Str2html}}</p><br>
|
||||||
|
<p>{{.locale.Tr "mail.activate_account.text_2" .ActiveCodeLives | Str2html}}</p><p><a href="{{$activate_url}}">{{$activate_url}}</a></p><br>
|
||||||
|
<p>{{.locale.Tr "mail.link_not_working_do_paste"}}</p>
|
||||||
|
|
||||||
|
<p>© <a target="_blank" rel="noopener noreferrer" href="{{AppUrl}}">{{AppName}}</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta Name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no">
|
||||||
|
<title>{{.locale.Tr "mail.activate_email.title" (.DisplayName|DotEscape)}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$activate_url := printf "%suser/activate_email?code=%s&email=%s" AppUrl (QueryEscape .Code) (QueryEscape .Email)}}
|
||||||
|
<body>
|
||||||
|
<p>{{.locale.Tr "mail.hi_user_x" (.DisplayName|DotEscape) | Str2html}}</p><br>
|
||||||
|
<p>{{.locale.Tr "mail.activate_email.text" .ActiveCodeLives | Str2html}}</p><p><a href="{{$activate_url}}">{{$activate_url}}</a></p><br>
|
||||||
|
<p>{{.locale.Tr "mail.link_not_working_do_paste"}}</p>
|
||||||
|
|
||||||
|
<p>© <a target="_blank" rel="noopener noreferrer" href="{{AppUrl}}">{{AppName}}</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no">
|
||||||
|
<title>{{.locale.Tr "mail.register_notify.title" (.DisplayName|DotEscape) AppName}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$set_pwd_url := printf "%[1]suser/forgot_password" AppUrl}}
|
||||||
|
<body>
|
||||||
|
<p>{{.locale.Tr "mail.hi_user_x" (.DisplayName|DotEscape) | Str2html}}</p><br>
|
||||||
|
<p>{{.locale.Tr "mail.register_notify.text_1" AppName}}</p><br>
|
||||||
|
<p>{{.locale.Tr "mail.register_notify.text_2" .Username}}</p><p><a href="{{AppUrl}}user/login">{{AppUrl}}user/login</a></p><br>
|
||||||
|
<p>{{.locale.Tr "mail.register_notify.text_3" ($set_pwd_url | Escape) | Str2html}}</p><br>
|
||||||
|
|
||||||
|
<p>© <a target="_blank" rel="noopener noreferrer" href="{{AppUrl}}">{{AppName}}</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no">
|
||||||
|
<title>{{.locale.Tr "mail.reset_password.title" (.DisplayName|DotEscape)}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$recover_url := printf "%suser/recover_account?code=%s" AppUrl (QueryEscape .Code)}}
|
||||||
|
<body>
|
||||||
|
<p>{{.locale.Tr "mail.hi_user_x" (.DisplayName|DotEscape) | Str2html}}</p><br>
|
||||||
|
<p>{{.locale.Tr "mail.reset_password.text" .ResetPwdCodeLives | Str2html}}</p><p><a href="{{$recover_url}}">{{$recover_url}}</a></p><br>
|
||||||
|
<p>{{.locale.Tr "mail.link_not_working_do_paste"}}</p>
|
||||||
|
|
||||||
|
<p>© <a target="_blank" rel="noopener noreferrer" href="{{AppUrl}}">{{AppName}}</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
.footer { font-size:small; color:#666;}
|
||||||
|
</style>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>{{.Subject}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$repo_url := printf "<a href='%s'>%s</a>" (Escape .Issue.Repo.HTMLURL) (Escape .Issue.Repo.FullName)}}
|
||||||
|
{{$link := printf "<a href='%s'>#%d</a>" (Escape .Link) .Issue.Index}}
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
{{if .IsPull}}
|
||||||
|
{{.locale.Tr "mail.issue_assigned.pull" .Doer.Name $link $repo_url | Str2html}}
|
||||||
|
{{else}}
|
||||||
|
{{.locale.Tr "mail.issue_assigned.issue" .Doer.Name $link $repo_url | Str2html}}
|
||||||
|
{{end}}
|
||||||
|
</p>
|
||||||
|
<div class="footer">
|
||||||
|
<p>
|
||||||
|
---
|
||||||
|
<br>
|
||||||
|
<a href="{{.Link}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,91 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>{{.Subject}}</title>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
blockquote { padding-left: 1em; margin: 1em 0; border-left: 1px solid grey; color: #777}
|
||||||
|
.footer { font-size:small; color:#666;}
|
||||||
|
{{if .ReviewComments}}
|
||||||
|
.review { padding-left: 1em; margin: 1em 0; }
|
||||||
|
.review > pre { padding: 1em; border-left: 1px solid grey; }
|
||||||
|
{{end}}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
{{if .IsMention}}<p>{{.locale.Tr "mail.issue.x_mentioned_you" .Doer.Name | Str2html}}</p>{{end}}
|
||||||
|
{{if eq .ActionName "push"}}
|
||||||
|
<p>
|
||||||
|
{{if .Comment.IsForcePush}}
|
||||||
|
{{$oldCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.HTMLURL .Comment.OldCommit}}
|
||||||
|
{{$oldShortSha := ShortSha .Comment.OldCommit}}
|
||||||
|
{{$oldCommitLink := printf "<a href='%[1]s'><b>%[2]s</b></a>" (Escape $oldCommitUrl) (Escape $oldShortSha)}}
|
||||||
|
|
||||||
|
{{$newCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.HTMLURL .Comment.NewCommit}}
|
||||||
|
{{$newShortSha := ShortSha .Comment.NewCommit}}
|
||||||
|
{{$newCommitLink := printf "<a href='%[1]s'><b>%[2]s</b></a>" (Escape $newCommitUrl) (Escape $newShortSha)}}
|
||||||
|
|
||||||
|
{{.locale.Tr "mail.issue.action.force_push" .Doer.Name .Comment.Issue.PullRequest.HeadBranch $oldCommitLink $newCommitLink | Str2html}}
|
||||||
|
{{else}}
|
||||||
|
{{.locale.TrN (len .Comment.Commits) "mail.issue.action.push_1" "mail.issue.action.push_n" .Doer.Name .Comment.Issue.PullRequest.HeadBranch (len .Comment.Commits) | Str2html}}
|
||||||
|
{{end}}
|
||||||
|
</p>
|
||||||
|
{{end}}
|
||||||
|
<p>
|
||||||
|
{{if eq .ActionName "close"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.close" (Escape .Doer.Name) .Issue.Index | Str2html}}
|
||||||
|
{{else if eq .ActionName "reopen"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.reopen" (Escape .Doer.Name) .Issue.Index | Str2html}}
|
||||||
|
{{else if eq .ActionName "merge"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.merge" (Escape .Doer.Name) .Issue.Index (Escape .Issue.PullRequest.BaseBranch) | Str2html}}
|
||||||
|
{{else if eq .ActionName "approve"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.approve" (Escape .Doer.Name) | Str2html}}
|
||||||
|
{{else if eq .ActionName "reject"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.reject" (Escape .Doer.Name) | Str2html}}
|
||||||
|
{{else if eq .ActionName "review"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.review" (Escape .Doer.Name) | Str2html}}
|
||||||
|
{{else if eq .ActionName "review_dismissed"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.review_dismissed" (Escape .Doer.Name) (Escape .Comment.Review.Reviewer.Name) | Str2html}}
|
||||||
|
{{else if eq .ActionName "ready_for_review"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.ready_for_review" (Escape .Doer.Name) | Str2html}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{- if eq .Body ""}}
|
||||||
|
{{if eq .ActionName "new"}}
|
||||||
|
{{.locale.Tr "mail.issue.action.new" (Escape .Doer.Name) .Issue.Index | Str2html}}
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
{{.Body | Str2html}}
|
||||||
|
{{end -}}
|
||||||
|
{{- range .ReviewComments}}
|
||||||
|
<hr>
|
||||||
|
{{$.locale.Tr "mail.issue.in_tree_path" .TreePath}}
|
||||||
|
<div class="review">
|
||||||
|
<pre>{{.Patch}}</pre>
|
||||||
|
<div>{{.RenderedContent | Safe}}</div>
|
||||||
|
</div>
|
||||||
|
{{end -}}
|
||||||
|
{{if eq .ActionName "push"}}
|
||||||
|
<ul>
|
||||||
|
{{range .Comment.Commits}}
|
||||||
|
<li>
|
||||||
|
<a href="{{$.Comment.Issue.PullRequest.BaseRepo.HTMLURL}}/commit/{{.ID}}">
|
||||||
|
{{ShortSha .ID.String}}
|
||||||
|
</a> - {{.Summary}}
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
{{end}}
|
||||||
|
</p>
|
||||||
|
<div class="footer">
|
||||||
|
<p>
|
||||||
|
---
|
||||||
|
<br>
|
||||||
|
<a href="{{.Link}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>{{if .CanReply}} {{.locale.Tr "mail.reply"}}{{end}}.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
.footer { font-size:small; color:#666;}
|
||||||
|
</style>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>{{.Subject}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<p>{{.locale.Tr "mail.repo.collaborator.added.text"}} <code>{{.RepoName}}</code></p>
|
||||||
|
<div class="footer">
|
||||||
|
<p>
|
||||||
|
---
|
||||||
|
<br>
|
||||||
|
<a href="{{.Link}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>{{.Subject}}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$url := printf "<a href='%[1]s'>%[2]s</a>" (Escape .Link) (Escape .Repo)}}
|
||||||
|
<body>
|
||||||
|
<p>{{.Subject}}.
|
||||||
|
{{.locale.Tr "mail.repo.transfer.body" $url | Str2html}}
|
||||||
|
<p>
|
||||||
|
---
|
||||||
|
<br>
|
||||||
|
<a href="{{.Link}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,61 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>{{.Subject}}</title>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
blockquote { padding-left: 1em; margin: 1em 0; border-left: 1px solid grey; color: #777}
|
||||||
|
.footer { font-size:small; color:#666;}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
{{$release_url := printf "<a href='%s'>%s</a>" (.Release.HTMLURL | Escape) (.Release.TagName | Escape)}}
|
||||||
|
{{$repo_url := printf "<a href='%s'>%s</a>" (.Release.Repo.HTMLURL | Escape) (.Release.Repo.FullName | Escape)}}
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
{{.locale.Tr "mail.release.new.text" .Release.Publisher.Name $release_url $repo_url | Str2html}}
|
||||||
|
</p>
|
||||||
|
<h4>{{.locale.Tr "mail.release.title" .Release.Title}}</h4>
|
||||||
|
<p>
|
||||||
|
{{.locale.Tr "mail.release.note"}}<br>
|
||||||
|
{{- if eq .Release.RenderedNote ""}}
|
||||||
|
{{else}}
|
||||||
|
{{.Release.RenderedNote | Str2html}}
|
||||||
|
{{end -}}
|
||||||
|
</p>
|
||||||
|
<br><br>
|
||||||
|
<p>
|
||||||
|
---
|
||||||
|
<br>
|
||||||
|
{{.locale.Tr "mail.release.downloads"}}
|
||||||
|
<ul>
|
||||||
|
{{if not .DisableDownloadSourceArchives}}
|
||||||
|
<li>
|
||||||
|
<a href="{{.Release.Repo.Link}}/archive/{{.Release.TagName | PathEscapeSegments}}.zip" rel="nofollow"><strong>{{.locale.Tr "mail.release.download.zip"}}</strong></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="{{.Release.Repo.Link}}/archive/{{.Release.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow"><strong>{{.locale.Tr "mail.release.download.targz"}}</strong></a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{if .Release.Attachments}}
|
||||||
|
{{range .Release.Attachments}}
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" href="{{.DownloadURL}}">
|
||||||
|
<strong>{{.Name}} ({{.Size | FileSize}})</strong>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<div class="footer">
|
||||||
|
<p>
|
||||||
|
---
|
||||||
|
<br>
|
||||||
|
<a href="{{.Link}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no">
|
||||||
|
</head>
|
||||||
|
{{$invite_url := printf "%sorg/invite/%s" AppUrl (QueryEscape .Invite.Token)}}
|
||||||
|
<body>
|
||||||
|
<p>{{.locale.Tr "mail.team_invite.text_1" (DotEscape .Inviter.DisplayName) (DotEscape .Team.Name) (DotEscape .Organization.DisplayName) | Str2html}}</p>
|
||||||
|
<p>{{.locale.Tr "mail.team_invite.text_2"}}</p><p><a href="{{$invite_url}}">{{$invite_url}}</a></p>
|
||||||
|
<p>{{.locale.Tr "mail.link_not_working_do_paste"}}</p>
|
||||||
|
<p>{{.locale.Tr "mail.team_invite.text_3" .Invite.Email}}</p>
|
||||||
|
|
||||||
|
<p>© <a target="_blank" rel="noopener noreferrer" href="{{AppUrl}}">{{AppName}}</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,57 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content organization new org">
|
||||||
|
<div class="ui middle very relaxed page grid">
|
||||||
|
<div class="column">
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<h3 class="ui top attached header">
|
||||||
|
{{.locale.Tr "new_org"}}
|
||||||
|
</h3>
|
||||||
|
<div class="ui attached segment">
|
||||||
|
{{template "base/alert" .}}
|
||||||
|
<div class="inline required field {{if .Err_OrgName}}error{{end}}">
|
||||||
|
<label for="org_name">{{.locale.Tr "org.org_name_holder"}}</label>
|
||||||
|
<input id="org_name" name="org_name" value="{{.org_name}}" autofocus required maxlength="40">
|
||||||
|
<span class="help">{{.locale.Tr "org.org_name_helper"}}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field {{if .Err_OrgVisibility}}error{{end}}">
|
||||||
|
<span class="inline required field"><label for="visibility">{{.locale.Tr "org.settings.visibility"}}</label></span>
|
||||||
|
<div class="inline-grouped-list">
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input class="enable-system-radio" tabindex="0" name="visibility" type="radio" value="0" {{if .DefaultOrgVisibilityMode.IsPublic}}checked{{end}}>
|
||||||
|
<label>{{.locale.Tr "org.settings.visibility.public"}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input class="enable-system-radio" tabindex="0" name="visibility" type="radio" value="1" {{if .DefaultOrgVisibilityMode.IsLimited}}checked{{end}}>
|
||||||
|
<label>{{.locale.Tr "org.settings.visibility.limited"}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input class="enable-system-radio" tabindex="0" name="visibility" type="radio" value="2" {{if .DefaultOrgVisibilityMode.IsPrivate}}checked{{end}}>
|
||||||
|
<label>{{.locale.Tr "org.settings.visibility.private"}}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field" id="permission_box">
|
||||||
|
<label>{{.locale.Tr "org.settings.permission"}}</label>
|
||||||
|
<div class="inline-grouped-list">
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<input type="checkbox" name="repo_admin_change_team_access" checked>
|
||||||
|
<label>{{.locale.Tr "org.settings.repoadminchangeteam"}}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="inline field">
|
||||||
|
<label></label>
|
||||||
|
<button class="ui green button">
|
||||||
|
{{.locale.Tr "org.create_org"}}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,18 @@
|
|||||||
|
{{with .Org}}
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui vertically grid head">
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui header">
|
||||||
|
{{avatar $.Context . 100}}
|
||||||
|
<span class="text thin grey"><a href="{{.HomeLink}}">{{.DisplayName}}</a></span>
|
||||||
|
<span class="org-visibility">
|
||||||
|
{{if .Visibility.IsLimited}}<div class="ui medium basic horizontal label">{{$.locale.Tr "org.settings.visibility.limited_shortname"}}</div>{{end}}
|
||||||
|
{{if .Visibility.IsPrivate}}<div class="ui medium basic horizontal label">{{$.locale.Tr "org.settings.visibility.private_shortname"}}</div>{{end}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{template "org/menu" .}}
|
@ -0,0 +1,95 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content organization profile">
|
||||||
|
<div class="ui container gt-df">
|
||||||
|
{{avatar $.Context .Org 140 "org-avatar"}}
|
||||||
|
<div id="org-info">
|
||||||
|
<div class="ui header gt-df gt-fw">
|
||||||
|
{{.Org.DisplayName}}
|
||||||
|
<span class="org-visibility">
|
||||||
|
{{if .Org.Visibility.IsLimited}}<span class="ui large basic horizontal label">{{.locale.Tr "org.settings.visibility.limited_shortname"}}</span>{{end}}
|
||||||
|
{{if .Org.Visibility.IsPrivate}}<span class="ui large basic horizontal label">{{.locale.Tr "org.settings.visibility.private_shortname"}}</span>{{end}}
|
||||||
|
</span>
|
||||||
|
{{if .EnableFeed}}
|
||||||
|
<a class="rss-icon gt-mx-3" href="{{.Org.HomeLink}}.rss" data-tooltip-content="{{.locale.Tr "rss_feed"}}">{{svg "octicon-rss" 24}}</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{if $.RenderedDescription}}<div class="render-content markup">{{$.RenderedDescription|Str2html}}</div>{{end}}
|
||||||
|
<div class="text grey meta">
|
||||||
|
{{if .Org.Location}}<div class="item">{{svg "octicon-location"}} <span>{{.Org.Location}}</span></div>{{end}}
|
||||||
|
{{if .Org.Website}}<div class="item">{{svg "octicon-link"}} <a target="_blank" rel="noopener noreferrer me" href="{{.Org.Website}}">{{.Org.Website}}</a></div>{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right menu">
|
||||||
|
<form method="post" action="{{.Link}}?action={{if $.IsFollowing}}unfollow{{else}}follow{{end}}&redirect_to={{$.Link}}">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<button type="submit" class="ui basic button gt-mr-0">
|
||||||
|
{{if $.IsFollowing}}
|
||||||
|
{{.locale.Tr "user.unfollow"}}
|
||||||
|
{{else}}
|
||||||
|
{{.locale.Tr "user.follow"}}
|
||||||
|
{{end}}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "org/menu" .}}
|
||||||
|
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui mobile reversed stackable grid">
|
||||||
|
<div class="ui eleven wide column">
|
||||||
|
{{template "explore/repo_search" .}}
|
||||||
|
{{template "explore/repo_list" .}}
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui five wide column">
|
||||||
|
{{if .CanCreateOrgRepo}}
|
||||||
|
<div class="center aligned">
|
||||||
|
<a class="ui green button" href="{{AppSubUrl}}/repo/create?org={{.Org.ID}}">{{.locale.Tr "new_repo"}}</a>
|
||||||
|
{{if not .DisableNewPullMirrors}}
|
||||||
|
<a class="ui green button" href="{{AppSubUrl}}/repo/migrate?org={{.Org.ID}}&mirror=1">{{.locale.Tr "new_migrate"}}</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
{{end}}
|
||||||
|
<h4 class="ui top attached header gt-df">
|
||||||
|
<strong class="gt-f1">{{.locale.Tr "org.members"}}</strong>
|
||||||
|
<a class="text grey gt-dif gt-ac" href="{{.OrgLink}}/members"><span>{{.MembersTotal}}</span> {{svg "octicon-chevron-right"}}</a>
|
||||||
|
</h4>
|
||||||
|
<div class="ui attached segment members">
|
||||||
|
{{$isMember := .IsOrganizationMember}}
|
||||||
|
{{range .Members}}
|
||||||
|
{{if or $isMember (call $.IsPublicMember .ID)}}
|
||||||
|
<a href="{{.HomeLink}}" title="{{.Name}}{{if .FullName}} ({{.FullName}}){{end}}">{{avatar $.Context . 48}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{if .IsOrganizationMember}}
|
||||||
|
<div class="ui top attached header gt-df">
|
||||||
|
<strong class="gt-f1">{{.locale.Tr "org.teams"}}</strong>
|
||||||
|
<a class="text grey gt-dif gt-ac" href="{{.OrgLink}}/teams"><span>{{.Org.NumTeams}}</span> {{svg "octicon-chevron-right"}}</a>
|
||||||
|
</div>
|
||||||
|
<div class="ui attached table segment teams">
|
||||||
|
{{range .Teams}}
|
||||||
|
<div class="item">
|
||||||
|
<a href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}"><strong class="team-name">{{.Name}}</strong></a>
|
||||||
|
<p class="text grey">
|
||||||
|
<a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}"><strong>{{.NumMembers}}</strong> {{$.locale.Tr "org.lower_members"}}</a> ·
|
||||||
|
<a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/repositories"><strong>{{.NumRepos}}</strong> {{$.locale.Tr "org.lower_repositories"}}</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{if .IsOrganizationOwner}}
|
||||||
|
<div class="ui bottom attached segment">
|
||||||
|
<a class="ui primary small button" href="{{.OrgLink}}/teams/new">{{.locale.Tr "org.create_new_team"}}</a>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{template "base/footer" .}}
|
@ -0,0 +1,103 @@
|
|||||||
|
{{template "base/head" .}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content organization members">
|
||||||
|
{{template "org/header" .}}
|
||||||
|
<div class="ui container">
|
||||||
|
{{template "base/alert" .}}
|
||||||
|
|
||||||
|
<div class="list">
|
||||||
|
{{range .Members}}
|
||||||
|
<div class="item ui grid">
|
||||||
|
<div class="ui four wide column gt-df">
|
||||||
|
<a href="{{.HomeLink}}">{{avatar $.Context . 48}}</a>
|
||||||
|
<div>
|
||||||
|
<div class="meta"><a href="{{.HomeLink}}">{{.Name}}</a></div>
|
||||||
|
<div class="meta">{{.FullName}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui four wide column center">
|
||||||
|
<div class="meta">
|
||||||
|
{{$.locale.Tr "org.members.membership_visibility"}}
|
||||||
|
</div>
|
||||||
|
<div class="meta">
|
||||||
|
{{$isPublic := index $.MembersIsPublicMember .ID}}
|
||||||
|
{{if $isPublic}}
|
||||||
|
<strong>{{$.locale.Tr "org.members.public"}}</strong>
|
||||||
|
{{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}(<a class="link-action" href data-url="{{$.OrgLink}}/members/action/private?uid={{.ID}}">{{$.locale.Tr "org.members.public_helper"}}</a>){{end}}
|
||||||
|
{{else}}
|
||||||
|
<strong>{{$.locale.Tr "org.members.private"}}</strong>
|
||||||
|
{{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}(<a class="link-action" href data-url="{{$.OrgLink}}/members/action/public?uid={{.ID}}">{{$.locale.Tr "org.members.private_helper"}}</a>){{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{if not $.PublicOnly}}
|
||||||
|
<div class="ui three wide column center">
|
||||||
|
<div class="meta">
|
||||||
|
{{$.locale.Tr "org.members.member_role"}}
|
||||||
|
</div>
|
||||||
|
<div class="meta">
|
||||||
|
<strong>{{if index $.MembersIsUserOrgOwner .ID}}{{svg "octicon-shield-lock"}} {{$.locale.Tr "org.members.owner"}}{{else}}{{$.locale.Tr "org.members.member"}}{{end}}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui two wide column center">
|
||||||
|
{{if $.IsOrganizationOwner}}
|
||||||
|
<div class="meta">
|
||||||
|
{{$.locale.Tr "admin.users.2fa"}}
|
||||||
|
</div>
|
||||||
|
<div class="meta">
|
||||||
|
<strong>
|
||||||
|
{{if index $.MembersTwoFaStatus .ID}}
|
||||||
|
<span class="text green">{{svg "octicon-check"}}</span>
|
||||||
|
{{else}}
|
||||||
|
{{svg "octicon-x"}}
|
||||||
|
{{end}}
|
||||||
|
</strong>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<div class="ui three wide column gt-df gt-ac gt-je">
|
||||||
|
<div class="text right">
|
||||||
|
{{if eq $.SignedUser.ID .ID}}
|
||||||
|
<form>
|
||||||
|
<button class="ui red small button delete-button" data-modal-id="leave-organization"
|
||||||
|
data-url="{{$.OrgLink}}/members/action/leave" data-datauid="{{.ID}}"
|
||||||
|
data-name="{{.DisplayName}}"
|
||||||
|
data-data-organization-name="{{$.Org.DisplayName}}">{{$.locale.Tr "org.members.leave"}}</button>
|
||||||
|
</form>
|
||||||
|
{{else if $.IsOrganizationOwner}}
|
||||||
|
<form>
|
||||||
|
<button class="ui red small button delete-button" data-modal-id="remove-organization-member"
|
||||||
|
data-url="{{$.OrgLink}}/members/action/remove" data-datauid="{{.ID}}"
|
||||||
|
data-name="{{.DisplayName}}"
|
||||||
|
data-data-organization-name="{{$.Org.DisplayName}}">{{$.locale.Tr "org.members.remove"}}</button>
|
||||||
|
</form>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/paginate" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui g-modal-confirm delete modal" id="leave-organization">
|
||||||
|
<div class="header">
|
||||||
|
{{$.locale.Tr "org.members.leave"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{$.locale.Tr "org.members.leave.detail" `<span class="dataOrganizationName"></span>` | Safe}}</p>
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui g-modal-confirm delete modal" id="remove-organization-member">
|
||||||
|
<div class="header">
|
||||||
|
{{$.locale.Tr "org.members.remove"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{$.locale.Tr "org.members.remove.detail" `<span class="name"></span>` `<span class="dataOrganizationName"></span>` | Safe}}</p>
|
||||||
|
</div>
|
||||||
|
{{template "base/modal_actions_confirm" .}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "base/footer" .}}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue