Members: optional fields

This commit is contained in:
William Bouzourène 2025-01-16 16:30:30 +01:00
parent 7d550ac23c
commit 356bb9a936
Signed by: bouzoure
SSH key fingerprint: SHA256:19MbXpLua4rUtk8tunMesD8KUKb91LXLHg8E/qTooww
3 changed files with 336 additions and 67 deletions

View file

@ -4,6 +4,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"strconv" "strconv"
"time"
"git.readonly.ch/bouzoure/pop-camarades/helpers" "git.readonly.ch/bouzoure/pop-camarades/helpers"
"git.readonly.ch/bouzoure/pop-camarades/models" "git.readonly.ch/bouzoure/pop-camarades/models"
@ -77,7 +78,9 @@ func MemberShow(c *fiber.Ctx) error {
) )
var fields []models.Field var fields []models.Field
db.Order("name collate nocase asc").Find( db.Order("name collate nocase asc").Preload(
"List",
).Find(
&fields, "person_type = ?", "member", &fields, "person_type = ?", "member",
) )
@ -112,6 +115,13 @@ func MemberAdd(c *fiber.Ctx) error {
true, 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" { if c.Method() == "POST" {
data := PersonValidation{ data := PersonValidation{
LastName: c.FormValue("last_name"), LastName: c.FormValue("last_name"),
@ -190,19 +200,111 @@ func MemberAdd(c *fiber.Ctx) error {
result := db.Create(&person) result := db.Create(&person)
if result.Error != nil { if result.Error != nil {
return result.Error return result.Error
}
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 { } 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( c.Redirect(fmt.Sprintf(
"/members/%d", "/members/%d",
person.ID, person.ID,
)) ))
} }
} }
}
return c.Render("person_form", fiber.Map{ return c.Render("person_form", fiber.Map{
"PageTitle": "Ajouter un membre", "PageTitle": "Ajouter un membre",
"Person": person, "Person": person,
"Sections": sections, "Sections": sections,
"Fields": fields,
"Errors": errors, "Errors": errors,
}) })
} }
@ -239,6 +341,20 @@ func MemberEdit(c *fiber.Ctx) error {
true, 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 var errors []string
if c.Method() == "POST" { if c.Method() == "POST" {
data := PersonValidation{ data := PersonValidation{
@ -314,32 +430,116 @@ func MemberEdit(c *fiber.Ctx) error {
errors = append(errors, "La section est introuvable") 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 { if len(errors) == 0 {
result := db.Save(&person) result := db.Save(&person)
if result.Error != nil { if result.Error != nil {
return result.Error return result.Error
} else { }
c.Redirect(fmt.Sprintf( c.Redirect(fmt.Sprintf(
"/members/%d", "/members/%d",
person.ID, 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{ return c.Render("person_form", fiber.Map{
"PageTitle": title, "PageTitle": title,
@ -434,6 +634,14 @@ func MemberPurge(c *fiber.Ctx) error {
} }
result := db.Unscoped().Delete( result := db.Unscoped().Delete(
&models.FieldValue{}, "person_id = ?", id,
)
if result.Error != nil {
return result.Error
}
result = db.Unscoped().Delete(
&models.Person{}, id, &models.Person{}, id,
) )

View file

@ -173,6 +173,8 @@
{{ Field.Name }} {{ Field.Name }}
</div> </div>
<div class="col-md-10"> <div class="col-md-10">
{% if Field.FieldType == "text" %}
<input <input
type="text" type="text"
class="form-control" class="form-control"
@ -181,26 +183,77 @@
{% for FieldValue in FieldValues %} {% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %} {% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ValueString.String }}"
{% 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 %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
> >
{% endif %}
{% if Field.FieldType == "longtext" %}
<textarea
type="text"
class="form-control"
disabled
readonly
rows="4"
>{% for FieldValue in FieldValues %}{% if FieldValue.FieldID == Field.ID %}{{ FieldValue.ValueString.String }}{% endif %}{% endfor %}</textarea>
{% endif %}
{% if Field.FieldType == "number" %}
<input
type="text"
class="form-control"
disabled
readonly
{% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ValueInt.Int64 }}"
{% endif %}
{% endfor %}
>
{% endif %}
{% if Field.FieldType == "date" %}
<input
type="text"
class="form-control"
disabled
readonly
{% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ValueDate.Time|date:"02.01.2006" }}"
{% endif %}
{% endfor %}
>
{% endif %}
{% if Field.FieldType == "list" and Field.List.Multi %}
{% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %}
<div class="mb-1">
&mdash; {{ FieldValue.ListItem.Value }}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% if Field.FieldType == "list" and !Field.List.Multi %}
<input
type="text"
class="form-control"
disabled
readonly
{% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ListItem.Value }}"
{% endif %}
{% endfor %}
>
{% endif %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
@ -209,6 +262,7 @@
{% if Person.IsMember %} {% if Person.IsMember %}
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
{% if !Person.DeletedAt.Valid %}
<a class="btn btn-md btn-primary" href="/members/{{ Person.ID }}/edit"> <a class="btn btn-md btn-primary" href="/members/{{ Person.ID }}/edit">
<i class="bi-pencil-square"></i> <i class="bi-pencil-square"></i>
Modifier Modifier
@ -223,6 +277,7 @@
Convertir en contact Convertir en contact
</button> </button>
</form> </form>
{% endif %}
</div> </div>
<div class="col-md-6 text-md-end mt-2 mt-md-0"> <div class="col-md-6 text-md-end mt-2 mt-md-0">
{% if Person.DeletedAt.Valid %} {% if Person.DeletedAt.Valid %}

View file

@ -225,22 +225,22 @@
{% for Field in Fields %} {% for Field in Fields %}
<div class="row mb-3"> <div class="row mb-3">
<label for="field_{{ Field.ID }}" class="form-label col-md-2"> <label for="field-{{ Field.ID }}" class="form-label col-md-2">
{{ Field.Name }} {{ Field.Name }}
</label> </label>
<div class="col-md-10"> <div class="col-md-10">
{% if Field.FieldType == "text" %} {% if Field.FieldType == "text" %}
<input <input
id="field_{{ Field.ID }}" id="field-{{ Field.ID }}"
class="form-control" class="form-control"
type="text" type="text"
name="field_{{ Field.ID }}" name="field-{{ Field.ID }}"
autocomplete="off" autocomplete="off"
{% for FieldValue in FieldValues %} {% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %} {% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ValueString }}" value="{{ FieldValue.ValueString.String }}"
{% endif %} {% endif %}
{% endfor %} {% endfor %}
> >
@ -248,25 +248,25 @@
{% if Field.FieldType == "longtext" %} {% if Field.FieldType == "longtext" %}
<textarea <textarea
id="field_{{ Field.ID }}" id="field-{{ Field.ID }}"
class="form-control" class="form-control"
name="field_{{ Field.ID }}" name="field-{{ Field.ID }}"
rows="4" rows="4"
autocomplete="off" autocomplete="off"
>{% for FieldValue in FieldValues %}{% if FieldValue.FieldID == Field.ID %}{{ FieldValue.ValueString }}{% endif %}{% endfor %}</textarea> >{% for FieldValue in FieldValues %}{% if FieldValue.FieldID == Field.ID %}{{ FieldValue.ValueString.String }}{% endif %}{% endfor %}</textarea>
{% endif %} {% endif %}
{% if Field.FieldType == "number" %} {% if Field.FieldType == "number" %}
<input <input
id="field_{{ Field.ID }}" id="field-{{ Field.ID }}"
class="form-control" class="form-control"
type="number" type="number"
name="field_{{ Field.ID }}" name="field-{{ Field.ID }}"
autocomplete="off" autocomplete="off"
{% for FieldValue in FieldValues %} {% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %} {% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ValueInt }}" value="{{ FieldValue.ValueInt.Int64 }}"
{% endif %} {% endif %}
{% endfor %} {% endfor %}
> >
@ -274,15 +274,15 @@
{% if Field.FieldType == "date" %} {% if Field.FieldType == "date" %}
<input <input
id="field_{{ Field.ID }}" id="field-{{ Field.ID }}"
class="form-control" class="form-control"
type="date" type="date"
name="field_{{ Field.ID }}" name="field-{{ Field.ID }}"
autocomplete="off" autocomplete="off"
{% for FieldValue in FieldValues %} {% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID %} {% if FieldValue.FieldID == Field.ID %}
value="{{ FieldValue.ValueDate }}" value="{{ FieldValue.ValueDate.Time|date:"2006-01-02" }}"
{% endif %} {% endif %}
{% endfor %} {% endfor %}
> >
@ -290,9 +290,9 @@
{% if Field.FieldType == "list" and !Field.List.Multi %} {% if Field.FieldType == "list" and !Field.List.Multi %}
<select <select
id="field_{{ Field.ID }}" id="field-{{ Field.ID }}"
class="form-select" class="form-select"
name="field_{{ Field.ID }}" name="field-{{ Field.ID }}"
autocomplete="off" autocomplete="off"
> >
<option value="0">--- Aucun ---</option> <option value="0">--- Aucun ---</option>
@ -318,12 +318,18 @@
<input <input
type="checkbox" type="checkbox"
class="form-check-input me-2" class="form-check-input me-2"
id="field_{{ Field.ID }}_{{ ListItem.ID }}" id="field-{{ Field.ID }}-{{ ListItem.ID }}"
name="field_{{ Field.ID }}_{{ ListItem.ID }}" name="field-{{ Field.ID }}-{{ ListItem.ID }}"
autocomplete="off" autocomplete="off"
{% for FieldValue in FieldValues %}
{% if FieldValue.FieldID == Field.ID and FieldValue.ListItemID == ListItem.ID %}
checked
{% endif %}
{% endfor %}
> >
<label <label
for="field_{{ Field.ID }}_{{ ListItem.ID }}" for="field-{{ Field.ID }}-{{ ListItem.ID }}"
class="form-label" class="form-label"
> >
{{ ListItem.Value }} {{ ListItem.Value }}