Add filters to members page
This commit is contained in:
parent
3d02804c3f
commit
ff91f0ddca
2 changed files with 238 additions and 31 deletions
|
|
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue