Bladeren bron

fix: master type-member

Muhammad Iqbal Afandi 4 jaren geleden
bovenliggende
commit
9bbc68a9e1

+ 69
- 10
app/Http/Controllers/TypeMemberController.php Bestand weergeven

@@ -4,7 +4,11 @@ namespace App\Http\Controllers;
4 4
 
5 5
 use App\Http\Requests\TypeMember\StoreTypeMemberRequest;
6 6
 use App\Http\Requests\TypeMember\UpdateTypeMemberRequest;
7
+use App\Models\MaxVehicle;
7 8
 use App\Models\TypeMember;
9
+use App\Models\TypeVehicle;
10
+use Illuminate\Database\QueryException;
11
+use Illuminate\Support\Facades\DB;
8 12
 
9 13
 class TypeMemberController extends Controller
10 14
 {
@@ -22,7 +26,7 @@ class TypeMemberController extends Controller
22 26
                 'type' => $typeMember->type,
23 27
                 'description' => $typeMember->description,
24 28
                 'price' => $typeMember->price,
25
-                'max' => $typeMember->max,
29
+                'max' => $typeMember->maxVehicleDetail(),
26 30
             ]),
27 31
         ]);
28 32
     }
@@ -34,7 +38,12 @@ class TypeMemberController extends Controller
34 38
      */
35 39
     public function create()
36 40
     {
37
-        return inertia('typemember/Create');
41
+        return inertia('typemember/Create', [
42
+            'typeVehicles' => TypeVehicle::get()->transform(fn($typeVehicle) => [
43
+                'value' => $typeVehicle->id,
44
+                'label' => $typeVehicle->type,
45
+            ]),
46
+        ]);
38 47
     }
39 48
 
40 49
     /**
@@ -45,9 +54,26 @@ class TypeMemberController extends Controller
45 54
      */
46 55
     public function store(StoreTypeMemberRequest $request)
47 56
     {
48
-        TypeMember::create($request->validated());
57
+        DB::beginTransaction();
58
+
59
+        try {
60
+            $typeMember = TypeMember::create($request->validated());
61
+
62
+            foreach ($request->maxVehicles as $maxVehicle) {
63
+                $typeMember->maxVehicles()->create([
64
+                    'max' => $maxVehicle['max'],
65
+                    'type_vehicle_id' => $maxVehicle['typeVehicleId'],
66
+                ]);
67
+            }
68
+
69
+            DB::commit();
49 70
 
50
-        return back()->with('success', __('messages.success.store.type_member'));
71
+            return back()->with('success', __('messages.success.store.type_member'));
72
+        } catch (QueryException $qe) {
73
+            DB::rollBack();
74
+
75
+            return back()->with('error', __('messages.error.store.type_member'));
76
+        }
51 77
     }
52 78
 
53 79
     /**
@@ -75,8 +101,17 @@ class TypeMemberController extends Controller
75 101
                 'type' => $typeMember->type,
76 102
                 'description' => $typeMember->description,
77 103
                 'price' => $typeMember->getRawOriginal('price'),
78
-                'max' => $typeMember->max,
104
+                'availableToMember' => $typeMember->member()->exists(),
79 105
             ],
106
+            'typeVehicles' => TypeVehicle::get()->transform(fn($typeVehicle) => [
107
+                'value' => $typeVehicle->id,
108
+                'label' => $typeVehicle->type,
109
+            ]),
110
+            'maxVehicles' => $typeMember->maxVehicles->transform(fn($maxVehicle) => [
111
+                'max' => $maxVehicle->max,
112
+                'type' => $maxVehicle->typeVehicle->type,
113
+                'typeVehicleId' => $maxVehicle->type_vehicle_id,
114
+            ]),
80 115
         ]);
81 116
     }
82 117
 
@@ -89,19 +124,43 @@ class TypeMemberController extends Controller
89 124
      */
90 125
     public function update(UpdateTypeMemberRequest $request, TypeMember $typeMember)
91 126
     {
92
-        $typeMember->update($request->validated());
127
+        DB::beginTransaction();
128
+
129
+        try {
130
+            $typeMember->update($request->validated());
93 131
 
94
-        return back()->with('success', __('messages.success.update.type_member'));
132
+            MaxVehicle::where('type_member_id', $typeMember->id)->delete();
133
+
134
+            foreach ($request->maxVehicles as $maxVehicle) {
135
+                $typeMember->maxVehicles()->create([
136
+                    'max' => $maxVehicle['max'],
137
+                    'type_vehicle_id' => $maxVehicle['typeVehicleId'],
138
+                ]);
139
+            }
140
+
141
+            DB::commit();
142
+
143
+            return back()->with('success', __('messages.success.update.type_member'));
144
+
145
+        } catch (QueryException $qe) {
146
+            DB::rollBack();
147
+
148
+            return back()->with('error', __('messages.error.update.type_member'));
149
+        }
95 150
     }
96 151
 
97 152
     /**
98 153
      * Remove the specified resource from storage.
99 154
      *
100
-     * @param  int  $id
155
+     * @param  TypeMember  $typeMember
101 156
      * @return \Illuminate\Http\Response
102 157
      */
103
-    public function destroy($id)
158
+    public function destroy(TypeMember $typeMember)
104 159
     {
105
-        //
160
+        if (!$typeMember->member()->exists()) {
161
+            $typeMember->delete();
162
+
163
+            return to_route('users.index')->with('success', __('messages.success.destroy.type_member'));
164
+        }
106 165
     }
107 166
 }

+ 1
- 2
app/Http/Requests/TypeMember/StoreTypeMemberRequest.php Bestand weergeven

@@ -25,9 +25,8 @@ class StoreTypeMemberRequest extends FormRequest
25 25
     {
26 26
         return [
27 27
             'type' => 'required|string',
28
-            'description' => 'required|string',
28
+            'description' => 'nullable',
29 29
             'price' => 'required|numeric',
30
-            'max' => 'required|numeric',
31 30
         ];
32 31
     }
33 32
 }

+ 1
- 2
app/Http/Requests/TypeMember/UpdateTypeMemberRequest.php Bestand weergeven

@@ -25,9 +25,8 @@ class UpdateTypeMemberRequest extends FormRequest
25 25
     {
26 26
         return [
27 27
             'type' => 'required|string',
28
-            'description' => 'required|string',
28
+            'description' => 'nullable',
29 29
             'price' => 'required|numeric',
30
-            'max' => 'required|numeric',
31 30
         ];
32 31
     }
33 32
 }

+ 6
- 1
app/Models/MaxVehicle.php Bestand weergeven

@@ -11,7 +11,12 @@ class MaxVehicle extends Model
11 11
 
12 12
     protected $fillable = [
13 13
         'max',
14
-        'member_id',
14
+        'type_member_id',
15 15
         'type_vehicle_id',
16 16
     ];
17
+
18
+    public function typeVehicle()
19
+    {
20
+        return $this->belongsTo(TypeVehicle::class);
21
+    }
17 22
 }

+ 19
- 0
app/Models/TypeMember.php Bestand weergeven

@@ -2,6 +2,8 @@
2 2
 
3 3
 namespace App\Models;
4 4
 
5
+use App\Models\MaxVehicle;
6
+use App\Models\Member;
5 7
 use App\Services\CurrencyFormatService;
6 8
 use Carbon\Carbon;
7 9
 use Illuminate\Database\Eloquent\Casts\Attribute;
@@ -39,10 +41,27 @@ class TypeMember extends Model
39 41
         );
40 42
     }
41 43
 
44
+    public function maxVehicles()
45
+    {
46
+        return $this->hasMany(MaxVehicle::class);
47
+    }
48
+
49
+    public function member()
50
+    {
51
+        return $this->hasOne(Member::class);
52
+    }
53
+
42 54
     public function scopeFilter($query, $id)
43 55
     {
44 56
         $query->when($id ?? null, function ($query, $id) {
45 57
             $query->where('id', $id);
46 58
         });
47 59
     }
60
+
61
+    public function maxVehicleDetail()
62
+    {
63
+        $maxVehicle = $this->maxVehicles->transform(fn($maxVehicle) => $maxVehicle->typeVehicle->type . ', ' . 'Maksimal Kendaraan ' . $maxVehicle->max)->toArray();
64
+
65
+        return implode(". ", $maxVehicle);
66
+    }
48 67
 }

+ 1
- 1
database/migrations/2022_04_20_031727_create_type_members_table.php Bestand weergeven

@@ -16,7 +16,7 @@ return new class extends Migration
16 16
         Schema::create('type_members', function (Blueprint $table) {
17 17
             $table->id();
18 18
             $table->string('type');
19
-            $table->text('description');
19
+            $table->text('description')->nullable()->default(null);
20 20
             $table->unsignedInteger('price');
21 21
             $table->timestamps();
22 22
         });

+ 1
- 1
database/migrations/2022_04_28_111602_create_max_vehicles_table.php Bestand weergeven

@@ -16,7 +16,7 @@ return new class extends Migration
16 16
         Schema::create('max_vehicles', function (Blueprint $table) {
17 17
             $table->id();
18 18
             $table->unsignedInteger('max');
19
-            $table->foreignId('member_id')->constrained();
19
+            $table->foreignId('type_member_id')->constrained()->cascadeOnDelete();
20 20
             $table->foreignId('type_vehicle_id')->constrained();
21 21
             $table->timestamps();
22 22
         });

+ 1
- 1
designs/diagrams/database.puml Bestand weergeven

@@ -77,7 +77,7 @@ entity MaxVehicle {
77 77
   * id
78 78
   __
79 79
   * max
80
-  * member_id
80
+  * type_member_id
81 81
   * type_vehicle_id
82 82
 }
83 83
 

BIN
designs/diagrams/database/Database.png Bestand weergeven


+ 5
- 0
lang/en/messages.php Bestand weergeven

@@ -41,6 +41,7 @@ return [
41 41
             'user' => 'User Account successfully changed',
42 42
         ],
43 43
         'destroy' => [
44
+            'type_member' => 'Jenis member successfully deleted',
44 45
             'type_vehicle' => 'Type vehicle successfully deleted',
45 46
             'top_up' => 'Top Up successfully deleted',
46 47
             'member' => 'Member Account successfully deleted',
@@ -50,10 +51,14 @@ return [
50 51
 
51 52
     'error' => [
52 53
         'store' => [
54
+            'type_member' => 'Type member failed to be added',
53 55
             'member' => 'member failed to be added',
54 56
             'change_password' => 'Password invalid',
55 57
             'expense' => 'Expense failed to be added',
56 58
             'transaction' => 'Transaction failed to be added',
57 59
         ],
60
+        'update' => [
61
+            'type_member' => 'Type member failed to be changed',
62
+        ],
58 63
     ],
59 64
 ];

+ 6
- 1
lang/id/messages.php Bestand weergeven

@@ -41,6 +41,7 @@ return [
41 41
             'user' => 'Akun user berhasil diubah',
42 42
         ],
43 43
         'destroy' => [
44
+            'type_member' => 'Jenis member berhasil dihapus',
44 45
             'type_vehicle' => 'Jenis kendaraan berhasil dihapus',
45 46
             'top_up' => 'Top Up berhasil dihapus',
46 47
             'member' => 'Akun member berhasil dihapus',
@@ -50,10 +51,14 @@ return [
50 51
 
51 52
     'error' => [
52 53
         'store' => [
53
-            'member' => 'member gagal ditambahkan',
54
+            'type_member' => 'Jenis member gagal ditambahkan',
55
+            'member' => 'Member gagal ditambahkan',
54 56
             'change_password' => 'Password lama salah',
55 57
             'expense' => 'Pengeluaran gagal ditambahkan',
56 58
             'transaction' => 'Transaksi gagal ditambahkan',
57 59
         ],
60
+        'update' => [
61
+            'type_member' => 'Jenis member gagal diubah',
62
+        ],
58 63
     ],
59 64
 ];

+ 445
- 18
public/js/resources_js_pages_typemember_Create_vue.js Bestand weergeven

@@ -1,6 +1,97 @@
1 1
 "use strict";
2 2
 (self["webpackChunk"] = self["webpackChunk"] || []).push([["resources_js_pages_typemember_Create_vue"],{
3 3
 
4
+/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
5
+/*!****************************************************************************************************************************************************************************************************************!*\
6
+  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
7
+  \****************************************************************************************************************************************************************************************************************/
8
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9
+
10
+__webpack_require__.r(__webpack_exports__);
11
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
13
+/* harmony export */ });
14
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
15
+
16
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
17
+  props: {
18
+    label: {
19
+      type: String,
20
+      required: true
21
+    },
22
+    optionLabel: {
23
+      type: String,
24
+      "default": 'label'
25
+    },
26
+    optionValue: {
27
+      type: String,
28
+      "default": 'value'
29
+    },
30
+    optionDisabled: {
31
+      type: String,
32
+      "default": 'disabled'
33
+    },
34
+    options: {
35
+      type: Array,
36
+      required: true
37
+    },
38
+    placeholder: {
39
+      type: String,
40
+      required: true
41
+    },
42
+    disabled: {
43
+      type: Boolean,
44
+      "default": false
45
+    },
46
+    error: {
47
+      type: String,
48
+      "default": null
49
+    },
50
+    modelValue: null
51
+  },
52
+  emits: ['update:modelValue'],
53
+  setup: function setup(__props, _ref) {
54
+    var expose = _ref.expose;
55
+    expose();
56
+    var props = __props;
57
+    var isError = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
58
+      return props.error ? true : false;
59
+    });
60
+    var forLabel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
61
+      return props.label ? props.label.toLowerCase().replace(/\s+/g, '-') : null;
62
+    });
63
+    var ariaDescribedbyLabel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
64
+      return props.label ? props.label.toLowerCase().replace(/\s+/g, '-') + '-help' : null;
65
+    });
66
+
67
+    var selectedDropdownLabel = function selectedDropdownLabel(value) {
68
+      var result = props.options.find(function (option) {
69
+        return option[props.optionValue] == value;
70
+      });
71
+
72
+      if (result) {
73
+        return result[props.optionLabel];
74
+      }
75
+    };
76
+
77
+    var __returned__ = {
78
+      props: props,
79
+      isError: isError,
80
+      forLabel: forLabel,
81
+      ariaDescribedbyLabel: ariaDescribedbyLabel,
82
+      selectedDropdownLabel: selectedDropdownLabel,
83
+      computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed
84
+    };
85
+    Object.defineProperty(__returned__, '__isScriptSetup', {
86
+      enumerable: false,
87
+      value: true
88
+    });
89
+    return __returned__;
90
+  }
91
+});
92
+
93
+/***/ }),
94
+
4 95
 /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppInputNumber.vue?vue&type=script&setup=true&lang=js":
5 96
 /*!*******************************************************************************************************************************************************************************************************************!*\
6 97
   !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppInputNumber.vue?vue&type=script&setup=true&lang=js ***!
@@ -615,8 +706,12 @@ __webpack_require__.r(__webpack_exports__);
615 706
 /* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
616 707
 /* harmony import */ var _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/layouts/AppLayout.vue */ "./resources/js/layouts/AppLayout.vue");
617 708
 /* harmony import */ var _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/AppInputText.vue */ "./resources/js/components/AppInputText.vue");
618
-/* harmony import */ var _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/AppInputNumber.vue */ "./resources/js/components/AppInputNumber.vue");
619
-/* harmony import */ var _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppTextArea.vue */ "./resources/js/components/AppTextArea.vue");
709
+/* harmony import */ var _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/AppDropdown.vue */ "./resources/js/components/AppDropdown.vue");
710
+/* harmony import */ var _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppInputNumber.vue */ "./resources/js/components/AppInputNumber.vue");
711
+/* harmony import */ var _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/components/AppTextArea.vue */ "./resources/js/components/AppTextArea.vue");
712
+/* harmony import */ var _TableHeader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TableHeader */ "./resources/js/pages/typemember/TableHeader.js");
713
+
714
+
620 715
 
621 716
 
622 717
 
@@ -624,43 +719,107 @@ __webpack_require__.r(__webpack_exports__);
624 719
 
625 720
 
626 721
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
722
+  props: {
723
+    typeVehicles: Object
724
+  },
627 725
   setup: function setup(__props, _ref) {
628 726
     var expose = _ref.expose;
629 727
     expose();
728
+    var props = __props;
630 729
     var errors = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
631 730
       return (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.usePage)().props.value.errors;
632 731
     });
633 732
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(errors, function () {
634 733
       form.clearErrors();
635 734
     });
735
+    var listVehicle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)([]);
736
+
737
+    var vehicleClear = function vehicleClear() {
738
+      listVehicle.splice(0);
739
+    };
740
+
741
+    var vehicleOnDelete = function vehicleOnDelete(index) {
742
+      listVehicle.splice(index, 1);
743
+    };
744
+
745
+    var vehicleOnAdd = function vehicleOnAdd() {
746
+      form.clearErrors('type_vehicle_id', 'max_vehicle');
747
+
748
+      if (!form.type_vehicle_id) {
749
+        form.setError('type_vehicle_id', 'Tidak boleh kosong');
750
+        return;
751
+      }
752
+
753
+      if (!form.max_vehicle) {
754
+        form.setError('max_vehicle', 'Tidak boleh kosong');
755
+        return;
756
+      }
757
+
758
+      var listVehicleExist = listVehicle.filter(function (val) {
759
+        return val.typeVehicleId === form.type_vehicle_id;
760
+      });
761
+
762
+      if (listVehicleExist.length) {
763
+        form.setError('type_vehicle_id', 'Jenis Kendaraan sudah ada');
764
+        return;
765
+      }
766
+
767
+      var typeVehicle = props.typeVehicles.filter(function (val) {
768
+        return val.value === form.type_vehicle_id;
769
+      })[0];
770
+      listVehicle.push({
771
+        max: form.max_vehicle,
772
+        type: typeVehicle.label,
773
+        typeVehicleId: typeVehicle.value
774
+      });
775
+      form.reset('type_vehicle_id', 'max_vehicle');
776
+    };
777
+
636 778
     var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.useForm)({
637 779
       type: null,
638 780
       description: null,
639 781
       price: null,
640
-      max: null
782
+      type_vehicle_id: null,
783
+      max_vehicle: null
641 784
     });
642 785
 
643 786
     var submit = function submit() {
644
-      form.post(route('type-members.store'), {
787
+      form.transform(function (data) {
788
+        return {
789
+          type: data.type,
790
+          description: data.description,
791
+          price: data.price,
792
+          maxVehicles: listVehicle
793
+        };
794
+      }).post(route('type-members.store'), {
645 795
         onSuccess: function onSuccess() {
646
-          return form.reset();
796
+          vehicleClear();
797
+          form.reset();
647 798
         }
648 799
       });
649 800
     };
650 801
 
651 802
     var __returned__ = {
803
+      props: props,
652 804
       errors: errors,
805
+      listVehicle: listVehicle,
806
+      vehicleClear: vehicleClear,
807
+      vehicleOnDelete: vehicleOnDelete,
808
+      vehicleOnAdd: vehicleOnAdd,
653 809
       form: form,
654 810
       submit: submit,
655 811
       computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed,
812
+      reactive: vue__WEBPACK_IMPORTED_MODULE_0__.reactive,
656 813
       watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,
657 814
       Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.Head,
658 815
       useForm: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.useForm,
659 816
       usePage: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.usePage,
660 817
       AppLayout: _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_2__["default"],
661 818
       AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_3__["default"],
662
-      AppInputNumber: _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_4__["default"],
663
-      AppTextArea: _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_5__["default"]
819
+      AppDropdown: _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_4__["default"],
820
+      AppInputNumber: _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_5__["default"],
821
+      AppTextArea: _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_6__["default"],
822
+      Vehicle: _TableHeader__WEBPACK_IMPORTED_MODULE_7__.Vehicle
664 823
     };
665 824
     Object.defineProperty(__returned__, '__isScriptSetup', {
666 825
       enumerable: false,
@@ -672,6 +831,87 @@ __webpack_require__.r(__webpack_exports__);
672 831
 
673 832
 /***/ }),
674 833
 
834
+/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
835
+/*!*********************************************************************************************************************************************************************************************************************************************************************************!*\
836
+  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
837
+  \*********************************************************************************************************************************************************************************************************************************************************************************/
838
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
839
+
840
+__webpack_require__.r(__webpack_exports__);
841
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
842
+/* harmony export */   "render": () => (/* binding */ render)
843
+/* harmony export */ });
844
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
845
+
846
+var _hoisted_1 = {
847
+  "class": "field"
848
+};
849
+var _hoisted_2 = ["for"];
850
+var _hoisted_3 = {
851
+  key: 0
852
+};
853
+var _hoisted_4 = {
854
+  key: 1
855
+};
856
+var _hoisted_5 = ["id"];
857
+function render(_ctx, _cache, $props, $setup, $data, $options) {
858
+  var _component_Dropdown = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Dropdown");
859
+
860
+  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_1, [$props.label ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("label", {
861
+    key: 0,
862
+    "for": $setup.forLabel
863
+  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.label), 9
864
+  /* TEXT, PROPS */
865
+  , _hoisted_2)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Dropdown, {
866
+    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["w-full", {
867
+      'p-invalid': $setup.isError
868
+    }]),
869
+    id: $setup.forLabel,
870
+    "aria-describedby": $setup.ariaDescribedbyLabel,
871
+    "option-disabled": $props.optionDisabled,
872
+    "option-label": $props.optionLabel,
873
+    "option-value": $props.optionValue,
874
+    placeholder: $props.placeholder,
875
+    options: $props.options,
876
+    "model-value": $props.modelValue,
877
+    disabled: $props.disabled,
878
+    onChange: _cache[0] || (_cache[0] = function ($event) {
879
+      return _ctx.$emit('update:modelValue', $event.value);
880
+    })
881
+  }, {
882
+    value: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (slotProps) {
883
+      return [slotProps.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.selectedDropdownLabel(slotProps.value)), 1
884
+      /* TEXT */
885
+      )) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_4, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(slotProps.placeholder), 1
886
+      /* TEXT */
887
+      ))];
888
+    }),
889
+    option: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
890
+      var option = _ref.option,
891
+          index = _ref.index;
892
+      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "option", {
893
+        option: option,
894
+        index: index
895
+      })];
896
+    }),
897
+    _: 3
898
+    /* FORWARDED */
899
+
900
+  }, 8
901
+  /* PROPS */
902
+  , ["class", "id", "aria-describedby", "option-disabled", "option-label", "option-value", "placeholder", "options", "model-value", "disabled"]), $props.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("small", {
903
+    key: 1,
904
+    id: $setup.ariaDescribedbyLabel,
905
+    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)({
906
+      'p-error': $setup.isError
907
+    })
908
+  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.error), 11
909
+  /* TEXT, CLASS, PROPS */
910
+  , _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]);
911
+}
912
+
913
+/***/ }),
914
+
675 915
 /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":
676 916
 /*!*******************************************************************************************************************************************************************************************************************************************************************************!*\
677 917
   !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e ***!
@@ -1370,18 +1610,46 @@ var _hoisted_6 = {
1370 1610
   "class": "col-12 md:col-6"
1371 1611
 };
1372 1612
 var _hoisted_7 = {
1373
-  "class": "col-12 sm:col-6"
1613
+  "class": "col-12"
1374 1614
 };
1375 1615
 var _hoisted_8 = {
1376
-  "class": "col-12 md:col-6"
1616
+  "class": "grid"
1377 1617
 };
1378 1618
 var _hoisted_9 = {
1379
-  "class": "flex flex-column md:flex-row justify-content-end"
1619
+  "class": "col-12 md:col-8"
1620
+};
1621
+var _hoisted_10 = {
1622
+  "class": "grid"
1623
+};
1624
+var _hoisted_11 = {
1625
+  "class": "col-12 md:col-6"
1626
+};
1627
+var _hoisted_12 = {
1628
+  "class": "col-12 md:col-6"
1629
+};
1630
+var _hoisted_13 = {
1631
+  "class": "col-12"
1632
+};
1633
+var _hoisted_14 = {
1634
+  "class": "flex flex-column md:flex-row md:justify-content-end"
1635
+};
1636
+var _hoisted_15 = {
1637
+  "class": "col-12 md-col-6"
1638
+};
1639
+var _hoisted_16 = {
1640
+  "class": "flex justify-content-end"
1641
+};
1642
+var _hoisted_17 = {
1643
+  "class": "flex flex-column md:flex-row md:justify-content-end"
1380 1644
 };
1381 1645
 function render(_ctx, _cache, $props, $setup, $data, $options) {
1646
+  var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card");
1647
+
1382 1648
   var _component_Button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Button");
1383 1649
 
1384
-  var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card");
1650
+  var _component_Column = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Column");
1651
+
1652
+  var _component_DataTable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("DataTable");
1385 1653
 
1386 1654
   return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["Head"], {
1387 1655
     title: "Tambah Jenis Member"
@@ -1422,24 +1690,89 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1422 1690
             error: $setup.form.errors.description
1423 1691
           }, null, 8
1424 1692
           /* PROPS */
1425
-          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputNumber"], {
1426
-            modelValue: $setup.form.max,
1693
+          , ["modelValue", "error"])])])];
1694
+        }),
1695
+        _: 1
1696
+        /* STABLE */
1697
+
1698
+      })])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, null, {
1699
+        content: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1700
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_11, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1701
+            label: "Jenis Kendaraan",
1702
+            placeholder: "jenis kendaraan",
1703
+            modelValue: $setup.form.type_vehicle_id,
1427 1704
             "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) {
1428
-              return $setup.form.max = $event;
1705
+              return $setup.form.type_vehicle_id = $event;
1706
+            }),
1707
+            options: $props.typeVehicles,
1708
+            error: $setup.form.errors.type_vehicle_id
1709
+          }, null, 8
1710
+          /* PROPS */
1711
+          , ["modelValue", "options", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputNumber"], {
1712
+            modelValue: $setup.form.max_vehicle,
1713
+            "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) {
1714
+              return $setup.form.max_vehicle = $event;
1429 1715
             }),
1430 1716
             label: "Maksimal Kendaraan",
1431 1717
             placeholder: "maksimal kendaraan",
1432
-            error: $setup.form.errors.max
1718
+            error: $setup.form.errors.max_vehicle
1433 1719
           }, null, 8
1434 1720
           /* PROPS */
1435
-          , ["modelValue", "error"])])])];
1721
+          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1722
+            label: "Tambah",
1723
+            icon: "pi pi-car",
1724
+            "class": "p-button-outlined",
1725
+            onClick: $setup.vehicleOnAdd
1726
+          })])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1727
+            "striped-rows": "",
1728
+            "row-hover": "",
1729
+            "responsive-layout": "scroll",
1730
+            "column-resize-mode": "expand",
1731
+            "edit-mode": "cell",
1732
+            value: $setup.listVehicle
1733
+          }, {
1734
+            "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1735
+              return [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.Vehicle, function (vehicle) {
1736
+                return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_Column, {
1737
+                  field: vehicle.field,
1738
+                  header: vehicle.header,
1739
+                  key: vehicle.field
1740
+                }, null, 8
1741
+                /* PROPS */
1742
+                , ["field", "header"]);
1743
+              }), 128
1744
+              /* KEYED_FRAGMENT */
1745
+              )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1746
+                body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1747
+                  var index = _ref.index;
1748
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1749
+                    icon: "pi pi-trash",
1750
+                    "class": "p-button-rounded p-button-text",
1751
+                    onClick: function onClick($event) {
1752
+                      return $setup.vehicleOnDelete(index);
1753
+                    }
1754
+                  }, null, 8
1755
+                  /* PROPS */
1756
+                  , ["onClick"])])];
1757
+                }),
1758
+                _: 1
1759
+                /* STABLE */
1760
+
1761
+              })];
1762
+            }),
1763
+            _: 1
1764
+            /* STABLE */
1765
+
1766
+          }, 8
1767
+          /* PROPS */
1768
+          , ["value"])])])];
1436 1769
         }),
1437 1770
         footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1438
-          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1771
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1439 1772
             label: "Simpan",
1440 1773
             icon: "pi pi-check",
1441 1774
             "class": "p-button-outlined",
1442
-            disabled: $setup.form.processing,
1775
+            disabled: $setup.form.processing || $setup.listVehicle.length === 0,
1443 1776
             onClick: $setup.submit
1444 1777
           }, null, 8
1445 1778
           /* PROPS */
@@ -1460,6 +1793,43 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1460 1793
 
1461 1794
 /***/ }),
1462 1795
 
1796
+/***/ "./resources/js/pages/typemember/TableHeader.js":
1797
+/*!******************************************************!*\
1798
+  !*** ./resources/js/pages/typemember/TableHeader.js ***!
1799
+  \******************************************************/
1800
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1801
+
1802
+__webpack_require__.r(__webpack_exports__);
1803
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1804
+/* harmony export */   "IndexTable": () => (/* binding */ IndexTable),
1805
+/* harmony export */   "Vehicle": () => (/* binding */ Vehicle)
1806
+/* harmony export */ });
1807
+var IndexTable = [{
1808
+  field: 'updatedAt',
1809
+  header: 'Diperbaharui'
1810
+}, {
1811
+  field: 'type',
1812
+  header: 'Jenis Member'
1813
+}, {
1814
+  field: 'description',
1815
+  header: 'Keterangan'
1816
+}, {
1817
+  field: 'price',
1818
+  header: 'Tarif Member'
1819
+}, {
1820
+  field: 'max',
1821
+  header: 'Maksimal Kendaraan'
1822
+}];
1823
+var Vehicle = [{
1824
+  field: 'type',
1825
+  header: 'Jenis Kendaraan'
1826
+}, {
1827
+  field: 'max',
1828
+  header: 'Maksimal Kendaraan'
1829
+}];
1830
+
1831
+/***/ }),
1832
+
1463 1833
 /***/ "./resources/js/utils/menu.js":
1464 1834
 /*!************************************!*\
1465 1835
   !*** ./resources/js/utils/menu.js ***!
@@ -1571,6 +1941,33 @@ exports["default"] = (sfc, props) => {
1571 1941
 };
1572 1942
 
1573 1943
 
1944
+/***/ }),
1945
+
1946
+/***/ "./resources/js/components/AppDropdown.vue":
1947
+/*!*************************************************!*\
1948
+  !*** ./resources/js/components/AppDropdown.vue ***!
1949
+  \*************************************************/
1950
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1951
+
1952
+__webpack_require__.r(__webpack_exports__);
1953
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1954
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1955
+/* harmony export */ });
1956
+/* harmony import */ var _AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AppDropdown.vue?vue&type=template&id=ce0d1992 */ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992");
1957
+/* harmony import */ var _AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AppDropdown.vue?vue&type=script&setup=true&lang=js */ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js");
1958
+/* harmony import */ var _home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ "./node_modules/vue-loader/dist/exportHelper.js");
1959
+
1960
+
1961
+
1962
+
1963
+;
1964
+const __exports__ = /*#__PURE__*/(0,_home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__["default"], [['render',_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__.render],['__file',"resources/js/components/AppDropdown.vue"]])
1965
+/* hot reload */
1966
+if (false) {}
1967
+
1968
+
1969
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1970
+
1574 1971
 /***/ }),
1575 1972
 
1576 1973
 /***/ "./resources/js/components/AppFooter.vue":
@@ -1839,6 +2236,21 @@ if (false) {}
1839 2236
 
1840 2237
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1841 2238
 
2239
+/***/ }),
2240
+
2241
+/***/ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
2242
+/*!************************************************************************************!*\
2243
+  !*** ./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
2244
+  \************************************************************************************/
2245
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2246
+
2247
+__webpack_require__.r(__webpack_exports__);
2248
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2249
+/* harmony export */   "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__["default"])
2250
+/* harmony export */ });
2251
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDropdown.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js");
2252
+ 
2253
+
1842 2254
 /***/ }),
1843 2255
 
1844 2256
 /***/ "./resources/js/components/AppInputNumber.vue?vue&type=script&setup=true&lang=js":
@@ -1974,6 +2386,21 @@ __webpack_require__.r(__webpack_exports__);
1974 2386
 /* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Create_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./Create.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/pages/typemember/Create.vue?vue&type=script&setup=true&lang=js");
1975 2387
  
1976 2388
 
2389
+/***/ }),
2390
+
2391
+/***/ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
2392
+/*!*******************************************************************************!*\
2393
+  !*** ./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
2394
+  \*******************************************************************************/
2395
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2396
+
2397
+__webpack_require__.r(__webpack_exports__);
2398
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2399
+/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__.render)
2400
+/* harmony export */ });
2401
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDropdown.vue?vue&type=template&id=ce0d1992 */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992");
2402
+
2403
+
1977 2404
 /***/ }),
1978 2405
 
1979 2406
 /***/ "./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":

+ 687
- 30
public/js/resources_js_pages_typemember_Edit_vue.js Bestand weergeven

@@ -1,6 +1,141 @@
1 1
 "use strict";
2 2
 (self["webpackChunk"] = self["webpackChunk"] || []).push([["resources_js_pages_typemember_Edit_vue"],{
3 3
 
4
+/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js":
5
+/*!**************************************************************************************************************************************************************************************************************!*\
6
+  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js ***!
7
+  \**************************************************************************************************************************************************************************************************************/
8
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9
+
10
+__webpack_require__.r(__webpack_exports__);
11
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
13
+/* harmony export */ });
14
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
15
+  props: {
16
+    message: {
17
+      type: String,
18
+      "default": null
19
+    },
20
+    header: {
21
+      type: String,
22
+      "default": 'Peringatan'
23
+    },
24
+    cancelLabel: {
25
+      type: String,
26
+      "default": 'Tidak'
27
+    },
28
+    agreeLabel: {
29
+      type: String,
30
+      "default": 'Ya'
31
+    }
32
+  },
33
+  emits: ['cancel', 'agree'],
34
+  setup: function setup(__props, _ref) {
35
+    var expose = _ref.expose;
36
+    expose();
37
+    var __returned__ = {};
38
+    Object.defineProperty(__returned__, '__isScriptSetup', {
39
+      enumerable: false,
40
+      value: true
41
+    });
42
+    return __returned__;
43
+  }
44
+});
45
+
46
+/***/ }),
47
+
48
+/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
49
+/*!****************************************************************************************************************************************************************************************************************!*\
50
+  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
51
+  \****************************************************************************************************************************************************************************************************************/
52
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
53
+
54
+__webpack_require__.r(__webpack_exports__);
55
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
56
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
57
+/* harmony export */ });
58
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
59
+
60
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
61
+  props: {
62
+    label: {
63
+      type: String,
64
+      required: true
65
+    },
66
+    optionLabel: {
67
+      type: String,
68
+      "default": 'label'
69
+    },
70
+    optionValue: {
71
+      type: String,
72
+      "default": 'value'
73
+    },
74
+    optionDisabled: {
75
+      type: String,
76
+      "default": 'disabled'
77
+    },
78
+    options: {
79
+      type: Array,
80
+      required: true
81
+    },
82
+    placeholder: {
83
+      type: String,
84
+      required: true
85
+    },
86
+    disabled: {
87
+      type: Boolean,
88
+      "default": false
89
+    },
90
+    error: {
91
+      type: String,
92
+      "default": null
93
+    },
94
+    modelValue: null
95
+  },
96
+  emits: ['update:modelValue'],
97
+  setup: function setup(__props, _ref) {
98
+    var expose = _ref.expose;
99
+    expose();
100
+    var props = __props;
101
+    var isError = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
102
+      return props.error ? true : false;
103
+    });
104
+    var forLabel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
105
+      return props.label ? props.label.toLowerCase().replace(/\s+/g, '-') : null;
106
+    });
107
+    var ariaDescribedbyLabel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
108
+      return props.label ? props.label.toLowerCase().replace(/\s+/g, '-') + '-help' : null;
109
+    });
110
+
111
+    var selectedDropdownLabel = function selectedDropdownLabel(value) {
112
+      var result = props.options.find(function (option) {
113
+        return option[props.optionValue] == value;
114
+      });
115
+
116
+      if (result) {
117
+        return result[props.optionLabel];
118
+      }
119
+    };
120
+
121
+    var __returned__ = {
122
+      props: props,
123
+      isError: isError,
124
+      forLabel: forLabel,
125
+      ariaDescribedbyLabel: ariaDescribedbyLabel,
126
+      selectedDropdownLabel: selectedDropdownLabel,
127
+      computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed
128
+    };
129
+    Object.defineProperty(__returned__, '__isScriptSetup', {
130
+      enumerable: false,
131
+      value: true
132
+    });
133
+    return __returned__;
134
+  }
135
+});
136
+
137
+/***/ }),
138
+
4 139
 /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppInputNumber.vue?vue&type=script&setup=true&lang=js":
5 140
 /*!*******************************************************************************************************************************************************************************************************************!*\
6 141
   !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppInputNumber.vue?vue&type=script&setup=true&lang=js ***!
@@ -612,11 +747,19 @@ __webpack_require__.r(__webpack_exports__);
612 747
 /* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
613 748
 /* harmony export */ });
614 749
 /* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
615
-/* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
616
-/* harmony import */ var _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/layouts/AppLayout.vue */ "./resources/js/layouts/AppLayout.vue");
617
-/* harmony import */ var _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/AppInputText.vue */ "./resources/js/components/AppInputText.vue");
618
-/* harmony import */ var _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/AppInputNumber.vue */ "./resources/js/components/AppInputNumber.vue");
619
-/* harmony import */ var _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppTextArea.vue */ "./resources/js/components/AppTextArea.vue");
750
+/* harmony import */ var _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @inertiajs/inertia */ "./node_modules/@inertiajs/inertia/dist/index.js");
751
+/* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
752
+/* harmony import */ var _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/layouts/AppLayout.vue */ "./resources/js/layouts/AppLayout.vue");
753
+/* harmony import */ var _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/AppInputText.vue */ "./resources/js/components/AppInputText.vue");
754
+/* harmony import */ var _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppDropdown.vue */ "./resources/js/components/AppDropdown.vue");
755
+/* harmony import */ var _components_AppDialog_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/components/AppDialog.vue */ "./resources/js/components/AppDialog.vue");
756
+/* harmony import */ var _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/components/AppInputNumber.vue */ "./resources/js/components/AppInputNumber.vue");
757
+/* harmony import */ var _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/components/AppTextArea.vue */ "./resources/js/components/AppTextArea.vue");
758
+/* harmony import */ var _TableHeader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./TableHeader */ "./resources/js/pages/typemember/TableHeader.js");
759
+
760
+
761
+
762
+
620 763
 
621 764
 
622 765
 
@@ -625,43 +768,125 @@ __webpack_require__.r(__webpack_exports__);
625 768
 
626 769
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
627 770
   props: {
628
-    typeMember: Object
771
+    typeMember: Object,
772
+    typeVehicles: Object,
773
+    maxVehicles: Object
629 774
   },
630 775
   setup: function setup(__props, _ref) {
631 776
     var expose = _ref.expose;
632 777
     expose();
633 778
     var props = __props;
634 779
     var errors = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
635
-      return (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.usePage)().props.value.errors;
780
+      return (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.usePage)().props.value.errors;
636 781
     });
637 782
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(errors, function () {
638 783
       form.clearErrors();
639 784
     });
640
-    var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.useForm)({
785
+    var visibleDialog = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);
786
+
787
+    var confirmDialog = function confirmDialog() {
788
+      visibleDialog.value = true;
789
+    };
790
+
791
+    var onAgree = function onAgree() {
792
+      return _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia["delete"](route('type-members.destroy', props.typeMember.id));
793
+    };
794
+
795
+    var onCancel = function onCancel() {
796
+      return visibleDialog.value = false;
797
+    };
798
+
799
+    var listVehicle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)([]);
800
+    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(function () {
801
+      props.maxVehicles.forEach(function (val) {
802
+        return listVehicle.push(val);
803
+      });
804
+    });
805
+
806
+    var vehicleOnDelete = function vehicleOnDelete(index) {
807
+      listVehicle.splice(index, 1);
808
+    };
809
+
810
+    var vehicleOnAdd = function vehicleOnAdd() {
811
+      form.clearErrors('type_vehicle_id', 'max_vehicle');
812
+
813
+      if (!form.type_vehicle_id) {
814
+        form.setError('type_vehicle_id', 'Tidak boleh kosong');
815
+        return;
816
+      }
817
+
818
+      if (!form.max_vehicle) {
819
+        form.setError('max_vehicle', 'Tidak boleh kosong');
820
+        return;
821
+      }
822
+
823
+      var listVehicleExist = listVehicle.filter(function (val) {
824
+        return val.typeVehicleId === form.type_vehicle_id;
825
+      });
826
+
827
+      if (listVehicleExist.length) {
828
+        form.setError('type_vehicle_id', 'Jenis Kendaraan sudah ada');
829
+        return;
830
+      }
831
+
832
+      var typeVehicle = props.typeVehicles.filter(function (val) {
833
+        return val.value === form.type_vehicle_id;
834
+      })[0];
835
+      listVehicle.push({
836
+        max: form.max_vehicle,
837
+        type: typeVehicle.label,
838
+        typeVehicleId: typeVehicle.value
839
+      });
840
+      form.reset('type_vehicle_id', 'max_vehicle');
841
+    };
842
+
843
+    var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm)({
641 844
       type: props.typeMember.type,
642 845
       description: props.typeMember.description,
643 846
       price: props.typeMember.price,
644
-      max: props.typeMember.max
847
+      type_vehicle_id: null,
848
+      max_vehicle: null
645 849
     });
646 850
 
647 851
     var submit = function submit() {
648
-      form.put(route('type-members.update', props.typeMember.id));
852
+      form.transform(function (data) {
853
+        return {
854
+          type: data.type,
855
+          description: data.description,
856
+          price: data.price,
857
+          maxVehicles: listVehicle
858
+        };
859
+      }).put(route('type-members.update', props.typeMember.id));
649 860
     };
650 861
 
651 862
     var __returned__ = {
652 863
       props: props,
653 864
       errors: errors,
865
+      visibleDialog: visibleDialog,
866
+      confirmDialog: confirmDialog,
867
+      onAgree: onAgree,
868
+      onCancel: onCancel,
869
+      listVehicle: listVehicle,
870
+      vehicleOnDelete: vehicleOnDelete,
871
+      vehicleOnAdd: vehicleOnAdd,
654 872
       form: form,
655 873
       submit: submit,
656 874
       computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed,
657 875
       watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,
658
-      Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.Head,
659
-      useForm: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.useForm,
660
-      usePage: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_1__.usePage,
661
-      AppLayout: _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_2__["default"],
662
-      AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_3__["default"],
663
-      AppInputNumber: _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_4__["default"],
664
-      AppTextArea: _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_5__["default"]
876
+      reactive: vue__WEBPACK_IMPORTED_MODULE_0__.reactive,
877
+      onMounted: vue__WEBPACK_IMPORTED_MODULE_0__.onMounted,
878
+      ref: vue__WEBPACK_IMPORTED_MODULE_0__.ref,
879
+      Inertia: _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia,
880
+      Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.Head,
881
+      useForm: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm,
882
+      usePage: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.usePage,
883
+      AppLayout: _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_3__["default"],
884
+      AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_4__["default"],
885
+      AppDropdown: _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_5__["default"],
886
+      AppDialog: _components_AppDialog_vue__WEBPACK_IMPORTED_MODULE_6__["default"],
887
+      AppInputNumber: _components_AppInputNumber_vue__WEBPACK_IMPORTED_MODULE_7__["default"],
888
+      AppTextArea: _components_AppTextArea_vue__WEBPACK_IMPORTED_MODULE_8__["default"],
889
+      Vehicle: _TableHeader__WEBPACK_IMPORTED_MODULE_9__.Vehicle
665 890
     };
666 891
     Object.defineProperty(__returned__, '__isScriptSetup', {
667 892
       enumerable: false,
@@ -673,6 +898,166 @@ __webpack_require__.r(__webpack_exports__);
673 898
 
674 899
 /***/ }),
675 900
 
901
+/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e":
902
+/*!*******************************************************************************************************************************************************************************************************************************************************************************!*\
903
+  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e ***!
904
+  \*******************************************************************************************************************************************************************************************************************************************************************************/
905
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
906
+
907
+__webpack_require__.r(__webpack_exports__);
908
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
909
+/* harmony export */   "render": () => (/* binding */ render)
910
+/* harmony export */ });
911
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
912
+
913
+var _hoisted_1 = {
914
+  "class": "flex align-items-center justify-content-center"
915
+};
916
+
917
+var _hoisted_2 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", {
918
+  "class": "pi pi-exclamation-triangle mr-3",
919
+  style: {
920
+    "font-size": "2rem"
921
+  }
922
+}, null, -1
923
+/* HOISTED */
924
+);
925
+
926
+var _hoisted_3 = {
927
+  key: 0
928
+};
929
+function render(_ctx, _cache, $props, $setup, $data, $options) {
930
+  var _component_Button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Button");
931
+
932
+  var _component_Dialog = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Dialog");
933
+
934
+  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_Dialog, {
935
+    header: $props.header,
936
+    style: {
937
+      width: '450px'
938
+    },
939
+    modal: true,
940
+    breakpoints: {
941
+      '960px': '75vw'
942
+    }
943
+  }, {
944
+    footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
945
+      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
946
+        label: $props.cancelLabel,
947
+        icon: "pi pi-times",
948
+        "class": "p-button-text",
949
+        onClick: _cache[0] || (_cache[0] = function ($event) {
950
+          return _ctx.$emit('cancel');
951
+        })
952
+      }, null, 8
953
+      /* PROPS */
954
+      , ["label"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
955
+        label: $props.agreeLabel,
956
+        icon: "pi pi-check",
957
+        "class": "p-button-text",
958
+        onClick: _cache[1] || (_cache[1] = function ($event) {
959
+          return _ctx.$emit('agree');
960
+        })
961
+      }, null, 8
962
+      /* PROPS */
963
+      , ["label"])];
964
+    }),
965
+    "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
966
+      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_1, [_hoisted_2, $props.message ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("p", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.message), 1
967
+      /* TEXT */
968
+      )) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)])];
969
+    }),
970
+    _: 1
971
+    /* STABLE */
972
+
973
+  }, 8
974
+  /* PROPS */
975
+  , ["header"]);
976
+}
977
+
978
+/***/ }),
979
+
980
+/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
981
+/*!*********************************************************************************************************************************************************************************************************************************************************************************!*\
982
+  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
983
+  \*********************************************************************************************************************************************************************************************************************************************************************************/
984
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
985
+
986
+__webpack_require__.r(__webpack_exports__);
987
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
988
+/* harmony export */   "render": () => (/* binding */ render)
989
+/* harmony export */ });
990
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
991
+
992
+var _hoisted_1 = {
993
+  "class": "field"
994
+};
995
+var _hoisted_2 = ["for"];
996
+var _hoisted_3 = {
997
+  key: 0
998
+};
999
+var _hoisted_4 = {
1000
+  key: 1
1001
+};
1002
+var _hoisted_5 = ["id"];
1003
+function render(_ctx, _cache, $props, $setup, $data, $options) {
1004
+  var _component_Dropdown = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Dropdown");
1005
+
1006
+  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_1, [$props.label ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("label", {
1007
+    key: 0,
1008
+    "for": $setup.forLabel
1009
+  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.label), 9
1010
+  /* TEXT, PROPS */
1011
+  , _hoisted_2)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Dropdown, {
1012
+    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["w-full", {
1013
+      'p-invalid': $setup.isError
1014
+    }]),
1015
+    id: $setup.forLabel,
1016
+    "aria-describedby": $setup.ariaDescribedbyLabel,
1017
+    "option-disabled": $props.optionDisabled,
1018
+    "option-label": $props.optionLabel,
1019
+    "option-value": $props.optionValue,
1020
+    placeholder: $props.placeholder,
1021
+    options: $props.options,
1022
+    "model-value": $props.modelValue,
1023
+    disabled: $props.disabled,
1024
+    onChange: _cache[0] || (_cache[0] = function ($event) {
1025
+      return _ctx.$emit('update:modelValue', $event.value);
1026
+    })
1027
+  }, {
1028
+    value: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (slotProps) {
1029
+      return [slotProps.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.selectedDropdownLabel(slotProps.value)), 1
1030
+      /* TEXT */
1031
+      )) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_4, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(slotProps.placeholder), 1
1032
+      /* TEXT */
1033
+      ))];
1034
+    }),
1035
+    option: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1036
+      var option = _ref.option,
1037
+          index = _ref.index;
1038
+      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "option", {
1039
+        option: option,
1040
+        index: index
1041
+      })];
1042
+    }),
1043
+    _: 3
1044
+    /* FORWARDED */
1045
+
1046
+  }, 8
1047
+  /* PROPS */
1048
+  , ["class", "id", "aria-describedby", "option-disabled", "option-label", "option-value", "placeholder", "options", "model-value", "disabled"]), $props.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("small", {
1049
+    key: 1,
1050
+    id: $setup.ariaDescribedbyLabel,
1051
+    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)({
1052
+      'p-error': $setup.isError
1053
+    })
1054
+  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.error), 11
1055
+  /* TEXT, CLASS, PROPS */
1056
+  , _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]);
1057
+}
1058
+
1059
+/***/ }),
1060
+
676 1061
 /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":
677 1062
 /*!*******************************************************************************************************************************************************************************************************************************************************************************!*\
678 1063
   !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e ***!
@@ -1371,18 +1756,59 @@ var _hoisted_6 = {
1371 1756
   "class": "col-12 md:col-6"
1372 1757
 };
1373 1758
 var _hoisted_7 = {
1374
-  "class": "col-12 sm:col-6"
1759
+  "class": "col-12"
1375 1760
 };
1376 1761
 var _hoisted_8 = {
1377
-  "class": "col-12 md:col-6"
1762
+  "class": "grid"
1378 1763
 };
1379 1764
 var _hoisted_9 = {
1380
-  "class": "flex flex-column md:flex-row justify-content-end"
1765
+  "class": "col-12 md:col-8"
1766
+};
1767
+var _hoisted_10 = {
1768
+  "class": "grid"
1769
+};
1770
+var _hoisted_11 = {
1771
+  "class": "col-12 md:col-6"
1772
+};
1773
+var _hoisted_12 = {
1774
+  "class": "col-12 md:col-6"
1775
+};
1776
+var _hoisted_13 = {
1777
+  "class": "col-12"
1778
+};
1779
+var _hoisted_14 = {
1780
+  "class": "flex flex-column md:flex-row md:justify-content-end"
1781
+};
1782
+var _hoisted_15 = {
1783
+  "class": "col-12 md-col-6"
1784
+};
1785
+var _hoisted_16 = {
1786
+  "class": "flex justify-content-end"
1787
+};
1788
+var _hoisted_17 = {
1789
+  "class": "grid"
1790
+};
1791
+var _hoisted_18 = {
1792
+  "class": "col-12 md:col-6"
1793
+};
1794
+var _hoisted_19 = {
1795
+  key: 0,
1796
+  "class": "flex flex-column md:flex-row justify-content-center md:justify-content-start"
1797
+};
1798
+var _hoisted_20 = {
1799
+  "class": "col-12 md:col-6"
1800
+};
1801
+var _hoisted_21 = {
1802
+  "class": "flex flex-column md:flex-row md:justify-content-end"
1381 1803
 };
1382 1804
 function render(_ctx, _cache, $props, $setup, $data, $options) {
1805
+  var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card");
1806
+
1383 1807
   var _component_Button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Button");
1384 1808
 
1385
-  var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card");
1809
+  var _component_Column = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Column");
1810
+
1811
+  var _component_DataTable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("DataTable");
1386 1812
 
1387 1813
   return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["Head"], {
1388 1814
     title: "Ubah Jenis Member"
@@ -1414,37 +1840,117 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1414 1840
           }, null, 8
1415 1841
           /* PROPS */
1416 1842
           , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppTextArea"], {
1417
-            label: "Keterangan",
1418 1843
             modelValue: $setup.form.description,
1419 1844
             "onUpdate:modelValue": _cache[2] || (_cache[2] = function ($event) {
1420 1845
               return $setup.form.description = $event;
1421 1846
             }),
1847
+            label: "Keterangan",
1422 1848
             placeholder: "tulis keterangan disini",
1423 1849
             error: $setup.form.errors.description
1424 1850
           }, null, 8
1425 1851
           /* PROPS */
1426
-          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputNumber"], {
1427
-            modelValue: $setup.form.max,
1852
+          , ["modelValue", "error"])])])];
1853
+        }),
1854
+        _: 1
1855
+        /* STABLE */
1856
+
1857
+      })])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, null, {
1858
+        content: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1859
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_11, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1860
+            label: "Jenis Kendaraan",
1861
+            placeholder: "jenis kendaraan",
1862
+            modelValue: $setup.form.type_vehicle_id,
1428 1863
             "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) {
1429
-              return $setup.form.max = $event;
1864
+              return $setup.form.type_vehicle_id = $event;
1865
+            }),
1866
+            options: $props.typeVehicles,
1867
+            error: $setup.form.errors.type_vehicle_id
1868
+          }, null, 8
1869
+          /* PROPS */
1870
+          , ["modelValue", "options", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputNumber"], {
1871
+            modelValue: $setup.form.max_vehicle,
1872
+            "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) {
1873
+              return $setup.form.max_vehicle = $event;
1430 1874
             }),
1431 1875
             label: "Maksimal Kendaraan",
1432 1876
             placeholder: "maksimal kendaraan",
1433
-            error: $setup.form.errors.max
1877
+            error: $setup.form.errors.max_vehicle
1434 1878
           }, null, 8
1435 1879
           /* PROPS */
1436
-          , ["modelValue", "error"])])])];
1880
+          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1881
+            label: "Tambah",
1882
+            icon: "pi pi-car",
1883
+            "class": "p-button-outlined",
1884
+            onClick: $setup.vehicleOnAdd
1885
+          })])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1886
+            "striped-rows": "",
1887
+            "row-hover": "",
1888
+            "responsive-layout": "scroll",
1889
+            "column-resize-mode": "expand",
1890
+            "edit-mode": "cell",
1891
+            value: $setup.listVehicle
1892
+          }, {
1893
+            "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1894
+              return [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.Vehicle, function (vehicle) {
1895
+                return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_Column, {
1896
+                  field: vehicle.field,
1897
+                  header: vehicle.header,
1898
+                  key: vehicle.field
1899
+                }, null, 8
1900
+                /* PROPS */
1901
+                , ["field", "header"]);
1902
+              }), 128
1903
+              /* KEYED_FRAGMENT */
1904
+              )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1905
+                body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1906
+                  var index = _ref.index;
1907
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1908
+                    icon: "pi pi-trash",
1909
+                    "class": "p-button-rounded p-button-text",
1910
+                    onClick: function onClick($event) {
1911
+                      return $setup.vehicleOnDelete(index);
1912
+                    }
1913
+                  }, null, 8
1914
+                  /* PROPS */
1915
+                  , ["onClick"])])];
1916
+                }),
1917
+                _: 1
1918
+                /* STABLE */
1919
+
1920
+              })];
1921
+            }),
1922
+            _: 1
1923
+            /* STABLE */
1924
+
1925
+          }, 8
1926
+          /* PROPS */
1927
+          , ["value"])])])];
1437 1928
         }),
1438 1929
         footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1439
-          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1930
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [!$props.typeMember.availableToMember ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDialog"], {
1931
+            message: "Yakin akan menghapus data ini?",
1932
+            visible: $setup.visibleDialog,
1933
+            "onUpdate:visible": _cache[5] || (_cache[5] = function ($event) {
1934
+              return $setup.visibleDialog = $event;
1935
+            }),
1936
+            onAgree: $setup.onAgree,
1937
+            onCancel: $setup.onCancel
1938
+          }, null, 8
1939
+          /* PROPS */
1940
+          , ["visible"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1941
+            label: "Hapus",
1942
+            icon: "pi pi-trash",
1943
+            "class": "p-button-outlined p-button-danger",
1944
+            onClick: $setup.confirmDialog
1945
+          })])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1440 1946
             label: "Simpan",
1441 1947
             icon: "pi pi-check",
1442 1948
             "class": "p-button-outlined",
1443
-            disabled: $setup.form.processing,
1949
+            disabled: $setup.form.processing || $setup.listVehicle.length === 0,
1444 1950
             onClick: $setup.submit
1445 1951
           }, null, 8
1446 1952
           /* PROPS */
1447
-          , ["disabled"])])];
1953
+          , ["disabled"])])])])];
1448 1954
         }),
1449 1955
         _: 1
1450 1956
         /* STABLE */
@@ -1461,6 +1967,43 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1461 1967
 
1462 1968
 /***/ }),
1463 1969
 
1970
+/***/ "./resources/js/pages/typemember/TableHeader.js":
1971
+/*!******************************************************!*\
1972
+  !*** ./resources/js/pages/typemember/TableHeader.js ***!
1973
+  \******************************************************/
1974
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1975
+
1976
+__webpack_require__.r(__webpack_exports__);
1977
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1978
+/* harmony export */   "IndexTable": () => (/* binding */ IndexTable),
1979
+/* harmony export */   "Vehicle": () => (/* binding */ Vehicle)
1980
+/* harmony export */ });
1981
+var IndexTable = [{
1982
+  field: 'updatedAt',
1983
+  header: 'Diperbaharui'
1984
+}, {
1985
+  field: 'type',
1986
+  header: 'Jenis Member'
1987
+}, {
1988
+  field: 'description',
1989
+  header: 'Keterangan'
1990
+}, {
1991
+  field: 'price',
1992
+  header: 'Tarif Member'
1993
+}, {
1994
+  field: 'max',
1995
+  header: 'Maksimal Kendaraan'
1996
+}];
1997
+var Vehicle = [{
1998
+  field: 'type',
1999
+  header: 'Jenis Kendaraan'
2000
+}, {
2001
+  field: 'max',
2002
+  header: 'Maksimal Kendaraan'
2003
+}];
2004
+
2005
+/***/ }),
2006
+
1464 2007
 /***/ "./resources/js/utils/menu.js":
1465 2008
 /*!************************************!*\
1466 2009
   !*** ./resources/js/utils/menu.js ***!
@@ -1572,6 +2115,60 @@ exports["default"] = (sfc, props) => {
1572 2115
 };
1573 2116
 
1574 2117
 
2118
+/***/ }),
2119
+
2120
+/***/ "./resources/js/components/AppDialog.vue":
2121
+/*!***********************************************!*\
2122
+  !*** ./resources/js/components/AppDialog.vue ***!
2123
+  \***********************************************/
2124
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2125
+
2126
+__webpack_require__.r(__webpack_exports__);
2127
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2128
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2129
+/* harmony export */ });
2130
+/* harmony import */ var _AppDialog_vue_vue_type_template_id_336aa46e__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AppDialog.vue?vue&type=template&id=336aa46e */ "./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e");
2131
+/* harmony import */ var _AppDialog_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AppDialog.vue?vue&type=script&setup=true&lang=js */ "./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js");
2132
+/* harmony import */ var _home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ "./node_modules/vue-loader/dist/exportHelper.js");
2133
+
2134
+
2135
+
2136
+
2137
+;
2138
+const __exports__ = /*#__PURE__*/(0,_home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_AppDialog_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__["default"], [['render',_AppDialog_vue_vue_type_template_id_336aa46e__WEBPACK_IMPORTED_MODULE_0__.render],['__file',"resources/js/components/AppDialog.vue"]])
2139
+/* hot reload */
2140
+if (false) {}
2141
+
2142
+
2143
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
2144
+
2145
+/***/ }),
2146
+
2147
+/***/ "./resources/js/components/AppDropdown.vue":
2148
+/*!*************************************************!*\
2149
+  !*** ./resources/js/components/AppDropdown.vue ***!
2150
+  \*************************************************/
2151
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2152
+
2153
+__webpack_require__.r(__webpack_exports__);
2154
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2155
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2156
+/* harmony export */ });
2157
+/* harmony import */ var _AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AppDropdown.vue?vue&type=template&id=ce0d1992 */ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992");
2158
+/* harmony import */ var _AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AppDropdown.vue?vue&type=script&setup=true&lang=js */ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js");
2159
+/* harmony import */ var _home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ "./node_modules/vue-loader/dist/exportHelper.js");
2160
+
2161
+
2162
+
2163
+
2164
+;
2165
+const __exports__ = /*#__PURE__*/(0,_home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__["default"], [['render',_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__.render],['__file',"resources/js/components/AppDropdown.vue"]])
2166
+/* hot reload */
2167
+if (false) {}
2168
+
2169
+
2170
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
2171
+
1575 2172
 /***/ }),
1576 2173
 
1577 2174
 /***/ "./resources/js/components/AppFooter.vue":
@@ -1840,6 +2437,36 @@ if (false) {}
1840 2437
 
1841 2438
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1842 2439
 
2440
+/***/ }),
2441
+
2442
+/***/ "./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js":
2443
+/*!**********************************************************************************!*\
2444
+  !*** ./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js ***!
2445
+  \**********************************************************************************/
2446
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2447
+
2448
+__webpack_require__.r(__webpack_exports__);
2449
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2450
+/* harmony export */   "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDialog_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__["default"])
2451
+/* harmony export */ });
2452
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDialog_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDialog.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js");
2453
+ 
2454
+
2455
+/***/ }),
2456
+
2457
+/***/ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
2458
+/*!************************************************************************************!*\
2459
+  !*** ./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
2460
+  \************************************************************************************/
2461
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2462
+
2463
+__webpack_require__.r(__webpack_exports__);
2464
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2465
+/* harmony export */   "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__["default"])
2466
+/* harmony export */ });
2467
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDropdown.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js");
2468
+ 
2469
+
1843 2470
 /***/ }),
1844 2471
 
1845 2472
 /***/ "./resources/js/components/AppInputNumber.vue?vue&type=script&setup=true&lang=js":
@@ -1975,6 +2602,36 @@ __webpack_require__.r(__webpack_exports__);
1975 2602
 /* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Edit_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./Edit.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/pages/typemember/Edit.vue?vue&type=script&setup=true&lang=js");
1976 2603
  
1977 2604
 
2605
+/***/ }),
2606
+
2607
+/***/ "./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e":
2608
+/*!*****************************************************************************!*\
2609
+  !*** ./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e ***!
2610
+  \*****************************************************************************/
2611
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2612
+
2613
+__webpack_require__.r(__webpack_exports__);
2614
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2615
+/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDialog_vue_vue_type_template_id_336aa46e__WEBPACK_IMPORTED_MODULE_0__.render)
2616
+/* harmony export */ });
2617
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDialog_vue_vue_type_template_id_336aa46e__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDialog.vue?vue&type=template&id=336aa46e */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e");
2618
+
2619
+
2620
+/***/ }),
2621
+
2622
+/***/ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
2623
+/*!*******************************************************************************!*\
2624
+  !*** ./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
2625
+  \*******************************************************************************/
2626
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2627
+
2628
+__webpack_require__.r(__webpack_exports__);
2629
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2630
+/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__.render)
2631
+/* harmony export */ });
2632
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDropdown.vue?vue&type=template&id=ce0d1992 */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992");
2633
+
2634
+
1978 2635
 /***/ }),
1979 2636
 
1980 2637
 /***/ "./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":

+ 22
- 11
public/js/resources_js_pages_typemember_Index_vue.js Bestand weergeven

@@ -399,7 +399,7 @@ __webpack_require__.r(__webpack_exports__);
399 399
       Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_0__.Head,
400 400
       AppButton: _components_AppButton_vue__WEBPACK_IMPORTED_MODULE_1__["default"],
401 401
       AppLayout: _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_2__["default"],
402
-      TableHeader: _TableHeader__WEBPACK_IMPORTED_MODULE_3__["default"]
402
+      IndexTable: _TableHeader__WEBPACK_IMPORTED_MODULE_3__.IndexTable
403 403
     };
404 404
     Object.defineProperty(__returned__, '__isScriptSetup', {
405 405
       enumerable: false,
@@ -990,7 +990,10 @@ var _hoisted_2 = {
990 990
   "class": "grid"
991 991
 };
992 992
 var _hoisted_3 = {
993
-  "class": "col-12 flex flex-column md:flex-row justify-content-end"
993
+  "class": "col-12"
994
+};
995
+var _hoisted_4 = {
996
+  "class": "flex flex-column md:flex-row justify-content-end"
994 997
 };
995 998
 function render(_ctx, _cache, $props, $setup, $data, $options) {
996 999
   var _component_Column = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Column");
@@ -1009,21 +1012,21 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1009 1012
         "striped-rows": true
1010 1013
       }, {
1011 1014
         header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1012
-          return [_hoisted_1, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppButton"], {
1015
+          return [_hoisted_1, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppButton"], {
1013 1016
             label: "Tambah Jenis Member",
1014 1017
             "class": "p-button-outlined",
1015 1018
             icon: "pi pi-pencil",
1016 1019
             href: _ctx.route('type-members.create')
1017 1020
           }, null, 8
1018 1021
           /* PROPS */
1019
-          , ["href"])])])];
1022
+          , ["href"])])])])];
1020 1023
         }),
1021 1024
         "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1022
-          return [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.TableHeader, function (tableHeader) {
1025
+          return [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.IndexTable, function (indexTable) {
1023 1026
             return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_Column, {
1024
-              field: tableHeader.field,
1025
-              header: tableHeader.header,
1026
-              key: tableHeader.field
1027
+              field: indexTable.field,
1028
+              header: indexTable.header,
1029
+              key: indexTable.field
1027 1030
             }, null, 8
1028 1031
             /* PROPS */
1029 1032
             , ["field", "header"]);
@@ -1070,9 +1073,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1070 1073
 
1071 1074
 __webpack_require__.r(__webpack_exports__);
1072 1075
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1073
-/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1076
+/* harmony export */   "IndexTable": () => (/* binding */ IndexTable),
1077
+/* harmony export */   "Vehicle": () => (/* binding */ Vehicle)
1074 1078
 /* harmony export */ });
1075
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([{
1079
+var IndexTable = [{
1076 1080
   field: 'updatedAt',
1077 1081
   header: 'Diperbaharui'
1078 1082
 }, {
@@ -1087,7 +1091,14 @@ __webpack_require__.r(__webpack_exports__);
1087 1091
 }, {
1088 1092
   field: 'max',
1089 1093
   header: 'Maksimal Kendaraan'
1090
-}]);
1094
+}];
1095
+var Vehicle = [{
1096
+  field: 'type',
1097
+  header: 'Jenis Kendaraan'
1098
+}, {
1099
+  field: 'max',
1100
+  header: 'Maksimal Kendaraan'
1101
+}];
1091 1102
 
1092 1103
 /***/ }),
1093 1104
 

+ 11
- 3
public/js/resources_js_pages_typemember_TableHeader_js.js Bestand weergeven

@@ -9,9 +9,10 @@
9 9
 
10 10
 __webpack_require__.r(__webpack_exports__);
11 11
 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
-/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
12
+/* harmony export */   "IndexTable": () => (/* binding */ IndexTable),
13
+/* harmony export */   "Vehicle": () => (/* binding */ Vehicle)
13 14
 /* harmony export */ });
14
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([{
15
+var IndexTable = [{
15 16
   field: 'updatedAt',
16 17
   header: 'Diperbaharui'
17 18
 }, {
@@ -26,7 +27,14 @@ __webpack_require__.r(__webpack_exports__);
26 27
 }, {
27 28
   field: 'max',
28 29
   header: 'Maksimal Kendaraan'
29
-}]);
30
+}];
31
+var Vehicle = [{
32
+  field: 'type',
33
+  header: 'Jenis Kendaraan'
34
+}, {
35
+  field: 'max',
36
+  header: 'Maksimal Kendaraan'
37
+}];
30 38
 
31 39
 /***/ })
32 40
 

+ 1
- 1
public/js/vue.js Bestand weergeven

@@ -58101,7 +58101,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
58101 58101
 /******/ 		// This function allow to reference async chunks
58102 58102
 /******/ 		__webpack_require__.u = (chunkId) => {
58103 58103
 /******/ 			// return url for filenames based on template
58104
-/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"10c6b388645ceb22","resources_js_pages_auth_ForgotPassword_vue":"5b9f0529bda25a9b","resources_js_pages_auth_Login_vue":"61b9c9ae1ae9da32","resources_js_pages_auth_ResetPassword_vue":"b091193a1e114ce8","resources_js_pages_auth_VerifyEmail_vue":"a7b9a99e5a331088","resources_js_pages_expense_Create_vue":"1772093ec9ad8e1f","resources_js_pages_expense_Index_vue":"51f7facd5c3c3ea6","resources_js_pages_expense_Show_vue":"6200e318fe2f7fed","resources_js_pages_expense_TableHeader_js":"eed3f0613f167cfd","resources_js_pages_home_Index_vue":"6cd0224828ac8129","resources_js_pages_member_Create_vue":"3ca394fe875a5c72","resources_js_pages_member_Edit_vue":"7b222567b848883e","resources_js_pages_member_Index_vue":"71a31a774bb1b571","resources_js_pages_member_TableHeader_js":"51dbf053f7ddd45c","resources_js_pages_topup_Create_vue":"24940afcdac09553","resources_js_pages_topup_Edit_vue":"258c3b0746574dc0","resources_js_pages_topup_Index_vue":"70bcf9869c3024d0","resources_js_pages_topup_Show_vue":"cb35ad21e9ce163f","resources_js_pages_topup_TableHeader_js":"c0dc89df0e3b8b7d","resources_js_pages_typemember_Create_vue":"79728a0314d12450","resources_js_pages_typemember_Edit_vue":"94fb9b5b49338c01","resources_js_pages_typemember_Index_vue":"cd93651ebf36d5a5","resources_js_pages_typemember_TableHeader_js":"de81088b132d3e90","resources_js_pages_typevehicle_Create_vue":"0f937d93865a1ea2","resources_js_pages_typevehicle_Edit_vue":"edba97a3715ba957","resources_js_pages_typevehicle_Index_vue":"53c702d33feb6196","resources_js_pages_typevehicle_TableHeader_js":"a40378918fbe74e1","resources_js_pages_user_Create_vue":"361bf2589467f820","resources_js_pages_user_Edit_vue":"fdb844cf830ec11c","resources_js_pages_user_Index_vue":"16d93eb7e5210300","resources_js_pages_user_Show_vue":"138fd92d6ae36518","resources_js_pages_user_TableHeader_js":"0d87fd422fe40491"}[chunkId] + "";
58104
+/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"10c6b388645ceb22","resources_js_pages_auth_ForgotPassword_vue":"5b9f0529bda25a9b","resources_js_pages_auth_Login_vue":"61b9c9ae1ae9da32","resources_js_pages_auth_ResetPassword_vue":"b091193a1e114ce8","resources_js_pages_auth_VerifyEmail_vue":"a7b9a99e5a331088","resources_js_pages_expense_Create_vue":"1772093ec9ad8e1f","resources_js_pages_expense_Index_vue":"51f7facd5c3c3ea6","resources_js_pages_expense_Show_vue":"6200e318fe2f7fed","resources_js_pages_expense_TableHeader_js":"eed3f0613f167cfd","resources_js_pages_home_Index_vue":"6cd0224828ac8129","resources_js_pages_member_Create_vue":"3ca394fe875a5c72","resources_js_pages_member_Edit_vue":"7b222567b848883e","resources_js_pages_member_Index_vue":"71a31a774bb1b571","resources_js_pages_member_TableHeader_js":"51dbf053f7ddd45c","resources_js_pages_topup_Create_vue":"24940afcdac09553","resources_js_pages_topup_Edit_vue":"258c3b0746574dc0","resources_js_pages_topup_Index_vue":"70bcf9869c3024d0","resources_js_pages_topup_Show_vue":"cb35ad21e9ce163f","resources_js_pages_topup_TableHeader_js":"c0dc89df0e3b8b7d","resources_js_pages_typemember_Create_vue":"e9028dd632c51636","resources_js_pages_typemember_Edit_vue":"c51c01c7afe7241d","resources_js_pages_typemember_Index_vue":"3c3878e1d6568226","resources_js_pages_typemember_TableHeader_js":"ac1d31a59f8d464e","resources_js_pages_typevehicle_Create_vue":"0f937d93865a1ea2","resources_js_pages_typevehicle_Edit_vue":"edba97a3715ba957","resources_js_pages_typevehicle_Index_vue":"53c702d33feb6196","resources_js_pages_typevehicle_TableHeader_js":"a40378918fbe74e1","resources_js_pages_user_Create_vue":"361bf2589467f820","resources_js_pages_user_Edit_vue":"fdb844cf830ec11c","resources_js_pages_user_Index_vue":"16d93eb7e5210300","resources_js_pages_user_Show_vue":"138fd92d6ae36518","resources_js_pages_user_TableHeader_js":"0d87fd422fe40491"}[chunkId] + "";
58105 58105
 /******/ 		};
58106 58106
 /******/ 	})();
58107 58107
 /******/ 	

+ 127
- 9
resources/js/pages/typemember/Create.vue Bestand weergeven

@@ -1,26 +1,89 @@
1 1
 <script setup>
2
-import { computed, watch } from 'vue'
2
+import { computed, reactive, watch } from 'vue'
3 3
 import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
4 4
 import AppLayout from '@/layouts/AppLayout.vue'
5 5
 import AppInputText from '@/components/AppInputText.vue'
6
+import AppDropdown from '@/components/AppDropdown.vue'
6 7
 import AppInputNumber from '@/components/AppInputNumber.vue'
7 8
 import AppTextArea from '@/components/AppTextArea.vue'
8 9
 
10
+import { Vehicle } from './TableHeader'
11
+
12
+const props = defineProps({
13
+  typeVehicles: Object,
14
+})
15
+
9 16
 const errors = computed(() => usePage().props.value.errors)
10 17
 
11 18
 watch(errors, () => {
12 19
   form.clearErrors()
13 20
 })
14 21
 
22
+const listVehicle = reactive([])
23
+
24
+const vehicleClear = () => {
25
+  listVehicle.splice(0)
26
+}
27
+
28
+const vehicleOnDelete = (index) => {
29
+  listVehicle.splice(index, 1)
30
+}
31
+
32
+const vehicleOnAdd = () => {
33
+  form.clearErrors('type_vehicle_id', 'max_vehicle')
34
+
35
+  if (!form.type_vehicle_id) {
36
+    form.setError('type_vehicle_id', 'Tidak boleh kosong')
37
+
38
+    return
39
+  }
40
+
41
+  if (!form.max_vehicle) {
42
+    form.setError('max_vehicle', 'Tidak boleh kosong')
43
+
44
+    return
45
+  }
46
+
47
+  const listVehicleExist = listVehicle.filter((val) => val.typeVehicleId === form.type_vehicle_id)
48
+  if (listVehicleExist.length) {
49
+    form.setError('type_vehicle_id', 'Jenis Kendaraan sudah ada')
50
+
51
+    return
52
+  }
53
+
54
+  const typeVehicle = props.typeVehicles.filter((val) => val.value === form.type_vehicle_id)[0]
55
+  listVehicle.push({
56
+    max: form.max_vehicle,
57
+    type: typeVehicle.label,
58
+    typeVehicleId: typeVehicle.value,
59
+  })
60
+
61
+  form.reset('type_vehicle_id', 'max_vehicle')
62
+}
63
+
15 64
 const form = useForm({
16 65
   type: null,
17 66
   description: null,
18 67
   price: null,
19
-  max: null,
68
+  type_vehicle_id: null,
69
+  max_vehicle: null,
20 70
 })
21 71
 
22 72
 const submit = () => {
23
-  form.post(route('type-members.store'), { onSuccess: () => form.reset() })
73
+  form
74
+    .transform((data) => ({
75
+      type: data.type,
76
+      description: data.description,
77
+      price: data.price,
78
+      maxVehicles: listVehicle,
79
+    }))
80
+    .post(route('type-members.store'), {
81
+      onSuccess: () => {
82
+        vehicleClear()
83
+
84
+        form.reset()
85
+      },
86
+    })
24 87
 }
25 88
 </script>
26 89
 
@@ -52,7 +115,7 @@ const submit = () => {
52 115
                 />
53 116
               </div>
54 117
 
55
-              <div class="col-12 sm:col-6">
118
+              <div class="col-12">
56 119
                 <AppTextArea
57 120
                   v-model="form.description"
58 121
                   label="Keterangan"
@@ -60,25 +123,80 @@ const submit = () => {
60 123
                   :error="form.errors.description"
61 124
                 />
62 125
               </div>
126
+            </div>
127
+          </template>
128
+        </Card>
129
+      </div>
130
+    </div>
131
+
132
+    <div class="grid">
133
+      <div class="col-12 md:col-8">
134
+        <Card>
135
+          <template #content>
136
+            <div class="grid">
137
+              <div class="col-12 md:col-6">
138
+                <AppDropdown
139
+                  label="Jenis Kendaraan"
140
+                  placeholder="jenis kendaraan"
141
+                  v-model="form.type_vehicle_id"
142
+                  :options="typeVehicles"
143
+                  :error="form.errors.type_vehicle_id"
144
+                />
145
+              </div>
63 146
 
64 147
               <div class="col-12 md:col-6">
65 148
                 <AppInputNumber
66
-                  v-model="form.max"
149
+                  v-model="form.max_vehicle"
67 150
                   label="Maksimal Kendaraan"
68 151
                   placeholder="maksimal kendaraan"
69
-                  :error="form.errors.max"
152
+                  :error="form.errors.max_vehicle"
70 153
                 />
71 154
               </div>
155
+
156
+              <div class="col-12">
157
+                <div class="flex flex-column md:flex-row md:justify-content-end">
158
+                  <Button label="Tambah" icon="pi pi-car" class="p-button-outlined" @click="vehicleOnAdd" />
159
+                </div>
160
+              </div>
161
+
162
+              <div class="col-12 md-col-6">
163
+                <DataTable
164
+                  striped-rows
165
+                  row-hover
166
+                  responsive-layout="scroll"
167
+                  column-resize-mode="expand"
168
+                  edit-mode="cell"
169
+                  :value="listVehicle"
170
+                >
171
+                  <Column
172
+                    v-for="vehicle in Vehicle"
173
+                    :field="vehicle.field"
174
+                    :header="vehicle.header"
175
+                    :key="vehicle.field"
176
+                  />
177
+
178
+                  <Column>
179
+                    <template #body="{ index }">
180
+                      <div class="flex justify-content-end">
181
+                        <Button
182
+                          icon="pi pi-trash"
183
+                          class="p-button-rounded p-button-text"
184
+                          @click="vehicleOnDelete(index)"
185
+                        />
186
+                      </div>
187
+                    </template>
188
+                  </Column>
189
+                </DataTable>
190
+              </div>
72 191
             </div>
73 192
           </template>
74
-
75 193
           <template #footer>
76
-            <div class="flex flex-column md:flex-row justify-content-end">
194
+            <div class="flex flex-column md:flex-row md:justify-content-end">
77 195
               <Button
78 196
                 label="Simpan"
79 197
                 icon="pi pi-check"
80 198
                 class="p-button-outlined"
81
-                :disabled="form.processing"
199
+                :disabled="form.processing || listVehicle.length === 0"
82 200
                 @click="submit"
83 201
               />
84 202
             </div>

+ 163
- 16
resources/js/pages/typemember/Edit.vue Bestand weergeven

@@ -1,13 +1,20 @@
1 1
 <script setup>
2
-import { computed, watch } from 'vue'
2
+import { computed, watch, reactive, onMounted, ref } from 'vue'
3
+import { Inertia } from '@inertiajs/inertia'
3 4
 import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
4 5
 import AppLayout from '@/layouts/AppLayout.vue'
5 6
 import AppInputText from '@/components/AppInputText.vue'
7
+import AppDropdown from '@/components/AppDropdown.vue'
8
+import AppDialog from '@/components/AppDialog.vue'
6 9
 import AppInputNumber from '@/components/AppInputNumber.vue'
7 10
 import AppTextArea from '@/components/AppTextArea.vue'
8 11
 
12
+import { Vehicle } from './TableHeader'
13
+
9 14
 const props = defineProps({
10 15
   typeMember: Object,
16
+  typeVehicles: Object,
17
+  maxVehicles: Object,
11 18
 })
12 19
 
13 20
 const errors = computed(() => usePage().props.value.errors)
@@ -16,15 +23,75 @@ watch(errors, () => {
16 23
   form.clearErrors()
17 24
 })
18 25
 
26
+const visibleDialog = ref(false)
27
+
28
+const confirmDialog = () => {
29
+  visibleDialog.value = true
30
+}
31
+
32
+const onAgree = () => Inertia.delete(route('type-members.destroy', props.typeMember.id))
33
+
34
+const onCancel = () => (visibleDialog.value = false)
35
+
36
+const listVehicle = reactive([])
37
+
38
+onMounted(() => {
39
+  props.maxVehicles.forEach((val) => listVehicle.push(val))
40
+})
41
+
42
+const vehicleOnDelete = (index) => {
43
+  listVehicle.splice(index, 1)
44
+}
45
+
46
+const vehicleOnAdd = () => {
47
+  form.clearErrors('type_vehicle_id', 'max_vehicle')
48
+
49
+  if (!form.type_vehicle_id) {
50
+    form.setError('type_vehicle_id', 'Tidak boleh kosong')
51
+
52
+    return
53
+  }
54
+
55
+  if (!form.max_vehicle) {
56
+    form.setError('max_vehicle', 'Tidak boleh kosong')
57
+
58
+    return
59
+  }
60
+
61
+  const listVehicleExist = listVehicle.filter((val) => val.typeVehicleId === form.type_vehicle_id)
62
+  if (listVehicleExist.length) {
63
+    form.setError('type_vehicle_id', 'Jenis Kendaraan sudah ada')
64
+
65
+    return
66
+  }
67
+
68
+  const typeVehicle = props.typeVehicles.filter((val) => val.value === form.type_vehicle_id)[0]
69
+  listVehicle.push({
70
+    max: form.max_vehicle,
71
+    type: typeVehicle.label,
72
+    typeVehicleId: typeVehicle.value,
73
+  })
74
+
75
+  form.reset('type_vehicle_id', 'max_vehicle')
76
+}
77
+
19 78
 const form = useForm({
20 79
   type: props.typeMember.type,
21 80
   description: props.typeMember.description,
22 81
   price: props.typeMember.price,
23
-  max: props.typeMember.max,
82
+  type_vehicle_id: null,
83
+  max_vehicle: null,
24 84
 })
25 85
 
26 86
 const submit = () => {
27
-  form.put(route('type-members.update', props.typeMember.id))
87
+  form
88
+    .transform((data) => ({
89
+      type: data.type,
90
+      description: data.description,
91
+      price: data.price,
92
+      maxVehicles: listVehicle,
93
+    }))
94
+    .put(route('type-members.update', props.typeMember.id))
28 95
 }
29 96
 </script>
30 97
 
@@ -56,35 +123,115 @@ const submit = () => {
56 123
                 />
57 124
               </div>
58 125
 
59
-              <div class="col-12 sm:col-6">
126
+              <div class="col-12">
60 127
                 <AppTextArea
61
-                  label="Keterangan"
62 128
                   v-model="form.description"
129
+                  label="Keterangan"
63 130
                   placeholder="tulis keterangan disini"
64 131
                   :error="form.errors.description"
65 132
                 />
66 133
               </div>
134
+            </div>
135
+          </template>
136
+        </Card>
137
+      </div>
138
+    </div>
139
+
140
+    <div class="grid">
141
+      <div class="col-12 md:col-8">
142
+        <Card>
143
+          <template #content>
144
+            <div class="grid">
145
+              <div class="col-12 md:col-6">
146
+                <AppDropdown
147
+                  label="Jenis Kendaraan"
148
+                  placeholder="jenis kendaraan"
149
+                  v-model="form.type_vehicle_id"
150
+                  :options="typeVehicles"
151
+                  :error="form.errors.type_vehicle_id"
152
+                />
153
+              </div>
67 154
 
68 155
               <div class="col-12 md:col-6">
69 156
                 <AppInputNumber
70
-                  v-model="form.max"
157
+                  v-model="form.max_vehicle"
71 158
                   label="Maksimal Kendaraan"
72 159
                   placeholder="maksimal kendaraan"
73
-                  :error="form.errors.max"
160
+                  :error="form.errors.max_vehicle"
74 161
                 />
75 162
               </div>
163
+
164
+              <div class="col-12">
165
+                <div class="flex flex-column md:flex-row md:justify-content-end">
166
+                  <Button label="Tambah" icon="pi pi-car" class="p-button-outlined" @click="vehicleOnAdd" />
167
+                </div>
168
+              </div>
169
+
170
+              <div class="col-12 md-col-6">
171
+                <DataTable
172
+                  striped-rows
173
+                  row-hover
174
+                  responsive-layout="scroll"
175
+                  column-resize-mode="expand"
176
+                  edit-mode="cell"
177
+                  :value="listVehicle"
178
+                >
179
+                  <Column
180
+                    v-for="vehicle in Vehicle"
181
+                    :field="vehicle.field"
182
+                    :header="vehicle.header"
183
+                    :key="vehicle.field"
184
+                  />
185
+
186
+                  <Column>
187
+                    <template #body="{ index }">
188
+                      <div class="flex justify-content-end">
189
+                        <Button
190
+                          icon="pi pi-trash"
191
+                          class="p-button-rounded p-button-text"
192
+                          @click="vehicleOnDelete(index)"
193
+                        />
194
+                      </div>
195
+                    </template>
196
+                  </Column>
197
+                </DataTable>
198
+              </div>
76 199
             </div>
77 200
           </template>
78
-
79 201
           <template #footer>
80
-            <div class="flex flex-column md:flex-row justify-content-end">
81
-              <Button
82
-                label="Simpan"
83
-                icon="pi pi-check"
84
-                class="p-button-outlined"
85
-                :disabled="form.processing"
86
-                @click="submit"
87
-              />
202
+            <div class="grid">
203
+              <div class="col-12 md:col-6">
204
+                <div
205
+                  v-if="!typeMember.availableToMember"
206
+                  class="flex flex-column md:flex-row justify-content-center md:justify-content-start"
207
+                >
208
+                  <AppDialog
209
+                    message="Yakin akan menghapus data ini?"
210
+                    v-model:visible="visibleDialog"
211
+                    @agree="onAgree"
212
+                    @cancel="onCancel"
213
+                  />
214
+
215
+                  <Button
216
+                    label="Hapus"
217
+                    icon="pi pi-trash"
218
+                    class="p-button-outlined p-button-danger"
219
+                    @click="confirmDialog"
220
+                  />
221
+                </div>
222
+              </div>
223
+
224
+              <div class="col-12 md:col-6">
225
+                <div class="flex flex-column md:flex-row md:justify-content-end">
226
+                  <Button
227
+                    label="Simpan"
228
+                    icon="pi pi-check"
229
+                    class="p-button-outlined"
230
+                    :disabled="form.processing || listVehicle.length === 0"
231
+                    @click="submit"
232
+                  />
233
+                </div>
234
+              </div>
88 235
             </div>
89 236
           </template>
90 237
         </Card>

+ 14
- 12
resources/js/pages/typemember/Index.vue Bestand weergeven

@@ -3,7 +3,7 @@ import { Head } from '@inertiajs/inertia-vue3'
3 3
 import AppButton from '@/components/AppButton.vue'
4 4
 import AppLayout from '@/layouts/AppLayout.vue'
5 5
 
6
-import TableHeader from './TableHeader'
6
+import { IndexTable } from './TableHeader'
7 7
 
8 8
 defineProps({
9 9
   typeMembers: Object,
@@ -25,22 +25,24 @@ defineProps({
25 25
         <h1>Jenis Member</h1>
26 26
 
27 27
         <div class="grid">
28
-          <div class="col-12 flex flex-column md:flex-row justify-content-end">
29
-            <AppButton
30
-              label="Tambah Jenis Member"
31
-              class="p-button-outlined"
32
-              icon="pi pi-pencil"
33
-              :href="route('type-members.create')"
34
-            />
28
+          <div class="col-12">
29
+            <div class="flex flex-column md:flex-row justify-content-end">
30
+              <AppButton
31
+                label="Tambah Jenis Member"
32
+                class="p-button-outlined"
33
+                icon="pi pi-pencil"
34
+                :href="route('type-members.create')"
35
+              />
36
+            </div>
35 37
           </div>
36 38
         </div>
37 39
       </template>
38 40
 
39 41
       <Column
40
-        v-for="tableHeader in TableHeader"
41
-        :field="tableHeader.field"
42
-        :header="tableHeader.header"
43
-        :key="tableHeader.field"
42
+        v-for="indexTable in IndexTable"
43
+        :field="indexTable.field"
44
+        :header="indexTable.header"
45
+        :key="indexTable.field"
44 46
       />
45 47
 
46 48
       <Column>

+ 6
- 1
resources/js/pages/typemember/TableHeader.js Bestand weergeven

@@ -1,7 +1,12 @@
1
-export default [
1
+export const IndexTable = [
2 2
   { field: 'updatedAt', header: 'Diperbaharui' },
3 3
   { field: 'type', header: 'Jenis Member' },
4 4
   { field: 'description', header: 'Keterangan' },
5 5
   { field: 'price', header: 'Tarif Member' },
6 6
   { field: 'max', header: 'Maksimal Kendaraan' },
7 7
 ]
8
+
9
+export const Vehicle = [
10
+  { field: 'type', header: 'Jenis Kendaraan' },
11
+  { field: 'max', header: 'Maksimal Kendaraan' },
12
+]