From 28662ed965938f78777cf1f3989eb816ff6a965e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Tue, 31 Dec 2024 16:19:19 +0100 Subject: [PATCH] Admin: Gestion des listes --- controllers/home.go | 7 +- controllers/lists.go | 293 ++++++++++++++++++++++++++++++++++++- main.go | 11 +- models/lists.go | 2 +- static/functions.js | 11 ++ views/admin.html | 50 +++++++ views/index.html | 29 +++- views/layouts/main.html | 6 +- views/list.html | 98 +++++++++++++ views/list_form.html | 19 ++- views/listitem_form.html | 71 +++++++++ views/lists.html | 32 +++- views/partials/header.html | 5 + 13 files changed, 605 insertions(+), 29 deletions(-) create mode 100644 static/functions.js create mode 100644 views/admin.html create mode 100644 views/list.html create mode 100644 views/listitem_form.html diff --git a/controllers/home.go b/controllers/home.go index 01b46df..733e973 100644 --- a/controllers/home.go +++ b/controllers/home.go @@ -5,6 +5,11 @@ import "github.com/gofiber/fiber/v2" func Homepage(c *fiber.Ctx) error { return c.Render("index", fiber.Map{ "PageTitle": "Accueil", - "Title": "Hello, World!", + }) +} + +func Admin(c *fiber.Ctx) error { + return c.Render("admin", fiber.Map{ + "PageTitle": "Administration", }) } diff --git a/controllers/lists.go b/controllers/lists.go index c7fcb4c..b958c1e 100644 --- a/controllers/lists.go +++ b/controllers/lists.go @@ -30,7 +30,37 @@ func Lists(c *fiber.Ctx) error { } func ListShow(c *fiber.Ctx) error { - return c.SendString("ListShow") + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var list models.List + result := db.Find(&list, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + title := fmt.Sprintf( + "%s | Listes", + list.Name, + ) + + var listItems []models.ListItem + db.Find(&listItems, "list_id = ?", id) + + return c.Render("list", fiber.Map{ + "PageTitle": title, + "List": list, + "ListItems": listItems, + }) } func ListAdd(c *fiber.Ctx) error { @@ -77,21 +107,272 @@ func ListAdd(c *fiber.Ctx) error { } func ListEdit(c *fiber.Ctx) error { - return c.SendString("ListEdit") + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var list models.List + result := db.Find(&list, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + title := fmt.Sprintf( + "%s | Modifier liste", + list.Name, + ) + + var errors []string + if c.Method() == "POST" { + multiOriginal := list.Multi + + name := c.FormValue("name") + multi := c.FormValue("multi") + + if len(name) > 100 || len(name) < 1 { + errors = append(errors, "Le nom doit avoir entre 1 et 100 caractères") + } + + list.Name = name + list.Multi = false + if multi == "on" { + list.Multi = true + } + + if len(errors) == 0 { + result := db.Save(&list) + if result.Error != nil { + return result.Error + } else { + if !list.Multi && multiOriginal { + var listItems []models.ListItem + result2 := db.Find(&listItems, + "list_id = ? AND `default` = ?", + list.ID, true, + ) + + if result2.RowsAffected > 1 { + db.Model(&models.ListItem{}).Where( + "list_id = ?", list.ID, + ).Update("default", false) + } + } + + c.Redirect(fmt.Sprintf( + "/admin/lists/%d", + list.ID, + )) + } + } + } + + return c.Render("list_form", fiber.Map{ + "PageTitle": title, + "List": list, + "Errors": errors, + }) } func ListDelete(c *fiber.Ctx) error { - return c.SendString("ListDelete") + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + result := db.Delete(&models.List{}, id) + if result.Error != nil { + return err + } + + return c.Redirect("/admin/lists") } func ListItemAdd(c *fiber.Ctx) error { - return c.SendString("ListItemAdd") + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var list models.List + result := db.Find(&list, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + title := fmt.Sprintf( + "%s | Ajouter un élément à la liste", + list.Name, + ) + + listItem := models.ListItem{ + ListID: list.ID, + } + var errors []string + + if c.Method() == "POST" { + value := c.FormValue("value") + isDefault := c.FormValue("default") + + if len(value) > 100 || len(value) < 1 { + errors = append(errors, "La valeur doit avoir entre 1 et 100 caractères") + } + + listItem.Value = value + listItem.Default = false + if isDefault == "on" { + listItem.Default = true + } + + if len(errors) == 0 { + result := db.Create(&listItem) + if result.Error != nil { + return result.Error + } else { + if listItem.Default && !list.Multi { + db.Model(&models.ListItem{}).Where( + "list_id = ? AND id <> ?", + list.ID, listItem.ID, + ).Update("default", false) + } + + c.Redirect(fmt.Sprintf( + "/admin/lists/%d", + list.ID, + )) + } + } + } + + return c.Render("listitem_form", fiber.Map{ + "PageTitle": title, + "List": list, + "ListItem": listItem, + "Errors": errors, + }) } func ListItemEdit(c *fiber.Ctx) error { - return c.SendString("ListItemEdit") + id := c.Params("id") + itemid := c.Params("itemid") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var list models.List + result := db.Find(&list, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + var listItem models.ListItem + result2 := db.Find(&listItem, "id = ?", itemid) + + if errors.Is(result2.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result2.Error != nil { + return err + } + + title := fmt.Sprintf( + "%s | Modifier un élément de la liste", + list.Name, + ) + + var errors []string + if c.Method() == "POST" { + value := c.FormValue("value") + isDefault := c.FormValue("default") + + if len(value) > 100 || len(value) < 1 { + errors = append(errors, "La valeur doit avoir entre 1 et 100 caractères") + } + + listItem.Value = value + listItem.Default = false + if isDefault == "on" { + listItem.Default = true + } + + if len(errors) == 0 { + result3 := db.Save(&listItem) + if result3.Error != nil { + return result3.Error + } else { + if listItem.Default && !list.Multi { + db.Model(&models.ListItem{}).Where( + "list_id = ? AND id <> ?", + list.ID, listItem.ID, + ).Update("default", false) + } + + c.Redirect(fmt.Sprintf( + "/admin/lists/%d", + list.ID, + )) + } + } + } + + return c.Render("listitem_form", fiber.Map{ + "PageTitle": title, + "List": list, + "ListItem": listItem, + "Errors": errors, + }) } func ListItemDelete(c *fiber.Ctx) error { - return c.SendString("ListItemDelete") + id := c.Params("id") + itemid := c.Params("itemid") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var list models.List + result := db.Find(&list, "id = ?", id) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if result.Error != nil { + return err + } + + result2 := db.Delete(&models.ListItem{}, itemid) + if result2.Error != nil { + return err + } + + return c.Redirect(fmt.Sprintf( + "/admin/lists/%d", list.ID, + )) } diff --git a/main.go b/main.go index c228f2b..555efb2 100644 --- a/main.go +++ b/main.go @@ -93,8 +93,9 @@ func main() { app.Use(middlewares.TemplatesMiddleware) app.Use("/admin", middlewares.AuthzAdmin) - // Homepage + // Main pages app.Get("/", controllers.Homepage) + app.Get("/admin", controllers.Admin) // Login & logout app.Get("/login", controllers.LoginForm) @@ -118,12 +119,12 @@ func main() { app.Post("/admin/lists/add", controllers.ListAdd) app.Get("/admin/lists/:id/edit", controllers.ListEdit) app.Post("/admin/lists/:id/edit", controllers.ListEdit) - app.Delete("/admin/lists/:id", controllers.ListDelete) + app.Post("/admin/lists/:id/delete", controllers.ListDelete) app.Get("/admin/lists/:id/items/add", controllers.ListItemAdd) app.Post("/admin/lists/:id/items/add", controllers.ListItemAdd) - app.Get("/admin/lists/:id/items/:id", controllers.ListItemEdit) - app.Post("/admin/lists/:id/items/:id", controllers.ListItemEdit) - app.Delete("/admin/lists/:id/items/:id", controllers.ListItemDelete) + app.Get("/admin/lists/:id/items/:itemid", controllers.ListItemEdit) + app.Post("/admin/lists/:id/items/:itemid", controllers.ListItemEdit) + app.Post("/admin/lists/:id/items/:itemid/delete", controllers.ListItemDelete) listenAddr := fmt.Sprintf( "%s:%d", diff --git a/models/lists.go b/models/lists.go index e46e330..4145d02 100644 --- a/models/lists.go +++ b/models/lists.go @@ -11,7 +11,7 @@ type List struct { type ListItem struct { gorm.Model Value string - Default string + Default bool ListID uint List List } diff --git a/static/functions.js b/static/functions.js new file mode 100644 index 0000000..72c3a56 --- /dev/null +++ b/static/functions.js @@ -0,0 +1,11 @@ +$(document).ready(function() { + $(".areyousure").on("click", function(e) { + if(!confirm("Êtes-vous sûr ?")) { + e.preventDefault(); + } + }) +}); + +$(document).ready(function() { + feather.replace(); +}); \ No newline at end of file diff --git a/views/admin.html b/views/admin.html new file mode 100644 index 0000000..545cd3f --- /dev/null +++ b/views/admin.html @@ -0,0 +1,50 @@ +{% extends "layouts/main.html" %} + +{% block main %} + +{% endblock %} diff --git a/views/index.html b/views/index.html index 5cb0088..468c8f7 100644 --- a/views/index.html +++ b/views/index.html @@ -2,8 +2,14 @@ {% block main %}
-

Tableau de bord

-
+
+ +
+
@@ -22,6 +28,25 @@
+ + + {% if Globals.UserIsAdmin %} + + {% endif %}
{% endblock %} diff --git a/views/layouts/main.html b/views/layouts/main.html index 1729361..7f8e66b 100644 --- a/views/layouts/main.html +++ b/views/layouts/main.html @@ -28,11 +28,7 @@ - + {% block javascript %}{% endblock %} diff --git a/views/list.html b/views/list.html new file mode 100644 index 0000000..7f0b21e --- /dev/null +++ b/views/list.html @@ -0,0 +1,98 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ +
+ Nom
+ {{ List.Name }} +
+ +
+ Liste à choix multiples
+ {% if List.Multi %}Oui{% else %}Non{% endif %} +
+ +
+ + + Modifier + +
+ +
+
+ +
+ {% if ListItems %} + + + + + + + + + + {% for Item in ListItems %} + + + + + + {% endfor %} + +
ValeurPar défaut
+ + {{ Item.Value }} + + + {% if Item.Default %} + Oui + {% else %} + Non + {% endif %} + +
+ +
+
+ {% else %} +
+ Pas encore d'éléments dans cette liste. +
+ {% endif %} + + +
+{% endblock %} diff --git a/views/list_form.html b/views/list_form.html index 3678d43..a4fbb24 100644 --- a/views/list_form.html +++ b/views/list_form.html @@ -2,8 +2,23 @@ {% block main %}
-

Ajouter un liste

-
+
+ +
+
{% if Errors %}
diff --git a/views/listitem_form.html b/views/listitem_form.html new file mode 100644 index 0000000..2aa6d39 --- /dev/null +++ b/views/listitem_form.html @@ -0,0 +1,71 @@ +{% extends "layouts/main.html" %} + +{% block main %} +
+
+ +
+
+ + {% if Errors %} +
+
    + {% for Error in Errors %} +
  • {{ Error }}
  • + {% endfor %} +
+
+ {% endif %} + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+{% endblock %} diff --git a/views/lists.html b/views/lists.html index 541217c..98e9695 100644 --- a/views/lists.html +++ b/views/lists.html @@ -2,23 +2,41 @@ {% block main %}
-

Listes

-
+
+ +
+
{% if Lists %}
- +
+ + + + + + {% for List in Lists %} - + {% endfor %} diff --git a/views/partials/header.html b/views/partials/header.html index f5360b0..48a926f 100644 --- a/views/partials/header.html +++ b/views/partials/header.html @@ -67,6 +67,11 @@ Champs supplémentaires +
  • + + Utilisateurs + +
  • NomChoix multiples
    + {{ List.Name }} + {% if List.Multi %} + Oui + {% else %} + Non + {% endif %} +