From 3b9ca37baa1976826bc1d88252e08dda85a1d9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Tue, 11 Feb 2025 13:44:53 +0100 Subject: [PATCH] Field position management --- controllers/contacts.go | 8 ++-- controllers/fields.go | 101 +++++++++++++++++++++++++++++++++++++++- controllers/members.go | 8 ++-- main.go | 2 + models/fields.go | 1 + views/fields.html | 30 +++++++++++- 6 files changed, 138 insertions(+), 12 deletions(-) diff --git a/controllers/contacts.go b/controllers/contacts.go index 8b0fa3c..a0d0ae1 100644 --- a/controllers/contacts.go +++ b/controllers/contacts.go @@ -278,7 +278,7 @@ func ContactsExport(c *fiber.Ctx) error { } var fields []models.Field - db.Order("name collate nocase asc").Preload( + db.Order("position asc").Preload( "List", ).Find( &fields, "person_type = ?", "contact", @@ -465,7 +465,7 @@ func ContactShow(c *fiber.Ctx) error { ) var fields []models.Field - db.Order("name collate nocase asc").Preload( + db.Order("position asc").Preload( "List", ).Find( &fields, "person_type = ?", "contact", @@ -528,7 +528,7 @@ func ContactAdd(c *fiber.Ctx) error { var fields []models.Field db.Preload("List").Preload("List.ListItems").Order( - "name collate nocase asc", + "position asc", ).Find( &fields, "person_type = ?", "contact", ) @@ -774,7 +774,7 @@ func ContactEdit(c *fiber.Ctx) error { var fields []models.Field db.Preload("List").Preload("List.ListItems").Order( - "name collate nocase asc", + "position asc", ).Find( &fields, "person_type = ?", "contact", ) diff --git a/controllers/fields.go b/controllers/fields.go index 8012765..9507880 100644 --- a/controllers/fields.go +++ b/controllers/fields.go @@ -18,7 +18,7 @@ func Fields(c *fiber.Ctx) error { } var fields []models.Field - result := db.Order("name collate nocase asc").Find(&fields) + result := db.Order("position asc").Find(&fields) if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { return err @@ -111,8 +111,18 @@ func FieldAdd(c *fiber.Ctx) error { } } + var lastPosition models.Field + result := db.Order("position desc").First( + &lastPosition, "person_type = ?", field.PersonType, + ) + + field.Position = 0 + if result.RowsAffected > 0 && lastPosition.Position >= 0 { + field.Position = lastPosition.Position + 1 + } + if len(errors) == 0 { - result := db.Create(&field) + result = db.Create(&field) if result.Error != nil { return result.Error } @@ -193,10 +203,97 @@ func FieldDelete(c *fiber.Ctx) error { return err } + var field models.Field + db.Find(&field, "id = ?", id) + result := db.Delete(&models.Field{}, id) if result.Error != nil { return result.Error } + if field.ID > 0 { + db.Exec( + "UPDATE fields SET position = position - 1 WHERE position > ? AND person_type = ?", + field.Position, field.PersonType, + ) + } + + return c.Redirect("/admin/fields") +} + +func FieldMoveUp(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var field models.Field + result := db.Find(&field, "id = ?", id) + + if result.Error != nil { + return result.Error + } + + if result.RowsAffected < 1 { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + if field.Position == 0 { + return c.Redirect("/admin/fields") + } + + db.Exec( + "UPDATE fields SET position = position + 1 WHERE position = ? AND person_type = ?", + field.Position-1, field.PersonType, + ) + + db.Exec( + "UPDATE fields SET position = position - 1 WHERE id = ?", + field.ID, + ) + + return c.Redirect("/admin/fields") +} + +func FieldMoveDown(c *fiber.Ctx) error { + id := c.Params("id") + + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var field models.Field + result := db.Find(&field, "id = ?", id) + + if result.Error != nil { + return result.Error + } + + if result.RowsAffected < 1 { + return fiber.NewError(fiber.StatusNotFound, "Not found") + } + + var lastPosition models.Field + result = db.Order("position desc").First( + &lastPosition, "person_type = ?", field.PersonType, + ) + + if result.RowsAffected <= 0 || field.Position >= lastPosition.Position { + return c.Redirect("/admin/fields") + } + + db.Exec( + "UPDATE fields SET position = position - 1 WHERE position = ? AND person_type = ?", + field.Position+1, field.PersonType, + ) + + db.Exec( + "UPDATE fields SET position = position + 1 WHERE id = ?", + field.ID, + ) + return c.Redirect("/admin/fields") } diff --git a/controllers/members.go b/controllers/members.go index 5a266cc..7439065 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -291,7 +291,7 @@ func MembersExport(c *fiber.Ctx) error { } var fields []models.Field - db.Order("name collate nocase asc").Preload( + db.Order("position asc").Preload( "List", ).Find( &fields, "person_type = ?", "member", @@ -478,7 +478,7 @@ func MemberShow(c *fiber.Ctx) error { ) var fields []models.Field - db.Order("name collate nocase asc").Preload( + db.Order("position asc").Preload( "List", ).Find( &fields, "person_type = ?", "member", @@ -541,7 +541,7 @@ func MemberAdd(c *fiber.Ctx) error { var fields []models.Field db.Preload("List").Preload("List.ListItems").Order( - "name collate nocase asc", + "position asc", ).Find( &fields, "person_type = ?", "member", ) @@ -787,7 +787,7 @@ func MemberEdit(c *fiber.Ctx) error { var fields []models.Field db.Preload("List").Preload("List.ListItems").Order( - "name collate nocase asc", + "position asc", ).Find( &fields, "person_type = ?", "member", ) diff --git a/main.go b/main.go index 6fc3ae0..2765d64 100644 --- a/main.go +++ b/main.go @@ -204,6 +204,8 @@ func main() { app.Get("/admin/fields/:id/edit", controllers.FieldEdit) app.Post("/admin/fields/:id/edit", controllers.FieldEdit) app.Post("/admin/fields/:id/delete", controllers.FieldDelete) + app.Get("/admin/fields/:id/move-up", controllers.FieldMoveUp) + app.Get("/admin/fields/:id/move-down", controllers.FieldMoveDown) // Admin: Users app.Get("/admin/users", controllers.Users) diff --git a/models/fields.go b/models/fields.go index aab1f17..0df335a 100644 --- a/models/fields.go +++ b/models/fields.go @@ -13,6 +13,7 @@ type Field struct { FieldType string ListID uint List List + Position int } type FieldValue struct { diff --git a/views/fields.html b/views/fields.html index ebc65e3..aa84618 100644 --- a/views/fields.html +++ b/views/fields.html @@ -25,8 +25,9 @@ - + + @@ -45,6 +46,18 @@ {% endif %} {% endfor %} + {% endif %} {% endfor %} @@ -57,8 +70,9 @@
NomNom Type de champ
+ +
- + + @@ -77,6 +91,18 @@ {% endif %} {% endfor %} + {% endif %} {% endfor %}
NomNom Type de champ
+ +