Browse Source

feat: search data

Muhammad Iqbal Afandi 3 years ago
parent
commit
148bd5de4a

+ 2
- 1
app/Http/Controllers/CustomerController.php View File

@@ -17,8 +17,9 @@ class CustomerController extends Controller
17 17
     public function index()
18 18
     {
19 19
         return inertia('customer/Index', [
20
+            'filters' => request()->all('search'),
20 21
             'customers' => Customer::latest()
21
-                ->filter(request()->search)
22
+                ->filter(request()->only('search'))
22 23
                 ->paginate(10)
23 24
                 ->withQueryString()
24 25
                 ->through(fn($customer) => [

+ 2
- 1
app/Http/Controllers/LaundryController.php View File

@@ -17,8 +17,9 @@ class LaundryController extends Controller
17 17
     public function index()
18 18
     {
19 19
         return inertia('laundry/Index', [
20
+            'filters' => request()->all('search'),
20 21
             'laundries' => Laundry::latest()
21
-                ->filter(request()->search)
22
+                ->filter(request()->only('search'))
22 23
                 ->paginate(10)
23 24
                 ->withQueryString()
24 25
                 ->through(fn($laundry) => [

+ 2
- 1
app/Http/Controllers/OutletController.php View File

@@ -22,8 +22,9 @@ class OutletController extends Controller
22 22
         }
23 23
 
24 24
         return inertia('outlet/Index', [
25
+            'filters' => request()->all('search'),
25 26
             'outlets' => Outlet::latest()
26
-                ->filter(request()->search)
27
+                ->filter(request()->only('search'))
27 28
                 ->paginate(10)
28 29
                 ->withQueryString()
29 30
                 ->through(fn($outlet) => [

+ 3
- 1
app/Http/Controllers/TransactionController.php View File

@@ -28,9 +28,11 @@ class TransactionController extends Controller
28 28
         } else {
29 29
             $transactions = Transaction::where('outlet_id', Auth::user()->outlet_id)->latest();
30 30
         }
31
+
31 32
         return inertia('transaction/Index', [
33
+            'filters' => request()->all('search', 'dates'),
32 34
             'transactions' => $transactions
33
-                ->filter(request()->only(['search']))
35
+                ->filter(request()->only('search', 'dates'))
34 36
                 ->paginate(10)
35 37
                 ->withQueryString()
36 38
                 ->through(fn($transaction) => [

+ 2
- 1
app/Http/Controllers/UserController.php View File

@@ -24,8 +24,9 @@ class UserController extends Controller
24 24
         }
25 25
 
26 26
         return inertia('user/Index', [
27
+            'filters' => request()->all('search'),
27 28
             'users' => User::latest()
28
-                ->filter(request()->search)
29
+                ->filter(request()->only('search'))
29 30
                 ->paginate(10)
30 31
                 ->withQueryString()
31 32
                 ->through(fn($user) => [

+ 2
- 2
app/Models/Customer.php View File

@@ -25,9 +25,9 @@ class Customer extends Model
25 25
         );
26 26
     }
27 27
 
28
-    public function scopeFilter($query, $search)
28
+    public function scopeFilter($query, $filters)
29 29
     {
30
-        $query->when($search ?? null, function ($query, $search) {
30
+        $query->when($filters['search'] ?? null, function ($query, $search) {
31 31
             $query->where(function ($query) use ($search) {
32 32
                 $query->where('customer_number', 'like', '%' . $search . '%')
33 33
                     ->orWhere('name', 'like', '%' . $search . '%')

+ 2
- 2
app/Models/Laundry.php View File

@@ -38,9 +38,9 @@ class Laundry extends Model
38 38
         );
39 39
     }
40 40
 
41
-    public function scopeFilter($query, $search)
41
+    public function scopeFilter($query, $filters)
42 42
     {
43
-        $query->when($search ?? null, function ($query, $search) {
43
+        $query->when($filters['search'] ?? null, function ($query, $search) {
44 44
             $query->where(function ($query) use ($search) {
45 45
                 $query->where('name', 'like', '%' . $search . '%')
46 46
                     ->orWhere('price', 'like', '%' . $search . '%')

+ 3
- 5
app/Models/Outlet.php View File

@@ -16,14 +16,12 @@ class Outlet extends Model
16 16
         'address',
17 17
     ];
18 18
 
19
-    public function scopeFilter($query, $search)
19
+    public function scopeFilter($query, $filter)
20 20
     {
21
-        $query->when($search ?? null, function ($query, $search) {
21
+        $query->when($filter['search'] ?? null, function ($query, $search) {
22 22
             $query->where(function ($query) use ($search) {
23 23
                 $query->where('outlet_number', 'like', '%' . $search . '%')
24
-                    ->orWhere('name', 'like', '%' . $search . '%')
25
-                    ->orWhere('phone', 'like', '%' . $search . '%')
26
-                    ->orWhere('address', 'like', '%' . $search . '%');
24
+                    ->orWhere('name', 'like', '%' . $search . '%');
27 25
             });
28 26
         });
29 27
     }

+ 6
- 2
app/Models/Transaction.php View File

@@ -70,9 +70,13 @@ class Transaction extends Model
70 70
         $query->when($filters['search'] ?? null, function ($query, $search) {
71 71
             $query->where(function ($query) use ($search) {
72 72
                 $query->where('transaction_number', 'like', '%' . $search . '%')
73
-                    ->orWhere('customer.customer_number', 'like', '%' . $search . '%')
74
-                    ->orWhere('phone', 'like', '%' . $search . '%');
73
+                    ->orWhereHas('customer', function ($query) use ($search) {
74
+                        $query->where('customer_number', 'like', '%' . $search . '%')
75
+                            ->orWhere('phone', 'like', '%' . $search . '%');
76
+                    });
75 77
             });
78
+        })->when($filters['dates'] ?? null, function ($query, $dates) {
79
+            $query->whereBetween('created_at', $dates);
76 80
         });
77 81
     }
78 82
 

+ 2
- 2
app/Models/User.php View File

@@ -73,9 +73,9 @@ class User extends Authenticatable implements MustVerifyEmail
73 73
         return $this->belongsTo(Outlet::class);
74 74
     }
75 75
 
76
-    public function scopeFilter($query, $search)
76
+    public function scopeFilter($query, $filters)
77 77
     {
78
-        $query->when($search ?? null, function ($query, $search) {
78
+        $query->when($filters['search'] ?? null, function ($query, $search) {
79 79
             $query->where(function ($query) use ($search) {
80 80
                 $query->where('name', 'like', '%' . $search . '%')
81 81
                     ->orWhere('phone', 'like', '%' . $search . '%')

+ 5288
- 179
public/js/resources_js_pages_customer_Index_vue.js
File diff suppressed because it is too large
View File


+ 5288
- 179
public/js/resources_js_pages_laundry_Index_vue.js
File diff suppressed because it is too large
View File


+ 5292
- 183
public/js/resources_js_pages_outlet_Index_vue.js
File diff suppressed because it is too large
View File


+ 5343
- 197
public/js/resources_js_pages_transaction_Index_vue.js
File diff suppressed because it is too large
View File


+ 5288
- 179
public/js/resources_js_pages_user_Index_vue.js
File diff suppressed because it is too large
View File


+ 2
- 2
public/js/vue.js View File

@@ -43465,7 +43465,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
43465 43465
 /******/ 		// This function allow to reference async chunks
43466 43466
 /******/ 		__webpack_require__.u = (chunkId) => {
43467 43467
 /******/ 			// return url for filenames based on template
43468
-/******/ 			return "js/" + chunkId + ".js?id=" + {"resources_js_pages_Access_vue":"5c8a7a90d229c3f4","resources_js_pages_auth_ForgotPassword_vue":"9db08b886f3acf35","resources_js_pages_auth_Login_vue":"998ee232f83d0aa9","resources_js_pages_auth_ResetPassword_vue":"3191258dc6d8a4b7","resources_js_pages_auth_VerifyEmail_vue":"632c69e9e8e9c0af","resources_js_pages_customer_Create_vue":"49ac9c113ddac399","resources_js_pages_customer_Edit_vue":"5c8910eb625abf14","resources_js_pages_customer_Index_vue":"e452238637d526f9","resources_js_pages_customer_TableHeader_js":"be6685f342bbd7c2","resources_js_pages_laundry_Create_vue":"24b222d472e458b9","resources_js_pages_laundry_Edit_vue":"e972d2d98c195ade","resources_js_pages_laundry_Index_vue":"d6f815d9c19ce1a5","resources_js_pages_laundry_TableHeader_js":"494e577855bbcaf6","resources_js_pages_outlet_Create_vue":"916319d80a0821ca","resources_js_pages_outlet_Edit_vue":"a89fba3c72a8d6ef","resources_js_pages_outlet_Index_vue":"478bf7ef371d8d29","resources_js_pages_outlet_TableHeader_js":"960433b5f8e003c1","resources_js_pages_transaction_Create_vue":"5390e70d3c3444be","resources_js_pages_transaction_Index_vue":"034abc2087e2eee6","resources_js_pages_transaction_Show_vue":"961762e530a6b329","resources_js_pages_transaction_TableHeader_js":"8b928867ad174e10","resources_js_pages_user_Create_vue":"99b372fa4d1dac71","resources_js_pages_user_Edit_vue":"3412c1b357ee588a","resources_js_pages_user_Index_vue":"3d2db2af0af45ee9","resources_js_pages_user_Show_vue":"c68356ef9b76e682","resources_js_pages_user_TableHeader_js":"c19ccf0fa7c2fb2b"}[chunkId] + "";
43468
+/******/ 			return "js/" + chunkId + ".js?id=" + {"resources_js_pages_Access_vue":"5c8a7a90d229c3f4","resources_js_pages_auth_ForgotPassword_vue":"9db08b886f3acf35","resources_js_pages_auth_Login_vue":"998ee232f83d0aa9","resources_js_pages_auth_ResetPassword_vue":"3191258dc6d8a4b7","resources_js_pages_auth_VerifyEmail_vue":"632c69e9e8e9c0af","resources_js_pages_customer_Create_vue":"49ac9c113ddac399","resources_js_pages_customer_Edit_vue":"5c8910eb625abf14","resources_js_pages_customer_Index_vue":"531ae28619c9501a","resources_js_pages_customer_TableHeader_js":"be6685f342bbd7c2","resources_js_pages_laundry_Create_vue":"24b222d472e458b9","resources_js_pages_laundry_Edit_vue":"e972d2d98c195ade","resources_js_pages_laundry_Index_vue":"a4df50af578d72ee","resources_js_pages_laundry_TableHeader_js":"494e577855bbcaf6","resources_js_pages_outlet_Create_vue":"916319d80a0821ca","resources_js_pages_outlet_Edit_vue":"a89fba3c72a8d6ef","resources_js_pages_outlet_Index_vue":"580d1ba885665300","resources_js_pages_outlet_TableHeader_js":"960433b5f8e003c1","resources_js_pages_transaction_Create_vue":"5390e70d3c3444be","resources_js_pages_transaction_Index_vue":"9fef47b26e89fec8","resources_js_pages_transaction_Show_vue":"961762e530a6b329","resources_js_pages_transaction_TableHeader_js":"8b928867ad174e10","resources_js_pages_user_Create_vue":"99b372fa4d1dac71","resources_js_pages_user_Edit_vue":"3412c1b357ee588a","resources_js_pages_user_Index_vue":"4823481d9c700d66","resources_js_pages_user_Show_vue":"c68356ef9b76e682","resources_js_pages_user_TableHeader_js":"c19ccf0fa7c2fb2b"}[chunkId] + "";
43469 43469
 /******/ 		};
43470 43470
 /******/ 	})();
43471 43471
 /******/ 	
@@ -43738,7 +43738,7 @@ __webpack_require__.r(__webpack_exports__);
43738 43738
       methods: {
43739 43739
         route: route
43740 43740
       }
43741
-    }).directive('styleclass', primevue_styleclass__WEBPACK_IMPORTED_MODULE_9__["default"]).directive('ripple', primevue_ripple__WEBPACK_IMPORTED_MODULE_25__["default"]).directive('tooltip', primevue_tooltip__WEBPACK_IMPORTED_MODULE_26__["default"]).component('AutoComplete', primevue_autocomplete__WEBPACK_IMPORTED_MODULE_10__["default"]).component('Button', primevue_button__WEBPACK_IMPORTED_MODULE_12__["default"]).component('Badge', primevue_badge__WEBPACK_IMPORTED_MODULE_11__["default"]).component('Card', primevue_card__WEBPACK_IMPORTED_MODULE_14__["default"]).component('Calender', primevue_calendar__WEBPACK_IMPORTED_MODULE_13__["default"]).component('Column', primevue_column__WEBPACK_IMPORTED_MODULE_15__["default"]).component('DataTable', primevue_datatable__WEBPACK_IMPORTED_MODULE_16__["default"]).component('Dialog', primevue_dialog__WEBPACK_IMPORTED_MODULE_17__["default"]).component('Divider', primevue_divider__WEBPACK_IMPORTED_MODULE_18__["default"]).component('Dropdown', primevue_dropdown__WEBPACK_IMPORTED_MODULE_19__["default"]).component('InputNumber', primevue_inputnumber__WEBPACK_IMPORTED_MODULE_20__["default"]).component('InputText', primevue_inputtext__WEBPACK_IMPORTED_MODULE_21__["default"]).component('Message', primevue_message__WEBPACK_IMPORTED_MODULE_22__["default"]).component('Paginator', primevue_paginator__WEBPACK_IMPORTED_MODULE_23__["default"]).component('Password', primevue_password__WEBPACK_IMPORTED_MODULE_24__["default"]).mount(el);
43741
+    }).directive('styleclass', primevue_styleclass__WEBPACK_IMPORTED_MODULE_9__["default"]).directive('ripple', primevue_ripple__WEBPACK_IMPORTED_MODULE_25__["default"]).directive('tooltip', primevue_tooltip__WEBPACK_IMPORTED_MODULE_26__["default"]).component('AutoComplete', primevue_autocomplete__WEBPACK_IMPORTED_MODULE_10__["default"]).component('Button', primevue_button__WEBPACK_IMPORTED_MODULE_12__["default"]).component('Badge', primevue_badge__WEBPACK_IMPORTED_MODULE_11__["default"]).component('Card', primevue_card__WEBPACK_IMPORTED_MODULE_14__["default"]).component('Calendar', primevue_calendar__WEBPACK_IMPORTED_MODULE_13__["default"]).component('Column', primevue_column__WEBPACK_IMPORTED_MODULE_15__["default"]).component('DataTable', primevue_datatable__WEBPACK_IMPORTED_MODULE_16__["default"]).component('Dialog', primevue_dialog__WEBPACK_IMPORTED_MODULE_17__["default"]).component('Divider', primevue_divider__WEBPACK_IMPORTED_MODULE_18__["default"]).component('Dropdown', primevue_dropdown__WEBPACK_IMPORTED_MODULE_19__["default"]).component('InputNumber', primevue_inputnumber__WEBPACK_IMPORTED_MODULE_20__["default"]).component('InputText', primevue_inputtext__WEBPACK_IMPORTED_MODULE_21__["default"]).component('Message', primevue_message__WEBPACK_IMPORTED_MODULE_22__["default"]).component('Paginator', primevue_paginator__WEBPACK_IMPORTED_MODULE_23__["default"]).component('Password', primevue_password__WEBPACK_IMPORTED_MODULE_24__["default"]).mount(el);
43742 43742
   }
43743 43743
 });
43744 43744
 _inertiajs_progress__WEBPACK_IMPORTED_MODULE_7__.InertiaProgress.init({

+ 23
- 7
resources/js/pages/customer/Index.vue View File

@@ -1,14 +1,30 @@
1 1
 <script setup>
2
-import { Head, Link } from '@inertiajs/inertia-vue3'
2
+import { watch } from 'vue'
3
+import { Inertia } from '@inertiajs/inertia'
4
+import { Head, Link, useForm } from '@inertiajs/inertia-vue3'
5
+import throttle from 'lodash/throttle'
6
+import pickBy from 'lodash/pickBy'
3 7
 import AppButton from '@/components/AppButton.vue'
4 8
 import AppPagination from '@/components/AppPagination.vue'
5 9
 import AppLayout from '@/layouts/AppLayout.vue'
6 10
 
7 11
 import TableHeader from './TableHeader'
8 12
 
9
-defineProps({
13
+const props = defineProps({
10 14
   customers: Object,
15
+  filters: Object,
11 16
 })
17
+
18
+const filterForm = useForm({
19
+  search: props.filters.search,
20
+})
21
+
22
+watch(
23
+  filterForm,
24
+  throttle(() => {
25
+    Inertia.get('/customers', pickBy({ search: filterForm.search }), { preserveState: true })
26
+  }, 300)
27
+)
12 28
 </script>
13 29
 
14 30
 <template>
@@ -23,16 +39,16 @@ defineProps({
23 39
       :stripedRows="true"
24 40
     >
25 41
       <template #header>
42
+        <h5>Customer</h5>
43
+
26 44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28 46
             <div class="flex align-items-center">
29
-              <h5 class="mr-3 mb-0">Customer</h5>
30
-
31
-              <InputText class="w-full md:w-27rem" placeholder="cari..." />
47
+              <InputText class="w-full md:w-27rem" placeholder="cari..." v-model="filterForm.search" />
32 48
             </div>
33 49
           </div>
34 50
 
35
-          <div class="col-12 md:col-6 flex justify-content-end">
51
+          <div class="col-12 md:col-4 flex justify-content-end">
36 52
             <AppButton :href="route('customers.create')" label="Tambah Customer" icon="pi pi-pencil" />
37 53
           </div>
38 54
         </div>

+ 23
- 7
resources/js/pages/laundry/Index.vue View File

@@ -1,14 +1,30 @@
1 1
 <script setup>
2
-import { Head, Link } from '@inertiajs/inertia-vue3'
2
+import { watch } from 'vue'
3
+import { Inertia } from '@inertiajs/inertia'
4
+import { Head, Link, useForm } from '@inertiajs/inertia-vue3'
5
+import throttle from 'lodash/throttle'
6
+import pickBy from 'lodash/pickBy'
3 7
 import AppButton from '@/components/AppButton.vue'
4 8
 import AppPagination from '@/components/AppPagination.vue'
5 9
 import AppLayout from '@/layouts/AppLayout.vue'
6 10
 
7 11
 import TableHeader from './TableHeader'
8 12
 
9
-defineProps({
13
+const props = defineProps({
10 14
   laundries: Object,
15
+  filters: Object,
11 16
 })
17
+
18
+const filterForm = useForm({
19
+  search: props.filters.search,
20
+})
21
+
22
+watch(
23
+  filterForm,
24
+  throttle(() => {
25
+    Inertia.get('/laundries', pickBy({ search: filterForm.search }), { preserveState: true })
26
+  }, 300)
27
+)
12 28
 </script>
13 29
 
14 30
 <template>
@@ -23,16 +39,16 @@ defineProps({
23 39
       :stripedRows="true"
24 40
     >
25 41
       <template #header>
42
+        <h5>Laundry</h5>
43
+
26 44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28 46
             <div class="flex align-items-center">
29
-              <h5 class="mr-3 mb-0">Laundry</h5>
30
-
31
-              <InputText class="w-full md:w-27rem" placeholder="cari..." />
47
+              <InputText class="w-full md:w-27rem" placeholder="cari..." v-model="filterForm.search" />
32 48
             </div>
33 49
           </div>
34 50
 
35
-          <div class="col-12 md:col-6 flex justify-content-end">
51
+          <div class="col-12 md:col-4 flex justify-content-end">
36 52
             <AppButton :href="route('laundries.create')" label="Tambah Laundry" icon="pi pi-pencil" />
37 53
           </div>
38 54
         </div>

+ 23
- 7
resources/js/pages/outlet/Index.vue View File

@@ -1,14 +1,30 @@
1 1
 <script setup>
2
-import { Head, Link } from '@inertiajs/inertia-vue3'
2
+import { watch } from 'vue'
3
+import { Inertia } from '@inertiajs/inertia'
4
+import { Head, Link, useForm } from '@inertiajs/inertia-vue3'
5
+import throttle from 'lodash/throttle'
6
+import pickBy from 'lodash/pickBy'
3 7
 import AppButton from '@/components/AppButton.vue'
4 8
 import AppPagination from '@/components/AppPagination.vue'
5 9
 import AppLayout from '@/layouts/AppLayout.vue'
6 10
 
7 11
 import TableHeader from './TableHeader'
8 12
 
9
-defineProps({
13
+const props = defineProps({
10 14
   outlets: Object,
15
+  filters: Object,
11 16
 })
17
+
18
+const filterForm = useForm({
19
+  search: props.filters.search,
20
+})
21
+
22
+watch(
23
+  filterForm,
24
+  throttle(() => {
25
+    Inertia.get('/outlets', pickBy({ search: filterForm.search }), { preserveState: true })
26
+  }, 300)
27
+)
12 28
 </script>
13 29
 
14 30
 <template>
@@ -23,16 +39,16 @@ defineProps({
23 39
       :stripedRows="true"
24 40
     >
25 41
       <template #header>
42
+        <h5>Outlet</h5>
43
+
26 44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28 46
             <div class="flex align-items-center">
29
-              <h5 class="mr-3 mb-0">Outlet</h5>
30
-
31
-              <InputText class="w-full md:w-27rem" placeholder="cari..." />
47
+              <InputText class="w-full md:w-27rem" placeholder="cari..." v-model="filterForm.search" />
32 48
             </div>
33 49
           </div>
34 50
 
35
-          <div class="col-12 md:col-6 flex justify-content-end">
51
+          <div class="col-12 md:col-4 flex justify-content-end">
36 52
             <AppButton :href="route('outlets.create')" label="Tambah Outlet" icon="pi pi-pencil" />
37 53
           </div>
38 54
         </div>

+ 44
- 9
resources/js/pages/transaction/Index.vue View File

@@ -1,7 +1,9 @@
1 1
 <script setup>
2
-import { ref } from 'vue'
2
+import { ref, watch } from 'vue'
3 3
 import { Inertia } from '@inertiajs/inertia'
4 4
 import { Head, useForm } from '@inertiajs/inertia-vue3'
5
+import throttle from 'lodash/throttle'
6
+import pickBy from 'lodash/pickBy'
5 7
 import AppButton from '@/components/AppButton.vue'
6 8
 import AppPagination from '@/components/AppPagination.vue'
7 9
 import AppMenu from '@/components/AppMenu.vue'
@@ -13,8 +15,23 @@ import { IndexTable } from './TableHeader'
13 15
 const props = defineProps({
14 16
   transactions: Object,
15 17
   transactionsStatus: Array,
18
+  filters: Object,
16 19
 })
17 20
 
21
+const filterForm = useForm({
22
+  search: props.filters.search,
23
+  dates: props.filters.dates,
24
+})
25
+
26
+watch(
27
+  filterForm,
28
+  throttle(() => {
29
+    Inertia.get('/transactions', pickBy({ search: filterForm.search, dates: filterForm.dates }), {
30
+      preserveState: true,
31
+    })
32
+  }, 300)
33
+)
34
+
18 35
 const transactionId = ref()
19 36
 
20 37
 const updateStatusDialog = ref(false)
@@ -37,6 +54,10 @@ const overlayMenu = ref()
37 54
 
38 55
 const overlayItems = ref([])
39 56
 
57
+const startPrinting = (transactionNumber) => {
58
+  Inertia.get(`/thermal-printing/${transactionNumber}`)
59
+}
60
+
40 61
 const overlayToggle = (event, data) => {
41 62
   overlayItems.value =
42 63
     data.transactionStatusId == 4
@@ -49,7 +70,9 @@ const overlayToggle = (event, data) => {
49 70
           {
50 71
             label: 'Cetak ulang',
51 72
             icon: 'pi pi-print',
52
-            command() {},
73
+            command() {
74
+              startPrinting(data.transactionNumber)
75
+            },
53 76
           },
54 77
         ]
55 78
       : [
@@ -69,7 +92,7 @@ const overlayToggle = (event, data) => {
69 92
             label: 'Cetak ulang',
70 93
             icon: 'pi pi-print',
71 94
             command() {
72
-              Inertia.get(`/thermal-printing/${data.transactionNumber}`)
95
+              startPrinting(data.transactionNumber)
73 96
             },
74 97
           },
75 98
         ]
@@ -96,16 +119,28 @@ const overlayToggle = (event, data) => {
96 119
       :stripedRows="true"
97 120
     >
98 121
       <template #header>
99
-        <div class="grid">
100
-          <div class="col-12 md:col-6">
101
-            <div class="flex align-items-center">
102
-              <h5 class="mr-3 mb-0">Transaksi</h5>
122
+        <h5>Transaksi</h5>
103 123
 
104
-              <InputText class="w-full md:w-27rem" placeholder="cari..." />
124
+        <div class="grid">
125
+          <div class="col-12 md:col-8">
126
+            <div class="flex flex-column md:flex-row">
127
+              <div class="flex align-items-center mr-0 md:mr-2 mb-2 md:mb-0">
128
+                <InputText class="w-full md:w-16rem" placeholder="cari..." v-model="filterForm.search" />
129
+              </div>
130
+
131
+              <Calendar
132
+                class="w-full md:w-16rem"
133
+                v-model="filterForm.dates"
134
+                selection-mode="range"
135
+                placeholder="filter waktu..."
136
+                date-format="dd/mm/yy"
137
+                :show-button-bar="true"
138
+                :manual-input="false"
139
+              />
105 140
             </div>
106 141
           </div>
107 142
 
108
-          <div class="col-12 md:col-6 flex justify-content-end">
143
+          <div class="col-12 md:col-4 flex justify-content-end">
109 144
             <AppButton
110 145
               label="Tambah Transaksi"
111 146
               class="p-button-text"

+ 23
- 7
resources/js/pages/user/Index.vue View File

@@ -1,14 +1,30 @@
1 1
 <script setup>
2
-import { Head, Link } from '@inertiajs/inertia-vue3'
2
+import { watch } from 'vue'
3
+import { Inertia } from '@inertiajs/inertia'
4
+import { Head, Link, useForm } from '@inertiajs/inertia-vue3'
5
+import throttle from 'lodash/throttle'
6
+import pickBy from 'lodash/pickBy'
3 7
 import AppLayout from '@/layouts/AppLayout.vue'
4 8
 import AppButton from '@/components/AppButton.vue'
5 9
 import AppPagination from '@/components/AppPagination.vue'
6 10
 
7 11
 import TableHeader from './TableHeader'
8 12
 
9
-defineProps({
13
+const props = defineProps({
10 14
   users: Object,
15
+  filters: Object,
11 16
 })
17
+
18
+const filterForm = useForm({
19
+  search: props.filters.search,
20
+})
21
+
22
+watch(
23
+  filterForm,
24
+  throttle(() => {
25
+    Inertia.get('/users', pickBy({ search: filterForm.search }), { preserveState: true })
26
+  }, 300)
27
+)
12 28
 </script>
13 29
 
14 30
 <template>
@@ -23,16 +39,16 @@ defineProps({
23 39
       :stripedRows="true"
24 40
     >
25 41
       <template #header>
42
+        <h5>User</h5>
43
+
26 44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28 46
             <div class="flex align-items-center">
29
-              <h5 class="mr-3 mb-0">User</h5>
30
-
31
-              <InputText class="w-full md:w-27rem" placeholder="cari..." />
47
+              <InputText class="w-full md:w-27rem" placeholder="cari..." v-model="filterForm.search" />
32 48
             </div>
33 49
           </div>
34 50
 
35
-          <div class="col-12 md:col-6 flex justify-content-end">
51
+          <div class="col-12 md:col-4 flex justify-content-end">
36 52
             <AppButton :href="route('users.create')" label="Tambah User" icon="pi pi-pencil" class="p-button-text" />
37 53
           </div>
38 54
         </div>

+ 2
- 2
resources/js/vue.js View File

@@ -12,7 +12,7 @@ import StyleClass from 'primevue/styleclass'
12 12
 import AutoComplete from 'primevue/autocomplete'
13 13
 import Badge from 'primevue/badge'
14 14
 import Button from 'primevue/button'
15
-import Calender from 'primevue/calendar'
15
+import Calendar from 'primevue/calendar'
16 16
 import Card from 'primevue/card'
17 17
 import Column from 'primevue/column'
18 18
 import DataTable from 'primevue/datatable'
@@ -41,7 +41,7 @@ createInertiaApp({
41 41
       .component('Button', Button)
42 42
       .component('Badge', Badge)
43 43
       .component('Card', Card)
44
-      .component('Calender', Calender)
44
+      .component('Calendar', Calendar)
45 45
       .component('Column', Column)
46 46
       .component('DataTable', DataTable)
47 47
       .component('Dialog', Dialog)