diff options
-rw-r--r-- | dashboard.go | 28 | ||||
-rw-r--r-- | grilist/grilist.go | 1 | ||||
-rw-r--r-- | main.go | 11 | ||||
-rw-r--r-- | modules/grils/grils.go | 33 | ||||
-rw-r--r-- | modules/lists/lists.go | 63 | ||||
-rw-r--r-- | views/dashboard.html | 35 |
6 files changed, 159 insertions, 12 deletions
diff --git a/dashboard.go b/dashboard.go index 221e923..aa6405c 100644 --- a/dashboard.go +++ b/dashboard.go | |||
@@ -1,3 +1,29 @@ | |||
1 | package main | 1 | package main |
2 | 2 | ||
3 | import () | 3 | import ( |
4 | "net/http" | ||
5 | "fagott.pw/grilist/grilist" | ||
6 | "github.com/julienschmidt/httprouter" | ||
7 | ) | ||
8 | |||
9 | func viewDashboard(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { | ||
10 | user, err := app.Charakterin.GetUserFromRequest(r) | ||
11 | if err != nil { | ||
12 | http.Redirect(w, r, "/", 302) | ||
13 | return | ||
14 | } | ||
15 | |||
16 | var categories []grilist.DashboardCategory | ||
17 | |||
18 | for _, module := range app.Modules { | ||
19 | category := module.ProvideDashboardData(user) | ||
20 | |||
21 | if len(category.Cards) > 0 { | ||
22 | categories = append(categories, category) | ||
23 | } | ||
24 | } | ||
25 | |||
26 | data := make(map[string]interface{}) | ||
27 | data["categories"] = categories | ||
28 | app.Renderer.RenderPage("dashboard", w, data) | ||
29 | } \ No newline at end of file | ||
diff --git a/grilist/grilist.go b/grilist/grilist.go index c672dec..b166966 100644 --- a/grilist/grilist.go +++ b/grilist/grilist.go | |||
@@ -23,6 +23,7 @@ type Grilist struct { | |||
23 | // Module ist ein Modul für Grilist. | 23 | // Module ist ein Modul für Grilist. |
24 | type Module interface { | 24 | type Module interface { |
25 | Init(*Grilist) | 25 | Init(*Grilist) |
26 | Interface() interface{} | ||
26 | Name() string | 27 | Name() string |
27 | ProvideDashboardData(*charakterin.User) DashboardCategory | 28 | ProvideDashboardData(*charakterin.User) DashboardCategory |
28 | } | 29 | } |
@@ -10,6 +10,7 @@ import ( | |||
10 | "fagott.pw/grilist/frontend" | 10 | "fagott.pw/grilist/frontend" |
11 | "fagott.pw/grilist/grilist" | 11 | "fagott.pw/grilist/grilist" |
12 | "fagott.pw/grilist/modules/lists" | 12 | "fagott.pw/grilist/modules/lists" |
13 | "fagott.pw/grilist/modules/grils" | ||
13 | 14 | ||
14 | "github.com/julienschmidt/httprouter" | 15 | "github.com/julienschmidt/httprouter" |
15 | _ "github.com/lib/pq" | 16 | _ "github.com/lib/pq" |
@@ -18,16 +19,13 @@ import ( | |||
18 | var app *grilist.Grilist | 19 | var app *grilist.Grilist |
19 | 20 | ||
20 | func index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { | 21 | func index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { |
21 | user, err := app.Charakterin.GetUserFromRequest(r) | 22 | _, err := app.Charakterin.GetUserFromRequest(r) |
22 | if err != nil { | 23 | if err != nil { |
23 | http.Redirect(w, r, "/login", 302) | 24 | http.Redirect(w, r, "/login", 302) |
24 | return | 25 | return |
25 | } | 26 | } |
26 | 27 | ||
27 | data := make(map[string]interface{}) | 28 | http.Redirect(w, r, "/dashboard", 302) |
28 | |||
29 | data["username"] = user.GetName() | ||
30 | app.Renderer.RenderPage("index", w, data) | ||
31 | } | 29 | } |
32 | 30 | ||
33 | func loadModule(mod grilist.Module) error { | 31 | func loadModule(mod grilist.Module) error { |
@@ -35,6 +33,7 @@ func loadModule(mod grilist.Module) error { | |||
35 | return fmt.Errorf("module with name %s already exists", mod.Name()) | 33 | return fmt.Errorf("module with name %s already exists", mod.Name()) |
36 | } | 34 | } |
37 | app.Modules[mod.Name()] = mod | 35 | app.Modules[mod.Name()] = mod |
36 | mod.Init(app) | ||
38 | return nil | 37 | return nil |
39 | } | 38 | } |
40 | 39 | ||
@@ -71,12 +70,14 @@ func main() { | |||
71 | router.HandlerFunc("GET", "/register", login.DisplayRegistration) | 70 | router.HandlerFunc("GET", "/register", login.DisplayRegistration) |
72 | router.HandlerFunc("POST", "/register", login.Register) | 71 | router.HandlerFunc("POST", "/register", login.Register) |
73 | router.GET("/", index) | 72 | router.GET("/", index) |
73 | router.GET("/dashboard", viewDashboard) | ||
74 | 74 | ||
75 | fs := http.FileServer(http.Dir("assets")) | 75 | fs := http.FileServer(http.Dir("assets")) |
76 | http.Handle("/assets/", http.StripPrefix("/assets/", fs)) | 76 | http.Handle("/assets/", http.StripPrefix("/assets/", fs)) |
77 | http.Handle("/", router) | 77 | http.Handle("/", router) |
78 | 78 | ||
79 | // Module laden | 79 | // Module laden |
80 | loadModule(grils.New()) | ||
80 | loadModule(lists.New()) | 81 | loadModule(lists.New()) |
81 | 82 | ||
82 | log.Fatal(http.ListenAndServe(":8080", nil)) | 83 | log.Fatal(http.ListenAndServe(":8080", nil)) |
diff --git a/modules/grils/grils.go b/modules/grils/grils.go new file mode 100644 index 0000000..6ce7c5e --- /dev/null +++ b/modules/grils/grils.go | |||
@@ -0,0 +1,33 @@ | |||
1 | package grils | ||
2 | |||
3 | import ( | ||
4 | "fagott.pw/charakterin" | ||
5 | "fagott.pw/grilist/grilist" | ||
6 | ) | ||
7 | |||
8 | type GrilsModule struct { | ||
9 | g *grilist.Grilist | ||
10 | Test []int | ||
11 | } | ||
12 | |||
13 | func (m *GrilsModule) Name() string { | ||
14 | return "Grils" | ||
15 | } | ||
16 | |||
17 | func (m *GrilsModule) Init(g *grilist.Grilist) { | ||
18 | m.g = g | ||
19 | m.Test = append(m.Test, len(m.Test) + 1) | ||
20 | } | ||
21 | |||
22 | func (m *GrilsModule) Interface() interface{} { | ||
23 | m.Test = append(m.Test, len(m.Test) + 1) | ||
24 | return m | ||
25 | } | ||
26 | |||
27 | func (m *GrilsModule) ProvideDashboardData(user *charakterin.User) grilist.DashboardCategory { | ||
28 | return grilist.DashboardCategory{} | ||
29 | } | ||
30 | |||
31 | func New() *GrilsModule { | ||
32 | return &GrilsModule{} | ||
33 | } | ||
diff --git a/modules/lists/lists.go b/modules/lists/lists.go index f8f13bb..4e0036a 100644 --- a/modules/lists/lists.go +++ b/modules/lists/lists.go | |||
@@ -2,23 +2,74 @@ package lists | |||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "fagott.pw/charakterin" | 4 | "fagott.pw/charakterin" |
5 | "fagott.pw/grilist/frontend" | ||
5 | "fagott.pw/grilist/grilist" | 6 | "fagott.pw/grilist/grilist" |
7 | "fagott.pw/grilist/modules/grils" | ||
8 | "log" | ||
6 | ) | 9 | ) |
7 | 10 | ||
8 | type ListsModule struct { | 11 | type ListsModule struct { |
9 | g *grilist.Grilist | 12 | g *grilist.Grilist |
13 | grils *grils.GrilsModule | ||
10 | } | 14 | } |
11 | 15 | ||
12 | func (d *ListsModule) Name() string { | 16 | type List struct { |
13 | return "ListsModule" | 17 | ID int |
18 | Name string | ||
19 | Description string | ||
20 | Owner *charakterin.User | ||
14 | } | 21 | } |
15 | 22 | ||
16 | func (d *ListsModule) Init(g *grilist.Grilist) { | 23 | func (m *ListsModule) Name() string { |
17 | d.g = g | 24 | return "Lists" |
18 | } | 25 | } |
19 | 26 | ||
20 | func (d *ListsModule) ProvideDashboardData(user *charakterin.User) grilist.DashboardCategory { | 27 | func (m *ListsModule) Init(g *grilist.Grilist) { |
21 | return grilist.DashboardCategory{} | 28 | m.g = g |
29 | |||
30 | gm, ok := g.Modules["Grils"] | ||
31 | if !ok { | ||
32 | log.Fatal("lists: grils module not found") | ||
33 | } | ||
34 | |||
35 | grilsModule, ok := gm.Interface().(*grils.GrilsModule) | ||
36 | if !ok { | ||
37 | log.Fatal("lists: error with grils module") | ||
38 | } | ||
39 | m.grils = grilsModule | ||
40 | } | ||
41 | |||
42 | func (m *ListsModule) Interface() interface{} { | ||
43 | return m | ||
44 | } | ||
45 | |||
46 | func (m *ListsModule) ProvideDashboardData(user *charakterin.User) grilist.DashboardCategory { | ||
47 | data := grilist.DashboardCategory{ | ||
48 | Title: "Meine Listen", | ||
49 | } | ||
50 | |||
51 | rows, err := m.g.DB.Query(`SELECT id, name, description FROM grilist.lists WHERE user_id = $1`, user.ID) | ||
52 | if err != nil { | ||
53 | return data | ||
54 | } | ||
55 | |||
56 | defer rows.Close() | ||
57 | for rows.Next() { | ||
58 | card := frontend.Card{} | ||
59 | view := frontend.Action{ | ||
60 | Name: "anguckieren", | ||
61 | } | ||
62 | var id int | ||
63 | if err := rows.Scan(&id, &card.Title, &card.Description); err != nil { | ||
64 | log.Println("error scanning row",err) | ||
65 | continue | ||
66 | } | ||
67 | |||
68 | card.Actions = []frontend.Action{view} | ||
69 | data.Cards = append(data.Cards, card) | ||
70 | } | ||
71 | |||
72 | return data | ||
22 | } | 73 | } |
23 | 74 | ||
24 | func New() *ListsModule { | 75 | func New() *ListsModule { |
diff --git a/views/dashboard.html b/views/dashboard.html new file mode 100644 index 0000000..67fb005 --- /dev/null +++ b/views/dashboard.html | |||
@@ -0,0 +1,35 @@ | |||
1 | {{ define "dashboard" }} | ||
2 | <html> | ||
3 | <head> | ||
4 | {{ template "materialize" }} | ||
5 | <title>grilist</title> | ||
6 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> | ||
7 | </head> | ||
8 | <body> | ||
9 | <div class="container"> | ||
10 | <div class="row"> | ||
11 | {{ range $category := .categories }} | ||
12 | <h2>{{ $category.Title }}</h2> | ||
13 | {{ range $card := $category.Cards }} | ||
14 | <div class="row"> | ||
15 | <div class="col s12 m6 l4"> | ||
16 | <div class="card white"> | ||
17 | <div class="card-content black-text"> | ||
18 | <span class="card-title">{{ $card.Title }}</span> | ||
19 | <p>{{ $card.Description }}</p> | ||
20 | </div> | ||
21 | <div class="card-action"> | ||
22 | {{ range $action := $card.Actions }} | ||
23 | <a href="{{ $action.Link }}">{{ $action.Name }}</a> | ||
24 | {{ end }} | ||
25 | </div> | ||
26 | </div> | ||
27 | </div> | ||
28 | </div> | ||
29 | {{ end }} | ||
30 | {{ end }} | ||
31 | </div> | ||
32 | </div> | ||
33 | </body> | ||
34 | </html> | ||
35 | {{ end }} \ No newline at end of file | ||