Add filters to members page

This commit is contained in:
William Bouzourène 2025-01-22 13:13:16 +01:00
parent 3d02804c3f
commit ff91f0ddca
2 changed files with 238 additions and 31 deletions

View file

@ -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(
&sections, 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,
})
}