projecto completo creo, me quedo bonito :3
This commit is contained in:
141
database.go
Normal file
141
database.go
Normal file
@@ -0,0 +1,141 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"todo/models"
|
||||
)
|
||||
|
||||
type DatabaseInterface interface {
|
||||
GetTodos() ([]models.Todo, error)
|
||||
GetTodo(int) (models.Todo, error)
|
||||
CreateTodo(models.Todo) error
|
||||
DoTodo(int) error
|
||||
UndoTodo(int) error
|
||||
DeleteTodo(int) error
|
||||
}
|
||||
|
||||
type DatabaseStore struct {
|
||||
DB *sql.DB
|
||||
}
|
||||
|
||||
func MustNewDB() *DatabaseStore {
|
||||
db, err := sql.Open("sqlite3", "./database.sqlite")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = db.Ping()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return &DatabaseStore{db}
|
||||
}
|
||||
|
||||
func (store *DatabaseStore) GetTodos() ([]models.Todo, error) {
|
||||
selectAll := `select id, todo, done from todo`
|
||||
|
||||
rows, err := store.DB.Query(selectAll)
|
||||
if err != nil {
|
||||
return []models.Todo{}, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
todos := []models.Todo{}
|
||||
for rows.Next() {
|
||||
todo := models.Todo{}
|
||||
err = rows.Scan(&todo.Id, &todo.Todo, &todo.Done)
|
||||
if err != nil {
|
||||
return []models.Todo{}, err
|
||||
}
|
||||
todos = append(todos, todo)
|
||||
}
|
||||
|
||||
return todos, nil
|
||||
}
|
||||
|
||||
func (store *DatabaseStore) GetTodo(id int) (models.Todo, error) {
|
||||
selectOne := `select id, todo, done from todo where id = ?`
|
||||
|
||||
var todo models.Todo
|
||||
err := store.DB.QueryRow(selectOne, id).Scan(&todo.Id, &todo.Todo, &todo.Done)
|
||||
if err != nil {
|
||||
return models.Todo{}, err
|
||||
}
|
||||
|
||||
return todo, nil
|
||||
}
|
||||
|
||||
func (store *DatabaseStore) CreateTodo(todo models.Todo) error {
|
||||
createTodo := `insert into todo (todo, done) values (?, ?)`
|
||||
|
||||
statement, err := store.DB.Prepare(createTodo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer statement.Close()
|
||||
|
||||
_, err = statement.Exec(todo.Todo, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (store *DatabaseStore) ToggleTodo(id int) error {
|
||||
todo, err := store.GetTodo(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
setDone := `update todo set done = ? where id = ?`
|
||||
|
||||
statement, err := store.DB.Prepare(setDone)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer statement.Close()
|
||||
|
||||
_, err = statement.Exec(!todo.Done, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (store *DatabaseStore) UpdateTodo(todo models.Todo) error {
|
||||
updateTodo := `update todo set todo = ? where id = ?`
|
||||
|
||||
statement, err := store.DB.Prepare(updateTodo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer statement.Close()
|
||||
|
||||
_, err = statement.Exec(todo.Todo, todo.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (store *DatabaseStore) DeleteTodo(id int) error {
|
||||
deleteTodo := `delete from todo where id = ?`
|
||||
|
||||
statement, err := store.DB.Prepare(deleteTodo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer statement.Close()
|
||||
|
||||
_, err = statement.Exec(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
BIN
database.sqlite
Normal file
BIN
database.sqlite
Normal file
Binary file not shown.
20
file_server.go
Normal file
20
file_server.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/go-chi/chi"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func fileServer(r chi.Router, path string, root http.FileSystem) {
|
||||
fs := http.StripPrefix(path, http.FileServer(root))
|
||||
|
||||
if path != "/" && path[len(path)-1] != '/' {
|
||||
r.Get(path, http.RedirectHandler(path+"/", 301).ServeHTTP)
|
||||
path += "/"
|
||||
}
|
||||
path += "*"
|
||||
|
||||
r.Get(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
fs.ServeHTTP(w, r)
|
||||
}))
|
||||
}
|
||||
108
handler.go
Normal file
108
handler.go
Normal file
@@ -0,0 +1,108 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"todo/templates"
|
||||
"todo/models"
|
||||
"strconv"
|
||||
"github.com/go-chi/chi"
|
||||
)
|
||||
|
||||
var store = MustNewDB()
|
||||
|
||||
func indexHandler(w http.ResponseWriter, r *http.Request) {
|
||||
todos, err := store.GetTodos()
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al intentar obtener todos los TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
templates.WritePage(w, &templates.IndexPage{todos})
|
||||
}
|
||||
|
||||
func createHandler(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm()
|
||||
todo := models.Todo{Id: 0, Todo: r.FormValue("todo"), Done: false}
|
||||
err := store.CreateTodo(todo)
|
||||
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al intentar crear un nuevo TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||
}
|
||||
|
||||
func toggleHandler(w http.ResponseWriter, r *http.Request) {
|
||||
id, err := strconv.Atoi(chi.URLParam(r, "id"))
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"El id entregado es invalido", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
err = store.ToggleTodo(id)
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al actualizar el TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||
}
|
||||
|
||||
func deleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||
id, err := strconv.Atoi(chi.URLParam(r, "id"))
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"El id entregado es invalido", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
err = store.DeleteTodo(id)
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al eliminar el TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||
}
|
||||
|
||||
func editHandler(w http.ResponseWriter, r *http.Request) {
|
||||
id, err := strconv.Atoi(chi.URLParam(r, "id"))
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"El id entregado es invalido", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
todos, err := store.GetTodos()
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al intentar obtener todos los TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
editingTodo, err := store.GetTodo(id)
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al intentar obtener un TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
templates.WritePage(w, &templates.EditPage{todos, editingTodo})
|
||||
}
|
||||
|
||||
func updateHandler(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseForm()
|
||||
|
||||
id, err := strconv.Atoi(chi.URLParam(r, "id"))
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"El id entregado es invalido", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
message := r.FormValue("todo")
|
||||
|
||||
todo := models.Todo{Id: id, Todo: message }
|
||||
err = store.UpdateTodo(todo)
|
||||
|
||||
if err != nil {
|
||||
templates.WritePage(w, &templates.Error500Page{"Error al intentar actualizar un TODO", err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
http.Redirect(w, r, "/", http.StatusSeeOther)
|
||||
}
|
||||
36
main.go
Normal file
36
main.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/chi/middleware"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
|
||||
func main() {
|
||||
log.Println("Launching TODO App")
|
||||
log.Println("Generating the routes...")
|
||||
|
||||
workDir, _ := os.Getwd()
|
||||
filesDir := filepath.Join(workDir, "static")
|
||||
|
||||
router := chi.NewRouter()
|
||||
router.Use(middleware.Logger)
|
||||
|
||||
router.Get("/", indexHandler)
|
||||
router.Get("/edit/{id:[0-9]+}", editHandler)
|
||||
|
||||
router.Post("/create", createHandler)
|
||||
router.Post("/toggle/{id:[0-9]+}", toggleHandler)
|
||||
router.Post("/update/{id:[0-9]+}", updateHandler)
|
||||
router.Post("/delete/{id:[0-9]+}", deleteHandler)
|
||||
|
||||
fileServer(router, "/static", http.Dir(filesDir))
|
||||
|
||||
log.Println("Serving the page on port 1337")
|
||||
http.ListenAndServe(":1337", router)
|
||||
}
|
||||
6
makefile
Normal file
6
makefile
Normal file
@@ -0,0 +1,6 @@
|
||||
templates/%.qtpl.go: templates/%.qtpl
|
||||
cd templates; qtc
|
||||
todo: *.go templates/*.go
|
||||
go build
|
||||
clean:
|
||||
rm todo templates/*.qtpl.go
|
||||
7
models/todo.go
Normal file
7
models/todo.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package models
|
||||
|
||||
type Todo struct {
|
||||
Id int
|
||||
Todo string
|
||||
Done bool
|
||||
}
|
||||
33
static/custom.css
Normal file
33
static/custom.css
Normal file
@@ -0,0 +1,33 @@
|
||||
input[type=submit].button-green {
|
||||
color:#FFF;
|
||||
background-color:#30dd8d;
|
||||
border-color:#30dd8d;
|
||||
}
|
||||
|
||||
input[type=submit].button-green:focus,
|
||||
input[type=submit].button-green:hover {
|
||||
color:#FFF;
|
||||
background-color:#2ab775;
|
||||
border-color:#2ab775;
|
||||
}
|
||||
|
||||
input[type=submit].button-red {
|
||||
color:#FFF;
|
||||
background-color:#f7474a;
|
||||
border-color:#f7474a;
|
||||
}
|
||||
|
||||
input[type=submit].button-red:focus,
|
||||
input[type=submit].button-red:hover {
|
||||
color:#FFF;
|
||||
background-color:#d33d3f;
|
||||
border-color:#d33d3f;
|
||||
}
|
||||
|
||||
.title {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
form {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
25
templates/500.qtpl
Normal file
25
templates/500.qtpl
Normal file
@@ -0,0 +1,25 @@
|
||||
{% code
|
||||
type Error500Page struct {
|
||||
Message string
|
||||
Error string
|
||||
}
|
||||
%}
|
||||
|
||||
{% func (p *Error500Page ) Title() %}
|
||||
500
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *Error500Page ) Stylesheets() %}
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *Error500Page ) Scripts() %}
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *Error500Page ) Body() %}
|
||||
<div class="container">
|
||||
<h1>Error: 500</h1>
|
||||
<p>{%s p.Message %}</p>
|
||||
<p>{%s p.Error %}</p>
|
||||
</div>
|
||||
{% endfunc %}
|
||||
175
templates/500.qtpl.go
Normal file
175
templates/500.qtpl.go
Normal file
@@ -0,0 +1,175 @@
|
||||
// This file is automatically generated by qtc from "500.qtpl".
|
||||
// See https://github.com/valyala/quicktemplate for details.
|
||||
|
||||
//line 500.qtpl:1
|
||||
package templates
|
||||
|
||||
//line 500.qtpl:1
|
||||
import (
|
||||
qtio422016 "io"
|
||||
|
||||
qt422016 "github.com/valyala/quicktemplate"
|
||||
)
|
||||
|
||||
//line 500.qtpl:1
|
||||
var (
|
||||
_ = qtio422016.Copy
|
||||
_ = qt422016.AcquireByteBuffer
|
||||
)
|
||||
|
||||
//line 500.qtpl:2
|
||||
type Error500Page struct {
|
||||
Message string
|
||||
Error string
|
||||
}
|
||||
|
||||
//line 500.qtpl:8
|
||||
func (p *Error500Page) StreamTitle(qw422016 *qt422016.Writer) {
|
||||
//line 500.qtpl:8
|
||||
qw422016.N().S(`
|
||||
500
|
||||
`)
|
||||
//line 500.qtpl:10
|
||||
}
|
||||
|
||||
//line 500.qtpl:10
|
||||
func (p *Error500Page) WriteTitle(qq422016 qtio422016.Writer) {
|
||||
//line 500.qtpl:10
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line 500.qtpl:10
|
||||
p.StreamTitle(qw422016)
|
||||
//line 500.qtpl:10
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line 500.qtpl:10
|
||||
}
|
||||
|
||||
//line 500.qtpl:10
|
||||
func (p *Error500Page) Title() string {
|
||||
//line 500.qtpl:10
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line 500.qtpl:10
|
||||
p.WriteTitle(qb422016)
|
||||
//line 500.qtpl:10
|
||||
qs422016 := string(qb422016.B)
|
||||
//line 500.qtpl:10
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line 500.qtpl:10
|
||||
return qs422016
|
||||
//line 500.qtpl:10
|
||||
}
|
||||
|
||||
//line 500.qtpl:12
|
||||
func (p *Error500Page) StreamStylesheets(qw422016 *qt422016.Writer) {
|
||||
//line 500.qtpl:12
|
||||
qw422016.N().S(`
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
|
||||
`)
|
||||
//line 500.qtpl:14
|
||||
}
|
||||
|
||||
//line 500.qtpl:14
|
||||
func (p *Error500Page) WriteStylesheets(qq422016 qtio422016.Writer) {
|
||||
//line 500.qtpl:14
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line 500.qtpl:14
|
||||
p.StreamStylesheets(qw422016)
|
||||
//line 500.qtpl:14
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line 500.qtpl:14
|
||||
}
|
||||
|
||||
//line 500.qtpl:14
|
||||
func (p *Error500Page) Stylesheets() string {
|
||||
//line 500.qtpl:14
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line 500.qtpl:14
|
||||
p.WriteStylesheets(qb422016)
|
||||
//line 500.qtpl:14
|
||||
qs422016 := string(qb422016.B)
|
||||
//line 500.qtpl:14
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line 500.qtpl:14
|
||||
return qs422016
|
||||
//line 500.qtpl:14
|
||||
}
|
||||
|
||||
//line 500.qtpl:16
|
||||
func (p *Error500Page) StreamScripts(qw422016 *qt422016.Writer) {
|
||||
//line 500.qtpl:16
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line 500.qtpl:17
|
||||
}
|
||||
|
||||
//line 500.qtpl:17
|
||||
func (p *Error500Page) WriteScripts(qq422016 qtio422016.Writer) {
|
||||
//line 500.qtpl:17
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line 500.qtpl:17
|
||||
p.StreamScripts(qw422016)
|
||||
//line 500.qtpl:17
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line 500.qtpl:17
|
||||
}
|
||||
|
||||
//line 500.qtpl:17
|
||||
func (p *Error500Page) Scripts() string {
|
||||
//line 500.qtpl:17
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line 500.qtpl:17
|
||||
p.WriteScripts(qb422016)
|
||||
//line 500.qtpl:17
|
||||
qs422016 := string(qb422016.B)
|
||||
//line 500.qtpl:17
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line 500.qtpl:17
|
||||
return qs422016
|
||||
//line 500.qtpl:17
|
||||
}
|
||||
|
||||
//line 500.qtpl:19
|
||||
func (p *Error500Page) StreamBody(qw422016 *qt422016.Writer) {
|
||||
//line 500.qtpl:19
|
||||
qw422016.N().S(`
|
||||
<div class="container">
|
||||
<h1>Error: 500</h1>
|
||||
<p>`)
|
||||
//line 500.qtpl:22
|
||||
qw422016.E().S(p.Message)
|
||||
//line 500.qtpl:22
|
||||
qw422016.N().S(`</p>
|
||||
<p>`)
|
||||
//line 500.qtpl:23
|
||||
qw422016.E().S(p.Error)
|
||||
//line 500.qtpl:23
|
||||
qw422016.N().S(`</p>
|
||||
</div>
|
||||
`)
|
||||
//line 500.qtpl:25
|
||||
}
|
||||
|
||||
//line 500.qtpl:25
|
||||
func (p *Error500Page) WriteBody(qq422016 qtio422016.Writer) {
|
||||
//line 500.qtpl:25
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line 500.qtpl:25
|
||||
p.StreamBody(qw422016)
|
||||
//line 500.qtpl:25
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line 500.qtpl:25
|
||||
}
|
||||
|
||||
//line 500.qtpl:25
|
||||
func (p *Error500Page) Body() string {
|
||||
//line 500.qtpl:25
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line 500.qtpl:25
|
||||
p.WriteBody(qb422016)
|
||||
//line 500.qtpl:25
|
||||
qs422016 := string(qb422016.B)
|
||||
//line 500.qtpl:25
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line 500.qtpl:25
|
||||
return qs422016
|
||||
//line 500.qtpl:25
|
||||
}
|
||||
31
templates/base.qtpl
Normal file
31
templates/base.qtpl
Normal file
@@ -0,0 +1,31 @@
|
||||
{% interface PageImpl {
|
||||
Title()
|
||||
Stylesheets()
|
||||
Scripts()
|
||||
Body()
|
||||
}
|
||||
%}
|
||||
|
||||
{% func Page(p PageImpl) %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<title>{%= p.Title() %}</title>
|
||||
{%= p.Stylesheets() %}
|
||||
{%= p.Scripts() %}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{%= p.Body() %}
|
||||
</body>
|
||||
</html>
|
||||
{% endfunc %}
|
||||
|
||||
{% func GetDoneButton(done bool) %}
|
||||
{% if done %}
|
||||
<input type="submit" class="button-primary button-green u-full-width" value="">
|
||||
{% else %}
|
||||
<input type="submit" class="button-primary button-red u-full-width" value="">
|
||||
{% endif %}
|
||||
{% endfunc %}
|
||||
161
templates/base.qtpl.go
Normal file
161
templates/base.qtpl.go
Normal file
@@ -0,0 +1,161 @@
|
||||
// This file is automatically generated by qtc from "base.qtpl".
|
||||
// See https://github.com/valyala/quicktemplate for details.
|
||||
|
||||
//line base.qtpl:1
|
||||
package templates
|
||||
|
||||
//line base.qtpl:1
|
||||
import (
|
||||
qtio422016 "io"
|
||||
|
||||
qt422016 "github.com/valyala/quicktemplate"
|
||||
)
|
||||
|
||||
//line base.qtpl:1
|
||||
var (
|
||||
_ = qtio422016.Copy
|
||||
_ = qt422016.AcquireByteBuffer
|
||||
)
|
||||
|
||||
//line base.qtpl:1
|
||||
type PageImpl interface {
|
||||
//line base.qtpl:1
|
||||
Title() string
|
||||
//line base.qtpl:1
|
||||
StreamTitle(qw422016 *qt422016.Writer)
|
||||
//line base.qtpl:1
|
||||
WriteTitle(qq422016 qtio422016.Writer)
|
||||
//line base.qtpl:1
|
||||
Stylesheets() string
|
||||
//line base.qtpl:1
|
||||
StreamStylesheets(qw422016 *qt422016.Writer)
|
||||
//line base.qtpl:1
|
||||
WriteStylesheets(qq422016 qtio422016.Writer)
|
||||
//line base.qtpl:1
|
||||
Scripts() string
|
||||
//line base.qtpl:1
|
||||
StreamScripts(qw422016 *qt422016.Writer)
|
||||
//line base.qtpl:1
|
||||
WriteScripts(qq422016 qtio422016.Writer)
|
||||
//line base.qtpl:1
|
||||
Body() string
|
||||
//line base.qtpl:1
|
||||
StreamBody(qw422016 *qt422016.Writer)
|
||||
//line base.qtpl:1
|
||||
WriteBody(qq422016 qtio422016.Writer)
|
||||
//line base.qtpl:1
|
||||
}
|
||||
|
||||
//line base.qtpl:9
|
||||
func StreamPage(qw422016 *qt422016.Writer, p PageImpl) {
|
||||
//line base.qtpl:9
|
||||
qw422016.N().S(`
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<title>`)
|
||||
//line base.qtpl:14
|
||||
p.StreamTitle(qw422016)
|
||||
//line base.qtpl:14
|
||||
qw422016.N().S(`</title>
|
||||
`)
|
||||
//line base.qtpl:15
|
||||
p.StreamStylesheets(qw422016)
|
||||
//line base.qtpl:15
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line base.qtpl:16
|
||||
p.StreamScripts(qw422016)
|
||||
//line base.qtpl:16
|
||||
qw422016.N().S(`
|
||||
</head>
|
||||
|
||||
<body>
|
||||
`)
|
||||
//line base.qtpl:20
|
||||
p.StreamBody(qw422016)
|
||||
//line base.qtpl:20
|
||||
qw422016.N().S(`
|
||||
</body>
|
||||
</html>
|
||||
`)
|
||||
//line base.qtpl:23
|
||||
}
|
||||
|
||||
//line base.qtpl:23
|
||||
func WritePage(qq422016 qtio422016.Writer, p PageImpl) {
|
||||
//line base.qtpl:23
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line base.qtpl:23
|
||||
StreamPage(qw422016, p)
|
||||
//line base.qtpl:23
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line base.qtpl:23
|
||||
}
|
||||
|
||||
//line base.qtpl:23
|
||||
func Page(p PageImpl) string {
|
||||
//line base.qtpl:23
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line base.qtpl:23
|
||||
WritePage(qb422016, p)
|
||||
//line base.qtpl:23
|
||||
qs422016 := string(qb422016.B)
|
||||
//line base.qtpl:23
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line base.qtpl:23
|
||||
return qs422016
|
||||
//line base.qtpl:23
|
||||
}
|
||||
|
||||
//line base.qtpl:25
|
||||
func StreamGetDoneButton(qw422016 *qt422016.Writer, done bool) {
|
||||
//line base.qtpl:25
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line base.qtpl:26
|
||||
if done {
|
||||
//line base.qtpl:26
|
||||
qw422016.N().S(`
|
||||
<input type="submit" class="button-primary button-green u-full-width" value="">
|
||||
`)
|
||||
//line base.qtpl:28
|
||||
} else {
|
||||
//line base.qtpl:28
|
||||
qw422016.N().S(`
|
||||
<input type="submit" class="button-primary button-red u-full-width" value="">
|
||||
`)
|
||||
//line base.qtpl:30
|
||||
}
|
||||
//line base.qtpl:30
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line base.qtpl:31
|
||||
}
|
||||
|
||||
//line base.qtpl:31
|
||||
func WriteGetDoneButton(qq422016 qtio422016.Writer, done bool) {
|
||||
//line base.qtpl:31
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line base.qtpl:31
|
||||
StreamGetDoneButton(qw422016, done)
|
||||
//line base.qtpl:31
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line base.qtpl:31
|
||||
}
|
||||
|
||||
//line base.qtpl:31
|
||||
func GetDoneButton(done bool) string {
|
||||
//line base.qtpl:31
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line base.qtpl:31
|
||||
WriteGetDoneButton(qb422016, done)
|
||||
//line base.qtpl:31
|
||||
qs422016 := string(qb422016.B)
|
||||
//line base.qtpl:31
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line base.qtpl:31
|
||||
return qs422016
|
||||
//line base.qtpl:31
|
||||
}
|
||||
67
templates/edit.qtpl
Normal file
67
templates/edit.qtpl
Normal file
@@ -0,0 +1,67 @@
|
||||
{% import "todo/models" %}
|
||||
|
||||
{% code
|
||||
type EditPage struct {
|
||||
Todos []models.Todo
|
||||
EditingTodo models.Todo
|
||||
}
|
||||
%}
|
||||
|
||||
{% func (p *EditPage ) Title() %}
|
||||
Todo
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *EditPage ) Stylesheets() %}
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="/static/custom.css">
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *EditPage ) Scripts() %}
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *EditPage ) Body() %}
|
||||
<div class="container">
|
||||
<a href="/" class="title"><h1>TODO in Golang</h1></a>
|
||||
<form action="/update/{%d p.EditingTodo.Id %}" method="post">
|
||||
<div class="row">
|
||||
<div class="nine columns">
|
||||
<input type="text" class="u-full-width" name="todo" id="todo" value="{%s p.EditingTodo.Todo %}">
|
||||
</div>
|
||||
<div class="three columns">
|
||||
<input type="submit" class="button-primary u-full-width" value="Update">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% for _, todo := range p.Todos %}
|
||||
<div class="row">
|
||||
<div class="one column">
|
||||
<form action="/undo/{%d todo.Id %}" method="post">
|
||||
{%= GetDoneButton(todo.Done) %}
|
||||
</form>
|
||||
</div>
|
||||
<div class="seven columns">
|
||||
<p>{%s todo.Todo %}</p>
|
||||
</div>
|
||||
{% if todo.Id == p.EditingTodo.Id %}
|
||||
<div class="two columns">
|
||||
<input type="submit" disabled="disabled" class="u-full-width" value="Editing">
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="two columns">
|
||||
<form action="/edit/{%d todo.Id %}">
|
||||
<input type="submit" class="button-primary u-full-width" value="Edit">
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="two columns">
|
||||
<form action="/undo/{%d todo.Id %}" method="post">
|
||||
<input type="submit" class="button-red u-full-width" value="Delete">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
{% endfunc %}
|
||||
|
||||
257
templates/edit.qtpl.go
Normal file
257
templates/edit.qtpl.go
Normal file
@@ -0,0 +1,257 @@
|
||||
// This file is automatically generated by qtc from "edit.qtpl".
|
||||
// See https://github.com/valyala/quicktemplate for details.
|
||||
|
||||
//line edit.qtpl:1
|
||||
package templates
|
||||
|
||||
//line edit.qtpl:1
|
||||
import "todo/models"
|
||||
|
||||
//line edit.qtpl:3
|
||||
import (
|
||||
qtio422016 "io"
|
||||
|
||||
qt422016 "github.com/valyala/quicktemplate"
|
||||
)
|
||||
|
||||
//line edit.qtpl:3
|
||||
var (
|
||||
_ = qtio422016.Copy
|
||||
_ = qt422016.AcquireByteBuffer
|
||||
)
|
||||
|
||||
//line edit.qtpl:4
|
||||
type EditPage struct {
|
||||
Todos []models.Todo
|
||||
EditingTodo models.Todo
|
||||
}
|
||||
|
||||
//line edit.qtpl:10
|
||||
func (p *EditPage) StreamTitle(qw422016 *qt422016.Writer) {
|
||||
//line edit.qtpl:10
|
||||
qw422016.N().S(`
|
||||
Todo
|
||||
`)
|
||||
//line edit.qtpl:12
|
||||
}
|
||||
|
||||
//line edit.qtpl:12
|
||||
func (p *EditPage) WriteTitle(qq422016 qtio422016.Writer) {
|
||||
//line edit.qtpl:12
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line edit.qtpl:12
|
||||
p.StreamTitle(qw422016)
|
||||
//line edit.qtpl:12
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line edit.qtpl:12
|
||||
}
|
||||
|
||||
//line edit.qtpl:12
|
||||
func (p *EditPage) Title() string {
|
||||
//line edit.qtpl:12
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line edit.qtpl:12
|
||||
p.WriteTitle(qb422016)
|
||||
//line edit.qtpl:12
|
||||
qs422016 := string(qb422016.B)
|
||||
//line edit.qtpl:12
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line edit.qtpl:12
|
||||
return qs422016
|
||||
//line edit.qtpl:12
|
||||
}
|
||||
|
||||
//line edit.qtpl:14
|
||||
func (p *EditPage) StreamStylesheets(qw422016 *qt422016.Writer) {
|
||||
//line edit.qtpl:14
|
||||
qw422016.N().S(`
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="/static/custom.css">
|
||||
`)
|
||||
//line edit.qtpl:17
|
||||
}
|
||||
|
||||
//line edit.qtpl:17
|
||||
func (p *EditPage) WriteStylesheets(qq422016 qtio422016.Writer) {
|
||||
//line edit.qtpl:17
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line edit.qtpl:17
|
||||
p.StreamStylesheets(qw422016)
|
||||
//line edit.qtpl:17
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line edit.qtpl:17
|
||||
}
|
||||
|
||||
//line edit.qtpl:17
|
||||
func (p *EditPage) Stylesheets() string {
|
||||
//line edit.qtpl:17
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line edit.qtpl:17
|
||||
p.WriteStylesheets(qb422016)
|
||||
//line edit.qtpl:17
|
||||
qs422016 := string(qb422016.B)
|
||||
//line edit.qtpl:17
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line edit.qtpl:17
|
||||
return qs422016
|
||||
//line edit.qtpl:17
|
||||
}
|
||||
|
||||
//line edit.qtpl:19
|
||||
func (p *EditPage) StreamScripts(qw422016 *qt422016.Writer) {
|
||||
//line edit.qtpl:19
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line edit.qtpl:20
|
||||
}
|
||||
|
||||
//line edit.qtpl:20
|
||||
func (p *EditPage) WriteScripts(qq422016 qtio422016.Writer) {
|
||||
//line edit.qtpl:20
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line edit.qtpl:20
|
||||
p.StreamScripts(qw422016)
|
||||
//line edit.qtpl:20
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line edit.qtpl:20
|
||||
}
|
||||
|
||||
//line edit.qtpl:20
|
||||
func (p *EditPage) Scripts() string {
|
||||
//line edit.qtpl:20
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line edit.qtpl:20
|
||||
p.WriteScripts(qb422016)
|
||||
//line edit.qtpl:20
|
||||
qs422016 := string(qb422016.B)
|
||||
//line edit.qtpl:20
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line edit.qtpl:20
|
||||
return qs422016
|
||||
//line edit.qtpl:20
|
||||
}
|
||||
|
||||
//line edit.qtpl:22
|
||||
func (p *EditPage) StreamBody(qw422016 *qt422016.Writer) {
|
||||
//line edit.qtpl:22
|
||||
qw422016.N().S(`
|
||||
<div class="container">
|
||||
<a href="/" class="title"><h1>TODO in Golang</h1></a>
|
||||
<form action="/update/`)
|
||||
//line edit.qtpl:25
|
||||
qw422016.N().D(p.EditingTodo.Id)
|
||||
//line edit.qtpl:25
|
||||
qw422016.N().S(`" method="post">
|
||||
<div class="row">
|
||||
<div class="nine columns">
|
||||
<input type="text" class="u-full-width" name="todo" id="todo" value="`)
|
||||
//line edit.qtpl:28
|
||||
qw422016.E().S(p.EditingTodo.Todo)
|
||||
//line edit.qtpl:28
|
||||
qw422016.N().S(`">
|
||||
</div>
|
||||
<div class="three columns">
|
||||
<input type="submit" class="button-primary u-full-width" value="Update">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
`)
|
||||
//line edit.qtpl:36
|
||||
for _, todo := range p.Todos {
|
||||
//line edit.qtpl:36
|
||||
qw422016.N().S(`
|
||||
<div class="row">
|
||||
<div class="one column">
|
||||
<form action="/undo/`)
|
||||
//line edit.qtpl:39
|
||||
qw422016.N().D(todo.Id)
|
||||
//line edit.qtpl:39
|
||||
qw422016.N().S(`" method="post">
|
||||
`)
|
||||
//line edit.qtpl:40
|
||||
StreamGetDoneButton(qw422016, todo.Done)
|
||||
//line edit.qtpl:40
|
||||
qw422016.N().S(`
|
||||
</form>
|
||||
</div>
|
||||
<div class="seven columns">
|
||||
<p>`)
|
||||
//line edit.qtpl:44
|
||||
qw422016.E().S(todo.Todo)
|
||||
//line edit.qtpl:44
|
||||
qw422016.N().S(`</p>
|
||||
</div>
|
||||
`)
|
||||
//line edit.qtpl:46
|
||||
if todo.Id == p.EditingTodo.Id {
|
||||
//line edit.qtpl:46
|
||||
qw422016.N().S(`
|
||||
<div class="two columns">
|
||||
<input type="submit" disabled="disabled" class="u-full-width" value="Editing">
|
||||
</div>
|
||||
`)
|
||||
//line edit.qtpl:50
|
||||
} else {
|
||||
//line edit.qtpl:50
|
||||
qw422016.N().S(`
|
||||
<div class="two columns">
|
||||
<form action="/edit/`)
|
||||
//line edit.qtpl:52
|
||||
qw422016.N().D(todo.Id)
|
||||
//line edit.qtpl:52
|
||||
qw422016.N().S(`">
|
||||
<input type="submit" class="button-primary u-full-width" value="Edit">
|
||||
</form>
|
||||
</div>
|
||||
`)
|
||||
//line edit.qtpl:56
|
||||
}
|
||||
//line edit.qtpl:56
|
||||
qw422016.N().S(`
|
||||
<div class="two columns">
|
||||
<form action="/undo/`)
|
||||
//line edit.qtpl:58
|
||||
qw422016.N().D(todo.Id)
|
||||
//line edit.qtpl:58
|
||||
qw422016.N().S(`" method="post">
|
||||
<input type="submit" class="button-red u-full-width" value="Delete">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
`)
|
||||
//line edit.qtpl:63
|
||||
}
|
||||
//line edit.qtpl:63
|
||||
qw422016.N().S(`
|
||||
|
||||
</div>
|
||||
`)
|
||||
//line edit.qtpl:66
|
||||
}
|
||||
|
||||
//line edit.qtpl:66
|
||||
func (p *EditPage) WriteBody(qq422016 qtio422016.Writer) {
|
||||
//line edit.qtpl:66
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line edit.qtpl:66
|
||||
p.StreamBody(qw422016)
|
||||
//line edit.qtpl:66
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line edit.qtpl:66
|
||||
}
|
||||
|
||||
//line edit.qtpl:66
|
||||
func (p *EditPage) Body() string {
|
||||
//line edit.qtpl:66
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line edit.qtpl:66
|
||||
p.WriteBody(qb422016)
|
||||
//line edit.qtpl:66
|
||||
qs422016 := string(qb422016.B)
|
||||
//line edit.qtpl:66
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line edit.qtpl:66
|
||||
return qs422016
|
||||
//line edit.qtpl:66
|
||||
}
|
||||
59
templates/index.qtpl
Normal file
59
templates/index.qtpl
Normal file
@@ -0,0 +1,59 @@
|
||||
{% import "todo/models" %}
|
||||
|
||||
{% code
|
||||
type IndexPage struct {
|
||||
Todos []models.Todo
|
||||
}
|
||||
%}
|
||||
|
||||
{% func (p *IndexPage ) Title() %}
|
||||
Todo
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *IndexPage ) Stylesheets() %}
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="/static/custom.css">
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *IndexPage ) Scripts() %}
|
||||
{% endfunc %}
|
||||
|
||||
{% func (p *IndexPage ) Body() %}
|
||||
<div class="container">
|
||||
<a href="/" class="title"><h1>TODO in Golang</h1></a>
|
||||
<form action="/create" method="post">
|
||||
<div class="row">
|
||||
<div class="nine columns">
|
||||
<input type="text" class="u-full-width" name="todo" id="todo">
|
||||
</div>
|
||||
<div class="three columns">
|
||||
<input type="submit" class="button-primary u-full-width" value="add">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% for _, todo := range p.Todos %}
|
||||
<div class="row">
|
||||
<div class="one column">
|
||||
<form action="/toggle/{%d todo.Id %}" method="post">
|
||||
{%= GetDoneButton(todo.Done) %}
|
||||
</form>
|
||||
</div>
|
||||
<div class="seven columns">
|
||||
<p>{%s todo.Todo %}</p>
|
||||
</div>
|
||||
<div class="two columns">
|
||||
<form action="/edit/{%d todo.Id %}">
|
||||
<input type="submit" class="button-primary u-full-width" value="Edit">
|
||||
</form>
|
||||
</div>
|
||||
<div class="two columns">
|
||||
<form action="/delete/{%d todo.Id %}" method="post">
|
||||
<input type="submit" class="button-primary button-red u-full-width" value="Delete">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
{% endfunc %}
|
||||
230
templates/index.qtpl.go
Normal file
230
templates/index.qtpl.go
Normal file
@@ -0,0 +1,230 @@
|
||||
// This file is automatically generated by qtc from "index.qtpl".
|
||||
// See https://github.com/valyala/quicktemplate for details.
|
||||
|
||||
//line index.qtpl:1
|
||||
package templates
|
||||
|
||||
//line index.qtpl:1
|
||||
import "todo/models"
|
||||
|
||||
//line index.qtpl:3
|
||||
import (
|
||||
qtio422016 "io"
|
||||
|
||||
qt422016 "github.com/valyala/quicktemplate"
|
||||
)
|
||||
|
||||
//line index.qtpl:3
|
||||
var (
|
||||
_ = qtio422016.Copy
|
||||
_ = qt422016.AcquireByteBuffer
|
||||
)
|
||||
|
||||
//line index.qtpl:4
|
||||
type IndexPage struct {
|
||||
Todos []models.Todo
|
||||
}
|
||||
|
||||
//line index.qtpl:9
|
||||
func (p *IndexPage) StreamTitle(qw422016 *qt422016.Writer) {
|
||||
//line index.qtpl:9
|
||||
qw422016.N().S(`
|
||||
Todo
|
||||
`)
|
||||
//line index.qtpl:11
|
||||
}
|
||||
|
||||
//line index.qtpl:11
|
||||
func (p *IndexPage) WriteTitle(qq422016 qtio422016.Writer) {
|
||||
//line index.qtpl:11
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line index.qtpl:11
|
||||
p.StreamTitle(qw422016)
|
||||
//line index.qtpl:11
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line index.qtpl:11
|
||||
}
|
||||
|
||||
//line index.qtpl:11
|
||||
func (p *IndexPage) Title() string {
|
||||
//line index.qtpl:11
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line index.qtpl:11
|
||||
p.WriteTitle(qb422016)
|
||||
//line index.qtpl:11
|
||||
qs422016 := string(qb422016.B)
|
||||
//line index.qtpl:11
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line index.qtpl:11
|
||||
return qs422016
|
||||
//line index.qtpl:11
|
||||
}
|
||||
|
||||
//line index.qtpl:13
|
||||
func (p *IndexPage) StreamStylesheets(qw422016 *qt422016.Writer) {
|
||||
//line index.qtpl:13
|
||||
qw422016.N().S(`
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="/static/custom.css">
|
||||
`)
|
||||
//line index.qtpl:16
|
||||
}
|
||||
|
||||
//line index.qtpl:16
|
||||
func (p *IndexPage) WriteStylesheets(qq422016 qtio422016.Writer) {
|
||||
//line index.qtpl:16
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line index.qtpl:16
|
||||
p.StreamStylesheets(qw422016)
|
||||
//line index.qtpl:16
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line index.qtpl:16
|
||||
}
|
||||
|
||||
//line index.qtpl:16
|
||||
func (p *IndexPage) Stylesheets() string {
|
||||
//line index.qtpl:16
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line index.qtpl:16
|
||||
p.WriteStylesheets(qb422016)
|
||||
//line index.qtpl:16
|
||||
qs422016 := string(qb422016.B)
|
||||
//line index.qtpl:16
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line index.qtpl:16
|
||||
return qs422016
|
||||
//line index.qtpl:16
|
||||
}
|
||||
|
||||
//line index.qtpl:18
|
||||
func (p *IndexPage) StreamScripts(qw422016 *qt422016.Writer) {
|
||||
//line index.qtpl:18
|
||||
qw422016.N().S(`
|
||||
`)
|
||||
//line index.qtpl:19
|
||||
}
|
||||
|
||||
//line index.qtpl:19
|
||||
func (p *IndexPage) WriteScripts(qq422016 qtio422016.Writer) {
|
||||
//line index.qtpl:19
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line index.qtpl:19
|
||||
p.StreamScripts(qw422016)
|
||||
//line index.qtpl:19
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line index.qtpl:19
|
||||
}
|
||||
|
||||
//line index.qtpl:19
|
||||
func (p *IndexPage) Scripts() string {
|
||||
//line index.qtpl:19
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line index.qtpl:19
|
||||
p.WriteScripts(qb422016)
|
||||
//line index.qtpl:19
|
||||
qs422016 := string(qb422016.B)
|
||||
//line index.qtpl:19
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line index.qtpl:19
|
||||
return qs422016
|
||||
//line index.qtpl:19
|
||||
}
|
||||
|
||||
//line index.qtpl:21
|
||||
func (p *IndexPage) StreamBody(qw422016 *qt422016.Writer) {
|
||||
//line index.qtpl:21
|
||||
qw422016.N().S(`
|
||||
<div class="container">
|
||||
<a href="/" class="title"><h1>TODO in Golang</h1></a>
|
||||
<form action="/create" method="post">
|
||||
<div class="row">
|
||||
<div class="nine columns">
|
||||
<input type="text" class="u-full-width" name="todo" id="todo">
|
||||
</div>
|
||||
<div class="three columns">
|
||||
<input type="submit" class="button-primary u-full-width" value="add">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
`)
|
||||
//line index.qtpl:35
|
||||
for _, todo := range p.Todos {
|
||||
//line index.qtpl:35
|
||||
qw422016.N().S(`
|
||||
<div class="row">
|
||||
<div class="one column">
|
||||
<form action="/toggle/`)
|
||||
//line index.qtpl:38
|
||||
qw422016.N().D(todo.Id)
|
||||
//line index.qtpl:38
|
||||
qw422016.N().S(`" method="post">
|
||||
`)
|
||||
//line index.qtpl:39
|
||||
StreamGetDoneButton(qw422016, todo.Done)
|
||||
//line index.qtpl:39
|
||||
qw422016.N().S(`
|
||||
</form>
|
||||
</div>
|
||||
<div class="seven columns">
|
||||
<p>`)
|
||||
//line index.qtpl:43
|
||||
qw422016.E().S(todo.Todo)
|
||||
//line index.qtpl:43
|
||||
qw422016.N().S(`</p>
|
||||
</div>
|
||||
<div class="two columns">
|
||||
<form action="/edit/`)
|
||||
//line index.qtpl:46
|
||||
qw422016.N().D(todo.Id)
|
||||
//line index.qtpl:46
|
||||
qw422016.N().S(`">
|
||||
<input type="submit" class="button-primary u-full-width" value="Edit">
|
||||
</form>
|
||||
</div>
|
||||
<div class="two columns">
|
||||
<form action="/delete/`)
|
||||
//line index.qtpl:51
|
||||
qw422016.N().D(todo.Id)
|
||||
//line index.qtpl:51
|
||||
qw422016.N().S(`" method="post">
|
||||
<input type="submit" class="button-primary button-red u-full-width" value="Delete">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
`)
|
||||
//line index.qtpl:56
|
||||
}
|
||||
//line index.qtpl:56
|
||||
qw422016.N().S(`
|
||||
|
||||
</div>
|
||||
`)
|
||||
//line index.qtpl:59
|
||||
}
|
||||
|
||||
//line index.qtpl:59
|
||||
func (p *IndexPage) WriteBody(qq422016 qtio422016.Writer) {
|
||||
//line index.qtpl:59
|
||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||
//line index.qtpl:59
|
||||
p.StreamBody(qw422016)
|
||||
//line index.qtpl:59
|
||||
qt422016.ReleaseWriter(qw422016)
|
||||
//line index.qtpl:59
|
||||
}
|
||||
|
||||
//line index.qtpl:59
|
||||
func (p *IndexPage) Body() string {
|
||||
//line index.qtpl:59
|
||||
qb422016 := qt422016.AcquireByteBuffer()
|
||||
//line index.qtpl:59
|
||||
p.WriteBody(qb422016)
|
||||
//line index.qtpl:59
|
||||
qs422016 := string(qb422016.B)
|
||||
//line index.qtpl:59
|
||||
qt422016.ReleaseByteBuffer(qb422016)
|
||||
//line index.qtpl:59
|
||||
return qs422016
|
||||
//line index.qtpl:59
|
||||
}
|
||||
Reference in New Issue
Block a user