Field position management

This commit is contained in:
William Bouzourène 2025-02-11 13:44:53 +01:00
parent bc8a7d5fee
commit 3b9ca37baa
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
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",
)

View file

@ -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")
}

View file

@ -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",
)

View file

@ -204,6 +204,8 @@ func main() {
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)>/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
app.Get("/admin/users", controllers.Users)

View file

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

View file

@ -25,8 +25,9 @@
<table class="table">
<thead>
<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"></th>
</tr>
</thead>
<tbody>
@ -45,6 +46,18 @@
{% endif %}
{% endfor %}
</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>
{% endif %}
{% endfor %}
@ -57,8 +70,9 @@
<table class="table">
<thead>
<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"></th>
</tr>
</thead>
<tbody>
@ -77,6 +91,18 @@
{% endif %}
{% endfor %}
</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>
{% endif %}
{% endfor %}