| @@ -186,8 +186,9 @@ type Repository struct { | |||
| NumOpenMilestones int `xorm:"-"` | |||
| NumReleases int `xorm:"-"` | |||
| IsPrivate bool `xorm:"INDEX"` | |||
| IsEmpty bool `xorm:"INDEX"` | |||
| IsPrivate bool `xorm:"INDEX"` | |||
| IsEmpty bool `xorm:"INDEX"` | |||
| IsArchived bool `xorm:"INDEX"` | |||
| IsMirror bool `xorm:"INDEX"` | |||
| *Mirror `xorm:"-"` | |||
| @@ -292,6 +293,7 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool) | |||
| Description: repo.Description, | |||
| Private: repo.IsPrivate, | |||
| Empty: repo.IsEmpty, | |||
| Archived: repo.IsArchived, | |||
| Size: int(repo.Size / 1024), | |||
| Fork: repo.IsFork, | |||
| Parent: parent, | |||
| @@ -2341,6 +2343,13 @@ func CheckRepoStats() { | |||
| // ***** END: Repository.NumForks ***** | |||
| } | |||
| // SetArchiveRepoState sets if a repo is archived | |||
| func (repo *Repository) SetArchiveRepoState(isArchived bool) (err error) { | |||
| repo.IsArchived = isArchived | |||
| _, err = x.Where("id = ?", repo.ID).Cols("is_archived").Update(repo) | |||
| return | |||
| } | |||
| // ___________ __ | |||
| // \_ _____/__________| | __ | |||
| // | __)/ _ \_ __ \ |/ / | |||
| @@ -117,6 +117,7 @@ type RepoSettingForm struct { | |||
| EnableTimetracker bool | |||
| AllowOnlyContributorsToTrackTime bool | |||
| EnableIssueDependencies bool | |||
| IsArchived bool | |||
| // Admin settings | |||
| EnableHealthCheck bool | |||
| @@ -56,7 +56,7 @@ type Repository struct { | |||
| // CanEnableEditor returns true if repository is editable and user has proper access level. | |||
| func (r *Repository) CanEnableEditor() bool { | |||
| return r.Permission.CanWrite(models.UnitTypeCode) && r.Repository.CanEnableEditor() && r.IsViewBranch | |||
| return r.Permission.CanWrite(models.UnitTypeCode) && r.Repository.CanEnableEditor() && r.IsViewBranch && !r.Repository.IsArchived | |||
| } | |||
| // CanCreateBranch returns true if repository is editable and user has proper access level. | |||
| @@ -64,6 +64,15 @@ func (r *Repository) CanCreateBranch() bool { | |||
| return r.Permission.CanWrite(models.UnitTypeCode) && r.Repository.CanCreateBranch() | |||
| } | |||
| // RepoMustNotBeArchived checks if a repo is archived | |||
| func RepoMustNotBeArchived() macaron.Handler { | |||
| return func(ctx *Context) { | |||
| if ctx.Repo.Repository.IsArchived { | |||
| ctx.NotFound("IsArchived", fmt.Errorf(ctx.Tr("repo.archive.title"))) | |||
| } | |||
| } | |||
| } | |||
| // CanCommitToBranch returns true if repository is editable and user has proper access level | |||
| // and branch is not protected for push | |||
| func (r *Repository) CanCommitToBranch(doer *models.User) (bool, error) { | |||
| @@ -542,6 +542,10 @@ forks = Forks | |||
| pick_reaction = Pick your reaction | |||
| reactions_more = and %d more | |||
| archive.title = This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests. | |||
| archive.issue.nocomment = This repo is archived. You cannot comment on issues. | |||
| archive.pull.nocomment = This repo is archived. You cannot comment on pull requests. | |||
| form.reach_limit_of_creation = You have already reached your limit of %d repositories. | |||
| form.name_reserved = The repository name '%s' is reserved. | |||
| form.name_pattern_not_allowed = The pattern '%s' is not allowed in a repository name. | |||
| @@ -1176,6 +1180,18 @@ settings.choose_branch = Choose a branch… | |||
| settings.no_protected_branch = There are no protected branches. | |||
| settings.edit_protected_branch = Edit | |||
| settings.protected_branch_required_approvals_min = Required approvals cannot be negative. | |||
| settings.archive.button = Archive Repo | |||
| settings.archive.header = Archive This Repo | |||
| settings.archive.text = Archiving the repo will make it entirely read-only. It is hidden from the dashboard, cannot be committed to and no issues or pull-requests can be created. | |||
| settings.archive.success = The repo was successfully archived. | |||
| settings.archive.error = An error occured while trying to archive the repo. See the log for more details. | |||
| settings.archive.error_ismirror = You cannot archive a mirrored repo. | |||
| settings.archive.branchsettings_unavailable = Branch settings are not available if the repo is archived. | |||
| settings.unarchive.button = Un-Archive Repo | |||
| settings.unarchive.header = Un-Archive This Repo | |||
| settings.unarchive.text = Un-Archiving the repo will restore its ability to recieve commits and pushes, as well as new issues and pull-requests. | |||
| settings.unarchive.success = The repo was successfully un-archived. | |||
| settings.unarchive.error = An error occured while trying to un-archive the repo. See the log for more details. | |||
| diff.browse_source = Browse Source | |||
| diff.parent = parent | |||
| @@ -629,3 +629,11 @@ footer { | |||
| .heatmap-color-5 { | |||
| background-color: #2f6b1b; | |||
| } | |||
| .archived-icon{ | |||
| color: lighten(#000, 70%) !important; | |||
| } | |||
| .archived-icon{ | |||
| color: lighten(#000, 70%) !important; | |||
| } | |||
| @@ -95,6 +95,12 @@ func HTTP(ctx *context.Context) { | |||
| return | |||
| } | |||
| // Don't allow pushing if the repo is archived | |||
| if repo.IsArchived && !isPull { | |||
| ctx.HandleText(http.StatusForbidden, "This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.") | |||
| return | |||
| } | |||
| // Only public pull don't need auth. | |||
| isPublicPull := !repo.IsPrivate && isPull | |||
| var ( | |||
| @@ -67,7 +67,7 @@ func Releases(ctx *context.Context) { | |||
| } | |||
| writeAccess := ctx.Repo.CanWrite(models.UnitTypeReleases) | |||
| ctx.Data["CanCreateRelease"] = writeAccess | |||
| ctx.Data["CanCreateRelease"] = writeAccess && !ctx.Repo.Repository.IsArchived | |||
| opts := models.FindReleasesOptions{ | |||
| IncludeDrafts: writeAccess, | |||
| @@ -354,6 +354,47 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { | |||
| ctx.Flash.Success(ctx.Tr("repo.settings.wiki_deletion_success")) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/settings") | |||
| case "archive": | |||
| if !ctx.Repo.IsOwner() { | |||
| ctx.Error(403) | |||
| return | |||
| } | |||
| if repo.IsMirror { | |||
| ctx.Flash.Error(ctx.Tr("repo.settings.archive.error_ismirror")) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/settings") | |||
| return | |||
| } | |||
| if err := repo.SetArchiveRepoState(true); err != nil { | |||
| log.Error(4, "Tried to archive a repo: %s", err) | |||
| ctx.Flash.Error(ctx.Tr("repo.settings.archive.error")) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/settings") | |||
| return | |||
| } | |||
| ctx.Flash.Success(ctx.Tr("repo.settings.archive.success")) | |||
| log.Trace("Repository was archived: %s/%s", ctx.Repo.Owner.Name, repo.Name) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/settings") | |||
| case "unarchive": | |||
| if !ctx.Repo.IsOwner() { | |||
| ctx.Error(403) | |||
| return | |||
| } | |||
| if err := repo.SetArchiveRepoState(false); err != nil { | |||
| log.Error(4, "Tried to unarchive a repo: %s", err) | |||
| ctx.Flash.Error(ctx.Tr("repo.settings.unarchive.error")) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/settings") | |||
| return | |||
| } | |||
| ctx.Flash.Success(ctx.Tr("repo.settings.unarchive.success")) | |||
| log.Trace("Repository was un-archived: %s/%s", ctx.Repo.Owner.Name, repo.Name) | |||
| ctx.Redirect(ctx.Repo.RepoLink + "/settings") | |||
| default: | |||
| ctx.NotFound("", nil) | |||
| } | |||
| @@ -151,8 +151,8 @@ func renderDirectory(ctx *context.Context, treeLink string) { | |||
| // Check permission to add or upload new file. | |||
| if ctx.Repo.CanWrite(models.UnitTypeCode) && ctx.Repo.IsViewBranch { | |||
| ctx.Data["CanAddFile"] = true | |||
| ctx.Data["CanUploadFile"] = setting.Repository.Upload.Enabled | |||
| ctx.Data["CanAddFile"] = !ctx.Repo.Repository.IsArchived | |||
| ctx.Data["CanUploadFile"] = setting.Repository.Upload.Enabled && !ctx.Repo.Repository.IsArchived | |||
| } | |||
| } | |||
| @@ -203,7 +203,7 @@ func renderWikiPage(ctx *context.Context, isViewPage bool) (*git.Repository, *gi | |||
| // Wiki renders single wiki page | |||
| func Wiki(ctx *context.Context) { | |||
| ctx.Data["PageIsWiki"] = true | |||
| ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(models.UnitTypeWiki) | |||
| ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(models.UnitTypeWiki) && !ctx.Repo.Repository.IsArchived | |||
| if !ctx.Repo.Repository.HasWiki() { | |||
| ctx.Data["Title"] = ctx.Tr("repo.wiki") | |||
| @@ -246,7 +246,7 @@ func WikiPages(ctx *context.Context) { | |||
| ctx.Data["Title"] = ctx.Tr("repo.wiki.pages") | |||
| ctx.Data["PageIsWiki"] = true | |||
| ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(models.UnitTypeWiki) | |||
| ctx.Data["CanWriteWiki"] = ctx.Repo.CanWrite(models.UnitTypeWiki) && !ctx.Repo.Repository.IsArchived | |||
| wikiRepo, commit, err := findWikiRepoCommit(ctx) | |||
| if err != nil { | |||
| @@ -492,7 +492,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Group("/branches", func() { | |||
| m.Combo("").Get(repo.ProtectedBranch).Post(repo.ProtectedBranchPost) | |||
| m.Combo("/*").Get(repo.SettingsProtectedBranch). | |||
| Post(bindIgnErr(auth.ProtectBranchForm{}), repo.SettingsProtectedBranchPost) | |||
| Post(bindIgnErr(auth.ProtectBranchForm{}), context.RepoMustNotBeArchived(), repo.SettingsProtectedBranchPost) | |||
| }, repo.MustBeNotEmpty) | |||
| m.Group("/hooks", func() { | |||
| @@ -530,13 +530,13 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }) | |||
| }, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.UnitTypes(), context.RepoRef()) | |||
| m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action) | |||
| m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), context.RepoMustNotBeArchived(), repo.Action) | |||
| m.Group("/:username/:reponame", func() { | |||
| m.Group("/issues", func() { | |||
| m.Combo("/new").Get(context.RepoRef(), repo.NewIssue). | |||
| Post(bindIgnErr(auth.CreateIssueForm{}), repo.NewIssuePost) | |||
| }, reqRepoIssueReader) | |||
| }, context.RepoMustNotBeArchived(), reqRepoIssueReader) | |||
| // FIXME: should use different URLs but mostly same logic for comments of issue and pull reuqest. | |||
| // So they can apply their own enable/disable logic on routers. | |||
| m.Group("/issues", func() { | |||
| @@ -557,24 +557,24 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }) | |||
| }) | |||
| m.Post("/reactions/:action", bindIgnErr(auth.ReactionForm{}), repo.ChangeIssueReaction) | |||
| }) | |||
| }, context.RepoMustNotBeArchived()) | |||
| m.Post("/labels", reqRepoIssuesOrPullsWriter, repo.UpdateIssueLabel) | |||
| m.Post("/milestone", reqRepoIssuesOrPullsWriter, repo.UpdateIssueMilestone) | |||
| m.Post("/assignee", reqRepoIssuesOrPullsWriter, repo.UpdateIssueAssignee) | |||
| m.Post("/status", reqRepoIssuesOrPullsWriter, repo.UpdateIssueStatus) | |||
| }) | |||
| }, context.RepoMustNotBeArchived()) | |||
| m.Group("/comments/:id", func() { | |||
| m.Post("", repo.UpdateCommentContent) | |||
| m.Post("/delete", repo.DeleteComment) | |||
| m.Post("/reactions/:action", bindIgnErr(auth.ReactionForm{}), repo.ChangeCommentReaction) | |||
| }) | |||
| }, context.RepoMustNotBeArchived()) | |||
| m.Group("/labels", func() { | |||
| m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) | |||
| m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) | |||
| m.Post("/delete", repo.DeleteLabel) | |||
| m.Post("/initialize", bindIgnErr(auth.InitializeLabelsForm{}), repo.InitializeLabels) | |||
| }, reqRepoIssuesOrPullsWriter, context.RepoRef()) | |||
| }, context.RepoMustNotBeArchived(), reqRepoIssuesOrPullsWriter, context.RepoRef()) | |||
| m.Group("/milestones", func() { | |||
| m.Combo("/new").Get(repo.NewMilestone). | |||
| Post(bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) | |||
| @@ -582,7 +582,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Post("/:id/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.EditMilestonePost) | |||
| m.Get("/:id/:action", repo.ChangeMilestonStatus) | |||
| m.Post("/delete", repo.DeleteMilestone) | |||
| }, reqRepoIssuesOrPullsWriter, context.RepoRef()) | |||
| }, context.RepoMustNotBeArchived(), reqRepoIssuesOrPullsWriter, context.RepoRef()) | |||
| m.Group("/milestone", func() { | |||
| m.Get("/:id", repo.MilestoneIssuesAndPulls) | |||
| }, reqRepoIssuesOrPullsWriter, context.RepoRef()) | |||
| @@ -607,7 +607,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Post("/upload-file", repo.UploadFileToServer) | |||
| m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer) | |||
| }, context.RepoRef(), repo.MustBeEditable, repo.MustBeAbleToUpload) | |||
| }, reqRepoCodeWriter, repo.MustBeNotEmpty) | |||
| }, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty) | |||
| m.Group("/branches", func() { | |||
| m.Group("/_new/", func() { | |||
| @@ -617,7 +617,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }, bindIgnErr(auth.NewBranchForm{})) | |||
| m.Post("/delete", repo.DeleteBranchPost) | |||
| m.Post("/restore", repo.RestoreBranchPost) | |||
| }, reqRepoCodeWriter, repo.MustBeNotEmpty) | |||
| }, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty) | |||
| }, reqSignIn, context.RepoAssignment(), context.UnitTypes()) | |||
| @@ -630,11 +630,11 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Get("/new", repo.NewRelease) | |||
| m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) | |||
| m.Post("/delete", repo.DeleteRelease) | |||
| }, reqSignIn, repo.MustBeNotEmpty, reqRepoReleaseWriter, context.RepoRef()) | |||
| }, reqSignIn, repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoReleaseWriter, context.RepoRef()) | |||
| m.Group("/releases", func() { | |||
| m.Get("/edit/*", repo.EditRelease) | |||
| m.Post("/edit/*", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) | |||
| }, reqSignIn, repo.MustBeNotEmpty, reqRepoReleaseWriter, func(ctx *context.Context) { | |||
| }, reqSignIn, repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoReleaseWriter, func(ctx *context.Context) { | |||
| var err error | |||
| ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) | |||
| if err != nil { | |||
| @@ -652,7 +652,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Group("/:username/:reponame", func() { | |||
| m.Post("/topics", repo.TopicsPost) | |||
| }, context.RepoAssignment(), reqRepoAdmin) | |||
| }, context.RepoMustNotBeArchived(), context.RepoAssignment(), reqRepoAdmin) | |||
| m.Group("/:username/:reponame", func() { | |||
| m.Group("", func() { | |||
| @@ -672,7 +672,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Combo("/:page/_edit").Get(repo.EditWiki). | |||
| Post(bindIgnErr(auth.NewWikiForm{}), repo.EditWikiPost) | |||
| m.Post("/:page/delete", repo.DeleteWikiPagePost) | |||
| }, reqSignIn, reqRepoWikiWriter) | |||
| }, context.RepoMustNotBeArchived(), reqSignIn, reqRepoWikiWriter) | |||
| }, repo.MustEnableWiki, context.RepoRef()) | |||
| m.Group("/wiki", func() { | |||
| @@ -694,14 +694,14 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Get(".diff", repo.DownloadPullDiff) | |||
| m.Get(".patch", repo.DownloadPullPatch) | |||
| m.Get("/commits", context.RepoRef(), repo.ViewPullCommits) | |||
| m.Post("/merge", reqRepoPullsWriter, bindIgnErr(auth.MergePullRequestForm{}), repo.MergePullRequest) | |||
| m.Post("/cleanup", context.RepoRef(), repo.CleanUpPullRequest) | |||
| m.Post("/merge", context.RepoMustNotBeArchived(), reqRepoPullsWriter, bindIgnErr(auth.MergePullRequestForm{}), repo.MergePullRequest) | |||
| m.Post("/cleanup", context.RepoMustNotBeArchived(), context.RepoRef(), repo.CleanUpPullRequest) | |||
| m.Group("/files", func() { | |||
| m.Get("", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.ViewPullFiles) | |||
| m.Group("/reviews", func() { | |||
| m.Post("/comments", bindIgnErr(auth.CodeCommentForm{}), repo.CreateCodeComment) | |||
| m.Post("/submit", bindIgnErr(auth.SubmitReviewForm{}), repo.SubmitReview) | |||
| }) | |||
| }, context.RepoMustNotBeArchived()) | |||
| }) | |||
| }, repo.MustAllowPulls) | |||
| @@ -2,7 +2,10 @@ | |||
| {{range .Repos}} | |||
| <div class="item"> | |||
| <div class="ui header"> | |||
| <a class="name" href="{{.Link}}">{{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}}</a> | |||
| <a class="name" href="{{.Link}}"> | |||
| {{if or $.PageIsExplore $.PageIsProfileStarList }}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}} | |||
| {{if .IsArchived}}<i class="archive icon archived-icon"></i>{{end}} | |||
| </a> | |||
| {{if .IsPrivate}} | |||
| <span class="text gold"><i class="octicon octicon-lock"></i></span> | |||
| {{else if .IsFork}} | |||
| @@ -8,7 +8,7 @@ | |||
| <a class="ui tiny basic toggle button" href="?style={{if .IsSplitStyle}}unified{{else}}split{{end}}">{{ if .IsSplitStyle }}{{.i18n.Tr "repo.diff.show_unified_view"}}{{else}}{{.i18n.Tr "repo.diff.show_split_view"}}{{end}}</a> | |||
| {{end}} | |||
| <a class="ui tiny basic toggle button" data-target="#diff-files">{{.i18n.Tr "repo.diff.show_diff_stats"}}</a> | |||
| {{if and .PageIsPullFiles $.SignedUserID}} | |||
| {{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}} | |||
| {{template "repo/diff/new_review" .}} | |||
| {{end}} | |||
| </div> | |||
| @@ -27,7 +27,7 @@ | |||
| <a class="ui tiny basic toggle button" href="?style={{if .IsSplitStyle}}unified{{else}}split{{end}}">{{ if .IsSplitStyle }}{{.i18n.Tr "repo.diff.show_unified_view"}}{{else}}{{.i18n.Tr "repo.diff.show_split_view"}}{{end}}</a> | |||
| {{end}} | |||
| <a class="ui tiny basic toggle button" data-target="#diff-files">{{.i18n.Tr "repo.diff.show_diff_stats"}}</a> | |||
| {{if and .PageIsPullFiles $.SignedUserID}} | |||
| {{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}} | |||
| {{template "repo/diff/new_review" .}} | |||
| {{end}} | |||
| </div> | |||
| @@ -194,27 +194,29 @@ | |||
| </div> | |||
| {{end}} | |||
| <div id="pull_review_add_comment" class="hide"> | |||
| {{template "repo/diff/new_comment" dict "root" .}} | |||
| </div> | |||
| <div class="hide" id="edit-content-form"> | |||
| <div class="ui comment form"> | |||
| <div class="ui top attached tabular menu"> | |||
| <a class="active write item">{{$.i18n.Tr "write"}}</a> | |||
| <a class="preview item" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{$.RepoLink}}">{{$.i18n.Tr "preview"}}</a> | |||
| </div> | |||
| <div class="ui bottom attached active write tab segment"> | |||
| <textarea tabindex="1" name="content"></textarea> | |||
| </div> | |||
| <div class="ui bottom attached tab preview segment markdown"> | |||
| {{$.i18n.Tr "loading"}} | |||
| </div> | |||
| <div class="text right edit buttons"> | |||
| <div class="ui basic blue cancel button" tabindex="3">{{.i18n.Tr "repo.issues.cancel"}}</div> | |||
| <div class="ui green save button" tabindex="2">{{.i18n.Tr "repo.issues.save"}}</div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{if not $.Repository.IsArchived}} | |||
| <div id="pull_review_add_comment" class="hide"> | |||
| {{template "repo/diff/new_comment" dict "root" .}} | |||
| </div> | |||
| <div class="hide" id="edit-content-form"> | |||
| <div class="ui comment form"> | |||
| <div class="ui top attached tabular menu"> | |||
| <a class="active write item">{{$.i18n.Tr "write"}}</a> | |||
| <a class="preview item" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{$.RepoLink}}">{{$.i18n.Tr "preview"}}</a> | |||
| </div> | |||
| <div class="ui bottom attached active write tab segment"> | |||
| <textarea tabindex="1" name="content"></textarea> | |||
| </div> | |||
| <div class="ui bottom attached tab preview segment markdown"> | |||
| {{$.i18n.Tr "loading"}} | |||
| </div> | |||
| <div class="text right edit buttons"> | |||
| <div class="ui basic blue cancel button" tabindex="3">{{.i18n.Tr "repo.issues.cancel"}}</div> | |||
| <div class="ui green save button" tabindex="2">{{.i18n.Tr "repo.issues.save"}}</div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| {{if .IsSplitStyle}} | |||
| <script> | |||
| @@ -1,4 +1,4 @@ | |||
| {{if $.root.SignedUserID}} | |||
| {{if and $.root.SignedUserID (not $.Repository.IsArchived)}} | |||
| {{if $.hidden}} | |||
| <button class="comment-form-reply ui green labeled icon tiny button"><i class="reply icon"></i> {{$.root.i18n.Tr "repo.diff.comment.reply"}}</button> | |||
| {{end}} | |||
| @@ -5,6 +5,11 @@ | |||
| <div class="ui grid"> | |||
| <div class="sixteen wide column content"> | |||
| {{template "base/alert" .}} | |||
| {{if .Repository.IsArchived}} | |||
| <div class="ui warning message"> | |||
| {{.i18n.Tr "repo.archive.title"}} | |||
| </div> | |||
| {{end}} | |||
| {{if .CanWriteCode}} | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.quick_guide"}} | |||
| @@ -35,28 +40,31 @@ | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <div class="ui divider"></div> | |||
| <div class="item"> | |||
| <h3>{{.i18n.Tr "repo.create_new_repo_command"}}</h3> | |||
| <div class="markdown"> | |||
| <pre><code>touch README.md | |||
| {{if not .Repository.IsArchived}} | |||
| <div class="ui divider"></div> | |||
| <div class="item"> | |||
| <h3>{{.i18n.Tr "repo.create_new_repo_command"}}</h3> | |||
| <div class="markdown"> | |||
| <pre><code>touch README.md | |||
| git init | |||
| git add README.md | |||
| git commit -m "first commit" | |||
| git remote add origin <span class="clone-url">{{if $.DisableSSH}}{{$.CloneLink.HTTPS}}{{else}}{{$.CloneLink.SSH}}{{end}}</span> | |||
| git push -u origin master</code></pre> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <div class="ui divider"></div> | |||
| <div class="ui divider"></div> | |||
| <div class="item"> | |||
| <h3>{{.i18n.Tr "repo.push_exist_repo"}}</h3> | |||
| <div class="markdown"> | |||
| <pre><code>git remote add origin <span class="clone-url">{{if $.DisableSSH}}{{$.CloneLink.HTTPS}}{{else}}{{$.CloneLink.SSH}}{{end}}</span> | |||
| <div class="item"> | |||
| <h3>{{.i18n.Tr "repo.push_exist_repo"}}</h3> | |||
| <div class="markdown"> | |||
| <pre><code>git remote add origin <span class="clone-url">{{if $.DisableSSH}}{{$.CloneLink.HTTPS}}{{else}}{{$.CloneLink.SSH}}{{end}}</span> | |||
| git push -u origin master</code></pre> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| {{else}} | |||
| <div class="ui segment center"> | |||
| {{.i18n.Tr "repo.empty_message"}} | |||
| @@ -8,6 +8,7 @@ | |||
| <a href="{{AppSubUrl}}/{{.Owner.Name}}">{{.Owner.Name}}</a> | |||
| <div class="divider"> / </div> | |||
| <a href="{{$.RepoLink}}">{{.Name}}</a> | |||
| {{if .IsArchived}}<i class="archive icon archived-icon"></i>{{end}} | |||
| {{if .IsMirror}}<div class="fork-flag">{{$.i18n.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{$.Mirror.Address}}">{{$.Mirror.Address}}</a></div>{{end}} | |||
| {{if .IsFork}}<div class="fork-flag">{{$.i18n.Tr "repo.forked_from"}} <a href="{{.BaseRepo.Link}}">{{SubStr .BaseRepo.RelLink 1 -1}}</a></div>{{end}} | |||
| </div> | |||
| @@ -50,6 +50,11 @@ | |||
| <span id="count_prompt">{{.i18n.Tr "repo.topic.count_prompt"}}</span> | |||
| <span id="format_prompt">{{.i18n.Tr "repo.topic.format_prompt"}}</span> | |||
| </div> | |||
| {{if .Repository.IsArchived}} | |||
| <div class="ui warning message"> | |||
| {{.i18n.Tr "repo.archive.title"}} | |||
| </div> | |||
| {{end}} | |||
| {{template "repo/sub_menu" .}} | |||
| <div class="ui stackable secondary menu mobile--margin-between-items mobile--no-negative-margins"> | |||
| {{if and .PullRequestCtx.Allowed .IsViewBranch}} | |||
| @@ -4,39 +4,41 @@ | |||
| <div class="ui container"> | |||
| <div class="navbar"> | |||
| {{template "repo/issue/navbar" .}} | |||
| {{if or .CanWriteIssues .CanWritePulls}} | |||
| {{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}} | |||
| <div class="ui right"> | |||
| <div class="ui green new-label button">{{.i18n.Tr "repo.issues.new_label"}}</div> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| <div class="ui new-label segment hide"> | |||
| <form class="ui form" action="{{$.RepoLink}}/labels/new" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <div class="ui grid"> | |||
| <div class="three wide column"> | |||
| <div class="ui small input"> | |||
| <input class="new-label-input" name="title" placeholder="{{.i18n.Tr "repo.issues.new_label_placeholder"}}" autofocus required> | |||
| {{if not .Repository.IsArchived}} | |||
| <div class="ui new-label segment hide"> | |||
| <form class="ui form" action="{{$.RepoLink}}/labels/new" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <div class="ui grid"> | |||
| <div class="three wide column"> | |||
| <div class="ui small input"> | |||
| <input class="new-label-input" name="title" placeholder="{{.i18n.Tr "repo.issues.new_label_placeholder"}}" autofocus required> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <div class="five wide column"> | |||
| <div class="ui small fluid input"> | |||
| <input class="new-label-desc-input" name="description" placeholder="{{.i18n.Tr "repo.issues.new_label_desc_placeholder"}}"> | |||
| <div class="five wide column"> | |||
| <div class="ui small fluid input"> | |||
| <input class="new-label-desc-input" name="description" placeholder="{{.i18n.Tr "repo.issues.new_label_desc_placeholder"}}"> | |||
| </div> | |||
| </div> | |||
| <div class="color picker column"> | |||
| <input class="color-picker" name="color" value="#70c24a" required> | |||
| </div> | |||
| <div class="column precolors"> | |||
| {{template "repo/issue/label_precolors"}} | |||
| </div> | |||
| <div class="buttons"> | |||
| <div class="ui blue small basic cancel button">{{.i18n.Tr "repo.milestones.cancel"}}</div> | |||
| <button class="ui green small button">{{.i18n.Tr "repo.issues.create_label"}}</button> | |||
| </div> | |||
| </div> | |||
| <div class="color picker column"> | |||
| <input class="color-picker" name="color" value="#70c24a" required> | |||
| </div> | |||
| <div class="column precolors"> | |||
| {{template "repo/issue/label_precolors"}} | |||
| </div> | |||
| <div class="buttons"> | |||
| <div class="ui blue small basic cancel button">{{.i18n.Tr "repo.milestones.cancel"}}</div> | |||
| <button class="ui green small button">{{.i18n.Tr "repo.issues.create_label"}}</button> | |||
| </div> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| {{end}} | |||
| <div class="ui divider"></div> | |||
| <div class="ui right floated secondary filter menu"> | |||
| @@ -57,7 +59,7 @@ | |||
| {{template "base/alert" .}} | |||
| <div class="ui black label">{{.i18n.Tr "repo.issues.label_count" .NumLabels}}</div> | |||
| <div class="label list"> | |||
| {{if and (or $.CanWriteIssues $.CanWritePulls) (eq .NumLabels 0)}} | |||
| {{if and (or $.CanWriteIssues $.CanWritePulls) (eq .NumLabels 0) (not $.Repository.IsArchived) }} | |||
| <div class="ui centered grid"> | |||
| <div class="twelve wide column eight wide computer column"> | |||
| <div class="ui attached left aligned segment"> | |||
| @@ -105,7 +107,7 @@ | |||
| <a class="ui right open-issues" href="{{$.RepoLink}}/issues?labels={{.ID}}"><i class="octicon octicon-issue-opened"></i> {{$.i18n.Tr "repo.issues.label_open_issues" .NumOpenIssues}}</a> | |||
| </div> | |||
| <div class="three wide column"> | |||
| {{if or $.CanWriteIssues $.CanWritePulls}} | |||
| {{if and (not $.Repository.IsArchived) (or $.CanWriteIssues $.CanWritePulls)}} | |||
| <a class="ui right delete-button" href="#" data-url="{{$.RepoLink}}/labels/delete" data-id="{{.ID}}"><i class="octicon octicon-trashcan"></i> {{$.i18n.Tr "repo.issues.label_delete"}}</a> | |||
| <a class="ui right edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" data-description="{{.Description}}" data-color={{.Color}}><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a> | |||
| {{end}} | |||
| @@ -117,7 +119,7 @@ | |||
| </div> | |||
| </div> | |||
| {{if or $.CanWriteIssues $.CanWritePulls}} | |||
| {{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}} | |||
| <div class="ui small basic delete modal"> | |||
| <div class="ui icon header"> | |||
| <i class="trash icon"></i> | |||
| @@ -9,13 +9,15 @@ | |||
| <div class="column center aligned"> | |||
| {{template "repo/issue/search" .}} | |||
| </div> | |||
| <div class="column right aligned"> | |||
| {{if .PageIsIssueList}} | |||
| <a class="ui green button" href="{{.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a> | |||
| {{else}} | |||
| <a class="ui green button {{if not .PullRequestCtx.Allowed}}disabled{{end}}" href="{{if .PullRequestCtx.Allowed}}{{.PullRequestCtx.BaseRepo.Link}}/compare/{{.Repository.DefaultBranch}}...{{.PullRequestCtx.HeadInfo}}{{end}}">{{.i18n.Tr "repo.pulls.new"}}</a> | |||
| {{end}} | |||
| </div> | |||
| {{if not .Repository.IsArchived}} | |||
| <div class="column right aligned"> | |||
| {{if .PageIsIssueList}} | |||
| <a class="ui green button" href="{{.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a> | |||
| {{else}} | |||
| <a class="ui green button {{if not .PullRequestCtx.Allowed}}disabled{{end}}" href="{{if .PullRequestCtx.Allowed}}{{.PullRequestCtx.BaseRepo.Link}}/compare/{{.Repository.DefaultBranch}}...{{.PullRequestCtx.HeadInfo}}{{end}}">{{.i18n.Tr "repo.pulls.new"}}</a> | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| <div class="ui divider"></div> | |||
| <div id="issue-filters" class="ui stackable grid"> | |||
| @@ -9,10 +9,12 @@ | |||
| <div class="column center aligned"> | |||
| </div> | |||
| <div class="column right aligned"> | |||
| <a class="ui grey button" href="{{.RepoLink}}/milestones/{{.MilestoneID}}/edit">{{.i18n.Tr "repo.milestones.edit"}}</a> | |||
| <a class="ui green button" href="{{.RepoLink}}/issues/new?milestone={{.MilestoneID}}">{{.i18n.Tr "repo.issues.new"}}</a> | |||
| </div> | |||
| {{if not .Repository.IsArchived}} | |||
| <div class="column right aligned"> | |||
| <a class="ui grey button" href="{{.RepoLink}}/milestones/{{.MilestoneID}}/edit">{{.i18n.Tr "repo.milestones.edit"}}</a> | |||
| <a class="ui green button" href="{{.RepoLink}}/issues/new?milestone={{.MilestoneID}}">{{.i18n.Tr "repo.issues.new"}}</a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| <div class="ui one column stackable grid"> | |||
| <div class="column"> | |||
| @@ -4,7 +4,7 @@ | |||
| <div class="ui container"> | |||
| <div class="navbar"> | |||
| {{template "repo/issue/navbar" .}} | |||
| {{if or .CanWriteIssues .CanWritePulls}} | |||
| {{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}} | |||
| <div class="ui right"> | |||
| <a class="ui green button" href="{{$.Link}}/new">{{.i18n.Tr "repo.milestones.new"}}</a> | |||
| </div> | |||
| @@ -67,7 +67,7 @@ | |||
| {{if .TotalTrackedTime}}<i class="octicon octicon-clock"></i> {{.TotalTrackedTime|Sec2Time}}{{end}} | |||
| </span> | |||
| </div> | |||
| {{if or $.CanWriteIssues $.CanWritePulls}} | |||
| {{if and (or $.CanWriteIssues $.CanWritePulls) (not $.Repository.IsArchived)}} | |||
| <div class="ui right operate"> | |||
| <a href="{{$.Link}}/{{.ID}}/edit" data-id={{.ID}} data-title={{.Name}}><i class="octicon octicon-pencil"></i> {{$.i18n.Tr "repo.issues.label_edit"}}</a> | |||
| {{if .IsClosed}} | |||
| @@ -6,13 +6,15 @@ | |||
| <div class="column"> | |||
| {{template "repo/issue/navbar" .}} | |||
| </div> | |||
| <div class="column right aligned"> | |||
| {{if .PageIsIssueList}} | |||
| <a class="ui green button" href="{{.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a> | |||
| {{else}} | |||
| <a class="ui green button {{if not .PullRequestCtx.Allowed}}disabled{{end}}" href="{{.RepoLink}}/compare/{{.BranchName | EscapePound}}...{{.PullRequestCtx.HeadInfo | EscapePound}}">{{.i18n.Tr "repo.pulls.new"}}</a> | |||
| {{end}} | |||
| </div> | |||
| {{if not .Repository.IsArchived}} | |||
| <div class="column right aligned"> | |||
| {{if .PageIsIssueList}} | |||
| <a class="ui green button" href="{{.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a> | |||
| {{else}} | |||
| <a class="ui green button {{if not .PullRequestCtx.Allowed}}disabled{{end}}" href="{{.RepoLink}}/compare/{{.BranchName | EscapePound}}...{{.PullRequestCtx.HeadInfo | EscapePound}}">{{.i18n.Tr "repo.pulls.new"}}</a> | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| <div class="ui divider"></div> | |||
| {{if .Issue.IsPull}} | |||
| @@ -18,14 +18,16 @@ | |||
| <div class="content"> | |||
| <div class="ui top attached header"> | |||
| <span class="text grey"><a {{if gt .Issue.Poster.ID 0}}href="{{.Issue.Poster.HomeLink}}"{{end}}>{{.Issue.Poster.Name}}</a> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}</span> | |||
| <div class="ui right actions"> | |||
| {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index) }} | |||
| {{if or .IsIssueWriter .IsIssuePoster}} | |||
| <div class="item action"> | |||
| <a class="edit-content" href="#"><i class="octicon octicon-pencil"></i></a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| {{if not $.Repository.IsArchived}} | |||
| <div class="ui right actions"> | |||
| {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index) }} | |||
| {{if or .IsIssueWriter .IsIssuePoster}} | |||
| <div class="item action"> | |||
| <a class="edit-content" href="#"><i class="octicon octicon-pencil"></i></a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| <div class="ui attached segment"> | |||
| <div class="render-content markdown has-emoji"> | |||
| @@ -64,43 +66,53 @@ | |||
| {{ template "repo/issue/view_content/comments" . }} | |||
| {{if .Issue.IsPull}} | |||
| {{if and .Issue.IsPull (not $.Repository.IsArchived)}} | |||
| {{ template "repo/issue/view_content/pull". }} | |||
| {{end}} | |||
| {{if .IsSigned}} | |||
| <div class="comment form"> | |||
| <a class="avatar" href="{{.SignedUser.HomeLink}}"> | |||
| <img src="{{.SignedUser.RelAvatarLink}}"> | |||
| </a> | |||
| <div class="content"> | |||
| <form class="ui segment form" id="comment-form" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/comments" method="post"> | |||
| {{template "repo/issue/comment_tab" .}} | |||
| {{.CsrfTokenHtml}} | |||
| <input id="status" name="status" type="hidden"> | |||
| <div class="text right"> | |||
| {{if and (or .IsIssueWriter .IsIssuePoster) (not .DisableStatusChange)}} | |||
| {{if .Issue.IsClosed}} | |||
| <div id="status-button" class="ui green basic button" tabindex="6" data-status="{{.i18n.Tr "repo.issues.reopen_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.reopen_comment_issue"}}" data-status-val="reopen"> | |||
| {{.i18n.Tr "repo.issues.reopen_issue"}} | |||
| </div> | |||
| {{else}} | |||
| <div id="status-button" class="ui red basic button" tabindex="6" data-status="{{.i18n.Tr "repo.issues.close_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.close_comment_issue"}}" data-status-val="close"> | |||
| {{.i18n.Tr "repo.issues.close_issue"}} | |||
| </div> | |||
| {{end}} | |||
| {{end}} | |||
| <button class="ui green button" tabindex="5"> | |||
| {{.i18n.Tr "repo.issues.create_comment"}} | |||
| </button> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| {{else}} | |||
| {{if .Repository.IsArchived}} | |||
| <div class="ui warning message"> | |||
| {{.i18n.Tr "repo.issues.sign_in_require_desc" .SignInLink | Safe}} | |||
| {{if .Issue.IsPull}} | |||
| {{.i18n.Tr "repo.archive.pull.nocomment"}} | |||
| {{else}} | |||
| {{.i18n.Tr "repo.archive.issue.nocomment"}} | |||
| {{end}} | |||
| </div> | |||
| {{else}} | |||
| {{if .IsSigned}} | |||
| <div class="comment form"> | |||
| <a class="avatar" href="{{.SignedUser.HomeLink}}"> | |||
| <img src="{{.SignedUser.RelAvatarLink}}"> | |||
| </a> | |||
| <div class="content"> | |||
| <form class="ui segment form" id="comment-form" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/comments" method="post"> | |||
| {{template "repo/issue/comment_tab" .}} | |||
| {{.CsrfTokenHtml}} | |||
| <input id="status" name="status" type="hidden"> | |||
| <div class="text right"> | |||
| {{if and (or .IsIssueWriter .IsIssuePoster) (not .DisableStatusChange)}} | |||
| {{if .Issue.IsClosed}} | |||
| <div id="status-button" class="ui green basic button" tabindex="6" data-status="{{.i18n.Tr "repo.issues.reopen_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.reopen_comment_issue"}}" data-status-val="reopen"> | |||
| {{.i18n.Tr "repo.issues.reopen_issue"}} | |||
| </div> | |||
| {{else}} | |||
| <div id="status-button" class="ui red basic button" tabindex="6" data-status="{{.i18n.Tr "repo.issues.close_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.close_comment_issue"}}" data-status-val="close"> | |||
| {{.i18n.Tr "repo.issues.close_issue"}} | |||
| </div> | |||
| {{end}} | |||
| {{end}} | |||
| <button class="ui green button" tabindex="5"> | |||
| {{.i18n.Tr "repo.issues.create_comment"}} | |||
| </button> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| {{else}} | |||
| <div class="ui warning message"> | |||
| {{.i18n.Tr "repo.issues.sign_in_require_desc" .SignInLink | Safe}} | |||
| </div> | |||
| {{end}} | |||
| {{end}} | |||
| </ui> | |||
| </div> | |||
| @@ -10,26 +10,28 @@ | |||
| <div class="content"> | |||
| <div class="ui top attached header"> | |||
| <span class="text grey"><a {{if gt .Poster.ID 0}}href="{{.Poster.HomeLink}}"{{end}}>{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}}</span> | |||
| <div class="ui right actions"> | |||
| {{if gt .ShowTag 0}} | |||
| <div class="item tag"> | |||
| {{if eq .ShowTag 1}} | |||
| {{$.i18n.Tr "repo.issues.poster"}} | |||
| {{else if eq .ShowTag 2}} | |||
| {{$.i18n.Tr "repo.issues.collaborator"}} | |||
| {{else if eq .ShowTag 3}} | |||
| {{$.i18n.Tr "repo.issues.owner"}} | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) }} | |||
| {{if or $.Permission.IsAdmin (eq .Poster.ID $.SignedUserID)}} | |||
| <div class="item action"> | |||
| <a class="edit-content" href="#"><i class="octicon octicon-pencil"></i></a> | |||
| <a class="delete-comment" href="#" data-comment-id={{.HashTag}} data-url="{{$.RepoLink}}/comments/{{.ID}}/delete" data-locale="{{$.i18n.Tr "repo.issues.delete_comment_confirm"}}"><i class="octicon octicon-x"></i></a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| {{if not $.Repository.IsArchived}} | |||
| <div class="ui right actions"> | |||
| {{if gt .ShowTag 0}} | |||
| <div class="item tag"> | |||
| {{if eq .ShowTag 1}} | |||
| {{$.i18n.Tr "repo.issues.poster"}} | |||
| {{else if eq .ShowTag 2}} | |||
| {{$.i18n.Tr "repo.issues.collaborator"}} | |||
| {{else if eq .ShowTag 3}} | |||
| {{$.i18n.Tr "repo.issues.owner"}} | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) }} | |||
| {{if or $.Permission.IsAdmin (eq .Poster.ID $.SignedUserID)}} | |||
| <div class="item action"> | |||
| <a class="edit-content" href="#"><i class="octicon octicon-pencil"></i></a> | |||
| <a class="delete-comment" href="#" data-comment-id={{.HashTag}} data-url="{{$.RepoLink}}/comments/{{.ID}}/delete" data-locale="{{$.i18n.Tr "repo.issues.delete_comment_confirm"}}"><i class="octicon octicon-x"></i></a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| <div class="ui attached segment"> | |||
| <div class="render-content markdown has-emoji"> | |||
| @@ -2,7 +2,7 @@ | |||
| <div class="ui segment metas"> | |||
| {{template "repo/issue/branch_selector_field" .}} | |||
| <div class="ui {{if not .IsIssueWriter}}disabled{{end}} floating jump select-label dropdown"> | |||
| <div class="ui {{if or (not .IsIssueWriter) .Repository.IsArchived}}disabled{{end}} floating jump select-label dropdown"> | |||
| <span class="text"> | |||
| <strong>{{.i18n.Tr "repo.issues.new.labels"}}</strong> | |||
| <span class="octicon octicon-gear"></span> | |||
| @@ -27,7 +27,7 @@ | |||
| <div class="ui divider"></div> | |||
| <div class="ui {{if not .IsIssueWriter}}disabled{{end}} floating jump select-milestone dropdown"> | |||
| <div class="ui {{if or (not .IsIssueWriter) .Repository.IsArchived}}disabled{{end}} floating jump select-milestone dropdown"> | |||
| <span class="text"> | |||
| <strong>{{.i18n.Tr "repo.issues.new.milestone"}}</strong> | |||
| <span class="octicon octicon-gear"></span> | |||
| @@ -68,7 +68,7 @@ | |||
| <div class="ui divider"></div> | |||
| <input id="assignee_id" name="assignee_id" type="hidden" value="{{.assignee_id}}"> | |||
| <div class="ui {{if not .IsIssueWriter}}disabled{{end}} floating jump select-assignees-modify dropdown"> | |||
| <div class="ui {{if or (not .IsIssueWriter) .Repository.IsArchived}}disabled{{end}} floating jump select-assignees-modify dropdown"> | |||
| <span class="text"> | |||
| <strong>{{.i18n.Tr "repo.issues.new.assignees"}}</strong> | |||
| <span class="octicon octicon-gear"></span> | |||
| @@ -119,7 +119,7 @@ | |||
| </div> | |||
| </div> | |||
| {{if $.IssueWatch}} | |||
| {{if and $.IssueWatch (not .Repository.IsArchived)}} | |||
| <div class="ui divider"></div> | |||
| <div class="ui watching"> | |||
| @@ -142,7 +142,7 @@ | |||
| </div> | |||
| {{end}} | |||
| {{if .Repository.IsTimetrackerEnabled }} | |||
| {{if .CanUseTimetracker }} | |||
| {{if and .CanUseTimetracker (not .Repository.IsArchived)}} | |||
| <div class="ui divider"></div> | |||
| <div class="ui timetrack"> | |||
| <span class="text"><strong>{{.i18n.Tr "repo.issues.tracker"}}</strong></span> | |||
| @@ -223,7 +223,7 @@ | |||
| {{if .Issue.IsOverdue}} | |||
| <span style="color: red;">{{.i18n.Tr "repo.issues.due_date_overdue"}}</span> | |||
| {{end}} | |||
| {{if .IsIssueWriter}} | |||
| {{if and .IsIssueWriter (not .Repository.IsArchived)}} | |||
| <br/> | |||
| <a style="cursor:pointer;" onclick="toggleDeadlineForm();"><i class="edit icon"></i>{{$.i18n.Tr "repo.issues.due_date_form_edit"}}</a> - | |||
| <a style="cursor:pointer;" onclick="updateDeadline('');"><i class="remove icon"></i>{{$.i18n.Tr "repo.issues.due_date_form_remove"}}</a> | |||
| @@ -233,7 +233,7 @@ | |||
| <p><i>{{.i18n.Tr "repo.issues.due_date_not_set"}}</i></p> | |||
| {{end}} | |||
| {{if .IsIssueWriter}} | |||
| {{if and .IsIssueWriter (not .Repository.IsArchived)}} | |||
| <div {{if ne .Issue.DeadlineUnix 0}} style="display: none;"{{end}} id="deadlineForm"> | |||
| <form class="ui fluid action input" action="{{AppSubUrl}}/api/v1/repos/{{.Repository.Owner.Name}}/{{.Repository.Name}}/issues/{{.Issue.Index}}" method="post" id="update-issue-deadline-form" onsubmit="setDeadline();return false;"> | |||
| {{$.CsrfTokenHtml}} | |||
| @@ -278,7 +278,7 @@ | |||
| <div class="ui black label">#{{.Index}}</div> | |||
| <a class="title has-emoji" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title}}</a> | |||
| <div class="ui transparent label right floated"> | |||
| {{if $.CanCreateIssueDependencies}} | |||
| {{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}} | |||
| <a class="delete-dependency-button" onclick="deleteDependencyModal({{.ID}}, 'blocking');" | |||
| data-tooltip="{{$.i18n.Tr "repo.issues.dependency.remove_info"}}" data-inverted=""> | |||
| <i class="delete icon text red"></i> | |||
| @@ -304,7 +304,7 @@ | |||
| <div class="ui black label">#{{.Index}}</div> | |||
| <a class="title has-emoji" href="{{$.RepoLink}}/issues/{{.Index}}">{{.Title}}</a> | |||
| <div class="ui transparent label right floated"> | |||
| {{if $.CanCreateIssueDependencies}} | |||
| {{if and $.CanCreateIssueDependencies (not $.IsArchived)}} | |||
| <a class="delete-dependency-button" onclick="deleteDependencyModal({{.ID}}, 'blockedBy');" | |||
| data-tooltip="{{$.i18n.Tr "repo.issues.dependency.remove_info"}}" data-inverted=""> | |||
| <i class="delete icon text red"></i> | |||
| @@ -316,7 +316,7 @@ | |||
| </div> | |||
| {{end}} | |||
| {{if .CanCreateIssueDependencies}} | |||
| {{if and .CanCreateIssueDependencies (not .Repository.IsArchived)}} | |||
| <div> | |||
| <form method="POST" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/dependency/add" id="addDependencyForm"> | |||
| {{$.CsrfTokenHtml}} | |||
| @@ -337,7 +337,7 @@ | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{if .CanCreateIssueDependencies}} | |||
| {{if and .CanCreateIssueDependencies (not .Repository.IsArchived)}} | |||
| <input type="hidden" id="repolink" value="{{$.RepoRelPath}}"> | |||
| <!-- I know, there is probably a better way to do this --> | |||
| <input type="hidden" id="issueIndex" value="{{.Issue.Index}}"/> | |||
| @@ -6,7 +6,7 @@ | |||
| <input value="{{.Issue.Title}}"> | |||
| </div> | |||
| </h1> | |||
| {{if or .IsIssueWriter .IsIssuePoster}} | |||
| {{if and (or .IsIssueWriter .IsIssuePoster) (not .Repository.IsArchived)}} | |||
| <div class="four wide column"> | |||
| <div class="edit-zone text right"> | |||
| <div id="edit-title" class="ui basic green not-in-edit button">{{.i18n.Tr "repo.issues.edit"}}</div> | |||
| @@ -4,74 +4,80 @@ | |||
| {{template "repo/settings/navbar" .}} | |||
| <div class="ui container"> | |||
| {{template "base/alert" .}} | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.default_branch"}} | |||
| </h4> | |||
| <div class="ui attached segment"> | |||
| <p> | |||
| {{.i18n.Tr "repo.settings.default_branch_desc"}} | |||
| </p> | |||
| <form class="ui form" action="{{.Link}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <input type="hidden" name="action" value="default_branch"> | |||
| {{if not .Repository.IsEmpty}} | |||
| <div class="required inline field"> | |||
| <div class="ui dropdown selection" tabindex="0"> | |||
| <select name="branch"> | |||
| <option value="{{.Repository.DefaultBranch}}">{{.Repository.DefaultBranch}}</option> | |||
| {{range .Branches}} | |||
| <option value="{{.}}">{{.}}</option> | |||
| {{end}} | |||
| </select><i class="dropdown icon"></i> | |||
| <div class="default text">{{.Repository.DefaultBranch}}</div> | |||
| <div class="menu transition hidden" tabindex="-1" style="display: block !important;"> | |||
| {{range .Branches}} | |||
| <div class="item" data-value="{{.}}">{{.}}</div> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <button class="ui green button">{{$.i18n.Tr "repo.settings.update_settings"}}</button> | |||
| </div> | |||
| {{end}} | |||
| </form> | |||
| </div> | |||
| {{if .Repository.IsArchived}} | |||
| <div class="ui warning message"> | |||
| {{.i18n.Tr "repo.settings.archive.branchsettings_unavailable"}} | |||
| </div> | |||
| {{else}} | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.default_branch"}} | |||
| </h4> | |||
| <div class="ui attached segment"> | |||
| <p> | |||
| {{.i18n.Tr "repo.settings.default_branch_desc"}} | |||
| </p> | |||
| <form class="ui form" action="{{.Link}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <input type="hidden" name="action" value="default_branch"> | |||
| {{if not .Repository.IsEmpty}} | |||
| <div class="required inline field"> | |||
| <div class="ui dropdown selection" tabindex="0"> | |||
| <select name="branch"> | |||
| <option value="{{.Repository.DefaultBranch}}">{{.Repository.DefaultBranch}}</option> | |||
| {{range .Branches}} | |||
| <option value="{{.}}">{{.}}</option> | |||
| {{end}} | |||
| </select><i class="dropdown icon"></i> | |||
| <div class="default text">{{.Repository.DefaultBranch}}</div> | |||
| <div class="menu transition hidden" tabindex="-1" style="display: block !important;"> | |||
| {{range .Branches}} | |||
| <div class="item" data-value="{{.}}">{{.}}</div> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <button class="ui green button">{{$.i18n.Tr "repo.settings.update_settings"}}</button> | |||
| </div> | |||
| {{end}} | |||
| </form> | |||
| </div> | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.settings.protected_branch"}} | |||
| </h4> | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.settings.protected_branch"}} | |||
| </h4> | |||
| <div class="ui attached table segment"> | |||
| <div class="ui grid padded"> | |||
| <div class="eight wide column"> | |||
| <div class="ui fluid dropdown selection" tabindex="0"> | |||
| <i class="dropdown icon"></i> | |||
| <div class="default text">{{.i18n.Tr "repo.settings.choose_branch"}}</div> | |||
| <div class="menu transition hidden" tabindex="-1" style="display: block !important;"> | |||
| {{range .LeftBranches}} | |||
| <a class="item" href="{{$.Repository.Link}}/settings/branches/{{. | EscapePound}}">{{.}}</a> | |||
| {{end}} | |||
| <div class="ui attached table segment"> | |||
| <div class="ui grid padded"> | |||
| <div class="eight wide column"> | |||
| <div class="ui fluid dropdown selection" tabindex="0"> | |||
| <i class="dropdown icon"></i> | |||
| <div class="default text">{{.i18n.Tr "repo.settings.choose_branch"}}</div> | |||
| <div class="menu transition hidden" tabindex="-1" style="display: block !important;"> | |||
| {{range .LeftBranches}} | |||
| <a class="item" href="{{$.Repository.Link}}/settings/branches/{{. | EscapePound}}">{{.}}</a> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <div class="ui grid padded"> | |||
| <div class="sixteen wide column"> | |||
| <table class="ui single line table padded"> | |||
| <tbody> | |||
| {{range .ProtectedBranches}} | |||
| <tr> | |||
| <td><div class="ui basic label blue">{{.BranchName}}</div></td> | |||
| <td class="right aligned"><a class="rm ui button" href="{{$.Repository.Link}}/settings/branches/{{.BranchName | EscapePound}}">{{$.i18n.Tr "repo.settings.edit_protected_branch"}}</a></td> | |||
| </tr> | |||
| {{else}} | |||
| <tr class="center aligned"><td>{{.i18n.Tr "repo.settings.no_protected_branch"}}</td></tr> | |||
| {{end}} | |||
| </tbody> | |||
| </table> | |||
| <div class="ui grid padded"> | |||
| <div class="sixteen wide column"> | |||
| <table class="ui single line table padded"> | |||
| <tbody> | |||
| {{range .ProtectedBranches}} | |||
| <tr> | |||
| <td><div class="ui basic label blue">{{.BranchName}}</div></td> | |||
| <td class="right aligned"><a class="rm ui button" href="{{$.Repository.Link}}/settings/branches/{{.BranchName | EscapePound}}">{{$.i18n.Tr "repo.settings.edit_protected_branch"}}</a></td> | |||
| </tr> | |||
| {{else}} | |||
| <tr class="center aligned"><td>{{.i18n.Tr "repo.settings.no_protected_branch"}}</td></tr> | |||
| {{end}} | |||
| </tbody> | |||
| </table> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| {{template "base/footer" .}} | |||
| @@ -325,6 +325,31 @@ | |||
| <p>{{.i18n.Tr "repo.settings.delete_desc"}}</p> | |||
| </div> | |||
| </div> | |||
| {{if not .Repository.IsMirror}} | |||
| <div class="ui divider"></div> | |||
| <div class="item"> | |||
| <div class="ui right"> | |||
| <button class="ui basic red show-modal button" data-modal="#archive-repo-modal"> | |||
| {{if .Repository.IsArchived}} | |||
| {{.i18n.Tr "repo.settings.unarchive.button"}} | |||
| {{else}} | |||
| {{.i18n.Tr "repo.settings.archive.button"}} | |||
| {{end}} | |||
| </button> | |||
| </div> | |||
| <div> | |||
| {{if .Repository.IsArchived}} | |||
| <h5>{{.i18n.Tr "repo.settings.unarchive.header"}}</h5> | |||
| <p>{{.i18n.Tr "repo.settings.unarchive.text"}}</p> | |||
| {{else}} | |||
| <h5>{{.i18n.Tr "repo.settings.archive.header"}}</h5> | |||
| <p>{{.i18n.Tr "repo.settings.archive.text"}}</p> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| @@ -464,6 +489,36 @@ | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| {{if not .Repository.IsMirror}} | |||
| <div class="ui basic modal" id="archive-repo-modal"> | |||
| <div class="ui icon header"> | |||
| {{if .Repository.IsArchived}} | |||
| {{.i18n.Tr "repo.settings.unarchive.header"}} | |||
| {{else}} | |||
| {{.i18n.Tr "repo.settings.archive.header"}} | |||
| {{end}} | |||
| </div> | |||
| <div class="content center"> | |||
| <p> | |||
| {{if .Repository.IsArchived}} | |||
| {{.i18n.Tr "repo.settings.unarchive.text"}} | |||
| {{else}} | |||
| {{.i18n.Tr "repo.settings.archive.text"}} | |||
| {{end}} | |||
| </p> | |||
| </div> | |||
| <form action="{{.Link}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <input type="hidden" name="action" value="{{if .Repository.IsArchived}}unarchive{{else}}archive{{end}}"> | |||
| <input type="hidden" name="repo_id" value="{{.Repository.ID}}"> | |||
| <div class="center actions"> | |||
| <div class="ui basic cancel inverted button">{{.i18n.Tr "settings.cancel"}}</div> | |||
| <button class="ui basic inverted yellow button">{{.i18n.Tr "modal.yes"}}</button> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| {{end}} | |||
| {{end}} | |||
| {{template "base/footer" .}} | |||
| @@ -85,6 +85,7 @@ | |||
| <a :href="suburl + '/' + repo.full_name"> | |||
| <i :class="repoClass(repo)"></i> | |||
| <strong class="text truncate item-name">${repo.full_name}</strong> | |||
| <i v-if="repo.archived" class="archive icon archived-icon"></i> | |||
| <span class="ui right text light grey"> | |||
| ${repo.stars_count} <i class="octicon octicon-star rear"></i> | |||
| </span> | |||