Field position management

This commit is contained in:
William Bouzourène 2025-02-11 13:44:53 +01:00
parent aaad6ae454
commit 03b1f92886
Signed by: bouzoure
SSH key fingerprint: SHA256:19MbXpLua4rUtk8tunMesD8KUKb91LXLHg8E/qTooww
6 changed files with 138 additions and 12 deletions

View file

@ -278,7 +278,7 @@ func ContactsExport(c *fiber.Ctx) error {
} }
var fields []models.Field var fields []models.Field
db.Order("name collate nocase asc").Preload( db.Order("position asc").Preload(
"List", "List",
).Find( ).Find(
&fields, "person_type = ?", "contact", &fields, "person_type = ?", "contact",
@ -465,7 +465,7 @@ func ContactShow(c *fiber.Ctx) error {
) )
var fields []models.Field var fields []models.Field
db.Order("name collate nocase asc").Preload( db.Order("position asc").Preload(
"List", "List",
).Find( ).Find(
&fields, "person_type = ?", "contact", &fields, "person_type = ?", "contact",
@ -528,7 +528,7 @@ func ContactAdd(c *fiber.Ctx) error {
var fields []models.Field var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order( db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc", "position asc",
).Find( ).Find(
&fields, "person_type = ?", "contact", &fields, "person_type = ?", "contact",
) )
@ -774,7 +774,7 @@ func ContactEdit(c *fiber.Ctx) error {
var fields []models.Field var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order( db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc", "position asc",
).Find( ).Find(
&fields, "person_type = ?", "contact", &fields, "person_type = ?", "contact",
) )

View file

@ -18,7 +18,7 @@ func Fields(c *fiber.Ctx) error {
} }
var fields []models.Field 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) { if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
return err 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 { if len(errors) == 0 {
result := db.Create(&field) result = db.Create(&field)
if result.Error != nil { if result.Error != nil {
return result.Error return result.Error
} }
@ -193,10 +203,97 @@ func FieldDelete(c *fiber.Ctx) error {
return err return err
} }
var field models.Field
db.Find(&field, "id = ?", id)
result := db.Delete(&models.Field{}, id) result := db.Delete(&models.Field{}, id)
if result.Error != nil { if result.Error != nil {
return result.Error 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") return c.Redirect("/admin/fields")
} }

View file

@ -291,7 +291,7 @@ func MembersExport(c *fiber.Ctx) error {
} }
var fields []models.Field var fields []models.Field
db.Order("name collate nocase asc").Preload( db.Order("position asc").Preload(
"List", "List",
).Find( ).Find(
&fields, "person_type = ?", "member", &fields, "person_type = ?", "member",
@ -478,7 +478,7 @@ func MemberShow(c *fiber.Ctx) error {
) )
var fields []models.Field var fields []models.Field
db.Order("name collate nocase asc").Preload( db.Order("position asc").Preload(
"List", "List",
).Find( ).Find(
&fields, "person_type = ?", "member", &fields, "person_type = ?", "member",
@ -541,7 +541,7 @@ func MemberAdd(c *fiber.Ctx) error {
var fields []models.Field var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order( db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc", "position asc",
).Find( ).Find(
&fields, "person_type = ?", "member", &fields, "person_type = ?", "member",
) )
@ -787,7 +787,7 @@ func MemberEdit(c *fiber.Ctx) error {
var fields []models.Field var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order( db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc", "position asc",
).Find( ).Find(
&fields, "person_type = ?", "member", &fields, "person_type = ?", "member",
) )

View file

@ -204,6 +204,8 @@ func main() {
app.Get("/admin/fields/:id<int;min(0)>/edit", controllers.FieldEdit) app.Get("/admin/fields/:id<int;min(0)>/edit", controllers.FieldEdit)
app.Post("/admin/fields/:id<int;min(0)>/edit", controllers.FieldEdit) app.Post("/admin/fields/:id<int;min(0)>/edit", controllers.FieldEdit)
app.Post("/admin/fields/:id<int;min(0)>/delete", controllers.FieldDelete) app.Post("/admin/fields/:id<int;min(0)>/delete", controllers.FieldDelete)
app.Get("/admin/fields/:id<int;min(0)>/move-up", controllers.FieldMoveUp)
app.Get("/admin/fields/:id<int;min(0)>/move-down", controllers.FieldMoveDown)
// Admin: Users // Admin: Users
app.Get("/admin/users", controllers.Users) app.Get("/admin/users", controllers.Users)

View file

@ -13,6 +13,7 @@ type Field struct {
FieldType string FieldType string
ListID uint ListID uint
List List List List
Position int
} }
type FieldValue struct { type FieldValue struct {

View file

@ -25,8 +25,9 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th class="w-75">Nom</th> <th class="w-50">Nom</th>
<th class="w-25">Type de champ</th> <th class="w-25">Type de champ</th>
<th class="w-25"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -45,6 +46,18 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</td> </td>
<td class="text-end">
<div class="btn-group">
<a class="btn btn-sm btn-outline-primary" href="/admin/fields/{{ Field.ID }}/move-up">
<i class="bi-arrow-up me-1"></i>
Monter
</a>
<a class="btn btn-sm btn-outline-primary" href="/admin/fields/{{ Field.ID }}/move-down">
<i class="bi-arrow-down me-1"></i>
Descendre
</a>
</div>
</td>
</tr> </tr>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@ -57,8 +70,9 @@
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th class="w-75">Nom</th> <th class="w-50">Nom</th>
<th class="w-25">Type de champ</th> <th class="w-25">Type de champ</th>
<th class="w-25"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -77,6 +91,18 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</td> </td>
<td class="text-end">
<div class="btn-group">
<a class="btn btn-sm btn-outline-primary" href="/admin/fields/{{ Field.ID }}/move-up">
<i class="bi-arrow-up me-1"></i>
Monter
</a>
<a class="btn btn-sm btn-outline-primary" href="/admin/fields/{{ Field.ID }}/move-down">
<i class="bi-arrow-down me-1"></i>
Descendre
</a>
</div>
</td>
</tr> </tr>
{% endif %} {% endif %}
{% endfor %} {% endfor %}