From 356bb9a93647c7196c5a8b860970982ffb4de67b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Thu, 16 Jan 2025 16:30:30 +0100 Subject: [PATCH] Members: optional fields --- controllers/members.go | 258 +++++++++++++++++++++++++++++++++++++---- views/person.html | 103 ++++++++++++---- views/person_form.html | 42 ++++--- 3 files changed, 336 insertions(+), 67 deletions(-) diff --git a/controllers/members.go b/controllers/members.go index d744dfb..c822791 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -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, ) diff --git a/views/person.html b/views/person.html index 07b39ae..0b22809 100644 --- a/views/person.html +++ b/views/person.html @@ -173,34 +173,87 @@ {{ Field.Name }}
- + {% endif %} + + {% if Field.FieldType == "longtext" %} + + {% endif %} + + {% if Field.FieldType == "number" %} + + {% endif %} + + {% if Field.FieldType == "date" %} + + {% endif %} + + {% if Field.FieldType == "list" and Field.List.Multi %} {% for FieldValue in FieldValues %} {% if FieldValue.FieldID == Field.ID %} - - {% if Field.FieldType == "text" or Field.FieldType == "longtext" %} - value="{{ FieldValue.ValueString }}" - {% endif %} - - {% if Field.FieldType == "number" %} - value="{{ FieldValue.ValueInt }}" - {% endif %} - - {% if Field.FieldType == "date" %} - value="{{ FieldValue.ValueDate }}" - {% endif %} - - {% if Field.FieldType == "list" %} - value="{{ FieldValue.ListItem.Value }}" - {% endif %} - +
+ — {{ FieldValue.ListItem.Value }} +
{% endif %} {% endfor %} - > + {% endif %} + + {% if Field.FieldType == "list" and !Field.List.Multi %} + + {% endif %} +
{% endfor %} @@ -209,6 +262,7 @@ {% if Person.IsMember %}
{% if Person.DeletedAt.Valid %} diff --git a/views/person_form.html b/views/person_form.html index 5cc6241..1dbbe5f 100644 --- a/views/person_form.html +++ b/views/person_form.html @@ -225,22 +225,22 @@ {% for Field in Fields %}
-