mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Frontend refactor, PascalCase to camelCase, remove unused code (#17365)
* Frontend refactor, PascalCase to camelCase, remove unused code * fix
This commit is contained in:
		@@ -9,7 +9,6 @@ import (
 | 
				
			|||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/PuerkitoBio/goquery"
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/unknwon/i18n"
 | 
						"github.com/unknwon/i18n"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -62,7 +61,7 @@ func branchAction(t *testing.T, button string) (*HTMLDoc, string) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req = NewRequestWithValues(t, "POST", link, map[string]string{
 | 
						req = NewRequestWithValues(t, "POST", link, map[string]string{
 | 
				
			||||||
		"_csrf": getCsrf(t, htmlDoc.doc),
 | 
							"_csrf": htmlDoc.GetCSRF(),
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	session.MakeRequest(t, req, http.StatusOK)
 | 
						session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -73,9 +72,3 @@ func branchAction(t *testing.T, button string) (*HTMLDoc, string) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return NewHTMLParser(t, resp.Body), url.Query().Get("name")
 | 
						return NewHTMLParser(t, resp.Body), url.Query().Get("name")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
func getCsrf(t *testing.T, doc *goquery.Document) string {
 | 
					 | 
				
			||||||
	csrf, exists := doc.Find("meta[name=\"_csrf\"]").Attr("content")
 | 
					 | 
				
			||||||
	assert.True(t, exists)
 | 
					 | 
				
			||||||
	return csrf
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,7 +44,7 @@ func (doc *HTMLDoc) Find(selector string) *goquery.Selection {
 | 
				
			|||||||
	return doc.doc.Find(selector)
 | 
						return doc.doc.Find(selector)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetCSRF for get CSRC token value from input
 | 
					// GetCSRF for getting CSRF token value from input
 | 
				
			||||||
func (doc *HTMLDoc) GetCSRF() string {
 | 
					func (doc *HTMLDoc) GetCSRF() string {
 | 
				
			||||||
	return doc.GetInputValueByName("_csrf")
 | 
						return doc.GetInputValueByName("_csrf")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,7 +114,7 @@ func testUIDeleteBranch(t *testing.T, session *TestSession, ownerName, repoName,
 | 
				
			|||||||
	htmlDoc := NewHTMLParser(t, resp.Body)
 | 
						htmlDoc := NewHTMLParser(t, resp.Body)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req = NewRequestWithValues(t, "POST", relURL+"/delete", map[string]string{
 | 
						req = NewRequestWithValues(t, "POST", relURL+"/delete", map[string]string{
 | 
				
			||||||
		"_csrf": getCsrf(t, htmlDoc.doc),
 | 
							"_csrf": htmlDoc.GetCSRF(),
 | 
				
			||||||
		"name":  branchName,
 | 
							"name":  branchName,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	session.MakeRequest(t, req, http.StatusOK)
 | 
						session.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
@@ -127,7 +127,7 @@ func testDeleteRepository(t *testing.T, session *TestSession, ownerName, repoNam
 | 
				
			|||||||
	htmlDoc := NewHTMLParser(t, resp.Body)
 | 
						htmlDoc := NewHTMLParser(t, resp.Body)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req = NewRequestWithValues(t, "POST", relURL+"?action=delete", map[string]string{
 | 
						req = NewRequestWithValues(t, "POST", relURL+"?action=delete", map[string]string{
 | 
				
			||||||
		"_csrf":     getCsrf(t, htmlDoc.doc),
 | 
							"_csrf":     htmlDoc.GetCSRF(),
 | 
				
			||||||
		"repo_name": repoName,
 | 
							"repo_name": repoName,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	session.MakeRequest(t, req, http.StatusFound)
 | 
						session.MakeRequest(t, req, http.StatusFound)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -645,7 +645,7 @@ func Contexter() func(next http.Handler) http.Handler {
 | 
				
			|||||||
					"CurrentURL":    setting.AppSubURL + req.URL.RequestURI(),
 | 
										"CurrentURL":    setting.AppSubURL + req.URL.RequestURI(),
 | 
				
			||||||
					"PageStartTime": startTime,
 | 
										"PageStartTime": startTime,
 | 
				
			||||||
					"Link":          link,
 | 
										"Link":          link,
 | 
				
			||||||
					"IsProd":        setting.IsProd,
 | 
										"RunModeIsProd": setting.IsProd,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			// PageData is passed by reference, and it will be rendered to `window.config.pageData` in `head.tmpl` for JavaScript modules
 | 
								// PageData is passed by reference, and it will be rendered to `window.config.pageData` in `head.tmpl` for JavaScript modules
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -205,7 +205,6 @@ func DeleteProject(ctx *context.Context) {
 | 
				
			|||||||
// EditProject allows a project to be edited
 | 
					// EditProject allows a project to be edited
 | 
				
			||||||
func EditProject(ctx *context.Context) {
 | 
					func EditProject(ctx *context.Context) {
 | 
				
			||||||
	ctx.Data["Title"] = ctx.Tr("repo.projects.edit")
 | 
						ctx.Data["Title"] = ctx.Tr("repo.projects.edit")
 | 
				
			||||||
	ctx.Data["PageIsProjects"] = true
 | 
					 | 
				
			||||||
	ctx.Data["PageIsEditProjects"] = true
 | 
						ctx.Data["PageIsEditProjects"] = true
 | 
				
			||||||
	ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
 | 
						ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -233,7 +232,6 @@ func EditProject(ctx *context.Context) {
 | 
				
			|||||||
func EditProjectPost(ctx *context.Context) {
 | 
					func EditProjectPost(ctx *context.Context) {
 | 
				
			||||||
	form := web.GetForm(ctx).(*forms.CreateProjectForm)
 | 
						form := web.GetForm(ctx).(*forms.CreateProjectForm)
 | 
				
			||||||
	ctx.Data["Title"] = ctx.Tr("repo.projects.edit")
 | 
						ctx.Data["Title"] = ctx.Tr("repo.projects.edit")
 | 
				
			||||||
	ctx.Data["PageIsProjects"] = true
 | 
					 | 
				
			||||||
	ctx.Data["PageIsEditProjects"] = true
 | 
						ctx.Data["PageIsEditProjects"] = true
 | 
				
			||||||
	ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
 | 
						ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -335,8 +333,6 @@ func ViewProject(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
 | 
						ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
 | 
				
			||||||
	ctx.Data["Project"] = project
 | 
						ctx.Data["Project"] = project
 | 
				
			||||||
	ctx.Data["Boards"] = boards
 | 
						ctx.Data["Boards"] = boards
 | 
				
			||||||
	ctx.Data["PageIsProjects"] = true
 | 
					 | 
				
			||||||
	ctx.Data["RequiresDraggable"] = true
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.HTML(http.StatusOK, tplProjectsView)
 | 
						ctx.HTML(http.StatusOK, tplProjectsView)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@
 | 
				
			|||||||
<head>
 | 
					<head>
 | 
				
			||||||
	<meta charset="utf-8">
 | 
						<meta charset="utf-8">
 | 
				
			||||||
	<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
						<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
				
			||||||
	<title>{{if .Title}}{{.Title | RenderEmojiPlain}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} </title>
 | 
						<title>{{if .Title}}{{.Title | RenderEmojiPlain}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}}</title>
 | 
				
			||||||
	<link rel="manifest" href="data:{{.ManifestData}}"/>
 | 
						<link rel="manifest" href="data:{{.ManifestData}}"/>
 | 
				
			||||||
	<meta name="theme-color" content="{{ThemeColorMetaTag}}">
 | 
						<meta name="theme-color" content="{{ThemeColorMetaTag}}">
 | 
				
			||||||
	<meta name="default-theme" content="{{DefaultTheme}}" />
 | 
						<meta name="default-theme" content="{{DefaultTheme}}" />
 | 
				
			||||||
@@ -11,7 +11,6 @@
 | 
				
			|||||||
	<meta name="description" content="{{if .Repository}}{{.Repository.Name}}{{if .Repository.Description}} - {{.Repository.Description}}{{end}}{{else}}{{MetaDescription}}{{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="keywords" content="{{MetaKeywords}}">
 | 
				
			||||||
	<meta name="referrer" content="no-referrer" />
 | 
						<meta name="referrer" content="no-referrer" />
 | 
				
			||||||
	<meta name="_csrf" content="{{.CsrfToken}}" />
 | 
					 | 
				
			||||||
{{if .GoGetImport}}
 | 
					{{if .GoGetImport}}
 | 
				
			||||||
	<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">
 | 
						<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">
 | 
				
			||||||
	<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
 | 
						<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
 | 
				
			||||||
@@ -19,25 +18,17 @@
 | 
				
			|||||||
	<script>
 | 
						<script>
 | 
				
			||||||
		<!-- /* eslint-disable */ -->
 | 
							<!-- /* eslint-disable */ -->
 | 
				
			||||||
		window.config = {
 | 
							window.config = {
 | 
				
			||||||
			AppVer: '{{AppVer}}',
 | 
								appVer: '{{AppVer}}',
 | 
				
			||||||
			AppSubUrl: '{{AppSubUrl}}',
 | 
								appSubUrl: '{{AppSubUrl}}',
 | 
				
			||||||
			AssetUrlPrefix: '{{AssetUrlPrefix}}',
 | 
								assetUrlPrefix: '{{AssetUrlPrefix}}',
 | 
				
			||||||
			IsProd: {{.IsProd}},
 | 
								runModeIsProd: {{.RunModeIsProd}},
 | 
				
			||||||
			CustomEmojis: {{CustomEmojis}},
 | 
								customEmojis: {{CustomEmojis}},
 | 
				
			||||||
			UseServiceWorker: {{UseServiceWorker}},
 | 
								useServiceWorker: {{UseServiceWorker}},
 | 
				
			||||||
			csrf: '{{.CsrfToken}}',
 | 
								csrfToken: '{{.CsrfToken}}',
 | 
				
			||||||
			pageData: {{ .PageData }},
 | 
								pageData: {{.PageData}},
 | 
				
			||||||
			HighlightJS: {{if .RequireHighlightJS}}true{{else}}false{{end}},
 | 
								requireTribute: {{.RequireTribute}},
 | 
				
			||||||
			SimpleMDE: {{if .RequireSimpleMDE}}true{{else}}false{{end}},
 | 
								notificationSettings: {{NotificationSettings}}, {{/*a map provided by NewFuncMap in helper.go*/}}
 | 
				
			||||||
			Tribute: {{if .RequireTribute}}true{{else}}false{{end}},
 | 
								enableTimeTracking: {{EnableTimetracking}},
 | 
				
			||||||
			NotificationSettings: {
 | 
					 | 
				
			||||||
				MinTimeout: {{NotificationSettings.MinTimeout}},
 | 
					 | 
				
			||||||
				TimeoutStep:  {{NotificationSettings.TimeoutStep}},
 | 
					 | 
				
			||||||
				MaxTimeout: {{NotificationSettings.MaxTimeout}},
 | 
					 | 
				
			||||||
				EventSourceUpdateTime: {{NotificationSettings.EventSourceUpdateTime}},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			EnableTimetracking: {{if EnableTimetracking}}true{{else}}false{{end}},
 | 
					 | 
				
			||||||
			PageIsProjects: {{if .PageIsProjects }}true{{else}}false{{end}},
 | 
					 | 
				
			||||||
			{{if .RequireTribute}}
 | 
								{{if .RequireTribute}}
 | 
				
			||||||
			tributeValues: Array.from(new Map([
 | 
								tributeValues: Array.from(new Map([
 | 
				
			||||||
				{{ range .Participants }}
 | 
									{{ range .Participants }}
 | 
				
			||||||
@@ -54,7 +45,7 @@
 | 
				
			|||||||
				{{ end }}
 | 
									{{ end }}
 | 
				
			||||||
			]).values()),
 | 
								]).values()),
 | 
				
			||||||
			{{end}}
 | 
								{{end}}
 | 
				
			||||||
			MermaidMaxSourceCharacters: {{MermaidMaxSourceCharacters}},
 | 
								mermaidMaxSourceCharacters: {{MermaidMaxSourceCharacters}},
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	</script>
 | 
						</script>
 | 
				
			||||||
	<link rel="icon" href="{{AssetUrlPrefix}}/img/logo.svg" type="image/svg+xml">
 | 
						<link rel="icon" href="{{AssetUrlPrefix}}/img/logo.svg" type="image/svg+xml">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{{template "base/head" .}}
 | 
					{{template "base/head" .}}
 | 
				
			||||||
<div class="page-content repository milestones">
 | 
					<div class="page-content repository projects milestones">
 | 
				
			||||||
	{{template "repo/header" .}}
 | 
						{{template "repo/header" .}}
 | 
				
			||||||
	<div class="ui container">
 | 
						<div class="ui container">
 | 
				
			||||||
		<div class="navbar">
 | 
							<div class="navbar">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{{template "base/head" .}}
 | 
					{{template "base/head" .}}
 | 
				
			||||||
<div class="page-content repository new milestone">
 | 
					<div class="page-content repository projects edit-project new milestone">
 | 
				
			||||||
	{{template "repo/header" .}}
 | 
						{{template "repo/header" .}}
 | 
				
			||||||
	<div class="ui container">
 | 
						<div class="ui container">
 | 
				
			||||||
		<div class="navbar">
 | 
							<div class="navbar">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
{{template "base/head" .}}
 | 
					{{template "base/head" .}}
 | 
				
			||||||
<div class="page-content repository">
 | 
					<div class="page-content repository projects view-project">
 | 
				
			||||||
	{{template "repo/header" .}}
 | 
						{{template "repo/header" .}}
 | 
				
			||||||
	<div class="ui container">
 | 
						<div class="ui container">
 | 
				
			||||||
		<div class="ui two column stackable grid">
 | 
							<div class="ui two column stackable grid">
 | 
				
			||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
				{{template "repo/issue/navbar" .}}
 | 
									{{template "repo/issue/navbar" .}}
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="column right aligned">
 | 
								<div class="column right aligned">
 | 
				
			||||||
				{{if and .CanWriteProjects (not .Repository.IsArchived) .PageIsProjects}}
 | 
									{{if and .CanWriteProjects (not .Repository.IsArchived)}}
 | 
				
			||||||
					<a class="ui green button show-modal item" href="{{$.RepoLink}}/issues/new?project={{$.Project.ID}}">{{.i18n.Tr "repo.issues.new"}}</a>
 | 
										<a class="ui green button show-modal item" href="{{$.RepoLink}}/issues/new?project={{$.Project.ID}}">{{.i18n.Tr "repo.issues.new"}}</a>
 | 
				
			||||||
					<a class="ui green button show-modal item" data-modal="#new-board-item">{{.i18n.Tr "new_project_board"}}</a>
 | 
										<a class="ui green button show-modal item" data-modal="#new-board-item">{{.i18n.Tr "new_project_board"}}</a>
 | 
				
			||||||
				{{end}}
 | 
									{{end}}
 | 
				
			||||||
@@ -80,10 +80,10 @@
 | 
				
			|||||||
		<div class="board">
 | 
							<div class="board">
 | 
				
			||||||
			{{ range $board := .Boards }}
 | 
								{{ range $board := .Boards }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			<div class="ui segment board-column" style="background: {{.Color}}!important;" data-id="{{.ID}}" data-sorting="{{.Sorting}}" data-url="{{$.RepoLink}}/projects/{{$.Project.ID}}/{{.ID}}">
 | 
								<div class="ui segment board-column" style="background: {{.Color}} !important;" data-id="{{.ID}}" data-sorting="{{.Sorting}}" data-url="{{$.RepoLink}}/projects/{{$.Project.ID}}/{{.ID}}">
 | 
				
			||||||
				<div class="board-column-header df ac sb">
 | 
									<div class="board-column-header df ac sb">
 | 
				
			||||||
					<div class="ui large label board-label py-2">{{.Title}}</div>
 | 
										<div class="ui large label board-label py-2">{{.Title}}</div>
 | 
				
			||||||
					{{if and $.CanWriteProjects (not $.Repository.IsArchived) $.PageIsProjects (ne .ID 0)}}
 | 
										{{if and $.CanWriteProjects (not $.Repository.IsArchived) (ne .ID 0)}}
 | 
				
			||||||
						<div class="ui dropdown jump item poping up" data-variation="tiny inverted">
 | 
											<div class="ui dropdown jump item poping up" data-variation="tiny inverted">
 | 
				
			||||||
							<div class="not-mobile px-3" tabindex="-1">
 | 
												<div class="not-mobile px-3" tabindex="-1">
 | 
				
			||||||
								{{svg "octicon-kebab-horizontal"}}
 | 
													{{svg "octicon-kebab-horizontal"}}
 | 
				
			||||||
@@ -232,7 +232,7 @@
 | 
				
			|||||||
						{{if .Labels}}
 | 
											{{if .Labels}}
 | 
				
			||||||
							<div class="extra content labels-list p-0 pt-2">
 | 
												<div class="extra content labels-list p-0 pt-2">
 | 
				
			||||||
								{{ range .Labels }}
 | 
													{{ range .Labels }}
 | 
				
			||||||
								<a class="ui label" href="{{$.RepoLink}}/issues?labels={{.ID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}}" title="{{.Description | RenderEmojiPlain}}">{{.Name | RenderEmoji}}</a>
 | 
													<a class="ui label" href="{{$.RepoLink}}/issues?labels={{.ID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}};" title="{{.Description | RenderEmojiPlain}}">{{.Name | RenderEmoji}}</a>
 | 
				
			||||||
								{{ end }}
 | 
													{{ end }}
 | 
				
			||||||
							</div>
 | 
												</div>
 | 
				
			||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
import {SvgIcon} from '../svg.js';
 | 
					import {SvgIcon} from '../svg.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl} = window.config;
 | 
					const {appSubUrl} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NOTE: see models/issue_label.go for similar implementation
 | 
					// NOTE: see models/issue_label.go for similar implementation
 | 
				
			||||||
const srgbToLinear = (color) => {
 | 
					const srgbToLinear = (color) => {
 | 
				
			||||||
@@ -112,7 +112,7 @@ export default {
 | 
				
			|||||||
  methods: {
 | 
					  methods: {
 | 
				
			||||||
    load(data, callback) {
 | 
					    load(data, callback) {
 | 
				
			||||||
      this.loading = true;
 | 
					      this.loading = true;
 | 
				
			||||||
      $.get(`${AppSubUrl}/api/v1/repos/${data.owner}/${data.repo}/issues/${data.index}`, (issue) => {
 | 
					      $.get(`${appSubUrl}/api/v1/repos/${data.owner}/${data.repo}/issues/${data.index}`, (issue) => {
 | 
				
			||||||
        this.issue = issue;
 | 
					        this.issue = issue;
 | 
				
			||||||
        this.loading = false;
 | 
					        this.loading = false;
 | 
				
			||||||
        this.$nextTick(() => {
 | 
					        this.$nextTick(() => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
import {initVueSvg, vueDelimiters} from './VueComponentLoader.js';
 | 
					import {initVueSvg, vueDelimiters} from './VueComponentLoader.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl, AssetUrlPrefix, pageData} = window.config;
 | 
					const {appSubUrl, assetUrlPrefix, pageData} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function initVueComponents() {
 | 
					function initVueComponents() {
 | 
				
			||||||
  Vue.component('repo-search', {
 | 
					  Vue.component('repo-search', {
 | 
				
			||||||
@@ -95,7 +95,7 @@ function initVueComponents() {
 | 
				
			|||||||
        finalPage: 1,
 | 
					        finalPage: 1,
 | 
				
			||||||
        searchQuery,
 | 
					        searchQuery,
 | 
				
			||||||
        isLoading: false,
 | 
					        isLoading: false,
 | 
				
			||||||
        staticPrefix: AssetUrlPrefix,
 | 
					        staticPrefix: assetUrlPrefix,
 | 
				
			||||||
        counts: {},
 | 
					        counts: {},
 | 
				
			||||||
        repoTypes: {
 | 
					        repoTypes: {
 | 
				
			||||||
          all: {
 | 
					          all: {
 | 
				
			||||||
@@ -361,7 +361,7 @@ export function initDashboardRepoList() {
 | 
				
			|||||||
    data: () => {
 | 
					    data: () => {
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
        searchLimit: dashboardRepoListData.searchLimit || 0,
 | 
					        searchLimit: dashboardRepoListData.searchLimit || 0,
 | 
				
			||||||
        subUrl: AppSubUrl,
 | 
					        subUrl: appSubUrl,
 | 
				
			||||||
        uid: dashboardRepoListData.uid || 0,
 | 
					        uid: dashboardRepoListData.uid || 0,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ export function initVueEnv() {
 | 
				
			|||||||
  if (vueEnvInited) return;
 | 
					  if (vueEnvInited) return;
 | 
				
			||||||
  vueEnvInited = true;
 | 
					  vueEnvInited = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const isProd = window.config.IsProd;
 | 
					  const isProd = window.config.runModeIsProd;
 | 
				
			||||||
  Vue.config.productionTip = false;
 | 
					  Vue.config.productionTip = false;
 | 
				
			||||||
  Vue.config.devtools = !isProd;
 | 
					  Vue.config.devtools = !isProd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initAdminCommon() {
 | 
					export function initAdminCommon() {
 | 
				
			||||||
  if ($('.admin').length === 0) {
 | 
					  if ($('.admin').length === 0) {
 | 
				
			||||||
@@ -204,7 +204,7 @@ export function initAdminCommon() {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      $.post($this.data('link'), {
 | 
					      $.post($this.data('link'), {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
        ids
 | 
					        ids
 | 
				
			||||||
      }).done(() => {
 | 
					      }).done(() => {
 | 
				
			||||||
        window.location.href = $this.data('redirect');
 | 
					        window.location.href = $this.data('redirect');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ import {initCompColorPicker} from './comp/ColorPicker.js';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import 'jquery.are-you-sure';
 | 
					import 'jquery.are-you-sure';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initGlobalFormDirtyLeaveConfirm() {
 | 
					export function initGlobalFormDirtyLeaveConfirm() {
 | 
				
			||||||
  // Warn users that try to leave a page after entering data into a form.
 | 
					  // Warn users that try to leave a page after entering data into a form.
 | 
				
			||||||
@@ -136,7 +136,7 @@ export async function initGlobalDropzone() {
 | 
				
			|||||||
    const $dropzone = $(el);
 | 
					    const $dropzone = $(el);
 | 
				
			||||||
    await createDropzone(el, {
 | 
					    await createDropzone(el, {
 | 
				
			||||||
      url: $dropzone.data('upload-url'),
 | 
					      url: $dropzone.data('upload-url'),
 | 
				
			||||||
      headers: {'X-Csrf-Token': csrf},
 | 
					      headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
      maxFiles: $dropzone.data('max-file'),
 | 
					      maxFiles: $dropzone.data('max-file'),
 | 
				
			||||||
      maxFilesize: $dropzone.data('max-size'),
 | 
					      maxFilesize: $dropzone.data('max-size'),
 | 
				
			||||||
      acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
 | 
					      acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
 | 
				
			||||||
@@ -159,7 +159,7 @@ export async function initGlobalDropzone() {
 | 
				
			|||||||
          if ($dropzone.data('remove-url')) {
 | 
					          if ($dropzone.data('remove-url')) {
 | 
				
			||||||
            $.post($dropzone.data('remove-url'), {
 | 
					            $.post($dropzone.data('remove-url'), {
 | 
				
			||||||
              file: file.uuid,
 | 
					              file: file.uuid,
 | 
				
			||||||
              _csrf: csrf,
 | 
					              _csrf: csrfToken,
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -194,7 +194,7 @@ export function initGlobalLinkActions() {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const postData = {
 | 
					        const postData = {
 | 
				
			||||||
          _csrf: csrf,
 | 
					          _csrf: csrfToken,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        for (const [key, value] of Object.entries(dataArray)) {
 | 
					        for (const [key, value] of Object.entries(dataArray)) {
 | 
				
			||||||
          if (key && key.startsWith('data')) {
 | 
					          if (key && key.startsWith('data')) {
 | 
				
			||||||
@@ -232,7 +232,7 @@ export function initGlobalLinkActions() {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $.post($this.data('url'), {
 | 
					        $.post($this.data('url'), {
 | 
				
			||||||
          _csrf: csrf,
 | 
					          _csrf: csrfToken,
 | 
				
			||||||
          id: $this.data('id')
 | 
					          id: $this.data('id')
 | 
				
			||||||
        }).done((data) => {
 | 
					        }).done((data) => {
 | 
				
			||||||
          window.location.href = data.redirect;
 | 
					          window.location.href = data.redirect;
 | 
				
			||||||
@@ -247,7 +247,7 @@ export function initGlobalLinkActions() {
 | 
				
			|||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    const redirect = $this.data('redirect');
 | 
					    const redirect = $this.data('redirect');
 | 
				
			||||||
    $.post($this.data('url'), {
 | 
					    $.post($this.data('url'), {
 | 
				
			||||||
      _csrf: csrf
 | 
					      _csrf: csrfToken
 | 
				
			||||||
    }).done((data) => {
 | 
					    }).done((data) => {
 | 
				
			||||||
      if (data.redirect) {
 | 
					      if (data.redirect) {
 | 
				
			||||||
        window.location.href = data.redirect;
 | 
					        window.location.href = data.redirect;
 | 
				
			||||||
@@ -270,7 +270,7 @@ export function initGlobalLinkActions() {
 | 
				
			|||||||
  $('.undo-button').on('click', function () {
 | 
					  $('.undo-button').on('click', function () {
 | 
				
			||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    $.post($this.data('url'), {
 | 
					    $.post($this.data('url'), {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      id: $this.data('id')
 | 
					      id: $this.data('id')
 | 
				
			||||||
    }).done((data) => {
 | 
					    }).done((data) => {
 | 
				
			||||||
      window.location.href = data.redirect;
 | 
					      window.location.href = data.redirect;
 | 
				
			||||||
@@ -298,7 +298,7 @@ export function initGlobalButtons() {
 | 
				
			|||||||
  $('.delete-post.button').on('click', function () {
 | 
					  $('.delete-post.button').on('click', function () {
 | 
				
			||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    $.post($this.data('request-url'), {
 | 
					    $.post($this.data('request-url'), {
 | 
				
			||||||
      _csrf: csrf
 | 
					      _csrf: csrfToken
 | 
				
			||||||
    }).done(() => {
 | 
					    }).done(() => {
 | 
				
			||||||
      window.location.href = $this.data('done-url');
 | 
					      window.location.href = $this.data('done-url');
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function uploadFile(file, uploadUrl) {
 | 
					async function uploadFile(file, uploadUrl) {
 | 
				
			||||||
  const formData = new FormData();
 | 
					  const formData = new FormData();
 | 
				
			||||||
@@ -6,7 +6,7 @@ async function uploadFile(file, uploadUrl) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  const res = await fetch(uploadUrl, {
 | 
					  const res = await fetch(uploadUrl, {
 | 
				
			||||||
    method: 'POST',
 | 
					    method: 'POST',
 | 
				
			||||||
    headers: {'X-Csrf-Token': csrf},
 | 
					    headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
    body: formData,
 | 
					    body: formData,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
  return await res.json();
 | 
					  return await res.json();
 | 
				
			||||||
@@ -67,7 +67,7 @@ export function initCompImagePaste($target) {
 | 
				
			|||||||
          const name = img.name.substr(0, img.name.lastIndexOf('.'));
 | 
					          const name = img.name.substr(0, img.name.lastIndexOf('.'));
 | 
				
			||||||
          insertAtCursor(textarea, `![${name}]()`);
 | 
					          insertAtCursor(textarea, `![${name}]()`);
 | 
				
			||||||
          const data = await uploadFile(img, uploadUrl);
 | 
					          const data = await uploadFile(img, uploadUrl);
 | 
				
			||||||
          replaceAndKeepCursor(textarea, `![${name}]()`, ``);
 | 
					          replaceAndKeepCursor(textarea, `![${name}]()`, ``);
 | 
				
			||||||
          const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
 | 
					          const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
 | 
				
			||||||
          dropzoneFiles.appendChild(input[0]);
 | 
					          dropzoneFiles.appendChild(input[0]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -83,7 +83,7 @@ export function initSimpleMDEImagePaste(simplemde, dropzone, files) {
 | 
				
			|||||||
      const name = img.name.substr(0, img.name.lastIndexOf('.'));
 | 
					      const name = img.name.substr(0, img.name.lastIndexOf('.'));
 | 
				
			||||||
      const data = await uploadFile(img, uploadUrl);
 | 
					      const data = await uploadFile(img, uploadUrl);
 | 
				
			||||||
      const pos = simplemde.codemirror.getCursor();
 | 
					      const pos = simplemde.codemirror.getCursor();
 | 
				
			||||||
      simplemde.codemirror.replaceRange(``, pos);
 | 
					      simplemde.codemirror.replaceRange(``, pos);
 | 
				
			||||||
      const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
 | 
					      const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
 | 
				
			||||||
      files.append(input);
 | 
					      files.append(input);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import {initMarkupContent} from '../../markup/content.js';
 | 
					import {initMarkupContent} from '../../markup/content.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initCompMarkupContentPreviewTab($form) {
 | 
					export function initCompMarkupContentPreviewTab($form) {
 | 
				
			||||||
  const $tabMenu = $form.find('.tabular.menu');
 | 
					  const $tabMenu = $form.find('.tabular.menu');
 | 
				
			||||||
@@ -8,7 +8,7 @@ export function initCompMarkupContentPreviewTab($form) {
 | 
				
			|||||||
  $tabMenu.find(`.item[data-tab="${$tabMenu.data('preview')}"]`).on('click', function () {
 | 
					  $tabMenu.find(`.item[data-tab="${$tabMenu.data('preview')}"]`).on('click', function () {
 | 
				
			||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    $.post($this.data('url'), {
 | 
					    $.post($this.data('url'), {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      mode: 'comment',
 | 
					      mode: 'comment',
 | 
				
			||||||
      context: $this.data('context'),
 | 
					      context: $this.data('context'),
 | 
				
			||||||
      text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
 | 
					      text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initCompReactionSelector(parent) {
 | 
					export function initCompReactionSelector(parent) {
 | 
				
			||||||
  let reactions = '';
 | 
					  let reactions = '';
 | 
				
			||||||
@@ -20,7 +20,7 @@ export function initCompReactionSelector(parent) {
 | 
				
			|||||||
      type: 'POST',
 | 
					      type: 'POST',
 | 
				
			||||||
      url,
 | 
					      url,
 | 
				
			||||||
      data: {
 | 
					      data: {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
        content: $(this).data('content')
 | 
					        content: $(this).data('content')
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }).done((resp) => {
 | 
					    }).done((resp) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,13 @@
 | 
				
			|||||||
import {htmlEscape} from 'escape-goat';
 | 
					import {htmlEscape} from 'escape-goat';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl} = window.config;
 | 
					const {appSubUrl} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initSearchUserBox() {
 | 
					export function initSearchUserBox() {
 | 
				
			||||||
  const $searchUserBox = $('#search-user-box');
 | 
					  const $searchUserBox = $('#search-user-box');
 | 
				
			||||||
  $searchUserBox.search({
 | 
					  $searchUserBox.search({
 | 
				
			||||||
    minCharacters: 2,
 | 
					    minCharacters: 2,
 | 
				
			||||||
    apiSettings: {
 | 
					    apiSettings: {
 | 
				
			||||||
      url: `${AppSubUrl}/api/v1/users/search?q={query}`,
 | 
					      url: `${appSubUrl}/api/v1/users/search?q={query}`,
 | 
				
			||||||
      onResponse(response) {
 | 
					      onResponse(response) {
 | 
				
			||||||
        const items = [];
 | 
					        const items = [];
 | 
				
			||||||
        const searchQueryUppercase = $searchUserBox.find('input').val().toUpperCase();
 | 
					        const searchQueryUppercase = $searchUserBox.find('input').val().toUpperCase();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initWebHookEditor() {
 | 
					export function initWebHookEditor() {
 | 
				
			||||||
  if ($('.new.webhook').length === 0) {
 | 
					  if ($('.new.webhook').length === 0) {
 | 
				
			||||||
@@ -30,7 +30,7 @@ export function initWebHookEditor() {
 | 
				
			|||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    $this.addClass('loading disabled');
 | 
					    $this.addClass('loading disabled');
 | 
				
			||||||
    $.post($this.data('link'), {
 | 
					    $.post($this.data('link'), {
 | 
				
			||||||
      _csrf: csrf
 | 
					      _csrf: csrfToken
 | 
				
			||||||
    }).done(
 | 
					    }).done(
 | 
				
			||||||
      setTimeout(() => {
 | 
					      setTimeout(() => {
 | 
				
			||||||
        window.location.href = $this.data('redirect');
 | 
					        window.location.href = $this.data('redirect');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
import emojis from '../../../assets/emoji.json';
 | 
					import emojis from '../../../assets/emoji.json';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AssetUrlPrefix} = window.config;
 | 
					const {assetUrlPrefix} = window.config;
 | 
				
			||||||
const {CustomEmojis} = window.config;
 | 
					const {customEmojis} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const tempMap = {...CustomEmojis};
 | 
					const tempMap = {...customEmojis};
 | 
				
			||||||
for (const {emoji, aliases} of emojis) {
 | 
					for (const {emoji, aliases} of emojis) {
 | 
				
			||||||
  for (const alias of aliases || []) {
 | 
					  for (const alias of aliases || []) {
 | 
				
			||||||
    tempMap[alias] = emoji;
 | 
					    tempMap[alias] = emoji;
 | 
				
			||||||
@@ -24,8 +24,8 @@ for (const key of emojiKeys) {
 | 
				
			|||||||
// retrieve HTML for given emoji name
 | 
					// retrieve HTML for given emoji name
 | 
				
			||||||
export function emojiHTML(name) {
 | 
					export function emojiHTML(name) {
 | 
				
			||||||
  let inner;
 | 
					  let inner;
 | 
				
			||||||
  if (Object.prototype.hasOwnProperty.call(CustomEmojis, name)) {
 | 
					  if (Object.prototype.hasOwnProperty.call(customEmojis, name)) {
 | 
				
			||||||
    inner = `<img alt=":${name}:" src="${AssetUrlPrefix}/img/emoji/${name}.png">`;
 | 
					    inner = `<img alt=":${name}:" src="${assetUrlPrefix}/img/emoji/${name}.png">`;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    inner = emojiString(name);
 | 
					    inner = emojiString(name);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import {svg} from '../svg.js';
 | 
					import {svg} from '../svg.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let i18nTextEdited;
 | 
					let i18nTextEdited;
 | 
				
			||||||
let i18nTextOptions;
 | 
					let i18nTextOptions;
 | 
				
			||||||
@@ -37,7 +37,7 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
 | 
				
			|||||||
      if (optionItem === 'delete') {
 | 
					      if (optionItem === 'delete') {
 | 
				
			||||||
        if (window.confirm(i18nTextDeleteFromHistoryConfirm)) {
 | 
					        if (window.confirm(i18nTextDeleteFromHistoryConfirm)) {
 | 
				
			||||||
          $.post(`${issueBaseUrl}/content-history/soft-delete?comment_id=${commentId}&history_id=${historyId}`, {
 | 
					          $.post(`${issueBaseUrl}/content-history/soft-delete?comment_id=${commentId}&history_id=${historyId}`, {
 | 
				
			||||||
            _csrf: csrf,
 | 
					            _csrf: csrfToken,
 | 
				
			||||||
          }).done((resp) => {
 | 
					          }).done((resp) => {
 | 
				
			||||||
            if (resp.ok) {
 | 
					            if (resp.ok) {
 | 
				
			||||||
              $dialog.modal('hide');
 | 
					              $dialog.modal('hide');
 | 
				
			||||||
@@ -59,7 +59,7 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
 | 
				
			|||||||
      $.ajax({
 | 
					      $.ajax({
 | 
				
			||||||
        url: `${issueBaseUrl}/content-history/detail?comment_id=${commentId}&history_id=${historyId}`,
 | 
					        url: `${issueBaseUrl}/content-history/detail?comment_id=${commentId}&history_id=${historyId}`,
 | 
				
			||||||
        data: {
 | 
					        data: {
 | 
				
			||||||
          _csrf: csrf,
 | 
					          _csrf: csrfToken,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
      }).done((resp) => {
 | 
					      }).done((resp) => {
 | 
				
			||||||
        $dialog.find('.content').html(resp.diffHtml);
 | 
					        $dialog.find('.content').html(resp.diffHtml);
 | 
				
			||||||
@@ -110,12 +110,12 @@ export function initIssueContentHistory() {
 | 
				
			|||||||
  if (!issueIndex || !$itemIssue.length) return;
 | 
					  if (!issueIndex || !$itemIssue.length) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const repoLink = $('#repolink').val();
 | 
					  const repoLink = $('#repolink').val();
 | 
				
			||||||
  const issueBaseUrl = `${AppSubUrl}/${repoLink}/issues/${issueIndex}`;
 | 
					  const issueBaseUrl = `${appSubUrl}/${repoLink}/issues/${issueIndex}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $.ajax({
 | 
					  $.ajax({
 | 
				
			||||||
    url: `${issueBaseUrl}/content-history/overview`,
 | 
					    url: `${issueBaseUrl}/content-history/overview`,
 | 
				
			||||||
    data: {
 | 
					    data: {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  }).done((resp) => {
 | 
					  }).done((resp) => {
 | 
				
			||||||
    i18nTextEdited = resp.i18n.textEdited;
 | 
					    i18nTextEdited = resp.i18n.textEdited;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function initLastCommitLoader() {
 | 
					export async function initLastCommitLoader() {
 | 
				
			||||||
  const entryMap = {};
 | 
					  const entryMap = {};
 | 
				
			||||||
@@ -18,7 +18,7 @@ export async function initLastCommitLoader() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (entries.length > 200) {
 | 
					  if (entries.length > 200) {
 | 
				
			||||||
    $.post(lastCommitLoaderURL, {
 | 
					    $.post(lastCommitLoaderURL, {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
    }, (data) => {
 | 
					    }, (data) => {
 | 
				
			||||||
      $('table#repo-files-table').replaceWith(data);
 | 
					      $('table#repo-files-table').replaceWith(data);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -26,7 +26,7 @@ export async function initLastCommitLoader() {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $.post(lastCommitLoaderURL, {
 | 
					  $.post(lastCommitLoaderURL, {
 | 
				
			||||||
    _csrf: csrf,
 | 
					    _csrf: csrfToken,
 | 
				
			||||||
    'f': entries,
 | 
					    'f': entries,
 | 
				
			||||||
  }, (data) => {
 | 
					  }, (data) => {
 | 
				
			||||||
    $(data).find('tr').each((_, row) => {
 | 
					    $(data).find('tr').each((_, row) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {AppSubUrl, csrf, NotificationSettings} = window.config;
 | 
					const {appSubUrl, csrfToken, notificationSettings} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let notificationSequenceNumber = 0;
 | 
					let notificationSequenceNumber = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,7 +47,7 @@ export async function initNotificationCount() {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (NotificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
 | 
					  if (notificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
 | 
				
			||||||
    // Try to connect to the event source via the shared worker first
 | 
					    // Try to connect to the event source via the shared worker first
 | 
				
			||||||
    const worker = new SharedWorker(`${__webpack_public_path__}js/eventsource.sharedworker.js`, 'notification-worker');
 | 
					    const worker = new SharedWorker(`${__webpack_public_path__}js/eventsource.sharedworker.js`, 'notification-worker');
 | 
				
			||||||
    worker.addEventListener('error', (event) => {
 | 
					    worker.addEventListener('error', (event) => {
 | 
				
			||||||
@@ -58,7 +58,7 @@ export async function initNotificationCount() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
    worker.port.postMessage({
 | 
					    worker.port.postMessage({
 | 
				
			||||||
      type: 'start',
 | 
					      type: 'start',
 | 
				
			||||||
      url: `${window.location.origin}${AppSubUrl}/user/events`,
 | 
					      url: `${window.location.origin}${appSubUrl}/user/events`,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    worker.port.addEventListener('message', (event) => {
 | 
					    worker.port.addEventListener('message', (event) => {
 | 
				
			||||||
      if (!event.data || !event.data.type) {
 | 
					      if (!event.data || !event.data.type) {
 | 
				
			||||||
@@ -77,7 +77,7 @@ export async function initNotificationCount() {
 | 
				
			|||||||
          type: 'close',
 | 
					          type: 'close',
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        worker.port.close();
 | 
					        worker.port.close();
 | 
				
			||||||
        window.location.href = AppSubUrl;
 | 
					        window.location.href = appSubUrl;
 | 
				
			||||||
      } else if (event.data.type === 'close') {
 | 
					      } else if (event.data.type === 'close') {
 | 
				
			||||||
        worker.port.postMessage({
 | 
					        worker.port.postMessage({
 | 
				
			||||||
          type: 'close',
 | 
					          type: 'close',
 | 
				
			||||||
@@ -99,7 +99,7 @@ export async function initNotificationCount() {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (NotificationSettings.MinTimeout <= 0) {
 | 
					  if (notificationSettings.MinTimeout <= 0) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -109,13 +109,13 @@ export async function initNotificationCount() {
 | 
				
			|||||||
    }, timeout);
 | 
					    }, timeout);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fn(NotificationSettings.MinTimeout, notificationCount.text());
 | 
					  fn(notificationSettings.MinTimeout, notificationCount.text());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function updateNotificationCountWithCallback(callback, timeout, lastCount) {
 | 
					async function updateNotificationCountWithCallback(callback, timeout, lastCount) {
 | 
				
			||||||
  const currentCount = $('.notification_count').text();
 | 
					  const currentCount = $('.notification_count').text();
 | 
				
			||||||
  if (lastCount !== currentCount) {
 | 
					  if (lastCount !== currentCount) {
 | 
				
			||||||
    callback(NotificationSettings.MinTimeout, currentCount);
 | 
					    callback(notificationSettings.MinTimeout, currentCount);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -124,9 +124,9 @@ async function updateNotificationCountWithCallback(callback, timeout, lastCount)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (lastCount !== newCount) {
 | 
					  if (lastCount !== newCount) {
 | 
				
			||||||
    needsUpdate = true;
 | 
					    needsUpdate = true;
 | 
				
			||||||
    timeout = NotificationSettings.MinTimeout;
 | 
					    timeout = notificationSettings.MinTimeout;
 | 
				
			||||||
  } else if (timeout < NotificationSettings.MaxTimeout) {
 | 
					  } else if (timeout < notificationSettings.MaxTimeout) {
 | 
				
			||||||
    timeout += NotificationSettings.TimeoutStep;
 | 
					    timeout += notificationSettings.TimeoutStep;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  callback(timeout, newCount);
 | 
					  callback(timeout, newCount);
 | 
				
			||||||
@@ -140,7 +140,7 @@ async function updateNotificationTable() {
 | 
				
			|||||||
  if (notificationDiv.length > 0) {
 | 
					  if (notificationDiv.length > 0) {
 | 
				
			||||||
    const data = await $.ajax({
 | 
					    const data = await $.ajax({
 | 
				
			||||||
      type: 'GET',
 | 
					      type: 'GET',
 | 
				
			||||||
      url: `${AppSubUrl}/notifications?${notificationDiv.data('params')}`,
 | 
					      url: `${appSubUrl}/notifications?${notificationDiv.data('params')}`,
 | 
				
			||||||
      data: {
 | 
					      data: {
 | 
				
			||||||
        'div-only': true,
 | 
					        'div-only': true,
 | 
				
			||||||
        'sequence-number': ++notificationSequenceNumber,
 | 
					        'sequence-number': ++notificationSequenceNumber,
 | 
				
			||||||
@@ -156,9 +156,9 @@ async function updateNotificationTable() {
 | 
				
			|||||||
async function updateNotificationCount() {
 | 
					async function updateNotificationCount() {
 | 
				
			||||||
  const data = await $.ajax({
 | 
					  const data = await $.ajax({
 | 
				
			||||||
    type: 'GET',
 | 
					    type: 'GET',
 | 
				
			||||||
    url: `${AppSubUrl}/api/v1/notifications/new`,
 | 
					    url: `${appSubUrl}/api/v1/notifications/new`,
 | 
				
			||||||
    headers: {
 | 
					    headers: {
 | 
				
			||||||
      'X-Csrf-Token': csrf,
 | 
					      'X-Csrf-Token': csrfToken,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -183,7 +183,7 @@ async function updateNotification(url, status, page, q, notificationID) {
 | 
				
			|||||||
    type: 'POST',
 | 
					    type: 'POST',
 | 
				
			||||||
    url,
 | 
					    url,
 | 
				
			||||||
    data: {
 | 
					    data: {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      notification_id: notificationID,
 | 
					      notification_id: notificationID,
 | 
				
			||||||
      status,
 | 
					      status,
 | 
				
			||||||
      page,
 | 
					      page,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {AppSubUrl} = window.config;
 | 
					const {appSubUrl} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initOrgTeamSettings() {
 | 
					export function initOrgTeamSettings() {
 | 
				
			||||||
  // Change team access mode
 | 
					  // Change team access mode
 | 
				
			||||||
@@ -18,7 +18,7 @@ export function initOrgTeamSearchRepoBox() {
 | 
				
			|||||||
  $searchRepoBox.search({
 | 
					  $searchRepoBox.search({
 | 
				
			||||||
    minCharacters: 2,
 | 
					    minCharacters: 2,
 | 
				
			||||||
    apiSettings: {
 | 
					    apiSettings: {
 | 
				
			||||||
      url: `${AppSubUrl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data('uid')}`,
 | 
					      url: `${appSubUrl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data('uid')}`,
 | 
				
			||||||
      onResponse(response) {
 | 
					      onResponse(response) {
 | 
				
			||||||
        const items = [];
 | 
					        const items = [];
 | 
				
			||||||
        $.each(response.data, (_i, item) => {
 | 
					        $.each(response.data, (_i, item) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
const {csrf, PageIsProjects} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async function initProject() {
 | 
					export default async function initProject() {
 | 
				
			||||||
  if (!PageIsProjects) {
 | 
					  if (!$('.repository.projects').length) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,7 +25,7 @@ export default async function initProject() {
 | 
				
			|||||||
              url: $(column).data('url'),
 | 
					              url: $(column).data('url'),
 | 
				
			||||||
              data: JSON.stringify({sorting: i, color: rgbToHex($(column).css('backgroundColor'))}),
 | 
					              data: JSON.stringify({sorting: i, color: rgbToHex($(column).css('backgroundColor'))}),
 | 
				
			||||||
              headers: {
 | 
					              headers: {
 | 
				
			||||||
                'X-Csrf-Token': csrf,
 | 
					                'X-Csrf-Token': csrfToken,
 | 
				
			||||||
                'X-Remote': true,
 | 
					                'X-Remote': true,
 | 
				
			||||||
              },
 | 
					              },
 | 
				
			||||||
              contentType: 'application/json',
 | 
					              contentType: 'application/json',
 | 
				
			||||||
@@ -47,7 +47,7 @@ export default async function initProject() {
 | 
				
			|||||||
        onAdd: (e) => {
 | 
					        onAdd: (e) => {
 | 
				
			||||||
          $.ajax(`${e.to.dataset.url}/${e.item.dataset.issue}`, {
 | 
					          $.ajax(`${e.to.dataset.url}/${e.item.dataset.issue}`, {
 | 
				
			||||||
            headers: {
 | 
					            headers: {
 | 
				
			||||||
              'X-Csrf-Token': csrf,
 | 
					              'X-Csrf-Token': csrfToken,
 | 
				
			||||||
              'X-Remote': true,
 | 
					              'X-Remote': true,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            contentType: 'application/json',
 | 
					            contentType: 'application/json',
 | 
				
			||||||
@@ -83,7 +83,7 @@ export default async function initProject() {
 | 
				
			|||||||
          url: $(this).data('url'),
 | 
					          url: $(this).data('url'),
 | 
				
			||||||
          data: JSON.stringify({title: projectTitleInput.val(), color: projectColorInput.val()}),
 | 
					          data: JSON.stringify({title: projectTitleInput.val(), color: projectColorInput.val()}),
 | 
				
			||||||
          headers: {
 | 
					          headers: {
 | 
				
			||||||
            'X-Csrf-Token': csrf,
 | 
					            'X-Csrf-Token': csrfToken,
 | 
				
			||||||
            'X-Remote': true,
 | 
					            'X-Remote': true,
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          contentType: 'application/json',
 | 
					          contentType: 'application/json',
 | 
				
			||||||
@@ -107,7 +107,7 @@ export default async function initProject() {
 | 
				
			|||||||
      method: 'POST',
 | 
					      method: 'POST',
 | 
				
			||||||
      url: $(this).data('url'),
 | 
					      url: $(this).data('url'),
 | 
				
			||||||
      headers: {
 | 
					      headers: {
 | 
				
			||||||
        'X-Csrf-Token': csrf,
 | 
					        'X-Csrf-Token': csrfToken,
 | 
				
			||||||
        'X-Remote': true,
 | 
					        'X-Remote': true,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      contentType: 'application/json',
 | 
					      contentType: 'application/json',
 | 
				
			||||||
@@ -123,7 +123,7 @@ export default async function initProject() {
 | 
				
			|||||||
      $.ajax({
 | 
					      $.ajax({
 | 
				
			||||||
        url: $(this).data('url'),
 | 
					        url: $(this).data('url'),
 | 
				
			||||||
        headers: {
 | 
					        headers: {
 | 
				
			||||||
          'X-Csrf-Token': csrf,
 | 
					          'X-Csrf-Token': csrfToken,
 | 
				
			||||||
          'X-Remote': true,
 | 
					          'X-Remote': true,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        contentType: 'application/json',
 | 
					        contentType: 'application/json',
 | 
				
			||||||
@@ -144,7 +144,7 @@ export default async function initProject() {
 | 
				
			|||||||
      url: $(this).data('url'),
 | 
					      url: $(this).data('url'),
 | 
				
			||||||
      data: JSON.stringify({title: boardTitle.val(), color: projectColorInput.val()}),
 | 
					      data: JSON.stringify({title: boardTitle.val(), color: projectColorInput.val()}),
 | 
				
			||||||
      headers: {
 | 
					      headers: {
 | 
				
			||||||
        'X-Csrf-Token': csrf,
 | 
					        'X-Csrf-Token': csrfToken,
 | 
				
			||||||
        'X-Remote': true,
 | 
					        'X-Remote': true,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      contentType: 'application/json',
 | 
					      contentType: 'application/json',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getArchive($target, url, first) {
 | 
					function getArchive($target, url, first) {
 | 
				
			||||||
  $.ajax({
 | 
					  $.ajax({
 | 
				
			||||||
    url,
 | 
					    url,
 | 
				
			||||||
    type: 'POST',
 | 
					    type: 'POST',
 | 
				
			||||||
    data: {
 | 
					    data: {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    complete(xhr) {
 | 
					    complete(xhr) {
 | 
				
			||||||
      if (xhr.status === 200) {
 | 
					      if (xhr.status === 200) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import {initCompReactionSelector} from './comp/ReactionSelector.js';
 | 
					import {initCompReactionSelector} from './comp/ReactionSelector.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoDiffReviewButton() {
 | 
					export function initRepoDiffReviewButton() {
 | 
				
			||||||
  $(document).on('click', 'button[name="is_review"]', (e) => {
 | 
					  $(document).on('click', 'button[name="is_review"]', (e) => {
 | 
				
			||||||
@@ -45,7 +45,7 @@ export function initRepoDiffConversationForm() {
 | 
				
			|||||||
    const action = $(this).data('action');
 | 
					    const action = $(this).data('action');
 | 
				
			||||||
    const url = $(this).data('update-url');
 | 
					    const url = $(this).data('update-url');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const data = await $.post(url, {_csrf: csrf, origin, action, comment_id});
 | 
					    const data = await $.post(url, {_csrf: csrfToken, origin, action, comment_id});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ($(this).closest('.conversation-holder').length) {
 | 
					    if ($(this).closest('.conversation-holder').length) {
 | 
				
			||||||
      const conversation = $(data);
 | 
					      const conversation = $(data);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import {initMarkupContent} from '../markup/content.js';
 | 
					import {initMarkupContent} from '../markup/content.js';
 | 
				
			||||||
import {createCodeEditor} from './codeeditor.js';
 | 
					import {createCodeEditor} from './codeeditor.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let previewFileModes;
 | 
					let previewFileModes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -21,7 +21,7 @@ function initEditPreviewTab($form) {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      context = context.substring(0, context.lastIndexOf('/'));
 | 
					      context = context.substring(0, context.lastIndexOf('/'));
 | 
				
			||||||
      $.post($this.data('url'), {
 | 
					      $.post($this.data('url'), {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
        mode,
 | 
					        mode,
 | 
				
			||||||
        context,
 | 
					        context,
 | 
				
			||||||
        text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
 | 
					        text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
 | 
				
			||||||
@@ -40,7 +40,7 @@ function initEditDiffTab($form) {
 | 
				
			|||||||
  $tabMenu.find(`.item[data-tab="${$tabMenu.data('diff')}"]`).on('click', function () {
 | 
					  $tabMenu.find(`.item[data-tab="${$tabMenu.data('diff')}"]`).on('click', function () {
 | 
				
			||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    $.post($this.data('url'), {
 | 
					    $.post($this.data('url'), {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      context: $this.data('context'),
 | 
					      context: $this.data('context'),
 | 
				
			||||||
      content: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
 | 
					      content: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
 | 
				
			||||||
    }, (data) => {
 | 
					    }, (data) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import {stripTags} from '../utils.js';
 | 
					import {stripTags} from '../utils.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoTopicBar() {
 | 
					export function initRepoTopicBar() {
 | 
				
			||||||
  const mgrBtn = $('#manage_topic');
 | 
					  const mgrBtn = $('#manage_topic');
 | 
				
			||||||
@@ -30,7 +30,7 @@ export function initRepoTopicBar() {
 | 
				
			|||||||
    const topics = $('input[name=topics]').val();
 | 
					    const topics = $('input[name=topics]').val();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $.post(saveBtn.data('link'), {
 | 
					    $.post(saveBtn.data('link'), {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      topics
 | 
					      topics
 | 
				
			||||||
    }, (_data, _textStatus, xhr) => {
 | 
					    }, (_data, _textStatus, xhr) => {
 | 
				
			||||||
      if (xhr.responseJSON.status === 'ok') {
 | 
					      if (xhr.responseJSON.status === 'ok') {
 | 
				
			||||||
@@ -41,7 +41,7 @@ export function initRepoTopicBar() {
 | 
				
			|||||||
          const last = viewDiv.children('a').last();
 | 
					          const last = viewDiv.children('a').last();
 | 
				
			||||||
          for (let i = 0; i < topicArray.length; i++) {
 | 
					          for (let i = 0; i < topicArray.length; i++) {
 | 
				
			||||||
            const link = $('<a class="ui repo-topic large label topic"></a>');
 | 
					            const link = $('<a class="ui repo-topic large label topic"></a>');
 | 
				
			||||||
            link.attr('href', `${AppSubUrl}/explore/repos?q=${encodeURIComponent(topicArray[i])}&topic=1`);
 | 
					            link.attr('href', `${appSubUrl}/explore/repos?q=${encodeURIComponent(topicArray[i])}&topic=1`);
 | 
				
			||||||
            link.text(topicArray[i]);
 | 
					            link.text(topicArray[i]);
 | 
				
			||||||
            link.insertBefore(last);
 | 
					            link.insertBefore(last);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -90,7 +90,7 @@ export function initRepoTopicBar() {
 | 
				
			|||||||
      label: 'ui small label'
 | 
					      label: 'ui small label'
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    apiSettings: {
 | 
					    apiSettings: {
 | 
				
			||||||
      url: `${AppSubUrl}/api/v1/topics/search?q={query}`,
 | 
					      url: `${appSubUrl}/api/v1/topics/search?q={query}`,
 | 
				
			||||||
      throttle: 500,
 | 
					      throttle: 500,
 | 
				
			||||||
      cache: false,
 | 
					      cache: false,
 | 
				
			||||||
      onResponse(res) {
 | 
					      onResponse(res) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ import {createCommentSimpleMDE} from './comp/CommentSimpleMDE.js';
 | 
				
			|||||||
import {initCompImagePaste} from './comp/ImagePaste.js';
 | 
					import {initCompImagePaste} from './comp/ImagePaste.js';
 | 
				
			||||||
import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
 | 
					import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoIssueTimeTracking() {
 | 
					export function initRepoIssueTimeTracking() {
 | 
				
			||||||
  $(document).on('click', '.issue-add-time', () => {
 | 
					  $(document).on('click', '.issue-add-time', () => {
 | 
				
			||||||
@@ -58,7 +58,7 @@ function updateDeadline(deadlineString) {
 | 
				
			|||||||
      due_date: realDeadline,
 | 
					      due_date: realDeadline,
 | 
				
			||||||
    }),
 | 
					    }),
 | 
				
			||||||
    headers: {
 | 
					    headers: {
 | 
				
			||||||
      'X-Csrf-Token': csrf,
 | 
					      'X-Csrf-Token': csrfToken,
 | 
				
			||||||
      'X-Remote': true,
 | 
					      'X-Remote': true,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    contentType: 'application/json',
 | 
					    contentType: 'application/json',
 | 
				
			||||||
@@ -91,9 +91,9 @@ export function initRepoIssueList() {
 | 
				
			|||||||
  const repoId = $('#repoId').val();
 | 
					  const repoId = $('#repoId').val();
 | 
				
			||||||
  const crossRepoSearch = $('#crossRepoSearch').val();
 | 
					  const crossRepoSearch = $('#crossRepoSearch').val();
 | 
				
			||||||
  const tp = $('#type').val();
 | 
					  const tp = $('#type').val();
 | 
				
			||||||
  let issueSearchUrl = `${AppSubUrl}/api/v1/repos/${repolink}/issues?q={query}&type=${tp}`;
 | 
					  let issueSearchUrl = `${appSubUrl}/api/v1/repos/${repolink}/issues?q={query}&type=${tp}`;
 | 
				
			||||||
  if (crossRepoSearch === 'true') {
 | 
					  if (crossRepoSearch === 'true') {
 | 
				
			||||||
    issueSearchUrl = `${AppSubUrl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`;
 | 
					    issueSearchUrl = `${appSubUrl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  $('#new-dependency-drop-list')
 | 
					  $('#new-dependency-drop-list')
 | 
				
			||||||
    .dropdown({
 | 
					    .dropdown({
 | 
				
			||||||
@@ -157,7 +157,7 @@ export function initRepoIssueCommentDelete() {
 | 
				
			|||||||
    const $this = $(this);
 | 
					    const $this = $(this);
 | 
				
			||||||
    if (window.confirm($this.data('locale'))) {
 | 
					    if (window.confirm($this.data('locale'))) {
 | 
				
			||||||
      $.post($this.data('url'), {
 | 
					      $.post($this.data('url'), {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
      }).done(() => {
 | 
					      }).done(() => {
 | 
				
			||||||
        const $conversationHolder = $this.closest('.conversation-holder');
 | 
					        const $conversationHolder = $this.closest('.conversation-holder');
 | 
				
			||||||
        $(`#${$this.data('comment-id')}`).remove();
 | 
					        $(`#${$this.data('comment-id')}`).remove();
 | 
				
			||||||
@@ -258,7 +258,7 @@ export function initRepoPullRequestUpdate() {
 | 
				
			|||||||
    const redirect = $this.data('redirect');
 | 
					    const redirect = $this.data('redirect');
 | 
				
			||||||
    $this.addClass('loading');
 | 
					    $this.addClass('loading');
 | 
				
			||||||
    $.post($this.data('do'), {
 | 
					    $.post($this.data('do'), {
 | 
				
			||||||
      _csrf: csrf
 | 
					      _csrf: csrfToken
 | 
				
			||||||
    }).done((data) => {
 | 
					    }).done((data) => {
 | 
				
			||||||
      if (data.redirect) {
 | 
					      if (data.redirect) {
 | 
				
			||||||
        window.location.href = data.redirect;
 | 
					        window.location.href = data.redirect;
 | 
				
			||||||
@@ -291,7 +291,7 @@ export function initRepoIssueReferenceRepositorySearch() {
 | 
				
			|||||||
  $('.issue_reference_repository_search')
 | 
					  $('.issue_reference_repository_search')
 | 
				
			||||||
    .dropdown({
 | 
					    .dropdown({
 | 
				
			||||||
      apiSettings: {
 | 
					      apiSettings: {
 | 
				
			||||||
        url: `${AppSubUrl}/api/v1/repos/search?q={query}&limit=20`,
 | 
					        url: `${appSubUrl}/api/v1/repos/search?q={query}&limit=20`,
 | 
				
			||||||
        onResponse(response) {
 | 
					        onResponse(response) {
 | 
				
			||||||
          const filteredResponse = {success: true, results: []};
 | 
					          const filteredResponse = {success: true, results: []};
 | 
				
			||||||
          $.each(response.data, (_r, repo) => {
 | 
					          $.each(response.data, (_r, repo) => {
 | 
				
			||||||
@@ -306,7 +306,7 @@ export function initRepoIssueReferenceRepositorySearch() {
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      onChange(_value, _text, $choice) {
 | 
					      onChange(_value, _text, $choice) {
 | 
				
			||||||
        const $form = $choice.closest('form');
 | 
					        const $form = $choice.closest('form');
 | 
				
			||||||
        $form.attr('action', `${AppSubUrl}/${_text}/issues/new`);
 | 
					        $form.attr('action', `${appSubUrl}/${_text}/issues/new`);
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      fullTextSearch: true
 | 
					      fullTextSearch: true
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -338,7 +338,7 @@ export function updateIssuesMeta(url, action, issueIds, elementId) {
 | 
				
			|||||||
      type: 'POST',
 | 
					      type: 'POST',
 | 
				
			||||||
      url,
 | 
					      url,
 | 
				
			||||||
      data: {
 | 
					      data: {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
        action,
 | 
					        action,
 | 
				
			||||||
        issue_ids: issueIds,
 | 
					        issue_ids: issueIds,
 | 
				
			||||||
        id: elementId,
 | 
					        id: elementId,
 | 
				
			||||||
@@ -556,7 +556,7 @@ export function initRepoIssueWipToggle() {
 | 
				
			|||||||
    e.preventDefault();
 | 
					    e.preventDefault();
 | 
				
			||||||
    const {title, wipPrefix, updateUrl} = e.currentTarget.closest('.toggle-wip').dataset;
 | 
					    const {title, wipPrefix, updateUrl} = e.currentTarget.closest('.toggle-wip').dataset;
 | 
				
			||||||
    await $.post(updateUrl, {
 | 
					    await $.post(updateUrl, {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      title: title?.startsWith(wipPrefix) ? title.substr(wipPrefix.length).trim() : `${wipPrefix.trim()} ${title}`,
 | 
					      title: title?.startsWith(wipPrefix) ? title.substr(wipPrefix.length).trim() : `${wipPrefix.trim()} ${title}`,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    window.location.reload();
 | 
					    window.location.reload();
 | 
				
			||||||
@@ -591,7 +591,7 @@ export function initRepoIssueTitleEdit() {
 | 
				
			|||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      $.post(update_url, {
 | 
					      $.post(update_url, {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
        target_branch: targetBranch
 | 
					        target_branch: targetBranch
 | 
				
			||||||
      }).done((data) => {
 | 
					      }).done((data) => {
 | 
				
			||||||
        $branchTarget.text(data.base_branch);
 | 
					        $branchTarget.text(data.base_branch);
 | 
				
			||||||
@@ -606,7 +606,7 @@ export function initRepoIssueTitleEdit() {
 | 
				
			|||||||
      pullrequest_targetbranch_change(pullrequest_target_update_url);
 | 
					      pullrequest_targetbranch_change(pullrequest_target_update_url);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      $.post($(this).data('update-url'), {
 | 
					      $.post($(this).data('update-url'), {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
        title: $editInput.val()
 | 
					        title: $editInput.val()
 | 
				
			||||||
      }, (data) => {
 | 
					      }, (data) => {
 | 
				
			||||||
        $editInput.val(data.title);
 | 
					        $editInput.val(data.title);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ import {initCommentContent, initMarkupContent} from '../markup/content.js';
 | 
				
			|||||||
import {initCompReactionSelector} from './comp/ReactionSelector.js';
 | 
					import {initCompReactionSelector} from './comp/ReactionSelector.js';
 | 
				
			||||||
import {initRepoSettingBranches} from './repo-settings.js';
 | 
					import {initRepoSettingBranches} from './repo-settings.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const commentMDEditors = {};
 | 
					const commentMDEditors = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,7 +54,7 @@ export function initRepoCommentForm() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (editMode === 'true') {
 | 
					      if (editMode === 'true') {
 | 
				
			||||||
        const form = $('#update_issueref_form');
 | 
					        const form = $('#update_issueref_form');
 | 
				
			||||||
        $.post(form.attr('action'), {_csrf: csrf, ref: selectedValue}, () => window.location.reload());
 | 
					        $.post(form.attr('action'), {_csrf: csrfToken, ref: selectedValue}, () => window.location.reload());
 | 
				
			||||||
      } else if (editMode === '') {
 | 
					      } else if (editMode === '') {
 | 
				
			||||||
        $selectBranch.find('.ui .branch-name').text(selectedValue);
 | 
					        $selectBranch.find('.ui .branch-name').text(selectedValue);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -370,7 +370,7 @@ export async function initRepository() {
 | 
				
			|||||||
          const fileUuidDict = {};
 | 
					          const fileUuidDict = {};
 | 
				
			||||||
          dz = await createDropzone($dropzone[0], {
 | 
					          dz = await createDropzone($dropzone[0], {
 | 
				
			||||||
            url: $dropzone.data('upload-url'),
 | 
					            url: $dropzone.data('upload-url'),
 | 
				
			||||||
            headers: {'X-Csrf-Token': csrf},
 | 
					            headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
            maxFiles: $dropzone.data('max-file'),
 | 
					            maxFiles: $dropzone.data('max-file'),
 | 
				
			||||||
            maxFilesize: $dropzone.data('max-size'),
 | 
					            maxFilesize: $dropzone.data('max-size'),
 | 
				
			||||||
            acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
 | 
					            acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
 | 
				
			||||||
@@ -396,7 +396,7 @@ export async function initRepository() {
 | 
				
			|||||||
                if ($dropzone.data('remove-url') && !fileUuidDict[file.uuid].submitted) {
 | 
					                if ($dropzone.data('remove-url') && !fileUuidDict[file.uuid].submitted) {
 | 
				
			||||||
                  $.post($dropzone.data('remove-url'), {
 | 
					                  $.post($dropzone.data('remove-url'), {
 | 
				
			||||||
                    file: file.uuid,
 | 
					                    file: file.uuid,
 | 
				
			||||||
                    _csrf: csrf,
 | 
					                    _csrf: csrfToken,
 | 
				
			||||||
                  });
 | 
					                  });
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              });
 | 
					              });
 | 
				
			||||||
@@ -458,7 +458,7 @@ export async function initRepository() {
 | 
				
			|||||||
            return $(this).val();
 | 
					            return $(this).val();
 | 
				
			||||||
          }).get();
 | 
					          }).get();
 | 
				
			||||||
          $.post($editContentZone.data('update-url'), {
 | 
					          $.post($editContentZone.data('update-url'), {
 | 
				
			||||||
            _csrf: csrf,
 | 
					            _csrf: csrfToken,
 | 
				
			||||||
            content: $textarea.val(),
 | 
					            content: $textarea.val(),
 | 
				
			||||||
            context: $editContentZone.data('context'),
 | 
					            context: $editContentZone.data('context'),
 | 
				
			||||||
            files: $attachments,
 | 
					            files: $attachments,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoMigrationStatusChecker() {
 | 
					export function initRepoMigrationStatusChecker() {
 | 
				
			||||||
  const migrating = $('#repo_migrating');
 | 
					  const migrating = $('#repo_migrating');
 | 
				
			||||||
@@ -12,9 +12,9 @@ export function initRepoMigrationStatusChecker() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    $.ajax({
 | 
					    $.ajax({
 | 
				
			||||||
      type: 'GET',
 | 
					      type: 'GET',
 | 
				
			||||||
      url: `${AppSubUrl}/user/task/${task}`,
 | 
					      url: `${appSubUrl}/user/task/${task}`,
 | 
				
			||||||
      data: {
 | 
					      data: {
 | 
				
			||||||
        _csrf: csrf,
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      complete(xhr) {
 | 
					      complete(xhr) {
 | 
				
			||||||
        if (xhr.status === 200 && xhr.responseJSON) {
 | 
					        if (xhr.status === 200 && xhr.responseJSON) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,14 @@
 | 
				
			|||||||
import {createMonaco} from './codeeditor.js';
 | 
					import {createMonaco} from './codeeditor.js';
 | 
				
			||||||
import {initRepoCommonFilterSearchDropdown} from './repo-common.js';
 | 
					import {initRepoCommonFilterSearchDropdown} from './repo-common.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoSettingsCollaboration() {
 | 
					export function initRepoSettingsCollaboration() {
 | 
				
			||||||
  // Change collaborator access mode
 | 
					  // Change collaborator access mode
 | 
				
			||||||
  $('.access-mode.menu .item').on('click', function () {
 | 
					  $('.access-mode.menu .item').on('click', function () {
 | 
				
			||||||
    const $menu = $(this).parent();
 | 
					    const $menu = $(this).parent();
 | 
				
			||||||
    $.post($menu.data('url'), {
 | 
					    $.post($menu.data('url'), {
 | 
				
			||||||
      _csrf: csrf,
 | 
					      _csrf: csrfToken,
 | 
				
			||||||
      uid: $menu.data('uid'),
 | 
					      uid: $menu.data('uid'),
 | 
				
			||||||
      mode: $(this).data('value')
 | 
					      mode: $(this).data('value')
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -20,8 +20,8 @@ export function initRepoSettingSearchTeamBox() {
 | 
				
			|||||||
  $searchTeamBox.search({
 | 
					  $searchTeamBox.search({
 | 
				
			||||||
    minCharacters: 2,
 | 
					    minCharacters: 2,
 | 
				
			||||||
    apiSettings: {
 | 
					    apiSettings: {
 | 
				
			||||||
      url: `${AppSubUrl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`,
 | 
					      url: `${appSubUrl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`,
 | 
				
			||||||
      headers: {'X-Csrf-Token': csrf},
 | 
					      headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
      onResponse(response) {
 | 
					      onResponse(response) {
 | 
				
			||||||
        const items = [];
 | 
					        const items = [];
 | 
				
			||||||
        $.each(response.data, (_i, item) => {
 | 
					        $.each(response.data, (_i, item) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import {htmlEscape} from 'escape-goat';
 | 
					import {htmlEscape} from 'escape-goat';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {AppSubUrl} = window.config;
 | 
					const {appSubUrl} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoTemplateSearch() {
 | 
					export function initRepoTemplateSearch() {
 | 
				
			||||||
  const $repoTemplate = $('#repo_template');
 | 
					  const $repoTemplate = $('#repo_template');
 | 
				
			||||||
@@ -22,7 +22,7 @@ export function initRepoTemplateSearch() {
 | 
				
			|||||||
    $('#repo_template_search')
 | 
					    $('#repo_template_search')
 | 
				
			||||||
      .dropdown({
 | 
					      .dropdown({
 | 
				
			||||||
        apiSettings: {
 | 
					        apiSettings: {
 | 
				
			||||||
          url: `${AppSubUrl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`,
 | 
					          url: `${appSubUrl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`,
 | 
				
			||||||
          onResponse(response) {
 | 
					          onResponse(response) {
 | 
				
			||||||
            const filteredResponse = {success: true, results: []};
 | 
					            const filteredResponse = {success: true, results: []};
 | 
				
			||||||
            filteredResponse.results.push({
 | 
					            filteredResponse.results.push({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import {initMarkupContent} from '../markup/content.js';
 | 
					import {initMarkupContent} from '../markup/content.js';
 | 
				
			||||||
import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
 | 
					import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrf} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepoWikiForm() {
 | 
					export function initRepoWikiForm() {
 | 
				
			||||||
  const $editArea = $('.repository.wiki textarea#edit_area');
 | 
					  const $editArea = $('.repository.wiki textarea#edit_area');
 | 
				
			||||||
@@ -22,7 +22,7 @@ export function initRepoWikiForm() {
 | 
				
			|||||||
            sideBySideTimeout = null;
 | 
					            sideBySideTimeout = null;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          $.post($editArea.data('url'), {
 | 
					          $.post($editArea.data('url'), {
 | 
				
			||||||
            _csrf: csrf,
 | 
					            _csrf: csrfToken,
 | 
				
			||||||
            mode: 'gfm',
 | 
					            mode: 'gfm',
 | 
				
			||||||
            context: $editArea.data('context'),
 | 
					            context: $editArea.data('context'),
 | 
				
			||||||
            text: plainText,
 | 
					            text: plainText,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
import {joinPaths} from '../utils.js';
 | 
					import {joinPaths} from '../utils.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {UseServiceWorker, AssetUrlPrefix, AppVer} = window.config;
 | 
					const {useServiceWorker, assetUrlPrefix, appVer} = window.config;
 | 
				
			||||||
const cachePrefix = 'static-cache-v'; // actual version is set in the service worker script
 | 
					const cachePrefix = 'static-cache-v'; // actual version is set in the service worker script
 | 
				
			||||||
const workerAssetPath = joinPaths(AssetUrlPrefix, 'serviceworker.js');
 | 
					const workerAssetPath = joinPaths(assetUrlPrefix, 'serviceworker.js');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function unregisterAll() {
 | 
					async function unregisterAll() {
 | 
				
			||||||
  for (const registration of await navigator.serviceWorker.getRegistrations()) {
 | 
					  for (const registration of await navigator.serviceWorker.getRegistrations()) {
 | 
				
			||||||
@@ -24,7 +24,7 @@ async function invalidateCache() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function checkCacheValidity() {
 | 
					async function checkCacheValidity() {
 | 
				
			||||||
  const cacheKey = AppVer;
 | 
					  const cacheKey = appVer;
 | 
				
			||||||
  const storedCacheKey = localStorage.getItem('staticCacheKey');
 | 
					  const storedCacheKey = localStorage.getItem('staticCacheKey');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // invalidate cache if it belongs to a different gitea version
 | 
					  // invalidate cache if it belongs to a different gitea version
 | 
				
			||||||
@@ -37,7 +37,7 @@ async function checkCacheValidity() {
 | 
				
			|||||||
export default async function initServiceWorker() {
 | 
					export default async function initServiceWorker() {
 | 
				
			||||||
  if (!('serviceWorker' in navigator)) return;
 | 
					  if (!('serviceWorker' in navigator)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (UseServiceWorker) {
 | 
					  if (useServiceWorker) {
 | 
				
			||||||
    // unregister all service workers where scriptURL does not match the current one
 | 
					    // unregister all service workers where scriptURL does not match the current one
 | 
				
			||||||
    await unregisterOtherWorkers();
 | 
					    await unregisterOtherWorkers();
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
import prettyMilliseconds from 'pretty-ms';
 | 
					import prettyMilliseconds from 'pretty-ms';
 | 
				
			||||||
const {AppSubUrl, csrf, NotificationSettings, EnableTimetracking} = window.config;
 | 
					const {appSubUrl, csrfToken, notificationSettings, enableTimeTracking} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let updateTimeInterval = null; // holds setInterval id when active
 | 
					let updateTimeInterval = null; // holds setInterval id when active
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function initStopwatch() {
 | 
					export async function initStopwatch() {
 | 
				
			||||||
  if (!EnableTimetracking) {
 | 
					  if (!enableTimeTracking) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,7 +25,7 @@ export async function initStopwatch() {
 | 
				
			|||||||
    $(this).parent().trigger('submit');
 | 
					    $(this).parent().trigger('submit');
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (NotificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
 | 
					  if (notificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
 | 
				
			||||||
    // Try to connect to the event source via the shared worker first
 | 
					    // Try to connect to the event source via the shared worker first
 | 
				
			||||||
    const worker = new SharedWorker(`${__webpack_public_path__}js/eventsource.sharedworker.js`, 'notification-worker');
 | 
					    const worker = new SharedWorker(`${__webpack_public_path__}js/eventsource.sharedworker.js`, 'notification-worker');
 | 
				
			||||||
    worker.addEventListener('error', (event) => {
 | 
					    worker.addEventListener('error', (event) => {
 | 
				
			||||||
@@ -36,7 +36,7 @@ export async function initStopwatch() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
    worker.port.postMessage({
 | 
					    worker.port.postMessage({
 | 
				
			||||||
      type: 'start',
 | 
					      type: 'start',
 | 
				
			||||||
      url: `${window.location.origin}${AppSubUrl}/user/events`,
 | 
					      url: `${window.location.origin}${appSubUrl}/user/events`,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    worker.port.addEventListener('message', (event) => {
 | 
					    worker.port.addEventListener('message', (event) => {
 | 
				
			||||||
      if (!event.data || !event.data.type) {
 | 
					      if (!event.data || !event.data.type) {
 | 
				
			||||||
@@ -55,7 +55,7 @@ export async function initStopwatch() {
 | 
				
			|||||||
          type: 'close',
 | 
					          type: 'close',
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        worker.port.close();
 | 
					        worker.port.close();
 | 
				
			||||||
        window.location.href = AppSubUrl;
 | 
					        window.location.href = appSubUrl;
 | 
				
			||||||
      } else if (event.data.type === 'close') {
 | 
					      } else if (event.data.type === 'close') {
 | 
				
			||||||
        worker.port.postMessage({
 | 
					        worker.port.postMessage({
 | 
				
			||||||
          type: 'close',
 | 
					          type: 'close',
 | 
				
			||||||
@@ -77,7 +77,7 @@ export async function initStopwatch() {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (NotificationSettings.MinTimeout <= 0) {
 | 
					  if (notificationSettings.MinTimeout <= 0) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87,7 +87,7 @@ export async function initStopwatch() {
 | 
				
			|||||||
    }, timeout);
 | 
					    }, timeout);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fn(NotificationSettings.MinTimeout);
 | 
					  fn(notificationSettings.MinTimeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const currSeconds = $('.stopwatch-time').data('seconds');
 | 
					  const currSeconds = $('.stopwatch-time').data('seconds');
 | 
				
			||||||
  if (currSeconds) {
 | 
					  if (currSeconds) {
 | 
				
			||||||
@@ -99,9 +99,9 @@ async function updateStopwatchWithCallback(callback, timeout) {
 | 
				
			|||||||
  const isSet = await updateStopwatch();
 | 
					  const isSet = await updateStopwatch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!isSet) {
 | 
					  if (!isSet) {
 | 
				
			||||||
    timeout = NotificationSettings.MinTimeout;
 | 
					    timeout = notificationSettings.MinTimeout;
 | 
				
			||||||
  } else if (timeout < NotificationSettings.MaxTimeout) {
 | 
					  } else if (timeout < notificationSettings.MaxTimeout) {
 | 
				
			||||||
    timeout += NotificationSettings.TimeoutStep;
 | 
					    timeout += notificationSettings.TimeoutStep;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  callback(timeout);
 | 
					  callback(timeout);
 | 
				
			||||||
@@ -110,8 +110,8 @@ async function updateStopwatchWithCallback(callback, timeout) {
 | 
				
			|||||||
async function updateStopwatch() {
 | 
					async function updateStopwatch() {
 | 
				
			||||||
  const data = await $.ajax({
 | 
					  const data = await $.ajax({
 | 
				
			||||||
    type: 'GET',
 | 
					    type: 'GET',
 | 
				
			||||||
    url: `${AppSubUrl}/api/v1/user/stopwatches`,
 | 
					    url: `${appSubUrl}/api/v1/user/stopwatches`,
 | 
				
			||||||
    headers: {'X-Csrf-Token': csrf},
 | 
					    headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (updateTimeInterval) {
 | 
					  if (updateTimeInterval) {
 | 
				
			||||||
@@ -129,7 +129,7 @@ async function updateStopwatchData(data) {
 | 
				
			|||||||
    btnEl.addClass('hidden');
 | 
					    btnEl.addClass('hidden');
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    const {repo_owner_name, repo_name, issue_index, seconds} = watch;
 | 
					    const {repo_owner_name, repo_name, issue_index, seconds} = watch;
 | 
				
			||||||
    const issueUrl = `${AppSubUrl}/${repo_owner_name}/${repo_name}/issues/${issue_index}`;
 | 
					    const issueUrl = `${appSubUrl}/${repo_owner_name}/${repo_name}/issues/${issue_index}`;
 | 
				
			||||||
    $('.stopwatch-link').attr('href', issueUrl);
 | 
					    $('.stopwatch-link').attr('href', issueUrl);
 | 
				
			||||||
    $('.stopwatch-commit').attr('action', `${issueUrl}/times/stopwatch/toggle`);
 | 
					    $('.stopwatch-commit').attr('action', `${issueUrl}/times/stopwatch/toggle`);
 | 
				
			||||||
    $('.stopwatch-cancel').attr('action', `${issueUrl}/times/stopwatch/cancel`);
 | 
					    $('.stopwatch-cancel').attr('action', `${issueUrl}/times/stopwatch/cancel`);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@ function makeCollections({mentions, emoji}) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) {
 | 
					export default async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) {
 | 
				
			||||||
  if (!window.config.Tribute || !elementOrNodeList) return;
 | 
					  if (!window.config.requireTribute || !elementOrNodeList) return;
 | 
				
			||||||
  const nodes = Array.from('length' in elementOrNodeList ? elementOrNodeList : [elementOrNodeList]);
 | 
					  const nodes = Array.from('length' in elementOrNodeList ? elementOrNodeList : [elementOrNodeList]);
 | 
				
			||||||
  if (!nodes.length) return;
 | 
					  if (!nodes.length) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
const {AppSubUrl, csrf} = window.config;
 | 
					const {appSubUrl, csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initUserAuthU2fAuth() {
 | 
					export function initUserAuthU2fAuth() {
 | 
				
			||||||
  if ($('#wait-for-key').length === 0) {
 | 
					  if ($('#wait-for-key').length === 0) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  u2fApi.ensureSupport().then(() => {
 | 
					  u2fApi.ensureSupport().then(() => {
 | 
				
			||||||
    $.getJSON(`${AppSubUrl}/user/u2f/challenge`).done((req) => {
 | 
					    $.getJSON(`${appSubUrl}/user/u2f/challenge`).done((req) => {
 | 
				
			||||||
      u2fApi.sign(req.appId, req.challenge, req.registeredKeys, 30)
 | 
					      u2fApi.sign(req.appId, req.challenge, req.registeredKeys, 30)
 | 
				
			||||||
        .then(u2fSigned)
 | 
					        .then(u2fSigned)
 | 
				
			||||||
        .catch((err) => {
 | 
					        .catch((err) => {
 | 
				
			||||||
@@ -18,15 +18,15 @@ export function initUserAuthU2fAuth() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
  }).catch(() => {
 | 
					  }).catch(() => {
 | 
				
			||||||
    // Fallback in case browser do not support U2F
 | 
					    // Fallback in case browser do not support U2F
 | 
				
			||||||
    window.location.href = `${AppSubUrl}/user/two_factor`;
 | 
					    window.location.href = `${appSubUrl}/user/two_factor`;
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function u2fSigned(resp) {
 | 
					function u2fSigned(resp) {
 | 
				
			||||||
  $.ajax({
 | 
					  $.ajax({
 | 
				
			||||||
    url: `${AppSubUrl}/user/u2f/sign`,
 | 
					    url: `${appSubUrl}/user/u2f/sign`,
 | 
				
			||||||
    type: 'POST',
 | 
					    type: 'POST',
 | 
				
			||||||
    headers: {'X-Csrf-Token': csrf},
 | 
					    headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
    data: JSON.stringify(resp),
 | 
					    data: JSON.stringify(resp),
 | 
				
			||||||
    contentType: 'application/json; charset=utf-8',
 | 
					    contentType: 'application/json; charset=utf-8',
 | 
				
			||||||
  }).done((res) => {
 | 
					  }).done((res) => {
 | 
				
			||||||
@@ -41,9 +41,9 @@ function u2fRegistered(resp) {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  $.ajax({
 | 
					  $.ajax({
 | 
				
			||||||
    url: `${AppSubUrl}/user/settings/security/u2f/register`,
 | 
					    url: `${appSubUrl}/user/settings/security/u2f/register`,
 | 
				
			||||||
    type: 'POST',
 | 
					    type: 'POST',
 | 
				
			||||||
    headers: {'X-Csrf-Token': csrf},
 | 
					    headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
    data: JSON.stringify(resp),
 | 
					    data: JSON.stringify(resp),
 | 
				
			||||||
    contentType: 'application/json; charset=utf-8',
 | 
					    contentType: 'application/json; charset=utf-8',
 | 
				
			||||||
    success() {
 | 
					    success() {
 | 
				
			||||||
@@ -99,8 +99,8 @@ export function initUserAuthU2fRegister() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function u2fRegisterRequest() {
 | 
					function u2fRegisterRequest() {
 | 
				
			||||||
  $.post(`${AppSubUrl}/user/settings/security/u2f/request_register`, {
 | 
					  $.post(`${appSubUrl}/user/settings/security/u2f/request_register`, {
 | 
				
			||||||
    _csrf: csrf,
 | 
					    _csrf: csrfToken,
 | 
				
			||||||
    name: $('#nickname').val()
 | 
					    name: $('#nickname').val()
 | 
				
			||||||
  }).done((req) => {
 | 
					  }).done((req) => {
 | 
				
			||||||
    $('#nickname').closest('div.field').removeClass('error');
 | 
					    $('#nickname').closest('div.field').removeClass('error');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
const {MermaidMaxSourceCharacters} = window.config;
 | 
					const {mermaidMaxSourceCharacters} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function displayError(el, err) {
 | 
					function displayError(el, err) {
 | 
				
			||||||
  el.closest('pre').classList.remove('is-loading');
 | 
					  el.closest('pre').classList.remove('is-loading');
 | 
				
			||||||
@@ -26,8 +26,8 @@ export async function renderMermaid(els) {
 | 
				
			|||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (const el of els) {
 | 
					  for (const el of els) {
 | 
				
			||||||
    if (MermaidMaxSourceCharacters >= 0 && el.textContent.length > MermaidMaxSourceCharacters) {
 | 
					    if (mermaidMaxSourceCharacters >= 0 && el.textContent.length > mermaidMaxSourceCharacters) {
 | 
				
			||||||
      displayError(el, new Error(`Mermaid source of ${el.textContent.length} characters exceeds the maximum allowed length of ${MermaidMaxSourceCharacters}.`));
 | 
					      displayError(el, new Error(`Mermaid source of ${el.textContent.length} characters exceeds the maximum allowed length of ${mermaidMaxSourceCharacters}.`));
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ export function initMarkupTasklist() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          await $.post(updateUrl, {
 | 
					          await $.post(updateUrl, {
 | 
				
			||||||
            ignore_attachments: true,
 | 
					            ignore_attachments: true,
 | 
				
			||||||
            _csrf: window.config.csrf,
 | 
					            _csrf: window.config.csrfToken,
 | 
				
			||||||
            content: newContent,
 | 
					            content: newContent,
 | 
				
			||||||
            context
 | 
					            context
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
// This sets up the URL prefix used in webpack's chunk loading.
 | 
					// This sets up the URL prefix used in webpack's chunk loading.
 | 
				
			||||||
// This file must be imported before any lazy-loading is being attempted.
 | 
					// This file must be imported before any lazy-loading is being attempted.
 | 
				
			||||||
import {joinPaths} from './utils.js';
 | 
					import {joinPaths} from './utils.js';
 | 
				
			||||||
const {AssetUrlPrefix} = window.config;
 | 
					const {assetUrlPrefix} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__webpack_public_path__ = joinPaths(AssetUrlPrefix, '/');
 | 
					__webpack_public_path__ = joinPaths(assetUrlPrefix, '/');
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user