瀏覽代碼

feat: search data

Muhammad Iqbal Afandi 3 年之前
父節點
當前提交
148bd5de4a

+ 2
- 1
app/Http/Controllers/CustomerController.php 查看文件

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

+ 2
- 1
app/Http/Controllers/LaundryController.php 查看文件

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

+ 2
- 1
app/Http/Controllers/OutletController.php 查看文件

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

+ 3
- 1
app/Http/Controllers/TransactionController.php 查看文件

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

+ 2
- 1
app/Http/Controllers/UserController.php 查看文件

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

+ 2
- 2
app/Models/Customer.php 查看文件

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
             $query->where(function ($query) use ($search) {
31
             $query->where(function ($query) use ($search) {
32
                 $query->where('customer_number', 'like', '%' . $search . '%')
32
                 $query->where('customer_number', 'like', '%' . $search . '%')
33
                     ->orWhere('name', 'like', '%' . $search . '%')
33
                     ->orWhere('name', 'like', '%' . $search . '%')

+ 2
- 2
app/Models/Laundry.php 查看文件

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
             $query->where(function ($query) use ($search) {
44
             $query->where(function ($query) use ($search) {
45
                 $query->where('name', 'like', '%' . $search . '%')
45
                 $query->where('name', 'like', '%' . $search . '%')
46
                     ->orWhere('price', 'like', '%' . $search . '%')
46
                     ->orWhere('price', 'like', '%' . $search . '%')

+ 3
- 5
app/Models/Outlet.php 查看文件

16
         'address',
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
             $query->where(function ($query) use ($search) {
22
             $query->where(function ($query) use ($search) {
23
                 $query->where('outlet_number', 'like', '%' . $search . '%')
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 查看文件

70
         $query->when($filters['search'] ?? null, function ($query, $search) {
70
         $query->when($filters['search'] ?? null, function ($query, $search) {
71
             $query->where(function ($query) use ($search) {
71
             $query->where(function ($query) use ($search) {
72
                 $query->where('transaction_number', 'like', '%' . $search . '%')
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 查看文件

73
         return $this->belongsTo(Outlet::class);
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
             $query->where(function ($query) use ($search) {
79
             $query->where(function ($query) use ($search) {
80
                 $query->where('name', 'like', '%' . $search . '%')
80
                 $query->where('name', 'like', '%' . $search . '%')
81
                     ->orWhere('phone', 'like', '%' . $search . '%')
81
                     ->orWhere('phone', 'like', '%' . $search . '%')

+ 5288
- 179
public/js/resources_js_pages_customer_Index_vue.js
文件差異過大導致無法顯示
查看文件


+ 5288
- 179
public/js/resources_js_pages_laundry_Index_vue.js
文件差異過大導致無法顯示
查看文件


+ 5292
- 183
public/js/resources_js_pages_outlet_Index_vue.js
文件差異過大導致無法顯示
查看文件


+ 5343
- 197
public/js/resources_js_pages_transaction_Index_vue.js
文件差異過大導致無法顯示
查看文件


+ 5288
- 179
public/js/resources_js_pages_user_Index_vue.js
文件差異過大導致無法顯示
查看文件


+ 2
- 2
public/js/vue.js 查看文件

43465
 /******/ 		// This function allow to reference async chunks
43465
 /******/ 		// This function allow to reference async chunks
43466
 /******/ 		__webpack_require__.u = (chunkId) => {
43466
 /******/ 		__webpack_require__.u = (chunkId) => {
43467
 /******/ 			// return url for filenames based on template
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
       methods: {
43738
       methods: {
43739
         route: route
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
 _inertiajs_progress__WEBPACK_IMPORTED_MODULE_7__.InertiaProgress.init({
43744
 _inertiajs_progress__WEBPACK_IMPORTED_MODULE_7__.InertiaProgress.init({

+ 23
- 7
resources/js/pages/customer/Index.vue 查看文件

1
 <script setup>
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
 import AppButton from '@/components/AppButton.vue'
7
 import AppButton from '@/components/AppButton.vue'
4
 import AppPagination from '@/components/AppPagination.vue'
8
 import AppPagination from '@/components/AppPagination.vue'
5
 import AppLayout from '@/layouts/AppLayout.vue'
9
 import AppLayout from '@/layouts/AppLayout.vue'
6
 
10
 
7
 import TableHeader from './TableHeader'
11
 import TableHeader from './TableHeader'
8
 
12
 
9
-defineProps({
13
+const props = defineProps({
10
   customers: Object,
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
 </script>
28
 </script>
13
 
29
 
14
 <template>
30
 <template>
23
       :stripedRows="true"
39
       :stripedRows="true"
24
     >
40
     >
25
       <template #header>
41
       <template #header>
42
+        <h5>Customer</h5>
43
+
26
         <div class="grid">
44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28
             <div class="flex align-items-center">
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
             </div>
48
             </div>
33
           </div>
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
             <AppButton :href="route('customers.create')" label="Tambah Customer" icon="pi pi-pencil" />
52
             <AppButton :href="route('customers.create')" label="Tambah Customer" icon="pi pi-pencil" />
37
           </div>
53
           </div>
38
         </div>
54
         </div>

+ 23
- 7
resources/js/pages/laundry/Index.vue 查看文件

1
 <script setup>
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
 import AppButton from '@/components/AppButton.vue'
7
 import AppButton from '@/components/AppButton.vue'
4
 import AppPagination from '@/components/AppPagination.vue'
8
 import AppPagination from '@/components/AppPagination.vue'
5
 import AppLayout from '@/layouts/AppLayout.vue'
9
 import AppLayout from '@/layouts/AppLayout.vue'
6
 
10
 
7
 import TableHeader from './TableHeader'
11
 import TableHeader from './TableHeader'
8
 
12
 
9
-defineProps({
13
+const props = defineProps({
10
   laundries: Object,
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
 </script>
28
 </script>
13
 
29
 
14
 <template>
30
 <template>
23
       :stripedRows="true"
39
       :stripedRows="true"
24
     >
40
     >
25
       <template #header>
41
       <template #header>
42
+        <h5>Laundry</h5>
43
+
26
         <div class="grid">
44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28
             <div class="flex align-items-center">
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
             </div>
48
             </div>
33
           </div>
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
             <AppButton :href="route('laundries.create')" label="Tambah Laundry" icon="pi pi-pencil" />
52
             <AppButton :href="route('laundries.create')" label="Tambah Laundry" icon="pi pi-pencil" />
37
           </div>
53
           </div>
38
         </div>
54
         </div>

+ 23
- 7
resources/js/pages/outlet/Index.vue 查看文件

1
 <script setup>
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
 import AppButton from '@/components/AppButton.vue'
7
 import AppButton from '@/components/AppButton.vue'
4
 import AppPagination from '@/components/AppPagination.vue'
8
 import AppPagination from '@/components/AppPagination.vue'
5
 import AppLayout from '@/layouts/AppLayout.vue'
9
 import AppLayout from '@/layouts/AppLayout.vue'
6
 
10
 
7
 import TableHeader from './TableHeader'
11
 import TableHeader from './TableHeader'
8
 
12
 
9
-defineProps({
13
+const props = defineProps({
10
   outlets: Object,
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
 </script>
28
 </script>
13
 
29
 
14
 <template>
30
 <template>
23
       :stripedRows="true"
39
       :stripedRows="true"
24
     >
40
     >
25
       <template #header>
41
       <template #header>
42
+        <h5>Outlet</h5>
43
+
26
         <div class="grid">
44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28
             <div class="flex align-items-center">
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
             </div>
48
             </div>
33
           </div>
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
             <AppButton :href="route('outlets.create')" label="Tambah Outlet" icon="pi pi-pencil" />
52
             <AppButton :href="route('outlets.create')" label="Tambah Outlet" icon="pi pi-pencil" />
37
           </div>
53
           </div>
38
         </div>
54
         </div>

+ 44
- 9
resources/js/pages/transaction/Index.vue 查看文件

1
 <script setup>
1
 <script setup>
2
-import { ref } from 'vue'
2
+import { ref, watch } from 'vue'
3
 import { Inertia } from '@inertiajs/inertia'
3
 import { Inertia } from '@inertiajs/inertia'
4
 import { Head, useForm } from '@inertiajs/inertia-vue3'
4
 import { Head, useForm } from '@inertiajs/inertia-vue3'
5
+import throttle from 'lodash/throttle'
6
+import pickBy from 'lodash/pickBy'
5
 import AppButton from '@/components/AppButton.vue'
7
 import AppButton from '@/components/AppButton.vue'
6
 import AppPagination from '@/components/AppPagination.vue'
8
 import AppPagination from '@/components/AppPagination.vue'
7
 import AppMenu from '@/components/AppMenu.vue'
9
 import AppMenu from '@/components/AppMenu.vue'
13
 const props = defineProps({
15
 const props = defineProps({
14
   transactions: Object,
16
   transactions: Object,
15
   transactionsStatus: Array,
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
 const transactionId = ref()
35
 const transactionId = ref()
19
 
36
 
20
 const updateStatusDialog = ref(false)
37
 const updateStatusDialog = ref(false)
37
 
54
 
38
 const overlayItems = ref([])
55
 const overlayItems = ref([])
39
 
56
 
57
+const startPrinting = (transactionNumber) => {
58
+  Inertia.get(`/thermal-printing/${transactionNumber}`)
59
+}
60
+
40
 const overlayToggle = (event, data) => {
61
 const overlayToggle = (event, data) => {
41
   overlayItems.value =
62
   overlayItems.value =
42
     data.transactionStatusId == 4
63
     data.transactionStatusId == 4
49
           {
70
           {
50
             label: 'Cetak ulang',
71
             label: 'Cetak ulang',
51
             icon: 'pi pi-print',
72
             icon: 'pi pi-print',
52
-            command() {},
73
+            command() {
74
+              startPrinting(data.transactionNumber)
75
+            },
53
           },
76
           },
54
         ]
77
         ]
55
       : [
78
       : [
69
             label: 'Cetak ulang',
92
             label: 'Cetak ulang',
70
             icon: 'pi pi-print',
93
             icon: 'pi pi-print',
71
             command() {
94
             command() {
72
-              Inertia.get(`/thermal-printing/${data.transactionNumber}`)
95
+              startPrinting(data.transactionNumber)
73
             },
96
             },
74
           },
97
           },
75
         ]
98
         ]
96
       :stripedRows="true"
119
       :stripedRows="true"
97
     >
120
     >
98
       <template #header>
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
             </div>
140
             </div>
106
           </div>
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
             <AppButton
144
             <AppButton
110
               label="Tambah Transaksi"
145
               label="Tambah Transaksi"
111
               class="p-button-text"
146
               class="p-button-text"

+ 23
- 7
resources/js/pages/user/Index.vue 查看文件

1
 <script setup>
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
 import AppLayout from '@/layouts/AppLayout.vue'
7
 import AppLayout from '@/layouts/AppLayout.vue'
4
 import AppButton from '@/components/AppButton.vue'
8
 import AppButton from '@/components/AppButton.vue'
5
 import AppPagination from '@/components/AppPagination.vue'
9
 import AppPagination from '@/components/AppPagination.vue'
6
 
10
 
7
 import TableHeader from './TableHeader'
11
 import TableHeader from './TableHeader'
8
 
12
 
9
-defineProps({
13
+const props = defineProps({
10
   users: Object,
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
 </script>
28
 </script>
13
 
29
 
14
 <template>
30
 <template>
23
       :stripedRows="true"
39
       :stripedRows="true"
24
     >
40
     >
25
       <template #header>
41
       <template #header>
42
+        <h5>User</h5>
43
+
26
         <div class="grid">
44
         <div class="grid">
27
-          <div class="col-12 md:col-6">
45
+          <div class="col-12 md:col-8">
28
             <div class="flex align-items-center">
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
             </div>
48
             </div>
33
           </div>
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
             <AppButton :href="route('users.create')" label="Tambah User" icon="pi pi-pencil" class="p-button-text" />
52
             <AppButton :href="route('users.create')" label="Tambah User" icon="pi pi-pencil" class="p-button-text" />
37
           </div>
53
           </div>
38
         </div>
54
         </div>

+ 2
- 2
resources/js/vue.js 查看文件

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