[feat] add case insensitive search for users (#3413)

Co-authored-by: Arc <33088785+arcbtc@users.noreply.github.com>
This commit is contained in:
Vlad Stan 2025-10-17 01:23:01 +03:00 committed by GitHub
parent 4cf9fae3e3
commit 40c065708a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 2 deletions

View file

@ -424,6 +424,7 @@ class Operator(Enum):
LE = "le" LE = "le"
INCLUDE = "in" INCLUDE = "in"
EXCLUDE = "ex" EXCLUDE = "ex"
LIKE = "like"
@property @property
def as_sql(self): def as_sql(self):
@ -443,6 +444,8 @@ class Operator(Enum):
return ">=" return ">="
elif self == Operator.LE: elif self == Operator.LE:
return "<=" return "<="
elif self == Operator.LIKE:
return "LIKE"
else: else:
raise ValueError("Unknown SQL Operator") raise ValueError("Unknown SQL Operator")
@ -499,7 +502,7 @@ class Filter(BaseModel, Generic[TFilterModel]):
return cls(field=field, op=op, values=values, model=model) return cls(field=field, op=op, values=values, model=model)
@property @property
def statement(self): def statement(self) -> str:
stmt = [] stmt = []
for key in self.values.keys() if self.values else []: for key in self.values.keys() if self.values else []:
clean_key = key.split("__")[0] clean_key = key.split("__")[0]
@ -582,6 +585,9 @@ class Filters(BaseModel, Generic[TFilterModel]):
for page_filter in self.filters: for page_filter in self.filters:
if page_filter.values: if page_filter.values:
for key, value in page_filter.values.items(): for key, value in page_filter.values.items():
if page_filter.op == Operator.LIKE:
values[key] = f"%{value}%"
else:
values[key] = value values[key] = value
if self.search and self.model: if self.search and self.model:
values["search"] = f"%{self.search.lower()}%" values["search"] = f"%{self.search.lower()}%"

View file

@ -335,6 +335,7 @@ window.UsersPageLogic = {
}, },
fetchUsers(props) { fetchUsers(props) {
this.relaxFilterForFields(['username', 'email'])
const params = LNbits.utils.prepareFilterQuery(this.usersTable, props) const params = LNbits.utils.prepareFilterQuery(this.usersTable, props)
LNbits.api LNbits.api
.request('GET', `/users/api/v1/user?${params}`) .request('GET', `/users/api/v1/user?${params}`)
@ -355,6 +356,17 @@ window.UsersPageLogic = {
}) })
.catch(LNbits.utils.notifyApiError) .catch(LNbits.utils.notifyApiError)
}, },
relaxFilterForFields(fieldNames = []) {
fieldNames.forEach(fieldName => {
const fieldValue = this.usersTable?.filter?.[fieldName]
if (fieldValue) {
if (this.usersTable.filter[fieldName]) {
this.usersTable.filter[`${fieldName}[like]`] = fieldValue
delete this.usersTable.filter[fieldName]
}
}
})
},
toggleAdmin(userId) { toggleAdmin(userId) {
LNbits.api LNbits.api