Skip to content

Commit 67cdd93

Browse files
authored
Merge pull request #1718 from microbiomedata/add-user-table-sorting
Add search functionality for users table
2 parents 0c6050e + 2491cf5 commit 67cdd93

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

nmdc_server/api.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,8 +1472,17 @@ async def get_users(
14721472
db: Session = Depends(get_db),
14731473
user: models.User = Depends(admin_required),
14741474
pagination: Pagination = Depends(),
1475+
search_filter: Optional[str] = None,
14751476
):
14761477
users = db.query(User)
1478+
if search_filter:
1479+
users = users.filter(
1480+
(
1481+
models.User.name.ilike(f"%{search_filter}%")
1482+
| models.User.orcid.ilike(f"%{search_filter}%")
1483+
)
1484+
)
1485+
14771486
return pagination.response(users)
14781487

14791488

web/src/data/api.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,11 +685,12 @@ async function me(): Promise<User | null> {
685685
}
686686
}
687687

688-
async function getAllUsers(params: SearchParams) {
688+
async function getAllUsers(params: SearchParams, searchFilter: string) {
689689
const { data } = await client.get<SearchResponse<User>>('users', {
690690
params: {
691691
limit: params.limit,
692692
offset: params.offset,
693+
search_filter: searchFilter,
693694
},
694695
});
695696
return data;

web/src/views/Search/SearchLayout.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,10 @@ export default defineComponent({
246246
class="my-3"
247247
>
248248
<v-tab-item key="omics">
249-
<BiosampleVisGroup :conditions="gatedOmicsVisConditions" :vistab="vistab" />
249+
<BiosampleVisGroup
250+
:conditions="gatedOmicsVisConditions"
251+
:vistab="vistab"
252+
/>
250253
</v-tab-item>
251254
<v-tab-item key="environments">
252255
<EnvironmentVisGroup :conditions="gatedEnvironmentVisConditions" />

web/src/views/User/UserPage.vue

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import { defineComponent, ref, watch } from '@vue/composition-api';
33
import { DataTableHeader } from 'vuetify';
4-
import { api } from '@/data/api';
4+
import { api, SearchParams, SearchResponse } from '@/data/api';
55
import { stateRefs } from '@/store';
66
import { User } from '@/types';
77
import usePaginatedResults from '@/use/usePaginatedResults';
@@ -18,6 +18,7 @@ export default defineComponent({
1818
page: 1,
1919
itemsPerPage,
2020
});
21+
const searchFilter = ref('');
2122
const headers : DataTableHeader[] = [
2223
{
2324
text: 'ORCID',
@@ -29,8 +30,16 @@ export default defineComponent({
2930
{ text: 'Admin', value: 'is_admin', sortable: false },
3031
];
3132
32-
const users = usePaginatedResults(ref([]), api.getAllUsers, ref([]), itemsPerPage);
33+
async function getUsers(params: SearchParams): Promise<SearchResponse<User>> {
34+
return api.getAllUsers(params, searchFilter.value);
35+
}
36+
37+
const users = usePaginatedResults(ref([]), getUsers, ref([]), itemsPerPage);
3338
watch(options, () => users.setPage(options.value.page), { deep: true });
39+
watch(searchFilter, () => {
40+
options.value.page = 1;
41+
users.setPage(options.value.page);
42+
}, { deep: true });
3443
3544
async function updateAdminStatus(item: User) {
3645
await api.updateUser(item.id, item);
@@ -42,6 +51,7 @@ export default defineComponent({
4251
updateAdminStatus,
4352
options,
4453
currentUser,
54+
searchFilter,
4555
};
4656
},
4757
});
@@ -55,6 +65,13 @@ export default defineComponent({
5565
<v-card-title class="text-h4">
5666
Users
5767
</v-card-title>
68+
<v-text-field
69+
v-model="searchFilter"
70+
label="Search Users"
71+
class="mb-2"
72+
outlined
73+
hide-details
74+
/>
5875
<v-card outlined>
5976
<v-data-table
6077
dense

0 commit comments

Comments
 (0)