Field position management
This commit is contained in:
parent
bc8a7d5fee
commit
3b9ca37baa
6 changed files with 138 additions and 12 deletions
|
|
@ -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",
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
)
|
)
|
||||||
|
|
|
||||||
2
main.go
2
main.go
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 %}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue