From ff91f0ddcab362b6ead714ebc524b265cacfd0a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Wed, 22 Jan 2025 13:13:16 +0100 Subject: [PATCH] Add filters to members page --- controllers/members.go | 115 ++++++++++++++++++++++++++---- views/people.html | 154 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 238 insertions(+), 31 deletions(-) diff --git a/controllers/members.go b/controllers/members.go index 302cb84..c28b019 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -58,11 +58,62 @@ func Members(c *fiber.Ctx) error { return err } + filterSection := c.Query("se") + filterArchive := c.Query("a") + filterSearch := c.Query("s") + + sqlFilterSections := allowedSections + sqlFilterAppend := "IS NULL" + if filterArchive == "1" { + sqlFilterAppend = "IS NOT NULL" + sqlFilterSections = allowedSectionsArchived + } + + var filterSectionUint uint + if len(filterSection) > 0 { + filterSectionUint64, err := strconv.ParseUint(filterSection, 10, 0) + if err == nil { + for _, s := range sqlFilterSections { + if s == uint(filterSectionUint64) { + filterSectionUint = uint(filterSectionUint64) + } + } + } + } + + if filterSectionUint > 0 { + sqlFilterAppend = fmt.Sprintf( + "%s AND section_id = %d", + sqlFilterAppend, + filterSectionUint, + ) + } + + var sqlFilterSearch string + if len(filterSearch) > 0 { + sqlFilterSearch = fmt.Sprintf( + "%%%s%%", filterSearch, + ) + } + var count int64 - db.Model(&models.Person{}).Where( - "is_member = ? AND section_id IN ?", - true, allowedSections, - ).Count(&count) + if len(filterSearch) > 0 { + db.Model(&models.Person{}).Where( + fmt.Sprintf( + "is_member = ? AND section_id IN ? AND (first_name LIKE ? OR last_name LIKE ?) AND deleted_at %s", + sqlFilterAppend, + ), + true, allowedSections, sqlFilterSearch, sqlFilterSearch, + ).Count(&count) + } else { + db.Model(&models.Person{}).Where( + fmt.Sprintf( + "is_member = ? AND section_id IN ? AND deleted_at %s", + sqlFilterAppend, + ), + true, allowedSections, + ).Count(&count) + } pageQuery := c.Query("p") page, _ := strconv.Atoi(pageQuery) @@ -71,13 +122,18 @@ func Members(c *fiber.Ctx) error { } pageSize := 50 - offset := (page - 1) * pageSize - maxPages := 1 + if count > int64(pageSize) { maxPages = int(count) / pageSize } + if page > maxPages { + page = 1 + } + + offset := (page - 1) * pageSize + var pages []int for i := 1; i <= maxPages; i++ { if i == page { @@ -94,16 +150,45 @@ func Members(c *fiber.Ctx) error { } var people []models.Person - result := db.Offset(offset).Limit(pageSize).Order( - "last_name collate nocase asc, first_name collate nocase asc", - ).Preload("Section").Find( - &people, "is_member = ? AND section_id IN ?", true, allowedSections, - ) + if len(filterSearch) > 0 { + result := db.Unscoped().Offset(offset).Limit(pageSize).Order( + "last_name collate nocase asc, first_name collate nocase asc", + ).Preload("Section").Find( + &people, + fmt.Sprintf( + "is_member = ? AND section_id IN ? AND (first_name LIKE ? OR last_name LIKE ?) AND deleted_at %s", + sqlFilterAppend, + ), + true, sqlFilterSections, sqlFilterSearch, sqlFilterSearch, + ) - if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { - return err + if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { + return err + } + } else { + result := db.Unscoped().Offset(offset).Limit(pageSize).Order( + "last_name collate nocase asc, first_name collate nocase asc", + ).Preload("Section").Find( + &people, + fmt.Sprintf( + "is_member = ? AND section_id IN ? AND deleted_at %s", + sqlFilterAppend, + ), + true, sqlFilterSections, + ) + + if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { + return err + } } + var sections []models.Section + db.Order( + "name collate nocase asc", + ).Find( + §ions, sqlFilterSections, + ) + return c.Render("people", fiber.Map{ "PageTitle": "Membres", "MembersPage": true, @@ -113,6 +198,10 @@ func Members(c *fiber.Ctx) error { "MaxPages": maxPages, "PermShow": permShow, "PermShowArchived": permShowArchived, + "Sections": sections, + "FilterArchive": filterArchive, + "FilterSection": filterSectionUint, + "FilterSearch": filterSearch, }) } diff --git a/views/people.html b/views/people.html index b2e52ca..1a2d211 100644 --- a/views/people.html +++ b/views/people.html @@ -18,13 +18,130 @@
+
+ {% if MembersPage %} + + {% else %} + + {% endif %} +
+ +
+
+
+ + + + +
+
+ + + + +
+
+ + +
+ + +
+ +
+
+
+
- - - + + + @@ -41,7 +158,11 @@ {% endif %} -
NomLieuSectionNomAdresseSection
+ + {{ Person.Address1 }} + {% if Person.Address1 and (Person.PostalCode or Person.City) %} + – + {% endif %} {{ Person.PostalCode }} {{ Person.City }} @@ -55,7 +176,7 @@
-