diff --git a/lnbits/db.py b/lnbits/db.py index 8a4446b7..480ad10b 100644 --- a/lnbits/db.py +++ b/lnbits/db.py @@ -424,6 +424,7 @@ class Operator(Enum): LE = "le" INCLUDE = "in" EXCLUDE = "ex" + LIKE = "like" @property def as_sql(self): @@ -443,6 +444,8 @@ class Operator(Enum): return ">=" elif self == Operator.LE: return "<=" + elif self == Operator.LIKE: + return "LIKE" else: raise ValueError("Unknown SQL Operator") @@ -499,7 +502,7 @@ class Filter(BaseModel, Generic[TFilterModel]): return cls(field=field, op=op, values=values, model=model) @property - def statement(self): + def statement(self) -> str: stmt = [] for key in self.values.keys() if self.values else []: clean_key = key.split("__")[0] @@ -582,7 +585,10 @@ class Filters(BaseModel, Generic[TFilterModel]): for page_filter in self.filters: if page_filter.values: for key, value in page_filter.values.items(): - values[key] = value + if page_filter.op == Operator.LIKE: + values[key] = f"%{value}%" + else: + values[key] = value if self.search and self.model: values["search"] = f"%{self.search.lower()}%" return values diff --git a/lnbits/static/js/users.js b/lnbits/static/js/users.js index 6a20194c..e6bd6fa3 100644 --- a/lnbits/static/js/users.js +++ b/lnbits/static/js/users.js @@ -335,6 +335,7 @@ window.UsersPageLogic = { }, fetchUsers(props) { + this.relaxFilterForFields(['username', 'email']) const params = LNbits.utils.prepareFilterQuery(this.usersTable, props) LNbits.api .request('GET', `/users/api/v1/user?${params}`) @@ -355,6 +356,17 @@ window.UsersPageLogic = { }) .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) { LNbits.api