Skip to content

Commit 261d174

Browse files
authored
Merge pull request #277 from connorabbas/admin-role-dev
User filtering improvements
2 parents 4421ee0 + f1229fb commit 261d174

File tree

5 files changed

+61
-17
lines changed

5 files changed

+61
-17
lines changed

app/Data/DataTransferObjects/Filtering/UserFilters.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace App\Data\DataTransferObjects\Filtering;
44

55
use App\Enums\FilterMatchMode;
6+
use Carbon\Carbon;
7+
use DateTime;
68
use Illuminate\Http\Request;
79

810
class UserFilters extends BaseFilters
@@ -11,18 +13,31 @@ class UserFilters extends BaseFilters
1113
public ?FilterMatchMode $nameMatchMode = null;
1214
public ?string $email = null;
1315
public ?FilterMatchMode $emailMatchMode = null;
16+
public ?DateTime $createdAt = null;
17+
public ?FilterMatchMode $createdAtMatchMode = null;
1418

1519
public static function fromRequest(Request $request): self
1620
{
17-
/** @var array<string, mixed> $filters */
18-
$filters = $request->input('filters', []);
21+
/** @var array<string, mixed> $inputFilters */
22+
$inputFilters = $request->input('filters', []);
1923

20-
return self::from([
24+
$filters = [
25+
'name' => self::getFilterValue($inputFilters, 'name'),
26+
'nameMatchMode' => self::getMatchMode($inputFilters, 'name'),
27+
'email' => self::getFilterValue($inputFilters, 'email'),
28+
'emailMatchMode' => self::getMatchMode($inputFilters, 'email'),
29+
'createdAtMatchMode' => self::getMatchMode($inputFilters, 'created_at'),
30+
];
31+
$createdAt = self::getFilterValue($inputFilters, 'created_at');
32+
if ($createdAt) {
33+
$filters['createdAt'] = Carbon::parse($createdAt);
34+
}
35+
36+
$params = [
2137
...self::getPaginationFilters($request)->toArray(),
22-
'name' => self::getFilterValue($filters, 'name'),
23-
'nameMatchMode' => self::getMatchMode($filters, 'name'),
24-
'email' => self::getFilterValue($filters, 'email'),
25-
'emailMatchMode' => self::getMatchMode($filters, 'email'),
26-
]);
38+
...$filters,
39+
];
40+
41+
return self::from($params);
2742
}
2843
}

app/Services/UserService.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public function getUsers(UserFilters $filters): LengthAwarePaginator|Collection
1919
$nameMatchMode = $filters->nameMatchMode;
2020
$email = $filters->email;
2121
$emailMatchMode = $filters->emailMatchMode;
22+
$createdAt = $filters->createdAt;
23+
$createdAtMatchMode = $filters->createdAtMatchMode;
2224

2325
$query = User::query();
2426
if ($name !== null && $nameMatchMode instanceof FilterMatchMode) {
@@ -27,6 +29,9 @@ public function getUsers(UserFilters $filters): LengthAwarePaginator|Collection
2729
if ($email !== null && $emailMatchMode instanceof FilterMatchMode) {
2830
$query->applyFilter('email', $emailMatchMode, $email);
2931
}
32+
if ($createdAt !== null && $createdAtMatchMode instanceof FilterMatchMode) {
33+
$query->applyFilter('created_at', $createdAtMatchMode, $createdAt);
34+
}
3035

3136
if ($filters->sortField && $filters->sortDirection) {
3237
$query->applySort($filters->sortField, $filters->sortDirection);

package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@types/qs": "^6.9.18",
2727
"@vitejs/plugin-vue": "^5.2.3",
2828
"@vueuse/core": "^13.0.0",
29+
"date-fns": "^4.1.0",
2930
"globals": "^16.0.0",
3031
"laravel-vite-plugin": "^1.2.0",
3132
"lodash-es": "^4.17.21",

resources/js/pages/admin/users/Index.vue

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { ref, useTemplateRef } from 'vue';
33
import { FilterMatchMode } from '@primevue/core/api';
44
import { AlertCircle, EllipsisVertical, FunnelX, Pencil } from 'lucide-vue-next';
5+
import { format, parseISO } from 'date-fns';
56
import { useLazyDataTable } from '@/composables/useLazyDataTable';
67
import AppLayout from '@/layouts/AppLayout.vue';
78
import Menu from '@/components/primevue/menu/Menu.vue';
@@ -52,6 +53,7 @@ const {
5253
} = useLazyDataTable('users', {
5354
name: { value: null, matchMode: FilterMatchMode.CONTAINS },
5455
email: { value: null, matchMode: FilterMatchMode.CONTAINS },
56+
created_at: { value: null, matchMode: FilterMatchMode.DATE_IS },
5557
}, props.users.per_page);
5658
</script>
5759
@@ -123,11 +125,9 @@ const {
123125
</div>
124126
</template>
125127
<Column
126-
field="name"
127128
header="Name"
129+
field="name"
128130
sortable
129-
:showFilterMenu="false"
130-
:showClearButton="true"
131131
>
132132
<template #filter="{ filterModel, filterCallback }">
133133
<InputText
@@ -143,11 +143,9 @@ const {
143143
</template>
144144
</Column>
145145
<Column
146-
field="email"
147146
header="Email"
147+
field="email"
148148
sortable
149-
:showFilterMenu="false"
150-
:showClearButton="true"
151149
>
152150
<template #filter="{ filterModel, filterCallback }">
153151
<InputText
@@ -162,12 +160,26 @@ const {
162160
{{ data.email }}
163161
</template>
164162
</Column>
165-
<!-- Format date as needed, likely use date-fns -->
166163
<Column
167-
field="created_at"
168164
header="Created"
165+
field="created_at"
166+
dataType="date"
169167
sortable
170-
/>
168+
>
169+
<template #filter="{ filterModel, filterCallback }">
170+
<DatePicker
171+
v-model="filterModel.value"
172+
dateFormat="mm/dd/yy"
173+
placeholder="mm/dd/yyyy"
174+
showButtonBar
175+
fluid
176+
@update:modelValue="filterCallback"
177+
/>
178+
</template>
179+
<template #body="{ data }">
180+
{{ format(parseISO(data.created_at), 'MM/dd/yyyy') }}
181+
</template>
182+
</Column>
171183
<Column header="Action">
172184
<template #body="{ data }">
173185
<Button

0 commit comments

Comments
 (0)