Members: optional fields

This commit is contained in:
William Bouzourène 2025-01-16 16:30:30 +01:00
parent 6f3b7c6dc3
commit 93467df92f
3 changed files with 336 additions and 67 deletions

View file

@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"strconv"
"time"
"git.readonly.ch/bouzoure/pop-camarades/helpers"
"git.readonly.ch/bouzoure/pop-camarades/models"
@ -77,7 +78,9 @@ func MemberShow(c *fiber.Ctx) error {
)
var fields []models.Field
db.Order("name collate nocase asc").Find(
db.Order("name collate nocase asc").Preload(
"List",
).Find(
&fields, "person_type = ?", "member",
)
@ -112,6 +115,13 @@ func MemberAdd(c *fiber.Ctx) error {
true,
)
var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc",
).Find(
&fields, "person_type = ?", "member",
)
if c.Method() == "POST" {
data := PersonValidation{
LastName: c.FormValue("last_name"),
@ -190,12 +200,103 @@ func MemberAdd(c *fiber.Ctx) error {
result := db.Create(&person)
if result.Error != nil {
return result.Error
} else {
c.Redirect(fmt.Sprintf(
"/members/%d",
person.ID,
))
}
for _, field := range fields {
if field.List.Multi {
for _, listItem := range field.List.ListItems {
key := fmt.Sprintf("field-%d-%d", field.ID, listItem.ID)
value := c.FormValue(key)
if value == "on" {
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
fieldValue.ListItemID = listItem.ID
db.Create(&fieldValue)
}
}
} else {
key := fmt.Sprintf("field-%d", field.ID)
value := c.FormValue(key)
if (field.FieldType == "text" || field.FieldType == "longtext") && len(value) > 0 {
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
err = fieldValue.ValueString.Scan(value)
if err != nil {
continue
}
db.Create(&fieldValue)
}
if field.FieldType == "number" && len(value) > 0 {
valueInt, err := strconv.ParseInt(value, 10, 0)
if err != nil {
continue
}
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
err = fieldValue.ValueInt.Scan(valueInt)
if err != nil {
continue
}
db.Create(&fieldValue)
}
if field.FieldType == "date" && len(value) > 0 {
valueDate, err := time.Parse("2006-01-02", value)
if err != nil {
continue
}
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
err = fieldValue.ValueDate.Scan(valueDate)
if err != nil {
continue
}
db.Create(&fieldValue)
}
if field.FieldType == "list" && len(value) > 0 {
valueInt, err := strconv.ParseUint(value, 10, 0)
if err != nil {
continue
}
found := false
for _, listItem := range field.List.ListItems {
if listItem.ID == uint(valueInt) {
found = true
}
}
if found {
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
fieldValue.ListItemID = uint(valueInt)
db.Create(&fieldValue)
}
}
}
}
c.Redirect(fmt.Sprintf(
"/members/%d",
person.ID,
))
}
}
@ -203,6 +304,7 @@ func MemberAdd(c *fiber.Ctx) error {
"PageTitle": "Ajouter un membre",
"Person": person,
"Sections": sections,
"Fields": fields,
"Errors": errors,
})
}
@ -239,6 +341,20 @@ func MemberEdit(c *fiber.Ctx) error {
true,
)
var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc",
).Find(
&fields, "person_type = ?", "member",
)
var fieldValues []models.FieldValue
db.Preload("ListItem").Find(
&fieldValues,
"person_id = ?",
person.ID,
)
var errors []string
if c.Method() == "POST" {
data := PersonValidation{
@ -314,33 +430,117 @@ func MemberEdit(c *fiber.Ctx) error {
errors = append(errors, "La section est introuvable")
}
for _, field := range fields {
db.Delete(
&models.FieldValue{},
"person_id = ? AND field_id = ?",
person.ID,
field.ID,
)
if field.List.Multi {
for _, listItem := range field.List.ListItems {
key := fmt.Sprintf("field-%d-%d", field.ID, listItem.ID)
value := c.FormValue(key)
if value == "on" {
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
fieldValue.ListItemID = listItem.ID
db.Create(&fieldValue)
}
}
} else {
key := fmt.Sprintf("field-%d", field.ID)
value := c.FormValue(key)
if (field.FieldType == "text" || field.FieldType == "longtext") && len(value) > 0 {
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
err = fieldValue.ValueString.Scan(value)
if err != nil {
continue
}
db.Create(&fieldValue)
}
if field.FieldType == "number" && len(value) > 0 {
valueInt, err := strconv.ParseInt(value, 10, 0)
if err != nil {
continue
}
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
err = fieldValue.ValueInt.Scan(valueInt)
if err != nil {
continue
}
db.Create(&fieldValue)
}
if field.FieldType == "date" && len(value) > 0 {
valueDate, err := time.Parse("2006-01-02", value)
if err != nil {
continue
}
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
err = fieldValue.ValueDate.Scan(valueDate)
if err != nil {
continue
}
db.Create(&fieldValue)
}
if field.FieldType == "list" && len(value) > 0 {
valueInt, err := strconv.ParseUint(value, 10, 0)
if err != nil {
continue
}
found := false
for _, listItem := range field.List.ListItems {
if listItem.ID == uint(valueInt) {
found = true
}
}
if found {
var fieldValue models.FieldValue
fieldValue.FieldID = field.ID
fieldValue.PersonID = person.ID
fieldValue.ListItemID = uint(valueInt)
db.Create(&fieldValue)
}
}
}
}
if len(errors) == 0 {
result := db.Save(&person)
if result.Error != nil {
return result.Error
} else {
c.Redirect(fmt.Sprintf(
"/members/%d",
person.ID,
))
}
c.Redirect(fmt.Sprintf(
"/members/%d",
person.ID,
))
}
}
var fields []models.Field
db.Preload("List").Preload("List.ListItems").Order(
"name collate nocase asc",
).Find(
&fields, "person_type = ?", "member",
)
var fieldValues []models.FieldValue
db.Preload("ListItem").Find(
&fieldValues,
"person_id = ?",
person.ID,
)
return c.Render("person_form", fiber.Map{
"PageTitle": title,
"Person": person,
@ -434,6 +634,14 @@ func MemberPurge(c *fiber.Ctx) error {
}
result := db.Unscoped().Delete(
&models.FieldValue{}, "person_id = ?", id,
)
if result.Error != nil {
return result.Error
}
result = db.Unscoped().Delete(
&models.Person{}, id,
)