mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-25 08:59:31 -05:00
Wiki: UI for page new
This commit is contained in:
parent
2f28a0310b
commit
2b10fdc4dc
20 changed files with 307 additions and 49 deletions
20
cmd/web.go
20
cmd/web.go
|
@ -470,7 +470,7 @@ func runWeb(ctx *cli.Context) {
|
|||
}, func(ctx *middleware.Context) {
|
||||
ctx.Data["PageIsSettings"] = true
|
||||
})
|
||||
}, reqSignIn, middleware.RepoAssignment(true), reqRepoAdmin, middleware.RepoRef())
|
||||
}, reqSignIn, middleware.RepoAssignment(), reqRepoAdmin, middleware.RepoRef())
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Get("/action/:action", repo.Action)
|
||||
|
@ -516,7 +516,7 @@ func runWeb(ctx *cli.Context) {
|
|||
|
||||
m.Combo("/compare/*").Get(repo.CompareAndPullRequest).
|
||||
Post(bindIgnErr(auth.CreateIssueForm{}), repo.CompareAndPullRequestPost)
|
||||
}, reqSignIn, middleware.RepoAssignment(true))
|
||||
}, reqSignIn, middleware.RepoAssignment())
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Group("", func() {
|
||||
|
@ -530,7 +530,17 @@ func runWeb(ctx *cli.Context) {
|
|||
})
|
||||
m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue)
|
||||
|
||||
m.Get("/branches", repo.Branches)
|
||||
// m.Get("/branches", repo.Branches)
|
||||
|
||||
m.Group("/wiki", func() {
|
||||
m.Get("/?:page", repo.Wiki)
|
||||
|
||||
m.Group("", func() {
|
||||
m.Get("/_new", repo.NewWiki)
|
||||
m.Get("/:page/_edit", repo.EditWiki)
|
||||
}, reqSignIn)
|
||||
}, middleware.RepoRef())
|
||||
|
||||
m.Get("/archive/*", repo.Download)
|
||||
|
||||
m.Group("/pulls/:index", func() {
|
||||
|
@ -550,13 +560,13 @@ func runWeb(ctx *cli.Context) {
|
|||
}, middleware.RepoRef())
|
||||
|
||||
m.Get("/compare/:before([a-z0-9]{40})...:after([a-z0-9]{40})", repo.CompareDiff)
|
||||
}, ignSignIn, middleware.RepoAssignment(true))
|
||||
}, ignSignIn, middleware.RepoAssignment())
|
||||
|
||||
m.Group("/:username", func() {
|
||||
m.Group("/:reponame", func() {
|
||||
m.Get("", repo.Home)
|
||||
m.Get("\\.git$", repo.Home)
|
||||
}, ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef())
|
||||
}, ignSignIn, middleware.RepoAssignment(true), middleware.RepoRef())
|
||||
|
||||
m.Group("/:reponame", func() {
|
||||
m.Any("/*", ignSignInAndCsrf, repo.HTTP)
|
||||
|
|
|
@ -535,6 +535,14 @@ milestones.deletion = Milestone Deletion
|
|||
milestones.deletion_desc = Delete this milestone will remove its information in all related issues. Do you want to continue?
|
||||
milestones.deletion_success = Milestone has been deleted successfully!
|
||||
|
||||
wiki = Wiki
|
||||
wiki.welcome = Welcome to Wiki!
|
||||
wiki.welcome_desc = Wiki is the place where you would like to document your project together and make it better.
|
||||
wiki.create_first_page = Create the first page
|
||||
wiki.new_page = Create New Page
|
||||
wiki.default_commit_message = Write a note about this update (optional).
|
||||
wiki.save_page = Save Page
|
||||
|
||||
settings = Settings
|
||||
settings.options = Options
|
||||
settings.collaboration = Collaboration
|
||||
|
|
|
@ -264,6 +264,14 @@ func (repo *Repository) RepoPath() (string, error) {
|
|||
return repo.repoPath(x)
|
||||
}
|
||||
|
||||
func (repo *Repository) WikiPath() (string, error) {
|
||||
if err := repo.GetOwner(); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return WikiPath(repo.Owner.Name, repo.Name), nil
|
||||
}
|
||||
|
||||
func (repo *Repository) RepoLink() (string, error) {
|
||||
if err := repo.GetOwner(); err != nil {
|
||||
return "", err
|
||||
|
@ -877,6 +885,11 @@ func RepoPath(userName, repoName string) string {
|
|||
return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".git")
|
||||
}
|
||||
|
||||
// WikiPath returns wiki data path by given user and repository name.
|
||||
func WikiPath(userName, repoName string) string {
|
||||
return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".wiki.git")
|
||||
}
|
||||
|
||||
// TransferOwnership transfers all corresponding setting from old user to new one.
|
||||
func TransferOwnership(u *User, newOwnerName string, repo *Repository) error {
|
||||
newOwner, err := GetUserByName(newOwnerName)
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -223,7 +223,7 @@ func RetrieveBaseRepo(ctx *Context, repo *models.Repository) {
|
|||
}
|
||||
}
|
||||
|
||||
func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
|
||||
func RepoAssignment(args ...bool) macaron.Handler {
|
||||
return func(ctx *Context) {
|
||||
var (
|
||||
displayBare bool // To display bare page if it is a bare repo.
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
"files": {
|
||||
"\/css\/dropzone-4.2.0.css": {
|
||||
"fileType": 16,
|
||||
"ignore": 0,
|
||||
"ignoreWasSetByUser": 0,
|
||||
"ignore": 1,
|
||||
"ignoreWasSetByUser": 1,
|
||||
"inputAbbreviatedPath": "\/css\/dropzone-4.2.0.css",
|
||||
"outputAbbreviatedPath": "No Output Path",
|
||||
"outputPathIsOutsideProject": 0,
|
||||
|
@ -92,6 +92,15 @@
|
|||
"outputPathIsOutsideProject": 0,
|
||||
"outputPathIsSetByUser": 0
|
||||
},
|
||||
"\/css\/simplemde-1.8.1.min.css": {
|
||||
"fileType": 16,
|
||||
"ignore": 1,
|
||||
"ignoreWasSetByUser": 1,
|
||||
"inputAbbreviatedPath": "\/css\/simplemde-1.8.1.min.css",
|
||||
"outputAbbreviatedPath": "No Output Path",
|
||||
"outputPathIsOutsideProject": 0,
|
||||
"outputPathIsSetByUser": 0
|
||||
},
|
||||
"\/css\/themes\/default\/assets\/images\/flags.png": {
|
||||
"fileType": 32768,
|
||||
"ignore": 0,
|
||||
|
|
|
@ -1758,6 +1758,11 @@ footer .container .links > *:first-child {
|
|||
line-height: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.repository .navbar .ui.label {
|
||||
margin-top: -2px;
|
||||
margin-left: 7px;
|
||||
padding: 3px 5px;
|
||||
}
|
||||
.repository .owner.dropdown {
|
||||
min-width: 40% !important;
|
||||
}
|
||||
|
@ -2513,6 +2518,19 @@ footer .container .links > *:first-child {
|
|||
.repository.forks .list .item .link {
|
||||
padding-top: 5px;
|
||||
}
|
||||
.repository.wiki.start .ui.segment {
|
||||
padding-top: 70px;
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
.repository.wiki.start .ui.segment .mega-octicon {
|
||||
font-size: 48px;
|
||||
}
|
||||
.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment {
|
||||
background: inherit;
|
||||
}
|
||||
.repository.wiki.new .editor-preview {
|
||||
background-color: white;
|
||||
}
|
||||
.repository.settings.collaboration .collaborator.list {
|
||||
padding: 0;
|
||||
}
|
||||
|
|
7
public/css/simplemde-1.8.1.min.css
vendored
Executable file
7
public/css/simplemde-1.8.1.min.css
vendored
Executable file
File diff suppressed because one or more lines are too long
|
@ -445,6 +445,53 @@ function initRepository() {
|
|||
}
|
||||
}
|
||||
|
||||
function initWiki() {
|
||||
if ($('.repository.wiki').length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ($('.repository.wiki.new').length > 0) {
|
||||
var $edit_area = $('#edit-area');
|
||||
var simplemde = new SimpleMDE({
|
||||
autoDownloadFontAwesome: false,
|
||||
element: $edit_area[0],
|
||||
previewRender: function (plainText, preview) { // Async method
|
||||
setTimeout(function () {
|
||||
if ($('.editor-preview-active').length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.post($edit_area.data('url'), {
|
||||
"_csrf": csrf,
|
||||
"mode": "gfm",
|
||||
"context": $edit_area.data('context'),
|
||||
"text": plainText
|
||||
},
|
||||
function (data) {
|
||||
preview.innerHTML = '<div class="markdown">' + data + '</div>';
|
||||
emojify.run($('.editor-preview')[0]);
|
||||
}
|
||||
);
|
||||
}, 0);
|
||||
|
||||
return "Loading...";
|
||||
},
|
||||
renderingConfig: {
|
||||
singleLineBreaks: false
|
||||
},
|
||||
spellChecker: false,
|
||||
tabSize: 4,
|
||||
toolbar: ["bold", "italic", "strikethrough", "|",
|
||||
"heading", "heading-1", "heading-2", "heading-3", "|",
|
||||
"code", "quote", "|",
|
||||
"unordered-list", "ordered-list", "|",
|
||||
"link", "image", "horizontal-rule", "|",
|
||||
"preview", "fullscreen"]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function initOrganization() {
|
||||
if ($('.organization').length == 0) {
|
||||
return;
|
||||
|
@ -835,6 +882,7 @@ $(document).ready(function () {
|
|||
initCommentForm();
|
||||
initInstall();
|
||||
initRepository();
|
||||
initWiki();
|
||||
initOrganization();
|
||||
initUser();
|
||||
initWebhook();
|
||||
|
|
14
public/js/libs/simplemde-1.8.1.min.js
vendored
Executable file
14
public/js/libs/simplemde-1.8.1.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
|
@ -32,6 +32,14 @@
|
|||
}
|
||||
}
|
||||
|
||||
.navbar {
|
||||
.ui.label {
|
||||
margin-top: -2px;
|
||||
margin-left: 7px;
|
||||
padding: 3px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.owner.dropdown {
|
||||
min-width: 40% !important;
|
||||
}
|
||||
|
@ -939,6 +947,31 @@
|
|||
}
|
||||
}
|
||||
|
||||
&.wiki {
|
||||
&.start {
|
||||
.ui.segment {
|
||||
padding-top: 70px;
|
||||
padding-bottom: 100px;
|
||||
|
||||
.mega-octicon {
|
||||
font-size: 48px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.new {
|
||||
.CodeMirror {
|
||||
.CodeMirror-code .cm-comment {
|
||||
background: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.editor-preview {
|
||||
background-color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.settings {
|
||||
&.collaboration {
|
||||
.collaborator.list {
|
||||
|
|
|
@ -5,12 +5,9 @@
|
|||
package v1
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/gogits/gogs/modules/auth/apiv1"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/middleware"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
// Render an arbitrary Markdown document.
|
||||
|
@ -27,8 +24,7 @@ func Markdown(ctx *middleware.Context, form apiv1.MarkdownForm) {
|
|||
|
||||
switch form.Mode {
|
||||
case "gfm":
|
||||
ctx.Write(base.RenderMarkdown([]byte(form.Text),
|
||||
setting.AppUrl+strings.TrimPrefix(form.Context, "/")))
|
||||
ctx.Write(base.RenderMarkdown([]byte(form.Text), form.Context))
|
||||
default:
|
||||
ctx.Write(base.RenderRawMarkdown([]byte(form.Text), ""))
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ const (
|
|||
|
||||
func Home(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = ctx.Repo.Repository.Name
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
ctx.Data["RequireHighlightJS"] = true
|
||||
|
||||
branchName := ctx.Repo.BranchName
|
||||
|
@ -52,8 +53,6 @@ func Home(ctx *middleware.Context) {
|
|||
treeLink += "/" + treename
|
||||
}
|
||||
|
||||
ctx.Data["IsRepoToolbarSource"] = true
|
||||
|
||||
isViewBranch := ctx.Repo.IsBranch
|
||||
ctx.Data["IsViewBranch"] = isViewBranch
|
||||
|
||||
|
|
49
routers/repo/wiki.go
Normal file
49
routers/repo/wiki.go
Normal file
|
@ -0,0 +1,49 @@
|
|||
// Copyright 2015 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package repo
|
||||
|
||||
import (
|
||||
"github.com/Unknwon/com"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/middleware"
|
||||
)
|
||||
|
||||
const (
|
||||
WIKI_START base.TplName = "repo/wiki/start"
|
||||
WIKI_VIEW base.TplName = "repo/wiki/view"
|
||||
WIKI_NEW base.TplName = "repo/wiki/new"
|
||||
)
|
||||
|
||||
func Wiki(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("repo.wiki")
|
||||
ctx.Data["PageIsWiki"] = true
|
||||
|
||||
wikiPath := models.WikiPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
|
||||
if !com.IsDir(wikiPath) {
|
||||
ctx.HTML(200, WIKI_START)
|
||||
return
|
||||
}
|
||||
|
||||
ctx.HTML(200, WIKI_VIEW)
|
||||
}
|
||||
|
||||
func NewWiki(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("repo.wiki.new_page")
|
||||
ctx.Data["PageIsWiki"] = true
|
||||
ctx.Data["RequireSimpleMDE"] = true
|
||||
|
||||
wikiPath := models.WikiPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
|
||||
if !com.IsDir(wikiPath) {
|
||||
ctx.Data["title"] = "Home"
|
||||
}
|
||||
|
||||
ctx.HTML(200, WIKI_NEW)
|
||||
}
|
||||
|
||||
func EditWiki(ctx *middleware.Context) {
|
||||
ctx.PlainText(200, []byte(ctx.Params(":page")))
|
||||
}
|
|
@ -19,6 +19,11 @@
|
|||
<script src="{{AppSubUrl}}/js/jquery-1.11.3.min.js"></script>
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/font-awesome-4.4.0.min.css">
|
||||
|
||||
{{if .RequireSimpleMDE}}
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/simplemde-1.8.1.min.css">
|
||||
<script src="{{AppSubUrl}}/js/libs/simplemde-1.8.1.min.js"></script>
|
||||
{{end}}
|
||||
|
||||
<!-- Stylesheet -->
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/semantic-2.1.6.min.css">
|
||||
<link rel="stylesheet" href="{{AppSubUrl}}/css/gogs.css?v={{MD5 AppVer}}">
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<div class="field">
|
||||
<div class="ui top attached tabular menu" data-write="write" data-preview="preview">
|
||||
<a class="active item" data-tab="write">{{.i18n.Tr "repo.release.write"}}</a>
|
||||
<a class="item" data-tab="preview" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.release.preview"}}</a>
|
||||
<a class="item" data-tab="preview" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.release.preview"}}</a>
|
||||
</div>
|
||||
<div class="ui bottom attached active tab segment" data-tab="write">
|
||||
<textarea id="content" name="content" tabindex="4"></textarea>
|
||||
|
|
|
@ -1,16 +1,22 @@
|
|||
{{if not .IsBareRepo}}
|
||||
<div class="ui {{if .IsRepositoryAdmin}}five{{else}}four{{end}} item menu">
|
||||
<div class="ui secondary pointing menu navbar">
|
||||
<a class="{{if .PageIsViewCode}}active{{end}} item" href="{{.RepoLink}}">
|
||||
<i class="icon octicon octicon-code"></i> {{.i18n.Tr "repo.code"}}
|
||||
</a>
|
||||
<a class="{{if .PageIsIssueList}}active{{end}} item" href="{{.RepoLink}}/issues">
|
||||
<i class="icon octicon octicon-issue-opened"></i> {{.i18n.Tr "repo.issues"}} <span class="ui blue label">{{.Repository.NumOpenIssues}}</span>
|
||||
<i class="icon octicon octicon-issue-opened"></i> {{.i18n.Tr "repo.issues"}} <span class="ui blue small label">{{.Repository.NumOpenIssues}}</span>
|
||||
</a>
|
||||
<a class="{{if .PageIsPullList}}active{{end}} item" href="{{.RepoLink}}/pulls">
|
||||
<i class="icon octicon octicon-git-pull-request"></i> {{.i18n.Tr "repo.pulls"}} <span class="ui blue label">{{.Repository.NumOpenPulls}}</span>
|
||||
<i class="icon octicon octicon-git-pull-request"></i> {{.i18n.Tr "repo.pulls"}} <span class="ui blue small label">{{.Repository.NumOpenPulls}}</span>
|
||||
</a>
|
||||
<a class="{{if .PageIsCommits}}active{{end}} item" href="{{.RepoLink}}/commits/{{EscapePound .BranchName}}">
|
||||
<i class="icon octicon octicon-history"></i> {{.i18n.Tr "repo.commits"}} <span class="ui blue label">{{.CommitsCount}}</span>
|
||||
<i class="icon octicon octicon-history"></i> {{.i18n.Tr "repo.commits"}} <span class="ui blue small label">{{.CommitsCount}}</span>
|
||||
</a>
|
||||
<a class="{{if .PageIsReleaseList}}active{{end}} item" href="{{.RepoLink}}/releases">
|
||||
<i class="icon octicon octicon-tag"></i> {{.i18n.Tr "repo.releases"}} <span class="ui blue label">{{.Repository.NumTags}}</span>
|
||||
<i class="icon octicon octicon-tag"></i> {{.i18n.Tr "repo.releases"}} <span class="ui blue small label">{{.Repository.NumTags}}</span>
|
||||
</a>
|
||||
<a class="{{if .PageIsWiki}}active{{end}} item" href="{{.RepoLink}}/wiki">
|
||||
<i class="icon octicon octicon-book"></i> {{.i18n.Tr "repo.wiki"}}
|
||||
</a>
|
||||
{{if .IsRepositoryAdmin}}
|
||||
<a class="{{if .PageIsSettings}}active{{end}} item" href="{{.RepoLink}}/settings">
|
||||
|
|
27
templates/repo/wiki/new.tmpl
Normal file
27
templates/repo/wiki/new.tmpl
Normal file
|
@ -0,0 +1,27 @@
|
|||
{{template "base/head" .}}
|
||||
<div class="repository wiki new">
|
||||
{{template "repo/header" .}}
|
||||
<div class="ui container">
|
||||
{{template "repo/sidebar" .}}
|
||||
<div class="ui header">
|
||||
{{.i18n.Tr "repo.wiki.new_page"}}
|
||||
</div>
|
||||
<form class="ui form" action="{{.Link}}" method="post">
|
||||
<div class="field">
|
||||
<input name="title" value="{{.title}}" autofocus>
|
||||
</div>
|
||||
<div class="field">
|
||||
<textarea id="edit-area" name="content" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.wiki.welcome"}}</textarea>
|
||||
</div>
|
||||
<div class="field">
|
||||
<input name="message" placeholder="{{.i18n.Tr "repo.wiki.default_commit_message"}}">
|
||||
</div>
|
||||
<div class="text right">
|
||||
<button class="ui green button">
|
||||
{{.i18n.Tr "repo.wiki.save_page"}}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
16
templates/repo/wiki/start.tmpl
Normal file
16
templates/repo/wiki/start.tmpl
Normal file
|
@ -0,0 +1,16 @@
|
|||
{{template "base/head" .}}
|
||||
<div class="repository wiki start">
|
||||
{{template "repo/header" .}}
|
||||
<div class="ui container">
|
||||
{{template "repo/sidebar" .}}
|
||||
<div class="ui center segment">
|
||||
<span class="mega-octicon octicon-book"></span>
|
||||
<h2>{{.i18n.Tr "repo.wiki.welcome"}}</h2>
|
||||
<p>{{.i18n.Tr "repo.wiki.welcome_desc"}}</p>
|
||||
{{if .IsSigned}}
|
||||
<a class="ui green button" href="{{.RepoLink}}/wiki/_new">{{.i18n.Tr "repo.wiki.create_first_page"}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
0
templates/repo/wiki/view.tmpl
Normal file
0
templates/repo/wiki/view.tmpl
Normal file
Loading…
Reference in a new issue