code.gitea.io/gitea@v1.22.3/modules/setting/ui.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package setting 5 6 import ( 7 "time" 8 9 "code.gitea.io/gitea/modules/container" 10 "code.gitea.io/gitea/modules/log" 11 ) 12 13 // UI settings 14 var UI = struct { 15 ExplorePagingNum int 16 SitemapPagingNum int 17 IssuePagingNum int 18 RepoSearchPagingNum int 19 MembersPagingNum int 20 FeedMaxCommitNum int 21 FeedPagingNum int 22 PackagesPagingNum int 23 GraphMaxCommitNum int 24 CodeCommentLines int 25 ReactionMaxUserNum int 26 MaxDisplayFileSize int64 27 ShowUserEmail bool 28 DefaultShowFullName bool 29 DefaultTheme string 30 Themes []string 31 Reactions []string 32 ReactionsLookup container.Set[string] `ini:"-"` 33 CustomEmojis []string 34 CustomEmojisMap map[string]string `ini:"-"` 35 SearchRepoDescription bool 36 OnlyShowRelevantRepos bool 37 ExploreDefaultSort string `ini:"EXPLORE_PAGING_DEFAULT_SORT"` 38 PreferredTimestampTense string 39 40 AmbiguousUnicodeDetection bool 41 42 Notification struct { 43 MinTimeout time.Duration 44 TimeoutStep time.Duration 45 MaxTimeout time.Duration 46 EventSourceUpdateTime time.Duration 47 } `ini:"ui.notification"` 48 49 SVG struct { 50 Enabled bool `ini:"ENABLE_RENDER"` 51 } `ini:"ui.svg"` 52 53 CSV struct { 54 MaxFileSize int64 55 } `ini:"ui.csv"` 56 57 Admin struct { 58 UserPagingNum int 59 RepoPagingNum int 60 NoticePagingNum int 61 OrgPagingNum int 62 } `ini:"ui.admin"` 63 User struct { 64 RepoPagingNum int 65 } `ini:"ui.user"` 66 Meta struct { 67 Author string 68 Description string 69 Keywords string 70 } `ini:"ui.meta"` 71 }{ 72 ExplorePagingNum: 20, 73 SitemapPagingNum: 20, 74 IssuePagingNum: 20, 75 RepoSearchPagingNum: 20, 76 MembersPagingNum: 20, 77 FeedMaxCommitNum: 5, 78 FeedPagingNum: 20, 79 PackagesPagingNum: 20, 80 GraphMaxCommitNum: 100, 81 CodeCommentLines: 4, 82 ReactionMaxUserNum: 10, 83 MaxDisplayFileSize: 8388608, 84 DefaultTheme: `gitea-auto`, 85 Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`}, 86 CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`}, 87 CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:"}, 88 PreferredTimestampTense: "mixed", 89 90 AmbiguousUnicodeDetection: true, 91 92 Notification: struct { 93 MinTimeout time.Duration 94 TimeoutStep time.Duration 95 MaxTimeout time.Duration 96 EventSourceUpdateTime time.Duration 97 }{ 98 MinTimeout: 10 * time.Second, 99 TimeoutStep: 10 * time.Second, 100 MaxTimeout: 60 * time.Second, 101 EventSourceUpdateTime: 10 * time.Second, 102 }, 103 SVG: struct { 104 Enabled bool `ini:"ENABLE_RENDER"` 105 }{ 106 Enabled: true, 107 }, 108 CSV: struct { 109 MaxFileSize int64 110 }{ 111 MaxFileSize: 524288, 112 }, 113 Admin: struct { 114 UserPagingNum int 115 RepoPagingNum int 116 NoticePagingNum int 117 OrgPagingNum int 118 }{ 119 UserPagingNum: 50, 120 RepoPagingNum: 50, 121 NoticePagingNum: 25, 122 OrgPagingNum: 50, 123 }, 124 User: struct { 125 RepoPagingNum int 126 }{ 127 RepoPagingNum: 15, 128 }, 129 Meta: struct { 130 Author string 131 Description string 132 Keywords string 133 }{ 134 Author: "Gitea - Git with a cup of tea", 135 Description: "Gitea (Git with a cup of tea) is a painless self-hosted Git service written in Go", 136 Keywords: "go,git,self-hosted,gitea", 137 }, 138 } 139 140 func loadUIFrom(rootCfg ConfigProvider) { 141 mustMapSetting(rootCfg, "ui", &UI) 142 sec := rootCfg.Section("ui") 143 UI.ShowUserEmail = sec.Key("SHOW_USER_EMAIL").MustBool(true) 144 UI.DefaultShowFullName = sec.Key("DEFAULT_SHOW_FULL_NAME").MustBool(false) 145 UI.SearchRepoDescription = sec.Key("SEARCH_REPO_DESCRIPTION").MustBool(true) 146 147 if UI.PreferredTimestampTense != "mixed" && UI.PreferredTimestampTense != "absolute" { 148 log.Fatal("ui.PREFERRED_TIMESTAMP_TENSE must be either 'mixed' or 'absolute'") 149 } 150 151 // OnlyShowRelevantRepos=false is important for many private/enterprise instances, 152 // because many private repositories do not have "description/topic", users just want to search by their names. 153 UI.OnlyShowRelevantRepos = sec.Key("ONLY_SHOW_RELEVANT_REPOS").MustBool(false) 154 155 UI.ReactionsLookup = make(container.Set[string]) 156 for _, reaction := range UI.Reactions { 157 UI.ReactionsLookup.Add(reaction) 158 } 159 UI.CustomEmojisMap = make(map[string]string) 160 for _, emoji := range UI.CustomEmojis { 161 UI.CustomEmojisMap[emoji] = ":" + emoji + ":" 162 } 163 }