mirror of
https://github.com/yanislav-igonin/micrach
synced 2024-12-22 14:22:33 +03:00
Feature - Components refactor (#10)
* feat: header component * feat: captcha component * feat: rename all html files * feat: update github link * feat: all templates in subfolders * feat: separate thread card * feat: separate pagination * feat: update pagination * feat: separate post * lint
This commit is contained in:
parent
21c82b47e9
commit
fbe39f45a3
@ -15,7 +15,7 @@ func GetCaptcha(c *gin.Context) {
|
|||||||
err := captcha.WriteImage(&content, ID, captcha.StdWidth, captcha.StdHeight)
|
err := captcha.WriteImage(&content, ID, captcha.StdWidth, captcha.StdHeight)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("error:", err)
|
log.Println("error:", err)
|
||||||
c.HTML(http.StatusInternalServerError, "500.html", nil)
|
c.HTML(http.StatusInternalServerError, "pages/500.html", nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,9 +54,11 @@ func GetThreads(c *gin.Context) {
|
|||||||
|
|
||||||
captchaID := captcha.New()
|
captchaID := captcha.New()
|
||||||
htmlData := Repositories.GetThreadsHtmlData{
|
htmlData := Repositories.GetThreadsHtmlData{
|
||||||
Threads: threads,
|
Threads: threads,
|
||||||
PagesCount: pagesCount,
|
Pagination: Repositories.HtmlPaginationData{
|
||||||
Page: page,
|
PagesCount: pagesCount,
|
||||||
|
Page: page,
|
||||||
|
},
|
||||||
FormData: Repositories.HtmlFormData{
|
FormData: Repositories.HtmlFormData{
|
||||||
CaptchaID: captchaID,
|
CaptchaID: captchaID,
|
||||||
IsCaptchaActive: Config.App.IsCaptchaActive,
|
IsCaptchaActive: Config.App.IsCaptchaActive,
|
||||||
|
2
main.go
2
main.go
@ -60,7 +60,7 @@ func main() {
|
|||||||
return Items
|
return Items
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
router.LoadHTMLGlob("templates/*.html")
|
router.LoadHTMLGlob("templates/**/*")
|
||||||
router.ForwardedByClientIP = true
|
router.ForwardedByClientIP = true
|
||||||
if Config.App.IsRateLimiterEnabled {
|
if Config.App.IsRateLimiterEnabled {
|
||||||
router.Use(middleware)
|
router.Use(middleware)
|
||||||
|
@ -19,6 +19,13 @@ type Post struct {
|
|||||||
UpdatedAt time.Time `json:"-"`
|
UpdatedAt time.Time `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Post) getThreadID() int {
|
||||||
|
if p.IsParent {
|
||||||
|
return p.ID
|
||||||
|
}
|
||||||
|
return p.ParentID
|
||||||
|
}
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
ID int `json:"-"`
|
ID int `json:"-"`
|
||||||
PostID int `json:"-"`
|
PostID int `json:"-"`
|
||||||
@ -39,6 +46,12 @@ type HtmlFormData struct {
|
|||||||
IsCaptchaActive bool
|
IsCaptchaActive bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// index.html
|
||||||
|
type HtmlPaginationData struct {
|
||||||
|
PagesCount int
|
||||||
|
Page int
|
||||||
|
}
|
||||||
|
|
||||||
// thread.html
|
// thread.html
|
||||||
type GetThreadHtmlData struct {
|
type GetThreadHtmlData struct {
|
||||||
Thread []Post
|
Thread []Post
|
||||||
@ -48,8 +61,7 @@ type GetThreadHtmlData struct {
|
|||||||
// index.html
|
// index.html
|
||||||
type GetThreadsHtmlData struct {
|
type GetThreadsHtmlData struct {
|
||||||
Threads []Post `json:"threads"`
|
Threads []Post `json:"threads"`
|
||||||
PagesCount int `json:"pagesCount"`
|
Pagination HtmlPaginationData
|
||||||
Page int `json:"page"`
|
|
||||||
FormData HtmlFormData
|
FormData HtmlFormData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
templates/components/captcha.html
Normal file
7
templates/components/captcha.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{{ define "captcha" }}
|
||||||
|
<div class="captcha-container text-center">
|
||||||
|
<img src="/captcha/{{ . }}" alt="Captcha">
|
||||||
|
</div>
|
||||||
|
<input class="form-control" type="hidden" name="captchaId" value="{{ . }}">
|
||||||
|
<input class="form-control" id="postCaptcha" type="tel" pattern="\d+" placeholder="Captcha" name="captcha">
|
||||||
|
{{ end }}
|
9
templates/components/footer.html
Normal file
9
templates/components/footer.html
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{{ define "footer" }}
|
||||||
|
<footer class="py-4">
|
||||||
|
<div class="container text-center">
|
||||||
|
<a href="https://github.com/yanislav-igonin/micrach" target="blank">
|
||||||
|
<img src="/static/images/github-icon.png" alt="GitHub icon">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
{{ end }}
|
17
templates/components/header.html
Normal file
17
templates/components/header.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{{ define "header" }}
|
||||||
|
|
||||||
|
{{ if . }}
|
||||||
|
<a href="/" class="thread-title-link">
|
||||||
|
<h1 class="display-1 text-center thread-title">
|
||||||
|
{{ if ne . "" }}
|
||||||
|
{{ . }}
|
||||||
|
{{ else }}
|
||||||
|
Welcome to Micrach
|
||||||
|
{{ end }}
|
||||||
|
</h1>
|
||||||
|
</a>
|
||||||
|
{{ else }}
|
||||||
|
<h1 class="display-1 text-center">Welcome to Micrach</h1>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
12
templates/components/pagiantion.html
Normal file
12
templates/components/pagiantion.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{{ define "pagiantion" }}
|
||||||
|
<nav aria-label="Page navigation">
|
||||||
|
<ul id="pagesList" class="pagination justify-content-center">
|
||||||
|
{{ $ActivePage := .Page }}
|
||||||
|
{{ range $i := Iterate .PagesCount }}
|
||||||
|
<li class="page-item {{ if (eq $i $ActivePage) }} active {{ end }}">
|
||||||
|
<a class="page-link" href="/?page={{ $i }}">{{ $i }}</a>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{{ end }}
|
46
templates/components/post-form.html
Normal file
46
templates/components/post-form.html
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{{ define "post-form" }}
|
||||||
|
<div class="d-flex justify-content-center">
|
||||||
|
|
||||||
|
<div class="col col-lg-6 col-md-8">
|
||||||
|
{{ if eq .FirstPostID 0 }}
|
||||||
|
<form id="postForm" action="/" method="POST" enctype="multipart/form-data">
|
||||||
|
{{ else }}
|
||||||
|
<form id="postForm" action="/{{ .FirstPostID }}" method="POST" enctype="multipart/form-data">
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq .FirstPostID 0 }}
|
||||||
|
<input class="form-control" id="postTitle" placeholder="Title" name="title">
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<textarea class="form-control" id="postText" rows="5" placeholder="Text" name="text"></textarea>
|
||||||
|
<input class="form-control" type="file" id="postFiles" multiple name="files">
|
||||||
|
|
||||||
|
{{ if .IsCaptchaActive }}
|
||||||
|
{{ template "captcha" .CaptchaID }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
{{ if ne .FirstPostID 0 }}
|
||||||
|
<div class="col">
|
||||||
|
<input class="form-check-input" type="checkbox" value="on" id="postSage" name="sage">
|
||||||
|
<label class="form-check-label" for="postSage">
|
||||||
|
Sage
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="col text-end">
|
||||||
|
<button class="col btn btn-outline-primary" type="submit" >
|
||||||
|
{{ if ne .FirstPostID 0 }}
|
||||||
|
Send
|
||||||
|
{{ else }}
|
||||||
|
Create thread
|
||||||
|
{{ end }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
20
templates/components/post.html
Normal file
20
templates/components/post.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{{ define "post" }}
|
||||||
|
<div class="post-container mb-4">
|
||||||
|
{{ $filesLength := len .Files }}
|
||||||
|
{{ if gt $filesLength 0 }}
|
||||||
|
<div class="files-container">
|
||||||
|
{{ range $File := .Files }}
|
||||||
|
<div class="file-container">
|
||||||
|
<a href="/uploads/{{.getThreadID}}/o/{{$File.ID}}.{{$File.Ext}}" target="blank">
|
||||||
|
<img src="/uploads/{{.getThreadID}}/t/{{$File.ID}}.{{$File.Ext}}" class="file" alt="Uploaded picture">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="p-2">
|
||||||
|
<p class="card-text line-break text-break">{{.Text}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
26
templates/components/thread-card.html
Normal file
26
templates/components/thread-card.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{{ define "thread-card" }}
|
||||||
|
<div class="col col-sm-6 col-md-4 col-lg-3">
|
||||||
|
<div class="card">
|
||||||
|
{{ $length := len .Files }}
|
||||||
|
{{ if gt $length 0 }}
|
||||||
|
{{ $FirstFile := index .Files 0 }}
|
||||||
|
<img src="/uploads/{{.ID}}/t/{{$FirstFile.ID}}.{{$FirstFile.Ext}}" class="card-img-top" alt="Uploaded picture">
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
{{ if ne .Title "" }}
|
||||||
|
<h5 class="card-title">{{.Title}}</h5>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $textLength := len .Text }}
|
||||||
|
{{ if gt $textLength 300 }}
|
||||||
|
<p class="card-text line-break text-break">{{ slice .Text 0 300 }} ...</p>
|
||||||
|
{{ else }}
|
||||||
|
<p class="card-text line-break text-break">{{.Text}}</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<a href="/{{.ID}}" class="btn btn-outline-primary">Open</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
@ -1,9 +0,0 @@
|
|||||||
{{ define "footer" }}
|
|
||||||
<footer class="py-4">
|
|
||||||
<div class="container text-center">
|
|
||||||
<a href="https://github.com/yanislav-igonin/micrach-go" target="blank">
|
|
||||||
<img src="/static/images/github-icon.png" alt="GitHub icon">
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
{{ end }}
|
|
31
templates/head/meta-tags-dynamic.html
Normal file
31
templates/head/meta-tags-dynamic.html
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{{ define "meta-tags-dynamic" }}
|
||||||
|
|
||||||
|
{{ $SeoImageUrl := "" }}
|
||||||
|
{{ if .Files }}
|
||||||
|
{{ $FirstFile := index .Files 0 }}
|
||||||
|
{{ $SeoImageUrl = printf "https://micrach.igonin.dev/uploads/%d/t/%d.%s" .ID $FirstFile.ID $FirstFile.Ext }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $SeoImageUrl = "https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<title>{{ .Title }}</title>
|
||||||
|
<!-- Primary Meta Tags -->
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
<meta name="title" content="{{ .Title }}">
|
||||||
|
<meta name="description" content="{{ .Text }}">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
<!-- Open Graph / Facebook -->
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="https://micrach.igonin.dev/{{ .ID }}">
|
||||||
|
<meta property="og:title" content="{{ .Title }}">
|
||||||
|
<meta property="og:description" content="{{ .Text }}">
|
||||||
|
<meta property="og:image" content="{{ $SeoImageUrl }}">
|
||||||
|
|
||||||
|
<!-- Twitter -->
|
||||||
|
<meta property="twitter:card" content="{{ $SeoImageUrl }}">
|
||||||
|
<meta property="twitter:url" content="https://micrach.igonin.dev/{{ .ID }}">
|
||||||
|
<meta property="twitter:title" content="{{ .Title }}">
|
||||||
|
<meta property="twitter:description" content="{{ .Text }}">
|
||||||
|
<meta property="twitter:image" content="{{ $SeoImageUrl }}">
|
||||||
|
{{ end }}
|
22
templates/head/meta-tags-static.html
Normal file
22
templates/head/meta-tags-static.html
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{{ define "meta-tags-static" }}
|
||||||
|
<title>Micrach</title>
|
||||||
|
<!-- Primary Meta Tags -->
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
<meta name="title" content="Micrach">
|
||||||
|
<meta name="description" content="Single board imageboard.">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
<!-- Open Graph / Facebook -->
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="https://micrach.igonin.dev/">
|
||||||
|
<meta property="og:title" content="Micrach">
|
||||||
|
<meta property="og:description" content="Single board imageboard.">
|
||||||
|
<meta property="og:image" content="https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png">
|
||||||
|
|
||||||
|
<!-- Twitter -->
|
||||||
|
<meta property="twitter:card" content="https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png">
|
||||||
|
<meta property="twitter:url" content="https://micrach.igonin.dev/">
|
||||||
|
<meta property="twitter:title" content="Micrach">
|
||||||
|
<meta property="twitter:description" content="Single board imageboard.">
|
||||||
|
<meta property="twitter:image" content="https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png">
|
||||||
|
{{ end }}
|
16
templates/head/static.html
Normal file
16
templates/head/static.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{{ define "static" }}
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We"
|
||||||
|
crossorigin="anonymous"
|
||||||
|
>
|
||||||
|
<script
|
||||||
|
src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js"
|
||||||
|
integrity="sha384-U1DAWAznBHeqEIlVSCgzq+c9gqGAJn5c/t99JyeKa9xxaYpSvHU5awsuZVVFIhvj"
|
||||||
|
crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
<link rel="icon" href="/static/favicon.ico"/>
|
||||||
|
<link href="/static/styles/utils.css" rel="stylesheet">
|
||||||
|
<link href="/static/styles/post-form.css" rel="stylesheet">
|
||||||
|
{{ end }}
|
@ -1,64 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
{{ template "static" }}
|
|
||||||
<link href="/static/styles/index.css" rel="stylesheet">
|
|
||||||
{{ template "meta-tags-static" }}
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 class="display-1 text-center">Welcome to Micrach</h1>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
{{ template "post-form" .FormData }}
|
|
||||||
|
|
||||||
<div id="" class="row row-cols-auto gy-4 mb-4 justify-content-center">
|
|
||||||
{{ range $Post := .Threads }}
|
|
||||||
<div class="col col-sm-6 col-md-4 col-lg-3">
|
|
||||||
<div class="card">
|
|
||||||
|
|
||||||
{{ $length := len $Post.Files }}
|
|
||||||
{{ if gt $length 0 }}
|
|
||||||
{{ $FirstFile := index $Post.Files 0 }}
|
|
||||||
<img src="/uploads/{{$Post.ID}}/t/{{$FirstFile.ID}}.{{$FirstFile.Ext}}" class="card-img-top"
|
|
||||||
alt="Uploaded picture">
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="card-body">
|
|
||||||
{{ if ne $Post.Title "" }}
|
|
||||||
<h5 class="card-title">{{$Post.Title}}</h5>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
{{ $textLength := len $Post.Text }}
|
|
||||||
{{ if gt $textLength 300 }}
|
|
||||||
<p class="card-text line-break text-break">{{ slice $Post.Text 0 300 }} ...</p>
|
|
||||||
{{ else }}
|
|
||||||
<p class="card-text line-break text-break">{{$Post.Text}}</p>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<a href="/{{$Post.ID}}" class="btn btn-outline-primary">Open</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col col-12">
|
|
||||||
<nav aria-label="Page navigation">
|
|
||||||
<ul id="pagesList" class="pagination justify-content-center">
|
|
||||||
{{ $ActivePage := .Page }}
|
|
||||||
{{ range $i := Iterate .PagesCount }}
|
|
||||||
<li class="page-item {{ if (eq $i $ActivePage) }} active {{ end }}">
|
|
||||||
<a class="page-link" href="/?page={{ $i }}">{{ $i }}</a>
|
|
||||||
</li>
|
|
||||||
{{ end }}
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{ template "footer" }}
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
@ -1,31 +0,0 @@
|
|||||||
{{ define "meta-tags-dynamic" }}
|
|
||||||
|
|
||||||
{{ $SeoImageUrl := "" }}
|
|
||||||
{{ if .Files }}
|
|
||||||
{{ $FirstFile := index .Files 0 }}
|
|
||||||
{{ $SeoImageUrl = printf "https://micrach.igonin.dev/uploads/%d/t/%d.%s" .ID $FirstFile.ID $FirstFile.Ext }}
|
|
||||||
{{ else }}
|
|
||||||
{{ $SeoImageUrl = "https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png" }}
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<title>{{ .Title }}</title>
|
|
||||||
<!-- Primary Meta Tags -->
|
|
||||||
<meta charset="UTF-8"/>
|
|
||||||
<meta name="title" content="{{ .Title }}">
|
|
||||||
<meta name="description" content="{{ .Text }}">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
|
|
||||||
<!-- Open Graph / Facebook -->
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:url" content="https://micrach.igonin.dev/{{ .ID }}">
|
|
||||||
<meta property="og:title" content="{{ .Title }}">
|
|
||||||
<meta property="og:description" content="{{ .Text }}">
|
|
||||||
<meta property="og:image" content="{{ $SeoImageUrl }}">
|
|
||||||
|
|
||||||
<!-- Twitter -->
|
|
||||||
<meta property="twitter:card" content="{{ $SeoImageUrl }}">
|
|
||||||
<meta property="twitter:url" content="https://micrach.igonin.dev/{{ .ID }}">
|
|
||||||
<meta property="twitter:title" content="{{ .Title }}">
|
|
||||||
<meta property="twitter:description" content="{{ .Text }}">
|
|
||||||
<meta property="twitter:image" content="{{ $SeoImageUrl }}">
|
|
||||||
{{ end }}
|
|
@ -1,22 +0,0 @@
|
|||||||
{{ define "meta-tags-static" }}
|
|
||||||
<title>Micrach</title>
|
|
||||||
<!-- Primary Meta Tags -->
|
|
||||||
<meta charset="UTF-8"/>
|
|
||||||
<meta name="title" content="Micrach">
|
|
||||||
<meta name="description" content="Single board imageboard.">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
|
|
||||||
<!-- Open Graph / Facebook -->
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:url" content="https://micrach.igonin.dev/">
|
|
||||||
<meta property="og:title" content="Micrach">
|
|
||||||
<meta property="og:description" content="Single board imageboard.">
|
|
||||||
<meta property="og:image" content="https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png">
|
|
||||||
|
|
||||||
<!-- Twitter -->
|
|
||||||
<meta property="twitter:card" content="https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png">
|
|
||||||
<meta property="twitter:url" content="https://micrach.igonin.dev/">
|
|
||||||
<meta property="twitter:title" content="Micrach">
|
|
||||||
<meta property="twitter:description" content="Single board imageboard.">
|
|
||||||
<meta property="twitter:image" content="https://memepedia.ru/wp-content/uploads/2018/03/ebanyy-rot-etogo-kazino.png">
|
|
||||||
{{ end }}
|
|
28
templates/pages/index.html
Normal file
28
templates/pages/index.html
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
{{ template "static" }}
|
||||||
|
<link href="/static/styles/index.css" rel="stylesheet">
|
||||||
|
{{ template "meta-tags-static" }}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
{{ template "header" }}
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
{{ template "post-form" .FormData }}
|
||||||
|
|
||||||
|
<div id="" class="row row-cols-auto gy-4 mb-4 justify-content-center">
|
||||||
|
{{ range $Post := .Threads }}
|
||||||
|
{{ template "thread-card" $Post }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ template "pagiantion" .Pagination }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ template "footer" }}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
29
templates/pages/thread.html
Normal file
29
templates/pages/thread.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{{ $FirstPost:= index .Thread 0 }}
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
{{ template "static" }}
|
||||||
|
{{ template "meta-tags-dynamic" $FirstPost }}
|
||||||
|
<link href="/static/styles/thread.css" rel="stylesheet">
|
||||||
|
<link href="/static/styles/post.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
{{ template "header" $FirstPost.Title }}
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
{{ template "post-form" .FormData }}
|
||||||
|
|
||||||
|
<div id="postsСontainer">
|
||||||
|
{{ range $Post := .Thread }}
|
||||||
|
{{ template "post" $Post }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ template "footer" }}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -1,50 +0,0 @@
|
|||||||
{{ define "post-form" }}
|
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
|
|
||||||
<div class="col col-lg-6 col-md-8">
|
|
||||||
{{ if eq .FirstPostID 0 }}
|
|
||||||
<form id="postForm" action="/" method="POST" enctype="multipart/form-data">
|
|
||||||
{{ else }}
|
|
||||||
<form id="postForm" action="/{{ .FirstPostID }}" method="POST" enctype="multipart/form-data">
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
{{ if eq .FirstPostID 0 }}
|
|
||||||
<input class="form-control" id="postTitle" placeholder="Title" name="title">
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<textarea class="form-control" id="postText" rows="5" placeholder="Text" name="text"></textarea>
|
|
||||||
<input class="form-control" type="file" id="postFiles" multiple name="files">
|
|
||||||
|
|
||||||
{{ if .IsCaptchaActive }}
|
|
||||||
<div class="captcha-container text-center">
|
|
||||||
<img src="/captcha/{{ .CaptchaID }}" alt="Captcha">
|
|
||||||
</div>
|
|
||||||
<input class="form-control" type="hidden" name="captchaId" value="{{ .CaptchaID }}">
|
|
||||||
<input class="form-control" id="postCaptcha" type="tel" pattern="\d+" placeholder="Captcha" name="captcha">
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
{{ if ne .FirstPostID 0 }}
|
|
||||||
<div class="col">
|
|
||||||
<input class="form-check-input" type="checkbox" value="on" id="postSage" name="sage">
|
|
||||||
<label class="form-check-label" for="postSage">
|
|
||||||
Sage
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="col text-end">
|
|
||||||
<button class="col btn btn-outline-primary" type="submit" >
|
|
||||||
{{ if ne .FirstPostID 0 }}
|
|
||||||
Send
|
|
||||||
{{ else }}
|
|
||||||
Create thread
|
|
||||||
{{ end }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
|
@ -1,16 +0,0 @@
|
|||||||
{{ define "static" }}
|
|
||||||
<link
|
|
||||||
href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css"
|
|
||||||
rel="stylesheet"
|
|
||||||
integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
>
|
|
||||||
<script
|
|
||||||
src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js"
|
|
||||||
integrity="sha384-U1DAWAznBHeqEIlVSCgzq+c9gqGAJn5c/t99JyeKa9xxaYpSvHU5awsuZVVFIhvj"
|
|
||||||
crossorigin="anonymous">
|
|
||||||
</script>
|
|
||||||
<link rel="icon" href="/static/favicon.ico"/>
|
|
||||||
<link href="/static/styles/utils.css" rel="stylesheet">
|
|
||||||
<link href="/static/styles/post-form.css" rel="stylesheet">
|
|
||||||
{{ end }}
|
|
@ -1,56 +0,0 @@
|
|||||||
{{ $FirstPost:= index .Thread 0 }}
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
{{ template "static" }}
|
|
||||||
{{ template "meta-tags-dynamic" $FirstPost }}
|
|
||||||
<link href="/static/styles/thread.css" rel="stylesheet">
|
|
||||||
<link href="/static/styles/post.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<a href="/" class="thread-title-link">
|
|
||||||
<h1 class="display-1 text-center thread-title">
|
|
||||||
{{ if ne $FirstPost.Title "" }}
|
|
||||||
{{$FirstPost.Title}}
|
|
||||||
{{ else }}
|
|
||||||
Welcome to Micrach
|
|
||||||
{{ end }}
|
|
||||||
</h1>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
{{ template "post-form" .FormData }}
|
|
||||||
|
|
||||||
<div id="postsСontainer">
|
|
||||||
{{ range $Post := .Thread }}
|
|
||||||
<div class="post-container mb-4">
|
|
||||||
|
|
||||||
{{ $filesLength := len $Post.Files }}
|
|
||||||
{{ if gt $filesLength 0 }}
|
|
||||||
<div class="files-container">
|
|
||||||
{{ range $File := $Post.Files }}
|
|
||||||
<div class="file-container">
|
|
||||||
<a href="/uploads/{{$FirstPost.ID}}/o/{{$File.ID}}.{{$File.Ext}}" target="blank">
|
|
||||||
<img src="/uploads/{{$FirstPost.ID}}/t/{{$File.ID}}.{{$File.Ext}}" class="file" alt="Uploaded picture">
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
|
||||||
|
|
||||||
<div class="p-2">
|
|
||||||
<p class="card-text line-break text-break">{{$Post.Text}}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{ template "footer" }}
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
Loading…
Reference in New Issue
Block a user