Merge recent UI & Postgres work into main branch #4

Merged
bouzoure merged 19 commits from postgres into main 2025-07-24 12:13:01 +02:00
4 changed files with 171 additions and 22 deletions
Showing only changes of commit 56a2d30189 - Show all commits

View file

@ -68,6 +68,9 @@ func Contacts(c *fiber.Ctx) error {
params.PageSize = 50 params.PageSize = 50
params.PersonType = "contacts" params.PersonType = "contacts"
params.OrderColumn = c.Query("c")
params.OrderDirection = c.Query("o")
var sections []models.Section var sections []models.Section
db.Order("name asc").Find(&sections, "contains_contacts = ? AND id IN ?", true, allowedSections) db.Order("name asc").Find(&sections, "contains_contacts = ? AND id IN ?", true, allowedSections)
params.AllowedSections = allowedSections params.AllowedSections = allowedSections
@ -100,6 +103,8 @@ func Contacts(c *fiber.Ctx) error {
"SearchJSON": searchJSON, "SearchJSON": searchJSON,
"Sections": sections, "Sections": sections,
"Fields": fields, "Fields": fields,
"OrderCol": params.OrderColumn,
"OrderDir": params.OrderDirection,
}) })
} }

View file

@ -83,6 +83,9 @@ func Members(c *fiber.Ctx) error {
params.PageSize = 50 params.PageSize = 50
params.PersonType = "members" params.PersonType = "members"
params.OrderColumn = c.Query("c")
params.OrderDirection = c.Query("o")
var sections []models.Section var sections []models.Section
db.Order("name asc").Find(&sections, "contains_members = ? AND id IN ?", true, allowedSections) db.Order("name asc").Find(&sections, "contains_members = ? AND id IN ?", true, allowedSections)
params.AllowedSections = allowedSections params.AllowedSections = allowedSections
@ -115,6 +118,8 @@ func Members(c *fiber.Ctx) error {
"SearchJSON": searchJSON, "SearchJSON": searchJSON,
"Sections": sections, "Sections": sections,
"Fields": fields, "Fields": fields,
"OrderCol": params.OrderColumn,
"OrderDir": params.OrderDirection,
}) })
} }

View file

@ -27,6 +27,8 @@ type PeopleSearchParams struct {
PageSize int `json:"-"` PageSize int `json:"-"`
PageNumber int `json:"-"` PageNumber int `json:"-"`
AllowedSections []uint `json:"-"` AllowedSections []uint `json:"-"`
OrderColumn string `json:"-"`
OrderDirection string `json:"-"`
} }
type PeopleSearchResults struct { type PeopleSearchResults struct {
@ -43,6 +45,27 @@ func PeopleSearch(params PeopleSearchParams) (PeopleSearchResults, error) {
return results, nil return results, nil
} }
if strings.EqualFold(params.OrderDirection, "DESC") {
params.OrderDirection = "DESC"
} else {
params.OrderDirection = "ASC"
}
switch strings.ToLower(params.OrderColumn) {
case "address":
params.OrderColumn = "people.address1"
case "npa":
params.OrderColumn = "people.postal_code"
case "section":
params.OrderColumn = "people.section_id"
case "created":
params.OrderColumn = "people.created_at"
case "updated":
params.OrderColumn = "people.updated_at"
default:
params.OrderColumn = "CONCAT(people.last_name, people.first_name)"
}
// SQL qeury for results // SQL qeury for results
sqlQuery := ` sqlQuery := `
SELECT people.* SELECT people.*
@ -353,9 +376,9 @@ func PeopleSearch(params PeopleSearchParams) (PeopleSearchResults, error) {
%s %s
%s %s
GROUP BY people.id GROUP BY people.id
ORDER BY CONCAT(people.last_name, people.first_name) ASC ORDER BY %s %s
%s %s
`, sqlQuery, sqlFieldJoins, sqlFilters, sqlPagination) `, sqlQuery, sqlFieldJoins, sqlFilters, params.OrderColumn, params.OrderDirection, sqlPagination)
sqlResult := db.Raw(sqlQuery, sqlParams...).Preload("Section").Find(&results.Results) sqlResult := db.Raw(sqlQuery, sqlParams...).Preload("Section").Find(&results.Results)
if sqlResult.Error != nil { if sqlResult.Error != nil {

View file

@ -244,16 +244,124 @@
</div> </div>
<div> <div>
<!-- <div class="card card-body my-2 py-2 bg-body-tertiary">
<div class="row"> <div class="row">
<div class="col">Nom</div> <div class="col-xxl col-lg-4 col-md-6 order-1 order-md-1 order-lg-1 order-xxl-1">
<div class="col">Adresse</div> <div class="text-bold fs-7 mt-xxl-0 mt-2">
<div class="col">Lieu</div> {% if OrderCol == "name" || OrderCol == "" %}
<div class="col">Section</div> {% if OrderDir == "asc" || OrderDir == "" %}
<div class="col">Création</div> <a href="?p=1&s={{ SearchJSON|urlencode }}&c=name&o=desc">
<div class="col">Modification</div> Nom <i class="bi-arrow-down"></i>
</a>
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=name&o=asc">
Nom <i class="bi-arrow-up"></i>
</a>
{% endif %}
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=name&o=asc">
Nom
</a>
{% endif %}
</div>
</div>
<div class="col-xxl col-lg-4 col-md-6 order-2 order-md-3 order-lg-2 order-xxl-2">
<div class="text-bold fs-7 mt-xxl-0 mt-2">
{% if OrderCol == "address" %}
{% if OrderDir == "asc" || OrderDir == "" %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=address&o=desc">
Adresse <i class="bi-arrow-down"></i>
</a>
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=address&o=asc">
Adresse <i class="bi-arrow-up"></i>
</a>
{% endif %}
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=address&o=asc">
Adresse
</a>
{% endif %}
</div>
</div>
<div class="col-xxl col-lg-4 col-md-6 order-3 order-md-5 order-lg-5 order-xxl-3">
<div class="text-bold fs-7 mt-xxl-0 mt-2">
{% if OrderCol == "npa" %}
{% if OrderDir == "asc" || OrderDir == "" %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=npa&o=desc">
Lieu <i class="bi-arrow-down"></i>
</a>
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=npa&o=asc">
Lieu <i class="bi-arrow-up"></i>
</a>
{% endif %}
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=npa&o=asc">
Lieu
</a>
{% endif %}
</div>
</div>
<div class="col-xxl col-lg-4 col-md-6 order-4 order-md-2 order-lg-4 order-xxl-4">
<div class="text-bold fs-7 mt-xxl-0 mt-2">
{% if OrderCol == "section" %}
{% if OrderDir == "asc" || OrderDir == "" %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=section&o=desc">
Section <i class="bi-arrow-down"></i>
</a>
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=section&o=asc">
Section <i class="bi-arrow-up"></i>
</a>
{% endif %}
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=section&o=asc">
Section
</a>
{% endif %}
</div>
</div>
<div class="col-xxl col-lg-4 col-md-6 order-5 order-md-3 order-lg-4 order-xxl-5">
<div class="text-bold fs-7 mt-xxl-0 mt-2">
{% if OrderCol == "created" %}
{% if OrderDir == "asc" || OrderDir == "" %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=created&o=desc">
Création <i class="bi-arrow-down"></i>
</a>
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=created&o=asc">
Création <i class="bi-arrow-up"></i>
</a>
{% endif %}
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=created&o=asc">
Création
</a>
{% endif %}
</div>
</div>
<div class="col-xxl col-lg-4 col-md-6 order-last order-md-last order-lg-last order-xxl-last">
<div class="text-bold fs-7 mt-xxl-0 mt-2">
{% if OrderCol == "updated" %}
{% if OrderDir == "asc" || OrderDir == "" %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=updated&o=desc">
Modification <i class="bi-arrow-down"></i>
</a>
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=updated&o=asc">
Modification <i class="bi-arrow-up"></i>
</a>
{% endif %}
{% else %}
<a href="?p=1&s={{ SearchJSON|urlencode }}&c=updated&o=asc">
Modification
</a>
{% endif %}
</div>
</div>
</div>
</div> </div>
-->
{% for Person in People %} {% for Person in People %}
<div class="card card-body my-2 py-2 bg-body-tertiary"> <div class="card card-body my-2 py-2 bg-body-tertiary">
@ -298,20 +406,28 @@
{{ Person.Section.Name }} {{ Person.Section.Name }}
</div> </div>
</div> </div>
<div class="col-xxl col-lg-4 col-md-6 order-5 order-md-3 order-lg-4 order-xxl-5" data-key="created_at" data-value="{{ Person.CreatedAt|date:"2006-01-02 15:04" }}"> <div class="col-xxl col-lg-4 col-md-6 order-5 order-md-3 order-lg-4 order-xxl-5">
<div class="text-bold fs-7 mt-xxl-0 mt-2"> <div class="text-bold fs-7 mt-xxl-0 mt-2">
Création Création
</div> </div>
<div> <div>
{{ Person.CreatedAt|date:"02.01.2006 - 15:04" }} {% if Person.CreatedAt|date:"2006-01-02" == "1970-01-01" %}
<code>Inconnu</code>
{% else %}
<code>{{ Person.CreatedAt|date:"02.01.2006 15:04" }}</code>
{% endif %}
</div> </div>
</div> </div>
<div class="col-xxl col-lg-4 col-md-6 order-last order-md-last order-lg-last order-xxl-last" data-key="created_at" data-value="{{ Person.UpdatedAt|date:"2006-01-02 15:04" }}"> <div class="col-xxl col-lg-4 col-md-6 order-last order-md-last order-lg-last order-xxl-last">
<div class="text-bold fs-7 mt-xxl-0 mt-2"> <div class="text-bold fs-7 mt-xxl-0 mt-2">
Mise à jour Modification
</div> </div>
<div> <div>
{{ Person.UpdatedAt|date:"02.01.2006 - 15:04" }} {% if Person.UpdatedAt|date:"2006-01-02" == "1970-01-01" %}
<code>Inconnu</code>
{% else %}
<code>{{ Person.UpdatedAt|date:"02.01.2006 15:04" }}</code>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
@ -334,14 +450,14 @@
</li> </li>
{% else %} {% else %}
<li class="page-item"> <li class="page-item">
<a class="page-link" href="?p=1&s={{ SearchJSON|urlencode }}"> <a class="page-link" href="?p=1&s={{ SearchJSON|urlencode }}&c={{ OrderCol }}&o={{ OrderDir }}">
<i class="bi-rewind"></i> <i class="bi-rewind"></i>
</a> </a>
</li> </li>
<li class="page-item"> <li class="page-item">
<a <a
class="page-link" class="page-link"
href="?&p={{ Pagination.CurrentPage - 1 }}&s={{ SearchJSON|urlencode }}" href="?&p={{ Pagination.CurrentPage - 1 }}&s={{ SearchJSON|urlencode }}&c={{ OrderCol }}&o={{ OrderDir }}"
> >
<i class="bi-caret-left"></i> <i class="bi-caret-left"></i>
</a> </a>
@ -356,7 +472,7 @@
{% else %} {% else %}
class="page-link" class="page-link"
{% endif %} {% endif %}
href="?&p={{ i }}&s={{ SearchJSON|urlencode }}" href="?&p={{ i }}&s={{ SearchJSON|urlencode }}&c={{ OrderCol }}&o={{ OrderDir }}"
> >
{{ i }} {{ i }}
</a> </a>
@ -378,7 +494,7 @@
<li class="page-item"> <li class="page-item">
<a <a
class="page-link" class="page-link"
href="?&p={{ Pagination.CurrentPage + 1 }}&s={{ SearchJSON|urlencode }}" href="?&p={{ Pagination.CurrentPage + 1 }}&s={{ SearchJSON|urlencode }}&c={{ OrderCol }}&o={{ OrderDir }}"
> >
<i class="bi-caret-right"></i> <i class="bi-caret-right"></i>
</a> </a>
@ -386,7 +502,7 @@
<li class="page-item"> <li class="page-item">
<a <a
class="page-link" class="page-link"
href="?p={{ Pagination.MaxPages }}&s={{ SearchJSON|urlencode }}" href="?p={{ Pagination.MaxPages }}&s={{ SearchJSON|urlencode }}&c={{ OrderCol }}&o={{ OrderDir }}"
> >
<i class="bi-fast-forward"></i> <i class="bi-fast-forward"></i>
</a> </a>