Members: optional fields
This commit is contained in:
parent
7d550ac23c
commit
356bb9a936
3 changed files with 336 additions and 67 deletions
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue